summaryrefslogtreecommitdiff
path: root/drivers/of
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2022-08-17 13:42:39 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-08-18 14:39:06 +0200
commitd0b5f6bde15b4737f27f21f6cdb5d6b091acecd8 (patch)
treecb5469a3317b5feab27c01ce6349659635889ccc /drivers/of
parent58e95ea5d2126c51bb6e00b213ae4273266e1ceb (diff)
downloadbarebox-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.c34
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);