Patch "ACPI/PCI: pci_link: penalize SCI correctly" has been added to the 4.8-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
ACPI/PCI: pci_link: penalize SCI correctly
to the 4.8-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
acpi-pci-pci_link-penalize-sci-correctly.patch
and it can be found in the queue-4.8 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
f1caa61df2a3dc4c58316295c5dc5edba4c68d85Mon Sep 17 00:00:00 2001
From: Sinan Kaya <[email protected]>
Date: Mon, 24 Oct 2016 00:31:31 -0400
Subject: ACPI/PCI: pci_link: penalize SCI correctly
From: Sinan Kaya <[email protected]>
commit f1caa61df2a3dc4c58316295c5dc5edba4c68d85 upstream.
Ondrej reported that IRQs stopped working in v4.7 on several platforms. A typical scenario, from Ondrej's VT82C694X/694X, is:
ACPI: Using PIC for interrupt routing
ACPI: PCI Interrupt Link [LNKA] (IRQs 1 3 4 5 6 7 10 *11 12 14 15)
ACPI: No IRQ available for PCI Interrupt Link [LNKA] 8139too 0000:00:0f.0: PCI INT A: no GSI
We're using PIC routing, so acpi_irq_balance == 0, and LNKA is already active at IRQ 11. In that case, acpi_pci_link_allocate() only tries to use the active IRQ (IRQ 11) which also happens to be the SCI.
We should penalize the SCI by PIRQ_PENALTY_PCI_USING, but irq_get_trigger_type(11) returns something other than IRQ_TYPE_LEVEL_LOW, so we penalize it by PIRQ_PENALTY_ISA_ALWAYS instead, which makes acpi_pci_link_allocate() assume the IRQ isn't available and give up.
Add acpi_penalize_sci_irq() so platforms can tell us the SCI IRQ, trigger, and polarity directly and we don't have to depend on irq_get_trigger_type().
--- arch/x86/kernel/acpi/boot.c | 1 + drivers/acpi/pci_link.c | 30 +++++++++++++++--------------- include/linux/acpi.h | 1 + 3 files changed, 17 insertions(+), 15 deletions(-)
arch/x86/kernel/acpi/boot.c +1 -0
@@ -453,6 +453,7 @@ static void __init acpi_sci_ioapic_setup polarity = acpi_sci_flags &ACPI_MADT_POLARITY_MASK ;mp_override_legacy_irq (bus_irq, polarity, trigger, gsi); +acpi_penalize_sci_irq (bus_irq, trigger, polarity);/* * stash over-ride to indicate we've been here
drivers/acpi/pci_link.c +15 -15
@@ -87,6 +87,7 @@ struct acpi_pci_link {static LIST_HEAD (acpi_link_list);static DEFINE_MUTEX (acpi_link_lock); +static int sci_irq =-1 , sci_penalty;/* -------------------------------------------------------------------------- PCI Link Device Management
@@ -496,25 +497,13 @@ static int acpi_irq_get_penalty(int irq) {int penalty =0 ; -/* -* Penalize IRQ used by ACPI SCI. If ACPI SCI pin attributes conflict -* with PCI IRQ attributes, mark ACPI SCI as ISA_ALWAYS so it won't be -* use for PCI IRQs. -*/ -if (irq == acpi_gbl_FADT.sci_interrupt) { -u32 type =irq_get_trigger_type (irq) &IRQ_TYPE_SENSE_MASK ; - -if (type !=IRQ_TYPE_LEVEL_LOW ) - penalty +=PIRQ_PENALTY_ISA_ALWAYS ; -else - penalty +=PIRQ_PENALTY_PCI_USING ; - } +if (irq == sci_irq) + penalty += sci_penalty;if (irq <ACPI_MAX_ISA_IRQS )return penalty + acpi_isa_irq_penalty[irq]; - penalty +=acpi_irq_pci_sharing_penalty (irq); -return penalty; +return penalty +acpi_irq_pci_sharing_penalty (irq); }int __init acpi_irq_penalty_init (void )
@@ -881,6 +870,17 @@ bool acpi_isa_irq_available(int irq) acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS); } +void acpi_penalize_sci_irq (int irq,int trigger,int polarity) +{ + sci_irq = irq; + +if (trigger ==ACPI_MADT_TRIGGER_LEVEL && + polarity ==ACPI_MADT_POLARITY_ACTIVE_LOW ) + sci_penalty =PIRQ_PENALTY_PCI_USING ; +else + sci_penalty =PIRQ_PENALTY_ISA_ALWAYS ; +} +/* * Over-ride default table to reserve additional IRQs for use by ISA * e.g. acpi_irq_isa=5
include/linux/acpi.h +1 -0
@@ -318,6 +318,7 @@ struct pci_dev;int acpi_pci_irq_enable (struct pci_dev *dev);void acpi_penalize_isa_irq (int irq,int active);bool acpi_isa_irq_available (int irq); +void acpi_penalize_sci_irq (int irq,int trigger,int polarity);void acpi_pci_irq_disable (struct pci_dev *dev);extern int ec_read (u8 addr,u8 *val);
Patches currently in stable-queue which might be from [email protected] are
queue-4.8/acpi-pci-pci_link-penalize-sci-correctly.patch queue-4.8/acpi-pci-irq-assign-isa-irq-directly-during-early-boot-stages.patch queue-4.8/acpi-pci-pci_link-include-pirq_penalty_pci_using-for-isa-irqs.patch