Skip to content

Commit c172402

Browse files
3V3RYONEmathieupoirier
authored andcommitted
remoteproc: k3: Refactor of_get_memories() functions into common driver
The of_get_memories() implementations in the TI K3 R5, DSP and M4 remoteproc drivers initialize and assign memory regions used by the remote processor in the same way. Refactor these implementations into ti_k3_common.c driver as k3_rproc_of_get_memories() use this common function for mem initialization in R5, DSP and M4 drivers. Note: The TCM addresses for R5 core are configurable based on the 'loczrama' setting. Therefore, override the bus_addr assignment done by the common function for TCMs of R5 remote processors by reading the 'loczrama' DT property in k3_r5_core_of_get_internal_memories(). Signed-off-by: Beleswar Padhi <[email protected]> Tested-by: Judith Mendez <[email protected]> Reviewed-by: Andrew Davis <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mathieu Poirier <[email protected]>
1 parent 9179f8b commit c172402

File tree

5 files changed

+66
-146
lines changed

5 files changed

+66
-146
lines changed

drivers/remoteproc/ti_k3_common.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,5 +408,58 @@ void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
408408
}
409409
EXPORT_SYMBOL_GPL(k3_rproc_da_to_va);
410410

411+
int k3_rproc_of_get_memories(struct platform_device *pdev,
412+
struct k3_rproc *kproc)
413+
{
414+
const struct k3_rproc_dev_data *data = kproc->data;
415+
struct device *dev = &pdev->dev;
416+
struct resource *res;
417+
int num_mems = 0;
418+
int i;
419+
420+
num_mems = data->num_mems;
421+
kproc->mem = devm_kcalloc(kproc->dev, num_mems,
422+
sizeof(*kproc->mem), GFP_KERNEL);
423+
if (!kproc->mem)
424+
return -ENOMEM;
425+
426+
for (i = 0; i < num_mems; i++) {
427+
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
428+
data->mems[i].name);
429+
if (!res) {
430+
dev_err(dev, "found no memory resource for %s\n",
431+
data->mems[i].name);
432+
return -EINVAL;
433+
}
434+
if (!devm_request_mem_region(dev, res->start,
435+
resource_size(res),
436+
dev_name(dev))) {
437+
dev_err(dev, "could not request %s region for resource\n",
438+
data->mems[i].name);
439+
return -EBUSY;
440+
}
441+
442+
kproc->mem[i].cpu_addr = devm_ioremap_wc(dev, res->start,
443+
resource_size(res));
444+
if (!kproc->mem[i].cpu_addr) {
445+
dev_err(dev, "failed to map %s memory\n",
446+
data->mems[i].name);
447+
return -ENOMEM;
448+
}
449+
kproc->mem[i].bus_addr = res->start;
450+
kproc->mem[i].dev_addr = data->mems[i].dev_addr;
451+
kproc->mem[i].size = resource_size(res);
452+
453+
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %pK da 0x%x\n",
454+
data->mems[i].name, &kproc->mem[i].bus_addr,
455+
kproc->mem[i].size, kproc->mem[i].cpu_addr,
456+
kproc->mem[i].dev_addr);
457+
}
458+
kproc->num_mems = num_mems;
459+
460+
return 0;
461+
}
462+
EXPORT_SYMBOL_GPL(k3_rproc_of_get_memories);
463+
411464
MODULE_LICENSE("GPL");
412465
MODULE_DESCRIPTION("TI K3 common Remoteproc code");

drivers/remoteproc/ti_k3_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,6 @@ struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
110110
size_t *rsc_table_sz);
111111
void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len,
112112
bool *is_iomem);
113+
int k3_rproc_of_get_memories(struct platform_device *pdev,
114+
struct k3_rproc *kproc);
113115
#endif /* REMOTEPROC_TI_K3_COMMON_H */

drivers/remoteproc/ti_k3_dsp_remoteproc.c

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -66,58 +66,6 @@ static const struct rproc_ops k3_dsp_rproc_ops = {
6666
.get_loaded_rsc_table = k3_get_loaded_rsc_table,
6767
};
6868

69-
static int k3_dsp_rproc_of_get_memories(struct platform_device *pdev,
70-
struct k3_rproc *kproc)
71-
{
72-
const struct k3_rproc_dev_data *data = kproc->data;
73-
struct device *dev = &pdev->dev;
74-
struct resource *res;
75-
int num_mems = 0;
76-
int i;
77-
78-
num_mems = kproc->data->num_mems;
79-
kproc->mem = devm_kcalloc(kproc->dev, num_mems,
80-
sizeof(*kproc->mem), GFP_KERNEL);
81-
if (!kproc->mem)
82-
return -ENOMEM;
83-
84-
for (i = 0; i < num_mems; i++) {
85-
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
86-
data->mems[i].name);
87-
if (!res) {
88-
dev_err(dev, "found no memory resource for %s\n",
89-
data->mems[i].name);
90-
return -EINVAL;
91-
}
92-
if (!devm_request_mem_region(dev, res->start,
93-
resource_size(res),
94-
dev_name(dev))) {
95-
dev_err(dev, "could not request %s region for resource\n",
96-
data->mems[i].name);
97-
return -EBUSY;
98-
}
99-
100-
kproc->mem[i].cpu_addr = devm_ioremap_wc(dev, res->start,
101-
resource_size(res));
102-
if (!kproc->mem[i].cpu_addr) {
103-
dev_err(dev, "failed to map %s memory\n",
104-
data->mems[i].name);
105-
return -ENOMEM;
106-
}
107-
kproc->mem[i].bus_addr = res->start;
108-
kproc->mem[i].dev_addr = data->mems[i].dev_addr;
109-
kproc->mem[i].size = resource_size(res);
110-
111-
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %pK da 0x%x\n",
112-
data->mems[i].name, &kproc->mem[i].bus_addr,
113-
kproc->mem[i].size, kproc->mem[i].cpu_addr,
114-
kproc->mem[i].dev_addr);
115-
}
116-
kproc->num_mems = num_mems;
117-
118-
return 0;
119-
}
120-
12169
static void k3_dsp_mem_release(void *data)
12270
{
12371
struct device *dev = data;
@@ -269,7 +217,7 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
269217
if (ret)
270218
return ret;
271219

272-
ret = k3_dsp_rproc_of_get_memories(pdev, kproc);
220+
ret = k3_rproc_of_get_memories(pdev, kproc);
273221
if (ret)
274222
return ret;
275223

drivers/remoteproc/ti_k3_m4_remoteproc.c

Lines changed: 1 addition & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -21,58 +21,6 @@
2121
#include "ti_sci_proc.h"
2222
#include "ti_k3_common.h"
2323

24-
static int k3_m4_rproc_of_get_memories(struct platform_device *pdev,
25-
struct k3_rproc *kproc)
26-
{
27-
const struct k3_rproc_dev_data *data = kproc->data;
28-
struct device *dev = &pdev->dev;
29-
struct resource *res;
30-
int num_mems;
31-
int i;
32-
33-
num_mems = data->num_mems;
34-
kproc->mem = devm_kcalloc(kproc->dev, num_mems,
35-
sizeof(*kproc->mem), GFP_KERNEL);
36-
if (!kproc->mem)
37-
return -ENOMEM;
38-
39-
for (i = 0; i < num_mems; i++) {
40-
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
41-
data->mems[i].name);
42-
if (!res) {
43-
dev_err(dev, "found no memory resource for %s\n",
44-
data->mems[i].name);
45-
return -EINVAL;
46-
}
47-
if (!devm_request_mem_region(dev, res->start,
48-
resource_size(res),
49-
dev_name(dev))) {
50-
dev_err(dev, "could not request %s region for resource\n",
51-
data->mems[i].name);
52-
return -EBUSY;
53-
}
54-
55-
kproc->mem[i].cpu_addr = devm_ioremap_wc(dev, res->start,
56-
resource_size(res));
57-
if (!kproc->mem[i].cpu_addr) {
58-
dev_err(dev, "failed to map %s memory\n",
59-
data->mems[i].name);
60-
return -ENOMEM;
61-
}
62-
kproc->mem[i].bus_addr = res->start;
63-
kproc->mem[i].dev_addr = data->mems[i].dev_addr;
64-
kproc->mem[i].size = resource_size(res);
65-
66-
dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %pK da 0x%x\n",
67-
data->mems[i].name, &kproc->mem[i].bus_addr,
68-
kproc->mem[i].size, kproc->mem[i].cpu_addr,
69-
kproc->mem[i].dev_addr);
70-
}
71-
kproc->num_mems = num_mems;
72-
73-
return 0;
74-
}
75-
7624
static void k3_m4_rproc_dev_mem_release(void *data)
7725
{
7826
struct device *dev = data;
@@ -225,7 +173,7 @@ static int k3_m4_rproc_probe(struct platform_device *pdev)
225173
if (ret)
226174
return ret;
227175

228-
ret = k3_m4_rproc_of_get_memories(pdev, kproc);
176+
ret = k3_rproc_of_get_memories(pdev, kproc);
229177
if (ret)
230178
return ret;
231179

drivers/remoteproc/ti_k3_r5_remoteproc.c

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,55 +1009,28 @@ static int k3_r5_core_of_get_internal_memories(struct platform_device *pdev,
10091009
const struct k3_rproc_dev_data *data = kproc->data;
10101010
struct device *dev = &pdev->dev;
10111011
struct k3_r5_core *core = kproc->priv;
1012-
struct resource *res;
10131012
int num_mems;
1014-
int i;
1013+
int i, ret;
10151014

10161015
num_mems = data->num_mems;
10171016
kproc->mem = devm_kcalloc(kproc->dev, num_mems, sizeof(*kproc->mem),
10181017
GFP_KERNEL);
10191018
if (!kproc->mem)
10201019
return -ENOMEM;
10211020

1022-
for (i = 0; i < num_mems; i++) {
1023-
res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
1024-
data->mems[i].name);
1025-
if (!res) {
1026-
dev_err(dev, "found no memory resource for %s\n",
1027-
data->mems[i].name);
1028-
return -EINVAL;
1029-
}
1030-
if (!devm_request_mem_region(dev, res->start,
1031-
resource_size(res),
1032-
dev_name(dev))) {
1033-
dev_err(dev, "could not request %s region for resource\n",
1034-
data->mems[i].name);
1035-
return -EBUSY;
1036-
}
1037-
1038-
/*
1039-
* TCMs are designed in general to support RAM-like backing
1040-
* memories. So, map these as Normal Non-Cached memories. This
1041-
* also avoids/fixes any potential alignment faults due to
1042-
* unaligned data accesses when using memcpy() or memset()
1043-
* functions (normally seen with device type memory).
1044-
*/
1045-
kproc->mem[i].cpu_addr = devm_ioremap_wc(dev, res->start,
1046-
resource_size(res));
1047-
if (!kproc->mem[i].cpu_addr) {
1048-
dev_err(dev, "failed to map %s memory\n",
1049-
data->mems[i].name);
1050-
return -ENOMEM;
1051-
}
1052-
kproc->mem[i].bus_addr = res->start;
1021+
ret = k3_rproc_of_get_memories(pdev, kproc);
1022+
if (ret)
1023+
return ret;
10531024

1025+
for (i = 0; i < num_mems; i++) {
10541026
/*
10551027
* TODO:
10561028
* The R5F cores can place ATCM & BTCM anywhere in its address
10571029
* based on the corresponding Region Registers in the System
10581030
* Control coprocessor. For now, place ATCM and BTCM at
10591031
* addresses 0 and 0x41010000 (same as the bus address on AM65x
1060-
* SoCs) based on loczrama setting
1032+
* SoCs) based on loczrama setting overriding default assignment
1033+
* done by k3_rproc_of_get_memories().
10611034
*/
10621035
if (!strcmp(data->mems[i].name, "atcm")) {
10631036
kproc->mem[i].dev_addr = core->loczrama ?
@@ -1066,14 +1039,10 @@ static int k3_r5_core_of_get_internal_memories(struct platform_device *pdev,
10661039
kproc->mem[i].dev_addr = core->loczrama ?
10671040
K3_R5_TCM_DEV_ADDR : 0;
10681041
}
1069-
kproc->mem[i].size = resource_size(res);
10701042

1071-
dev_dbg(dev, "memory %5s: bus addr %pa size 0x%zx va %pK da 0x%x\n",
1072-
data->mems[i].name, &kproc->mem[i].bus_addr,
1073-
kproc->mem[i].size, kproc->mem[i].cpu_addr,
1074-
kproc->mem[i].dev_addr);
1043+
dev_dbg(dev, "Updating bus addr %pa of memory %5s\n",
1044+
&kproc->mem[i].bus_addr, data->mems[i].name);
10751045
}
1076-
kproc->num_mems = num_mems;
10771046

10781047
return 0;
10791048
}

0 commit comments

Comments
 (0)