
commit 7a1be318f5795cb66fa0dc86b3ace427fe68057f upstream On ARM, setting up the linear region is tricky, given the constraints around placement and alignment of the memblocks, and how the kernel itself as well as the DT are placed in physical memory. Let's simplify matters a bit, by moving the device tree mapping to the top of the address space, right between the end of the vmalloc region and the start of the the fixmap region, and create a read-only mapping for it that is independent of the size of the linear region, and how it is organized. Since this region was formerly used as a guard region, which will now be populated fully on LPAE builds by this read-only mapping (which will still be able to function as a guard region for stray writes), bump the start of the [underutilized] fixmap region by 512 KB as well, to ensure that there is always a proper guard region here. Doing so still leaves ample room for the fixmap space, even with NR_CPUS set to its maximum value of 32. Tested-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Nicolas Pitre <nico@fluxnic.net> Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
67 lines
1.8 KiB
C
67 lines
1.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_FIXMAP_H
|
|
#define _ASM_FIXMAP_H
|
|
|
|
#define FIXADDR_START 0xffc80000UL
|
|
#define FIXADDR_END 0xfff00000UL
|
|
#define FIXADDR_TOP (FIXADDR_END - PAGE_SIZE)
|
|
|
|
#include <linux/pgtable.h>
|
|
#include <asm/kmap_types.h>
|
|
|
|
enum fixed_addresses {
|
|
FIX_EARLYCON_MEM_BASE,
|
|
__end_of_permanent_fixed_addresses,
|
|
|
|
FIX_KMAP_BEGIN = __end_of_permanent_fixed_addresses,
|
|
FIX_KMAP_END = FIX_KMAP_BEGIN + (KM_TYPE_NR * NR_CPUS) - 1,
|
|
|
|
/* Support writing RO kernel text via kprobes, jump labels, etc. */
|
|
FIX_TEXT_POKE0,
|
|
FIX_TEXT_POKE1,
|
|
|
|
__end_of_fixmap_region,
|
|
|
|
/*
|
|
* Share the kmap() region with early_ioremap(): this is guaranteed
|
|
* not to clash since early_ioremap() is only available before
|
|
* paging_init(), and kmap() only after.
|
|
*/
|
|
#define NR_FIX_BTMAPS 32
|
|
#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_early_ioremap_region
|
|
};
|
|
|
|
static const enum fixed_addresses __end_of_fixed_addresses =
|
|
__end_of_fixmap_region > __end_of_early_ioremap_region ?
|
|
__end_of_fixmap_region : __end_of_early_ioremap_region;
|
|
|
|
#define FIXMAP_PAGE_COMMON (L_PTE_YOUNG | L_PTE_PRESENT | L_PTE_XN | L_PTE_DIRTY)
|
|
|
|
#define FIXMAP_PAGE_NORMAL (pgprot_kernel | L_PTE_XN)
|
|
#define FIXMAP_PAGE_RO (FIXMAP_PAGE_NORMAL | L_PTE_RDONLY)
|
|
|
|
/* Used by set_fixmap_(io|nocache), both meant for mapping a device */
|
|
#define FIXMAP_PAGE_IO (FIXMAP_PAGE_COMMON | L_PTE_MT_DEV_SHARED | L_PTE_SHARED)
|
|
#define FIXMAP_PAGE_NOCACHE FIXMAP_PAGE_IO
|
|
|
|
#define __early_set_fixmap __set_fixmap
|
|
|
|
#ifdef CONFIG_MMU
|
|
|
|
void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot);
|
|
void __init early_fixmap_init(void);
|
|
|
|
#include <asm-generic/fixmap.h>
|
|
|
|
#else
|
|
|
|
static inline void early_fixmap_init(void) { }
|
|
|
|
#endif
|
|
#endif
|