remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
Subsystems (6)
PATCH v7 1/2 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.
---
v7:
- Rework st_rproc_parse_fw() loop and maintain existing behavior in case of no entries and error paths
- Split QCom to separate patch
v6:
- Rebase on v6.18-rc1
- The error in v5 was fixed in v6.17 commit aea70964b5a7 ("of: reserved_mem: Add missing IORESOURCE_MEM flag on resources")
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/rcar_rproc.c | 38 +++++--------- drivers/remoteproc/st_remoteproc.c | 43 ++++++++------- drivers/remoteproc/stm32_rproc.c | 46 +++++++--------- drivers/remoteproc/ti_k3_common.c | 28 ++++------ drivers/remoteproc/xlnx_r5_remoteproc.c | 53 +++++++------------ 7 files changed, 129 insertions(+), 196 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/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 +21 -22
61 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
@@ -470,13 +470,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);
@@ -505,23 +502,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.51.0
PATCH v7 2/2 remoteproc: qcom: 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.
---
v7:
- Split QCom to separate patch
--- 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 ++++------ 5 files changed, 72 insertions(+), 129 deletions(-)
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 ; }
Signature · 1 line
2.51.0
Re: [PATCH v7 2/2] remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
Hi Rob,
Quoted 4 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.
Quoted 8 lines
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.Signed-off-by Rob Herring (Arm) <[email protected]>
This patch landed in today's linux-next as commit c70b9d5fdcd7 ("remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region""). In my tests I found that it breaks booting of DragonBoard410c (arch/arm64/boot/dts/qcom/apq8016-sbc.dts) by causing the NULL pointer dereference. The issue is caused by replacing devm_ioremap_wc() with devm_ioremap_resource_wc(), which fails on devm_request_mem_region(), see comment in the code below. It looks that the error handling is somewhere broken. Here is the the kernel log:
remoteproc remoteproc0: 4080000.remoteproc is available qcom-wcnss-pil a204000.remoteproc: error -EBUSY: can't request region for resource [mem 0x8e200000-0x8e7fffff]
remoteproc remoteproc1: a204000.remoteproc is available remoteproc remoteproc1: powering up a204000.remoteproc remoteproc remoteproc1: Booting fw image qcom/apq8016/wcnss.mbn, size 4111376
Unable to handle kernel paging request at virtual address fffffffffffffff0 Mem abort info: ... Internal error: Oops: 0000000096000046 [#1] SMP Modules linked in: cpufreq_powersave qcom_wcnss_pil cpufreq_conservative
coresight_stm coresight_replicator coresight_tmc coresight_tpiu stm_core coresight_funnel coresight_cpu_debug coresight_cti(+) adv7511 coresight nfc rfkill msm snd_soc_lpass_apq8016 snd_soc_apq8016_sbc snd_soc_lpass_cpu snd_soc_msm8916_analog snd_soc_msm8916_digital snd_soc_qcom_common snd_soc_lpass_platform snd_soc_core qrtr ubwc_config snd_compress llcc_qcom snd_pcm_dmaengine qcom_q6v5_mss snd_pcm ocmem qcom_pil_info qcom_spmi_vadc qcom_camss drm_gpuvm qcom_pon rtc_pm8xxx qcom_q6v5 qcom_spmi_temp_alarm venus_core qcom_vadc_common snd_timer drm_exec qcom_sysmon snd qcom_common gpu_sched videobuf2_dma_sg v4l2_mem2mem qcom_glink_smem v4l2_fwnode soundcore drm_dp_aux_bus qmi_helpers mdt_loader v4l2_async videobuf2_memops videobuf2_v4l2 videodev qnoc_msm8916 videobuf2_common qcom_rng drm_display_helper mc qcom_stats rpmsg_ctrl rpmsg_char display_connector ramoops socinfo rmtfs_mem reed_solomon ax88796b asix usbnet phy_qcom_usb_hs ipv6 libsha1
CPU: 2 UID: 0 PID: 28 Comm: kworker/2:0 Tainted: G W 6.18.0-rc1+ #16209 PREEMPT Tainted: [W]=WARN lr : __qcom_mdt_load+0x210/0x304 [mdt_loader] Call trace: __pi_memcpy_generic+0x128/0x22c (P) qcom_mdt_load+0x68/0x60c [mdt_loader] wcnss_load+0x2c/0x5c [qcom_wcnss_pil] rproc_start+0x30/0x1b4 rproc_boot+0x19c/0x560 rproc_auto_boot_callback+0x1c/0x34 request_firmware_work_func+0x4c/0x98 process_one_work+0x208/0x60c worker_thread+0x244/0x388 kthread+0x150/0x228 ret_from_fork+0x10/0x20 Code: 927cec03 cb0e0021 8b0e0042 a9411c26 (a900340c) ---[ end trace 0000000000000000 ]---
Quoted 36 lines
---
v7:
- Split QCom to separate patch--- 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 ++++------ 5 files changed, 72 insertions(+), 129 deletions(-)...
drivers/remoteproc/qcom_wcnss.c +4
-8@@ -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" );
drivers/remoteproc/qcom_wcnss.c static int wcnss_request_irq(struct qcom_wcnss *wcnss, · line 540
Quoted 10 lines
drivers/remoteproc/qcom_wcnss.c +4
-4-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);
The above line causes the failure. After restoring it to:
wcnss->mem_region = devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);
the mentioned board boots fine again. I'm not sure about other drivers, if they also fail the same way as they might not be used on the tested board.
drivers/remoteproc/qcom_wcnss.c static int wcnss_request_irq(struct qcom_wcnss *wcnss, · line 545
Quoted 7 lines
drivers/remoteproc/qcom_wcnss.c +1
-2if (!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 ; }
Best regards
Signature · 2 lines
Marek Szyprowski, PhD Samsung R&D Institute Poland
Re: [PATCH v7 2/2] remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
Quoted 121 lines · Marek Szyprowski
Hi Rob,
Quoted 4 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.Quoted 8 lines
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.Signed-off-by Rob Herring (Arm) <[email protected]>This patch landed in today's linux-next as commit
c70b9d5fdcd7("remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region""). In my tests I found that it breaks booting of DragonBoard410c (arch/arm64/boot/dts/qcom/apq8016-sbc.dts) by causing the NULL pointer dereference. The issue is caused by replacingdevm_ioremap_wc()withdevm_ioremap_resource_wc(), which fails ondevm_request_mem_region(), see comment in the code below. It looks that the error handling is somewhere broken. Here is the the kernel log:remoteproc remoteproc0: 4080000.remoteproc is available qcom-wcnss-pil a204000.remoteproc: error
-EBUSY: can't request region for resource [mem 0x8e200000-0x8e7fffff]
remoteproc remoteproc1: a204000.remoteproc is available remoteproc remoteproc1: powering up a204000.remoteproc remoteproc remoteproc1: Booting fw image qcom/apq8016/wcnss.mbn, size 4111376Unable to handle kernel paging request at virtual address fffffffffffffff0 Mem abort info: ... Internal error: Oops: 0000000096000046 [#1] SMP Modules linked in: cpufreq_powersave qcom_wcnss_pil cpufreq_conservative
coresight_stmcoresight_replicatorcoresight_tmccoresight_tpiustm_corecoresight_funnelcoresight_cpu_debugcoresight_cti(+)adv7511 coresight nfc rfkill msmsnd_soc_lpass_apq8016snd_soc_apq8016_sbcsnd_soc_lpass_cpusnd_soc_msm8916_analogsnd_soc_msm8916_digitalsnd_soc_qcom_commonsnd_soc_lpass_platformsnd_soc_coreqrtrubwc_configsnd_compressllcc_qcomsnd_pcm_dmaengineqcom_q6v5_msssnd_pcmocmemqcom_pil_infoqcom_spmi_vadcqcom_camssdrm_gpuvmqcom_ponrtc_pm8xxxqcom_q6v5qcom_spmi_temp_alarmvenus_coreqcom_vadc_commonsnd_timerdrm_execqcom_sysmonsndqcom_commongpu_schedvideobuf2_dma_sgv4l2_mem2memqcom_glink_smemv4l2_fwnodesoundcoredrm_dp_aux_busqmi_helpersmdt_loaderv4l2_asyncvideobuf2_memopsvideobuf2_v4l2videodevqnoc_msm8916videobuf2_commonqcom_rngdrm_display_helpermcqcom_statsrpmsg_ctrlrpmsg_chardisplay_connectorramoops socinformtfs_memreed_solomonax88796b asix usbnetphy_qcom_usb_hsipv6 libsha1CPU: 2 UID: 0 PID: 28 Comm: kworker/2:0 Tainted: G W 6.18.0-rc1+ #16209 PREEMPT Tainted: [W]=WARN lr : __qcom_mdt_load+0x210/0x304 [mdt_loader] Call trace: __pi_memcpy_generic+0x128/0x22c (P) qcom_mdt_load+0x68/0x60c [mdt_loader] wcnss_load+0x2c/0x5c [qcom_wcnss_pil] rproc_start+0x30/0x1b4 rproc_boot+0x19c/0x560 rproc_auto_boot_callback+0x1c/0x34 request_firmware_work_func+0x4c/0x98 process_one_work+0x208/0x60c worker_thread+0x244/0x388 kthread+0x150/0x228 ret_from_fork+0x10/0x20 Code: 927cec03 cb0e0021 8b0e0042 a9411c26 (a900340c) ---[ end trace 0000000000000000 ]---Quoted 36 lines
---
v7:
- Split QCom to separate patch--- 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 ++++------ 5 files changed, 72 insertions(+), 129 deletions(-)...
drivers/remoteproc/qcom_wcnss.c +4
-8@@ -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" );drivers/remoteproc/qcom_wcnss.c static int wcnss_request_irq(struct qcom_wcnss *wcnss, · line 540
Quoted 10 lines
drivers/remoteproc/qcom_wcnss.c +4
-4-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);The above line causes the failure. After restoring it to:
Quoted 5 lines
wcnss->mem_region=devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);the mentioned board boots fine again. I'm not sure about other drivers, if they also fail the same way as they might not be used on the tested board.
Other platforms (non-QCom) were tested also use devm_ioremap_resource_wc(). So something else is claiming the same region? Can you dump out /proc/iomem?
The region is dynamically allocated, so maybe that has something to do with it.
Rob
Re: [PATCH v7 2/2] remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
Quoted 118 lines · Rob Herring
Quoted 116 lines · Marek Szyprowski
Quoted 4 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.Quoted 8 lines
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.Signed-off-by Rob Herring (Arm) <[email protected]>This patch landed in today's linux-next as commit
c70b9d5fdcd7("remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region""). In my tests I found that it breaks booting of DragonBoard410c (arch/arm64/boot/dts/qcom/apq8016-sbc.dts) by causing the NULL pointer dereference. The issue is caused by replacingdevm_ioremap_wc()withdevm_ioremap_resource_wc(), which fails ondevm_request_mem_region(), see comment in the code below. It looks that the error handling is somewhere broken. Here is the the kernel log:remoteproc remoteproc0: 4080000.remoteproc is available qcom-wcnss-pil a204000.remoteproc: error
-EBUSY: can't request region for resource [mem 0x8e200000-0x8e7fffff]
remoteproc remoteproc1: a204000.remoteproc is available remoteproc remoteproc1: powering up a204000.remoteproc remoteproc remoteproc1: Booting fw image qcom/apq8016/wcnss.mbn, size 4111376Unable to handle kernel paging request at virtual address fffffffffffffff0 Mem abort info: ... Internal error: Oops: 0000000096000046 [#1] SMP Modules linked in: cpufreq_powersave qcom_wcnss_pil cpufreq_conservative
coresight_stmcoresight_replicatorcoresight_tmccoresight_tpiustm_corecoresight_funnelcoresight_cpu_debugcoresight_cti(+)adv7511 coresight nfc rfkill msmsnd_soc_lpass_apq8016snd_soc_apq8016_sbcsnd_soc_lpass_cpusnd_soc_msm8916_analogsnd_soc_msm8916_digitalsnd_soc_qcom_commonsnd_soc_lpass_platformsnd_soc_coreqrtrubwc_configsnd_compressllcc_qcomsnd_pcm_dmaengineqcom_q6v5_msssnd_pcmocmemqcom_pil_infoqcom_spmi_vadcqcom_camssdrm_gpuvmqcom_ponrtc_pm8xxxqcom_q6v5qcom_spmi_temp_alarmvenus_coreqcom_vadc_commonsnd_timerdrm_execqcom_sysmonsndqcom_commongpu_schedvideobuf2_dma_sgv4l2_mem2memqcom_glink_smemv4l2_fwnodesoundcoredrm_dp_aux_busqmi_helpersmdt_loaderv4l2_asyncvideobuf2_memopsvideobuf2_v4l2videodevqnoc_msm8916videobuf2_commonqcom_rngdrm_display_helpermcqcom_statsrpmsg_ctrlrpmsg_chardisplay_connectorramoops socinformtfs_memreed_solomonax88796b asix usbnetphy_qcom_usb_hsipv6 libsha1CPU: 2 UID: 0 PID: 28 Comm: kworker/2:0 Tainted: G W 6.18.0-rc1+ #16209 PREEMPT Tainted: [W]=WARN lr : __qcom_mdt_load+0x210/0x304 [mdt_loader] Call trace: __pi_memcpy_generic+0x128/0x22c (P) qcom_mdt_load+0x68/0x60c [mdt_loader] wcnss_load+0x2c/0x5c [qcom_wcnss_pil] rproc_start+0x30/0x1b4 rproc_boot+0x19c/0x560 rproc_auto_boot_callback+0x1c/0x34 request_firmware_work_func+0x4c/0x98 process_one_work+0x208/0x60c worker_thread+0x244/0x388 kthread+0x150/0x228 ret_from_fork+0x10/0x20 Code: 927cec03 cb0e0021 8b0e0042 a9411c26 (a900340c) ---[ end trace 0000000000000000 ]---Quoted 34 lines
---
v7:
- Split QCom to separate patch--- 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 ++++------ 5 files changed, 72 insertions(+), 129 deletions(-)...
drivers/remoteproc/qcom_wcnss.c +4
-8@@ -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" );drivers/remoteproc/qcom_wcnss.c static int wcnss_request_irq(struct qcom_wcnss *wcnss, · line 540
Quoted 10 lines
drivers/remoteproc/qcom_wcnss.c +4
-4-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);The above line causes the failure. After restoring it to:
wcnss->mem_region=devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);
Quoted 8 lines
Quoted 3 lines
the mentioned board boots fine again. I'm not sure about other drivers, if they also fail the same way as they might not be used on the tested board.
Other platforms (non-QCom) were tested also use
devm_ioremap_resource_wc(). So something else is claiming the same region? Can you dump out/proc/iomem?The region is dynamically allocated, so maybe that has something to do with it.
# dmesg | grep mem OF: reserved mem: 0x000000008e200000..0x000000008e7fffff (6144 KiB) nomap non-reusable wcnss OF: reserved mem: 0x000000008dd00000..0x000000008e1fffff (5120 KiB) nomap non-reusable venus OF: reserved mem: 0x000000008dc00000..0x000000008dcfffff (1024 KiB) nomap non-reusable mba OF: reserved mem: 0x0000000086000000..0x00000000862fffff (3072 KiB) nomap non-reusable tz-apps@86000000 OF: reserved mem: 0x0000000086300000..0x00000000863fffff (1024 KiB) nomap non-reusable smem@86300000 OF: reserved mem: 0x0000000086400000..0x00000000864fffff (1024 KiB) nomap non-reusable hypervisor@86400000 OF: reserved mem: 0x0000000086500000..0x000000008667ffff (1536 KiB) nomap non-reusable tz@86500000 OF: reserved mem: 0x0000000086680000..0x00000000866fffff (512 KiB) nomap non-reusable reserved@86680000 OF: reserved mem: 0x0000000086700000..0x00000000867dffff (896 KiB) nomap non-reusable rmtfs@86700000 OF: reserved mem: 0x00000000867e0000..0x00000000867fffff (128 KiB) nomap non-reusable rfsa@867e0000 OF: reserved mem: 0x0000000086800000..0x00000000892fffff (44032 KiB) nomap non-reusable mpss@86800000 OF: reserved mem: 0x00000000bff00000..0x00000000bfffffff (1024 KiB) map non-reusable ramoops@bff00000 NUMA: Faking a node at [mem 0x0000000080000000-0x00000000bd9fffff] NODE_DATA(0) allocated [mem 0xbd7c6800-0xbd7c943f] DMA [mem 0x0000000080000000-0x00000000bd9fffff] Early memory node ranges node 0: [mem 0x0000000080000000-0x0000000085ffffff] node 0: [mem 0x0000000086000000-0x00000000892fffff] node 0: [mem 0x0000000089300000-0x000000008dbfffff] node 0: [mem 0x000000008dc00000-0x000000008e7fffff] node 0: [mem 0x000000008e800000-0x00000000bd9fffff]
...
# cat /proc/iomem
...
80000000-85ffffff : System RAM
80000000-821affff : Kernel code
821b0000-82e5ffff : reserved
82e60000-840fffff : Kernel data
85000000-85013fff : reserved
86000000-892fffff : reserved
89300000-8dbfffff : System RAM
8dc00000-8e7fffff : reserved
8dc00000-8e7fffff : reserved
8e800000-bd9fffff : System RAM
b1000000-b6ffffff : reserved
b7000000-bbe08fff : reserved
bc480000-bd5fffff : reserved
bd621000-bd623fff : reserved
bd624000-bd724fff : reserved
bd725000-bd7b0fff : reserved
bd7b2000-bd7b4fff : reserved
bd7b5000-bd7b5fff : reserved
bd7b6000-bd7c9fff : reserved
bd7ca000-bd9fffff : reserved
The devm_ioremap_resource_wc() requested region (0x8e200000-0x8e7fffff) is marked as 'reserved' in /proc/iomem.
Best regards
Signature · 2 lines
Marek Szyprowski, PhD Samsung R&D Institute Poland
Re: [PATCH v7 2/2] remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
In reply to Rob HerringQuoted 5 lines
Other platforms (non-QCom) were tested also use
devm_ioremap_resource_wc(). So something else is claiming the same region? Can you dump out/proc/iomem?The region is dynamically allocated, so maybe that has something to do with it.
We noticed a related issue with imx_dsp_rproc.
Because:imx_dsp_rproc_prepare:
-> imx_dsp_rproc_add_carveout
-> /*... */ and this calls devm_ioremap_resource_wc
-> pm_runtime_get_sync
imx_dsp_rproc_unprepare:
->pm_runtime_put_sync
There is no easy way to manually undo devm_ioremap_resource_wc so I have sent a patch to use devm_ioremap_wc.
https://lore.kernel.org/imx/[email protected]/T/#u
In your case Marek at least you need to understand which driver
reserves 8dc00000-8e7fffff : reserved and why.
thanks,
Daniel.
Re: [PATCH v7 2/2] remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
In reply to Rob HerringHi Rob,
Am Dienstag, dem 02.12.2025 um 08:15 -0600 schrieb Rob Herring:
Quoted 154 lines
Quoted 143 lines · Marek Szyprowski
Hi Rob,
Quoted 13 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.Quoted 1 line
Signed-off-by Rob Herring (Arm) <[email protected]>This patch landed in today's linux-next as commit
c70b9d5fdcd7("remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region""). In my tests I found that it breaks booting of DragonBoard410c (arch/arm64/boot/dts/qcom/apq8016-sbc.dts) by causing the NULL pointer dereference. The issue is caused by replacingdevm_ioremap_wc()withdevm_ioremap_resource_wc(), which fails ondevm_request_mem_region(), see comment in the code below. It looks that the error handling is somewhere broken. Here is the the kernel log:remoteproc remoteproc0: 4080000.remoteproc is available qcom-wcnss-pil a204000.remoteproc: error
-EBUSY: can't request region for resource [mem 0x8e200000-0x8e7fffff] remoteproc remoteproc1: a204000.remoteproc is available remoteproc remoteproc1: powering up a204000.remoteproc remoteproc remoteproc1: Booting fw image qcom/apq8016/wcnss.mbn, size 4111376Unable to handle kernel paging request at virtual address fffffffffffffff0 Mem abort info: ... Internal error: Oops: 0000000096000046 [#1] SMP Modules linked in: cpufreq_powersave qcom_wcnss_pil
cpufreq_conservativecoresight_stmcoresight_replicatorcoresight_tmccoresight_tpiustm_corecoresight_funnelcoresight_cpu_debugcoresight_cti(+)adv7511 coresight
nfc rfkill msmsnd_soc_lpass_apq8016snd_soc_apq8016_sbcsnd_soc_lpass_cpusnd_soc_msm8916_analogsnd_soc_msm8916_digitalsnd_soc_qcom_commonsnd_soc_lpass_platformsnd_soc_coreqrtrubwc_configsnd_compressllcc_qcomsnd_pcm_dmaengineqcom_q6v5_msssnd_pcmocmemqcom_pil_infoqcom_spmi_vadcqcom_camssdrm_gpuvmqcom_ponrtc_pm8xxxqcom_q6v5qcom_spmi_temp_alarmvenus_coreqcom_vadc_commonsnd_timerdrm_execqcom_sysmonsndqcom_commongpu_schedvideobuf2_dma_sgv4l2_mem2memqcom_glink_smemv4l2_fwnodesoundcoredrm_dp_aux_busqmi_helpersmdt_loaderv4l2_asyncvideobuf2_memopsvideobuf2_v4l2videodevqnoc_msm8916videobuf2_commonqcom_rngdrm_display_helpermcqcom_statsrpmsg_ctrlrpmsg_chardisplay_connectorramoops socinformtfs_memreed_solomonax88796b asix usbnetphy_qcom_usb_hsipv6 libsha1CPU: 2 UID: 0 PID: 28 Comm: kworker/2:0 Tainted: G W 6.18.0-rc1+ #16209 PREEMPT Tainted: [W]=WARN lr : __qcom_mdt_load+0x210/0x304 [mdt_loader] Call trace: __pi_memcpy_generic+0x128/0x22c (P) qcom_mdt_load+0x68/0x60c [mdt_loader] wcnss_load+0x2c/0x5c [qcom_wcnss_pil] rproc_start+0x30/0x1b4 rproc_boot+0x19c/0x560 rproc_auto_boot_callback+0x1c/0x34 request_firmware_work_func+0x4c/0x98 process_one_work+0x208/0x60c worker_thread+0x244/0x388 kthread+0x150/0x228 ret_from_fork+0x10/0x20 Code: 927cec03 cb0e0021 8b0e0042 a9411c26 (a900340c) ---[ end trace 0000000000000000 ]---Quoted 47 lines
---
v7:
- Split QCom to separate patch
---
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 ++++------5 files changed, 72 insertions(+), 129 deletions(-)...
drivers/remoteproc/qcom_wcnss.c +4
-8@@ -526,25 +526,20 @@ static int wcnss_request_irq(structqcom_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;
}Quoted 8 lines
-
wcnss->mem_phys=wcnss->mem_reloc=rmem->base; -wcnss->mem_size=rmem->size;
-wcnss->mem_region= devm_ioremap_wc(wcnss->dev, wcnss-Quoted 1 line
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);The above line causes the failure. After restoring it to:
Quoted 8 lines
wcnss->mem_region=devm_ioremap_wc(wcnss->dev, wcnss->mem_phys, wcnss->mem_size);the mentioned board boots fine again. I'm not sure about other drivers,
if they also fail the same way as they might not be used on the tested
board.
Quoted 8 lines
Other platforms (non-QCom) were tested also use
devm_ioremap_resource_wc(). So something else is claiming the same region? Can you dump out/proc/iomem?The region is dynamically allocated, so maybe that has something to do with it.
Rob
the problem seems to persist with 6.19-rc7. On qcom/msm8939-longcheer- l9100 (msm8916-based) I still get:
Quoted 5 lines
remoteproc remoteproc0: 4080000.remoteproc is available
qcom-wcnss-pil a204000.remoteproc: error-EBUSY: can't request region for resource [mem 0x8e200000-0x8e7fffff] qcom-wcnss-pil a204000.remoteproc: unable to map memory region: [mem 0x8e200000-0x8e7fffff] qcom-wcnss-pil a204000.remoteproc: probe with driver qcom-wcnss-pil failed with error -16 remoteproc remoteproc1: releasing a204000.remoteproc
Maybe parts of your patch should be reverted (as suggested by Marek), to fix the regression (i.e. wifi not working) until a proper fix is found.
On msm8939-longcheer-l9100 the reserved memory regions look similar to the ones provided by Marek:
# dmesg | grep mem OF: reserved mem: 0x000000008e200000..0x000000008e7fffff (6144 KiB) nomap non-reusable wcnss OF: reserved mem: 0x000000008e100000..0x000000008e1fffff (1024 KiB) nomap non-reusable mba OF: reserved mem: 0x000000008df00000..0x000000008e0fffff (2048 KiB) nomap non-reusable gps OF: reserved mem: 0x0000000086000000..0x00000000862fffff (3072 KiB) nomap non-reusable tz-apps@86000000 OF: reserved mem: 0x0000000086300000..0x00000000863fffff (1024 KiB) nomap non-reusable smem@86300000 OF: reserved mem: 0x0000000086400000..0x00000000864fffff (1024 KiB) nomap non-reusable hypervisor@86400000 OF: reserved mem: 0x0000000086500000..0x000000008667ffff (1536 KiB) nomap non-reusable tz@86500000 OF: reserved mem: 0x0000000086680000..0x00000000866fffff (512 KiB) nomap non-reusable reserved@86680000 OF: reserved mem: 0x0000000086700000..0x00000000867dffff (896 KiB) nomap non-reusable rmtfs@86700000 OF: reserved mem: 0x00000000867e0000..0x00000000867fffff (128 KiB) nomap non-reusable rfsa@867e0000 OF: reserved mem: 0x0000000086800000..0x000000008b7fffff (81920 KiB) nomap non-reusable mpss@86800000 DMA [mem 0x0000000040000000-0x00000000ffffffff] Early memory node ranges node 0: [mem 0x0000000040000000-0x0000000085ffffff] node 0: [mem 0x0000000086000000-0x000000008b7fffff] node 0: [mem 0x000000008b800000-0x000000008defffff] node 0: [mem 0x000000008df00000-0x000000008e7fffff] node 0: [mem 0x000000008e800000-0x00000000ffffffff] Initmem setup node 0 [mem 0x0000000040000000-0x00000000ffffffff] software IO TLB: mapped [mem 0x00000000fae00000-0x00000000fb200000] (4MB) ...
# cat /proc/iomem ... 40000000-85ffffff : System RAM 40000000-410fffff : Kernel code 41100000-412bffff : reserved 412c0000-4154ffff : Kernel data 42000000-4200dfff : reserved 42200000-42c98fff : reserved 86000000-8b7fffff : reserved 8b800000-8defffff : System RAM 8df00000-8e7fffff : reserved 8df00000-8e7fffff : reserved 8e800000-ffffffff : System RAM fae00000-ff7fffff : reserved ff8ac000-ff8b7fff : reserved ff8b8000-ff8b9fff : reserved ff8ba000-ff9c1fff : reserved ff9c3000-ff9c6fff : reserved ff9c7000-ff9d7fff : reserved ff9d8000-ffa33fff : reserved ffa34000-ffffffff : reserved
Best regards,
André
Mathieu Poirier
maintainerQuoted 43 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]> # rcarTested-by Beleswar Padhi <[email protected]> # TISigned-off-by Rob Herring (Arm) <[email protected]>---
v7:
- Reworkst_rproc_parse_fw()loop and maintain existing behavior in case of no entries and error paths
- Split QCom to separate patchv6:
- Rebase on v6.18-rc1
- The error in v5 was fixed in v6.17 commitaea70964b5a7("of:reserved_mem: Add missingIORESOURCE_MEMflag on resources")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 8 lines
--- drivers/remoteproc/imx_dsp_rproc.c | 47 +++++++---------- drivers/remoteproc/imx_rproc.c | 70 ++++++++++--------------- drivers/remoteproc/rcar_rproc.c | 38 +++++--------- drivers/remoteproc/st_remoteproc.c | 43 ++++++++------- drivers/remoteproc/stm32_rproc.c | 46 +++++++--------- drivers/remoteproc/ti_k3_common.c | 28 ++++------ drivers/remoteproc/xlnx_r5_remoteproc.c | 53 +++++++------------
Applied - thanks,
Mathieu
Quoted 587 lines
7 files changed, 129 insertions(+), 196 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@@ -490,50 +490,44 @@ static int imx_rproc_prepare(struct rproc *rproc) {struct imx_rproc *priv = rproc->priv;struct device_node *np = priv->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 ) { +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 ; -if (!strcmp (it.node->name,"rsc-table" )) +if (strstarts (res.name,"rsc-table" ))continue ; - rmem =of_reserved_mem_lookup (it.node); -if (!rmem) { -of_node_put (it.node); -dev_err (priv->dev,"unable to acquire memory-region\n" ); -return -EINVAL ; - } -/* No need to translate pa to da, i.MX use same map */ - da = rmem->base; + da = res.start;/* Register memory region */ - mem =rproc_mem_entry_init (priv->dev,NULL , (dma_addr_t )rmem->base, rmem->size, da, + mem =rproc_mem_entry_init (priv->dev,NULL , (dma_addr_t )res.start, +resource_size (&res), da, imx_rproc_mem_alloc, imx_rproc_mem_release, - it.node->name); - -if (mem) { -rproc_coredump_add_segment (rproc, da, rmem->size); - }else { -of_node_put (it.node); +"%.*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 ; }static int imx_rproc_parse_fw (struct rproc *rproc,const struct firmware *fw)@@ -664,47 +658,37 @@ static int imx_rproc_addr_init(struct imx_rproc *priv, }/* memory-region is optional property */ - nph =of_count_phandle_with_args (np,"memory-region" ,NULL ); + nph =of_reserved_mem_region_count (np);if (nph <=0 )return 0 ;/* remap optional addresses */ for (a =0 ; a < nph; a++) { -struct device_node *node;struct resource res; - node =of_parse_phandle (np,"memory-region" , a); -if (!node) -continue ; -/* Not map vdevbuffer, vdevring region */ -if (!strncmp (node->name,"vdev" ,strlen ("vdev" ))) { -of_node_put (node); -continue ; - } - err =of_address_to_resource (node,0 , &res); + err =of_reserved_mem_region_to_resource (np, a, &res);if (err) {dev_err (dev,"unable to resolve memory region\n" ); -of_node_put (node);return err; } -if (b >=IMX_RPROC_MEM_MAX ) { -of_node_put (node); +/* Not map vdevbuffer, vdevring region */ +if (strstarts (res.name,"vdev" )) +continue ; + +if (b >=IMX_RPROC_MEM_MAX )break ; - }/* Not use resource version, because we might share region */ - 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);if (!priv->mem[b].cpu_addr) {dev_err (dev,"failed to remap %pr\n" , &res); -of_node_put (node);return -ENOMEM ; } priv->mem[b].sys_addr = res.start; priv->mem[b].size =resource_size (&res); -if (!strcmp (node->name,"rsc-table" )) +if (!strcmp (res.name,"rsc-table" )) priv->rsc_table = priv->mem[b].cpu_addr; -of_node_put (node); b++; }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 +21
-22@@ -120,40 +120,39 @@ static int st_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)struct device *dev = rproc->dev.parent;struct device_node *np = dev->of_node;struct rproc_mem_entry *mem; -struct reserved_mem *rmem; -struct of_phandle_iterator it; -int index =0 ; - -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 (dev,"unable to acquire memory-region\n" ); -return -EINVAL ; - } +int entries; + + entries =of_reserved_mem_region_count (np); + +for (int index =0 ; index < entries; index++) { +struct resource res; +int ret; + + ret =of_reserved_mem_region_to_resource (np, index, &res); +if (ret) +return ret;/* No need to map vdev buffer */ -if (strcmp (it.node->name,"vdev0buffer" )) { +if (!strstarts (res.name,"vdev0buffer" )) {/* Register memory region */ mem =rproc_mem_entry_init (dev,NULL , - (dma_addr_t )rmem->base, - rmem->size, rmem->base, + (dma_addr_t )res.start, +resource_size (&res), res.start, st_rproc_mem_alloc, st_rproc_mem_release, - it.node->name); +"%.*s" , +strchrnul (res.name,'@' ) - res.name, + res.name); }else {/* Register reserved memory for vdev buffer allocation */ mem =rproc_of_resm_mem_entry_init (dev, index, - rmem->size, - rmem->base, - it.node->name); +resource_size (&res), + res.start, +"vdev0buffer" ); } -if (!mem) { -of_node_put (it.node); +if (!mem)return -ENOMEM ; - }rproc_add_carveout (rproc, mem); index++;drivers/remoteproc/stm32_rproc.c +19
-27@@ -213,60 +213,52 @@ static int stm32_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;u64 da; -int index =0 ; +int index =0 , mr =0 ;/* 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 (dev,"unable to acquire memory-region\n" ); -return -EINVAL ; - } +while (1 ) { +struct resource res; +int ret; + + ret =of_reserved_mem_region_to_resource (np, mr++, &res); +if (ret) +return 0 ; -if (stm32_rproc_pa_to_da (rproc, rmem->base, &da) <0 ) { -of_node_put (it.node); -dev_err (dev,"memory region not valid %pa\n" , - &rmem->base); +if (stm32_rproc_pa_to_da (rproc, res.start, &da) <0 ) { +dev_err (dev,"memory region not valid %pR\n" , &res);return -EINVAL ; }/* No need to map vdev buffer */ -if (strcmp (it.node->name,"vdev0buffer" )) { +if (!strstarts (res.name,"vdev0buffer" )) {/* Register memory region */ mem =rproc_mem_entry_init (dev,NULL , - (dma_addr_t )rmem->base, - rmem->size, da, + (dma_addr_t )res.start, +resource_size (&res), da, stm32_rproc_mem_alloc, stm32_rproc_mem_release, - it.node->name); - +"%.*s" ,strchrnul (res.name,'@' ) - res.name, + res.name);if (mem)rproc_coredump_add_segment (rproc, da, - rmem->size); +resource_size (&res)); }else {/* Register reserved memory for vdev buffer alloc */ mem =rproc_of_resm_mem_entry_init (dev, index, - rmem->size, - rmem->base, - it.node->name); +resource_size (&res), + res.start, +"vdev0buffer" ); }if (!mem) { -of_node_put (it.node);return -ENOMEM ; }rproc_add_carveout (rproc, mem); index++; } - -return 0 ; }static int stm32_rproc_parse_fw (struct rproc *rproc,const struct firmware *fw)drivers/remoteproc/ti_k3_common.c +11
-17@@ -470,13 +470,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);@@ -505,23 +502,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@@ -492,53 +492,46 @@ static int add_mem_regions_carveout(struct rproc *rproc) {struct rproc_mem_entry *rproc_mem;struct zynqmp_r5_core *r5_core; -struct of_phandle_iterator it; -struct reserved_mem *rmem;int i =0 ; r5_core = rproc->priv;/* Register associated reserved memory regions */ -of_phandle_iterator_init (&it, r5_core->np,"memory-region" ,NULL ,0 ); +while (1 ) { +int err; +struct resource res; -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 ; - } + err =of_reserved_mem_region_to_resource (r5_core->np, i, &res); +if (err) +return 0 ; -if (!strcmp (it.node->name,"vdev0buffer" )) { +if (strstarts (res.name,"vdev0buffer" )) {/* Init reserved memory for vdev buffer */ rproc_mem =rproc_of_resm_mem_entry_init (&rproc->dev, i, - rmem->size, - rmem->base, - it.node->name); +resource_size (&res), + res.start, +"vdev0buffer" ); }else {/* Register associated reserved memory regions */ rproc_mem =rproc_mem_entry_init (&rproc->dev,NULL , - (dma_addr_t )rmem->base, - rmem->size, rmem->base, + (dma_addr_t )res.start, +resource_size (&res), res.start, zynqmp_r5_mem_region_map, zynqmp_r5_mem_region_unmap, - it.node->name); +"%.*s" , +strchrnul (res.name,'@' ) - res.name, + res.name); } -if (!rproc_mem) { -of_node_put (it.node); +if (!rproc_mem)return -ENOMEM ; - }rproc_add_carveout (rproc, rproc_mem); -rproc_coredump_add_segment (rproc, rmem->base, rmem->size); +rproc_coredump_add_segment (rproc, res.start,resource_size (&res)); -dev_dbg (&rproc->dev,"reserved mem carveout %s addr=%llx, size=0x%llx" , - it.node->name, rmem->base, rmem->size); +dev_dbg (&rproc->dev,"reserved mem carveout %pR\n" , &res); i++; } - -return 0 ; }static int add_sram_carveouts (struct rproc *rproc)@@ -808,7 +801,6 @@ static int zynqmp_r5_get_rsc_table_va(struct zynqmp_r5_core *r5_core)struct device *dev = r5_core->dev;struct rsc_tbl_data *rsc_data_va;struct resource res_mem; -struct device_node *np;int ret;/* @@ -818,14 +810,7 @@ static int zynqmp_r5_get_rsc_table_va(struct zynqmp_r5_core *r5_core)* contains that data structure which holds resource table address, size * and some magic number to validate correct resource table entry. */ - np =of_parse_phandle (r5_core->np,"memory-region" ,0 ); -if (!np) { -dev_err (dev,"failed to get memory region dev node\n" ); -return -EINVAL ; - } - - ret =of_address_to_resource (np,0 , &res_mem); -of_node_put (np); + ret =of_reserved_mem_region_to_resource (r5_core->np,0 , &res_mem);if (ret) {dev_err (dev,"failed to get memory-region resource addr\n" );return -EINVAL ;Signature · 1 line
2.51.0
kernel test robot
build botkernel test robot noticed the following build warnings:
Hi Rob,
kernel test robot noticed the following build warnings:
[auto build test WARNING on remoteproc/rproc-next]
[also build test WARNING on linus/master v6.18-rc7 next-20251125] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Rob-Herring-Arm/remoteproc-qcom-Use-of_reserved_mem_region_-functions-for-memory-region/20251125-023031 base: https://git.kernel.org/pub/scm/linux/kernel/git/remoteproc/linux.git rproc-next patch link: https://lore.kernel.org/r/20251124182751.507624-1-robh%40kernel.org patch subject: [PATCH v7 1/2] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" config: arm-defconfig (https://download.01.org/0day-ci/archive/20251125/[email protected]/config) compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9e9fe08b16ea2c4d9867fb4974edf2a3776d6ece) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251125/[email protected]/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/
All warnings (new ones prefixed by >>):
>> drivers/remoteproc/st_remoteproc.c:158:3: warning: variable 'index' is incremented both in the loop header and in the loop body [-Wfor-loop-analysis]
158 | index++;
| ^
drivers/remoteproc/st_remoteproc.c:127:39: note: incremented here
127 | for (int index = 0; index < entries; index++) {
| ^1 warning generated.
vim +/index +158 drivers/remoteproc/st_remoteproc.c
3df52ed7f269a2 Loic Pallardy 2019-01-10 117
3df52ed7f269a2 Loic Pallardy 2019-01-10 118 static int st_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
3df52ed7f269a2 Loic Pallardy 2019-01-10 119 {
3df52ed7f269a2 Loic Pallardy 2019-01-10 120 struct device *dev = rproc->dev.parent;
3df52ed7f269a2 Loic Pallardy 2019-01-10 121 struct device_node *np = dev->of_node;
3df52ed7f269a2 Loic Pallardy 2019-01-10 122 struct rproc_mem_entry *mem;
63a1074795248e Rob Herring (Arm 2025-11-24 123) int entries;
63a1074795248e Rob Herring (Arm 2025-11-24 124)
63a1074795248e Rob Herring (Arm 2025-11-24 125) entries = of_reserved_mem_region_count(np);
63a1074795248e Rob Herring (Arm 2025-11-24 126)
63a1074795248e Rob Herring (Arm 2025-11-24 127) for (int index = 0; index < entries; index++) {
63a1074795248e Rob Herring (Arm 2025-11-24 128) struct resource res;
63a1074795248e Rob Herring (Arm 2025-11-24 129) int ret;
63a1074795248e Rob Herring (Arm 2025-11-24 130)
63a1074795248e Rob Herring (Arm 2025-11-24 131) ret = of_reserved_mem_region_to_resource(np, index, &res);
63a1074795248e Rob Herring (Arm 2025-11-24 132) if (ret)
63a1074795248e Rob Herring (Arm 2025-11-24 133) return ret;
3df52ed7f269a2 Loic Pallardy 2019-01-10 134
3df52ed7f269a2 Loic Pallardy 2019-01-10 135 /* No need to map vdev buffer */
63a1074795248e Rob Herring (Arm 2025-11-24 136) if (!strstarts(res.name, "vdev0buffer")) {
3df52ed7f269a2 Loic Pallardy 2019-01-10 137 /* Register memory region */
3df52ed7f269a2 Loic Pallardy 2019-01-10 138 mem = rproc_mem_entry_init(dev, NULL,
63a1074795248e Rob Herring (Arm 2025-11-24 139) (dma_addr_t)res.start,
63a1074795248e Rob Herring (Arm 2025-11-24 140) resource_size(&res), res.start,
3df52ed7f269a2 Loic Pallardy 2019-01-10 141 st_rproc_mem_alloc,
3df52ed7f269a2 Loic Pallardy 2019-01-10 142 st_rproc_mem_release,
63a1074795248e Rob Herring (Arm 2025-11-24 143) "%.*s",
63a1074795248e Rob Herring (Arm 2025-11-24 144) strchrnul(res.name, '@') - res.name,
63a1074795248e Rob Herring (Arm 2025-11-24 145) res.name);
3df52ed7f269a2 Loic Pallardy 2019-01-10 146 } else {
3df52ed7f269a2 Loic Pallardy 2019-01-10 147 /* Register reserved memory for vdev buffer allocation */
3df52ed7f269a2 Loic Pallardy 2019-01-10 148 mem = rproc_of_resm_mem_entry_init(dev, index,
63a1074795248e Rob Herring (Arm 2025-11-24 149) resource_size(&res),
63a1074795248e Rob Herring (Arm 2025-11-24 150) res.start,
63a1074795248e Rob Herring (Arm 2025-11-24 151) "vdev0buffer");
3df52ed7f269a2 Loic Pallardy 2019-01-10 152 }
3df52ed7f269a2 Loic Pallardy 2019-01-10 153
63a1074795248e Rob Herring (Arm 2025-11-24 154) if (!mem)
3df52ed7f269a2 Loic Pallardy 2019-01-10 155 return -ENOMEM;
3df52ed7f269a2 Loic Pallardy 2019-01-10 156
3df52ed7f269a2 Loic Pallardy 2019-01-10 157 rproc_add_carveout(rproc, mem);
3df52ed7f269a2 Loic Pallardy 2019-01-10 @158 index++;
3df52ed7f269a2 Loic Pallardy 2019-01-10 159 }
3df52ed7f269a2 Loic Pallardy 2019-01-10 160
3df52ed7f269a2 Loic Pallardy 2019-01-10 161 return rproc_elf_load_rsc_table(rproc, fw);
3df52ed7f269a2 Loic Pallardy 2019-01-10 162 }
3df52ed7f269a2 Loic Pallardy 2019-01-10 163 Signature · 2 lines
0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Re: (subset) [PATCH v7 1/2] remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
In reply to Rob Herring (Arm)Quoted 4 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.
Quoted 8 lines
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.[...]
Applied, thanks!
[2/2] remoteproc: qcom: Use of_reserved_mem_region_* functions for "memory-region"
commit: c70b9d5fdcd707ddac29284ea425fd433f374696
Best regards,
Signature · 1 line
Bjorn Andersson <[email protected]>