From: Palmer Dabbelt Date: Mon, 4 Mar 2019 19:41:36 +0000 (-0800) Subject: RISC-V: Fixmap support and MM cleanups X-Git-Tag: v5.1-rc1~129^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=13fd5de06514458eb320188b7a815d65696efd99;p=thirdparty%2Fkernel%2Flinux.git RISC-V: Fixmap support and MM cleanups This patchset does: 1. Moves MM related code from kernel/setup.c to mm/init.c 2. Implements compile-time fixed mappings Using fixed mappings, we get earlyprints even without SBI calls. For example, we can now use kernel parameter "earlycon=uart8250,mmio,0x10000000" to get early prints on QEMU virt machine without using SBI calls. The patchset is tested on QEMU virt machine. Palmer: It looks like some of the code movement here conflicted with the patches to move hartid handling around. As far as I can tell the only changed code was in smp_setup_processor_id(), and I've kept the one in smp.c. --- 13fd5de06514458eb320188b7a815d65696efd99 diff --cc arch/riscv/kernel/setup.c index 12a16df4d422f,cffe0b3caba42..ecb654f6a79ef --- a/arch/riscv/kernel/setup.c +++ b/arch/riscv/kernel/setup.c @@@ -61,86 -60,18 +60,9 @@@ EXPORT_SYMBOL(empty_zero_page) atomic_t hart_lottery; unsigned long boot_cpu_hartid; - #ifdef CONFIG_BLK_DEV_INITRD - static void __init setup_initrd(void) - { - unsigned long size; - - if (initrd_start >= initrd_end) { - pr_info("initrd not found or empty"); - goto disable; - } - if (__pa(initrd_end) > PFN_PHYS(max_low_pfn)) { - pr_err("initrd extends beyond end of memory"); - goto disable; - } - - size = initrd_end - initrd_start; - memblock_reserve(__pa(initrd_start), size); - initrd_below_start_ok = 1; - - pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n", - (void *)(initrd_start), size); - return; - disable: - pr_cont(" - disabling initrd\n"); - initrd_start = 0; - initrd_end = 0; - } - #endif /* CONFIG_BLK_DEV_INITRD */ - - pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss; - pgd_t trampoline_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); - - #ifndef __PAGETABLE_PMD_FOLDED - #define NUM_SWAPPER_PMDS ((uintptr_t)-PAGE_OFFSET >> PGDIR_SHIFT) - pmd_t swapper_pmd[PTRS_PER_PMD*((-PAGE_OFFSET)/PGDIR_SIZE)] __page_aligned_bss; - pmd_t trampoline_pmd[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); - #endif -unsigned long __cpuid_to_hartid_map[NR_CPUS] = { - [0 ... NR_CPUS-1] = INVALID_HARTID -}; -- - asmlinkage void __init setup_vm(void) -void __init smp_setup_processor_id(void) --{ - extern char _start; - uintptr_t i; - uintptr_t pa = (uintptr_t) &_start; - pgprot_t prot = __pgprot(pgprot_val(PAGE_KERNEL) | _PAGE_EXEC); - - va_pa_offset = PAGE_OFFSET - pa; - pfn_base = PFN_DOWN(pa); - - /* Sanity check alignment and size */ - BUG_ON((PAGE_OFFSET % PGDIR_SIZE) != 0); - BUG_ON((pa % (PAGE_SIZE * PTRS_PER_PTE)) != 0); - - #ifndef __PAGETABLE_PMD_FOLDED - trampoline_pg_dir[(PAGE_OFFSET >> PGDIR_SHIFT) % PTRS_PER_PGD] = - pfn_pgd(PFN_DOWN((uintptr_t)trampoline_pmd), - __pgprot(_PAGE_TABLE)); - trampoline_pmd[0] = pfn_pmd(PFN_DOWN(pa), prot); - - for (i = 0; i < (-PAGE_OFFSET)/PGDIR_SIZE; ++i) { - size_t o = (PAGE_OFFSET >> PGDIR_SHIFT) % PTRS_PER_PGD + i; - swapper_pg_dir[o] = - pfn_pgd(PFN_DOWN((uintptr_t)swapper_pmd) + i, - __pgprot(_PAGE_TABLE)); - } - for (i = 0; i < ARRAY_SIZE(swapper_pmd); i++) - swapper_pmd[i] = pfn_pmd(PFN_DOWN(pa + i * PMD_SIZE), prot); - #else - trampoline_pg_dir[(PAGE_OFFSET >> PGDIR_SHIFT) % PTRS_PER_PGD] = - pfn_pgd(PFN_DOWN(pa), prot); - - for (i = 0; i < (-PAGE_OFFSET)/PGDIR_SIZE; ++i) { - size_t o = (PAGE_OFFSET >> PGDIR_SHIFT) % PTRS_PER_PGD + i; - swapper_pg_dir[o] = - pfn_pgd(PFN_DOWN(pa + i * PGDIR_SIZE), prot); - } - #endif - cpuid_to_hartid_map(0) = boot_cpu_hartid; --} -- void __init parse_dtb(unsigned int hartid, void *dtb) { - if (!early_init_dt_scan(__va(dtb))) + if (early_init_dt_scan(__va(dtb))) return; pr_err("No DTB passed to the kernel\n"); diff --cc arch/riscv/kernel/smp.c index ca99f0fb49b16,246635eac7bb5..0c41d07ec281e --- a/arch/riscv/kernel/smp.c +++ b/arch/riscv/kernel/smp.c @@@ -36,15 -36,6 +36,15 @@@ enum ipi_message_type IPI_MAX }; +unsigned long __cpuid_to_hartid_map[NR_CPUS] = { + [0 ... NR_CPUS-1] = INVALID_HARTID +}; + +void __init smp_setup_processor_id(void) +{ - cpuid_to_hartid_map(0) = boot_cpu_hartid; ++ cpuid_to_hartid_map(0) = boot_cpu_hartid; +} + /* A collection of single bit ipi messages. */ static struct { unsigned long stats[IPI_MAX] ____cacheline_aligned;