diff options
Diffstat (limited to 'arch/riscv/mm/init.c')
| -rw-r--r-- | arch/riscv/mm/init.c | 60 | 
1 files changed, 49 insertions, 11 deletions
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c index 573463d1c799..69f6678db7f3 100644 --- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c @@ -26,6 +26,7 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]  EXPORT_SYMBOL(empty_zero_page);  extern char _start[]; +void *dtb_early_va;  static void __init zone_sizes_init(void)  { @@ -40,11 +41,42 @@ static void __init zone_sizes_init(void)  	free_area_init_nodes(max_zone_pfns);  } -void setup_zero_page(void) +static void setup_zero_page(void)  {  	memset((void *)empty_zero_page, 0, PAGE_SIZE);  } +#ifdef CONFIG_DEBUG_VM +static inline void print_mlk(char *name, unsigned long b, unsigned long t) +{ +	pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld kB)\n", name, b, t, +		  (((t) - (b)) >> 10)); +} + +static inline void print_mlm(char *name, unsigned long b, unsigned long t) +{ +	pr_notice("%12s : 0x%08lx - 0x%08lx   (%4ld MB)\n", name, b, t, +		  (((t) - (b)) >> 20)); +} + +static void print_vm_layout(void) +{ +	pr_notice("Virtual kernel memory layout:\n"); +	print_mlk("fixmap", (unsigned long)FIXADDR_START, +		  (unsigned long)FIXADDR_TOP); +	print_mlm("pci io", (unsigned long)PCI_IO_START, +		  (unsigned long)PCI_IO_END); +	print_mlm("vmemmap", (unsigned long)VMEMMAP_START, +		  (unsigned long)VMEMMAP_END); +	print_mlm("vmalloc", (unsigned long)VMALLOC_START, +		  (unsigned long)VMALLOC_END); +	print_mlm("lowmem", (unsigned long)PAGE_OFFSET, +		  (unsigned long)high_memory); +} +#else +static void print_vm_layout(void) { } +#endif /* CONFIG_DEBUG_VM */ +  void __init mem_init(void)  {  #ifdef CONFIG_FLATMEM @@ -55,6 +87,7 @@ void __init mem_init(void)  	memblock_free_all();  	mem_init_print_info(NULL); +	print_vm_layout();  }  #ifdef CONFIG_BLK_DEV_INITRD @@ -142,12 +175,12 @@ void __init setup_bootmem(void)  	}  } +#ifdef CONFIG_MMU  unsigned long va_pa_offset;  EXPORT_SYMBOL(va_pa_offset);  unsigned long pfn_base;  EXPORT_SYMBOL(pfn_base); -void *dtb_early_va;  pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss;  pgd_t trampoline_pg_dir[PTRS_PER_PGD] __page_aligned_bss;  pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss; @@ -273,7 +306,6 @@ static void __init create_pmd_mapping(pmd_t *pmdp,  #define get_pgd_next_virt(__pa)	get_pmd_virt(__pa)  #define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot)	\  	create_pmd_mapping(__nextp, __va, __pa, __sz, __prot) -#define PTE_PARENT_SIZE		PMD_SIZE  #define fixmap_pgd_next		fixmap_pmd  #else  #define pgd_next_t		pte_t @@ -281,7 +313,6 @@ static void __init create_pmd_mapping(pmd_t *pmdp,  #define get_pgd_next_virt(__pa)	get_pte_virt(__pa)  #define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot)	\  	create_pte_mapping(__nextp, __va, __pa, __sz, __prot) -#define PTE_PARENT_SIZE		PGDIR_SIZE  #define fixmap_pgd_next		fixmap_pte  #endif @@ -314,14 +345,11 @@ static void __init create_pgd_mapping(pgd_t *pgdp,  static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)  { -	uintptr_t map_size = PAGE_SIZE; - -	/* Upgrade to PMD/PGDIR mappings whenever possible */ -	if (!(base & (PTE_PARENT_SIZE - 1)) && -	    !(size & (PTE_PARENT_SIZE - 1))) -		map_size = PTE_PARENT_SIZE; +	/* Upgrade to PMD_SIZE mappings whenever possible */ +	if ((base & (PMD_SIZE - 1)) || (size & (PMD_SIZE - 1))) +		return PAGE_SIZE; -	return map_size; +	return PMD_SIZE;  }  /* @@ -449,6 +477,16 @@ static void __init setup_vm_final(void)  	csr_write(CSR_SATP, PFN_DOWN(__pa(swapper_pg_dir)) | SATP_MODE);  	local_flush_tlb_all();  } +#else +asmlinkage void __init setup_vm(uintptr_t dtb_pa) +{ +	dtb_early_va = (void *)dtb_pa; +} + +static inline void setup_vm_final(void) +{ +} +#endif /* CONFIG_MMU */  void __init paging_init(void)  {  |