mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 05:11:48 +00:00
61bd93ce80
Currently, the FDT blob needs to be in the same 512 MB region as the kernel, so that it can be mapped into the kernel virtual memory space very early on using a minimal set of statically allocated translation tables. Now that we have early fixmap support, we can relax this restriction, by moving the permanent FDT mapping to the fixmap region instead. This way, the FDT blob may be anywhere in memory. This also moves the vetting of the FDT to mmu.c, since the early init code in head.S does not handle mapping of the FDT anymore. At the same time, fix up some comments in head.S that have gone stale. Reviewed-by: Mark Rutland <mark.rutland@arm.com> Tested-by: Mark Rutland <mark.rutland@arm.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
89 lines
2.4 KiB
C
89 lines
2.4 KiB
C
/*
|
|
* fixmap.h: compile-time virtual memory allocation
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Copyright (C) 1998 Ingo Molnar
|
|
* Copyright (C) 2013 Mark Salter <msalter@redhat.com>
|
|
*
|
|
* Adapted from arch/x86_64 version.
|
|
*
|
|
*/
|
|
|
|
#ifndef _ASM_ARM64_FIXMAP_H
|
|
#define _ASM_ARM64_FIXMAP_H
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#include <linux/kernel.h>
|
|
#include <asm/boot.h>
|
|
#include <asm/page.h>
|
|
|
|
/*
|
|
* Here we define all the compile-time 'special' virtual
|
|
* addresses. The point is to have a constant address at
|
|
* compile time, but to set the physical address only
|
|
* in the boot process.
|
|
*
|
|
* These 'compile-time allocated' memory buffers are
|
|
* page-sized. Use set_fixmap(idx,phys) to associate
|
|
* physical memory with fixmap indices.
|
|
*
|
|
*/
|
|
enum fixed_addresses {
|
|
FIX_HOLE,
|
|
|
|
/*
|
|
* Reserve a virtual window for the FDT that is 2 MB larger than the
|
|
* maximum supported size, and put it at the top of the fixmap region.
|
|
* The additional space ensures that any FDT that does not exceed
|
|
* MAX_FDT_SIZE can be mapped regardless of whether it crosses any
|
|
* 2 MB alignment boundaries.
|
|
*
|
|
* Keep this at the top so it remains 2 MB aligned.
|
|
*/
|
|
#define FIX_FDT_SIZE (MAX_FDT_SIZE + SZ_2M)
|
|
FIX_FDT_END,
|
|
FIX_FDT = FIX_FDT_END + FIX_FDT_SIZE / PAGE_SIZE - 1,
|
|
|
|
FIX_EARLYCON_MEM_BASE,
|
|
FIX_TEXT_POKE0,
|
|
__end_of_permanent_fixed_addresses,
|
|
|
|
/*
|
|
* Temporary boot-time mappings, used by early_ioremap(),
|
|
* before ioremap() is functional.
|
|
*/
|
|
#ifdef CONFIG_ARM64_64K_PAGES
|
|
#define NR_FIX_BTMAPS 4
|
|
#else
|
|
#define NR_FIX_BTMAPS 64
|
|
#endif
|
|
#define FIX_BTMAPS_SLOTS 7
|
|
#define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
|
|
|
|
FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
|
|
FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
|
|
__end_of_fixed_addresses
|
|
};
|
|
|
|
#define FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
|
|
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
|
|
|
|
#define FIXMAP_PAGE_IO __pgprot(PROT_DEVICE_nGnRE)
|
|
|
|
void __init early_fixmap_init(void);
|
|
|
|
#define __early_set_fixmap __set_fixmap
|
|
|
|
#define __late_set_fixmap __set_fixmap
|
|
#define __late_clear_fixmap(idx) __set_fixmap((idx), 0, FIXMAP_PAGE_CLEAR)
|
|
|
|
extern void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot);
|
|
|
|
#include <asm-generic/fixmap.h>
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
#endif /* _ASM_ARM64_FIXMAP_H */
|