* [PATCH v2 0/4] of: Common "memory-region" parsing
@ 2025-04-23 19:42 Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Rob Herring (Arm)
` (6 more replies)
0 siblings, 7 replies; 16+ messages in thread
From: Rob Herring (Arm) @ 2025-04-23 19:42 UTC (permalink / raw)
To: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32, Daniel Baluta
While there's a common function to parse "memory-region" properties for
DMA pool regions, there's not anything for driver private regions. As a
result, drivers have resorted to parsing "memory-region" properties
themselves repeating the same pattern over and over. To fix this, this
series adds 2 functions to handle those cases:
of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
I've converted the whole tree, but just including remoteproc here as
it has the most cases. I intend to apply the first 3 patches for 6.16
so the driver conversions can be applied for 6.17.
A git tree with all the drivers converted is here[1].
v2:
- Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
- Export devm_ioremap_resource_wc()
- Rework handling of resource name to drop unit-address from name as it
was before.
- Link to v1:
https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
[1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/memory-region
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
---
Rob Herring (Arm) (4):
of: reserved_mem: Add functions to parse "memory-region"
of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
devres: Export devm_ioremap_resource_wc()
remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
drivers/of/device.c | 31 +++++-------
drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++
drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
drivers/remoteproc/imx_rproc.c | 68 +++++++++++---------------
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 | 36 ++++++--------
drivers/remoteproc/st_remoteproc.c | 41 ++++++++--------
drivers/remoteproc/stm32_rproc.c | 44 ++++++++---------
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++------
drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++------
drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++------
drivers/remoteproc/xlnx_r5_remoteproc.c | 51 ++++++++------------
include/linux/of_reserved_mem.h | 26 ++++++++++
lib/devres.c | 1 +
18 files changed, 339 insertions(+), 369 deletions(-)
---
base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
change-id: 20250423-dt-memory-region-v2-a2b15caacc63
Best regards,
--
Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region"
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
@ 2025-04-23 19:42 ` Rob Herring (Arm)
2025-04-28 8:07 ` Arnaud POULIQUEN
2025-04-23 19:42 ` [PATCH v2 2/4] of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle() Rob Herring (Arm)
` (5 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Rob Herring (Arm) @ 2025-04-23 19:42 UTC (permalink / raw)
To: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32, Daniel Baluta
Drivers with "memory-region" properties currently have to do their own
parsing of "memory-region" properties. The result is all the drivers
have similar patterns of a call to parse "memory-region" and then get
the region's address and size. As this is a standard property, it should
have common functions for drivers to use. Add new functions to count the
number of regions and retrieve the region's address as a resource.
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
---
v2:
- Wrap function parameters
---
drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++++++++++++
include/linux/of_reserved_mem.h | 26 ++++++++++++++
2 files changed, 106 insertions(+)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index ee2e31522d7e..f87915cce961 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -12,6 +12,7 @@
#define pr_fmt(fmt) "OF: reserved mem: " fmt
#include <linux/err.h>
+#include <linux/ioport.h>
#include <linux/libfdt.h>
#include <linux/of.h>
#include <linux/of_fdt.h>
@@ -740,3 +741,82 @@ struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
return NULL;
}
EXPORT_SYMBOL_GPL(of_reserved_mem_lookup);
+
+/**
+ * of_reserved_mem_region_to_resource() - Get a reserved memory region as a resource
+ * @np: node containing 'memory-region' property
+ * @idx: index of 'memory-region' property to lookup
+ * @res: Pointer to a struct resource to fill in with reserved region
+ *
+ * This function allows drivers to lookup a node's 'memory-region' property
+ * entries by index and return a struct resource for the entry.
+ *
+ * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-region'
+ * is missing or unavailable, -EINVAL for any other error.
+ */
+int of_reserved_mem_region_to_resource(const struct device_node *np,
+ unsigned int idx, struct resource *res)
+{
+ struct reserved_mem *rmem;
+
+ if (!np)
+ return -EINVAL;
+
+ struct device_node __free(device_node) *target = of_parse_phandle(np, "memory-region", idx);
+ if (!target || !of_device_is_available(target))
+ return -ENODEV;
+
+ rmem = of_reserved_mem_lookup(target);
+ if (!rmem)
+ return -EINVAL;
+
+ resource_set_range(res, rmem->base, rmem->size);
+ res->name = rmem->name;
+ return 0;
+}
+EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource);
+
+/**
+ * of_reserved_mem_region_to_resource_byname() - Get a reserved memory region as a resource
+ * @np: node containing 'memory-region' property
+ * @name: name of 'memory-region' property entry to lookup
+ * @res: Pointer to a struct resource to fill in with reserved region
+ *
+ * This function allows drivers to lookup a node's 'memory-region' property
+ * entries by name and return a struct resource for the entry.
+ *
+ * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-region'
+ * is missing or unavailable, -EINVAL for any other error.
+ */
+int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
+ const char *name,
+ struct resource *res)
+{
+ int idx;
+
+ if (!name)
+ return -EINVAL;
+
+ idx = of_property_match_string(np, "memory-region-names", name);
+ if (idx < 0)
+ return idx;
+
+ return of_reserved_mem_region_to_resource(np, idx, res);
+}
+EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource_byname);
+
+/**
+ * of_reserved_mem_region_count() - Return the number of 'memory-region' entries
+ * @np: node containing 'memory-region' property
+ *
+ * This function allows drivers to retrieve the number of entries for a node's
+ * 'memory-region' property.
+ *
+ * Returns the number of entries on success, or negative error code on a
+ * malformed property.
+ */
+int of_reserved_mem_region_count(const struct device_node *np)
+{
+ return of_count_phandle_with_args(np, "memory-region", NULL);
+}
+EXPORT_SYMBOL_GPL(of_reserved_mem_region_count);
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index e338282da652..f573423359f4 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -7,6 +7,7 @@
struct of_phandle_args;
struct reserved_mem_ops;
+struct resource;
struct reserved_mem {
const char *name;
@@ -39,6 +40,12 @@ int of_reserved_mem_device_init_by_name(struct device *dev,
void of_reserved_mem_device_release(struct device *dev);
struct reserved_mem *of_reserved_mem_lookup(struct device_node *np);
+int of_reserved_mem_region_to_resource(const struct device_node *np,
+ unsigned int idx, struct resource *res);
+int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
+ const char *name, struct resource *res);
+int of_reserved_mem_region_count(const struct device_node *np);
+
#else
#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
@@ -63,6 +70,25 @@ static inline struct reserved_mem *of_reserved_mem_lookup(struct device_node *np
{
return NULL;
}
+
+static inline int of_reserved_mem_region_to_resource(const struct device_node *np,
+ unsigned int idx,
+ struct resource *res)
+{
+ return -ENOSYS;
+}
+
+static inline int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
+ const char *name,
+ struct resource *res)
+{
+ return -ENOSYS;
+}
+
+static inline int of_reserved_mem_region_count(const struct device_node *np)
+{
+ return 0;
+}
#endif
/**
--
2.47.2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 2/4] of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Rob Herring (Arm)
@ 2025-04-23 19:42 ` Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 3/4] devres: Export devm_ioremap_resource_wc() Rob Herring (Arm)
` (4 subsequent siblings)
6 siblings, 0 replies; 16+ messages in thread
From: Rob Herring (Arm) @ 2025-04-23 19:42 UTC (permalink / raw)
To: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
Simplify of_dma_set_restricted_buffer() by using of_property_present()
and of_for_each_phandle() iterator.
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
---
v2:
- Maintain prior behavior only warning if
of_reserved_mem_device_init_by_idx() fails
---
drivers/of/device.c | 31 +++++++++++--------------------
1 file changed, 11 insertions(+), 20 deletions(-)
diff --git a/drivers/of/device.c b/drivers/of/device.c
index 5053e5d532cc..c80426510ec2 100644
--- a/drivers/of/device.c
+++ b/drivers/of/device.c
@@ -35,44 +35,35 @@ EXPORT_SYMBOL(of_match_device);
static void
of_dma_set_restricted_buffer(struct device *dev, struct device_node *np)
{
- struct device_node *node, *of_node = dev->of_node;
- int count, i;
+ struct device_node *of_node = dev->of_node;
+ struct of_phandle_iterator it;
+ int rc, i = 0;
if (!IS_ENABLED(CONFIG_DMA_RESTRICTED_POOL))
return;
- count = of_property_count_elems_of_size(of_node, "memory-region",
- sizeof(u32));
/*
* If dev->of_node doesn't exist or doesn't contain memory-region, try
* the OF node having DMA configuration.
*/
- if (count <= 0) {
+ if (!of_property_present(of_node, "memory-region"))
of_node = np;
- count = of_property_count_elems_of_size(
- of_node, "memory-region", sizeof(u32));
- }
- for (i = 0; i < count; i++) {
- node = of_parse_phandle(of_node, "memory-region", i);
+ of_for_each_phandle(&it, rc, of_node, "memory-region", NULL, 0) {
/*
* There might be multiple memory regions, but only one
* restricted-dma-pool region is allowed.
*/
- if (of_device_is_compatible(node, "restricted-dma-pool") &&
- of_device_is_available(node)) {
- of_node_put(node);
+ if (of_device_is_compatible(it.node, "restricted-dma-pool") &&
+ of_device_is_available(it.node)) {
+ if (of_reserved_mem_device_init_by_idx(dev, of_node, i))
+ dev_warn(dev, "failed to initialise \"restricted-dma-pool\" memory node\n");
+ of_node_put(it.node);
break;
}
- of_node_put(node);
+ i++;
}
- /*
- * Attempt to initialize a restricted-dma-pool region if one was found.
- * Note that count can hold a negative error code.
- */
- if (i < count && of_reserved_mem_device_init_by_idx(dev, of_node, i))
- dev_warn(dev, "failed to initialise \"restricted-dma-pool\" memory node\n");
}
/**
--
2.47.2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 3/4] devres: Export devm_ioremap_resource_wc()
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 2/4] of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle() Rob Herring (Arm)
@ 2025-04-23 19:42 ` Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" Rob Herring (Arm)
` (3 subsequent siblings)
6 siblings, 0 replies; 16+ messages in thread
From: Rob Herring (Arm) @ 2025-04-23 19:42 UTC (permalink / raw)
To: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
devm_ioremap_resource_wc() is not exported, so add one.
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
---
v2:
- New patch
---
lib/devres.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/lib/devres.c b/lib/devres.c
index 73901160197e..378b07730420 100644
--- a/lib/devres.c
+++ b/lib/devres.c
@@ -206,6 +206,7 @@ void __iomem *devm_ioremap_resource_wc(struct device *dev,
{
return __devm_ioremap_resource(dev, res, DEVM_IOREMAP_WC);
}
+EXPORT_SYMBOL(devm_ioremap_resource_wc);
/*
* devm_of_iomap - Requests a resource and maps the memory mapped IO
--
2.47.2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
` (2 preceding siblings ...)
2025-04-23 19:42 ` [PATCH v2 3/4] devres: Export devm_ioremap_resource_wc() Rob Herring (Arm)
@ 2025-04-23 19:42 ` Rob Herring (Arm)
2025-05-02 15:40 ` Tanmay Shah
2025-04-24 14:14 ` [PATCH v2 0/4] of: Common "memory-region" parsing Mathieu Poirier
` (2 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Rob Herring (Arm) @ 2025-04-23 19:42 UTC (permalink / raw)
To: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
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.
Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
---
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 | 45 ++++++++------------
drivers/remoteproc/imx_rproc.c | 68 ++++++++++++------------------
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 | 36 +++++++---------
drivers/remoteproc/st_remoteproc.c | 41 +++++++++---------
drivers/remoteproc/stm32_rproc.c | 44 +++++++++-----------
drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++--------
drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++--------
drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++--------
drivers/remoteproc/xlnx_r5_remoteproc.c | 51 +++++++++--------------
14 files changed, 221 insertions(+), 349 deletions(-)
diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c
index 90cb1fc13e71..fffae6ff4a5c 100644
--- a/drivers/remoteproc/imx_dsp_rproc.c
+++ b/drivers/remoteproc/imx_dsp_rproc.c
@@ -598,11 +598,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 */
@@ -633,45 +631,38 @@ 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);
}
diff --git a/drivers/remoteproc/imx_rproc.c b/drivers/remoteproc/imx_rproc.c
index 74299af1d7f1..31999741fbac 100644
--- a/drivers/remoteproc/imx_rproc.c
+++ b/drivers/remoteproc/imx_rproc.c
@@ -549,46 +549,42 @@ 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);
}
@@ -723,47 +719,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++;
}
diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index 94af77baa7a1..a5b7cbb8fe07 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -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;
}
diff --git a/drivers/remoteproc/qcom_q6v5_mss.c b/drivers/remoteproc/qcom_q6v5_mss.c
index 0c0199fb0e68..0fea5f91dd1c 100644
--- a/drivers/remoteproc/qcom_q6v5_mss.c
+++ b/drivers/remoteproc/qcom_q6v5_mss.c
@@ -1961,8 +1961,8 @@ static int q6v5_init_reset(struct q6v5 *qproc)
static int q6v5_alloc_memory_region(struct q6v5 *qproc)
{
struct device_node *child;
- struct reserved_mem *rmem;
- struct device_node *node;
+ struct resource res;
+ int ret;
/*
* In the absence of mba/mpss sub-child, extract the mba and mpss
@@ -1970,71 +1970,49 @@ static int q6v5_alloc_memory_region(struct q6v5 *qproc)
*/
child = of_get_child_by_name(qproc->dev->of_node, "mba");
if (!child) {
- node = of_parse_phandle(qproc->dev->of_node,
- "memory-region", 0);
+ ret = of_reserved_mem_region_to_resource(qproc->dev->of_node, 0, &res);
} else {
- node = of_parse_phandle(child, "memory-region", 0);
+ ret = of_reserved_mem_region_to_resource(child, 0, &res);
of_node_put(child);
}
- if (!node) {
- dev_err(qproc->dev, "no mba memory-region specified\n");
- return -EINVAL;
- }
-
- rmem = of_reserved_mem_lookup(node);
- of_node_put(node);
- if (!rmem) {
+ if (ret) {
dev_err(qproc->dev, "unable to resolve mba region\n");
- return -EINVAL;
+ return ret;
}
- qproc->mba_phys = rmem->base;
- qproc->mba_size = rmem->size;
+ qproc->mba_phys = res.start;
+ qproc->mba_size = resource_size(&res);
if (!child) {
- node = of_parse_phandle(qproc->dev->of_node,
- "memory-region", 1);
+ ret = of_reserved_mem_region_to_resource(qproc->dev->of_node, 1, &res);
} else {
child = of_get_child_by_name(qproc->dev->of_node, "mpss");
- node = of_parse_phandle(child, "memory-region", 0);
+ ret = of_reserved_mem_region_to_resource(child, 0, &res);
of_node_put(child);
}
- if (!node) {
- dev_err(qproc->dev, "no mpss memory-region specified\n");
- return -EINVAL;
- }
-
- rmem = of_reserved_mem_lookup(node);
- of_node_put(node);
- if (!rmem) {
+ if (ret) {
dev_err(qproc->dev, "unable to resolve mpss region\n");
- return -EINVAL;
+ return ret;
}
- qproc->mpss_phys = qproc->mpss_reloc = rmem->base;
- qproc->mpss_size = rmem->size;
+ qproc->mpss_phys = qproc->mpss_reloc = res.start;
+ qproc->mpss_size = resource_size(&res);
if (!child) {
- node = of_parse_phandle(qproc->dev->of_node, "memory-region", 2);
+ ret = of_reserved_mem_region_to_resource(qproc->dev->of_node, 2, &res);
} else {
child = of_get_child_by_name(qproc->dev->of_node, "metadata");
- node = of_parse_phandle(child, "memory-region", 0);
+ ret = of_reserved_mem_region_to_resource(child, 0, &res);
of_node_put(child);
}
- if (!node)
+ if (ret)
return 0;
- rmem = of_reserved_mem_lookup(node);
- if (!rmem) {
- dev_err(qproc->dev, "unable to resolve metadata region\n");
- return -EINVAL;
- }
-
- qproc->mdata_phys = rmem->base;
- qproc->mdata_size = rmem->size;
+ qproc->mdata_phys = res.start;
+ qproc->mdata_size = resource_size(&res);
return 0;
}
diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index b306f223127c..73f415ff2678 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -546,53 +546,37 @@ static void adsp_pds_detach(struct qcom_adsp *adsp, struct device **pds,
static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
{
- struct reserved_mem *rmem;
- struct device_node *node;
-
- node = of_parse_phandle(adsp->dev->of_node, "memory-region", 0);
- if (!node) {
- dev_err(adsp->dev, "no memory-region specified\n");
- return -EINVAL;
- }
+ struct resource res;
+ int ret;
- rmem = of_reserved_mem_lookup(node);
- of_node_put(node);
- 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;
}
if (!adsp->dtb_pas_id)
return 0;
- node = of_parse_phandle(adsp->dev->of_node, "memory-region", 1);
- if (!node) {
- dev_err(adsp->dev, "no dtb memory-region specified\n");
- return -EINVAL;
- }
-
- rmem = of_reserved_mem_lookup(node);
- of_node_put(node);
- if (!rmem) {
+ ret = of_reserved_mem_region_to_resource(adsp->dev->of_node, 1, &res);
+ if (ret) {
dev_err(adsp->dev, "unable to resolve dtb memory-region\n");
- return -EINVAL;
+ return ret;
}
- adsp->dtb_mem_phys = adsp->dtb_mem_reloc = rmem->base;
- adsp->dtb_mem_size = rmem->size;
- adsp->dtb_mem_region = devm_ioremap_wc(adsp->dev, adsp->dtb_mem_phys, adsp->dtb_mem_size);
+ adsp->dtb_mem_phys = adsp->dtb_mem_reloc = res.start;
+ adsp->dtb_mem_size = resource_size(&res);
+ adsp->dtb_mem_region = devm_ioremap_resource_wc(adsp->dev, &res);
if (!adsp->dtb_mem_region) {
- dev_err(adsp->dev, "unable to map dtb memory region: %pa+%zx\n",
- &rmem->base, adsp->dtb_mem_size);
+ dev_err(adsp->dev, "unable to map dtb memory region: %pR\n", &res);
return -EBUSY;
}
@@ -602,7 +586,6 @@ static int adsp_alloc_memory_region(struct qcom_adsp *adsp)
static int adsp_assign_memory_region(struct qcom_adsp *adsp)
{
struct qcom_scm_vmperm perm[MAX_ASSIGN_COUNT];
- struct device_node *node;
unsigned int perm_size;
int offset;
int ret;
@@ -611,17 +594,15 @@ static int adsp_assign_memory_region(struct qcom_adsp *adsp)
return 0;
for (offset = 0; offset < adsp->region_assign_count; ++offset) {
- struct reserved_mem *rmem = NULL;
-
- node = of_parse_phandle(adsp->dev->of_node, "memory-region",
- adsp->region_assign_idx + offset);
- if (node)
- rmem = of_reserved_mem_lookup(node);
- of_node_put(node);
- if (!rmem) {
+ struct resource res;
+
+ ret = of_reserved_mem_region_to_resource(adsp->dev->of_node,
+ adsp->region_assign_idx + offset,
+ &res);
+ if (ret) {
dev_err(adsp->dev, "unable to resolve shareable memory-region index %d\n",
offset);
- return -EINVAL;
+ return ret;
}
if (adsp->region_assign_shared) {
@@ -636,8 +617,8 @@ static int adsp_assign_memory_region(struct qcom_adsp *adsp)
perm_size = 1;
}
- adsp->region_assign_phys[offset] = rmem->base;
- adsp->region_assign_size[offset] = rmem->size;
+ adsp->region_assign_phys[offset] = res.start;
+ adsp->region_assign_size[offset] = resource_size(&res);
adsp->region_assign_owners[offset] = BIT(QCOM_SCM_VMID_HLOS);
ret = qcom_scm_assign_mem(adsp->region_assign_phys[offset],
diff --git a/drivers/remoteproc/qcom_q6v5_wcss.c b/drivers/remoteproc/qcom_q6v5_wcss.c
index 93648734a2f2..4a3235ee0963 100644
--- a/drivers/remoteproc/qcom_q6v5_wcss.c
+++ b/drivers/remoteproc/qcom_q6v5_wcss.c
@@ -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;
}
diff --git a/drivers/remoteproc/qcom_wcnss.c b/drivers/remoteproc/qcom_wcnss.c
index 775b056d795a..7893a5a67306 100644
--- a/drivers/remoteproc/qcom_wcnss.c
+++ b/drivers/remoteproc/qcom_wcnss.c
@@ -525,25 +525,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;
}
diff --git a/drivers/remoteproc/rcar_rproc.c b/drivers/remoteproc/rcar_rproc.c
index 921d853594f4..0be1a4073a94 100644
--- a/drivers/remoteproc/rcar_rproc.c
+++ b/drivers/remoteproc/rcar_rproc.c
@@ -52,41 +52,33 @@ 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);
}
diff --git a/drivers/remoteproc/st_remoteproc.c b/drivers/remoteproc/st_remoteproc.c
index e6566a9839dc..043348366926 100644
--- a/drivers/remoteproc/st_remoteproc.c
+++ b/drivers/remoteproc/st_remoteproc.c
@@ -120,40 +120,37 @@ 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 index = 0, mr = 0;
+
+ while (1) {
+ struct resource res;
+ int ret;
+
+ ret = of_reserved_mem_region_to_resource(np, mr++, &res);
+ if (ret)
+ return 0;
/* 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++;
diff --git a/drivers/remoteproc/stm32_rproc.c b/drivers/remoteproc/stm32_rproc.c
index b02b36a3f515..61939b80a957 100644
--- a/drivers/remoteproc/stm32_rproc.c
+++ b/drivers/remoteproc/stm32_rproc.c
@@ -213,52 +213,46 @@ 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;
- 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);
+ ret = of_reserved_mem_region_to_resource(np, mr++, &res);
+ if (ret)
+ return 0;
+
+ 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;
}
diff --git a/drivers/remoteproc/ti_k3_dsp_remoteproc.c b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
index a695890254ff..f02c835535bc 100644
--- a/drivers/remoteproc/ti_k3_dsp_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_dsp_remoteproc.c
@@ -535,13 +535,10 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_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 (%pe)\n",
ERR_PTR(num_rmems));
@@ -571,23 +568,20 @@ static int k3_dsp_reserved_mem_init(struct k3_dsp_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;
}
diff --git a/drivers/remoteproc/ti_k3_m4_remoteproc.c b/drivers/remoteproc/ti_k3_m4_remoteproc.c
index a16fb165fced..8c7772cd6baf 100644
--- a/drivers/remoteproc/ti_k3_m4_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_m4_remoteproc.c
@@ -393,13 +393,10 @@ static int k3_m4_reserved_mem_init(struct k3_m4_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);
@@ -428,23 +425,20 @@ static int k3_m4_reserved_mem_init(struct k3_m4_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;
}
diff --git a/drivers/remoteproc/ti_k3_r5_remoteproc.c b/drivers/remoteproc/ti_k3_r5_remoteproc.c
index dbc513c5569c..9a7a61e0ecb8 100644
--- a/drivers/remoteproc/ti_k3_r5_remoteproc.c
+++ b/drivers/remoteproc/ti_k3_r5_remoteproc.c
@@ -966,13 +966,10 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc)
{
struct device *dev = kproc->dev;
struct device_node *np = dev_of_node(dev);
- 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 have reserved memory regions, ret = %d\n",
num_rmems);
@@ -1003,16 +1000,13 @@ static int k3_r5_reserved_mem_init(struct k3_r5_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;
/*
* R5Fs do not have an MMU, but have a Region Address Translator
* (RAT) module that provides a fixed entry translation between
@@ -1023,12 +1017,12 @@ static int k3_r5_reserved_mem_init(struct k3_r5_rproc *kproc)
* addresses/supported memory regions are restricted to 32-bit
* bus addresses, and are identical
*/
- 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;
}
diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c b/drivers/remoteproc/xlnx_r5_remoteproc.c
index 5aeedeaf3c41..b73e97074c01 100644
--- a/drivers/remoteproc/xlnx_r5_remoteproc.c
+++ b/drivers/remoteproc/xlnx_r5_remoteproc.c
@@ -460,49 +460,44 @@ 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++;
}
@@ -776,7 +771,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;
/*
@@ -786,14 +780,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;
--
2.47.2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
` (3 preceding siblings ...)
2025-04-23 19:42 ` [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" Rob Herring (Arm)
@ 2025-04-24 14:14 ` Mathieu Poirier
2025-04-25 23:34 ` Iuliana Prodan
2025-05-01 15:44 ` Tanmay Shah
2025-04-28 8:16 ` Arnaud POULIQUEN
2025-05-07 4:42 ` Peng Fan
6 siblings, 2 replies; 16+ messages in thread
From: Mathieu Poirier @ 2025-04-24 14:14 UTC (permalink / raw)
To: Rob Herring (Arm), Arnaud Pouliquen, Daniel Baluta,
Iuliana Prodan, Andrew F. Davis, Shah, Tanmay
Cc: Saravana Kannan, Andrew Morton, Bjorn Andersson, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
Arnaud, Daniel, Iuliana, Andrew and Tanmay - please test this patchset
on the platforms you are working on.
Thanks,
Mathieu
On Wed, 23 Apr 2025 at 13:42, Rob Herring (Arm) <robh@kernel.org> wrote:
>
> While there's a common function to parse "memory-region" properties for
> DMA pool regions, there's not anything for driver private regions. As a
> result, drivers have resorted to parsing "memory-region" properties
> themselves repeating the same pattern over and over. To fix this, this
> series adds 2 functions to handle those cases:
> of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
>
> I've converted the whole tree, but just including remoteproc here as
> it has the most cases. I intend to apply the first 3 patches for 6.16
> so the driver conversions can be applied for 6.17.
>
> A git tree with all the drivers converted is here[1].
>
> v2:
> - Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
> - Export devm_ioremap_resource_wc()
> - Rework handling of resource name to drop unit-address from name as it
> was before.
> - Link to v1:
> https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
>
> [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/memory-region
>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
> Rob Herring (Arm) (4):
> of: reserved_mem: Add functions to parse "memory-region"
> of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
> devres: Export devm_ioremap_resource_wc()
> remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
>
> drivers/of/device.c | 31 +++++-------
> drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++
> drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
> drivers/remoteproc/imx_rproc.c | 68 +++++++++++---------------
> 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 | 36 ++++++--------
> drivers/remoteproc/st_remoteproc.c | 41 ++++++++--------
> drivers/remoteproc/stm32_rproc.c | 44 ++++++++---------
> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++------
> drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++------
> drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++------
> drivers/remoteproc/xlnx_r5_remoteproc.c | 51 ++++++++------------
> include/linux/of_reserved_mem.h | 26 ++++++++++
> lib/devres.c | 1 +
> 18 files changed, 339 insertions(+), 369 deletions(-)
> ---
> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
> change-id: 20250423-dt-memory-region-v2-a2b15caacc63
>
> Best regards,
> --
> Rob Herring (Arm) <robh@kernel.org>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-24 14:14 ` [PATCH v2 0/4] of: Common "memory-region" parsing Mathieu Poirier
@ 2025-04-25 23:34 ` Iuliana Prodan
2025-04-28 12:23 ` Rob Herring
2025-05-01 15:44 ` Tanmay Shah
1 sibling, 1 reply; 16+ messages in thread
From: Iuliana Prodan @ 2025-04-25 23:34 UTC (permalink / raw)
To: Mathieu Poirier, Rob Herring (Arm)
Cc: Arnaud Pouliquen, Daniel Baluta, Andrew F. Davis, Shah, Tanmay,
Saravana Kannan, Andrew Morton, Bjorn Andersson, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
Hello Mathieu, Rob,
I've tested imx_dsp_rproc and it fails with:
[ 39.743770] Unable to handle kernel paging request at virtual address
ffffffffffffffea
...
[ 39.805078] Hardware name: NXP i.MX8MPlus EVK board (DT)
[ 39.810390] pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS
BTYPE=--)
[ 39.817353] pc : __pi_memset_generic+0x50/0x188
[ 39.821892] lr : imx_dsp_rproc_prepare+0x3a4/0xea4 [imx_dsp_rproc]
[ 39.828079] sp : ffff8000853dbb10
[ 39.831396] x29: ffff8000853dbb90 x28: 0000000092400000 x27:
ffff80007a36d3d8
[ 39.838540] x26: ffff0000d0a5e410 x25: ffff80007a36d3f0 x24:
0000000000000004
[ 39.845685] x23: ffff0000d5414880 x22: ffff0000d5e1dce8 x21:
0000000000000000
[ 39.852827] x20: ffff0000d5e1db98 x19: ffff0000d5414b80 x18:
00000000ffffffff
[ 39.859970] x17: 202c656c69687720 x16: 3e2074756f657672 x15:
ffff800081f8d050
[ 39.867114] x14: ffff0000db584680 x13: 0000000000000003 x12:
00007fffa3330000
[ 39.874257] x11: 0000000000000004 x10: 0000000000000ab0 x9 :
0000000000000000
[ 39.881400] x8 : ffffffffffffffea x7 : 0000000000000000 x6 :
000000000000003f
[ 39.888546] x5 : 0000000000000040 x4 : 0000000000000006 x3 :
0000000000000004
[ 39.895689] x2 : 0000000000008000 x1 : 0000000000000000 x0 :
ffffffffffffffea
[ 39.902837] Call trace:
[ 39.905284] __pi_memset_generic+0x50/0x188 (P)
[ 39.909821] rproc_boot+0x2c0/0x524
[ 39.913317] state_store+0x40/0x100
[ 39.916812] dev_attr_store+0x18/0x2c
[ 39.920478] sysfs_kf_write+0x7c/0x94
[ 39.924146] kernfs_fop_write_iter+0x120/0x1e8
[ 39.928598] vfs_write+0x244/0x37c
[ 39.932008] ksys_write+0x70/0x110
[ 39.935413] __arm64_sys_write+0x1c/0x28
[ 39.939342] invoke_syscall+0x48/0x104
[ 39.943094] el0_svc_common.constprop.0+0xc0/0xe0
[ 39.947805] do_el0_svc+0x1c/0x28
[ 39.951123] el0_svc+0x30/0xcc
[ 39.954188] el0t_64_sync_handler+0x10c/0x138
[ 39.958549] el0t_64_sync+0x198/0x19c
[ 39.962222] Code: d65f03c0 cb0803e4 f2400c84 54000080 (a9001d07)
[ 39.968317] ---[ end trace 0000000000000000 ]---
The problem seems to be when computing `cpu_addr =
devm_ioremap_resource_wc(dev, &res);`, in patch 4.
In `__devm_ioremap_resource` (see [1]), it's expecting the resource type
to be `IORESOURCE_MEM`, which is not the case here (at least the flags
are nowhere set for this).
A quick fix would be to let the `cpu_addr` be calculated as before:
`cpu_addr = devm_ioremap_wc(dev, res.start, resource_size(&res));`.
Thanks,
Iulia
[1] https://elixir.bootlin.com/linux/v6.14.3/source/lib/devres.c#L134
On 4/24/2025 5:14 PM, Mathieu Poirier wrote:
> Arnaud, Daniel, Iuliana, Andrew and Tanmay - please test this patchset
> on the platforms you are working on.
>
> Thanks,
> Mathieu
>
> On Wed, 23 Apr 2025 at 13:42, Rob Herring (Arm) <robh@kernel.org> wrote:
>> While there's a common function to parse "memory-region" properties for
>> DMA pool regions, there's not anything for driver private regions. As a
>> result, drivers have resorted to parsing "memory-region" properties
>> themselves repeating the same pattern over and over. To fix this, this
>> series adds 2 functions to handle those cases:
>> of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
>>
>> I've converted the whole tree, but just including remoteproc here as
>> it has the most cases. I intend to apply the first 3 patches for 6.16
>> so the driver conversions can be applied for 6.17.
>>
>> A git tree with all the drivers converted is here[1].
>>
>> v2:
>> - Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
>> - Export devm_ioremap_resource_wc()
>> - Rework handling of resource name to drop unit-address from name as it
>> was before.
>> - Link to v1:
>> https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
>>
>> [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/memory-region
>>
>> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
>> ---
>> Rob Herring (Arm) (4):
>> of: reserved_mem: Add functions to parse "memory-region"
>> of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
>> devres: Export devm_ioremap_resource_wc()
>> remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
>>
>> drivers/of/device.c | 31 +++++-------
>> drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++
>> drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
>> drivers/remoteproc/imx_rproc.c | 68 +++++++++++---------------
>> 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 | 36 ++++++--------
>> drivers/remoteproc/st_remoteproc.c | 41 ++++++++--------
>> drivers/remoteproc/stm32_rproc.c | 44 ++++++++---------
>> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++------
>> drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++------
>> drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++------
>> drivers/remoteproc/xlnx_r5_remoteproc.c | 51 ++++++++------------
>> include/linux/of_reserved_mem.h | 26 ++++++++++
>> lib/devres.c | 1 +
>> 18 files changed, 339 insertions(+), 369 deletions(-)
>> ---
>> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
>> change-id: 20250423-dt-memory-region-v2-a2b15caacc63
>>
>> Best regards,
>> --
>> Rob Herring (Arm) <robh@kernel.org>
>>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region"
2025-04-23 19:42 ` [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Rob Herring (Arm)
@ 2025-04-28 8:07 ` Arnaud POULIQUEN
0 siblings, 0 replies; 16+ messages in thread
From: Arnaud POULIQUEN @ 2025-04-28 8:07 UTC (permalink / raw)
To: Rob Herring (Arm), Saravana Kannan, Andrew Morton,
Bjorn Andersson, Mathieu Poirier, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Patrice Chotard,
Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32, Daniel Baluta
Hello Rob,
On 4/23/25 21:42, Rob Herring (Arm) wrote:
> Drivers with "memory-region" properties currently have to do their own
> parsing of "memory-region" properties. The result is all the drivers
> have similar patterns of a call to parse "memory-region" and then get
> the region's address and size. As this is a standard property, it should
> have common functions for drivers to use. Add new functions to count the
> number of regions and retrieve the region's address as a resource.
>
> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
> v2:
> - Wrap function parameters
> ---
> drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++++++++++++
> include/linux/of_reserved_mem.h | 26 ++++++++++++++
> 2 files changed, 106 insertions(+)
>
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index ee2e31522d7e..f87915cce961 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -12,6 +12,7 @@
> #define pr_fmt(fmt) "OF: reserved mem: " fmt
>
> #include <linux/err.h>
> +#include <linux/ioport.h>
> #include <linux/libfdt.h>
> #include <linux/of.h>
> #include <linux/of_fdt.h>
> @@ -740,3 +741,82 @@ struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
> return NULL;
> }
> EXPORT_SYMBOL_GPL(of_reserved_mem_lookup);
> +
> +/**
> + * of_reserved_mem_region_to_resource() - Get a reserved memory region as a resource
> + * @np: node containing 'memory-region' property
> + * @idx: index of 'memory-region' property to lookup
> + * @res: Pointer to a struct resource to fill in with reserved region
> + *
> + * This function allows drivers to lookup a node's 'memory-region' property
> + * entries by index and return a struct resource for the entry.
> + *
> + * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-region'
> + * is missing or unavailable, -EINVAL for any other error.
> + */
> +int of_reserved_mem_region_to_resource(const struct device_node *np,
> + unsigned int idx, struct resource *res)
> +{
> + struct reserved_mem *rmem;
> +
> + if (!np)
> + return -EINVAL;
> +
> + struct device_node __free(device_node) *target = of_parse_phandle(np, "memory-region", idx);
> + if (!target || !of_device_is_available(target))
> + return -ENODEV;
> +
> + rmem = of_reserved_mem_lookup(target);
> + if (!rmem)
> + return -EINVAL;
> +
> + resource_set_range(res, rmem->base, rmem->size);
> + res->name = rmem->name;
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource);
> +
> +/**
> + * of_reserved_mem_region_to_resource_byname() - Get a reserved memory region as a resource
> + * @np: node containing 'memory-region' property
> + * @name: name of 'memory-region' property entry to lookup
> + * @res: Pointer to a struct resource to fill in with reserved region
> + *
> + * This function allows drivers to lookup a node's 'memory-region' property
> + * entries by name and return a struct resource for the entry.
> + *
> + * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-region'
> + * is missing or unavailable, -EINVAL for any other error.
of_property_match_string() can return some other error values.
Thanks,
Arnaud
> + */
> +int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
> + const char *name,
> + struct resource *res)
> +{
> + int idx;
> +
> + if (!name)
> + return -EINVAL;
> +
> + idx = of_property_match_string(np, "memory-region-names", name);
> + if (idx < 0)
> + return idx;
> +
> + return of_reserved_mem_region_to_resource(np, idx, res);
> +}
> +EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource_byname);
> +
> +/**
> + * of_reserved_mem_region_count() - Return the number of 'memory-region' entries
> + * @np: node containing 'memory-region' property
> + *
> + * This function allows drivers to retrieve the number of entries for a node's
> + * 'memory-region' property.
> + *
> + * Returns the number of entries on success, or negative error code on a
> + * malformed property.
> + */
> +int of_reserved_mem_region_count(const struct device_node *np)
> +{
> + return of_count_phandle_with_args(np, "memory-region", NULL);
> +}
> +EXPORT_SYMBOL_GPL(of_reserved_mem_region_count);
> diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
> index e338282da652..f573423359f4 100644
> --- a/include/linux/of_reserved_mem.h
> +++ b/include/linux/of_reserved_mem.h
> @@ -7,6 +7,7 @@
>
> struct of_phandle_args;
> struct reserved_mem_ops;
> +struct resource;
>
> struct reserved_mem {
> const char *name;
> @@ -39,6 +40,12 @@ int of_reserved_mem_device_init_by_name(struct device *dev,
> void of_reserved_mem_device_release(struct device *dev);
>
> struct reserved_mem *of_reserved_mem_lookup(struct device_node *np);
> +int of_reserved_mem_region_to_resource(const struct device_node *np,
> + unsigned int idx, struct resource *res);
> +int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
> + const char *name, struct resource *res);
> +int of_reserved_mem_region_count(const struct device_node *np);
> +
> #else
>
> #define RESERVEDMEM_OF_DECLARE(name, compat, init) \
> @@ -63,6 +70,25 @@ static inline struct reserved_mem *of_reserved_mem_lookup(struct device_node *np
> {
> return NULL;
> }
> +
> +static inline int of_reserved_mem_region_to_resource(const struct device_node *np,
> + unsigned int idx,
> + struct resource *res)
> +{
> + return -ENOSYS;
> +}
> +
> +static inline int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
> + const char *name,
> + struct resource *res)
> +{
> + return -ENOSYS;
> +}
> +
> +static inline int of_reserved_mem_region_count(const struct device_node *np)
> +{
> + return 0;
> +}
> #endif
>
> /**
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
` (4 preceding siblings ...)
2025-04-24 14:14 ` [PATCH v2 0/4] of: Common "memory-region" parsing Mathieu Poirier
@ 2025-04-28 8:16 ` Arnaud POULIQUEN
2025-05-07 4:42 ` Peng Fan
6 siblings, 0 replies; 16+ messages in thread
From: Arnaud POULIQUEN @ 2025-04-28 8:16 UTC (permalink / raw)
To: Rob Herring (Arm), Saravana Kannan, Andrew Morton,
Bjorn Andersson, Mathieu Poirier, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Patrice Chotard,
Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32, Daniel Baluta
On 4/23/25 21:42, Rob Herring (Arm) wrote:
> While there's a common function to parse "memory-region" properties for
> DMA pool regions, there's not anything for driver private regions. As a
> result, drivers have resorted to parsing "memory-region" properties
> themselves repeating the same pattern over and over. To fix this, this
> series adds 2 functions to handle those cases:
> of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
>
> I've converted the whole tree, but just including remoteproc here as
> it has the most cases. I intend to apply the first 3 patches for 6.16
> so the driver conversions can be applied for 6.17.
>
> A git tree with all the drivers converted is here[1].
>
> v2:
> - Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
> - Export devm_ioremap_resource_wc()
> - Rework handling of resource name to drop unit-address from name as it
> was before.
> - Link to v1:
> https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
>
> [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/memory-region
>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
> Rob Herring (Arm) (4):
> of: reserved_mem: Add functions to parse "memory-region"
> of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
> devres: Export devm_ioremap_resource_wc()
> remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
>
> drivers/of/device.c | 31 +++++-------
> drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++
> drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
> drivers/remoteproc/imx_rproc.c | 68 +++++++++++---------------
> 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 | 36 ++++++--------
> drivers/remoteproc/st_remoteproc.c | 41 ++++++++--------
> drivers/remoteproc/stm32_rproc.c | 44 ++++++++---------
> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++------
> drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++------
> drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++------
> drivers/remoteproc/xlnx_r5_remoteproc.c | 51 ++++++++------------
> include/linux/of_reserved_mem.h | 26 ++++++++++
> lib/devres.c | 1 +
> 18 files changed, 339 insertions(+), 369 deletions(-)
> ---
> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
> change-id: 20250423-dt-memory-region-v2-a2b15caacc63
>
Testing of the series on the STM32MP15 platform has passed.
just one minor comment in patch 1/4.
Acked-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com>
Thanks,
Arnaud
> Best regards,
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-25 23:34 ` Iuliana Prodan
@ 2025-04-28 12:23 ` Rob Herring
2025-04-28 21:40 ` Iuliana Prodan
0 siblings, 1 reply; 16+ messages in thread
From: Rob Herring @ 2025-04-28 12:23 UTC (permalink / raw)
To: Iuliana Prodan
Cc: Mathieu Poirier, Arnaud Pouliquen, Daniel Baluta, Andrew F. Davis,
Shah, Tanmay, Saravana Kannan, Andrew Morton, Bjorn Andersson,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
On Fri, Apr 25, 2025 at 6:34 PM Iuliana Prodan <iuliana.prodan@nxp.com> wrote:
>
> Hello Mathieu, Rob,
>
> I've tested imx_dsp_rproc and it fails with:
>
> [ 39.743770] Unable to handle kernel paging request at virtual address
> ffffffffffffffea
> ...
> [ 39.805078] Hardware name: NXP i.MX8MPlus EVK board (DT)
> [ 39.810390] pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS
> BTYPE=--)
> [ 39.817353] pc : __pi_memset_generic+0x50/0x188
> [ 39.821892] lr : imx_dsp_rproc_prepare+0x3a4/0xea4 [imx_dsp_rproc]
> [ 39.828079] sp : ffff8000853dbb10
> [ 39.831396] x29: ffff8000853dbb90 x28: 0000000092400000 x27:
> ffff80007a36d3d8
> [ 39.838540] x26: ffff0000d0a5e410 x25: ffff80007a36d3f0 x24:
> 0000000000000004
> [ 39.845685] x23: ffff0000d5414880 x22: ffff0000d5e1dce8 x21:
> 0000000000000000
> [ 39.852827] x20: ffff0000d5e1db98 x19: ffff0000d5414b80 x18:
> 00000000ffffffff
> [ 39.859970] x17: 202c656c69687720 x16: 3e2074756f657672 x15:
> ffff800081f8d050
> [ 39.867114] x14: ffff0000db584680 x13: 0000000000000003 x12:
> 00007fffa3330000
> [ 39.874257] x11: 0000000000000004 x10: 0000000000000ab0 x9 :
> 0000000000000000
> [ 39.881400] x8 : ffffffffffffffea x7 : 0000000000000000 x6 :
> 000000000000003f
> [ 39.888546] x5 : 0000000000000040 x4 : 0000000000000006 x3 :
> 0000000000000004
> [ 39.895689] x2 : 0000000000008000 x1 : 0000000000000000 x0 :
> ffffffffffffffea
> [ 39.902837] Call trace:
> [ 39.905284] __pi_memset_generic+0x50/0x188 (P)
> [ 39.909821] rproc_boot+0x2c0/0x524
> [ 39.913317] state_store+0x40/0x100
> [ 39.916812] dev_attr_store+0x18/0x2c
> [ 39.920478] sysfs_kf_write+0x7c/0x94
> [ 39.924146] kernfs_fop_write_iter+0x120/0x1e8
> [ 39.928598] vfs_write+0x244/0x37c
> [ 39.932008] ksys_write+0x70/0x110
> [ 39.935413] __arm64_sys_write+0x1c/0x28
> [ 39.939342] invoke_syscall+0x48/0x104
> [ 39.943094] el0_svc_common.constprop.0+0xc0/0xe0
> [ 39.947805] do_el0_svc+0x1c/0x28
> [ 39.951123] el0_svc+0x30/0xcc
> [ 39.954188] el0t_64_sync_handler+0x10c/0x138
> [ 39.958549] el0t_64_sync+0x198/0x19c
> [ 39.962222] Code: d65f03c0 cb0803e4 f2400c84 54000080 (a9001d07)
> [ 39.968317] ---[ end trace 0000000000000000 ]---
>
> The problem seems to be when computing `cpu_addr =
> devm_ioremap_resource_wc(dev, &res);`, in patch 4.
> In `__devm_ioremap_resource` (see [1]), it's expecting the resource type
> to be `IORESOURCE_MEM`, which is not the case here (at least the flags
> are nowhere set for this).
Thanks for testing and diagnosing. IORESOURCE_MEM needs to be set. Can
you test with this change:
index f87915cce961..00c93585758f 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -771,6 +771,7 @@ int of_reserved_mem_region_to_resource(const
struct device_node *np,
return -EINVAL;
resource_set_range(res, rmem->base, rmem->size);
+ res->flags = IORESOURCE_MEM;
res->name = rmem->name;
return 0;
}
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-28 12:23 ` Rob Herring
@ 2025-04-28 21:40 ` Iuliana Prodan
0 siblings, 0 replies; 16+ messages in thread
From: Iuliana Prodan @ 2025-04-28 21:40 UTC (permalink / raw)
To: Rob Herring
Cc: Mathieu Poirier, Arnaud Pouliquen, Daniel Baluta, Andrew F. Davis,
Shah, Tanmay, Saravana Kannan, Andrew Morton, Bjorn Andersson,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
On 4/28/2025 3:23 PM, Rob Herring wrote:
> On Fri, Apr 25, 2025 at 6:34 PM Iuliana Prodan <iuliana.prodan@nxp.com> wrote:
>> Hello Mathieu, Rob,
>>
>> I've tested imx_dsp_rproc and it fails with:
>>
>> [ 39.743770] Unable to handle kernel paging request at virtual address
>> ffffffffffffffea
>> ...
>> [ 39.805078] Hardware name: NXP i.MX8MPlus EVK board (DT)
>> [ 39.810390] pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS
>> BTYPE=--)
>> [ 39.817353] pc : __pi_memset_generic+0x50/0x188
>> [ 39.821892] lr : imx_dsp_rproc_prepare+0x3a4/0xea4 [imx_dsp_rproc]
>> [ 39.828079] sp : ffff8000853dbb10
>> [ 39.831396] x29: ffff8000853dbb90 x28: 0000000092400000 x27:
>> ffff80007a36d3d8
>> [ 39.838540] x26: ffff0000d0a5e410 x25: ffff80007a36d3f0 x24:
>> 0000000000000004
>> [ 39.845685] x23: ffff0000d5414880 x22: ffff0000d5e1dce8 x21:
>> 0000000000000000
>> [ 39.852827] x20: ffff0000d5e1db98 x19: ffff0000d5414b80 x18:
>> 00000000ffffffff
>> [ 39.859970] x17: 202c656c69687720 x16: 3e2074756f657672 x15:
>> ffff800081f8d050
>> [ 39.867114] x14: ffff0000db584680 x13: 0000000000000003 x12:
>> 00007fffa3330000
>> [ 39.874257] x11: 0000000000000004 x10: 0000000000000ab0 x9 :
>> 0000000000000000
>> [ 39.881400] x8 : ffffffffffffffea x7 : 0000000000000000 x6 :
>> 000000000000003f
>> [ 39.888546] x5 : 0000000000000040 x4 : 0000000000000006 x3 :
>> 0000000000000004
>> [ 39.895689] x2 : 0000000000008000 x1 : 0000000000000000 x0 :
>> ffffffffffffffea
>> [ 39.902837] Call trace:
>> [ 39.905284] __pi_memset_generic+0x50/0x188 (P)
>> [ 39.909821] rproc_boot+0x2c0/0x524
>> [ 39.913317] state_store+0x40/0x100
>> [ 39.916812] dev_attr_store+0x18/0x2c
>> [ 39.920478] sysfs_kf_write+0x7c/0x94
>> [ 39.924146] kernfs_fop_write_iter+0x120/0x1e8
>> [ 39.928598] vfs_write+0x244/0x37c
>> [ 39.932008] ksys_write+0x70/0x110
>> [ 39.935413] __arm64_sys_write+0x1c/0x28
>> [ 39.939342] invoke_syscall+0x48/0x104
>> [ 39.943094] el0_svc_common.constprop.0+0xc0/0xe0
>> [ 39.947805] do_el0_svc+0x1c/0x28
>> [ 39.951123] el0_svc+0x30/0xcc
>> [ 39.954188] el0t_64_sync_handler+0x10c/0x138
>> [ 39.958549] el0t_64_sync+0x198/0x19c
>> [ 39.962222] Code: d65f03c0 cb0803e4 f2400c84 54000080 (a9001d07)
>> [ 39.968317] ---[ end trace 0000000000000000 ]---
>>
>> The problem seems to be when computing `cpu_addr =
>> devm_ioremap_resource_wc(dev, &res);`, in patch 4.
>> In `__devm_ioremap_resource` (see [1]), it's expecting the resource type
>> to be `IORESOURCE_MEM`, which is not the case here (at least the flags
>> are nowhere set for this).
> Thanks for testing and diagnosing. IORESOURCE_MEM needs to be set. Can
> you test with this change:
>
> index f87915cce961..00c93585758f 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -771,6 +771,7 @@ int of_reserved_mem_region_to_resource(const
> struct device_node *np,
> return -EINVAL;
>
> resource_set_range(res, rmem->base, rmem->size);
> + res->flags = IORESOURCE_MEM;
> res->name = rmem->name;
> return 0;
> }
I've tested with this change, and is all good now. Iulia
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-24 14:14 ` [PATCH v2 0/4] of: Common "memory-region" parsing Mathieu Poirier
2025-04-25 23:34 ` Iuliana Prodan
@ 2025-05-01 15:44 ` Tanmay Shah
2025-05-01 23:56 ` Tanmay Shah
1 sibling, 1 reply; 16+ messages in thread
From: Tanmay Shah @ 2025-05-01 15:44 UTC (permalink / raw)
To: Mathieu Poirier, Rob Herring (Arm), Arnaud Pouliquen,
Daniel Baluta, Iuliana Prodan, Andrew F. Davis
Cc: Saravana Kannan, Andrew Morton, Bjorn Andersson, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
Hi Mathieu,
I tested this patchset on top of recent for-next branch. I don't see
issue on AMD-xlnx ZynqMP platform. With this:
Tested-by: Tanmay Shah <tanmay.shah@amd.com>
On 4/24/25 9:14 AM, Mathieu Poirier wrote:
> Arnaud, Daniel, Iuliana, Andrew and Tanmay - please test this patchset
> on the platforms you are working on.
>
> Thanks,
> Mathieu
>
> On Wed, 23 Apr 2025 at 13:42, Rob Herring (Arm) <robh@kernel.org> wrote:
>>
>> While there's a common function to parse "memory-region" properties for
>> DMA pool regions, there's not anything for driver private regions. As a
>> result, drivers have resorted to parsing "memory-region" properties
>> themselves repeating the same pattern over and over. To fix this, this
>> series adds 2 functions to handle those cases:
>> of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
>>
>> I've converted the whole tree, but just including remoteproc here as
>> it has the most cases. I intend to apply the first 3 patches for 6.16
>> so the driver conversions can be applied for 6.17.
>>
>> A git tree with all the drivers converted is here[1].
>>
>> v2:
>> - Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
>> - Export devm_ioremap_resource_wc()
>> - Rework handling of resource name to drop unit-address from name as it
>> was before.
>> - Link to v1:
>> https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
>>
>> [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/memory-region
>>
>> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
>> ---
>> Rob Herring (Arm) (4):
>> of: reserved_mem: Add functions to parse "memory-region"
>> of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
>> devres: Export devm_ioremap_resource_wc()
>> remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
>>
>> drivers/of/device.c | 31 +++++-------
>> drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++
>> drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
>> drivers/remoteproc/imx_rproc.c | 68 +++++++++++---------------
>> 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 | 36 ++++++--------
>> drivers/remoteproc/st_remoteproc.c | 41 ++++++++--------
>> drivers/remoteproc/stm32_rproc.c | 44 ++++++++---------
>> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++------
>> drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++------
>> drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++------
>> drivers/remoteproc/xlnx_r5_remoteproc.c | 51 ++++++++------------
>> include/linux/of_reserved_mem.h | 26 ++++++++++
>> lib/devres.c | 1 +
>> 18 files changed, 339 insertions(+), 369 deletions(-)
>> ---
>> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
>> change-id: 20250423-dt-memory-region-v2-a2b15caacc63
>>
>> Best regards,
>> --
>> Rob Herring (Arm) <robh@kernel.org>
>>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-05-01 15:44 ` Tanmay Shah
@ 2025-05-01 23:56 ` Tanmay Shah
0 siblings, 0 replies; 16+ messages in thread
From: Tanmay Shah @ 2025-05-01 23:56 UTC (permalink / raw)
To: Mathieu Poirier, Rob Herring (Arm), Arnaud Pouliquen,
Daniel Baluta, Iuliana Prodan, Andrew F. Davis
Cc: Saravana Kannan, Andrew Morton, Bjorn Andersson, Shawn Guo,
Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
On 5/1/25 10:44 AM, Tanmay Shah wrote:
> Hi Mathieu,
>
> I tested this patchset on top of recent for-next branch. I don't see
> issue on AMD-xlnx ZynqMP platform. With this:
>
> Tested-by: Tanmay Shah <tanmay.shah@amd.com>
>
Hi Mathieu,
Looks like I said it too soon. Firmware loading works with this series,
but RPMsg doesn't work. I am debugging further and will provide inputs
once I find bug on xlnx_r5_remoteproc driver.
Please ignore above TB for now.
Thanks,
Tanmay
> On 4/24/25 9:14 AM, Mathieu Poirier wrote:
>> Arnaud, Daniel, Iuliana, Andrew and Tanmay - please test this patchset
>> on the platforms you are working on.
>>
>> Thanks,
>> Mathieu
>>
>> On Wed, 23 Apr 2025 at 13:42, Rob Herring (Arm) <robh@kernel.org> wrote:
>>>
>>> While there's a common function to parse "memory-region" properties for
>>> DMA pool regions, there's not anything for driver private regions. As a
>>> result, drivers have resorted to parsing "memory-region" properties
>>> themselves repeating the same pattern over and over. To fix this, this
>>> series adds 2 functions to handle those cases:
>>> of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
>>>
>>> I've converted the whole tree, but just including remoteproc here as
>>> it has the most cases. I intend to apply the first 3 patches for 6.16
>>> so the driver conversions can be applied for 6.17.
>>>
>>> A git tree with all the drivers converted is here[1].
>>>
>>> v2:
>>> - Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
>>> - Export devm_ioremap_resource_wc()
>>> - Rework handling of resource name to drop unit-address from name as it
>>> was before.
>>> - Link to v1:
>>> https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
>>>
>>> [1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/
>>> memory-region
>>>
>>> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
>>> ---
>>> Rob Herring (Arm) (4):
>>> of: reserved_mem: Add functions to parse "memory-region"
>>> of: Simplify of_dma_set_restricted_buffer() to use
>>> of_for_each_phandle()
>>> devres: Export devm_ioremap_resource_wc()
>>> remoteproc: Use of_reserved_mem_region_* functions for
>>> "memory-region"
>>>
>>> drivers/of/device.c | 31 +++++-------
>>> drivers/of/of_reserved_mem.c | 80 ++++++++++++++++++++
>>> +++++++++++
>>> drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
>>> drivers/remoteproc/imx_rproc.c | 68 ++++++++++
>>> +---------------
>>> 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 | 36 ++++++--------
>>> drivers/remoteproc/st_remoteproc.c | 41 ++++++++--------
>>> drivers/remoteproc/stm32_rproc.c | 44 ++++++++---------
>>> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++------
>>> drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++------
>>> drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++------
>>> drivers/remoteproc/xlnx_r5_remoteproc.c | 51 ++++++++------------
>>> include/linux/of_reserved_mem.h | 26 ++++++++++
>>> lib/devres.c | 1 +
>>> 18 files changed, 339 insertions(+), 369 deletions(-)
>>> ---
>>> base-commit: 0af2f6be1b4281385b618cb86ad946eded089ac8
>>> change-id: 20250423-dt-memory-region-v2-a2b15caacc63
>>>
>>> Best regards,
>>> --
>>> Rob Herring (Arm) <robh@kernel.org>
>>>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
2025-04-23 19:42 ` [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" Rob Herring (Arm)
@ 2025-05-02 15:40 ` Tanmay Shah
2025-05-02 20:33 ` Rob Herring
0 siblings, 1 reply; 16+ messages in thread
From: Tanmay Shah @ 2025-05-02 15:40 UTC (permalink / raw)
To: Rob Herring (Arm), Saravana Kannan, Andrew Morton,
Bjorn Andersson, Mathieu Poirier, Shawn Guo, Sascha Hauer,
Pengutronix Kernel Team, Fabio Estevam, Patrice Chotard,
Maxime Coquelin, Alexandre Torgue, Arnaud POULIQUEN, Chen-Yu Tsai
Cc: devicetree, linux-kernel, linux-remoteproc, imx, linux-arm-kernel,
linux-arm-msm, linux-stm32
Hello Rob,
Thanks for the patch. Please find my comments below.
On 4/23/25 2:42 PM, Rob Herring (Arm) wrote:
> 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.
>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
> 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 | 45 ++++++++------------
> drivers/remoteproc/imx_rproc.c | 68 ++++++++++++------------------
> 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 | 36 +++++++---------
> drivers/remoteproc/st_remoteproc.c | 41 +++++++++---------
> drivers/remoteproc/stm32_rproc.c | 44 +++++++++-----------
> drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++--------
> drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++--------
> drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++--------
> drivers/remoteproc/xlnx_r5_remoteproc.c | 51 +++++++++--------------
> 14 files changed, 221 insertions(+), 349 deletions(-)
>
> diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c
> index 90cb1fc13e71..fffae6ff4a5c 100644
[ ... ]
> diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c b/drivers/remoteproc/xlnx_r5_remoteproc.c
> index 5aeedeaf3c41..b73e97074c01 100644
> --- a/drivers/remoteproc/xlnx_r5_remoteproc.c
> +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c
> @@ -460,49 +460,44 @@ 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);
Here i++ is not needed as it's done at the end of the loop.
This bug breaks RPMsg communication on zynqmp platform.
Thanks,
Tanmay
> + 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++;
> }
>
> @@ -776,7 +771,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;
>
> /*
> @@ -786,14 +780,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;
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
2025-05-02 15:40 ` Tanmay Shah
@ 2025-05-02 20:33 ` Rob Herring
0 siblings, 0 replies; 16+ messages in thread
From: Rob Herring @ 2025-05-02 20:33 UTC (permalink / raw)
To: tanmay.shah
Cc: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai, devicetree, linux-kernel,
linux-remoteproc, imx, linux-arm-kernel, linux-arm-msm,
linux-stm32
On Fri, May 2, 2025 at 10:40 AM Tanmay Shah <tanmay.shah@amd.com> wrote:
>
>
> Hello Rob,
>
> Thanks for the patch. Please find my comments below.
>
>
> On 4/23/25 2:42 PM, Rob Herring (Arm) wrote:
> > 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.
> >
> > Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> > ---
> > 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 | 45 ++++++++------------
> > drivers/remoteproc/imx_rproc.c | 68 ++++++++++++------------------
> > 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 | 36 +++++++---------
> > drivers/remoteproc/st_remoteproc.c | 41 +++++++++---------
> > drivers/remoteproc/stm32_rproc.c | 44 +++++++++-----------
> > drivers/remoteproc/ti_k3_dsp_remoteproc.c | 28 +++++--------
> > drivers/remoteproc/ti_k3_m4_remoteproc.c | 28 +++++--------
> > drivers/remoteproc/ti_k3_r5_remoteproc.c | 28 +++++--------
> > drivers/remoteproc/xlnx_r5_remoteproc.c | 51 +++++++++--------------
> > 14 files changed, 221 insertions(+), 349 deletions(-)
> >
> > diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c
> > index 90cb1fc13e71..fffae6ff4a5c 100644
>
> [ ... ]
>
> > diff --git a/drivers/remoteproc/xlnx_r5_remoteproc.c b/drivers/remoteproc/xlnx_r5_remoteproc.c
> > index 5aeedeaf3c41..b73e97074c01 100644
> > --- a/drivers/remoteproc/xlnx_r5_remoteproc.c
> > +++ b/drivers/remoteproc/xlnx_r5_remoteproc.c
> > @@ -460,49 +460,44 @@ 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);
>
> Here i++ is not needed as it's done at the end of the loop.
> This bug breaks RPMsg communication on zynqmp platform.
Thanks for debugging it. I'll fix that up.
Rob
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2 0/4] of: Common "memory-region" parsing
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
` (5 preceding siblings ...)
2025-04-28 8:16 ` Arnaud POULIQUEN
@ 2025-05-07 4:42 ` Peng Fan
6 siblings, 0 replies; 16+ messages in thread
From: Peng Fan @ 2025-05-07 4:42 UTC (permalink / raw)
To: Rob Herring (Arm)
Cc: Saravana Kannan, Andrew Morton, Bjorn Andersson, Mathieu Poirier,
Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam,
Patrice Chotard, Maxime Coquelin, Alexandre Torgue,
Arnaud POULIQUEN, Chen-Yu Tsai, devicetree, linux-kernel,
linux-remoteproc, imx, linux-arm-kernel, linux-arm-msm,
linux-stm32, Daniel Baluta
On Wed, Apr 23, 2025 at 02:42:12PM -0500, Rob Herring (Arm) wrote:
>While there's a common function to parse "memory-region" properties for
>DMA pool regions, there's not anything for driver private regions. As a
>result, drivers have resorted to parsing "memory-region" properties
>themselves repeating the same pattern over and over. To fix this, this
>series adds 2 functions to handle those cases:
>of_reserved_mem_region_to_resource() and of_reserved_mem_region_count().
>
>I've converted the whole tree, but just including remoteproc here as
>it has the most cases. I intend to apply the first 3 patches for 6.16
>so the driver conversions can be applied for 6.17.
>
>A git tree with all the drivers converted is here[1].
>
>v2:
>- Fix of_dma_set_restricted_buffer() to maintain behavior on warning msg
>- Export devm_ioremap_resource_wc()
>- Rework handling of resource name to drop unit-address from name as it
> was before.
>- Link to v1:
> https://lore.kernel.org/all/20250317232426.952188-1-robh@kernel.org
>
>[1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git dt/memory-region
>
>Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
>---
>Rob Herring (Arm) (4):
> of: reserved_mem: Add functions to parse "memory-region"
> of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle()
> devres: Export devm_ioremap_resource_wc()
> remoteproc: Use of_reserved_mem_region_* functions for "memory-region"
>
> drivers/of/device.c | 31 +++++-------
> drivers/of/of_reserved_mem.c | 80 +++++++++++++++++++++++++++++++
> drivers/remoteproc/imx_dsp_rproc.c | 45 +++++++----------
> drivers/remoteproc/imx_rproc.c | 68 +++++++++++---------------
Tested-by: Peng Fan <peng.fan@nxp.com> (i.MX93-11x11-EVK for imx_rproc.c)
Thanks,
Peng
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-05-07 3:50 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Rob Herring (Arm)
2025-04-28 8:07 ` Arnaud POULIQUEN
2025-04-23 19:42 ` [PATCH v2 2/4] of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle() Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 3/4] devres: Export devm_ioremap_resource_wc() Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" Rob Herring (Arm)
2025-05-02 15:40 ` Tanmay Shah
2025-05-02 20:33 ` Rob Herring
2025-04-24 14:14 ` [PATCH v2 0/4] of: Common "memory-region" parsing Mathieu Poirier
2025-04-25 23:34 ` Iuliana Prodan
2025-04-28 12:23 ` Rob Herring
2025-04-28 21:40 ` Iuliana Prodan
2025-05-01 15:44 ` Tanmay Shah
2025-05-01 23:56 ` Tanmay Shah
2025-04-28 8:16 ` Arnaud POULIQUEN
2025-05-07 4:42 ` Peng Fan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).