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;
tp += 8;
- for (i=0; i <= oem_entries; i++) {
+ for (i=0; i <= 6; i++) {
type = *tp++;
size = *tp++;
tp -= 2;
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;
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)