of: fdt: Add generic support for handling usable memory range property

Add support for handling the "linux,usable-memory-range" property in the
"/chosen" node to the FDT core code.  This can co-exist safely with the
architecture-specific handling, until the latter has been removed.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/3bd69bada93ee59b7d23c38b3527fc1654e19343.1628670468.git.geert+renesas@glider.be
This commit is contained in:
Geert Uytterhoeven 2021-08-11 10:51:02 +02:00 committed by Rob Herring
parent f7e7ce93aa
commit 2af2b50acf
2 changed files with 33 additions and 3 deletions

View File

@ -79,9 +79,9 @@ a different secondary CPU release mechanism)
linux,usable-memory-range linux,usable-memory-range
------------------------- -------------------------
This property (arm64 only) holds a base address and size, describing a This property holds a base address and size, describing a limited region in
limited region in which memory may be considered available for use by which memory may be considered available for use by the kernel. Memory outside
the kernel. Memory outside of this range is not available for use. of this range is not available for use.
This property describes a limitation: memory within this range is only This property describes a limitation: memory within this range is only
valid when also described through another mechanism that the kernel valid when also described through another mechanism that the kernel

View File

@ -972,6 +972,32 @@ static void __init early_init_dt_check_for_elfcorehdr(unsigned long node)
elfcorehdr_addr, elfcorehdr_size); elfcorehdr_addr, elfcorehdr_size);
} }
static phys_addr_t cap_mem_addr;
static phys_addr_t cap_mem_size;
/**
* early_init_dt_check_for_usable_mem_range - Decode usable memory range
* location from flat tree
* @node: reference to node containing usable memory range location ('chosen')
*/
static void __init early_init_dt_check_for_usable_mem_range(unsigned long node)
{
const __be32 *prop;
int len;
pr_debug("Looking for usable-memory-range property... ");
prop = of_get_flat_dt_prop(node, "linux,usable-memory-range", &len);
if (!prop || (len < (dt_root_addr_cells + dt_root_size_cells)))
return;
cap_mem_addr = dt_mem_next_cell(dt_root_addr_cells, &prop);
cap_mem_size = dt_mem_next_cell(dt_root_size_cells, &prop);
pr_debug("cap_mem_start=%pa cap_mem_size=%pa\n", &cap_mem_addr,
&cap_mem_size);
}
#ifdef CONFIG_SERIAL_EARLYCON #ifdef CONFIG_SERIAL_EARLYCON
int __init early_init_dt_scan_chosen_stdout(void) int __init early_init_dt_scan_chosen_stdout(void)
@ -1120,6 +1146,7 @@ int __init early_init_dt_scan_chosen(unsigned long node, const char *uname,
early_init_dt_check_for_initrd(node); early_init_dt_check_for_initrd(node);
early_init_dt_check_for_elfcorehdr(node); early_init_dt_check_for_elfcorehdr(node);
early_init_dt_check_for_usable_mem_range(node);
/* Retrieve command line */ /* Retrieve command line */
p = of_get_flat_dt_prop(node, "bootargs", &l); p = of_get_flat_dt_prop(node, "bootargs", &l);
@ -1253,6 +1280,9 @@ void __init early_init_dt_scan_nodes(void)
/* Setup memory, calling early_init_dt_add_memory_arch */ /* Setup memory, calling early_init_dt_add_memory_arch */
of_scan_flat_dt(early_init_dt_scan_memory, NULL); of_scan_flat_dt(early_init_dt_scan_memory, NULL);
/* Handle linux,usable-memory-range property */
memblock_cap_memory_range(cap_mem_addr, cap_mem_size);
} }
bool __init early_init_dt_scan(void *params) bool __init early_init_dt_scan(void *params)