Skip to content

Commit c52d5f1

Browse files
3V3RYONEmathieupoirier
authored andcommitted
remoteproc: k3: Refactor reserved_mem_init() functions into common driver
The reserved_mem_init() implementations in the R5, DSP and M4 remoteproc drivers initialize the reserved memory regions associated with the remote processor. Refactor these functions into the ti_k3_common.c driver as k3_reserved_mem_init() and use this common function throughout in R5, DSP and M4 drivers. 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 744270b commit c52d5f1

File tree

5 files changed

+74
-222
lines changed

5 files changed

+74
-222
lines changed

drivers/remoteproc/ti_k3_common.c

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,5 +469,75 @@ void k3_mem_release(void *data)
469469
}
470470
EXPORT_SYMBOL_GPL(k3_mem_release);
471471

472+
int k3_reserved_mem_init(struct k3_rproc *kproc)
473+
{
474+
struct device *dev = kproc->dev;
475+
struct device_node *np = dev->of_node;
476+
struct device_node *rmem_np;
477+
struct reserved_mem *rmem;
478+
int num_rmems;
479+
int ret, i;
480+
481+
num_rmems = of_property_count_elems_of_size(np, "memory-region",
482+
sizeof(phandle));
483+
if (num_rmems < 0) {
484+
dev_err(dev, "device does not reserved memory regions (%d)\n",
485+
num_rmems);
486+
return -EINVAL;
487+
}
488+
if (num_rmems < 2) {
489+
dev_err(dev, "device needs at least two memory regions to be defined, num = %d\n",
490+
num_rmems);
491+
return -EINVAL;
492+
}
493+
494+
/* use reserved memory region 0 for vring DMA allocations */
495+
ret = of_reserved_mem_device_init_by_idx(dev, np, 0);
496+
if (ret) {
497+
dev_err(dev, "device cannot initialize DMA pool (%d)\n", ret);
498+
return ret;
499+
}
500+
ret = devm_add_action_or_reset(dev, k3_mem_release, dev);
501+
if (ret)
502+
return ret;
503+
504+
num_rmems--;
505+
kproc->rmem = devm_kcalloc(dev, num_rmems, sizeof(*kproc->rmem), GFP_KERNEL);
506+
if (!kproc->rmem)
507+
return -ENOMEM;
508+
509+
/* use remaining reserved memory regions for static carveouts */
510+
for (i = 0; i < num_rmems; i++) {
511+
rmem_np = of_parse_phandle(np, "memory-region", i + 1);
512+
if (!rmem_np)
513+
return -EINVAL;
514+
515+
rmem = of_reserved_mem_lookup(rmem_np);
516+
of_node_put(rmem_np);
517+
if (!rmem)
518+
return -EINVAL;
519+
520+
kproc->rmem[i].bus_addr = rmem->base;
521+
/* 64-bit address regions currently not supported */
522+
kproc->rmem[i].dev_addr = (u32)rmem->base;
523+
kproc->rmem[i].size = rmem->size;
524+
kproc->rmem[i].cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
525+
if (!kproc->rmem[i].cpu_addr) {
526+
dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n",
527+
i + 1, &rmem->base, &rmem->size);
528+
return -ENOMEM;
529+
}
530+
531+
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
532+
i + 1, &kproc->rmem[i].bus_addr,
533+
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
534+
kproc->rmem[i].dev_addr);
535+
}
536+
kproc->num_rmems = num_rmems;
537+
538+
return 0;
539+
}
540+
EXPORT_SYMBOL_GPL(k3_reserved_mem_init);
541+
472542
MODULE_LICENSE("GPL");
473543
MODULE_DESCRIPTION("TI K3 common Remoteproc code");

drivers/remoteproc/ti_k3_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,4 +113,5 @@ void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len,
113113
int k3_rproc_of_get_memories(struct platform_device *pdev,
114114
struct k3_rproc *kproc);
115115
void k3_mem_release(void *data);
116+
int k3_reserved_mem_init(struct k3_rproc *kproc);
116117
#endif /* REMOTEPROC_TI_K3_COMMON_H */

drivers/remoteproc/ti_k3_dsp_remoteproc.c

Lines changed: 1 addition & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -66,76 +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_reserved_mem_init(struct k3_rproc *kproc)
70-
{
71-
struct device *dev = kproc->dev;
72-
struct device_node *np = dev->of_node;
73-
struct device_node *rmem_np;
74-
struct reserved_mem *rmem;
75-
int num_rmems;
76-
int ret, i;
77-
78-
num_rmems = of_property_count_elems_of_size(np, "memory-region",
79-
sizeof(phandle));
80-
if (num_rmems < 0) {
81-
dev_err(dev, "device does not reserved memory regions (%pe)\n",
82-
ERR_PTR(num_rmems));
83-
return -EINVAL;
84-
}
85-
if (num_rmems < 2) {
86-
dev_err(dev, "device needs at least two memory regions to be defined, num = %d\n",
87-
num_rmems);
88-
return -EINVAL;
89-
}
90-
91-
/* use reserved memory region 0 for vring DMA allocations */
92-
ret = of_reserved_mem_device_init_by_idx(dev, np, 0);
93-
if (ret) {
94-
dev_err(dev, "device cannot initialize DMA pool (%pe)\n",
95-
ERR_PTR(ret));
96-
return ret;
97-
}
98-
ret = devm_add_action_or_reset(dev, k3_mem_release, dev);
99-
if (ret)
100-
return ret;
101-
102-
num_rmems--;
103-
kproc->rmem = devm_kcalloc(dev, num_rmems, sizeof(*kproc->rmem), GFP_KERNEL);
104-
if (!kproc->rmem)
105-
return -ENOMEM;
106-
107-
/* use remaining reserved memory regions for static carveouts */
108-
for (i = 0; i < num_rmems; i++) {
109-
rmem_np = of_parse_phandle(np, "memory-region", i + 1);
110-
if (!rmem_np)
111-
return -EINVAL;
112-
113-
rmem = of_reserved_mem_lookup(rmem_np);
114-
of_node_put(rmem_np);
115-
if (!rmem)
116-
return -EINVAL;
117-
118-
kproc->rmem[i].bus_addr = rmem->base;
119-
/* 64-bit address regions currently not supported */
120-
kproc->rmem[i].dev_addr = (u32)rmem->base;
121-
kproc->rmem[i].size = rmem->size;
122-
kproc->rmem[i].cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
123-
if (!kproc->rmem[i].cpu_addr) {
124-
dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n",
125-
i + 1, &rmem->base, &rmem->size);
126-
return -ENOMEM;
127-
}
128-
129-
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
130-
i + 1, &kproc->rmem[i].bus_addr,
131-
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
132-
kproc->rmem[i].dev_addr);
133-
}
134-
kproc->num_rmems = num_rmems;
135-
136-
return 0;
137-
}
138-
13969
static void k3_dsp_release_tsp(void *data)
14070
{
14171
struct ti_sci_proc *tsp = data;
@@ -214,7 +144,7 @@ static int k3_dsp_rproc_probe(struct platform_device *pdev)
214144
if (ret)
215145
return ret;
216146

217-
ret = k3_dsp_reserved_mem_init(kproc);
147+
ret = k3_reserved_mem_init(kproc);
218148
if (ret)
219149
return dev_err_probe(dev, ret, "reserved memory init failed\n");
220150

drivers/remoteproc/ti_k3_m4_remoteproc.c

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

24-
static int k3_m4_reserved_mem_init(struct k3_rproc *kproc)
25-
{
26-
struct device *dev = kproc->dev;
27-
struct device_node *np = dev->of_node;
28-
struct device_node *rmem_np;
29-
struct reserved_mem *rmem;
30-
int num_rmems;
31-
int ret, i;
32-
33-
num_rmems = of_property_count_elems_of_size(np, "memory-region",
34-
sizeof(phandle));
35-
if (num_rmems < 0) {
36-
dev_err(dev, "device does not reserved memory regions (%d)\n",
37-
num_rmems);
38-
return -EINVAL;
39-
}
40-
if (num_rmems < 2) {
41-
dev_err(dev, "device needs at least two memory regions to be defined, num = %d\n",
42-
num_rmems);
43-
return -EINVAL;
44-
}
45-
46-
/* use reserved memory region 0 for vring DMA allocations */
47-
ret = of_reserved_mem_device_init_by_idx(dev, np, 0);
48-
if (ret) {
49-
dev_err(dev, "device cannot initialize DMA pool (%d)\n", ret);
50-
return ret;
51-
}
52-
ret = devm_add_action_or_reset(dev, k3_mem_release, dev);
53-
if (ret)
54-
return ret;
55-
56-
num_rmems--;
57-
kproc->rmem = devm_kcalloc(dev, num_rmems, sizeof(*kproc->rmem), GFP_KERNEL);
58-
if (!kproc->rmem)
59-
return -ENOMEM;
60-
61-
/* use remaining reserved memory regions for static carveouts */
62-
for (i = 0; i < num_rmems; i++) {
63-
rmem_np = of_parse_phandle(np, "memory-region", i + 1);
64-
if (!rmem_np)
65-
return -EINVAL;
66-
67-
rmem = of_reserved_mem_lookup(rmem_np);
68-
of_node_put(rmem_np);
69-
if (!rmem)
70-
return -EINVAL;
71-
72-
kproc->rmem[i].bus_addr = rmem->base;
73-
/* 64-bit address regions currently not supported */
74-
kproc->rmem[i].dev_addr = (u32)rmem->base;
75-
kproc->rmem[i].size = rmem->size;
76-
kproc->rmem[i].cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
77-
if (!kproc->rmem[i].cpu_addr) {
78-
dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n",
79-
i + 1, &rmem->base, &rmem->size);
80-
return -ENOMEM;
81-
}
82-
83-
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
84-
i + 1, &kproc->rmem[i].bus_addr,
85-
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
86-
kproc->rmem[i].dev_addr);
87-
}
88-
kproc->num_rmems = num_rmems;
89-
90-
return 0;
91-
}
92-
9324
static void k3_m4_release_tsp(void *data)
9425
{
9526
struct ti_sci_proc *tsp = data;
@@ -170,7 +101,7 @@ static int k3_m4_rproc_probe(struct platform_device *pdev)
170101
if (ret)
171102
return ret;
172103

173-
ret = k3_m4_reserved_mem_init(kproc);
104+
ret = k3_reserved_mem_init(kproc);
174105
if (ret)
175106
return dev_err_probe(dev, ret, "reserved memory init failed\n");
176107

drivers/remoteproc/ti_k3_r5_remoteproc.c

Lines changed: 1 addition & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -761,86 +761,6 @@ static int k3_r5_rproc_configure(struct k3_rproc *kproc)
761761
return ret;
762762
}
763763

764-
static int k3_r5_reserved_mem_init(struct k3_rproc *kproc)
765-
{
766-
struct device *dev = kproc->dev;
767-
struct device_node *np = dev_of_node(dev);
768-
struct device_node *rmem_np;
769-
struct reserved_mem *rmem;
770-
int num_rmems;
771-
int ret, i;
772-
773-
num_rmems = of_property_count_elems_of_size(np, "memory-region",
774-
sizeof(phandle));
775-
if (num_rmems <= 0) {
776-
dev_err(dev, "device does not have reserved memory regions, ret = %d\n",
777-
num_rmems);
778-
return -EINVAL;
779-
}
780-
if (num_rmems < 2) {
781-
dev_err(dev, "device needs at least two memory regions to be defined, num = %d\n",
782-
num_rmems);
783-
return -EINVAL;
784-
}
785-
786-
/* use reserved memory region 0 for vring DMA allocations */
787-
ret = of_reserved_mem_device_init_by_idx(dev, np, 0);
788-
if (ret) {
789-
dev_err(dev, "device cannot initialize DMA pool, ret = %d\n",
790-
ret);
791-
return ret;
792-
}
793-
794-
ret = devm_add_action_or_reset(dev, k3_mem_release, dev);
795-
if (ret)
796-
return ret;
797-
798-
num_rmems--;
799-
kproc->rmem = devm_kcalloc(dev, num_rmems, sizeof(*kproc->rmem), GFP_KERNEL);
800-
if (!kproc->rmem)
801-
return -ENOMEM;
802-
803-
/* use remaining reserved memory regions for static carveouts */
804-
for (i = 0; i < num_rmems; i++) {
805-
rmem_np = of_parse_phandle(np, "memory-region", i + 1);
806-
if (!rmem_np)
807-
return -EINVAL;
808-
809-
rmem = of_reserved_mem_lookup(rmem_np);
810-
of_node_put(rmem_np);
811-
if (!rmem)
812-
return -EINVAL;
813-
814-
kproc->rmem[i].bus_addr = rmem->base;
815-
/*
816-
* R5Fs do not have an MMU, but have a Region Address Translator
817-
* (RAT) module that provides a fixed entry translation between
818-
* the 32-bit processor addresses to 64-bit bus addresses. The
819-
* RAT is programmable only by the R5F cores. Support for RAT
820-
* is currently not supported, so 64-bit address regions are not
821-
* supported. The absence of MMUs implies that the R5F device
822-
* addresses/supported memory regions are restricted to 32-bit
823-
* bus addresses, and are identical
824-
*/
825-
kproc->rmem[i].dev_addr = (u32)rmem->base;
826-
kproc->rmem[i].size = rmem->size;
827-
kproc->rmem[i].cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
828-
if (!kproc->rmem[i].cpu_addr) {
829-
dev_err(dev, "failed to map reserved memory#%d at %pa of size %pa\n",
830-
i + 1, &rmem->base, &rmem->size);
831-
return -ENOMEM;
832-
}
833-
834-
dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %pK da 0x%x\n",
835-
i + 1, &kproc->rmem[i].bus_addr,
836-
kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
837-
kproc->rmem[i].dev_addr);
838-
}
839-
kproc->num_rmems = num_rmems;
840-
841-
return 0;
842-
}
843-
844764
/*
845765
* Each R5F core within a typical R5FSS instance has a total of 64 KB of TCMs,
846766
* split equally into two 32 KB banks between ATCM and BTCM. The TCMs from both
@@ -1219,7 +1139,7 @@ static int k3_r5_cluster_rproc_init(struct platform_device *pdev)
12191139
init_rmem:
12201140
k3_r5_adjust_tcm_sizes(kproc);
12211141

1222-
ret = k3_r5_reserved_mem_init(kproc);
1142+
ret = k3_reserved_mem_init(kproc);
12231143
if (ret) {
12241144
dev_err(cdev, "reserved memory init failed, ret = %d\n",
12251145
ret);

0 commit comments

Comments
 (0)