The Device Tree specification allows a "memory-region" node to have
multiple 'reg' entries, but the current kernel implementation only
processes the first entry. This can lead to drivers not being able to
access all the reserved memory regions specified in the Device Tree.
This patch extends the reserved memory handling to support multiple
'reg' entries for a single "memory-region" node. The existing exported
functions remain unchanged for backward compatibility, but new APIs
are introduced to allow drivers to access all reserved memory regions.
Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
---
drivers/of/of_reserved_mem.c | 147 ++++++++++++++++++++++++++++++++++++----
include/linux/of_reserved_mem.h | 4 ++
2 files changed, 137 insertions(+), 14 deletions(-)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 1ab8f4153600b..c9cef279260e7 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -157,6 +157,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
int i, len;
const __be32 *prop;
bool nomap;
+ int count = 0;
prop = of_flat_dt_get_addr_size_prop(node, "reg", &len);
if (!prop)
@@ -179,12 +180,13 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
dma_contiguous_early_fixup(base, size);
pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n",
uname, &base, (unsigned long)(size / SZ_1M));
+ count++;
} else {
pr_err("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n",
uname, &base, (unsigned long)(size / SZ_1M));
}
}
- return 0;
+ return count;
}
/*
@@ -247,20 +249,24 @@ void __init fdt_scan_reserved_mem_reg_nodes(void)
fdt_for_each_subnode(child, fdt, node) {
const char *uname;
+ const __be32 *reg;
u64 b, s;
+ int i, l;
if (!of_fdt_device_is_available(fdt, child))
continue;
-
- if (!of_flat_dt_get_addr_size(child, "reg", &b, &s))
+ reg = of_flat_dt_get_addr_size_prop(child, "reg", &l);
+ if (!reg)
continue;
-
- base = b;
- size = s;
-
- if (size) {
- uname = fdt_get_name(fdt, child, NULL);
- fdt_reserved_mem_save_node(child, uname, base, size);
+ for (i = 0; i < l; i++) {
+ of_flat_dt_read_addr_size(reg, i, &b, &s);
+ base = b;
+ size = s;
+
+ if (size) {
+ uname = fdt_get_name(fdt, child, NULL);
+ fdt_reserved_mem_save_node(child, uname, base, size);
+ }
}
}
@@ -291,16 +297,16 @@ int __init fdt_scan_reserved_mem(void)
fdt_for_each_subnode(child, fdt, node) {
const char *uname;
- int err;
+ int err, ret;
if (!of_fdt_device_is_available(fdt, child))
continue;
uname = fdt_get_name(fdt, child, NULL);
- err = __reserved_mem_reserve_reg(child, uname);
- if (!err)
- count++;
+ ret = __reserved_mem_reserve_reg(child, uname);
+ if (ret > 0)
+ count += ret;
/*
* Save the nodes for the dynamically-placed regions
* into an array which will be used for allocation right
@@ -726,6 +732,35 @@ struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
}
EXPORT_SYMBOL_GPL(of_reserved_mem_lookup);
+/**
+ * of_reserved_mem_array_lookup() - acquire reserved_mem array from a device node
+ * @np: node pointer of the desired reserved-memory region
+ * @rmrm: pointer to the first elemennt of the reserved_mem struct of the memory region
+ *
+ * This function allows drivers to acquire a reference to the array of the
+ * reserved_mem struct based on a device node handle.
+ *
+ * Returns the number reserved_mem elements
+ */
+int of_reserved_mem_array_lookup(struct device_node *np,
+ struct reserved_mem **rmem)
+{
+ const char *name;
+ int i, count = 0;
+
+ if (!np->full_name)
+ return 0;
+
+ name = kbasename(np->full_name);
+
+ for (i = 0; i < reserved_mem_count; i++)
+ if (!strcmp(reserved_mem[i].name, name))
+ rmem[count++] = &reserved_mem[i];
+
+ return count;
+}
+EXPORT_SYMBOL_GPL(of_reserved_mem_array_lookup);
+
/**
* of_reserved_mem_region_to_resource() - Get a reserved memory region as a resource
* @np: node containing 'memory-region' property
@@ -761,6 +796,49 @@ int of_reserved_mem_region_to_resource(const struct device_node *np,
}
EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource);
+/**
+ * of_reserved_mem_region_to_resource_array() - Get a reserved memory region as a resources
+ * @dev: device associated to the node
+ * @np: node containing 'memory-region' property
+ * @idx: index of 'memory-region' property to lookup
+ * @res: Pointer to an array of struct resource pointers to fill in with reserved regions
+ *
+ * This function allows drivers to lookup a node's 'memory-region' property
+ * entries by index and fill an array of struct resource pointers for the entries.
+ *
+ * Returns the number of resources filled in @res on success.
+ * Returns -ENODEV if 'memory-region' is missing or unavailable,
+ * -EINVAL for any other error.
+ */
+int of_reserved_mem_region_to_resource_array(struct device *dev, const struct device_node *np,
+ unsigned int idx, struct resource **res)
+{
+ struct reserved_mem *rmem[MAX_RESERVED_REGIONS];
+ int count, i;
+ struct resource *r;
+
+ if (!np)
+ return -EINVAL;
+
+ struct device_node *target __free(device_node) = of_parse_phandle(np, "memory-region", idx);
+ if (!target || !of_device_is_available(target))
+ return -ENODEV;
+
+ count = of_reserved_mem_array_lookup(target, rmem);
+ if (count <= 0)
+ return -EINVAL;
+
+ *res = devm_kzalloc(dev, count * sizeof(struct resource), GFP_KERNEL);
+ r = res[0];
+ for (i = 0; i < count; i++) {
+ resource_set_range(&r[i], rmem[i]->base, rmem[i]->size);
+ r[i].flags = IORESOURCE_MEM;
+ r[i].name = rmem[i]->name;
+ }
+ return count;
+}
+EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource_array);
+
/**
* of_reserved_mem_region_to_resource_byname() - Get a reserved memory region as a resource
* @np: node containing 'memory-region' property
@@ -805,3 +883,44 @@ 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);
+
+/**
+ * of_reserved_mem_region_count() - Return the total number of reserved memory regions
+ * @np: node containing 'memory-region' property
+ *
+ * This function counts the total number of reserved memory regions referenced
+ * by a node's 'memory-region' property. It iterates over each phandle and sums
+ * the number of regions found in each referenced reserved memory node.
+ *
+ * Returns the total number of reserved memory regions on success.
+ * This function allows drivers to retrieve the number of entries for a node's
+ * 'memory-region' property.
+ *
+ * Returns total number of reserved memory regions on success, or negative error
+ * code on a malformed property.
+ */
+int of_reserved_mem_region_total_count(const struct device_node *np)
+{
+ int nregion = of_count_phandle_with_args(np, "memory-region", NULL);
+ struct device_node *target;
+ int i, nregs = 0;
+
+ for (i = 0; i < nregion; i++) {
+ struct reserved_mem *rmem;
+
+ target = of_parse_phandle(np, "memory-region", i);
+ if (!target)
+ return -ENODEV;
+
+ if (!of_device_is_available(target)) {
+ of_node_put(target);
+ return 0;
+ }
+
+ nregs += of_reserved_mem_array_lookup(target, &rmem);
+
+ of_node_put(target);
+ };
+ return nregs;
+}
+EXPORT_SYMBOL_GPL(of_reserved_mem_region_total_count);
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index f573423359f48..1e0c6afddd812 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -40,11 +40,15 @@ 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_array_lookup(struct device_node *np, struct reserved_mem **rmem);
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_array(struct device *dev, 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);
+int of_reserved_mem_region_total_count(const struct device_node *np);
#else
--
2.51.0
On Wed, Jan 07, 2026 at 02:04:53PM +0100, Gregory CLEMENT wrote: > The Device Tree specification allows a "memory-region" node to have > multiple 'reg' entries, but the current kernel implementation only > processes the first entry. This can lead to drivers not being able to > access all the reserved memory regions specified in the Device Tree. This may be a case of we change the spec. Or at least say, nodes referenced by memory-region can only have 1 region. Are there some existing users needing this functionality? Rob
Hi Gregory,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 8f0b4cce4481fb22653697cced8d0d04027cb1e8]
url: https://github.com/intel-lab-lkp/linux/commits/Gregory-CLEMENT/of-reserved_mem-Fix-placement-of-__free-annotation/20260107-211455
base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
patch link: https://lore.kernel.org/r/20260107-mtd-memregion-v3-2-f9fc9107b992%40bootlin.com
patch subject: [PATCH v3 2/4] of: reserved_mem: Support multiple 'reg' entries for memory-region
config: arm-allnoconfig (https://download.01.org/0day-ci/archive/20260113/202601131101.q65jw7p0-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260113/202601131101.q65jw7p0-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601131101.q65jw7p0-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/of/of_reserved_mem.c:317:7: warning: variable 'err' is uninitialized when used here [-Wuninitialized]
317 | if (err == -ENOENT && of_get_flat_dt_prop(child, "size", NULL)) {
| ^~~
drivers/of/of_reserved_mem.c:300:10: note: initialize the variable 'err' to silence this warning
300 | int err, ret;
| ^
| = 0
1 warning generated.
vim +/err +317 drivers/of/of_reserved_mem.c
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 278
54c180e73ffa3e Rob Herring 2024-03-11 279 /*
54c180e73ffa3e Rob Herring 2024-03-11 280 * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory
54c180e73ffa3e Rob Herring 2024-03-11 281 */
54c180e73ffa3e Rob Herring 2024-03-11 282 int __init fdt_scan_reserved_mem(void)
54c180e73ffa3e Rob Herring 2024-03-11 283 {
54c180e73ffa3e Rob Herring 2024-03-11 284 int node, child;
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 285 int dynamic_nodes_cnt = 0, count = 0;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 286 int dynamic_nodes[MAX_RESERVED_REGIONS];
54c180e73ffa3e Rob Herring 2024-03-11 287 const void *fdt = initial_boot_params;
54c180e73ffa3e Rob Herring 2024-03-11 288
54c180e73ffa3e Rob Herring 2024-03-11 289 node = fdt_path_offset(fdt, "/reserved-memory");
54c180e73ffa3e Rob Herring 2024-03-11 290 if (node < 0)
54c180e73ffa3e Rob Herring 2024-03-11 291 return -ENODEV;
54c180e73ffa3e Rob Herring 2024-03-11 292
54c180e73ffa3e Rob Herring 2024-03-11 293 if (__reserved_mem_check_root(node) != 0) {
54c180e73ffa3e Rob Herring 2024-03-11 294 pr_err("Reserved memory: unsupported node format, ignoring\n");
54c180e73ffa3e Rob Herring 2024-03-11 295 return -EINVAL;
54c180e73ffa3e Rob Herring 2024-03-11 296 }
54c180e73ffa3e Rob Herring 2024-03-11 297
54c180e73ffa3e Rob Herring 2024-03-11 298 fdt_for_each_subnode(child, fdt, node) {
54c180e73ffa3e Rob Herring 2024-03-11 299 const char *uname;
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 300 int err, ret;
54c180e73ffa3e Rob Herring 2024-03-11 301
54c180e73ffa3e Rob Herring 2024-03-11 302 if (!of_fdt_device_is_available(fdt, child))
54c180e73ffa3e Rob Herring 2024-03-11 303 continue;
54c180e73ffa3e Rob Herring 2024-03-11 304
54c180e73ffa3e Rob Herring 2024-03-11 305 uname = fdt_get_name(fdt, child, NULL);
54c180e73ffa3e Rob Herring 2024-03-11 306
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 307 ret = __reserved_mem_reserve_reg(child, uname);
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 308 if (ret > 0)
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 309 count += ret;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 310 /*
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 311 * Save the nodes for the dynamically-placed regions
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 312 * into an array which will be used for allocation right
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 313 * after all the statically-placed regions are reserved
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 314 * or marked as no-map. This is done to avoid dynamically
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 315 * allocating from one of the statically-placed regions.
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 316 */
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 @317 if (err == -ENOENT && of_get_flat_dt_prop(child, "size", NULL)) {
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 318 dynamic_nodes[dynamic_nodes_cnt] = child;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 319 dynamic_nodes_cnt++;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 320 }
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 321 }
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 322 for (int i = 0; i < dynamic_nodes_cnt; i++) {
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 323 const char *uname;
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 324 int err;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 325
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 326 child = dynamic_nodes[i];
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 327 uname = fdt_get_name(fdt, child, NULL);
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 328 err = __reserved_mem_alloc_size(child, uname);
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 329 if (!err)
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 330 count++;
54c180e73ffa3e Rob Herring 2024-03-11 331 }
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 332 total_reserved_mem_cnt = count;
54c180e73ffa3e Rob Herring 2024-03-11 333 return 0;
54c180e73ffa3e Rob Herring 2024-03-11 334 }
54c180e73ffa3e Rob Herring 2024-03-11 335
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Gregory, kernel test robot noticed the following build warnings: [auto build test WARNING on 8f0b4cce4481fb22653697cced8d0d04027cb1e8] url: https://github.com/intel-lab-lkp/linux/commits/Gregory-CLEMENT/of-reserved_mem-Fix-placement-of-__free-annotation/20260107-211455 base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8 patch link: https://lore.kernel.org/r/20260107-mtd-memregion-v3-2-f9fc9107b992%40bootlin.com patch subject: [PATCH v3 2/4] of: reserved_mem: Support multiple 'reg' entries for memory-region config: arc-allnoconfig (https://download.01.org/0day-ci/archive/20260113/202601131045.DOJtnS0c-lkp@intel.com/config) compiler: arc-linux-gcc (GCC) 15.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260113/202601131045.DOJtnS0c-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202601131045.DOJtnS0c-lkp@intel.com/ All warnings (new ones prefixed by >>): >> Warning: drivers/of/of_reserved_mem.c:746 function parameter 'rmem' not described in 'of_reserved_mem_array_lookup' >> Warning: drivers/of/of_reserved_mem.c:902 expecting prototype for of_reserved_mem_region_count(). Prototype was for of_reserved_mem_region_total_count() instead >> Warning: drivers/of/of_reserved_mem.c:746 function parameter 'rmem' not described in 'of_reserved_mem_array_lookup' -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi Gregory,
kernel test robot noticed the following build warnings:
[auto build test WARNING on 8f0b4cce4481fb22653697cced8d0d04027cb1e8]
url: https://github.com/intel-lab-lkp/linux/commits/Gregory-CLEMENT/of-reserved_mem-Fix-placement-of-__free-annotation/20260107-211455
base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8
patch link: https://lore.kernel.org/r/20260107-mtd-memregion-v3-2-f9fc9107b992%40bootlin.com
patch subject: [PATCH v3 2/4] of: reserved_mem: Support multiple 'reg' entries for memory-region
config: arm64-allnoconfig-bpf (https://download.01.org/0day-ci/archive/20260109/202601090005.f0WEJEKH-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project f43d6834093b19baf79beda8c0337ab020ac5f17)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260109/202601090005.f0WEJEKH-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601090005.f0WEJEKH-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/of/of_reserved_mem.c:317:7: warning: variable 'err' is uninitialized when used here [-Wuninitialized]
317 | if (err == -ENOENT && of_get_flat_dt_prop(child, "size", NULL)) {
| ^~~
drivers/of/of_reserved_mem.c:300:10: note: initialize the variable 'err' to silence this warning
300 | int err, ret;
| ^
| = 0
1 warning generated.
vim +/err +317 drivers/of/of_reserved_mem.c
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 278
54c180e73ffa3e Rob Herring 2024-03-11 279 /*
54c180e73ffa3e Rob Herring 2024-03-11 280 * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory
54c180e73ffa3e Rob Herring 2024-03-11 281 */
54c180e73ffa3e Rob Herring 2024-03-11 282 int __init fdt_scan_reserved_mem(void)
54c180e73ffa3e Rob Herring 2024-03-11 283 {
54c180e73ffa3e Rob Herring 2024-03-11 284 int node, child;
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 285 int dynamic_nodes_cnt = 0, count = 0;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 286 int dynamic_nodes[MAX_RESERVED_REGIONS];
54c180e73ffa3e Rob Herring 2024-03-11 287 const void *fdt = initial_boot_params;
54c180e73ffa3e Rob Herring 2024-03-11 288
54c180e73ffa3e Rob Herring 2024-03-11 289 node = fdt_path_offset(fdt, "/reserved-memory");
54c180e73ffa3e Rob Herring 2024-03-11 290 if (node < 0)
54c180e73ffa3e Rob Herring 2024-03-11 291 return -ENODEV;
54c180e73ffa3e Rob Herring 2024-03-11 292
54c180e73ffa3e Rob Herring 2024-03-11 293 if (__reserved_mem_check_root(node) != 0) {
54c180e73ffa3e Rob Herring 2024-03-11 294 pr_err("Reserved memory: unsupported node format, ignoring\n");
54c180e73ffa3e Rob Herring 2024-03-11 295 return -EINVAL;
54c180e73ffa3e Rob Herring 2024-03-11 296 }
54c180e73ffa3e Rob Herring 2024-03-11 297
54c180e73ffa3e Rob Herring 2024-03-11 298 fdt_for_each_subnode(child, fdt, node) {
54c180e73ffa3e Rob Herring 2024-03-11 299 const char *uname;
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 300 int err, ret;
54c180e73ffa3e Rob Herring 2024-03-11 301
54c180e73ffa3e Rob Herring 2024-03-11 302 if (!of_fdt_device_is_available(fdt, child))
54c180e73ffa3e Rob Herring 2024-03-11 303 continue;
54c180e73ffa3e Rob Herring 2024-03-11 304
54c180e73ffa3e Rob Herring 2024-03-11 305 uname = fdt_get_name(fdt, child, NULL);
54c180e73ffa3e Rob Herring 2024-03-11 306
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 307 ret = __reserved_mem_reserve_reg(child, uname);
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 308 if (ret > 0)
8be14ac8dccc70 Gregory CLEMENT 2026-01-07 309 count += ret;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 310 /*
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 311 * Save the nodes for the dynamically-placed regions
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 312 * into an array which will be used for allocation right
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 313 * after all the statically-placed regions are reserved
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 314 * or marked as no-map. This is done to avoid dynamically
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 315 * allocating from one of the statically-placed regions.
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 316 */
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 @317 if (err == -ENOENT && of_get_flat_dt_prop(child, "size", NULL)) {
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 318 dynamic_nodes[dynamic_nodes_cnt] = child;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 319 dynamic_nodes_cnt++;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 320 }
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 321 }
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 322 for (int i = 0; i < dynamic_nodes_cnt; i++) {
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 323 const char *uname;
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 324 int err;
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 325
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 326 child = dynamic_nodes[i];
8a6e02d0c00e7b Oreoluwa Babatunde 2024-10-08 327 uname = fdt_get_name(fdt, child, NULL);
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 328 err = __reserved_mem_alloc_size(child, uname);
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 329 if (!err)
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 330 count++;
54c180e73ffa3e Rob Herring 2024-03-11 331 }
00c9a452a235c6 Oreoluwa Babatunde 2024-10-08 332 total_reserved_mem_cnt = count;
54c180e73ffa3e Rob Herring 2024-03-11 333 return 0;
54c180e73ffa3e Rob Herring 2024-03-11 334 }
54c180e73ffa3e Rob Herring 2024-03-11 335
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi Gregory, kernel test robot noticed the following build warnings: [auto build test WARNING on 8f0b4cce4481fb22653697cced8d0d04027cb1e8] url: https://github.com/intel-lab-lkp/linux/commits/Gregory-CLEMENT/of-reserved_mem-Fix-placement-of-__free-annotation/20260107-211455 base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8 patch link: https://lore.kernel.org/r/20260107-mtd-memregion-v3-2-f9fc9107b992%40bootlin.com patch subject: [PATCH v3 2/4] of: reserved_mem: Support multiple 'reg' entries for memory-region config: x86_64-rhel-9.4-kunit (https://download.01.org/0day-ci/archive/20260108/202601082105.TThX0916-lkp@intel.com/config) compiler: gcc-14 (Debian 14.2.0-19) 14.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260108/202601082105.TThX0916-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202601082105.TThX0916-lkp@intel.com/ All warnings (new ones prefixed by >>): >> Warning: drivers/of/of_reserved_mem.c:746 function parameter 'rmem' not described in 'of_reserved_mem_array_lookup' >> Warning: drivers/of/of_reserved_mem.c:902 expecting prototype for of_reserved_mem_region_count(). Prototype was for of_reserved_mem_region_total_count() instead >> Warning: drivers/of/of_reserved_mem.c:746 function parameter 'rmem' not described in 'of_reserved_mem_array_lookup' -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
kernel test robot <lkp@intel.com> writes: > Hi Gregory, > > kernel test robot noticed the following build warnings: > > [auto build test WARNING on 8f0b4cce4481fb22653697cced8d0d04027cb1e8] > > url: https://github.com/intel-lab-lkp/linux/commits/Gregory-CLEMENT/of-reserved_mem-Fix-placement-of-__free-annotation/20260107-211455 > base: 8f0b4cce4481fb22653697cced8d0d04027cb1e8 > patch link: https://lore.kernel.org/r/20260107-mtd-memregion-v3-2-f9fc9107b992%40bootlin.com > patch subject: [PATCH v3 2/4] of: reserved_mem: Support multiple 'reg' entries for memory-region > config: x86_64-rhel-9.4-kunit (https://download.01.org/0day-ci/archive/20260108/202601082105.TThX0916-lkp@intel.com/config) > compiler: gcc-14 (Debian 14.2.0-19) 14.2.0 > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260108/202601082105.TThX0916-lkp@intel.com/reproduce) > > If you fix the issue in a separate patch/commit (i.e. not just a new version of > the same patch/commit), kindly add following tags > | Reported-by: kernel test robot <lkp@intel.com> > | Closes: https://lore.kernel.org/oe-kbuild-all/202601082105.TThX0916-lkp@intel.com/ > > All warnings (new ones prefixed by >>): > >>> Warning: drivers/of/of_reserved_mem.c:746 function parameter 'rmem' not described in 'of_reserved_mem_array_lookup' >>> Warning: drivers/of/of_reserved_mem.c:902 expecting prototype for of_reserved_mem_region_count(). Prototype was for of_reserved_mem_region_total_count() instead >>> Warning: drivers/of/of_reserved_mem.c:746 function parameter 'rmem' >not described in 'of_reserved_mem_array_lookup' It was a stupid typo in the description! I will fix it. Gregory > > -- > 0-DAY CI Kernel Test Service > https://github.com/intel/lkp-tests/wiki -- Grégory CLEMENT, Bootlin Embedded Linux and Kernel engineering https://bootlin.com
© 2016 - 2026 Red Hat, Inc.