All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] acpi: add support for extended IRQ to PCI link
@ 2015-11-08 16:07 ` Sinan Kaya
  0 siblings, 0 replies; 31+ messages in thread
From: Sinan Kaya @ 2015-11-08 16:07 UTC (permalink / raw)
  To: linux-acpi, timur, cov, jcm
  Cc: agross, linux-arm-msm, linux-arm-kernel, Sinan Kaya,
	Rafael J. Wysocki, Len Brown, linux-kernel

The ACPI compiler uses the extended format when
used interrupt numbers are greater than 256.
The PCI link code currently only supports simple
interrupt format. The IRQ numbers are represented
using 32 bits when extended IRQ syntax. This patch
changes the interrupt number type to 32 bits and
places an upper limit of 1020 as possible interrupt
id. Additional checks have been placed to prevent
out of bounds writes.

Signed-off-by: Sinan Kaya <okaya@codeaurora.org>
---
 drivers/acpi/pci_link.c | 35 ++++++++++++++++++++++-------------
 1 file changed, 22 insertions(+), 13 deletions(-)

diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 7c8408b..18a9190 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -1,6 +1,7 @@
 /*
  *  pci_link.c - ACPI PCI Interrupt Link Device Driver ($Revision: 34 $)
  *
+ *  Copyright (c) 2015, The Linux Foundation. All rights reserved.
  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
  *  Copyright (C) 2002       Dominik Brodowski <devel@brodo.de>
@@ -67,12 +68,12 @@ static struct acpi_scan_handler pci_link_handler = {
  * later even the link is disable. Instead, we just repick the active irq
  */
 struct acpi_pci_link_irq {
-	u8 active;		/* Current IRQ */
+	u32 active;		/* Current IRQ */
 	u8 triggering;		/* All IRQs */
 	u8 polarity;		/* All IRQs */
 	u8 resource_type;
 	u8 possible_count;
-	u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
+	u32 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
 	u8 initialized:1;
 	u8 reserved:7;
 };
@@ -437,7 +438,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
  * enabled system.
  */
 
-#define ACPI_MAX_IRQS		256
+#define ACPI_MAX_IRQS		1020
 #define ACPI_MAX_ISA_IRQ	16
 
 #define PIRQ_PENALTY_PCI_AVAILABLE	(0)
@@ -493,7 +494,8 @@ int __init acpi_irq_penalty_init(void)
 					    penalty;
 			}
 
-		} else if (link->irq.active) {
+		} else if (link->irq.active &&
+			(link->irq.active < ACPI_MAX_IRQS)) {
 			acpi_irq_penalty[link->irq.active] +=
 			    PIRQ_PENALTY_PCI_POSSIBLE;
 		}
@@ -542,14 +544,19 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
 		irq = link->irq.possible[link->irq.possible_count - 1];
 
 	if (acpi_irq_balance || !link->irq.active) {
-		/*
-		 * Select the best IRQ.  This is done in reverse to promote
-		 * the use of IRQs 9, 10, 11, and >15.
-		 */
-		for (i = (link->irq.possible_count - 1); i >= 0; i--) {
-			if (acpi_irq_penalty[irq] >
-			    acpi_irq_penalty[link->irq.possible[i]])
-				irq = link->irq.possible[i];
+
+		if (irq < ACPI_MAX_IRQS) {
+			/*
+			 * Select the best IRQ.  This is done in reverse to
+			 * promote the use of IRQs 9, 10, 11, and >15.
+			 */
+			for (i = (link->irq.possible_count - 1); i >= 0;
+				i--) {
+				if ((link->irq.possible[i] < ACPI_MAX_IRQS) &&
+				    (acpi_irq_penalty[irq] >
+				    acpi_irq_penalty[link->irq.possible[i]]))
+					irq = link->irq.possible[i];
+			}
 		}
 	}
 	if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
@@ -568,7 +575,9 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
 			    acpi_device_bid(link->device));
 		return -ENODEV;
 	} else {
-		acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
+		if (link->irq.active < ACPI_MAX_IRQS)
+			acpi_irq_penalty[link->irq.active] +=
+				PIRQ_PENALTY_PCI_USING;
 		printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
 		       acpi_device_name(link->device),
 		       acpi_device_bid(link->device), link->irq.active);
-- 
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project


^ permalink raw reply related	[flat|nested] 31+ messages in thread
* [PATCH V2] acpi: add support for extended IRQ to PCI link
@ 2015-11-12  6:14 Sinan Kaya
  2015-11-12  6:14 ` [PATCH] " Sinan Kaya
  0 siblings, 1 reply; 31+ messages in thread
From: Sinan Kaya @ 2015-11-12  6:14 UTC (permalink / raw)
  To: linux-acpi, timur, cov, jcm; +Cc: Sinan Kaya

The ACPI compiler uses the extended format when used
interrupt numbers are greater than 256. The PCI link code
currently only supports simple interrupt format. The IRQ
numbers are represented using 32 bits when extended IRQ
syntax. This patch changes the interrupt number type to
32 bits and places an upper limit of 1020 as possible
interrupt id.

1020 is the maximum interrupt ID that can be assigned to
an ARM SPI interrupt according to ARM architecture.

Additional checks have been placed to prevent out of bounds
writes.

Changes from V1: (https://lkml.org/lkml/2015/11/8/162)
* change the commit text to include 1020 magic interrupt number
limitation
* cleanup multiple levels of if statements

Sinan Kaya (1):
  acpi: add support for extended IRQ to PCI link

 drivers/acpi/pci_link.c | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

-- 
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project


^ permalink raw reply	[flat|nested] 31+ messages in thread

end of thread, other threads:[~2015-11-12 15:58 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-08 16:07 [PATCH] acpi: add support for extended IRQ to PCI link Sinan Kaya
2015-11-08 16:07 ` Sinan Kaya
2015-11-08 16:11 ` Timur Tabi
2015-11-08 16:11   ` Timur Tabi
2015-11-09  0:04   ` Sinan Kaya
2015-11-09  0:04     ` Sinan Kaya
2015-11-09  0:05     ` Timur Tabi
2015-11-09  0:05       ` Timur Tabi
2015-11-09 21:49       ` Rafael J. Wysocki
2015-11-09 21:49         ` Rafael J. Wysocki
2015-11-08 20:35 ` Andy Shevchenko
2015-11-08 20:35   ` Andy Shevchenko
2015-11-09 22:29   ` Sinan Kaya
2015-11-09 22:29     ` Sinan Kaya
2015-11-09 22:29     ` Sinan Kaya
2015-11-09  5:24 ` Jiang Liu
2015-11-09  5:24   ` Jiang Liu
2015-11-09  5:45   ` Sinan Kaya
2015-11-09  5:45     ` Sinan Kaya
2015-11-09  8:45     ` Jiang Liu
2015-11-09  8:45       ` Jiang Liu
2015-11-09 13:50     ` Timur Tabi
2015-11-09 13:50       ` Timur Tabi
2015-11-09 16:28       ` Sinan Kaya
2015-11-09 16:28         ` Sinan Kaya
2015-11-12  6:14 [PATCH V2] " Sinan Kaya
2015-11-12  6:14 ` [PATCH] " Sinan Kaya
2015-11-12  9:56   ` Andy Shevchenko
2015-11-12 15:04     ` Sinan Kaya
2015-11-12 15:17       ` Andy Shevchenko
2015-11-12 15:54         ` okaya
2015-11-12 15:58           ` Timur Tabi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.