···327327}328328329329#ifdef CONFIG_XEN_DOM0330330-static int xen_register_pirq(u32 gsi, int triggering)330330+static int xen_register_pirq(u32 gsi, int gsi_override, int triggering)331331{332332 int rc, pirq, irq = -1;333333 struct physdev_map_pirq map_irq;334334 int shareable = 0;335335 char *name;336336- bool gsi_override = false;337336338337 if (!xen_pv_domain())339338 return -1;···344345 shareable = 1;345346 name = "ioapic-level";346347 }347347-348348 pirq = xen_allocate_pirq_gsi(gsi);349349 if (pirq < 0)350350 goto out;351351352352- /* Before we bind the GSI to a Linux IRQ, check whether353353- * we need to override it with bus_irq (IRQ) value. Usually for354354- * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so:355355- * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level)356356- * but there are oddballs where the IRQ != GSI:357357- * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level)358358- * which ends up being: gsi_to_irq[9] == 20359359- * (which is what acpi_gsi_to_irq ends up calling when starting the360360- * the ACPI interpreter and keels over since IRQ 9 has not been361361- * setup as we had setup IRQ 20 for it).362362- */363363- if (gsi == acpi_sci_override_gsi) {364364- /* Check whether the GSI != IRQ */365365- acpi_gsi_to_irq(gsi, &irq);366366- if (irq != gsi)367367- /* Bugger, we MUST have that IRQ. */368368- gsi_override = true;369369- }370370- if (gsi_override)371371- irq = xen_bind_pirq_gsi_to_irq(irq, pirq, shareable, name);352352+ if (gsi_override >= 0)353353+ irq = xen_bind_pirq_gsi_to_irq(gsi_override, pirq, shareable, name);372354 else373355 irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);374356 if (irq < 0)···372392 return irq;373393}374394375375-static int xen_register_gsi(u32 gsi, int triggering, int polarity)395395+static int xen_register_gsi(u32 gsi, int gsi_override, int triggering, int polarity)376396{377397 int rc, irq;378398 struct physdev_setup_gsi setup_gsi;···383403 printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n",384404 gsi, triggering, polarity);385405386386- irq = xen_register_pirq(gsi, triggering);406406+ irq = xen_register_pirq(gsi, gsi_override, triggering);387407388408 setup_gsi.gsi = gsi;389409 setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1);···405425 int rc;406426 int trigger, polarity;407427 int gsi = acpi_sci_override_gsi;428428+ int irq = -1;429429+ int gsi_override = -1;408430409431 if (!gsi)410432 return;···423441 printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d "424442 "polarity=%d\n", gsi, trigger, polarity);425443426426- gsi = xen_register_gsi(gsi, trigger, polarity);444444+ /* Before we bind the GSI to a Linux IRQ, check whether445445+ * we need to override it with bus_irq (IRQ) value. Usually for446446+ * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so:447447+ * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level)448448+ * but there are oddballs where the IRQ != GSI:449449+ * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level)450450+ * which ends up being: gsi_to_irq[9] == 20451451+ * (which is what acpi_gsi_to_irq ends up calling when starting the452452+ * the ACPI interpreter and keels over since IRQ 9 has not been453453+ * setup as we had setup IRQ 20 for it).454454+ */455455+ /* Check whether the GSI != IRQ */456456+ if (acpi_gsi_to_irq(gsi, &irq) == 0) {457457+ if (irq >= 0 && irq != gsi)458458+ /* Bugger, we MUST have that IRQ. */459459+ gsi_override = irq;460460+ }461461+462462+ gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity);427463 printk(KERN_INFO "xen: acpi sci %d\n", gsi);428464429465 return;···450450static int acpi_register_gsi_xen(struct device *dev, u32 gsi,451451 int trigger, int polarity)452452{453453- return xen_register_gsi(gsi, trigger, polarity);453453+ return xen_register_gsi(gsi, -1 /* no GSI override */, trigger, polarity);454454}455455456456static int __init pci_xen_initial_domain(void)···489489 if (acpi_get_override_irq(irq, &trigger, &polarity) == -1)490490 continue;491491492492- xen_register_pirq(irq,492492+ xen_register_pirq(irq, -1 /* no GSI override */,493493 trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE);494494 }495495}