* [PATCH v3 0/2] Fix improper handling of SCI INT for platforms supporting only IOAPIC mode @ 2017-11-16 16:13 Vikas C Sajjan 2017-11-16 16:13 ` [PATCH v3 1/2] acpi/x86: " Vikas C Sajjan 2017-11-16 16:13 ` [PATCH v3 2/2] acpi/x86: Reuse the mp_register_ioapic_irq() in the function mp_override_legacy_irq() Vikas C Sajjan 0 siblings, 2 replies; 5+ messages in thread From: Vikas C Sajjan @ 2017-11-16 16:13 UTC (permalink / raw) To: tglx, rjw Cc: linux-pm, linux-acpi, linux-kernel, kkamagui, mingo, Vikas C Sajjan The platforms which support only IOAPIC mode and whose SCI INT >= 16, pass SCI INT via FADT and not via MADT int src override structure. In such cases current logic fails to handle it and throws error "Invalid bus_irq %u for legacy override". This patch handles the above mentioned case. While at it, also modify function mp_override_legacy_irq() to use the newly introduced function mp_register_ioapic_irq(). This series is rebased on 'master' branch of https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git Changes since v2: Addressed the review comments by Thomas Gleixner <tglx@linutronix.de> to fix the broken Signed-off-by chain, code clean up and some comments removal. Changes since v1: Patch is split into 2, separating actual fix and code cleanup as suggested by Rafael. Vikas C Sajjan (2): acpi/x86: Fix improper handling of SCI INT for platforms supporting only IOAPIC mode acpi/x86: Reuse the mp_register_ioapic_irq() in the function mp_override_legacy_irq() arch/x86/kernel/acpi/boot.c | 61 ++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 23 deletions(-) -- 1.9.1 ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 1/2] acpi/x86: Fix improper handling of SCI INT for platforms supporting only IOAPIC mode 2017-11-16 16:13 [PATCH v3 0/2] Fix improper handling of SCI INT for platforms supporting only IOAPIC mode Vikas C Sajjan @ 2017-11-16 16:13 ` Vikas C Sajjan 2017-11-17 10:38 ` Thomas Gleixner 2017-11-16 16:13 ` [PATCH v3 2/2] acpi/x86: Reuse the mp_register_ioapic_irq() in the function mp_override_legacy_irq() Vikas C Sajjan 1 sibling, 1 reply; 5+ messages in thread From: Vikas C Sajjan @ 2017-11-16 16:13 UTC (permalink / raw) To: tglx, rjw Cc: linux-pm, linux-acpi, linux-kernel, kkamagui, mingo, Vikas C Sajjan The platforms which support only IOAPIC mode, pass the SCI information above the legacy space (0-15) via the FADT mechanism and not via MADT. In such cases the mp_override_legacy_irq() used by acpi_sci_ioapic_setup() to register SCI interrupts fails for interrupts >= 16, since it is meant to handle only legacy space and throws error "Invalid bus_irq %u for legacy override". Hence add a new function to handle SCI interrupts >= 16 and invoke it conditionally in acpi_sci_ioapic_setup().The code duplication due to this new function will be cleaned up in a separate patch. Co-developed-by: Sunil V L <sunil.vl@hpe.com> Signed-off-by: Vikas C Sajjan <vikas.cha.sajjan@hpe.com> Tested-by: Abdul Lateef Attar <abdul-lateef.attar@hpe.com> --- arch/x86/kernel/acpi/boot.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index ef9e02e..7615379 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -429,6 +429,34 @@ static int mp_config_acpi_gsi(struct device *dev, u32 gsi, int trigger, return 0; } +static int __init mp_register_ioapic_irq(u8 bus_irq, u8 polarity, + u8 trigger, u32 gsi) +{ + struct mpc_intsrc mp_irq; + int ioapic, pin; + + /* Convert 'gsi' to 'ioapic.pin'(INTIN#) */ + ioapic = mp_find_ioapic(gsi); + if (ioapic < 0) { + pr_warn("Failed to find ioapic for gsi : %u\n", gsi); + return ioapic; + } + + pin = mp_find_ioapic_pin(ioapic, gsi); + + mp_irq.type = MP_INTSRC; + mp_irq.irqtype = mp_INT; + mp_irq.irqflag = (trigger << 2) | polarity; + mp_irq.srcbus = MP_ISA_BUS; + mp_irq.srcbusirq = bus_irq; + mp_irq.dstapic = mpc_ioapic_id(ioapic); + mp_irq.dstirq = pin; + + mp_save_irq(&mp_irq); + + return 0; +} + static int __init acpi_parse_ioapic(struct acpi_subtable_header * header, const unsigned long end) { @@ -473,7 +501,11 @@ static void __init acpi_sci_ioapic_setup(u8 bus_irq, u16 polarity, u16 trigger, if (acpi_sci_flags & ACPI_MADT_POLARITY_MASK) polarity = acpi_sci_flags & ACPI_MADT_POLARITY_MASK; - mp_override_legacy_irq(bus_irq, polarity, trigger, gsi); + if (bus_irq < NR_IRQS_LEGACY) + mp_override_legacy_irq(bus_irq, polarity, trigger, gsi); + else + mp_register_ioapic_irq(bus_irq, polarity, trigger, gsi); + acpi_penalize_sci_irq(bus_irq, trigger, polarity); /* -- 1.9.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 1/2] acpi/x86: Fix improper handling of SCI INT for platforms supporting only IOAPIC mode 2017-11-16 16:13 ` [PATCH v3 1/2] acpi/x86: " Vikas C Sajjan @ 2017-11-17 10:38 ` Thomas Gleixner 2017-11-17 14:00 ` Sajjan, Vikas C 0 siblings, 1 reply; 5+ messages in thread From: Thomas Gleixner @ 2017-11-17 10:38 UTC (permalink / raw) To: Vikas C Sajjan; +Cc: rjw, linux-pm, linux-acpi, linux-kernel, kkamagui, mingo On Thu, 16 Nov 2017, Vikas C Sajjan wrote: > The platforms which support only IOAPIC mode, pass the SCI information > above the legacy space (0-15) via the FADT mechanism and not via MADT. > In such cases the mp_override_legacy_irq() used by acpi_sci_ioapic_setup() > to register SCI interrupts fails for interrupts >= 16, since it is meant to > handle only legacy space and throws error "Invalid bus_irq %u for legacy > override". Hence add a new function to handle SCI interrupts >= 16 and > invoke it conditionally in acpi_sci_ioapic_setup().The code duplication > due to this new function will be cleaned up in a separate patch. This reads way better, but I have a small nit pick. In the example I gave you there were multiple paragraphs on purpose to separate the different parts. So if I just split the above lump into separate paragraphs: [1] The platforms which support only IOAPIC mode, pass the SCI information above the legacy space (0-15) via the FADT mechanism and not via MADT. [2] In such cases the mp_override_legacy_irq() used by acpi_sci_ioapic_setup() to register SCI interrupts fails for interrupts >= 16, since it is meant to handle only legacy space and throws error "Invalid bus_irq %u for legacy override". [3] Hence add a new function to handle SCI interrupts >= 16 and invoke it conditionally in acpi_sci_ioapic_setup(). [4] The code duplication due to this new function will be cleaned up in a separate patch. then this is clearly structured: [1] describes the context. [2] describes the failure [3] describes the solution [4] is an extra note to tell the reviewer/reader that you are aware of the code duplication and this is addressed later. No need to resend. I can do that when picking it up. > Co-developed-by: Sunil V L <sunil.vl@hpe.com> I had a discussion with Greg about this tag which resulted in a patch so it should be soon part of the official documentation: https://lkml.kernel.org/r/20171116132309.GA8449@kroah.com We agreed that both authors should add their Signed-off-by to document that the work conforms with the Developer Certificate of Origin. I'll add that if that's ok for you. Thanks for following up! tglx ^ permalink raw reply [flat|nested] 5+ messages in thread
* RE: [PATCH v3 1/2] acpi/x86: Fix improper handling of SCI INT for platforms supporting only IOAPIC mode 2017-11-17 10:38 ` Thomas Gleixner @ 2017-11-17 14:00 ` Sajjan, Vikas C 0 siblings, 0 replies; 5+ messages in thread From: Sajjan, Vikas C @ 2017-11-17 14:00 UTC (permalink / raw) To: Thomas Gleixner Cc: rjw@rjwysocki.net, linux-pm@vger.kernel.org, linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, kkamagui@gmail.com, mingo@kernel.org On Thu, 16 Nov 2017, Vikas C Sajjan wrote: > The platforms which support only IOAPIC mode, pass the SCI information > above the legacy space (0-15) via the FADT mechanism and not via MADT. > In such cases the mp_override_legacy_irq() used by > acpi_sci_ioapic_setup() to register SCI interrupts fails for > interrupts >= 16, since it is meant to handle only legacy space and > throws error "Invalid bus_irq %u for legacy override". Hence add a new > function to handle SCI interrupts >= 16 and invoke it conditionally in > acpi_sci_ioapic_setup().The code duplication due to this new function will be cleaned up in a separate patch. This reads way better, but I have a small nit pick. In the example I gave you there were multiple paragraphs on purpose to separate the different parts. So if I just split the above lump into separate paragraphs: [1] The platforms which support only IOAPIC mode, pass the SCI information above the legacy space (0-15) via the FADT mechanism and not via MADT. [2] In such cases the mp_override_legacy_irq() used by acpi_sci_ioapic_setup() to register SCI interrupts fails for interrupts >= 16, since it is meant to handle only legacy space and throws error "Invalid bus_irq %u for legacy override". [3] Hence add a new function to handle SCI interrupts >= 16 and invoke it conditionally in acpi_sci_ioapic_setup(). [4] The code duplication due to this new function will be cleaned up in a separate patch. then this is clearly structured: [1] describes the context. [2] describes the failure [3] describes the solution [4] is an extra note to tell the reviewer/reader that you are aware of the code duplication and this is addressed later. No need to resend. I can do that when picking it up. Thanks. > Co-developed-by: Sunil V L <sunil.vl@hpe.com> I had a discussion with Greg about this tag which resulted in a patch so it should be soon part of the official documentation: https://lkml.kernel.org/r/20171116132309.GA8449@kroah.com Great. Good to know that. We agreed that both authors should add their Signed-off-by to document that the work conforms with the Developer Certificate of Origin. I'll add that if that's ok for you. I am OK with that. Please go ahead. Thanks for following up! Thank you for the review. tglx ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 2/2] acpi/x86: Reuse the mp_register_ioapic_irq() in the function mp_override_legacy_irq() 2017-11-16 16:13 [PATCH v3 0/2] Fix improper handling of SCI INT for platforms supporting only IOAPIC mode Vikas C Sajjan 2017-11-16 16:13 ` [PATCH v3 1/2] acpi/x86: " Vikas C Sajjan @ 2017-11-16 16:13 ` Vikas C Sajjan 1 sibling, 0 replies; 5+ messages in thread From: Vikas C Sajjan @ 2017-11-16 16:13 UTC (permalink / raw) To: tglx, rjw Cc: linux-pm, linux-acpi, linux-kernel, kkamagui, mingo, Vikas C Sajjan Modify the function mp_override_legacy_irq() to reuse the newly introduced function mp_register_ioapic_irq(). Signed-off-by: Vikas C Sajjan <vikas.cha.sajjan@hpe.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> --- arch/x86/kernel/acpi/boot.c | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 7615379..f4c463d 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c @@ -342,13 +342,12 @@ static int acpi_register_lapic(int id, u32 acpiid, u8 enabled) #ifdef CONFIG_X86_IO_APIC #define MP_ISA_BUS 0 +static int __init mp_register_ioapic_irq(u8 bus_irq, u8 polarity, + u8 trigger, u32 gsi); + static void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi) { - int ioapic; - int pin; - struct mpc_intsrc mp_irq; - /* * Check bus_irq boundary. */ @@ -358,14 +357,6 @@ static void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, } /* - * Convert 'gsi' to 'ioapic.pin'. - */ - ioapic = mp_find_ioapic(gsi); - if (ioapic < 0) - return; - pin = mp_find_ioapic_pin(ioapic, gsi); - - /* * TBD: This check is for faulty timer entries, where the override * erroneously sets the trigger to level, resulting in a HUGE * increase of timer interrupts! @@ -373,16 +364,8 @@ static void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, if ((bus_irq == 0) && (trigger == 3)) trigger = 1; - mp_irq.type = MP_INTSRC; - mp_irq.irqtype = mp_INT; - mp_irq.irqflag = (trigger << 2) | polarity; - mp_irq.srcbus = MP_ISA_BUS; - mp_irq.srcbusirq = bus_irq; /* IRQ */ - mp_irq.dstapic = mpc_ioapic_id(ioapic); /* APIC ID */ - mp_irq.dstirq = pin; /* INTIN# */ - - mp_save_irq(&mp_irq); - + if (mp_register_ioapic_irq(bus_irq, polarity, trigger, gsi) < 0) + return; /* * Reset default identity mapping if gsi is also an legacy IRQ, * otherwise there will be more than one entry with the same GSI -- 1.9.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-11-17 14:00 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-11-16 16:13 [PATCH v3 0/2] Fix improper handling of SCI INT for platforms supporting only IOAPIC mode Vikas C Sajjan 2017-11-16 16:13 ` [PATCH v3 1/2] acpi/x86: " Vikas C Sajjan 2017-11-17 10:38 ` Thomas Gleixner 2017-11-17 14:00 ` Sajjan, Vikas C 2017-11-16 16:13 ` [PATCH v3 2/2] acpi/x86: Reuse the mp_register_ioapic_irq() in the function mp_override_legacy_irq() Vikas C Sajjan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).