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: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
parent
92980405f3
commit
3dec0fe48a
@ -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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user