1 /* !! 1 // SPDX-License-Identifier: GPL-2.0 2 * Nios2-specific parts of system setup !! 2 #ifdef CONFIG_MMU 3 * !! 3 #include "setup_mm.c" 4 * Copyright (C) 2010 Tobias Klauser <tklauser !! 4 #else 5 * Copyright (C) 2004 Microtronix Datacom Ltd. !! 5 #include "setup_no.c" 6 * Copyright (C) 2001 Vic Phillips <vic@microt << 7 * << 8 * This file is subject to the terms and condi << 9 * License. See the file "COPYING" in the main << 10 * for more details. << 11 */ << 12 << 13 #include <linux/export.h> << 14 #include <linux/kernel.h> << 15 #include <linux/mm.h> << 16 #include <linux/sched.h> << 17 #include <linux/sched/task.h> << 18 #include <linux/console.h> << 19 #include <linux/memblock.h> << 20 #include <linux/initrd.h> << 21 #include <linux/of_fdt.h> << 22 << 23 #include <asm/mmu_context.h> << 24 #include <asm/sections.h> << 25 #include <asm/setup.h> << 26 #include <asm/cpuinfo.h> << 27 << 28 unsigned long memory_start; << 29 EXPORT_SYMBOL(memory_start); << 30 << 31 unsigned long memory_end; << 32 EXPORT_SYMBOL(memory_end); << 33 << 34 static struct pt_regs fake_regs = { 0, 0, 0, 0 << 35 0, 0, << 36 0}; << 37 << 38 /* Copy a short hook instruction sequence to t << 39 static inline void copy_exception_handler(unsi << 40 { << 41 unsigned int start = (unsigned int) ex << 42 volatile unsigned int tmp = 0; << 43 << 44 if (start == addr) { << 45 /* The CPU exception address a << 46 return; << 47 } << 48 << 49 __asm__ __volatile__ ( << 50 "ldw %2,0(%0)\n" << 51 "stw %2,0(%1)\n" << 52 "ldw %2,4(%0)\n" << 53 "stw %2,4(%1)\n" << 54 "ldw %2,8(%0)\n" << 55 "stw %2,8(%1)\n" << 56 "flushd 0(%1)\n" << 57 "flushd 4(%1)\n" << 58 "flushd 8(%1)\n" << 59 "flushi %1\n" << 60 "addi %1,%1,4\n" << 61 "flushi %1\n" << 62 "addi %1,%1,4\n" << 63 "flushi %1\n" << 64 "flushp\n" << 65 : /* no output registers */ << 66 : "r" (start), "r" (addr), "r" << 67 : "memory" << 68 ); << 69 } << 70 << 71 /* Copy the fast TLB miss handler */ << 72 static inline void copy_fast_tlb_miss_handler( << 73 { << 74 unsigned int start = (unsigned int) fa << 75 unsigned int end = (unsigned int) fast << 76 volatile unsigned int tmp = 0; << 77 << 78 __asm__ __volatile__ ( << 79 "1:\n" << 80 " ldw %3,0(%0)\n" << 81 " stw %3,0(%1)\n" << 82 " flushd 0(%1)\n" << 83 " flushi %1\n" << 84 " flushp\n" << 85 " addi %0,%0,4\n" << 86 " addi %1,%1,4\n" << 87 " bne %0,%2,1b\n" << 88 : /* no output registers */ << 89 : "r" (start), "r" (addr), "r" << 90 : "memory" << 91 ); << 92 } << 93 << 94 /* << 95 * save args passed from u-boot, called from h << 96 * << 97 * @r4: NIOS magic << 98 * @r5: initrd start << 99 * @r6: initrd end or fdt << 100 * @r7: kernel command line << 101 */ << 102 asmlinkage void __init nios2_boot_init(unsigne << 103 unsigne << 104 { << 105 unsigned dtb_passed = 0; << 106 char cmdline_passed[COMMAND_LINE_SIZE] << 107 << 108 #if defined(CONFIG_NIOS2_PASS_CMDLINE) << 109 if (r4 == 0x534f494e) { /* r4 is magic << 110 #if defined(CONFIG_BLK_DEV_INITRD) << 111 if (r5) { /* initramfs */ << 112 initrd_start = r5; << 113 initrd_end = r6; << 114 } << 115 #endif /* CONFIG_BLK_DEV_INITRD */ << 116 dtb_passed = r6; << 117 << 118 if (r7) << 119 strscpy(cmdline_passed << 120 } << 121 #endif 6 #endif 122 7 123 early_init_devtree((void *)dtb_passed) !! 8 #if IS_ENABLED(CONFIG_INPUT_M68K_BEEP) 124 !! 9 void (*mach_beep)(unsigned int, unsigned int); 125 #ifndef CONFIG_CMDLINE_FORCE !! 10 EXPORT_SYMBOL(mach_beep); 126 if (cmdline_passed[0]) << 127 strscpy(boot_command_line, cmd << 128 #ifdef CONFIG_NIOS2_CMDLINE_IGNORE_DTB << 129 else << 130 strscpy(boot_command_line, CON << 131 #endif 11 #endif 132 #endif << 133 << 134 parse_early_param(); << 135 } << 136 << 137 static void __init find_limits(unsigned long * << 138 unsigned long * << 139 { << 140 *max_low = PFN_DOWN(memblock_get_curre << 141 *min = PFN_UP(memblock_start_of_DRAM() << 142 *max_high = PFN_DOWN(memblock_end_of_D << 143 } << 144 << 145 void __init setup_arch(char **cmdline_p) << 146 { << 147 console_verbose(); << 148 << 149 memory_start = memblock_start_of_DRAM( << 150 memory_end = memblock_end_of_DRAM(); << 151 << 152 setup_initial_init_mm(_stext, _etext, << 153 init_task.thread.kregs = &fake_regs; << 154 << 155 /* Keep a copy of command line */ << 156 *cmdline_p = boot_command_line; << 157 << 158 find_limits(&min_low_pfn, &max_low_pfn << 159 max_mapnr = max_low_pfn; << 160 << 161 memblock_reserve(__pa_symbol(_stext), << 162 #ifdef CONFIG_BLK_DEV_INITRD << 163 if (initrd_start) { << 164 memblock_reserve(virt_to_phys( << 165 initrd_end - i << 166 } << 167 #endif /* CONFIG_BLK_DEV_INITRD */ << 168 << 169 early_init_fdt_reserve_self(); << 170 early_init_fdt_scan_reserved_mem(); << 171 << 172 unflatten_and_copy_device_tree(); << 173 << 174 setup_cpuinfo(); << 175 << 176 copy_exception_handler(cpuinfo.excepti << 177 << 178 mmu_init(); << 179 << 180 copy_fast_tlb_miss_handler(cpuinfo.fas << 181 << 182 /* << 183 * Initialize MMU context handling her << 184 * needed for this. << 185 */ << 186 mmu_context_init(); << 187 << 188 /* << 189 * get kmalloc into gear << 190 */ << 191 paging_init(); << 192 } << 193 12
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.