#undef DEBUG
+#include <linux/config.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/sched.h>
#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;
#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
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();
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;
/* Probe the machine type */
probe_machine();
- setup_kdump_trampoline();
+#ifdef CONFIG_CRASH_DUMP
+ kdump_setup();
+#endif
DBG("Found, Initializing memory management...\n");
{
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
*/
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
*/
*/
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();
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);
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)
{
*/
void __init setup_arch(char **cmdline_p)
{
+ extern void do_init_bootmem(void);
+
ppc64_boot_msg(0x12, "Setup Arch");
*cmdline_p = cmd_line;
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;