Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'stable/bug.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen

* 'stable/bug.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
xen/pci: Move check for acpi_sci_override_gsi to xen_setup_acpi_sci.

+28 -28
+28 -28
arch/x86/pci/xen.c
··· 327 327 } 328 328 329 329 #ifdef CONFIG_XEN_DOM0 330 - static int xen_register_pirq(u32 gsi, int triggering) 330 + static int xen_register_pirq(u32 gsi, int gsi_override, int triggering) 331 331 { 332 332 int rc, pirq, irq = -1; 333 333 struct physdev_map_pirq map_irq; 334 334 int shareable = 0; 335 335 char *name; 336 - bool gsi_override = false; 337 336 338 337 if (!xen_pv_domain()) 339 338 return -1; ··· 344 345 shareable = 1; 345 346 name = "ioapic-level"; 346 347 } 347 - 348 348 pirq = xen_allocate_pirq_gsi(gsi); 349 349 if (pirq < 0) 350 350 goto out; 351 351 352 - /* Before we bind the GSI to a Linux IRQ, check whether 353 - * we need to override it with bus_irq (IRQ) value. Usually for 354 - * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: 355 - * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) 356 - * but there are oddballs where the IRQ != GSI: 357 - * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) 358 - * which ends up being: gsi_to_irq[9] == 20 359 - * (which is what acpi_gsi_to_irq ends up calling when starting the 360 - * the ACPI interpreter and keels over since IRQ 9 has not been 361 - * setup as we had setup IRQ 20 for it). 362 - */ 363 - if (gsi == acpi_sci_override_gsi) { 364 - /* Check whether the GSI != IRQ */ 365 - acpi_gsi_to_irq(gsi, &irq); 366 - if (irq != gsi) 367 - /* Bugger, we MUST have that IRQ. */ 368 - gsi_override = true; 369 - } 370 - if (gsi_override) 371 - irq = xen_bind_pirq_gsi_to_irq(irq, pirq, shareable, name); 352 + if (gsi_override >= 0) 353 + irq = xen_bind_pirq_gsi_to_irq(gsi_override, pirq, shareable, name); 372 354 else 373 355 irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name); 374 356 if (irq < 0) ··· 372 392 return irq; 373 393 } 374 394 375 - static int xen_register_gsi(u32 gsi, int triggering, int polarity) 395 + static int xen_register_gsi(u32 gsi, int gsi_override, int triggering, int polarity) 376 396 { 377 397 int rc, irq; 378 398 struct physdev_setup_gsi setup_gsi; ··· 383 403 printk(KERN_DEBUG "xen: registering gsi %u triggering %d polarity %d\n", 384 404 gsi, triggering, polarity); 385 405 386 - irq = xen_register_pirq(gsi, triggering); 406 + irq = xen_register_pirq(gsi, gsi_override, triggering); 387 407 388 408 setup_gsi.gsi = gsi; 389 409 setup_gsi.triggering = (triggering == ACPI_EDGE_SENSITIVE ? 0 : 1); ··· 405 425 int rc; 406 426 int trigger, polarity; 407 427 int gsi = acpi_sci_override_gsi; 428 + int irq = -1; 429 + int gsi_override = -1; 408 430 409 431 if (!gsi) 410 432 return; ··· 423 441 printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " 424 442 "polarity=%d\n", gsi, trigger, polarity); 425 443 426 - gsi = xen_register_gsi(gsi, trigger, polarity); 444 + /* Before we bind the GSI to a Linux IRQ, check whether 445 + * we need to override it with bus_irq (IRQ) value. Usually for 446 + * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: 447 + * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) 448 + * but there are oddballs where the IRQ != GSI: 449 + * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) 450 + * which ends up being: gsi_to_irq[9] == 20 451 + * (which is what acpi_gsi_to_irq ends up calling when starting the 452 + * the ACPI interpreter and keels over since IRQ 9 has not been 453 + * setup as we had setup IRQ 20 for it). 454 + */ 455 + /* Check whether the GSI != IRQ */ 456 + if (acpi_gsi_to_irq(gsi, &irq) == 0) { 457 + if (irq >= 0 && irq != gsi) 458 + /* Bugger, we MUST have that IRQ. */ 459 + gsi_override = irq; 460 + } 461 + 462 + gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); 427 463 printk(KERN_INFO "xen: acpi sci %d\n", gsi); 428 464 429 465 return; ··· 450 450 static int acpi_register_gsi_xen(struct device *dev, u32 gsi, 451 451 int trigger, int polarity) 452 452 { 453 - return xen_register_gsi(gsi, trigger, polarity); 453 + return xen_register_gsi(gsi, -1 /* no GSI override */, trigger, polarity); 454 454 } 455 455 456 456 static int __init pci_xen_initial_domain(void) ··· 489 489 if (acpi_get_override_irq(irq, &trigger, &polarity) == -1) 490 490 continue; 491 491 492 - xen_register_pirq(irq, 492 + xen_register_pirq(irq, -1 /* no GSI override */, 493 493 trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE); 494 494 } 495 495 }