X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fpowerpc%2Fplatforms%2Fmaple%2Fsetup.c;fp=arch%2Fpowerpc%2Fplatforms%2Fmaple%2Fsetup.c;h=ec5c1e10c407253bc2e8b3ba0ea2f3b738f6d7aa;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=57567dfb98192cbf5fc781c144d28d67738487ea;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/arch/powerpc/platforms/maple/setup.c b/arch/powerpc/platforms/maple/setup.c index 57567dfb9..ec5c1e10c 100644 --- a/arch/powerpc/platforms/maple/setup.c +++ b/arch/powerpc/platforms/maple/setup.c @@ -11,8 +11,9 @@ * */ -#undef DEBUG +#define DEBUG +#include #include #include #include @@ -188,7 +189,7 @@ void __init maple_setup_arch(void) conswitchp = &dummy_con; #endif - printk(KERN_DEBUG "Using native/NAP idle loop\n"); + printk(KERN_INFO "Using native/NAP idle loop\n"); } /* @@ -198,90 +199,55 @@ static void __init maple_init_early(void) { DBG(" -> maple_init_early\n"); + /* Initialize hash table, from now on, we can take hash faults + * and call ioremap + */ + hpte_init_native(); + + /* Setup interrupt mapping options */ + ppc64_interrupt_controller = IC_OPEN_PIC; + iommu_init_early_dart(); DBG(" <- maple_init_early\n"); } -/* - * This is almost identical to pSeries and CHRP. We need to make that - * code generic at one point, with appropriate bits in the device-tree to - * identify the presence of an HT APIC - */ -static void __init maple_init_IRQ(void) + +static __init void maple_init_IRQ(void) { - struct device_node *root, *np, *mpic_node = NULL; + struct device_node *root; unsigned int *opprop; - unsigned long openpic_addr = 0; - int naddr, n, i, opplen, has_isus = 0; + unsigned long opic_addr; struct mpic *mpic; - unsigned int flags = MPIC_PRIMARY; - - /* Locate MPIC in the device-tree. Note that there is a bug - * in Maple device-tree where the type of the controller is - * open-pic and not interrupt-controller - */ + unsigned char senses[128]; + int n; - for_each_node_by_type(np, "interrupt-controller") - if (device_is_compatible(np, "open-pic")) { - mpic_node = np; - break; - } - if (mpic_node == NULL) - for_each_node_by_type(np, "open-pic") { - mpic_node = np; - break; - } - if (mpic_node == NULL) { - printk(KERN_ERR - "Failed to locate the MPIC interrupt controller\n"); - return; - } + DBG(" -> maple_init_IRQ\n"); - /* Find address list in /platform-open-pic */ + /* XXX: Non standard, replace that with a proper openpic/mpic node + * in the device-tree. Find the Open PIC if present */ root = of_find_node_by_path("/"); - naddr = prom_n_addr_cells(root); - opprop = (unsigned int *) get_property(root, "platform-open-pic", - &opplen); - if (opprop != 0) { - openpic_addr = of_read_number(opprop, naddr); - has_isus = (opplen > naddr); - printk(KERN_DEBUG "OpenPIC addr: %lx, has ISUs: %d\n", - openpic_addr, has_isus); - } + opprop = (unsigned int *) get_property(root, + "platform-open-pic", NULL); + if (opprop == 0) + panic("OpenPIC not found !\n"); + + n = prom_n_addr_cells(root); + for (opic_addr = 0; n > 0; --n) + opic_addr = (opic_addr << 32) + *opprop++; of_node_put(root); - BUG_ON(openpic_addr == 0); - - /* Check for a big endian MPIC */ - if (get_property(np, "big-endian", NULL) != NULL) - flags |= MPIC_BIG_ENDIAN; - - /* XXX Maple specific bits */ - flags |= MPIC_BROKEN_U3 | MPIC_WANTS_RESET; - /* All U3/U4 are big-endian, older SLOF firmware doesn't encode this */ - flags |= MPIC_BIG_ENDIAN; + /* Obtain sense values from device-tree */ + prom_get_irq_senses(senses, 0, 128); - /* Setup the openpic driver. More device-tree junks, we hard code no - * ISUs for now. I'll have to revisit some stuffs with the folks doing - * the firmware for those - */ - mpic = mpic_alloc(mpic_node, openpic_addr, flags, - /*has_isus ? 16 :*/ 0, 0, " MPIC "); + mpic = mpic_alloc(opic_addr, + MPIC_PRIMARY | MPIC_BIG_ENDIAN | + MPIC_BROKEN_U3 | MPIC_WANTS_RESET, + 0, 0, 128, 128, senses, 128, "U3-MPIC"); BUG_ON(mpic == NULL); - - /* Add ISUs */ - opplen /= sizeof(u32); - for (n = 0, i = naddr; i < opplen; i += naddr, n++) { - unsigned long isuaddr = of_read_number(opprop + i, naddr); - mpic_assign_isu(mpic, n, isuaddr); - } - - /* All ISUs are setup, complete initialization */ mpic_init(mpic); - ppc_md.get_irq = mpic_get_irq; - of_node_put(mpic_node); - of_node_put(root); + + DBG(" <- maple_init_IRQ\n"); } static void __init maple_progress(char *s, unsigned short hex) @@ -293,12 +259,9 @@ static void __init maple_progress(char *s, unsigned short hex) /* * Called very early, MMU is off, device-tree isn't unflattened */ -static int __init maple_probe(void) +static int __init maple_probe(int platform) { - unsigned long root = of_get_flat_dt_root(); - - if (!of_flat_dt_is_compatible(root, "Momentum,Maple") && - !of_flat_dt_is_compatible(root, "Momentum,Apache")) + if (platform != PLATFORM_MAPLE) return 0; /* * On U3, the DART (iommu) must be allocated now since it @@ -308,17 +271,15 @@ static int __init maple_probe(void) */ alloc_dart_table(); - hpte_init_native(); - return 1; } -define_machine(maple_md) { - .name = "Maple", +struct machdep_calls __initdata maple_md = { .probe = maple_probe, .setup_arch = maple_setup_arch, .init_early = maple_init_early, .init_IRQ = maple_init_IRQ, + .get_irq = mpic_get_irq, .pcibios_fixup = maple_pcibios_fixup, .pci_get_legacy_ide_irq = maple_pci_get_legacy_ide_irq, .restart = maple_restart, @@ -329,7 +290,7 @@ define_machine(maple_md) { .get_rtc_time = maple_get_rtc_time, .calibrate_decr = generic_calibrate_decr, .progress = maple_progress, - .power_save = power4_idle, + .idle_loop = native_idle, #ifdef CONFIG_KEXEC .machine_kexec = default_machine_kexec, .machine_kexec_prepare = default_machine_kexec_prepare,