* [PATCH 0/7] Refactor reserved memory regions handling code
[not found] <CGME20260313150809eucas1p169ab0904a217a04e0601e2ef01854c73@eucas1p1.samsung.com>
@ 2026-03-13 15:07 ` Marek Szyprowski
2026-03-13 15:07 ` [PATCH 1/7] of: reserved_mem: remove fdt node from the structure Marek Szyprowski
` (7 more replies)
0 siblings, 8 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:07 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
Hello,
The reserved memory regions handling code was reworked to handle
unlimited so called "static" memory nodes in commit 00c9a452a235 ("of:
reserved_mem: Add code to dynamically allocate reserved_mem array").
The side effect of this rework was a set of bugs fixed later by commits
0fd17e598333 ("of: reserved_mem: Allow reserved_mem framework detect
"cma=" kernel param") and 2c223f7239f3 ("of: reserved_mem: Restructure
call site for dma_contiguous_early_fixup()"). As a result, the code in
drivers/of/of_reserved_mem.c became a mix of generic code and CMA
specific fixups.
In this patchset I try to untangle this spaghetti and perform some code
cleanup. I hope nothing breaks this time.
Best regards
Marek Szyprowski, PhD
Samsung R&D Institute Poland
Patch summary:
Marek Szyprowski (7):
of: reserved_mem: remove fdt node from the structure
of: reserved_mem: use -ENODEV instead of -ENOENT
of: reserved_mem: switch to ops based OF_DECLARE()
of: reserved_mem: replace CMA quirks by generic methods
of: reserved_mem: rearrange code a bit
of: reserved_mem: clarify fdt_scan_reserved_mem*() functions
of: reserved_mem: rework fdt_init_reserved_mem_node()
drivers/memory/tegra/tegra210-emc-table.c | 17 +-
drivers/of/fdt.c | 2 +-
drivers/of/of_private.h | 2 +-
drivers/of/of_reserved_mem.c | 289 ++++++++++++----------
include/linux/cma.h | 10 -
include/linux/dma-map-ops.h | 3 -
include/linux/of_reserved_mem.h | 18 +-
kernel/dma/coherent.c | 19 +-
kernel/dma/contiguous.c | 86 +++++--
kernel/dma/swiotlb.c | 18 +-
10 files changed, 256 insertions(+), 208 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/7] of: reserved_mem: remove fdt node from the structure
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
@ 2026-03-13 15:07 ` Marek Szyprowski
2026-03-13 15:07 ` [PATCH 2/7] of: reserved_mem: use -ENODEV instead of -ENOENT Marek Szyprowski
` (6 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:07 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
FDT node is not needed for anything besides the initialization, so it can
be simply passed as an argument to the reserved memory region init
function.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/memory/tegra/tegra210-emc-table.c | 3 ++-
drivers/of/of_reserved_mem.c | 25 ++++++++++-------------
include/linux/of_reserved_mem.h | 4 ++--
kernel/dma/coherent.c | 4 +---
kernel/dma/contiguous.c | 3 +--
kernel/dma/swiotlb.c | 5 ++---
6 files changed, 19 insertions(+), 25 deletions(-)
diff --git a/drivers/memory/tegra/tegra210-emc-table.c b/drivers/memory/tegra/tegra210-emc-table.c
index 34a8785d2861..ac1d1e13482a 100644
--- a/drivers/memory/tegra/tegra210-emc-table.c
+++ b/drivers/memory/tegra/tegra210-emc-table.c
@@ -75,7 +75,8 @@ static const struct reserved_mem_ops tegra210_emc_table_ops = {
.device_release = tegra210_emc_table_device_release,
};
-static int tegra210_emc_table_init(struct reserved_mem *rmem)
+static int tegra210_emc_table_init(unsigned long node,
+ struct reserved_mem *rmem)
{
pr_debug("Tegra210 EMC table at %pa, size %lu bytes\n", &rmem->base,
(unsigned long)rmem->size);
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 1fd28f805610..6705b7afebf0 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -104,7 +104,8 @@ static void __init alloc_reserved_mem_array(void)
reserved_mem = new_array;
}
-static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem);
+static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
+ unsigned long node);
/*
* fdt_reserved_mem_save_node() - save fdt node for second pass initialization
*/
@@ -118,13 +119,12 @@ static void __init fdt_reserved_mem_save_node(unsigned long node, const char *un
return;
}
- rmem->fdt_node = node;
rmem->name = uname;
rmem->base = base;
rmem->size = size;
/* Call the region specific initialization function */
- fdt_init_reserved_mem_node(rmem);
+ fdt_init_reserved_mem_node(rmem, node);
reserved_mem_count++;
}
@@ -483,7 +483,8 @@ static const struct of_device_id __rmem_of_table_sentinel
/*
* __reserved_mem_init_node() - call region specific reserved memory init code
*/
-static int __init __reserved_mem_init_node(struct reserved_mem *rmem)
+static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
+ unsigned long node)
{
extern const struct of_device_id __reservedmem_of_table[];
const struct of_device_id *i;
@@ -493,10 +494,10 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem)
reservedmem_of_init_fn initfn = i->data;
const char *compat = i->compatible;
- if (!of_flat_dt_is_compatible(rmem->fdt_node, compat))
+ if (!of_flat_dt_is_compatible(node, compat))
continue;
- ret = initfn(rmem);
+ ret = initfn(node, rmem);
if (ret == 0) {
pr_info("initialized node %s, compatible id %s\n",
rmem->name, compat);
@@ -526,11 +527,6 @@ static int __init __rmem_cmp(const void *a, const void *b)
if (ra->size > rb->size)
return 1;
- if (ra->fdt_node < rb->fdt_node)
- return -1;
- if (ra->fdt_node > rb->fdt_node)
- return 1;
-
return 0;
}
@@ -564,19 +560,20 @@ static void __init __rmem_check_for_overlap(void)
/**
* fdt_init_reserved_mem_node() - Initialize a reserved memory region
* @rmem: reserved_mem struct of the memory region to be initialized.
+ * @node: fdt node of the initialized region
*
* This function is used to call the region specific initialization
* function for a reserved memory region.
*/
-static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem)
+static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
+ unsigned long node)
{
- unsigned long node = rmem->fdt_node;
int err = 0;
bool nomap;
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
- err = __reserved_mem_init_node(rmem);
+ err = __reserved_mem_init_node(rmem, node);
if (err != 0 && err != -ENOENT) {
pr_info("node %s compatible matching fail\n", rmem->name);
if (nomap)
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index f573423359f4..5159938bfe03 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -11,7 +11,6 @@ struct resource;
struct reserved_mem {
const char *name;
- unsigned long fdt_node;
const struct reserved_mem_ops *ops;
phys_addr_t base;
phys_addr_t size;
@@ -25,7 +24,8 @@ struct reserved_mem_ops {
struct device *dev);
};
-typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem);
+typedef int (*reservedmem_of_init_fn)(unsigned long node,
+ struct reserved_mem *rmem);
#ifdef CONFIG_OF_RESERVED_MEM
diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c
index 1147497bc512..34621acbd3c5 100644
--- a/kernel/dma/coherent.c
+++ b/kernel/dma/coherent.c
@@ -367,10 +367,8 @@ static const struct reserved_mem_ops rmem_dma_ops = {
.device_release = rmem_dma_device_release,
};
-static int __init rmem_dma_setup(struct reserved_mem *rmem)
+static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
{
- unsigned long node = rmem->fdt_node;
-
if (of_get_flat_dt_prop(node, "reusable", NULL))
return -EINVAL;
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index c56004d314dc..81a2fa4971ee 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -475,9 +475,8 @@ static const struct reserved_mem_ops rmem_cma_ops = {
.device_release = rmem_cma_device_release,
};
-static int __init rmem_cma_setup(struct reserved_mem *rmem)
+static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
{
- unsigned long node = rmem->fdt_node;
bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
struct cma *cma;
int err;
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index d8e6f1d889d5..f3a12e15a951 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -1860,10 +1860,9 @@ static const struct reserved_mem_ops rmem_swiotlb_ops = {
.device_release = rmem_swiotlb_device_release,
};
-static int __init rmem_swiotlb_setup(struct reserved_mem *rmem)
+static int __init rmem_swiotlb_setup(unsigned long node,
+ struct reserved_mem *rmem)
{
- unsigned long node = rmem->fdt_node;
-
if (of_get_flat_dt_prop(node, "reusable", NULL) ||
of_get_flat_dt_prop(node, "linux,cma-default", NULL) ||
of_get_flat_dt_prop(node, "linux,dma-default", NULL) ||
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/7] of: reserved_mem: use -ENODEV instead of -ENOENT
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
2026-03-13 15:07 ` [PATCH 1/7] of: reserved_mem: remove fdt node from the structure Marek Szyprowski
@ 2026-03-13 15:07 ` Marek Szyprowski
2026-03-13 15:07 ` [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE() Marek Szyprowski
` (5 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:07 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
When given reserved memory region doesn't really support given node,
return -ENODEV instead of -ENOENT. Then fix __reserved_mem_init_node()
function to properly propagate error code different from -ENODEV instead
of silently ignoring it.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/of/of_reserved_mem.c | 7 ++++---
kernel/dma/coherent.c | 2 +-
kernel/dma/contiguous.c | 2 +-
3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 6705b7afebf0..9aff460a0420 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -488,9 +488,10 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
{
extern const struct of_device_id __reservedmem_of_table[];
const struct of_device_id *i;
- int ret = -ENOENT;
+ int ret = -ENODEV;
- for (i = __reservedmem_of_table; i < &__rmem_of_table_sentinel; i++) {
+ for (i = __reservedmem_of_table; ret == -ENODEV &&
+ i < &__rmem_of_table_sentinel; i++) {
reservedmem_of_init_fn initfn = i->data;
const char *compat = i->compatible;
@@ -574,7 +575,7 @@ static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
err = __reserved_mem_init_node(rmem, node);
- if (err != 0 && err != -ENOENT) {
+ if (err != 0 && err != -ENODEV) {
pr_info("node %s compatible matching fail\n", rmem->name);
if (nomap)
memblock_clear_nomap(rmem->base, rmem->size);
diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c
index 34621acbd3c5..64f9ba618e19 100644
--- a/kernel/dma/coherent.c
+++ b/kernel/dma/coherent.c
@@ -370,7 +370,7 @@ static const struct reserved_mem_ops rmem_dma_ops = {
static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
{
if (of_get_flat_dt_prop(node, "reusable", NULL))
- return -EINVAL;
+ return -ENODEV;
#ifdef CONFIG_ARM
if (!of_get_flat_dt_prop(node, "no-map", NULL)) {
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index 81a2fa4971ee..e6fc6906b5c0 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -483,7 +483,7 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
if (!of_get_flat_dt_prop(node, "reusable", NULL) ||
of_get_flat_dt_prop(node, "no-map", NULL))
- return -EINVAL;
+ return -ENODEV;
if (!IS_ALIGNED(rmem->base | rmem->size, CMA_MIN_ALIGNMENT_BYTES)) {
pr_err("Reserved memory: incorrect alignment of CMA region\n");
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE()
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
2026-03-13 15:07 ` [PATCH 1/7] of: reserved_mem: remove fdt node from the structure Marek Szyprowski
2026-03-13 15:07 ` [PATCH 2/7] of: reserved_mem: use -ENODEV instead of -ENOENT Marek Szyprowski
@ 2026-03-13 15:07 ` Marek Szyprowski
2026-03-13 15:58 ` Marek Szyprowski
2026-03-14 15:20 ` kernel test robot
2026-03-13 15:07 ` [PATCH 4/7] of: reserved_mem: replace CMA quirks by generic methods Marek Szyprowski
` (4 subsequent siblings)
7 siblings, 2 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:07 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
Move init function from OF_DECLARE() argument to the given reserved
memory region ops structure and then pass that structure to the
OF_DECLARE() initializer. This makes it possible in the future to add
more functions called by the generic code before given memory region is
initialized and rmem object created.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/memory/tegra/tegra210-emc-table.c | 14 ++++++++------
drivers/of/of_reserved_mem.c | 5 +++--
include/linux/of_reserved_mem.h | 15 ++++++++-------
kernel/dma/coherent.c | 13 +++++++------
kernel/dma/contiguous.c | 15 ++++++++-------
kernel/dma/swiotlb.c | 13 +++++++------
6 files changed, 41 insertions(+), 34 deletions(-)
diff --git a/drivers/memory/tegra/tegra210-emc-table.c b/drivers/memory/tegra/tegra210-emc-table.c
index ac1d1e13482a..f6395bc9dbc8 100644
--- a/drivers/memory/tegra/tegra210-emc-table.c
+++ b/drivers/memory/tegra/tegra210-emc-table.c
@@ -70,11 +70,6 @@ static void tegra210_emc_table_device_release(struct reserved_mem *rmem,
memunmap(timings);
}
-static const struct reserved_mem_ops tegra210_emc_table_ops = {
- .device_init = tegra210_emc_table_device_init,
- .device_release = tegra210_emc_table_device_release,
-};
-
static int tegra210_emc_table_init(unsigned long node,
struct reserved_mem *rmem)
{
@@ -85,5 +80,12 @@ static int tegra210_emc_table_init(unsigned long node,
return 0;
}
+
+static const struct reserved_mem_ops tegra210_emc_table_ops = {
+ .node_init = tegra210_emc_table_init,
+ .device_init = tegra210_emc_table_device_init,
+ .device_release = tegra210_emc_table_device_release,
+};
+
RESERVEDMEM_OF_DECLARE(tegra210_emc_table, "nvidia,tegra210-emc-table",
- tegra210_emc_table_init);
+ &tegra210_emc_table_ops);
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 9aff460a0420..675f1c1c6627 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -492,14 +492,15 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
for (i = __reservedmem_of_table; ret == -ENODEV &&
i < &__rmem_of_table_sentinel; i++) {
- reservedmem_of_init_fn initfn = i->data;
+ const struct reserved_mem_ops *ops = i->data;
const char *compat = i->compatible;
if (!of_flat_dt_is_compatible(node, compat))
continue;
- ret = initfn(node, rmem);
+ ret = ops->node_init(node, rmem);
if (ret == 0) {
+ rmem->ops = ops;
pr_info("initialized node %s, compatible id %s\n",
rmem->name, compat);
break;
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index 5159938bfe03..dc00502a6b69 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -18,19 +18,20 @@ struct reserved_mem {
};
struct reserved_mem_ops {
+ int (*node_init)(unsigned long fdt_node, struct reserved_mem *rmem);
int (*device_init)(struct reserved_mem *rmem,
struct device *dev);
void (*device_release)(struct reserved_mem *rmem,
struct device *dev);
};
-typedef int (*reservedmem_of_init_fn)(unsigned long node,
- struct reserved_mem *rmem);
-
#ifdef CONFIG_OF_RESERVED_MEM
-#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
- _OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn)
+#define RESERVEDMEM_OF_DECLARE(name, compat, ops) \
+ static const struct of_device_id __of_table_##name \
+ __used __section("__reservedmem_of_table") \
+ __aligned(__alignof__(struct of_device_id)) \
+ = { .compatible = compat, .data = ops }
int of_reserved_mem_device_init_by_idx(struct device *dev,
struct device_node *np, int idx);
@@ -48,8 +49,8 @@ int of_reserved_mem_region_count(const struct device_node *np);
#else
-#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
- _OF_DECLARE_STUB(reservedmem, name, compat, init, reservedmem_of_init_fn)
+#define RESERVEDMEM_OF_DECLARE(name, compat, ops) \
+ _OF_DECLARE_STUB(reservedmem, name, compat, init, void *)
static inline int of_reserved_mem_device_init_by_idx(struct device *dev,
struct device_node *np, int idx)
diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c
index 64f9ba618e19..bcdc0f76d2e8 100644
--- a/kernel/dma/coherent.c
+++ b/kernel/dma/coherent.c
@@ -362,10 +362,6 @@ static void rmem_dma_device_release(struct reserved_mem *rmem,
dev->dma_mem = NULL;
}
-static const struct reserved_mem_ops rmem_dma_ops = {
- .device_init = rmem_dma_device_init,
- .device_release = rmem_dma_device_release,
-};
static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
{
@@ -388,7 +384,6 @@ static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
}
#endif
- rmem->ops = &rmem_dma_ops;
pr_info("Reserved memory: created DMA memory pool at %pa, size %ld MiB\n",
&rmem->base, (unsigned long)rmem->size / SZ_1M);
return 0;
@@ -405,5 +400,11 @@ static int __init dma_init_reserved_memory(void)
core_initcall(dma_init_reserved_memory);
#endif /* CONFIG_DMA_GLOBAL_POOL */
-RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", rmem_dma_setup);
+static const struct reserved_mem_ops rmem_dma_ops = {
+ .node_init = rmem_dma_setup,
+ .device_init = rmem_dma_device_init,
+ .device_release = rmem_dma_device_release,
+};
+
+RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", &rmem_dma_ops);
#endif
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index e6fc6906b5c0..efeebda92537 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -470,11 +470,6 @@ static void rmem_cma_device_release(struct reserved_mem *rmem,
dev->cma_area = NULL;
}
-static const struct reserved_mem_ops rmem_cma_ops = {
- .device_init = rmem_cma_device_init,
- .device_release = rmem_cma_device_release,
-};
-
static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
{
bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
@@ -499,7 +494,6 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
if (default_cma)
dma_contiguous_default_area = cma;
- rmem->ops = &rmem_cma_ops;
rmem->priv = cma;
pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n",
@@ -511,5 +505,12 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
return 0;
}
-RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup);
+
+static const struct reserved_mem_ops rmem_cma_ops = {
+ .node_init = rmem_cma_setup,
+ .device_init = rmem_cma_device_init,
+ .device_release = rmem_cma_device_release,
+};
+
+RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", &rmem_cma_ops);
#endif
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index f3a12e15a951..327525181b8a 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -1855,11 +1855,6 @@ static void rmem_swiotlb_device_release(struct reserved_mem *rmem,
dev->dma_io_tlb_mem = &io_tlb_default_mem;
}
-static const struct reserved_mem_ops rmem_swiotlb_ops = {
- .device_init = rmem_swiotlb_device_init,
- .device_release = rmem_swiotlb_device_release,
-};
-
static int __init rmem_swiotlb_setup(unsigned long node,
struct reserved_mem *rmem)
{
@@ -1875,5 +1870,11 @@ static int __init rmem_swiotlb_setup(unsigned long node,
return 0;
}
-RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", rmem_swiotlb_setup);
+static const struct reserved_mem_ops rmem_swiotlb_ops = {
+ .node_init = rmem_swiotlb_setup,
+ .device_init = rmem_swiotlb_device_init,
+ .device_release = rmem_swiotlb_device_release,
+};
+
+RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", &rmem_swiotlb_ops);
#endif /* CONFIG_DMA_RESTRICTED_POOL */
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 4/7] of: reserved_mem: replace CMA quirks by generic methods
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
` (2 preceding siblings ...)
2026-03-13 15:07 ` [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE() Marek Szyprowski
@ 2026-03-13 15:07 ` Marek Szyprowski
2026-03-13 15:08 ` [PATCH 5/7] of: reserved_mem: rearrange code a bit Marek Szyprowski
` (3 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:07 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
Add optional reserved memory callbacks to perform region verification and
early fixup, then move all CMA related code in of_reserved_mem.c to them.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/of/of_reserved_mem.c | 97 +++++++++++++++++++++------------
include/linux/cma.h | 10 ----
include/linux/dma-map-ops.h | 3 -
include/linux/of_reserved_mem.h | 3 +
kernel/dma/contiguous.c | 70 +++++++++++++++++-------
5 files changed, 116 insertions(+), 67 deletions(-)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 675f1c1c6627..399cdd11a9ca 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -24,8 +24,6 @@
#include <linux/slab.h>
#include <linux/memblock.h>
#include <linux/kmemleak.h>
-#include <linux/cma.h>
-#include <linux/dma-map-ops.h>
#include "of_private.h"
@@ -106,6 +104,11 @@ static void __init alloc_reserved_mem_array(void)
static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
unsigned long node);
+static int fdt_validate_reserved_mem_node(unsigned long node,
+ phys_addr_t *align);
+static int fdt_fixup_reserved_mem_node(unsigned long node,
+ phys_addr_t base, phys_addr_t size);
+
/*
* fdt_reserved_mem_save_node() - save fdt node for second pass initialization
*/
@@ -154,21 +157,19 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
const char *uname)
{
phys_addr_t base, size;
- int i, len;
+ int i, len, err;
const __be32 *prop;
- bool nomap, default_cma;
+ bool nomap;
prop = of_flat_dt_get_addr_size_prop(node, "reg", &len);
if (!prop)
return -ENOENT;
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
- default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
- if (default_cma && cma_skip_dt_default_reserved_mem()) {
- pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n");
- return -EINVAL;
- }
+ err = fdt_validate_reserved_mem_node(node, NULL);
+ if (err && err != -ENODEV)
+ return err;
for (i = 0; i < len; i++) {
u64 b, s;
@@ -179,10 +180,7 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
size = s;
if (size && early_init_dt_reserve_memory(base, size, nomap) == 0) {
- /* Architecture specific contiguous memory fixup. */
- if (of_flat_dt_is_compatible(node, "shared-dma-pool") &&
- of_get_flat_dt_prop(node, "reusable", NULL))
- dma_contiguous_early_fixup(base, size);
+ fdt_fixup_reserved_mem_node(node, base, size);
pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n",
uname, &base, (unsigned long)(size / SZ_1M));
} else {
@@ -253,17 +251,19 @@ void __init fdt_scan_reserved_mem_reg_nodes(void)
fdt_for_each_subnode(child, fdt, node) {
const char *uname;
- bool default_cma = of_get_flat_dt_prop(child, "linux,cma-default", NULL);
u64 b, s;
+ int ret;
if (!of_fdt_device_is_available(fdt, child))
continue;
- if (default_cma && cma_skip_dt_default_reserved_mem())
- continue;
if (!of_flat_dt_get_addr_size(child, "reg", &b, &s))
continue;
+ ret = fdt_validate_reserved_mem_node(node, NULL);
+ if (ret && ret != -ENODEV)
+ continue;
+
base = b;
size = s;
@@ -397,7 +397,7 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
phys_addr_t base = 0, align = 0, size;
int i, len;
const __be32 *prop;
- bool nomap, default_cma;
+ bool nomap;
int ret;
prop = of_get_flat_dt_prop(node, "size", &len);
@@ -421,19 +421,10 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
}
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
- default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
- if (default_cma && cma_skip_dt_default_reserved_mem()) {
- pr_err("Skipping dt linux,cma-default for \"cma=\" kernel param.\n");
- return -EINVAL;
- }
-
- /* Need adjust the alignment to satisfy the CMA requirement */
- if (IS_ENABLED(CONFIG_CMA)
- && of_flat_dt_is_compatible(node, "shared-dma-pool")
- && of_get_flat_dt_prop(node, "reusable", NULL)
- && !nomap)
- align = max_t(phys_addr_t, align, CMA_MIN_ALIGNMENT_BYTES);
+ ret = fdt_validate_reserved_mem_node(node, &align);
+ if (ret && ret != -ENODEV)
+ return ret;
prop = of_flat_dt_get_addr_size_prop(node, "alloc-ranges", &len);
if (prop) {
@@ -468,25 +459,61 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
uname, (unsigned long)(size / SZ_1M));
return -ENOMEM;
}
- /* Architecture specific contiguous memory fixup. */
- if (of_flat_dt_is_compatible(node, "shared-dma-pool") &&
- of_get_flat_dt_prop(node, "reusable", NULL))
- dma_contiguous_early_fixup(base, size);
+
+ fdt_fixup_reserved_mem_node(node, base, size);
+
/* Save region in the reserved_mem array */
fdt_reserved_mem_save_node(node, uname, base, size);
return 0;
}
+extern const struct of_device_id __reservedmem_of_table[];
static const struct of_device_id __rmem_of_table_sentinel
__used __section("__reservedmem_of_table_end");
+static int __init fdt_fixup_reserved_mem_node(unsigned long node,
+ phys_addr_t base, phys_addr_t size)
+{
+ const struct of_device_id *i;
+ int ret = -ENODEV;
+
+ for (i = __reservedmem_of_table; ret == -ENODEV &&
+ i < &__rmem_of_table_sentinel; i++) {
+ const struct reserved_mem_ops *ops = i->data;
+
+ if (!of_flat_dt_is_compatible(node, i->compatible))
+ continue;
+
+ if (ops->node_fixup)
+ ret = ops->node_fixup(node, base, size);
+ }
+ return ret;
+}
+
+static int __init fdt_validate_reserved_mem_node(unsigned long node, phys_addr_t *align)
+{
+ const struct of_device_id *i;
+ int ret = -ENODEV;
+
+ for (i = __reservedmem_of_table; ret == -ENODEV &&
+ i < &__rmem_of_table_sentinel; i++) {
+ const struct reserved_mem_ops *ops = i->data;
+
+ if (!of_flat_dt_is_compatible(node, i->compatible))
+ continue;
+
+ if (ops->node_validate)
+ ret = ops->node_validate(node, align);
+ }
+ return ret;
+}
+
/*
* __reserved_mem_init_node() - call region specific reserved memory init code
*/
static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
unsigned long node)
{
- extern const struct of_device_id __reservedmem_of_table[];
const struct of_device_id *i;
int ret = -ENODEV;
@@ -503,7 +530,7 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
rmem->ops = ops;
pr_info("initialized node %s, compatible id %s\n",
rmem->name, compat);
- break;
+ return ret;
}
}
return ret;
diff --git a/include/linux/cma.h b/include/linux/cma.h
index d0793eaaadaa..8555d38a97b1 100644
--- a/include/linux/cma.h
+++ b/include/linux/cma.h
@@ -61,14 +61,4 @@ extern int cma_for_each_area(int (*it)(struct cma *cma, void *data), void *data)
extern bool cma_intersects(struct cma *cma, unsigned long start, unsigned long end);
extern void cma_reserve_pages_on_error(struct cma *cma);
-
-#ifdef CONFIG_DMA_CMA
-extern bool cma_skip_dt_default_reserved_mem(void);
-#else
-static inline bool cma_skip_dt_default_reserved_mem(void)
-{
- return false;
-}
-#endif
-
#endif
diff --git a/include/linux/dma-map-ops.h b/include/linux/dma-map-ops.h
index 60b63756df82..55ecd2934225 100644
--- a/include/linux/dma-map-ops.h
+++ b/include/linux/dma-map-ops.h
@@ -147,9 +147,6 @@ static inline void dma_free_contiguous(struct device *dev, struct page *page,
{
__free_pages(page, get_order(size));
}
-static inline void dma_contiguous_early_fixup(phys_addr_t base, unsigned long size)
-{
-}
#endif /* CONFIG_DMA_CMA*/
#ifdef CONFIG_DMA_DECLARE_COHERENT
diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
index dc00502a6b69..c240dfe45c9d 100644
--- a/include/linux/of_reserved_mem.h
+++ b/include/linux/of_reserved_mem.h
@@ -18,6 +18,9 @@ struct reserved_mem {
};
struct reserved_mem_ops {
+ int (*node_validate)(unsigned long fdt_node, phys_addr_t *align);
+ int (*node_fixup)(unsigned long fdt_node, phys_addr_t base,
+ phys_addr_t size);
int (*node_init)(unsigned long fdt_node, struct reserved_mem *rmem);
int (*device_init)(struct reserved_mem *rmem,
struct device *dev);
diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
index efeebda92537..65d216663e81 100644
--- a/kernel/dma/contiguous.c
+++ b/kernel/dma/contiguous.c
@@ -91,16 +91,6 @@ static int __init early_cma(char *p)
}
early_param("cma", early_cma);
-/*
- * cma_skip_dt_default_reserved_mem - This is called from the
- * reserved_mem framework to detect if the default cma region is being
- * set by the "cma=" kernel parameter.
- */
-bool __init cma_skip_dt_default_reserved_mem(void)
-{
- return size_cmdline != -1;
-}
-
#ifdef CONFIG_DMA_NUMA_CMA
static struct cma *dma_contiguous_numa_area[MAX_NUMNODES];
@@ -470,25 +460,65 @@ static void rmem_cma_device_release(struct reserved_mem *rmem,
dev->cma_area = NULL;
}
+static int __init __rmem_cma_verify_node(unsigned long node)
+{
+ if (!of_get_flat_dt_prop(node, "reusable", NULL) ||
+ of_get_flat_dt_prop(node, "no-map", NULL))
+ return -ENODEV;
+
+ if (size_cmdline != -1 &&
+ of_get_flat_dt_prop(node, "linux,cma-default", NULL)) {
+ pr_err("Skipping dt linux,cma-default node in favor for \"cma=\" kernel param.\n");
+ return -EBUSY;
+ }
+ return 0;
+}
+
+static int __init rmem_cma_validate(unsigned long node, phys_addr_t *align)
+{
+ int ret = __rmem_cma_verify_node(node);
+
+ if (ret)
+ return ret;
+
+ if (align)
+ *align = max_t(phys_addr_t, *align, CMA_MIN_ALIGNMENT_BYTES);
+
+ return 0;
+}
+
+static int __init rmem_cma_fixup(unsigned long node, phys_addr_t base,
+ phys_addr_t size)
+{
+ int ret = __rmem_cma_verify_node(node);
+
+ if (ret)
+ return ret;
+
+ /* Architecture specific contiguous memory fixup. */
+ dma_contiguous_early_fixup(base, size);
+ return 0;
+}
+
static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
{
bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
struct cma *cma;
- int err;
+ int ret;
- if (!of_get_flat_dt_prop(node, "reusable", NULL) ||
- of_get_flat_dt_prop(node, "no-map", NULL))
- return -ENODEV;
+ ret = __rmem_cma_verify_node(node);
+ if (ret)
+ return ret;
if (!IS_ALIGNED(rmem->base | rmem->size, CMA_MIN_ALIGNMENT_BYTES)) {
pr_err("Reserved memory: incorrect alignment of CMA region\n");
return -EINVAL;
}
- err = cma_init_reserved_mem(rmem->base, rmem->size, 0, rmem->name, &cma);
- if (err) {
+ ret = cma_init_reserved_mem(rmem->base, rmem->size, 0, rmem->name, &cma);
+ if (ret) {
pr_err("Reserved memory: unable to setup CMA region\n");
- return err;
+ return ret;
}
if (default_cma)
@@ -499,14 +529,16 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n",
&rmem->base, (unsigned long)rmem->size / SZ_1M);
- err = dma_heap_cma_register_heap(cma);
- if (err)
+ ret = dma_heap_cma_register_heap(cma);
+ if (ret)
pr_warn("Couldn't register CMA heap.");
return 0;
}
static const struct reserved_mem_ops rmem_cma_ops = {
+ .node_validate = rmem_cma_validate,
+ .node_fixup = rmem_cma_fixup,
.node_init = rmem_cma_setup,
.device_init = rmem_cma_device_init,
.device_release = rmem_cma_device_release,
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 5/7] of: reserved_mem: rearrange code a bit
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
` (3 preceding siblings ...)
2026-03-13 15:07 ` [PATCH 4/7] of: reserved_mem: replace CMA quirks by generic methods Marek Szyprowski
@ 2026-03-13 15:08 ` Marek Szyprowski
2026-03-13 15:08 ` [PATCH 6/7] of: reserved_mem: clarify fdt_scan_reserved_mem*() functions Marek Szyprowski
` (2 subsequent siblings)
7 siblings, 0 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:08 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
Move __rmem_check_for_overlap() and __rmem_cmp() functions before
fdt_scan_reserved_mem_reg_nodes() to avoid forward declaration and keep
related code close together.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/of/of_reserved_mem.c | 99 ++++++++++++++++++------------------
1 file changed, 49 insertions(+), 50 deletions(-)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 399cdd11a9ca..b8d4fbcde3b1 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -214,7 +214,55 @@ static int __init __reserved_mem_check_root(unsigned long node)
return 0;
}
-static void __init __rmem_check_for_overlap(void);
+static int __init __rmem_cmp(const void *a, const void *b)
+{
+ const struct reserved_mem *ra = a, *rb = b;
+
+ if (ra->base < rb->base)
+ return -1;
+
+ if (ra->base > rb->base)
+ return 1;
+
+ /*
+ * Put the dynamic allocations (address == 0, size == 0) before static
+ * allocations at address 0x0 so that overlap detection works
+ * correctly.
+ */
+ if (ra->size < rb->size)
+ return -1;
+ if (ra->size > rb->size)
+ return 1;
+
+ return 0;
+}
+
+static void __init __rmem_check_for_overlap(void)
+{
+ int i;
+
+ if (reserved_mem_count < 2)
+ return;
+
+ sort(reserved_mem, reserved_mem_count, sizeof(reserved_mem[0]),
+ __rmem_cmp, NULL);
+ for (i = 0; i < reserved_mem_count - 1; i++) {
+ struct reserved_mem *this, *next;
+
+ this = &reserved_mem[i];
+ next = &reserved_mem[i + 1];
+
+ if (this->base + this->size > next->base) {
+ phys_addr_t this_end, next_end;
+
+ this_end = this->base + this->size;
+ next_end = next->base + next->size;
+ pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n",
+ this->name, &this->base, &this_end,
+ next->name, &next->base, &next_end);
+ }
+ }
+}
/**
* fdt_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined
@@ -536,55 +584,6 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
return ret;
}
-static int __init __rmem_cmp(const void *a, const void *b)
-{
- const struct reserved_mem *ra = a, *rb = b;
-
- if (ra->base < rb->base)
- return -1;
-
- if (ra->base > rb->base)
- return 1;
-
- /*
- * Put the dynamic allocations (address == 0, size == 0) before static
- * allocations at address 0x0 so that overlap detection works
- * correctly.
- */
- if (ra->size < rb->size)
- return -1;
- if (ra->size > rb->size)
- return 1;
-
- return 0;
-}
-
-static void __init __rmem_check_for_overlap(void)
-{
- int i;
-
- if (reserved_mem_count < 2)
- return;
-
- sort(reserved_mem, reserved_mem_count, sizeof(reserved_mem[0]),
- __rmem_cmp, NULL);
- for (i = 0; i < reserved_mem_count - 1; i++) {
- struct reserved_mem *this, *next;
-
- this = &reserved_mem[i];
- next = &reserved_mem[i + 1];
-
- if (this->base + this->size > next->base) {
- phys_addr_t this_end, next_end;
-
- this_end = this->base + this->size;
- next_end = next->base + next->size;
- pr_err("OVERLAP DETECTED!\n%s (%pa--%pa) overlaps with %s (%pa--%pa)\n",
- this->name, &this->base, &this_end,
- next->name, &next->base, &next_end);
- }
- }
-}
/**
* fdt_init_reserved_mem_node() - Initialize a reserved memory region
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 6/7] of: reserved_mem: clarify fdt_scan_reserved_mem*() functions
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
` (4 preceding siblings ...)
2026-03-13 15:08 ` [PATCH 5/7] of: reserved_mem: rearrange code a bit Marek Szyprowski
@ 2026-03-13 15:08 ` Marek Szyprowski
2026-03-13 15:08 ` [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node() Marek Szyprowski
2026-03-22 22:44 ` [PATCH 0/7] Refactor reserved memory regions handling code Rob Herring
7 siblings, 0 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:08 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
Rename fdt_scan_reserved_mem_reg_nodes() to fdt_scan_reserved_mem_late()
to clearly show how it differs from fdt_scan_reserved_mem() and update
description of both functions.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/of/fdt.c | 2 +-
drivers/of/of_private.h | 2 +-
drivers/of/of_reserved_mem.c | 24 +++++++++++++++---------
3 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index 331646d667b9..43a0944ca462 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -1274,7 +1274,7 @@ void __init unflatten_device_tree(void)
void *fdt = initial_boot_params;
/* Save the statically-placed regions in the reserved_mem array */
- fdt_scan_reserved_mem_reg_nodes();
+ fdt_scan_reserved_mem_late();
/* Populate an empty root node when bootloader doesn't provide one */
if (!fdt) {
diff --git a/drivers/of/of_private.h b/drivers/of/of_private.h
index df0bb00349e0..0ae16da066e2 100644
--- a/drivers/of/of_private.h
+++ b/drivers/of/of_private.h
@@ -186,7 +186,7 @@ static inline struct device_node *__of_get_dma_parent(const struct device_node *
#endif
int fdt_scan_reserved_mem(void);
-void __init fdt_scan_reserved_mem_reg_nodes(void);
+void __init fdt_scan_reserved_mem_late(void);
bool of_fdt_device_is_available(const void *blob, unsigned long node);
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index b8d4fbcde3b1..229573d6dacb 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -265,16 +265,15 @@ static void __init __rmem_check_for_overlap(void)
}
/**
- * fdt_scan_reserved_mem_reg_nodes() - Store info for the "reg" defined
- * reserved memory regions.
+ * fdt_scan_reserved_mem_late() - Scan FDT and initialize remaining reserved
+ * memory regions.
*
- * This function is used to scan through the DT and store the
- * information for the reserved memory regions that are defined using
- * the "reg" property. The region node number, name, base address, and
- * size are all stored in the reserved_mem array by calling the
- * fdt_reserved_mem_save_node() function.
+ * This function is used to scan again through the DT and initialize the
+ * the "static" reserved memory regions, that are defined using the "reg"
+ * property. Each such region is then initialized with its specific init
+ * function and stored in the global reserved_mem array.
*/
-void __init fdt_scan_reserved_mem_reg_nodes(void)
+void __init fdt_scan_reserved_mem_late(void)
{
const void *fdt = initial_boot_params;
phys_addr_t base, size;
@@ -328,7 +327,14 @@ void __init fdt_scan_reserved_mem_reg_nodes(void)
static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname);
/*
- * fdt_scan_reserved_mem() - scan a single FDT node for reserved memory
+ * fdt_scan_reserved_mem() - reserve and allocate memory occupied by
+ * reserved memory regions.
+ *
+ * This function is used to scan through the FDT and mark memory occupied
+ * by all static (defined by the "reg" property) reserved memory regions.
+ * Then memory for all dynamic regions (defined by size & alignment) is
+ * allocated, a region specific init function is called and region information
+ * is stored in the reserved_mem array.
*/
int __init fdt_scan_reserved_mem(void)
{
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node()
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
` (5 preceding siblings ...)
2026-03-13 15:08 ` [PATCH 6/7] of: reserved_mem: clarify fdt_scan_reserved_mem*() functions Marek Szyprowski
@ 2026-03-13 15:08 ` Marek Szyprowski
2026-03-14 3:43 ` kernel test robot
2026-03-14 7:57 ` kernel test robot
2026-03-22 22:44 ` [PATCH 0/7] Refactor reserved memory regions handling code Rob Herring
7 siblings, 2 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:08 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Robin Murphy
Move the content of fdt_reserved_mem_save_node() to
fdt_init_reserved_mem_node() function. Initialization is no longer
performed in two steps as it was initially, so
fdt_reserved_mem_save_node() name is a bit misleading and that function
actually perform full initialization of the reserved memory region.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
---
drivers/of/of_reserved_mem.c | 58 ++++++++++++++++--------------------
1 file changed, 25 insertions(+), 33 deletions(-)
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 229573d6dacb..7146c1ba6ae1 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -102,36 +102,13 @@ static void __init alloc_reserved_mem_array(void)
reserved_mem = new_array;
}
-static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
- unsigned long node);
+static void fdt_init_reserved_mem_node(unsigned long node, const char *uname,
+ phys_addr_t base, phys_addr_t size);
static int fdt_validate_reserved_mem_node(unsigned long node,
phys_addr_t *align);
static int fdt_fixup_reserved_mem_node(unsigned long node,
phys_addr_t base, phys_addr_t size);
-/*
- * fdt_reserved_mem_save_node() - save fdt node for second pass initialization
- */
-static void __init fdt_reserved_mem_save_node(unsigned long node, const char *uname,
- phys_addr_t base, phys_addr_t size)
-{
- struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
-
- if (reserved_mem_count == total_reserved_mem_cnt) {
- pr_err("not enough space for all defined regions.\n");
- return;
- }
-
- rmem->name = uname;
- rmem->base = base;
- rmem->size = size;
-
- /* Call the region specific initialization function */
- fdt_init_reserved_mem_node(rmem, node);
-
- reserved_mem_count++;
-}
-
static int __init early_init_dt_reserve_memory(phys_addr_t base,
phys_addr_t size, bool nomap)
{
@@ -316,12 +293,14 @@ void __init fdt_scan_reserved_mem_late(void)
if (size) {
uname = fdt_get_name(fdt, child, NULL);
- fdt_reserved_mem_save_node(child, uname, base, size);
+ fdt_init_reserved_mem_node(child, uname, base, size);
}
}
/* check for overlapping reserved regions */
__rmem_check_for_overlap();
+
+
}
static int __init __reserved_mem_alloc_size(unsigned long node, const char *uname);
@@ -515,9 +494,8 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
}
fdt_fixup_reserved_mem_node(node, base, size);
+ fdt_init_reserved_mem_node(node, uname, base, size);
- /* Save region in the reserved_mem array */
- fdt_reserved_mem_save_node(node, uname, base, size);
return 0;
}
@@ -590,21 +568,31 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
return ret;
}
-
/**
* fdt_init_reserved_mem_node() - Initialize a reserved memory region
- * @rmem: reserved_mem struct of the memory region to be initialized.
* @node: fdt node of the initialized region
*
* This function is used to call the region specific initialization
- * function for a reserved memory region.
+ * function for a reserved memory region save all region specific data to
+ * reserved_mem array to let of_reserved_mem_lookup() function find it.
*/
-static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
- unsigned long node)
+static void __init fdt_init_reserved_mem_node(unsigned long node, const char *uname,
+ phys_addr_t base, phys_addr_t size)
{
int err = 0;
bool nomap;
+ struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
+
+ if (reserved_mem_count == total_reserved_mem_cnt) {
+ pr_err("not enough space for all defined regions.\n");
+ return;
+ }
+
+ rmem->name = uname;
+ rmem->base = base;
+ rmem->size = size;
+
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
err = __reserved_mem_init_node(rmem, node);
@@ -614,6 +602,7 @@ static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
memblock_clear_nomap(rmem->base, rmem->size);
else
memblock_phys_free(rmem->base, rmem->size);
+ return;
} else {
phys_addr_t end = rmem->base + rmem->size - 1;
bool reusable =
@@ -624,7 +613,10 @@ static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
nomap ? "nomap" : "map",
reusable ? "reusable" : "non-reusable",
rmem->name ? rmem->name : "unknown");
+
}
+
+ reserved_mem_count++;
}
struct rmem_assigned_device {
--
2.34.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE()
2026-03-13 15:07 ` [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE() Marek Szyprowski
@ 2026-03-13 15:58 ` Marek Szyprowski
2026-03-14 15:20 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: Marek Szyprowski @ 2026-03-13 15:58 UTC (permalink / raw)
To: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu
Cc: Rob Herring, Krzysztof Kozlowski, Oreoluwa Babatunde,
Andrew Morton, Robin Murphy
On 13.03.2026 16:07, Marek Szyprowski wrote:
> Move init function from OF_DECLARE() argument to the given reserved
> memory region ops structure and then pass that structure to the
> OF_DECLARE() initializer. This makes it possible in the future to add
> more functions called by the generic code before given memory region is
> initialized and rmem object created.
>
> Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
> ---
> drivers/memory/tegra/tegra210-emc-table.c | 14 ++++++++------
> drivers/of/of_reserved_mem.c | 5 +++--
> include/linux/of_reserved_mem.h | 15 ++++++++-------
> kernel/dma/coherent.c | 13 +++++++------
> kernel/dma/contiguous.c | 15 ++++++++-------
> kernel/dma/swiotlb.c | 13 +++++++------
> 6 files changed, 41 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/memory/tegra/tegra210-emc-table.c b/drivers/memory/tegra/tegra210-emc-table.c
> index ac1d1e13482a..f6395bc9dbc8 100644
> --- a/drivers/memory/tegra/tegra210-emc-table.c
> +++ b/drivers/memory/tegra/tegra210-emc-table.c
> @@ -70,11 +70,6 @@ static void tegra210_emc_table_device_release(struct reserved_mem *rmem,
> memunmap(timings);
> }
>
> -static const struct reserved_mem_ops tegra210_emc_table_ops = {
> - .device_init = tegra210_emc_table_device_init,
> - .device_release = tegra210_emc_table_device_release,
> -};
> -
> static int tegra210_emc_table_init(unsigned long node,
> struct reserved_mem *rmem)
> {
> @@ -85,5 +80,12 @@ static int tegra210_emc_table_init(unsigned long node,
>
> return 0;
> }
> +
> +static const struct reserved_mem_ops tegra210_emc_table_ops = {
> + .node_init = tegra210_emc_table_init,
> + .device_init = tegra210_emc_table_device_init,
> + .device_release = tegra210_emc_table_device_release,
> +};
> +
> RESERVEDMEM_OF_DECLARE(tegra210_emc_table, "nvidia,tegra210-emc-table",
> - tegra210_emc_table_init);
> + &tegra210_emc_table_ops);
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index 9aff460a0420..675f1c1c6627 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -492,14 +492,15 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
>
> for (i = __reservedmem_of_table; ret == -ENODEV &&
> i < &__rmem_of_table_sentinel; i++) {
> - reservedmem_of_init_fn initfn = i->data;
> + const struct reserved_mem_ops *ops = i->data;
> const char *compat = i->compatible;
>
> if (!of_flat_dt_is_compatible(node, compat))
> continue;
>
> - ret = initfn(node, rmem);
> + ret = ops->node_init(node, rmem);
> if (ret == 0) {
> + rmem->ops = ops;
> pr_info("initialized node %s, compatible id %s\n",
> rmem->name, compat);
> break;
> diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
> index 5159938bfe03..dc00502a6b69 100644
> --- a/include/linux/of_reserved_mem.h
> +++ b/include/linux/of_reserved_mem.h
> @@ -18,19 +18,20 @@ struct reserved_mem {
> };
>
> struct reserved_mem_ops {
> + int (*node_init)(unsigned long fdt_node, struct reserved_mem *rmem);
> int (*device_init)(struct reserved_mem *rmem,
> struct device *dev);
> void (*device_release)(struct reserved_mem *rmem,
> struct device *dev);
> };
>
> -typedef int (*reservedmem_of_init_fn)(unsigned long node,
> - struct reserved_mem *rmem);
> -
> #ifdef CONFIG_OF_RESERVED_MEM
>
> -#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
> - _OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn)
> +#define RESERVEDMEM_OF_DECLARE(name, compat, ops) \
> + static const struct of_device_id __of_table_##name \
> + __used __section("__reservedmem_of_table") \
> + __aligned(__alignof__(struct of_device_id)) \
> + = { .compatible = compat, .data = ops }
>
> int of_reserved_mem_device_init_by_idx(struct device *dev,
> struct device_node *np, int idx);
> @@ -48,8 +49,8 @@ int of_reserved_mem_region_count(const struct device_node *np);
>
> #else
>
> -#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
> - _OF_DECLARE_STUB(reservedmem, name, compat, init, reservedmem_of_init_fn)
> +#define RESERVEDMEM_OF_DECLARE(name, compat, ops) \
> + _OF_DECLARE_STUB(reservedmem, name, compat, init, void *)
>
> static inline int of_reserved_mem_device_init_by_idx(struct device *dev,
> struct device_node *np, int idx)
> diff --git a/kernel/dma/coherent.c b/kernel/dma/coherent.c
> index 64f9ba618e19..bcdc0f76d2e8 100644
> --- a/kernel/dma/coherent.c
> +++ b/kernel/dma/coherent.c
> @@ -362,10 +362,6 @@ static void rmem_dma_device_release(struct reserved_mem *rmem,
> dev->dma_mem = NULL;
> }
>
> -static const struct reserved_mem_ops rmem_dma_ops = {
> - .device_init = rmem_dma_device_init,
> - .device_release = rmem_dma_device_release,
> -};
>
> static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
> {
> @@ -388,7 +384,6 @@ static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
> }
> #endif
>
> - rmem->ops = &rmem_dma_ops;
> pr_info("Reserved memory: created DMA memory pool at %pa, size %ld MiB\n",
> &rmem->base, (unsigned long)rmem->size / SZ_1M);
> return 0;
> @@ -405,5 +400,11 @@ static int __init dma_init_reserved_memory(void)
> core_initcall(dma_init_reserved_memory);
> #endif /* CONFIG_DMA_GLOBAL_POOL */
>
> -RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", rmem_dma_setup);
> +static const struct reserved_mem_ops rmem_dma_ops = {
> + .node_init = rmem_dma_setup,
> + .device_init = rmem_dma_device_init,
> + .device_release = rmem_dma_device_release,
> +};
> +
> +RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", &rmem_dma_ops);
> #endif
> diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c
> index e6fc6906b5c0..efeebda92537 100644
> --- a/kernel/dma/contiguous.c
> +++ b/kernel/dma/contiguous.c
> @@ -470,11 +470,6 @@ static void rmem_cma_device_release(struct reserved_mem *rmem,
> dev->cma_area = NULL;
> }
>
> -static const struct reserved_mem_ops rmem_cma_ops = {
> - .device_init = rmem_cma_device_init,
> - .device_release = rmem_cma_device_release,
> -};
> -
> static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
> {
> bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL);
> @@ -499,7 +494,6 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
> if (default_cma)
> dma_contiguous_default_area = cma;
>
> - rmem->ops = &rmem_cma_ops;
> rmem->priv = cma;
>
> pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n",
> @@ -511,5 +505,12 @@ static int __init rmem_cma_setup(unsigned long node, struct reserved_mem *rmem)
>
> return 0;
> }
> -RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup);
> +
> +static const struct reserved_mem_ops rmem_cma_ops = {
> + .node_init = rmem_cma_setup,
> + .device_init = rmem_cma_device_init,
> + .device_release = rmem_cma_device_release,
> +};
> +
> +RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", &rmem_cma_ops);
> #endif
> diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
> index f3a12e15a951..327525181b8a 100644
> --- a/kernel/dma/swiotlb.c
> +++ b/kernel/dma/swiotlb.c
> @@ -1855,11 +1855,6 @@ static void rmem_swiotlb_device_release(struct reserved_mem *rmem,
> dev->dma_io_tlb_mem = &io_tlb_default_mem;
> }
>
> -static const struct reserved_mem_ops rmem_swiotlb_ops = {
> - .device_init = rmem_swiotlb_device_init,
> - .device_release = rmem_swiotlb_device_release,
> -};
> -
> static int __init rmem_swiotlb_setup(unsigned long node,
> struct reserved_mem *rmem)
> {
> @@ -1875,5 +1870,11 @@ static int __init rmem_swiotlb_setup(unsigned long node,
> return 0;
> }
>
> -RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", rmem_swiotlb_setup);
> +static const struct reserved_mem_ops rmem_swiotlb_ops = {
> + .node_init = rmem_swiotlb_setup,
> + .device_init = rmem_swiotlb_device_init,
> + .device_release = rmem_swiotlb_device_release,
> +};
> +
> +RESERVEDMEM_OF_DECLARE(dma, "restricted-dma-pool", &rmem_swiotlb_ops);
> #endif /* CONFIG_DMA_RESTRICTED_POOL */
It looks that this chunk got lost during the rebase, sorry for the noise:
diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c
index 327525181b8a..44b566d20e04 100644
--- a/kernel/dma/swiotlb.c
+++ b/kernel/dma/swiotlb.c
@@ -1864,7 +1864,6 @@ static int __init rmem_swiotlb_setup(unsigned long
node,
of_get_flat_dt_prop(node, "no-map", NULL))
return -EINVAL;
- rmem->ops = &rmem_swiotlb_ops;
pr_info("Reserved memory: created restricted DMA pool at %pa,
size %ld MiB\n",
&rmem->base, (unsigned long)rmem->size / SZ_1M);
return 0;
Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node()
2026-03-13 15:08 ` [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node() Marek Szyprowski
@ 2026-03-14 3:43 ` kernel test robot
2026-03-14 7:57 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2026-03-14 3:43 UTC (permalink / raw)
To: Marek Szyprowski, Saravana Kannan, linux-kernel, devicetree,
linux-mm, iommu
Cc: oe-kbuild-all, Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Linux Memory Management List,
Robin Murphy
Hi Marek,
kernel test robot noticed the following build warnings:
[auto build test WARNING on robh/for-next]
[also build test WARNING on akpm-mm/mm-everything linus/master v7.0-rc3 next-20260311]
[cannot apply to tegra/for-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marek-Szyprowski/of-reserved_mem-remove-fdt-node-from-the-structure/20260314-023123
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link: https://lore.kernel.org/r/20260313150802.1121442-8-m.szyprowski%40samsung.com
patch subject: [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node()
config: arc-allnoconfig (https://download.01.org/0day-ci/archive/20260314/202603141108.XvqRlNaY-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/20260314/202603141108.XvqRlNaY-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/202603141108.XvqRlNaY-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'uname' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'base' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'size' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'uname' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'base' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'size' not described in 'fdt_init_reserved_mem_node'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node()
2026-03-13 15:08 ` [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node() Marek Szyprowski
2026-03-14 3:43 ` kernel test robot
@ 2026-03-14 7:57 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2026-03-14 7:57 UTC (permalink / raw)
To: Marek Szyprowski, Saravana Kannan, linux-kernel, devicetree,
linux-mm, iommu
Cc: oe-kbuild-all, Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Linux Memory Management List,
Robin Murphy
Hi Marek,
kernel test robot noticed the following build warnings:
[auto build test WARNING on robh/for-next]
[also build test WARNING on akpm-mm/mm-everything next-20260313]
[cannot apply to tegra/for-next linus/master v6.16-rc1]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marek-Szyprowski/of-reserved_mem-remove-fdt-node-from-the-structure/20260314-023123
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link: https://lore.kernel.org/r/20260313150802.1121442-8-m.szyprowski%40samsung.com
patch subject: [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node()
config: x86_64-rhel-9.4-kunit (https://download.01.org/0day-ci/archive/20260314/202603140843.vdpZ0bgs-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/20260314/202603140843.vdpZ0bgs-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/202603140843.vdpZ0bgs-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'uname' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'base' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'size' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'uname' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'base' not described in 'fdt_init_reserved_mem_node'
>> Warning: drivers/of/of_reserved_mem.c:580 function parameter 'size' not described in 'fdt_init_reserved_mem_node'
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE()
2026-03-13 15:07 ` [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE() Marek Szyprowski
2026-03-13 15:58 ` Marek Szyprowski
@ 2026-03-14 15:20 ` kernel test robot
1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2026-03-14 15:20 UTC (permalink / raw)
To: Marek Szyprowski, Saravana Kannan, linux-kernel, devicetree,
linux-mm, iommu
Cc: oe-kbuild-all, Marek Szyprowski, Rob Herring, Krzysztof Kozlowski,
Oreoluwa Babatunde, Andrew Morton, Linux Memory Management List,
Robin Murphy
Hi Marek,
kernel test robot noticed the following build errors:
[auto build test ERROR on robh/for-next]
[also build test ERROR on tegra/for-next akpm-mm/mm-everything linus/master v7.0-rc3 next-20260311]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Marek-Szyprowski/of-reserved_mem-remove-fdt-node-from-the-structure/20260314-023123
base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
patch link: https://lore.kernel.org/r/20260313150802.1121442-4-m.szyprowski%40samsung.com
patch subject: [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE()
config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20260314/202603142347.aops46Bf-lkp@intel.com/config)
compiler: m68k-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260314/202603142347.aops46Bf-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/202603142347.aops46Bf-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/memory/tegra/tegra210-emc-table.c: In function 'tegra210_emc_table_init':
>> drivers/memory/tegra/tegra210-emc-table.c:79:22: error: 'tegra210_emc_table_ops' undeclared (first use in this function); did you mean 'tegra210_emc_table_init'?
79 | rmem->ops = &tegra210_emc_table_ops;
| ^~~~~~~~~~~~~~~~~~~~~~
| tegra210_emc_table_init
drivers/memory/tegra/tegra210-emc-table.c:79:22: note: each undeclared identifier is reported only once for each function it appears in
vim +79 drivers/memory/tegra/tegra210-emc-table.c
10de21148f7d28 Joseph Lo 2019-05-29 72
6888259214366b Marek Szyprowski 2026-03-13 73 static int tegra210_emc_table_init(unsigned long node,
6888259214366b Marek Szyprowski 2026-03-13 74 struct reserved_mem *rmem)
10de21148f7d28 Joseph Lo 2019-05-29 75 {
10de21148f7d28 Joseph Lo 2019-05-29 76 pr_debug("Tegra210 EMC table at %pa, size %lu bytes\n", &rmem->base,
10de21148f7d28 Joseph Lo 2019-05-29 77 (unsigned long)rmem->size);
10de21148f7d28 Joseph Lo 2019-05-29 78
10de21148f7d28 Joseph Lo 2019-05-29 @79 rmem->ops = &tegra210_emc_table_ops;
10de21148f7d28 Joseph Lo 2019-05-29 80
10de21148f7d28 Joseph Lo 2019-05-29 81 return 0;
10de21148f7d28 Joseph Lo 2019-05-29 82 }
f954eaa20bd915 Marek Szyprowski 2026-03-13 83
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 0/7] Refactor reserved memory regions handling code
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
` (6 preceding siblings ...)
2026-03-13 15:08 ` [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node() Marek Szyprowski
@ 2026-03-22 22:44 ` Rob Herring
7 siblings, 0 replies; 13+ messages in thread
From: Rob Herring @ 2026-03-22 22:44 UTC (permalink / raw)
To: Marek Szyprowski
Cc: Saravana Kannan, linux-kernel, devicetree, linux-mm, iommu,
Krzysztof Kozlowski, Oreoluwa Babatunde, Andrew Morton,
Robin Murphy
On Fri, Mar 13, 2026 at 04:07:55PM +0100, Marek Szyprowski wrote:
> Hello,
>
> The reserved memory regions handling code was reworked to handle
> unlimited so called "static" memory nodes in commit 00c9a452a235 ("of:
> reserved_mem: Add code to dynamically allocate reserved_mem array").
>
> The side effect of this rework was a set of bugs fixed later by commits
> 0fd17e598333 ("of: reserved_mem: Allow reserved_mem framework detect
> "cma=" kernel param") and 2c223f7239f3 ("of: reserved_mem: Restructure
> call site for dma_contiguous_early_fixup()"). As a result, the code in
> drivers/of/of_reserved_mem.c became a mix of generic code and CMA
> specific fixups.
>
> In this patchset I try to untangle this spaghetti and perform some code
> cleanup. I hope nothing breaks this time.
This all looks good to me. Can you respin and fixup the issues.
Rob
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2026-03-22 22:44 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <CGME20260313150809eucas1p169ab0904a217a04e0601e2ef01854c73@eucas1p1.samsung.com>
2026-03-13 15:07 ` [PATCH 0/7] Refactor reserved memory regions handling code Marek Szyprowski
2026-03-13 15:07 ` [PATCH 1/7] of: reserved_mem: remove fdt node from the structure Marek Szyprowski
2026-03-13 15:07 ` [PATCH 2/7] of: reserved_mem: use -ENODEV instead of -ENOENT Marek Szyprowski
2026-03-13 15:07 ` [PATCH 3/7] of: reserved_mem: switch to ops based OF_DECLARE() Marek Szyprowski
2026-03-13 15:58 ` Marek Szyprowski
2026-03-14 15:20 ` kernel test robot
2026-03-13 15:07 ` [PATCH 4/7] of: reserved_mem: replace CMA quirks by generic methods Marek Szyprowski
2026-03-13 15:08 ` [PATCH 5/7] of: reserved_mem: rearrange code a bit Marek Szyprowski
2026-03-13 15:08 ` [PATCH 6/7] of: reserved_mem: clarify fdt_scan_reserved_mem*() functions Marek Szyprowski
2026-03-13 15:08 ` [PATCH 7/7] of: reserved_mem: rework fdt_init_reserved_mem_node() Marek Szyprowski
2026-03-14 3:43 ` kernel test robot
2026-03-14 7:57 ` kernel test robot
2026-03-22 22:44 ` [PATCH 0/7] Refactor reserved memory regions handling code Rob Herring
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox