X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fpowerpc%2Fkernel%2Fsetup_64.c;h=4467c49903b64011884337a47445eb1ee9044d0f;hb=9464c7cf61b9433057924c36e6e02f303a00e768;hp=fd1785e4c9bbeec4607af81a10e88a95bc7ee722;hpb=41689045f6a3cbe0550e1d34e9cc20d2e8c432ba;p=linux-2.6.git diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index fd1785e4c..4467c4990 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c @@ -12,6 +12,7 @@ #undef DEBUG +#include #include #include #include @@ -99,6 +100,12 @@ unsigned long SYSRQ_KEY; #endif /* CONFIG_MAGIC_SYSRQ */ +static int ppc64_panic_event(struct notifier_block *, unsigned long, void *); +static struct notifier_block ppc64_panic_block = { + .notifier_call = ppc64_panic_event, + .priority = INT_MIN /* may not return; must be done last */ +}; + #ifdef CONFIG_SMP static int smt_enabled_cmdline; @@ -148,13 +155,6 @@ early_param("smt-enabled", early_smt_enabled); #define check_smt_enabled() #endif /* CONFIG_SMP */ -/* Put the paca pointer into r13 and SPRG3 */ -void __init setup_paca(int cpu) -{ - local_paca = &paca[cpu]; - mtspr(SPRN_SPRG3, local_paca); -} - /* * Early initialization entry point. This is called by head.S * with MMU translation disabled. We rely on the "feature" of @@ -176,9 +176,6 @@ void __init setup_paca(int cpu) void __init early_setup(unsigned long dt_ptr) { - /* Assume we're on cpu 0 for now. Don't write to the paca yet! */ - setup_paca(0); - /* Enable early debugging if any specified (see udbg.h) */ udbg_early_init(); @@ -192,7 +189,7 @@ void __init early_setup(unsigned long dt_ptr) early_init_devtree(__va(dt_ptr)); /* Now we know the logical id of our boot cpu, setup the paca. */ - setup_paca(boot_cpuid); + setup_boot_paca(); /* Fix up paca fields required for the boot cpu */ get_paca()->cpu_start = 1; @@ -202,7 +199,9 @@ void __init early_setup(unsigned long dt_ptr) /* Probe the machine type */ probe_machine(); - setup_kdump_trampoline(); +#ifdef CONFIG_CRASH_DUMP + kdump_setup(); +#endif DBG("Found, Initializing memory management...\n"); @@ -354,22 +353,30 @@ void __init setup_system(void) { DBG(" -> setup_system()\n"); +#ifdef CONFIG_KEXEC + kdump_move_device_tree(); +#endif /* * Unflatten the device-tree passed by prom_init or kexec */ unflatten_device_tree(); +#ifdef CONFIG_KEXEC + kexec_setup(); /* requires unflattened device tree. */ +#endif + /* * Fill the ppc64_caches & systemcfg structures with informations - * retrieved from the device-tree. + * retrieved from the device-tree. Need to be called before + * finish_device_tree() since the later requires some of the + * informations filled up here to properly parse the interrupt + * tree. + * It also sets up the cache line sizes which allows to call + * routines like flush_icache_range (used by the hash init + * later on). */ initialize_cache_info(); - /* - * Initialize irq remapping subsystem - */ - irq_early_init(); - #ifdef CONFIG_PPC_RTAS /* * Initialize RTAS if available @@ -396,6 +403,12 @@ void __init setup_system(void) */ find_legacy_serial_ports(); + /* + * "Finish" the device-tree, that is do the actual parsing of + * some of the properties like the interrupt map + */ + finish_device_tree(); + /* * Initialize xmon */ @@ -407,8 +420,10 @@ void __init setup_system(void) */ register_early_udbg_console(); - if (do_early_xmon) - debugger(NULL); + /* Save unparsed command line copy for /proc/cmdline */ + strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE); + + parse_early_param(); check_smt_enabled(); smp_setup_cpu_maps(); @@ -424,6 +439,8 @@ void __init setup_system(void) printk("-----------------------------------------------------\n"); printk("ppc64_pft_size = 0x%lx\n", ppc64_pft_size); + printk("ppc64_interrupt_controller = 0x%ld\n", + ppc64_interrupt_controller); printk("physicalMemorySize = 0x%lx\n", lmb_phys_mem_size()); printk("ppc64_caches.dcache_line_size = 0x%x\n", ppc64_caches.dline_size); @@ -439,6 +456,13 @@ void __init setup_system(void) DBG(" <- setup_system()\n"); } +static int ppc64_panic_event(struct notifier_block *this, + unsigned long event, void *ptr) +{ + ppc_md.panic((char *)ptr); /* May not return */ + return NOTIFY_DONE; +} + #ifdef CONFIG_IRQSTACKS static void __init irqstack_early_init(void) { @@ -493,6 +517,8 @@ static void __init emergency_stack_init(void) */ void __init setup_arch(char **cmdline_p) { + extern void do_init_bootmem(void); + ppc64_boot_msg(0x12, "Setup Arch"); *cmdline_p = cmd_line; @@ -509,7 +535,8 @@ void __init setup_arch(char **cmdline_p) panic_timeout = 180; if (ppc_md.panic) - setup_panic(); + atomic_notifier_chain_register(&panic_notifier_list, + &ppc64_panic_block); init_mm.start_code = PAGE_OFFSET; init_mm.end_code = (unsigned long) _etext;