RISC-V: Fixmap support and MM cleanups
authorPalmer Dabbelt <palmer@sifive.com>
Mon, 4 Mar 2019 19:41:36 +0000 (11:41 -0800)
committerPalmer Dabbelt <palmer@sifive.com>
Mon, 4 Mar 2019 19:47:04 +0000 (11:47 -0800)
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.

1  2 
arch/riscv/kernel/setup.c
arch/riscv/kernel/smp.c

index 12a16df4d422f03823a9b90d1d5d76c92b62cbcd,cffe0b3caba42e356eeed4f430cf590878829193..ecb654f6a79ef105931a51950d520c1af845edff
@@@ -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");
index ca99f0fb49b169e3b0d1b02625e8e25de747052d,246635eac7bb5cd4652f4551007a642f37935836..0c41d07ec281e4a6c94e7a53b975c66ac2c44e49
@@@ -36,15 -36,6 +36,15 @@@ enum ipi_message_type 
        IPI_MAX
  };
  
-       cpuid_to_hartid_map(0) = boot_cpu_hartid;
 +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;
 +}
 +
  /* A collection of single bit ipi messages.  */
  static struct {
        unsigned long stats[IPI_MAX] ____cacheline_aligned;