remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
Subsystems (6)
PATCH v5 1/1 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.
---
v5:
- Drop some inadvertent whitespace changes in qcom_q6v5_pas.c and ti_k3.
- Fix error handling in adsp_alloc_memory_region()
- Drop unreachable returns after 'while (1)' loops
v4:
- Rebase on v6.17-rc1. qcom_q6v5_pas.c conflicted needing s/adsp/pas/
v3:
- Rebase on v6.16-rc1. Move TI K3 changes to new common file.
- Fix double increment of "i" in xlnx_r5
v2:
- Use strstarts instead of strcmp for resource names as they include the unit-address.
- Drop the unit-address from resource name for imx and st drivers
--- drivers/remoteproc/imx_dsp_rproc.c | 47 +++++++---------- drivers/remoteproc/imx_rproc.c | 70 ++++++++++--------------- drivers/remoteproc/qcom_q6v5_adsp.c | 24 ++++----- drivers/remoteproc/qcom_q6v5_mss.c | 60 +++++++-------------- drivers/remoteproc/qcom_q6v5_pas.c | 69 +++++++++--------------- drivers/remoteproc/qcom_q6v5_wcss.c | 25 ++++----- drivers/remoteproc/qcom_wcnss.c | 23 ++++---- drivers/remoteproc/rcar_rproc.c | 38 +++++--------- drivers/remoteproc/st_remoteproc.c | 41 +++++++-------- drivers/remoteproc/stm32_rproc.c | 46 +++++++--------- drivers/remoteproc/ti_k3_common.c | 28 ++++------ drivers/remoteproc/xlnx_r5_remoteproc.c | 53 +++++++------------ 12 files changed, 199 insertions(+), 325 deletions(-)
drivers/remoteproc/imx_dsp_rproc.c +18 -29
@@ -689,11 +689,9 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_rproc *priv)struct rproc *rproc = priv->rproc;struct device *dev = rproc->dev.parent;struct device_node *np = dev->of_node; -struct of_phandle_iterator it;struct rproc_mem_entry *mem; -struct reserved_mem *rmem;void __iomem *cpu_addr; -int a; +int a, i =0 ;u64 da;/* Remap required addresses */
@@ -724,49 +722,40 @@ static int imx_dsp_rproc_add_carveout(struct imx_dsp_rproc *priv)rproc_add_carveout (rproc, mem); } -of_phandle_iterator_init (&it, np,"memory-region" ,NULL ,0 ); -while (of_phandle_iterator_next (&it) ==0 ) { +while (1 ) { +int err; +struct resource res; + + err =of_reserved_mem_region_to_resource (np, i++, &res); +if (err) +return 0 ; +/* * Ignore the first memory region which will be used vdev buffer. * No need to do extra handlings, rproc_add_virtio_dev will handle it. */ -if (!strcmp (it.node->name,"vdev0buffer" )) +if (strstarts (res.name,"vdev0buffer" ))continue ; - rmem =of_reserved_mem_lookup (it.node); -if (!rmem) { -of_node_put (it.node); -dev_err (dev,"unable to acquire memory-region\n" ); +if (imx_dsp_rproc_sys_to_da (priv, res.start,resource_size (&res), &da))return -EINVAL ; - } -if (imx_dsp_rproc_sys_to_da (priv, rmem->base, rmem->size, &da)) { -of_node_put (it.node); -return -EINVAL ; - } - - cpu_addr =devm_ioremap_wc (dev, rmem->base, rmem->size); + cpu_addr =devm_ioremap_resource_wc (dev, &res);if (!cpu_addr) { -of_node_put (it.node); -dev_err (dev,"failed to map memory %p\n" , &rmem->base); +dev_err (dev,"failed to map memory %pR\n" , &res);return -ENOMEM ; }/* Register memory region */ - mem =rproc_mem_entry_init (dev, (void __force *)cpu_addr, (dma_addr_t )rmem->base, - rmem->size, da,NULL ,NULL , it.node->name); - -if (mem) { -rproc_coredump_add_segment (rproc, da, rmem->size); - }else { -of_node_put (it.node); + mem =rproc_mem_entry_init (dev, (void __force *)cpu_addr, (dma_addr_t )res.start, +resource_size (&res), da,NULL ,NULL , +"%.*s" ,strchrnul (res.name,'@' ) - res.name, res.name); +if (!mem)return -ENOMEM ; - } +rproc_coredump_add_segment (rproc, da,resource_size (&res));rproc_add_carveout (rproc, mem); } - -return 0 ; }/* Prepare function for rproc_ops */
drivers/remoteproc/imx_rproc.c +27 -43
124 lines not on this page · raw message
drivers/remoteproc/qcom_q6v5_adsp.c +9 -15
@@ -625,26 +625,20 @@ static int adsp_init_mmio(struct qcom_adsp *adsp,static int adsp_alloc_memory_region (struct qcom_adsp *adsp) { -struct reserved_mem *rmem =NULL ; -struct device_node *node; - - node =of_parse_phandle (adsp->dev->of_node,"memory-region" ,0 ); -if (node) - rmem =of_reserved_mem_lookup (node); -of_node_put (node); +int ret; +struct resource res; -if (!rmem) { + ret =of_reserved_mem_region_to_resource (adsp->dev->of_node,0 , &res); +if (ret) {dev_err (adsp->dev,"unable to resolve memory-region\n" ); -return -EINVAL ; +return ret; } - adsp->mem_phys = adsp->mem_reloc = rmem->base; - adsp->mem_size = rmem->size; - adsp->mem_region =devm_ioremap_wc (adsp->dev, - adsp->mem_phys, adsp->mem_size); + adsp->mem_phys = adsp->mem_reloc = res.start; + adsp->mem_size =resource_size (&res); + adsp->mem_region =devm_ioremap_resource_wc (adsp->dev, &res);if (!adsp->mem_region) { -dev_err (adsp->dev,"unable to map memory region: %pa+%zx\n" , - &rmem->base, adsp->mem_size); +dev_err (adsp->dev,"unable to map memory region: %pR\n" , &res);return -EBUSY ; }
drivers/remoteproc/qcom_q6v5_mss.c +19 -41
98 lines not on this page · raw message
drivers/remoteproc/qcom_q6v5_pas.c +25 -44
110 lines not on this page · raw message
drivers/remoteproc/qcom_q6v5_wcss.c +10 -15
@@ -873,27 +873,22 @@ static int q6v5_wcss_init_mmio(struct q6v5_wcss *wcss,static int q6v5_alloc_memory_region (struct q6v5_wcss *wcss) { -struct reserved_mem *rmem =NULL ; -struct device_node *node;struct device *dev = wcss->dev; +struct resource res; +int ret; - node =of_parse_phandle (dev->of_node,"memory-region" ,0 ); -if (node) - rmem =of_reserved_mem_lookup (node); -of_node_put (node); - -if (!rmem) { + ret =of_reserved_mem_region_to_resource (dev->of_node,0 , &res); +if (ret) {dev_err (dev,"unable to acquire memory-region\n" ); -return -EINVAL ; +return ret; } - wcss->mem_phys = rmem->base; - wcss->mem_reloc = rmem->base; - wcss->mem_size = rmem->size; - wcss->mem_region =devm_ioremap_wc (dev, wcss->mem_phys, wcss->mem_size); + wcss->mem_phys = res.start; + wcss->mem_reloc = res.start; + wcss->mem_size =resource_size (&res); + wcss->mem_region =devm_ioremap_resource_wc (dev, &res);if (!wcss->mem_region) { -dev_err (dev,"unable to map memory region: %pa+%pa\n" , - &rmem->base, &rmem->size); +dev_err (dev,"unable to map memory region: %pR\n" , &res);return -EBUSY ; }
drivers/remoteproc/qcom_wcnss.c +9 -14
@@ -526,25 +526,20 @@ static int wcnss_request_irq(struct qcom_wcnss *wcnss,static int wcnss_alloc_memory_region (struct qcom_wcnss *wcnss) { -struct reserved_mem *rmem =NULL ; -struct device_node *node; - - node =of_parse_phandle (wcnss->dev->of_node,"memory-region" ,0 ); -if (node) - rmem =of_reserved_mem_lookup (node); -of_node_put (node); +struct resource res; +int ret; -if (!rmem) { + ret =of_reserved_mem_region_to_resource (wcnss->dev->of_node,0 , &res); +if (ret) {dev_err (wcnss->dev,"unable to resolve memory-region\n" ); -return -EINVAL ; +return ret; } - wcnss->mem_phys = wcnss->mem_reloc = rmem->base; - wcnss->mem_size = rmem->size; - wcnss->mem_region =devm_ioremap_wc (wcnss->dev, wcnss->mem_phys, wcnss->mem_size); + wcnss->mem_phys = wcnss->mem_reloc = res.start; + wcnss->mem_size =resource_size (&res); + wcnss->mem_region =devm_ioremap_resource_wc (wcnss->dev, &res);if (!wcnss->mem_region) { -dev_err (wcnss->dev,"unable to map memory region: %pa+%zx\n" , - &rmem->base, wcnss->mem_size); +dev_err (wcnss->dev,"unable to map memory region: %pR\n" , &res);return -EBUSY ; }
drivers/remoteproc/rcar_rproc.c +14 -24
@@ -52,46 +52,36 @@ static int rcar_rproc_prepare(struct rproc *rproc) {struct device *dev = rproc->dev.parent;struct device_node *np = dev->of_node; -struct of_phandle_iterator it;struct rproc_mem_entry *mem; -struct reserved_mem *rmem; +int i =0 ;u32 da;/* Register associated reserved memory regions */ -of_phandle_iterator_init (&it, np,"memory-region" ,NULL ,0 ); -while (of_phandle_iterator_next (&it) ==0 ) { - - rmem =of_reserved_mem_lookup (it.node); -if (!rmem) { -of_node_put (it.node); -dev_err (&rproc->dev, -"unable to acquire memory-region\n" ); -return -EINVAL ; - } +while (1 ) { +struct resource res; +int ret; + + ret =of_reserved_mem_region_to_resource (np, i++, &res); +if (ret) +return 0 ; -if (rmem->base >U32_MAX ) { -of_node_put (it.node); +if (res.start >U32_MAX )return -EINVAL ; - }/* No need to translate pa to da, R-Car use same map */ - da = rmem->base; + da = res.start; mem =rproc_mem_entry_init (dev,NULL , - rmem->base, - rmem->size, da, + res.start, +resource_size (&res), da, rcar_rproc_mem_alloc, rcar_rproc_mem_release, - it.node->name); + res.name); -if (!mem) { -of_node_put (it.node); +if (!mem)return -ENOMEM ; - }rproc_add_carveout (rproc, mem); } - -return 0 ; }static int rcar_rproc_parse_fw (struct rproc *rproc,const struct firmware *fw)
drivers/remoteproc/st_remoteproc.c +19 -22
59 lines not on this page · raw message
drivers/remoteproc/stm32_rproc.c +19 -27
79 lines not on this page · raw message
drivers/remoteproc/ti_k3_common.c +11 -17
@@ -473,13 +473,10 @@ int k3_reserved_mem_init(struct k3_rproc *kproc) {struct device *dev = kproc->dev;struct device_node *np = dev->of_node; -struct device_node *rmem_np; -struct reserved_mem *rmem;int num_rmems;int ret, i; - num_rmems =of_property_count_elems_of_size (np,"memory-region" , -sizeof (phandle)); + num_rmems =of_reserved_mem_region_count (np);if (num_rmems <0 ) {dev_err (dev,"device does not reserved memory regions (%d)\n" , num_rmems);
@@ -508,23 +505,20 @@ int k3_reserved_mem_init(struct k3_rproc *kproc)/* use remaining reserved memory regions for static carveouts */ for (i =0 ; i < num_rmems; i++) { - rmem_np =of_parse_phandle (np,"memory-region" , i +1 ); -if (!rmem_np) -return -EINVAL ; +struct resource res; - rmem =of_reserved_mem_lookup (rmem_np); -of_node_put (rmem_np); -if (!rmem) -return -EINVAL ; + ret =of_reserved_mem_region_to_resource (np, i +1 , &res); +if (ret) +return ret; - kproc->rmem[i].bus_addr = rmem->base; + kproc->rmem[i].bus_addr = res.start;/* 64-bit address regions currently not supported */ - kproc->rmem[i].dev_addr = (u32 )rmem->base; - kproc->rmem[i].size = rmem->size; - kproc->rmem[i].cpu_addr =devm_ioremap_wc (dev, rmem->base, rmem->size); + kproc->rmem[i].dev_addr = (u32 )res.start; + kproc->rmem[i].size =resource_size (&res); + kproc->rmem[i].cpu_addr =devm_ioremap_resource_wc (dev, &res);if (!kproc->rmem[i].cpu_addr) { -dev_err (dev,"failed to map reserved memory#%d at %pa of size %pa\n" , - i +1 , &rmem->base, &rmem->size); +dev_err (dev,"failed to map reserved memory#%d at %pR\n" , + i +1 , &res);return -ENOMEM ; }
drivers/remoteproc/xlnx_r5_remoteproc.c +19 -34
93 lines not on this page · raw message
Signature · 1 line
2.50.1
Quoted 32 lines · Rob Herring (Arm)
Use the newly added
of_reserved_mem_region_to_resource()andof_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 justof_reserved_mem_region_to_resource()which is checked for an error.Acked-by Arnaud Pouliquen <[email protected]>Reviewed-by Geert Uytterhoeven <[email protected]> # rcarSigned-off-by Rob Herring (Arm) <[email protected]>---
v5:
- Drop some inadvertent whitespace changes inqcom_q6v5_pas.candti_k3.
- Fix error handling inadsp_alloc_memory_region()
- Drop unreachable returns after 'while (1)' loopsv4:
- Rebase on v6.17-rc1.qcom_q6v5_pas.cconflicted needing s/adsp/pas/v3:
- Rebase on v6.16-rc1. Move TI K3 changes to new common file.
- Fix double increment of "i" inxlnx_r5v2:
- Use strstarts instead of strcmp for resource names as they include the unit-address.
- Drop the unit-address from resource name for imx and st drivers
Quoted 15 lines
--- drivers/remoteproc/imx_dsp_rproc.c | 47 +++++++---------- drivers/remoteproc/imx_rproc.c | 70 ++++++++++--------------- drivers/remoteproc/qcom_q6v5_adsp.c | 24 ++++----- drivers/remoteproc/qcom_q6v5_mss.c | 60 +++++++-------------- drivers/remoteproc/qcom_q6v5_pas.c | 69 +++++++++--------------- drivers/remoteproc/qcom_q6v5_wcss.c | 25 ++++----- drivers/remoteproc/qcom_wcnss.c | 23 ++++---- drivers/remoteproc/rcar_rproc.c | 38 +++++--------- drivers/remoteproc/st_remoteproc.c | 41 +++++++-------- drivers/remoteproc/stm32_rproc.c | 46 +++++++--------- drivers/remoteproc/ti_k3_common.c | 28 ++++------ drivers/remoteproc/xlnx_r5_remoteproc.c | 53 +++++++------------ 12 files changed, 199 insertions(+), 325 deletions(-)
Signature · 2 lines
With best wishes Dmitry
Hi Rob,
This patch will break IMX RPROC support.
<snip>
Quoted 2 lines
drivers/remoteproc/imx_rproc.c +0
-0
<snip>
Quoted 1 line
static int
imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
<snip>
drivers/remoteproc/imx_rproc.c static int imx_rproc_addr_init(struct imx_rproc *priv, · line 743
Quoted 2 lines
drivers/remoteproc/imx_rproc.c +1
-1- priv->mem[b].cpu_addr =devm_ioremap_wc (&pdev->dev, res.start,resource_size (&res)); + priv->mem[b].cpu_addr =devm_ioremap_resource_wc (&pdev->dev, &res);
devm_ioremap_resource_wc works only for IORESOURCE_MEM resources:
lib/devres.c:124
static void __iomem *
__devm_ioremap_resource(struct device *dev, const struct resource *res,
» if (!res || resource_type(res) != IORESOURCE_MEM) {
» » ret = dev_err_probe(dev, -EINVAL, "invalid resource%pR\n", res);
» » return IOMEM_ERR_PTR(ret);
» }
while the devm_ioremap_wc doesn't care about this.
So we cannot use devm_ioremap_resource_wc here unless you add IORESOURCE_MEM flags
to of_reserved_mem_region_to_resource as discussed here:
https://lkml.org/lkml/2025/4/28/759
The same issue we are already experiencing with Sound Open Firmware where the change was already merged
and we have a bug already reported.
How should we fix this:
1) Add res->flags = IORESOURCE_MEM; in of_reserved_mem_region_to_resource
OR
2) Use devm_ioremap_wc instead of devm_ioremap_resource_wc.
thanks,
Daniel.
Daniel.
Patrice CHOTARD
maintainerQuoted 21 lines · Daniel Baluta
Hi Rob,
This patch will break IMX RPROC support.
<snip>Quoted 2 lines
drivers/remoteproc/imx_rproc.c +0
-0<snip>
Quoted 1 line
static int
imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)<snip>
drivers/remoteproc/imx_rproc.c static int imx_rproc_addr_init(struct imx_rproc *priv, · line 743
Quoted 2 lines
drivers/remoteproc/imx_rproc.c +1
-1- priv->mem[b].cpu_addr =devm_ioremap_wc (&pdev->dev, res.start,resource_size (&res)); + priv->mem[b].cpu_addr =devm_ioremap_resource_wc (&pdev->dev, &res);
devm_ioremap_resource_wcworks only forIORESOURCE_MEMresources:
lib/devres.c:124
static void__iomem*
__devm_ioremap_resource(struct device *dev, const struct resource *res,
Quoted 8 lines
» if (!res || resource_type(res) != IORESOURCE_MEM) { » » ret = dev_err_probe(dev, -EINVAL, "invalid resource%pR\n", res);
» » returnIOMEM_ERR_PTR(ret);
» }while the
devm_ioremap_wcdoesn't care about this.
Hi All,
Quoted 3 lines
So we cannot use
devm_ioremap_resource_wchere unless you addIORESOURCE_MEMflags
toof_reserved_mem_region_to_resourceas discussed here:
Agree with Daniel, IORESOURCE_MEM flags should be set in of_reserved_mem_region_to_resource().
I got a similar issue since commit defe01abfb7f ("spi: stm32-ospi: Use of_reserved_mem_region_to_resource() for "memory-region") resource flags is unset, which causing the following error:
[ 11.455387] stm32-ospi 40430000.spi: error -EINVAL: invalid resource [??? 0x60000000-0x6fffffff flags 0x0]
Thanks
Patrice
Quoted 21 lines
https://lkml.org/lkml/2025/4/28/759
The same issue we are already experiencing with Sound Open Firmware where the change was already merged
and we have a bug already reported.How should we fix this:
1) Add
res->flags=IORESOURCE_MEM; inof_reserved_mem_region_to_resourceOR
2) Use
devm_ioremap_wcinstead ofdevm_ioremap_resource_wc.thanks,
Daniel.Daniel.
Quoted 36 lines · Daniel Baluta
Hi Rob,
This patch will break IMX RPROC support.
<snip>Quoted 2 lines
drivers/remoteproc/imx_rproc.c +0
-0<snip>
Quoted 1 line
static int
imx_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)<snip>
drivers/remoteproc/imx_rproc.c static int imx_rproc_addr_init(struct imx_rproc *priv, · line 743
Quoted 2 lines
drivers/remoteproc/imx_rproc.c +1
-1- priv->mem[b].cpu_addr =devm_ioremap_wc (&pdev->dev, res.start,resource_size (&res)); + priv->mem[b].cpu_addr =devm_ioremap_resource_wc (&pdev->dev, &res);
devm_ioremap_resource_wcworks only forIORESOURCE_MEMresources:
lib/devres.c:124
static void__iomem*
__devm_ioremap_resource(struct device *dev, const struct resource *res,» if (!res || resource_type(res) != IORESOURCE_MEM) { » » ret = dev_err_probe(dev, -EINVAL, "invalid resource%pR\n", res);
» » returnIOMEM_ERR_PTR(ret);
» }while the
devm_ioremap_wcdoesn't care about this.So we cannot use
devm_ioremap_resource_wchere unless you addIORESOURCE_MEMflags
toof_reserved_mem_region_to_resourceas discussed here:
Quoted 7 lines
The same issue we are already experiencing with Sound Open Firmware where the change was already merged
and we have a bug already reported.How should we fix this:
1) Add
res->flags=IORESOURCE_MEM; inof_reserved_mem_region_to_resource
Sigh. I thought I rolled that change into it. I just sent a fix[1].
Rob