Skip to content

Commit 67a7bc7

Browse files
robherringmathieupoirier
authored andcommitted
remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
Use the newly added of_reserved_mem_region_to_resource() and of_reserved_mem_region_count() functions to handle "memory-region" properties. The error handling is a bit different in some cases. Often "memory-region" is optional, so failed lookup is not an error. But then an error in of_reserved_mem_lookup() is treated as an error. However, that distinction is not really important. Either the region is available and usable or it is not. So now, it is just of_reserved_mem_region_to_resource() which is checked for an error. Acked-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> Tested-by: Peng Fan <peng.fan@nxp.com> # i.MX93-11x11-EVK for imx_rproc.c Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> # rcar Tested-by: Beleswar Padhi <b-padhi@ti.com> # TI Signed-off-by: Rob Herring (Arm) <robh@kernel.org> Link: https://lore.kernel.org/r/20251124182751.507624-1-robh@kernel.org Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
1 parent 6f880e7 commit 67a7bc7

7 files changed

Lines changed: 129 additions & 196 deletions

File tree

drivers/remoteproc/imx_dsp_rproc.c

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -658,11 +658,9 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_rproc *priv)
658658
struct rproc *rproc = priv->rproc;
659659
struct device *dev = rproc->dev.parent;
660660
struct device_node *np = dev->of_node;
661-
struct of_phandle_iterator it;
662661
struct rproc_mem_entry *mem;
663-
struct reserved_mem *rmem;
664662
void __iomem *cpu_addr;
665-
int a;
663+
int a, i = 0;
666664
u64 da;
667665

668666
/* Remap required addresses */
@@ -693,49 +691,40 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_rproc *priv)
693691
rproc_add_carveout(rproc, mem);
694692
}
695693

696-
of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
697-
while (of_phandle_iterator_next(&it) == 0) {
694+
while (1) {
695+
int err;
696+
struct resource res;
697+
698+
err = of_reserved_mem_region_to_resource(np, i++, &res);
699+
if (err)
700+
return 0;
701+
698702
/*
699703
* Ignore the first memory region which will be used vdev buffer.
700704
* No need to do extra handlings, rproc_add_virtio_dev will handle it.
701705
*/
702-
if (!strcmp(it.node->name, "vdev0buffer"))
706+
if (strstarts(res.name, "vdev0buffer"))
703707
continue;
704708

705-
rmem = of_reserved_mem_lookup(it.node);
706-
if (!rmem) {
707-
of_node_put(it.node);
708-
dev_err(dev, "unable to acquire memory-region\n");
709+
if (imx_dsp_rproc_sys_to_da(priv, res.start, resource_size(&res), &da))
709710
return -EINVAL;
710-
}
711711

712-
if (imx_dsp_rproc_sys_to_da(priv, rmem->base, rmem->size, &da)) {
713-
of_node_put(it.node);
714-
return -EINVAL;
715-
}
716-
717-
cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
712+
cpu_addr = devm_ioremap_resource_wc(dev, &res);
718713
if (!cpu_addr) {
719-
of_node_put(it.node);
720-
dev_err(dev, "failed to map memory %p\n", &rmem->base);
714+
dev_err(dev, "failed to map memory %pR\n", &res);
721715
return -ENOMEM;
722716
}
723717

724718
/* Register memory region */
725-
mem = rproc_mem_entry_init(dev, (void __force *)cpu_addr, (dma_addr_t)rmem->base,
726-
rmem->size, da, NULL, NULL, it.node->name);
727-
728-
if (mem) {
729-
rproc_coredump_add_segment(rproc, da, rmem->size);
730-
} else {
731-
of_node_put(it.node);
719+
mem = rproc_mem_entry_init(dev, (void __force *)cpu_addr, (dma_addr_t)res.start,
720+
resource_size(&res), da, NULL, NULL,
721+
"%.*s", strchrnul(res.name, '@') - res.name, res.name);
722+
if (!mem)
732723
return -ENOMEM;
733-
}
734724

725+
rproc_coredump_add_segment(rproc, da, resource_size(&res));
735726
rproc_add_carveout(rproc, mem);
736727
}
737-
738-
return 0;
739728
}
740729

741730
/* Prepare function for rproc_ops */

drivers/remoteproc/imx_rproc.c

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -490,50 +490,44 @@ static int imx_rproc_prepare(struct rproc *rproc)
490490
{
491491
struct imx_rproc *priv = rproc->priv;
492492
struct device_node *np = priv->dev->of_node;
493-
struct of_phandle_iterator it;
494493
struct rproc_mem_entry *mem;
495-
struct reserved_mem *rmem;
494+
int i = 0;
496495
u32 da;
497496

498497
/* Register associated reserved memory regions */
499-
of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
500-
while (of_phandle_iterator_next(&it) == 0) {
498+
while (1) {
499+
int err;
500+
struct resource res;
501+
502+
err = of_reserved_mem_region_to_resource(np, i++, &res);
503+
if (err)
504+
return 0;
505+
501506
/*
502507
* Ignore the first memory region which will be used vdev buffer.
503508
* No need to do extra handlings, rproc_add_virtio_dev will handle it.
504509
*/
505-
if (!strcmp(it.node->name, "vdev0buffer"))
510+
if (strstarts(res.name, "vdev0buffer"))
506511
continue;
507512

508-
if (!strcmp(it.node->name, "rsc-table"))
513+
if (strstarts(res.name, "rsc-table"))
509514
continue;
510515

511-
rmem = of_reserved_mem_lookup(it.node);
512-
if (!rmem) {
513-
of_node_put(it.node);
514-
dev_err(priv->dev, "unable to acquire memory-region\n");
515-
return -EINVAL;
516-
}
517-
518516
/* No need to translate pa to da, i.MX use same map */
519-
da = rmem->base;
517+
da = res.start;
520518

521519
/* Register memory region */
522-
mem = rproc_mem_entry_init(priv->dev, NULL, (dma_addr_t)rmem->base, rmem->size, da,
520+
mem = rproc_mem_entry_init(priv->dev, NULL, (dma_addr_t)res.start,
521+
resource_size(&res), da,
523522
imx_rproc_mem_alloc, imx_rproc_mem_release,
524-
it.node->name);
525-
526-
if (mem) {
527-
rproc_coredump_add_segment(rproc, da, rmem->size);
528-
} else {
529-
of_node_put(it.node);
523+
"%.*s", strchrnul(res.name, '@') - res.name,
524+
res.name);
525+
if (!mem)
530526
return -ENOMEM;
531-
}
532527

528+
rproc_coredump_add_segment(rproc, da, resource_size(&res));
533529
rproc_add_carveout(rproc, mem);
534530
}
535-
536-
return 0;
537531
}
538532

539533
static int imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
@@ -671,47 +665,37 @@ static int imx_rproc_addr_init(struct imx_rproc *priv,
671665
}
672666

673667
/* memory-region is optional property */
674-
nph = of_count_phandle_with_args(np, "memory-region", NULL);
668+
nph = of_reserved_mem_region_count(np);
675669
if (nph <= 0)
676670
return 0;
677671

678672
/* remap optional addresses */
679673
for (a = 0; a < nph; a++) {
680-
struct device_node *node;
681674
struct resource res;
682675

683-
node = of_parse_phandle(np, "memory-region", a);
684-
if (!node)
685-
continue;
686-
/* Not map vdevbuffer, vdevring region */
687-
if (!strncmp(node->name, "vdev", strlen("vdev"))) {
688-
of_node_put(node);
689-
continue;
690-
}
691-
err = of_address_to_resource(node, 0, &res);
676+
err = of_reserved_mem_region_to_resource(np, a, &res);
692677
if (err) {
693678
dev_err(dev, "unable to resolve memory region\n");
694-
of_node_put(node);
695679
return err;
696680
}
697681

698-
if (b >= IMX_RPROC_MEM_MAX) {
699-
of_node_put(node);
682+
/* Not map vdevbuffer, vdevring region */
683+
if (strstarts(res.name, "vdev"))
684+
continue;
685+
686+
if (b >= IMX_RPROC_MEM_MAX)
700687
break;
701-
}
702688

703689
/* Not use resource version, because we might share region */
704-
priv->mem[b].cpu_addr = devm_ioremap_wc(&pdev->dev, res.start, resource_size(&res));
690+
priv->mem[b].cpu_addr = devm_ioremap_resource_wc(&pdev->dev, &res);
705691
if (!priv->mem[b].cpu_addr) {
706692
dev_err(dev, "failed to remap %pr\n", &res);
707-
of_node_put(node);
708693
return -ENOMEM;
709694
}
710695
priv->mem[b].sys_addr = res.start;
711696
priv->mem[b].size = resource_size(&res);
712-
if (!strcmp(node->name, "rsc-table"))
697+
if (!strcmp(res.name, "rsc-table"))
713698
priv->rsc_table = priv->mem[b].cpu_addr;
714-
of_node_put(node);
715699
b++;
716700
}
717701

drivers/remoteproc/rcar_rproc.c

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -52,46 +52,36 @@ static int rcar_rproc_prepare(struct rproc *rproc)
5252
{
5353
struct device *dev = rproc->dev.parent;
5454
struct device_node *np = dev->of_node;
55-
struct of_phandle_iterator it;
5655
struct rproc_mem_entry *mem;
57-
struct reserved_mem *rmem;
56+
int i = 0;
5857
u32 da;
5958

6059
/* Register associated reserved memory regions */
61-
of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
62-
while (of_phandle_iterator_next(&it) == 0) {
63-
64-
rmem = of_reserved_mem_lookup(it.node);
65-
if (!rmem) {
66-
of_node_put(it.node);
67-
dev_err(&rproc->dev,
68-
"unable to acquire memory-region\n");
69-
return -EINVAL;
70-
}
60+
while (1) {
61+
struct resource res;
62+
int ret;
63+
64+
ret = of_reserved_mem_region_to_resource(np, i++, &res);
65+
if (ret)
66+
return 0;
7167

72-
if (rmem->base > U32_MAX) {
73-
of_node_put(it.node);
68+
if (res.start > U32_MAX)
7469
return -EINVAL;
75-
}
7670

7771
/* No need to translate pa to da, R-Car use same map */
78-
da = rmem->base;
72+
da = res.start;
7973
mem = rproc_mem_entry_init(dev, NULL,
80-
rmem->base,
81-
rmem->size, da,
74+
res.start,
75+
resource_size(&res), da,
8276
rcar_rproc_mem_alloc,
8377
rcar_rproc_mem_release,
84-
it.node->name);
78+
res.name);
8579

86-
if (!mem) {
87-
of_node_put(it.node);
80+
if (!mem)
8881
return -ENOMEM;
89-
}
9082

9183
rproc_add_carveout(rproc, mem);
9284
}
93-
94-
return 0;
9585
}
9686

9787
static int rcar_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)

drivers/remoteproc/st_remoteproc.c

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -120,40 +120,39 @@ static int st_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
120120
struct device *dev = rproc->dev.parent;
121121
struct device_node *np = dev->of_node;
122122
struct rproc_mem_entry *mem;
123-
struct reserved_mem *rmem;
124-
struct of_phandle_iterator it;
125-
int index = 0;
126-
127-
of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
128-
while (of_phandle_iterator_next(&it) == 0) {
129-
rmem = of_reserved_mem_lookup(it.node);
130-
if (!rmem) {
131-
of_node_put(it.node);
132-
dev_err(dev, "unable to acquire memory-region\n");
133-
return -EINVAL;
134-
}
123+
int entries;
124+
125+
entries = of_reserved_mem_region_count(np);
126+
127+
for (int index = 0; index < entries; index++) {
128+
struct resource res;
129+
int ret;
130+
131+
ret = of_reserved_mem_region_to_resource(np, index, &res);
132+
if (ret)
133+
return ret;
135134

136135
/* No need to map vdev buffer */
137-
if (strcmp(it.node->name, "vdev0buffer")) {
136+
if (!strstarts(res.name, "vdev0buffer")) {
138137
/* Register memory region */
139138
mem = rproc_mem_entry_init(dev, NULL,
140-
(dma_addr_t)rmem->base,
141-
rmem->size, rmem->base,
139+
(dma_addr_t)res.start,
140+
resource_size(&res), res.start,
142141
st_rproc_mem_alloc,
143142
st_rproc_mem_release,
144-
it.node->name);
143+
"%.*s",
144+
strchrnul(res.name, '@') - res.name,
145+
res.name);
145146
} else {
146147
/* Register reserved memory for vdev buffer allocation */
147148
mem = rproc_of_resm_mem_entry_init(dev, index,
148-
rmem->size,
149-
rmem->base,
150-
it.node->name);
149+
resource_size(&res),
150+
res.start,
151+
"vdev0buffer");
151152
}
152153

153-
if (!mem) {
154-
of_node_put(it.node);
154+
if (!mem)
155155
return -ENOMEM;
156-
}
157156

158157
rproc_add_carveout(rproc, mem);
159158
index++;

0 commit comments

Comments
 (0)