X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fi386%2Fmach-es7000%2Fes7000plat.c;h=3d0fc853516d196eb379149dd33c58ff236b9507;hb=43bc926fffd92024b46cafaf7350d669ba9ca884;hp=1d1954a7fd23eaee5fccb46141ed0f0be7465273;hpb=c7b5ebbddf7bcd3651947760f423e3783bbe6573;p=linux-2.6.git diff --git a/arch/i386/mach-es7000/es7000plat.c b/arch/i386/mach-es7000/es7000plat.c index 1d1954a7f..3d0fc8535 100644 --- a/arch/i386/mach-es7000/es7000plat.c +++ b/arch/i386/mach-es7000/es7000plat.c @@ -51,81 +51,52 @@ struct mip_reg *host_reg; int mip_port; unsigned long mip_addr, host_addr; -#if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_ACPI_INTERPRETER) || defined(CONFIG_ACPI_BOOT)) -static unsigned long cycle_irqs = 0; -static unsigned long free_irqs = 0; -static int gsi_map[MAX_GSI_MAPSIZE] = { [0 ... MAX_GSI_MAPSIZE-1] = -1 }; - /* * GSI override for ES7000 platforms. */ -static int __init -es7000_gsi_override(int ioapic, int gsi) +static unsigned int base; + +static int +es7000_rename_gsi(int ioapic, int gsi) { - static int newgsi = 0; - - if (gsi_map[gsi] != -1) - gsi = gsi_map[gsi]; - else if (cycle_irqs ^ free_irqs) { - newgsi = find_next_bit(&cycle_irqs, IOAPIC_GSI_BOUND(0), newgsi); - __set_bit(newgsi, &free_irqs); - gsi_map[gsi] = newgsi; - gsi = newgsi; - newgsi++; - Dprintk("es7000_gsi_override: free_irqs = 0x%lx\n", free_irqs); + if (es7000_plat == ES7000_ZORRO) + return gsi; + + if (!base) { + int i; + for (i = 0; i < nr_ioapics; i++) + base += nr_ioapic_registers[i]; } + if (!ioapic && (gsi < 16)) + gsi += base; return gsi; } -static int __init -es7000_rename_gsi(int ioapic, int gsi) +void __init +setup_unisys(void) { - static int initialized = 0; - int i; - /* - * These should NEVER be true at this point but we'd rather be - * safe than sorry. + * Determine the generation of the ES7000 currently running. + * + * es7000_plat = 1 if the machine is a 5xx ES7000 box + * es7000_plat = 2 if the machine is a x86_64 ES7000 box + * */ - if (acpi_disabled || acpi_pci_disabled || acpi_noirq) - return gsi; - - if (ioapic) - return gsi; - - if (!initialized) { - unsigned long tmp_irqs = 0; - - for (i = 0; i < nr_ioapic_registers[0]; i++) - __set_bit(mp_irqs[i].mpc_srcbusirq, &tmp_irqs); - - cycle_irqs = (~tmp_irqs & io_apic_irqs & ((1 << IOAPIC_GSI_BOUND(0)) - 1)); - - initialized = 1; - Dprintk("es7000_rename_gsi: cycle_irqs = 0x%lx\n", cycle_irqs); - } - - for (i = 0; i < nr_ioapic_registers[0]; i++) { - if (mp_irqs[i].mpc_srcbusirq == gsi) { - if (mp_irqs[i].mpc_dstirq == gsi) - return gsi; - else - return es7000_gsi_override(0, gsi); - } - } - - return gsi; + if (!(boot_cpu_data.x86 <= 15 && boot_cpu_data.x86_model <= 2)) + es7000_plat = ES7000_ZORRO; + else + es7000_plat = ES7000_CLASSIC; + ioapic_renumber_irq = es7000_rename_gsi; } -#endif // (CONFIG_X86_IO_APIC) && (CONFIG_ACPI_INTERPRETER || CONFIG_ACPI_BOOT) /* * Parse the OEM Table */ int __init -parse_unisys_oem (char *oemptr, int oem_entries) +parse_unisys_oem (char *oemptr) { int i; int success = 0; @@ -140,7 +111,7 @@ parse_unisys_oem (char *oemptr, int oem_entries) tp += 8; - for (i=0; i <= oem_entries; i++) { + for (i=0; i <= 6; i++) { type = *tp++; size = *tp++; tp -= 2; @@ -175,22 +146,19 @@ parse_unisys_oem (char *oemptr, int oem_entries) default: break; } - if (i == 6) break; tp += size; } if (success < 2) { - es7000_plat = 0; - } else { - printk("\nEnabling ES7000 specific features...\n"); - es7000_plat = 1; - platform_rename_gsi = es7000_rename_gsi; - } + es7000_plat = NON_UNISYS; + } else + setup_unisys(); return es7000_plat; } +#ifdef CONFIG_ACPI int __init -find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length) +find_unisys_acpi_oem_table(unsigned long *oem_addr) { struct acpi_table_rsdp *rsdp = NULL; unsigned long rsdp_phys = 0; @@ -234,15 +202,14 @@ find_unisys_acpi_oem_table(unsigned long *oem_addr, int *length) acpi_table_print(header, sdt.entry[i].pa); t = (struct oem_table *) __acpi_map_table(sdt.entry[i].pa, header->length); addr = (void *) __acpi_map_table(t->OEMTableAddr, t->OEMTableSize); - *length = header->length; *oem_addr = (unsigned long) addr; return 0; } } } - Dprintk("ES7000: did not find Unisys ACPI OEM table!\n"); return -1; } +#endif static void es7000_spin(int n)