--- zzzz-none-000/linux-3.10.107/arch/mips/kernel/setup.c 2017-06-27 09:49:32.000000000 +0000 +++ vr9-7490-729/linux-3.10.107/arch/mips/kernel/setup.c 2021-11-10 11:53:54.000000000 +0000 @@ -9,6 +9,7 @@ * Copyright (C) 1996 Stoned Elipot * Copyright (C) 1999 Silicon Graphics, Inc. * Copyright (C) 2000, 2001, 2002, 2007 Maciej W. Rozycki + * Copyright (C) 2013 AVM GmbH */ #include #include @@ -24,6 +25,9 @@ #include #include #include +#include +#include +#include #include #include @@ -34,6 +38,14 @@ #include #include #include +#if defined(CONFIG_AVM_ENHANCED) +#include +#include +#endif/*--- #if defined(CONFIG_AVM_ENHANCED) ---*/ + +#ifdef CONFIG_LANTIQ +#include +#endif struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly; @@ -164,6 +176,9 @@ case BOOT_MEM_ROM_DATA: printk(KERN_CONT "(ROM data)\n"); break; + case BOOT_MEM_BOOTLOADER: + printk(KERN_CONT "(bootloader)\n"); + break; case BOOT_MEM_RESERVED: printk(KERN_CONT "(reserved)\n"); break; @@ -552,6 +567,52 @@ add_memory_region(mem, size, type); } +#ifdef CONFIG_KEXEC +static inline unsigned long long get_total_mem(void) +{ + unsigned long long total; + + total = max_pfn - min_low_pfn; + return total << PAGE_SHIFT; +} + +static void __init mips_parse_crashkernel(void) +{ + unsigned long long total_mem; + unsigned long long crash_size, crash_base; + int ret; + + total_mem = get_total_mem(); + ret = parse_crashkernel(boot_command_line, total_mem, + &crash_size, &crash_base); + if (ret != 0 || crash_size <= 0) + return; + + crashk_res.start = crash_base; + crashk_res.end = crash_base + crash_size - 1; +} + +static void __init request_crashkernel(struct resource *res) +{ + int ret; + + ret = request_resource(res, &crashk_res); + if (!ret) + pr_info("Reserving %ldMB of memory at %ldMB for crashkernel\n", + (unsigned long)((crashk_res.end - + crashk_res.start + 1) >> 20), + (unsigned long)(crashk_res.start >> 20)); +} +#else /* !defined(CONFIG_KEXEC) */ +static void __init mips_parse_crashkernel(void) +{ +} + +static void __init request_crashkernel(struct resource *res) +{ +} +#endif /* !defined(CONFIG_KEXEC) */ + static void __init arch_mem_init(char **cmdline_p) { extern void plat_mem_setup(void); @@ -608,66 +669,52 @@ BOOTMEM_DEFAULT); } #endif + + mips_parse_crashkernel(); #ifdef CONFIG_KEXEC if (crashk_res.start != crashk_res.end) reserve_bootmem(crashk_res.start, crashk_res.end - crashk_res.start + 1, BOOTMEM_DEFAULT); #endif + device_tree_init(); + unflatten_device_tree(); + sparse_init(); plat_swiotlb_setup(); paging_init(); } -#ifdef CONFIG_KEXEC -static inline unsigned long long get_total_mem(void) -{ - unsigned long long total; - - total = max_pfn - min_low_pfn; - return total << PAGE_SHIFT; -} - -static void __init mips_parse_crashkernel(void) -{ - unsigned long long total_mem; - unsigned long long crash_size, crash_base; - int ret; - - total_mem = get_total_mem(); - ret = parse_crashkernel(boot_command_line, total_mem, - &crash_size, &crash_base); - if (ret != 0 || crash_size <= 0) - return; - - crashk_res.start = crash_base; - crashk_res.end = crash_base + crash_size - 1; -} - -static void __init request_crashkernel(struct resource *res) -{ - int ret; - - ret = request_resource(res, &crashk_res); - if (!ret) - pr_info("Reserving %ldMB of memory at %ldMB for crashkernel\n", - (unsigned long)((crashk_res.end - - crashk_res.start + 1) >> 20), - (unsigned long)(crashk_res.start >> 20)); -} -#else /* !defined(CONFIG_KEXEC) */ -static void __init mips_parse_crashkernel(void) +#if defined(CONFIG_MIPS_VPE_LOADER) +static void __init avm_reserve_bootmem_mips_vpe_loader(void) { + extern struct resource *ar9vr9_alloc_c55_code(unsigned long start, + unsigned long end); + struct resource *pc55req; + + pc55req = ar9vr9_alloc_c55_code(res->start, res->end); + if(pc55req) { + request_resource(res, pc55req); + /*--- reserved memory for all time: ---*/ + if(reserve_bootmem(pc55req->start, + pc55req->end - pc55req->start + 1, + BOOTMEM_DEFAULT)) { + printk(KERN_ERR "[c55-alloc] reserve memory for " + "module-load failed (start 0x%x end 0x%x)\n", + pc55req->start, pc55req->end); + } + } } - -static void __init request_crashkernel(struct resource *res) +#else +static void __init avm_reserve_bootmem_mips_vpe_loader(void) { } -#endif /* !defined(CONFIG_KEXEC) */ +#endif /*--- #if defined(CONFIG_MIPS_VPE_LOADER) ---*/ static void __init resource_init(void) { + int avm_bootmem_init_done = 0; int i; if (UNCAC_BASE != IO_BASE) @@ -678,11 +725,6 @@ data_resource.start = __pa_symbol(&_etext); data_resource.end = __pa_symbol(&_edata) - 1; - /* - * Request address space for all standard RAM. - */ - mips_parse_crashkernel(); - for (i = 0; i < boot_mem_map.nr_map; i++) { struct resource *res; unsigned long start, end; @@ -701,6 +743,9 @@ case BOOT_MEM_ROM_DATA: res->name = "System RAM"; break; + case BOOT_MEM_BOOTLOADER: + res->name = "bootloader"; + break; case BOOT_MEM_RESERVED: default: res->name = "reserved"; @@ -720,14 +765,43 @@ request_resource(res, &code_resource); request_resource(res, &data_resource); request_crashkernel(res); + + if (!avm_bootmem_init_done) { +#if defined(CONFIG_AVM_ENHANCED) + module_alloc_bootmem_init(res); +#endif/*--- #if defined(CONFIG_AVM_ENHANCED) ---*/ + avm_reserve_bootmem_mips_vpe_loader(); +#if defined(CONFIG_LANTIQ) /*--- bei Atheros nicht notwendig ---*/ + /*--- reserve memory for rebootstring ---*/ + if(reserve_bootmem(CPHYSADDR(AVM_REBOOT_STRING_LOCATION), + AVM_REBOOT_STRING_SIZE, + BOOTMEM_DEFAULT)) { + printk(KERN_ERR "[%s] reserve memory for rebootstring failed (start 0x%x end 0x%x)\n", __func__, + CPHYSADDR(AVM_REBOOT_STRING_LOCATION), + CPHYSADDR(AVM_REBOOT_STRING_LOCATION) + AVM_REBOOT_STRING_SIZE); + } +#endif + avm_bootmem_init_done = 1; + } } } void __init setup_arch(char **cmdline_p) { + extern void plat_device_tree_setup(void); + cpu_probe(); prom_init(); +#ifdef CONFIG_AVM_ENHANCED + init_dsp(); /* initialize DSP register cpu0 */ + write_c0_errorepc(0); +#endif + + init_avm_kernel_config(); + + plat_device_tree_setup(); + #ifdef CONFIG_EARLY_PRINTK setup_early_printk(); #endif @@ -752,6 +826,9 @@ unsigned long kernelsp[NR_CPUS]; unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3; +#if defined(CONFIG_NMI_ARBITER_WORKAROUND) +EXPORT_SYMBOL(kernelsp); +#endif #ifdef CONFIG_DEBUG_FS struct dentry *mips_debugfs_dir;