Merge tag 'riscv-for-linus-5.8-mw1' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / arch / riscv / mm / init.c
index 736de6c..f4adb36 100644 (file)
@@ -17,8 +17,9 @@
 #include <asm/fixmap.h>
 #include <asm/tlbflush.h>
 #include <asm/sections.h>
-#include <asm/pgtable.h>
+#include <asm/soc.h>
 #include <asm/io.h>
+#include <asm/ptdump.h>
 
 #include "../kernel/head.h"
 
@@ -39,7 +40,7 @@ static void __init zone_sizes_init(void)
 #endif
        max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
 
-       free_area_init_nodes(max_zone_pfns);
+       free_area_init(max_zone_pfns);
 }
 
 static void setup_zero_page(void)
@@ -234,12 +235,12 @@ static void __init create_pte_mapping(pte_t *ptep,
                                      uintptr_t va, phys_addr_t pa,
                                      phys_addr_t sz, pgprot_t prot)
 {
-       uintptr_t pte_index = pte_index(va);
+       uintptr_t pte_idx = pte_index(va);
 
        BUG_ON(sz != PAGE_SIZE);
 
-       if (pte_none(ptep[pte_index]))
-               ptep[pte_index] = pfn_pte(PFN_DOWN(pa), prot);
+       if (pte_none(ptep[pte_idx]))
+               ptep[pte_idx] = pfn_pte(PFN_DOWN(pa), prot);
 }
 
 #ifndef __PAGETABLE_PMD_FOLDED
@@ -282,21 +283,21 @@ static void __init create_pmd_mapping(pmd_t *pmdp,
 {
        pte_t *ptep;
        phys_addr_t pte_phys;
-       uintptr_t pmd_index = pmd_index(va);
+       uintptr_t pmd_idx = pmd_index(va);
 
        if (sz == PMD_SIZE) {
-               if (pmd_none(pmdp[pmd_index]))
-                       pmdp[pmd_index] = pfn_pmd(PFN_DOWN(pa), prot);
+               if (pmd_none(pmdp[pmd_idx]))
+                       pmdp[pmd_idx] = pfn_pmd(PFN_DOWN(pa), prot);
                return;
        }
 
-       if (pmd_none(pmdp[pmd_index])) {
+       if (pmd_none(pmdp[pmd_idx])) {
                pte_phys = alloc_pte(va);
-               pmdp[pmd_index] = pfn_pmd(PFN_DOWN(pte_phys), PAGE_TABLE);
+               pmdp[pmd_idx] = pfn_pmd(PFN_DOWN(pte_phys), PAGE_TABLE);
                ptep = get_pte_virt(pte_phys);
                memset(ptep, 0, PAGE_SIZE);
        } else {
-               pte_phys = PFN_PHYS(_pmd_pfn(pmdp[pmd_index]));
+               pte_phys = PFN_PHYS(_pmd_pfn(pmdp[pmd_idx]));
                ptep = get_pte_virt(pte_phys);
        }
 
@@ -324,21 +325,21 @@ static void __init create_pgd_mapping(pgd_t *pgdp,
 {
        pgd_next_t *nextp;
        phys_addr_t next_phys;
-       uintptr_t pgd_index = pgd_index(va);
+       uintptr_t pgd_idx = pgd_index(va);
 
        if (sz == PGDIR_SIZE) {
-               if (pgd_val(pgdp[pgd_index]) == 0)
-                       pgdp[pgd_index] = pfn_pgd(PFN_DOWN(pa), prot);
+               if (pgd_val(pgdp[pgd_idx]) == 0)
+                       pgdp[pgd_idx] = pfn_pgd(PFN_DOWN(pa), prot);
                return;
        }
 
-       if (pgd_val(pgdp[pgd_index]) == 0) {
+       if (pgd_val(pgdp[pgd_idx]) == 0) {
                next_phys = alloc_pgd_next(va);
-               pgdp[pgd_index] = pfn_pgd(PFN_DOWN(next_phys), PAGE_TABLE);
+               pgdp[pgd_idx] = pfn_pgd(PFN_DOWN(next_phys), PAGE_TABLE);
                nextp = get_pgd_next_virt(next_phys);
                memset(nextp, 0, PAGE_SIZE);
        } else {
-               next_phys = PFN_PHYS(_pgd_pfn(pgdp[pgd_index]));
+               next_phys = PFN_PHYS(_pgd_pfn(pgdp[pgd_idx]));
                nextp = get_pgd_next_virt(next_phys);
        }
 
@@ -479,21 +480,18 @@ static void __init setup_vm_final(void)
        csr_write(CSR_SATP, PFN_DOWN(__pa_symbol(swapper_pg_dir)) | SATP_MODE);
        local_flush_tlb_all();
 }
-
-void free_initmem(void)
-{
-       unsigned long init_begin = (unsigned long)__init_begin;
-       unsigned long init_end = (unsigned long)__init_end;
-
-       /* Make the region as non-execuatble. */
-       set_memory_nx(init_begin, (init_end - init_begin) >> PAGE_SHIFT);
-       free_initmem_default(POISON_FREE_INITMEM);
-}
-
 #else
 asmlinkage void __init setup_vm(uintptr_t dtb_pa)
 {
+#ifdef CONFIG_BUILTIN_DTB
+       dtb_early_va = soc_lookup_builtin_dtb();
+       if (!dtb_early_va) {
+               /* Fallback to first available DTS */
+               dtb_early_va = (void *) __dtb_start;
+       }
+#else
        dtb_early_va = (void *)dtb_pa;
+#endif
 }
 
 static inline void setup_vm_final(void)
@@ -514,6 +512,8 @@ void mark_rodata_ro(void)
        set_memory_ro(rodata_start, (data_start - rodata_start) >> PAGE_SHIFT);
        set_memory_nx(rodata_start, (data_start - rodata_start) >> PAGE_SHIFT);
        set_memory_nx(data_start, (max_low - data_start) >> PAGE_SHIFT);
+
+       debug_checkwx();
 }
 #endif