1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com
4 * Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
7 #include <linux/kernel.h>
8 #include <linux/device.h>
9 #include <linux/init.h>
10 #include <linux/mutex.h>
12 #include <linux/sys_soc.h>
14 #include "k3-psil-priv.h"
16 static DEFINE_MUTEX(ep_map_mutex
);
17 static const struct psil_ep_map
*soc_ep_map
;
19 static const struct soc_device_attribute k3_soc_devices
[] = {
20 { .family
= "AM65X", .data
= &am654_ep_map
},
21 { .family
= "J721E", .data
= &j721e_ep_map
},
22 { .family
= "J7200", .data
= &j7200_ep_map
},
23 { .family
= "AM64X", .data
= &am64_ep_map
},
27 struct psil_endpoint_config
*psil_get_ep_config(u32 thread_id
)
31 mutex_lock(&ep_map_mutex
);
33 const struct soc_device_attribute
*soc
;
35 soc
= soc_device_match(k3_soc_devices
);
37 soc_ep_map
= soc
->data
;
39 pr_err("PSIL: No compatible machine found for map\n");
40 mutex_unlock(&ep_map_mutex
);
41 return ERR_PTR(-ENOTSUPP
);
43 pr_debug("%s: Using map for %s\n", __func__
, soc_ep_map
->name
);
45 mutex_unlock(&ep_map_mutex
);
47 if (thread_id
& K3_PSIL_DST_THREAD_ID_OFFSET
&& soc_ep_map
->dst
) {
48 /* check in destination thread map */
49 for (i
= 0; i
< soc_ep_map
->dst_count
; i
++) {
50 if (soc_ep_map
->dst
[i
].thread_id
== thread_id
)
51 return &soc_ep_map
->dst
[i
].ep_config
;
55 thread_id
&= ~K3_PSIL_DST_THREAD_ID_OFFSET
;
56 if (soc_ep_map
->src
) {
57 for (i
= 0; i
< soc_ep_map
->src_count
; i
++) {
58 if (soc_ep_map
->src
[i
].thread_id
== thread_id
)
59 return &soc_ep_map
->src
[i
].ep_config
;
63 return ERR_PTR(-ENOENT
);
65 EXPORT_SYMBOL_GPL(psil_get_ep_config
);
67 int psil_set_new_ep_config(struct device
*dev
, const char *name
,
68 struct psil_endpoint_config
*ep_config
)
70 struct psil_endpoint_config
*dst_ep_config
;
71 struct of_phandle_args dma_spec
;
75 if (!dev
|| !dev
->of_node
)
78 index
= of_property_match_string(dev
->of_node
, "dma-names", name
);
82 if (of_parse_phandle_with_args(dev
->of_node
, "dmas", "#dma-cells",
86 thread_id
= dma_spec
.args
[0];
88 dst_ep_config
= psil_get_ep_config(thread_id
);
89 if (IS_ERR(dst_ep_config
)) {
90 pr_err("PSIL: thread ID 0x%04x not defined in map\n",
92 of_node_put(dma_spec
.np
);
93 return PTR_ERR(dst_ep_config
);
96 memcpy(dst_ep_config
, ep_config
, sizeof(*dst_ep_config
));
98 of_node_put(dma_spec
.np
);
101 EXPORT_SYMBOL_GPL(psil_set_new_ep_config
);