diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2022-08-17 13:42:39 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-08-18 14:39:06 +0200 |
commit | d0b5f6bde15b4737f27f21f6cdb5d6b091acecd8 (patch) | |
tree | cb5469a3317b5feab27c01ce6349659635889ccc /drivers/of | |
parent | 58e95ea5d2126c51bb6e00b213ae4273266e1ceb (diff) | |
download | barebox-d0b5f6bde15b4737f27f21f6cdb5d6b091acecd8.tar.gz |
of: reserved-mem: reserve regions prior to mmu_initcall()
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@pengutronix.de>
Link: https://lore.barebox.org/20220817114244.1810531-6-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/of')
-rw-r--r-- | drivers/of/reserved-mem.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/drivers/of/reserved-mem.c b/drivers/of/reserved-mem.c index 34e61dfea3..f50a0bd837 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); |