Revert to Fedora kernel-2.6.17-1.2187_FC5 patched with vs2.0.2.1; there are too many...
[linux-2.6.git] / arch / powerpc / kernel / setup_64.c
index fd1785e..4467c49 100644 (file)
@@ -12,6 +12,7 @@
 
 #undef DEBUG
 
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/string.h>
 #include <linux/sched.h>
@@ -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;