[PATCH v2 05/10] of: reserved-mem: reserve regions prior to mmu_initcall()
Ahmad Fatoum
a.fatoum at pengutronix.de
Wed Aug 17 04:42:39 PDT 2022
Now that we both have a way to mark SDRAM regions requested as reserved
and an postmem_initcall() to do this add, change device tree memory
reservation parsing code to use them instead of requesting them as
normal memory at coredevice_initcall() level. This allows us to
reuse this information for MMU setup in the follow-up commit.
Signed-off-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
---
common/memory.c | 15 +++------------
drivers/of/reserved-mem.c | 34 +++++++++++++++++++++++-----------
include/of.h | 7 -------
3 files changed, 26 insertions(+), 30 deletions(-)
diff --git a/common/memory.c b/common/memory.c
index 40c795d2cde1..7e24ecb2bd03 100644
--- a/common/memory.c
+++ b/common/memory.c
@@ -56,17 +56,6 @@ void mem_malloc_init(void *start, void *end)
mem_malloc_initialized = 1;
}
-static int request_reservation(const struct resource *res)
-{
- if (!(res->flags & IORESOURCE_EXCLUSIVE))
- return 0;
-
- pr_debug("region %s %pa-%pa\n", res->name, &res->start, &res->end);
-
- request_sdram_region(res->name, res->start, resource_size(res));
- return 0;
-}
-
static int mem_malloc_resource(void)
{
#if !defined __SANDBOX__
@@ -96,7 +85,7 @@ static int mem_malloc_resource(void)
request_sdram_region("stack", STACK_BASE, STACK_SIZE);
#endif
- return of_reserved_mem_walk(request_reservation);
+ return 0;
}
coredevice_initcall(mem_malloc_resource);
@@ -173,6 +162,8 @@ int barebox_add_memory_bank(const char *name, resource_size_t start,
if (IS_ERR(res))
return PTR_ERR(res);
+ res->flags = IORESOURCE_MEM;
+
bank = xzalloc(sizeof(*bank));
bank->res = res;
diff --git a/drivers/of/reserved-mem.c b/drivers/of/reserved-mem.c
index 34e61dfea343..f50a0bd8374d 100644
--- a/drivers/of/reserved-mem.c
+++ b/drivers/of/reserved-mem.c
@@ -4,16 +4,31 @@
#include <stdio.h>
#include <of.h>
#include <of_address.h>
+#include <memory.h>
+#include <linux/ioport.h>
#define MEMRESERVE_NCELLS 2
-#define MEMRESERVE_FLAGS (IORESOURCE_MEM | IORESOURCE_EXCLUSIVE)
-int of_reserved_mem_walk(int (*handler)(const struct resource *res))
+static void request_region(struct resource *r)
+{
+ struct memory_bank *bank;
+
+ for_each_memory_bank(bank) {
+ if (!resource_contains(bank->res, r))
+ continue;
+
+ if (!reserve_sdram_region(r->name, r->start, resource_size(r)))
+ pr_warn("couldn't request reserved sdram region %pa-%pa\n",
+ &r->start, &r->end);
+ break;
+ }
+}
+
+static int of_reserved_mem_walk(void)
{
struct device_node *node, *child;
int ncells = 0;
const __be32 *reg;
- int ret;
node = of_find_node_by_path("/reserved-memory");
if (node) {
@@ -27,11 +42,9 @@ int of_reserved_mem_walk(int (*handler)(const struct resource *res))
of_address_to_resource(child, 0, &resource);
resource.name = child->name;
- resource.flags = MEMRESERVE_FLAGS;
+ resource.flags = IORESOURCE_MEM;
- ret = handler(&resource);
- if (ret)
- return ret;
+ request_region(&resource);
}
}
@@ -48,7 +61,7 @@ int of_reserved_mem_walk(int (*handler)(const struct resource *res))
snprintf(name, sizeof(name), "fdt-memreserve-%u", n++);
resource.name = name;
- resource.flags = MEMRESERVE_FLAGS;
+ resource.flags = IORESOURCE_MEM;
resource.start = of_read_number(reg + i, MEMRESERVE_NCELLS);
i += MEMRESERVE_NCELLS;
@@ -61,11 +74,10 @@ int of_reserved_mem_walk(int (*handler)(const struct resource *res))
resource.end = resource.start + size - 1;
- ret = handler(&resource);
- if (ret)
- return ret;
+ request_region(&resource);
}
}
return 0;
}
+postmem_initcall(of_reserved_mem_walk);
diff --git a/include/of.h b/include/of.h
index 37320da5ec76..995e9b591399 100644
--- a/include/of.h
+++ b/include/of.h
@@ -328,8 +328,6 @@ int of_autoenable_device_by_path(char *path);
int of_autoenable_i2c_by_component(char *path);
int of_prepend_machine_compatible(struct device_node *root, const char *compat);
-int of_reserved_mem_walk(int (*handler)(const struct resource *res));
-
#else
static inline struct of_reserve_map *of_get_reserve_map(void)
{
@@ -877,11 +875,6 @@ static inline int of_prepend_machine_compatible(struct device_node *root,
return -ENODEV;
}
-static inline int of_reserved_mem_walk(int (*handler)(const struct resource *res))
-{
- return 0;
-}
-
#endif
#define for_each_property_of_node(dn, pp) \
--
2.30.2
More information about the barebox
mailing list