]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/acpi/resource.c
Merge remote-tracking branch 'mkp-scsi/4.11/scsi-fixes' into fixes
[mirror_ubuntu-artful-kernel.git] / drivers / acpi / resource.c
index cb57962ef7c4560793842ca271bfd1eb5650b422..cd4c4271dc4cd6ec5c676eb849cabcdc6a1736b7 100644 (file)
@@ -43,6 +43,19 @@ static inline bool
 acpi_iospace_resource_valid(struct resource *res) { return true; }
 #endif
 
+#if IS_ENABLED(CONFIG_ACPI_GENERIC_GSI)
+static inline bool is_gsi(struct acpi_resource_extended_irq *ext_irq)
+{
+       return ext_irq->resource_source.string_length == 0 &&
+              ext_irq->producer_consumer == ACPI_CONSUMER;
+}
+#else
+static inline bool is_gsi(struct acpi_resource_extended_irq *ext_irq)
+{
+       return true;
+}
+#endif
+
 static bool acpi_dev_resource_len_valid(u64 start, u64 end, u64 len, bool io)
 {
        u64 reslen = end - start + 1;
@@ -393,7 +406,7 @@ static void acpi_dev_get_irqresource(struct resource *res, u32 gsi,
        }
 
        /*
-        * In IO-APIC mode, use overrided attribute. Two reasons:
+        * In IO-APIC mode, use overridden attribute. Two reasons:
         * 1. BIOS bug in DSDT
         * 2. BIOS uses IO-APIC mode Interrupt Source Override
         *
@@ -470,9 +483,12 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
                        acpi_dev_irqresource_disabled(res, 0);
                        return false;
                }
-               acpi_dev_get_irqresource(res, ext_irq->interrupts[index],
+               if (is_gsi(ext_irq))
+                       acpi_dev_get_irqresource(res, ext_irq->interrupts[index],
                                         ext_irq->triggering, ext_irq->polarity,
                                         ext_irq->sharable, false);
+               else
+                       acpi_dev_irqresource_disabled(res, 0);
                break;
        default:
                res->flags = 0;