Commit 3dec0fe4 authored by Catalin Marinas's avatar Catalin Marinas

arm64: Fix memblock current_limit with 64K pages and 48-bit VA

With 48-bit VA space, the 64K page configuration uses 3 levels instead
of 2 and PUD_SIZE != PMD_SIZE. Since with 64K pages we only cover
PMD_SIZE with the initial swapper_pg_dir populated in head.S, the
memblock current_limit needs to be set accordingly in map_mem() to avoid
allocating unmapped memory. The memblock current_limit is progressively
increased as more blocks are mapped.
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 92980405
...@@ -297,11 +297,15 @@ static void __init map_mem(void) ...@@ -297,11 +297,15 @@ static void __init map_mem(void)
* create_mapping requires puds, pmds and ptes to be allocated from * create_mapping requires puds, pmds and ptes to be allocated from
* memory addressable from the initial direct kernel mapping. * memory addressable from the initial direct kernel mapping.
* *
* The initial direct kernel mapping, located at swapper_pg_dir, * The initial direct kernel mapping, located at swapper_pg_dir, gives
* gives us PUD_SIZE memory starting from PHYS_OFFSET (which must be * us PUD_SIZE (4K pages) or PMD_SIZE (64K pages) memory starting from
* aligned to 2MB as per Documentation/arm64/booting.txt). * PHYS_OFFSET (which must be aligned to 2MB as per
* Documentation/arm64/booting.txt).
*/ */
limit = PHYS_OFFSET + PUD_SIZE; if (IS_ENABLED(CONFIG_ARM64_64K_PAGES))
limit = PHYS_OFFSET + PMD_SIZE;
else
limit = PHYS_OFFSET + PUD_SIZE;
memblock_set_current_limit(limit); memblock_set_current_limit(limit);
/* map all the memory banks */ /* map all the memory banks */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment