1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * linux/arch/m68k/mm/init.c 4 * 5 * Copyright (C) 1995 Hamish Macdonald 6 * 7 * Contains common initialization routines, specific init code moved 8 * to motorola.c and sun3mmu.c 9 */ 10 11 #include <linux/module.h> 12 #include <linux/signal.h> 13 #include <linux/sched.h> 14 #include <linux/mm.h> 15 #include <linux/swap.h> 16 #include <linux/kernel.h> 17 #include <linux/string.h> 18 #include <linux/types.h> 19 #include <linux/init.h> 20 #include <linux/memblock.h> 21 #include <linux/gfp.h> 22 23 #include <asm/setup.h> 24 #include <linux/uaccess.h> 25 #include <asm/page.h> 26 #include <asm/pgalloc.h> 27 #include <asm/traps.h> 28 #include <asm/machdep.h> 29 #include <asm/io.h> 30 #ifdef CONFIG_ATARI 31 #include <asm/atari_stram.h> 32 #endif 33 #include <asm/sections.h> 34 #include <asm/tlb.h> 35 36 void __init arch_zone_limits_init(unsigned long *max_zone_pfns) 37 { 38 max_zone_pfns[ZONE_DMA] = PFN_DOWN(memblock_end_of_DRAM()); 39 } 40 41 #ifdef CONFIG_MMU 42 43 int m68k_virt_to_node_shift; 44 45 void __init m68k_setup_node(int node) 46 { 47 node_set_online(node); 48 } 49 50 #else /* CONFIG_MMU */ 51 52 /* 53 * paging_init() continues the virtual memory environment setup which 54 * was begun by the code in arch/head.S. 55 * The parameters are pointers to where to stick the starting and ending 56 * addresses of available kernel virtual memory. 57 */ 58 void __init paging_init(void) 59 { 60 /* 61 * Make sure start_mem is page aligned, otherwise bootmem and 62 * page_alloc get different views of the world. 63 */ 64 unsigned long end_mem = memory_end & PAGE_MASK; 65 66 high_memory = (void *) end_mem; 67 } 68 69 #endif /* CONFIG_MMU */ 70 71 void free_initmem(void) 72 { 73 #ifndef CONFIG_MMU_SUN3 74 free_initmem_default(-1); 75 #endif /* CONFIG_MMU_SUN3 */ 76 } 77 78 #if defined(CONFIG_MMU) && !defined(CONFIG_COLDFIRE) 79 #define VECTORS &vectors[0] 80 #else 81 #define VECTORS _ramvec 82 #endif 83 84 static inline void init_pointer_tables(void) 85 { 86 #if defined(CONFIG_MMU) && !defined(CONFIG_SUN3) && !defined(CONFIG_COLDFIRE) 87 int i, j; 88 89 /* insert pointer tables allocated so far into the tablelist */ 90 init_pointer_table(kernel_pg_dir, TABLE_PGD); 91 for (i = 0; i < PTRS_PER_PGD; i++) { 92 pud_t *pud = (pud_t *)&kernel_pg_dir[i]; 93 pmd_t *pmd_dir; 94 95 if (!pud_present(*pud)) 96 continue; 97 98 pmd_dir = (pmd_t *)pgd_page_vaddr(kernel_pg_dir[i]); 99 init_pointer_table(pmd_dir, TABLE_PMD); 100 101 for (j = 0; j < PTRS_PER_PMD; j++) { 102 pmd_t *pmd = &pmd_dir[j]; 103 pte_t *pte_dir; 104 105 if (!pmd_present(*pmd)) 106 continue; 107 108 pte_dir = (pte_t *)pmd_page_vaddr(*pmd); 109 init_pointer_table(pte_dir, TABLE_PTE); 110 } 111 } 112 #endif 113 } 114 115 void __init mem_init(void) 116 { 117 init_pointer_tables(); 118 } 119