powerpc/mm: Allocate static page tables for fixmap
Allocate static page tables for the fixmap area. This allows setting mappings through page tables before memblock is ready. That's needed to use early_ioremap() early and to use standard page mappings with fixmap. Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/4f4b1412d34de6801b8e925cb88fc69d056ff536.1589866984.git.christophe.leroy@csgroup.eu
This commit is contained in:
Родитель
4b19f96a81
Коммит
925ac141d1
|
@ -86,6 +86,10 @@ enum fixed_addresses {
|
||||||
#define __FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
#define __FIXADDR_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
|
||||||
#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
|
#define FIXADDR_START (FIXADDR_TOP - __FIXADDR_SIZE)
|
||||||
|
|
||||||
|
#define FIXMAP_ALIGNED_SIZE (ALIGN(FIXADDR_TOP, PGDIR_SIZE) - \
|
||||||
|
ALIGN_DOWN(FIXADDR_START, PGDIR_SIZE))
|
||||||
|
#define FIXMAP_PTE_SIZE (FIXMAP_ALIGNED_SIZE / PGDIR_SIZE * PTE_TABLE_SIZE)
|
||||||
|
|
||||||
#define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_NCG
|
#define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_NCG
|
||||||
#define FIXMAP_PAGE_IO PAGE_KERNEL_NCG
|
#define FIXMAP_PAGE_IO PAGE_KERNEL_NCG
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ notrace void __init machine_init(u64 dt_ptr)
|
||||||
/* Configure static keys first, now that we're relocated. */
|
/* Configure static keys first, now that we're relocated. */
|
||||||
setup_feature_keys();
|
setup_feature_keys();
|
||||||
|
|
||||||
early_ioremap_setup();
|
early_ioremap_init();
|
||||||
|
|
||||||
/* Enable early debugging if any specified (see udbg.h) */
|
/* Enable early debugging if any specified (see udbg.h) */
|
||||||
udbg_early_init();
|
udbg_early_init();
|
||||||
|
|
|
@ -29,11 +29,27 @@
|
||||||
#include <asm/fixmap.h>
|
#include <asm/fixmap.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
#include <asm/early_ioremap.h>
|
||||||
|
|
||||||
#include <mm/mmu_decl.h>
|
#include <mm/mmu_decl.h>
|
||||||
|
|
||||||
extern char etext[], _stext[], _sinittext[], _einittext[];
|
extern char etext[], _stext[], _sinittext[], _einittext[];
|
||||||
|
|
||||||
|
static u8 early_fixmap_pagetable[FIXMAP_PTE_SIZE] __page_aligned_data;
|
||||||
|
|
||||||
|
notrace void __init early_ioremap_init(void)
|
||||||
|
{
|
||||||
|
unsigned long addr = ALIGN_DOWN(FIXADDR_START, PGDIR_SIZE);
|
||||||
|
pte_t *ptep = (pte_t *)early_fixmap_pagetable;
|
||||||
|
pmd_t *pmdp = pmd_ptr_k(addr);
|
||||||
|
|
||||||
|
for (; (s32)(FIXADDR_TOP - addr) > 0;
|
||||||
|
addr += PGDIR_SIZE, ptep += PTRS_PER_PTE, pmdp++)
|
||||||
|
pmd_populate_kernel(&init_mm, pmdp, ptep);
|
||||||
|
|
||||||
|
early_ioremap_setup();
|
||||||
|
}
|
||||||
|
|
||||||
static void __init *early_alloc_pgtable(unsigned long size)
|
static void __init *early_alloc_pgtable(unsigned long size)
|
||||||
{
|
{
|
||||||
void *ptr = memblock_alloc(size, size);
|
void *ptr = memblock_alloc(size, size);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче