X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fpowerpc%2Fkernel%2Fsetup-common.c;fp=arch%2Fpowerpc%2Fkernel%2Fsetup-common.c;h=be12041c0fc5404ab8b811050f45de883c225631;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=499c3861074f708e39cdd2ff9509d13c6938bb9c;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 499c38610..be12041c0 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -9,9 +9,7 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ - -#undef DEBUG - +#include #include #include #include @@ -20,13 +18,12 @@ #include #include #include -#include #include #include #include #include #include -#include +#include #include #include #include @@ -44,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -60,6 +56,8 @@ #include "setup.h" +#undef DEBUG + #ifdef DEBUG #include #define DBG(fmt...) udbg_printf(fmt) @@ -67,12 +65,10 @@ #define DBG(fmt...) #endif -/* The main machine-dep calls structure - */ -struct machdep_calls ppc_md; -EXPORT_SYMBOL(ppc_md); -struct machdep_calls *machine_id; -EXPORT_SYMBOL(machine_id); +#ifdef CONFIG_PPC_MULTIPLATFORM +int _machine = 0; +EXPORT_SYMBOL(_machine); +#endif unsigned long klimit = (unsigned long) _end; @@ -166,14 +162,14 @@ static int show_cpuinfo(struct seq_file *m, void *v) #if defined(CONFIG_SMP) && defined(CONFIG_PPC32) unsigned long bogosum = 0; int i; - for_each_online_cpu(i) - bogosum += loops_per_jiffy; + for (i = 0; i < NR_CPUS; ++i) + if (cpu_online(i)) + bogosum += loops_per_jiffy; seq_printf(m, "total bogomips\t: %lu.%02lu\n", bogosum/(500000/HZ), bogosum/(5000/HZ) % 100); #endif /* CONFIG_SMP && CONFIG_PPC32 */ seq_printf(m, "timebase\t: %lu\n", ppc_tb_freq); - if (ppc_md.name) - seq_printf(m, "platform\t: %s\n", ppc_md.name); + if (ppc_md.show_cpuinfo != NULL) ppc_md.show_cpuinfo(m); @@ -357,13 +353,12 @@ void __init check_for_initrd(void) * must be called before using this. * * While we're here, we may as well set the "physical" cpu ids in the paca. - * - * NOTE: This must match the parsing done in early_init_dt_scan_cpus. */ void __init smp_setup_cpu_maps(void) { struct device_node *dn = NULL; int cpu = 0; + int swap_cpuid = 0; while ((dn = of_find_node_by_type(dn, "cpu")) && cpu < NR_CPUS) { int *intserv; @@ -382,17 +377,30 @@ void __init smp_setup_cpu_maps(void) for (j = 0; j < nthreads && cpu < NR_CPUS; j++) { cpu_set(cpu, cpu_present_map); set_hard_smp_processor_id(cpu, intserv[j]); + + if (intserv[j] == boot_cpuid_phys) + swap_cpuid = cpu; cpu_set(cpu, cpu_possible_map); cpu++; } } + /* Swap CPU id 0 with boot_cpuid_phys, so we can always assume that + * boot cpu is logical 0. + */ + if (boot_cpuid_phys != get_hard_smp_processor_id(0)) { + u32 tmp; + tmp = get_hard_smp_processor_id(0); + set_hard_smp_processor_id(0, boot_cpuid_phys); + set_hard_smp_processor_id(swap_cpuid, tmp); + } + #ifdef CONFIG_PPC64 /* * On pSeries LPAR, we need to know how many cpus * could possibly be added to this partition. */ - if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR) && + if (_machine == PLATFORM_PSERIES_LPAR && (dn = of_find_node_by_path("/rtas"))) { int num_addr_cell, num_size_cell, maxcpus; unsigned int *ireg; @@ -431,7 +439,7 @@ void __init smp_setup_cpu_maps(void) /* * Do the sibling map; assume only two threads per processor. */ - for_each_possible_cpu(cpu) { + for_each_cpu(cpu) { cpu_set(cpu, cpu_sibling_map[cpu]); if (cpu_has_feature(CPU_FTR_SMT)) cpu_set(cpu ^ 0x1, cpu_sibling_map[cpu]); @@ -442,7 +450,6 @@ void __init smp_setup_cpu_maps(void) } #endif /* CONFIG_SMP */ -int __initdata do_early_xmon; #ifdef CONFIG_XMON static int __init early_xmon(char *p) { @@ -456,88 +463,9 @@ static int __init early_xmon(char *p) return 0; } xmon_init(1); - do_early_xmon = 1; + debugger(NULL); return 0; } early_param("xmon", early_xmon); #endif - -static __init int add_pcspkr(void) -{ - struct device_node *np; - struct platform_device *pd; - int ret; - - np = of_find_compatible_node(NULL, NULL, "pnpPNP,100"); - of_node_put(np); - if (!np) - return -ENODEV; - - pd = platform_device_alloc("pcspkr", -1); - if (!pd) - return -ENOMEM; - - ret = platform_device_add(pd); - if (ret) - platform_device_put(pd); - - return ret; -} -device_initcall(add_pcspkr); - -void probe_machine(void) -{ - extern struct machdep_calls __machine_desc_start; - extern struct machdep_calls __machine_desc_end; - - /* - * Iterate all ppc_md structures until we find the proper - * one for the current machine type - */ - DBG("Probing machine type ...\n"); - - for (machine_id = &__machine_desc_start; - machine_id < &__machine_desc_end; - machine_id++) { - DBG(" %s ...", machine_id->name); - memcpy(&ppc_md, machine_id, sizeof(struct machdep_calls)); - if (ppc_md.probe()) { - DBG(" match !\n"); - break; - } - DBG("\n"); - } - /* What can we do if we didn't find ? */ - if (machine_id >= &__machine_desc_end) { - DBG("No suitable machine found !\n"); - for (;;); - } - - printk(KERN_INFO "Using %s machine description\n", ppc_md.name); -} - -int check_legacy_ioport(unsigned long base_port) -{ - if (ppc_md.check_legacy_ioport == NULL) - return 0; - return ppc_md.check_legacy_ioport(base_port); -} -EXPORT_SYMBOL(check_legacy_ioport); - -static int ppc_panic_event(struct notifier_block *this, - unsigned long event, void *ptr) -{ - ppc_md.panic(ptr); /* May not return */ - return NOTIFY_DONE; -} - -static struct notifier_block ppc_panic_block = { - .notifier_call = ppc_panic_event, - .priority = INT_MIN /* may not return; must be done last */ -}; - -void __init setup_panic(void) -{ - atomic_notifier_chain_register(&panic_notifier_list, &ppc_panic_block); -}