Skip to content

Commit 34e0e2a

Browse files
mszyprowrobherring
authored andcommitted
of: reserved_mem: rework fdt_init_reserved_mem_node()
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 now performs full initialization of the reserved memory region. This also fixes the problem of keeping pointers to the regions, which failed to initialize, what might cause issues when such region is assigned to the device. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Link: https://patch.msgid.link/20260325090023.3175348-8-m.szyprowski@samsung.com Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
1 parent bf66171 commit 34e0e2a

1 file changed

Lines changed: 28 additions & 34 deletions

File tree

drivers/of/of_reserved_mem.c

Lines changed: 28 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -102,36 +102,13 @@ static void __init alloc_reserved_mem_array(void)
102102
reserved_mem = new_array;
103103
}
104104

105-
static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
106-
unsigned long node);
105+
static void fdt_init_reserved_mem_node(unsigned long node, const char *uname,
106+
phys_addr_t base, phys_addr_t size);
107107
static int fdt_validate_reserved_mem_node(unsigned long node,
108108
phys_addr_t *align);
109109
static int fdt_fixup_reserved_mem_node(unsigned long node,
110110
phys_addr_t base, phys_addr_t size);
111111

112-
/*
113-
* fdt_reserved_mem_save_node() - save fdt node for second pass initialization
114-
*/
115-
static void __init fdt_reserved_mem_save_node(unsigned long node, const char *uname,
116-
phys_addr_t base, phys_addr_t size)
117-
{
118-
struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
119-
120-
if (reserved_mem_count == total_reserved_mem_cnt) {
121-
pr_err("not enough space for all defined regions.\n");
122-
return;
123-
}
124-
125-
rmem->name = uname;
126-
rmem->base = base;
127-
rmem->size = size;
128-
129-
/* Call the region specific initialization function */
130-
fdt_init_reserved_mem_node(rmem, node);
131-
132-
reserved_mem_count++;
133-
}
134-
135112
static int __init early_init_dt_reserve_memory(phys_addr_t base,
136113
phys_addr_t size, bool nomap)
137114
{
@@ -316,7 +293,7 @@ void __init fdt_scan_reserved_mem_late(void)
316293

317294
if (size) {
318295
uname = fdt_get_name(fdt, child, NULL);
319-
fdt_reserved_mem_save_node(child, uname, base, size);
296+
fdt_init_reserved_mem_node(child, uname, base, size);
320297
}
321298
}
322299

@@ -515,9 +492,8 @@ static int __init __reserved_mem_alloc_size(unsigned long node, const char *unam
515492
}
516493

517494
fdt_fixup_reserved_mem_node(node, base, size);
495+
fdt_init_reserved_mem_node(node, uname, base, size);
518496

519-
/* Save region in the reserved_mem array */
520-
fdt_reserved_mem_save_node(node, uname, base, size);
521497
return 0;
522498
}
523499

@@ -619,30 +595,46 @@ static int __init __reserved_mem_init_node(struct reserved_mem *rmem,
619595
return ret;
620596
}
621597

622-
623598
/**
624599
* fdt_init_reserved_mem_node() - Initialize a reserved memory region
625-
* @rmem: reserved_mem struct of the memory region to be initialized.
626600
* @node: fdt node of the initialized region
601+
* @uname: name of the reserved memory node
602+
* @base: base address of the reserved memory region
603+
* @size: size of the reserved memory region
627604
*
628-
* This function is used to call the region specific initialization
629-
* function for a reserved memory region.
605+
* This function calls the region-specific initialization function for a
606+
* reserved memory region and saves all region-specific data to the
607+
* reserved_mem array to allow of_reserved_mem_lookup() to find it.
630608
*/
631-
static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
632-
unsigned long node)
609+
static void __init fdt_init_reserved_mem_node(unsigned long node, const char *uname,
610+
phys_addr_t base, phys_addr_t size)
633611
{
634612
int err = 0;
635613
bool nomap;
636614

615+
struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
616+
617+
if (reserved_mem_count == total_reserved_mem_cnt) {
618+
pr_err("not enough space for all defined regions.\n");
619+
return;
620+
}
621+
622+
rmem->name = uname;
623+
rmem->base = base;
624+
rmem->size = size;
625+
637626
nomap = of_get_flat_dt_prop(node, "no-map", NULL) != NULL;
638627

639628
err = __reserved_mem_init_node(rmem, node);
640629
if (err != 0 && err != -ENODEV) {
641630
pr_info("node %s compatible matching fail\n", rmem->name);
631+
rmem->name = NULL;
632+
642633
if (nomap)
643634
memblock_clear_nomap(rmem->base, rmem->size);
644635
else
645636
memblock_phys_free(rmem->base, rmem->size);
637+
return;
646638
} else {
647639
phys_addr_t end = rmem->base + rmem->size - 1;
648640
bool reusable =
@@ -654,6 +646,8 @@ static void __init fdt_init_reserved_mem_node(struct reserved_mem *rmem,
654646
reusable ? "reusable" : "non-reusable",
655647
rmem->name ? rmem->name : "unknown");
656648
}
649+
650+
reserved_mem_count++;
657651
}
658652

659653
struct rmem_assigned_device {

0 commit comments

Comments
 (0)