All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [RFC PATCH v3 1/2] PCI/ACPI: Add stacked IRQ domain support to PCI Interrupt Link
@ 2020-11-22  8:51 kernel test robot
  0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2020-11-22  8:51 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 8712 bytes --]

CC: kbuild-all(a)lists.01.org
In-Reply-To: <20201122073453.5758-1-chenbaozi@phytium.com.cn>
References: <20201122073453.5758-1-chenbaozi@phytium.com.cn>
TO: Chen Baozi <chenbaozi@phytium.com.cn>

Hi Chen,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on pci/next]
[also build test WARNING on v5.10-rc4 next-20201120]
[cannot apply to pm/linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Chen-Baozi/PCI-ACPI-Add-stacked-IRQ-domain-support-to-PCI-Interrupt-Link/20201122-154200
base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
:::::: branch date: 69 minutes ago
:::::: commit date: 69 minutes ago
config: i386-randconfig-m021-20201122 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/acpi/pci_irq.c:469 acpi_pci_irq_enable() error: uninitialized symbol 'rs_fwnode'.

vim +/rs_fwnode +469 drivers/acpi/pci_irq.c

e237a5518425155 Chen Fan          2016-02-15  396  
4be44fcd3bf648b Len Brown         2005-08-05  397  int acpi_pci_irq_enable(struct pci_dev *dev)
^1da177e4c3f415 Linus Torvalds    2005-04-16  398  {
beba8a643d7f774 Bjorn Helgaas     2008-12-08  399  	struct acpi_prt_entry *entry;
3f0f3c27be19d39 Bjorn Helgaas     2008-12-08  400  	int gsi;
3f0f3c27be19d39 Bjorn Helgaas     2008-12-08  401  	u8 pin;
50eca3eb89d73d9 Bob Moore         2005-09-30  402  	int triggering = ACPI_LEVEL_SENSITIVE;
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  403  	/*
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  404  	 * On ARM systems with the GIC interrupt model, level interrupts
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  405  	 * are always polarity high by specification; PCI legacy
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  406  	 * IRQs lines are inverted before reaching the interrupt
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  407  	 * controller and must therefore be considered active high
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  408  	 * as default.
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  409  	 */
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  410  	int polarity = acpi_irq_model == ACPI_IRQ_MODEL_GIC ?
10b68700add43d0 Lorenzo Pieralisi 2016-09-05  411  				      ACPI_ACTIVE_HIGH : ACPI_ACTIVE_LOW;
^1da177e4c3f415 Linus Torvalds    2005-04-16  412  	char *link = NULL;
c83642d5123225a Bjorn Helgaas     2008-06-27  413  	char link_desc[16];
349f0d5640c18db Kenji Kaneshige   2005-07-28  414  	int rc;
648dbd4175c763d Chen Baozi        2020-11-22  415  	struct fwnode_handle *rs_fwnode;
^1da177e4c3f415 Linus Torvalds    2005-04-16  416  
8015a01486a0f78 Kristen Accardi   2005-11-02  417  	pin = dev->pin;
^1da177e4c3f415 Linus Torvalds    2005-04-16  418  	if (!pin) {
4be44fcd3bf648b Len Brown         2005-08-05  419  		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
4be44fcd3bf648b Len Brown         2005-08-05  420  				  "No interrupt pin configured for device %s\n",
4be44fcd3bf648b Len Brown         2005-08-05  421  				  pci_name(dev)));
d550d98d3317378 Patrick Mochel    2006-06-27  422  		return 0;
^1da177e4c3f415 Linus Torvalds    2005-04-16  423  	}
^1da177e4c3f415 Linus Torvalds    2005-04-16  424  
67b4eab91caf2ad Bjorn Helgaas     2016-02-17  425  	if (dev->irq_managed && dev->irq > 0)
cffe0a2b5a34c95 Jiang Liu         2014-10-27  426  		return 0;
cffe0a2b5a34c95 Jiang Liu         2014-10-27  427  
beba8a643d7f774 Bjorn Helgaas     2008-12-08  428  	entry = acpi_pci_irq_lookup(dev, pin);
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  429  	if (!entry) {
^1da177e4c3f415 Linus Torvalds    2005-04-16  430  		/*
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  431  		 * IDE legacy mode controller IRQs are magic. Why do compat
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  432  		 * extensions always make such a nasty mess.
^1da177e4c3f415 Linus Torvalds    2005-04-16  433  		 */
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  434  		if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  435  				(dev->class & 0x05) == 0)
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  436  			return 0;
5697b7ca406b4ee Bjorn Helgaas     2008-12-08  437  	}
beba8a643d7f774 Bjorn Helgaas     2008-12-08  438  
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  439  	if (entry) {
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  440  		if (entry->link)
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  441  			gsi = acpi_pci_link_allocate_irq(entry->link,
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  442  							 entry->index,
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  443  							 &triggering, &polarity,
648dbd4175c763d Chen Baozi        2020-11-22  444  							 &link,
648dbd4175c763d Chen Baozi        2020-11-22  445  							 &rs_fwnode);
beba8a643d7f774 Bjorn Helgaas     2008-12-08  446  		else
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  447  			gsi = entry->index;
74f82af1eda39c2 Bjorn Helgaas     2008-12-08  448  	} else
beba8a643d7f774 Bjorn Helgaas     2008-12-08  449  		gsi = -1;
^1da177e4c3f415 Linus Torvalds    2005-04-16  450  
e237a5518425155 Chen Fan          2016-02-15  451  	if (gsi < 0) {
^1da177e4c3f415 Linus Torvalds    2005-04-16  452  		/*
^1da177e4c3f415 Linus Torvalds    2005-04-16  453  		 * No IRQ known to the ACPI subsystem - maybe the BIOS /
^1da177e4c3f415 Linus Torvalds    2005-04-16  454  		 * driver reported one, then use it. Exit in any case.
^1da177e4c3f415 Linus Torvalds    2005-04-16  455  		 */
29b49958cf73b43 Wenwen Wang       2019-08-20  456  		if (!acpi_pci_irq_valid(dev, pin)) {
29b49958cf73b43 Wenwen Wang       2019-08-20  457  			kfree(entry);
e237a5518425155 Chen Fan          2016-02-15  458  			return 0;
29b49958cf73b43 Wenwen Wang       2019-08-20  459  		}
e237a5518425155 Chen Fan          2016-02-15  460  
c1aaae673f68448 Tomasz Nowicki    2014-02-20  461  		if (acpi_isa_register_gsi(dev))
66fd3835ac9a374 Joe Perches       2012-11-21  462  			dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
66fd3835ac9a374 Joe Perches       2012-11-21  463  				 pin_name(pin));
181380b702eee1a Yinghai Lu        2013-02-16  464  
b685f3b1744061a Tomasz Nowicki    2014-02-10  465  		kfree(entry);
66fd3835ac9a374 Joe Perches       2012-11-21  466  		return 0;
^1da177e4c3f415 Linus Torvalds    2005-04-16  467  	}
^1da177e4c3f415 Linus Torvalds    2005-04-16  468  
648dbd4175c763d Chen Baozi        2020-11-22 @469  	rc = acpi_register_irq(&dev->dev, gsi, triggering, polarity, rs_fwnode);
349f0d5640c18db Kenji Kaneshige   2005-07-28  470  	if (rc < 0) {
c83642d5123225a Bjorn Helgaas     2008-06-27  471  		dev_warn(&dev->dev, "PCI INT %c: failed to register GSI\n",
cf68b80b0e0cbc6 Bjorn Helgaas     2008-12-08  472  			 pin_name(pin));
181380b702eee1a Yinghai Lu        2013-02-16  473  		kfree(entry);
d550d98d3317378 Patrick Mochel    2006-06-27  474  		return rc;
349f0d5640c18db Kenji Kaneshige   2005-07-28  475  	}
67b4eab91caf2ad Bjorn Helgaas     2016-02-17  476  	dev->irq = rc;
67b4eab91caf2ad Bjorn Helgaas     2016-02-17  477  	dev->irq_managed = 1;
^1da177e4c3f415 Linus Torvalds    2005-04-16  478  
^1da177e4c3f415 Linus Torvalds    2005-04-16  479  	if (link)
c83642d5123225a Bjorn Helgaas     2008-06-27  480  		snprintf(link_desc, sizeof(link_desc), " -> Link[%s]", link);
c83642d5123225a Bjorn Helgaas     2008-06-27  481  	else
c83642d5123225a Bjorn Helgaas     2008-06-27  482  		link_desc[0] = '\0';
^1da177e4c3f415 Linus Torvalds    2005-04-16  483  
85b8582d7ca5160 Vincent Palatin   2011-12-05  484  	dev_dbg(&dev->dev, "PCI INT %c%s -> GSI %u (%s, %s) -> IRQ %d\n",
cf68b80b0e0cbc6 Bjorn Helgaas     2008-12-08  485  		pin_name(pin), link_desc, gsi,
50eca3eb89d73d9 Bob Moore         2005-09-30  486  		(triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge",
50eca3eb89d73d9 Bob Moore         2005-09-30  487  		(polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq);
^1da177e4c3f415 Linus Torvalds    2005-04-16  488  
181380b702eee1a Yinghai Lu        2013-02-16  489  	kfree(entry);
d550d98d3317378 Patrick Mochel    2006-06-27  490  	return 0;
^1da177e4c3f415 Linus Torvalds    2005-04-16  491  }
^1da177e4c3f415 Linus Torvalds    2005-04-16  492  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 39436 bytes --]

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

* Re: [RFC PATCH v3 1/2] PCI/ACPI: Add stacked IRQ domain support to PCI Interrupt Link
  2020-11-22  7:34 ` Chen Baozi
  (?)
@ 2020-11-22 16:16 ` kernel test robot
  -1 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2020-11-22 16:16 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 2502 bytes --]

Hi Chen,

[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on pci/next]
[also build test WARNING on v5.10-rc4 next-20201120]
[cannot apply to pm/linux-next]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Chen-Baozi/PCI-ACPI-Add-stacked-IRQ-domain-support-to-PCI-Interrupt-Link/20201122-154200
base:   https://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci.git next
config: arm64-allyesconfig (attached as .config)
compiler: aarch64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/648dbd4175c763d8ff2659237fd485a553824f09
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Chen-Baozi/PCI-ACPI-Add-stacked-IRQ-domain-support-to-PCI-Interrupt-Link/20201122-154200
        git checkout 648dbd4175c763d8ff2659237fd485a553824f09
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/acpi/irq.c:41:5: warning: no previous prototype for 'acpi_register_irq' [-Wmissing-prototypes]
      41 | int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
         |     ^~~~~~~~~~~~~~~~~

vim +/acpi_register_irq +41 drivers/acpi/irq.c

    40	
  > 41	int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
    42			      int polarity, struct fwnode_handle *fwnode)
    43	{
    44		struct irq_fwspec fwspec;
    45	
    46		if (!fwnode) {
    47			dev_warn(dev, "No registered irqchip for hwirq %d\n", hwirq);
    48			return -EINVAL;
    49		}
    50	
    51		fwspec.fwnode = fwnode;
    52		fwspec.param[0] = hwirq;
    53		fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
    54		fwspec.param_count = 2;
    55	
    56		return irq_create_fwspec_mapping(&fwspec);
    57	}
    58	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 75477 bytes --]

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

* [RFC PATCH v3 1/2] PCI/ACPI: Add stacked IRQ domain support to PCI Interrupt Link
@ 2020-11-22  7:34 ` Chen Baozi
  0 siblings, 0 replies; 4+ messages in thread
From: Chen Baozi @ 2020-11-22  7:34 UTC (permalink / raw)
  To: Ard Biesheuvel, Marc Zyngier, Bjorn Helgaas
  Cc: linux-acpi, linux-pci, linux-arm-kernel, linux-kernel,
	Hanjun Guo, Lorenzo Pieralisi, Rafael J. Wysocki

The ResourceSource field of an Extended Interrupt Descriptor was ignored
when the driver is parsing _PRS method of PNP0C0F PCI Interrupt Link
devices, which means PCI INTx would be always registered under the GSI
domain. This patch introduces stacked IRQ domain support to PCI Interrupt
Link devices for ACPI.

With this support, we can populate the ResourceSource field in _PRS method
of PCI Interrupt Link devices to refer to a device object that describes
an interrupt controller as the following examples:

  Device (IXIU) {
    ...
  }

  Device(LINKA) {
    Name(_HID, EISAID("PNP0C0F"))
    Name(_PRS, ResourceTemplate(){
      Interrupt(ResourceProducer, Level, ActiveHigh, Exclusive,
                0, "\\SB.IXIU") { 60 }
    })
    ...
  }

Signed-off-by: Chen Baozi <chenbaozi@phytium.com.cn>
---
 drivers/acpi/internal.h     | 12 ++++++++++++
 drivers/acpi/irq.c          | 34 ++++++++++++++++++++--------------
 drivers/acpi/pci_irq.c      |  8 ++++++--
 drivers/acpi/pci_link.c     | 17 +++++++++++++++--
 include/acpi/acpi_drivers.h |  2 +-
 include/linux/acpi.h        | 10 ++++++++++
 6 files changed, 64 insertions(+), 19 deletions(-)

diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index e3638bafb941..38ebe24bce3b 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -88,6 +88,18 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
 acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context);
 void acpi_scan_table_handler(u32 event, void *table, void *context);
 
+#ifdef CONFIG_ACPI_GENERIC_GSI
+int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
+		      int polarity, struct fwnode_handle *fwnode);
+#else
+static inline
+int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
+		      int polarity, struct fwnode_handle *fwnode)
+{
+	return acpi_register_gsi(dev, hwirq, trigger, polarity);
+}
+#endif
+
 /* --------------------------------------------------------------------------
                      Device Node Initialization / Removal
    -------------------------------------------------------------------------- */
diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c
index e209081d644b..2fff5401c3f3 100644
--- a/drivers/acpi/irq.c
+++ b/drivers/acpi/irq.c
@@ -38,6 +38,24 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
 }
 EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
 
+int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
+		      int polarity, struct fwnode_handle *fwnode)
+{
+	struct irq_fwspec fwspec;
+
+	if (!fwnode) {
+		dev_warn(dev, "No registered irqchip for hwirq %d\n", hwirq);
+		return -EINVAL;
+	}
+
+	fwspec.fwnode = fwnode;
+	fwspec.param[0] = hwirq;
+	fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
+	fwspec.param_count = 2;
+
+	return irq_create_fwspec_mapping(&fwspec);
+}
+
 /**
  * acpi_register_gsi() - Map a GSI to a linux IRQ number
  * @dev: device for which IRQ has to be mapped
@@ -51,19 +69,7 @@ EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
 int acpi_register_gsi(struct device *dev, u32 gsi, int trigger,
 		      int polarity)
 {
-	struct irq_fwspec fwspec;
-
-	if (WARN_ON(!acpi_gsi_domain_id)) {
-		pr_warn("GSI: No registered irqchip, giving up\n");
-		return -EINVAL;
-	}
-
-	fwspec.fwnode = acpi_gsi_domain_id;
-	fwspec.param[0] = gsi;
-	fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
-	fwspec.param_count = 2;
-
-	return irq_create_fwspec_mapping(&fwspec);
+	return acpi_register_irq(dev, gsi, trigger, polarity, acpi_gsi_domain_id);
 }
 EXPORT_SYMBOL_GPL(acpi_register_gsi);
 
@@ -92,7 +98,7 @@ EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
  * Return:
  * The referenced device fwhandle or NULL on failure
  */
-static struct fwnode_handle *
+struct fwnode_handle *
 acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source)
 {
 	struct fwnode_handle *result;
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index 14ee631cb7cf..5cccc0f70781 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -22,6 +22,8 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 
+#include "internal.h"
+
 #define PREFIX "ACPI: "
 
 #define _COMPONENT		ACPI_PCI_COMPONENT
@@ -410,6 +412,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 	char *link = NULL;
 	char link_desc[16];
 	int rc;
+	struct fwnode_handle *rs_fwnode;
 
 	pin = dev->pin;
 	if (!pin) {
@@ -438,7 +441,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 			gsi = acpi_pci_link_allocate_irq(entry->link,
 							 entry->index,
 							 &triggering, &polarity,
-							 &link);
+							 &link,
+							 &rs_fwnode);
 		else
 			gsi = entry->index;
 	} else
@@ -462,7 +466,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 		return 0;
 	}
 
-	rc = acpi_register_gsi(&dev->dev, gsi, triggering, polarity);
+	rc = acpi_register_irq(&dev->dev, gsi, triggering, polarity, rs_fwnode);
 	if (rc < 0) {
 		dev_warn(&dev->dev, "PCI INT %c: failed to register GSI\n",
 			 pin_name(pin));
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index fb4c5632a232..2b6f6478bb30 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -59,6 +59,7 @@ struct acpi_pci_link_irq {
 	u8 resource_type;
 	u8 possible_count;
 	u32 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
+	struct acpi_resource_source resource_source;
 	u8 initialized:1;
 	u8 reserved:7;
 };
@@ -120,6 +121,8 @@ static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
 		{
 			struct acpi_resource_extended_irq *p =
 			    &resource->data.extended_irq;
+			struct acpi_resource_source *rs =
+			    &link->irq.resource_source;
 			if (!p || !p->interrupt_count) {
 				printk(KERN_WARNING PREFIX
 					      "Blank _PRS EXT IRQ resource\n");
@@ -140,6 +143,12 @@ static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
 			link->irq.triggering = p->triggering;
 			link->irq.polarity = p->polarity;
 			link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
+			if (p->resource_source.string_length) {
+				rs->index = p->resource_source.index;
+				rs->string_length = p->resource_source.string_length;
+				rs->string_ptr = kstrdup(p->resource_source.string_ptr,
+							 GFP_KERNEL);
+			}
 			break;
 		}
 	default:
@@ -326,7 +335,8 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
 			resource->res.data.extended_irq.shareable = ACPI_SHARED;
 		resource->res.data.extended_irq.interrupt_count = 1;
 		resource->res.data.extended_irq.interrupts[0] = irq;
-		/* ignore resource_source, it's optional */
+		resource->res.data.extended_irq.resource_source =
+			link->irq.resource_source;
 		break;
 	default:
 		printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type);
@@ -612,7 +622,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
  * failure: return -1
  */
 int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
-			       int *polarity, char **name)
+			       int *polarity, char **name, struct fwnode_handle **rs_fwnode)
 {
 	int result;
 	struct acpi_device *device;
@@ -656,6 +666,9 @@ int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
 		*polarity = link->irq.polarity;
 	if (name)
 		*name = acpi_device_bid(link->device);
+	if (rs_fwnode)
+		*rs_fwnode = acpi_get_irq_source_fwhandle(&link->irq.resource_source);
+
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 			  "Link %s is referenced\n",
 			  acpi_device_bid(link->device)));
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h
index 5eb175933a5b..dbdcd2f51d4c 100644
--- a/include/acpi/acpi_drivers.h
+++ b/include/acpi/acpi_drivers.h
@@ -68,7 +68,7 @@
 
 int acpi_irq_penalty_init(void);
 int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
-			       int *polarity, char **name);
+			       int *polarity, char **name, struct fwnode_handle **rs_fwnode);
 int acpi_pci_link_free_irq(acpi_handle handle);
 
 /* ACPI PCI Device Binding (pci_bind.c) */
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 39263c6b52e1..b182a267fe66 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -336,6 +336,16 @@ struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,
 					     const struct irq_domain_ops *ops,
 					     void *host_data);
 
+#ifdef CONFIG_ACPI_GENERIC_GSI
+struct fwnode_handle *acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source);
+#else
+static inline
+struct fwnode_handle *acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source)
+{
+	return NULL;
+}
+#endif
+
 #ifdef CONFIG_X86_IO_APIC
 extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);
 #else
-- 
2.28.0


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

* [RFC PATCH v3 1/2] PCI/ACPI: Add stacked IRQ domain support to PCI Interrupt Link
@ 2020-11-22  7:34 ` Chen Baozi
  0 siblings, 0 replies; 4+ messages in thread
From: Chen Baozi @ 2020-11-22  7:34 UTC (permalink / raw)
  To: Ard Biesheuvel, Marc Zyngier, Bjorn Helgaas
  Cc: Lorenzo Pieralisi, Rafael J. Wysocki, linux-pci, linux-kernel,
	linux-acpi, Hanjun Guo, linux-arm-kernel

The ResourceSource field of an Extended Interrupt Descriptor was ignored
when the driver is parsing _PRS method of PNP0C0F PCI Interrupt Link
devices, which means PCI INTx would be always registered under the GSI
domain. This patch introduces stacked IRQ domain support to PCI Interrupt
Link devices for ACPI.

With this support, we can populate the ResourceSource field in _PRS method
of PCI Interrupt Link devices to refer to a device object that describes
an interrupt controller as the following examples:

  Device (IXIU) {
    ...
  }

  Device(LINKA) {
    Name(_HID, EISAID("PNP0C0F"))
    Name(_PRS, ResourceTemplate(){
      Interrupt(ResourceProducer, Level, ActiveHigh, Exclusive,
                0, "\\SB.IXIU") { 60 }
    })
    ...
  }

Signed-off-by: Chen Baozi <chenbaozi@phytium.com.cn>
---
 drivers/acpi/internal.h     | 12 ++++++++++++
 drivers/acpi/irq.c          | 34 ++++++++++++++++++++--------------
 drivers/acpi/pci_irq.c      |  8 ++++++--
 drivers/acpi/pci_link.c     | 17 +++++++++++++++--
 include/acpi/acpi_drivers.h |  2 +-
 include/linux/acpi.h        | 10 ++++++++++
 6 files changed, 64 insertions(+), 19 deletions(-)

diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index e3638bafb941..38ebe24bce3b 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -88,6 +88,18 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
 acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context);
 void acpi_scan_table_handler(u32 event, void *table, void *context);
 
+#ifdef CONFIG_ACPI_GENERIC_GSI
+int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
+		      int polarity, struct fwnode_handle *fwnode);
+#else
+static inline
+int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
+		      int polarity, struct fwnode_handle *fwnode)
+{
+	return acpi_register_gsi(dev, hwirq, trigger, polarity);
+}
+#endif
+
 /* --------------------------------------------------------------------------
                      Device Node Initialization / Removal
    -------------------------------------------------------------------------- */
diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c
index e209081d644b..2fff5401c3f3 100644
--- a/drivers/acpi/irq.c
+++ b/drivers/acpi/irq.c
@@ -38,6 +38,24 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
 }
 EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
 
+int acpi_register_irq(struct device *dev, u32 hwirq, int trigger,
+		      int polarity, struct fwnode_handle *fwnode)
+{
+	struct irq_fwspec fwspec;
+
+	if (!fwnode) {
+		dev_warn(dev, "No registered irqchip for hwirq %d\n", hwirq);
+		return -EINVAL;
+	}
+
+	fwspec.fwnode = fwnode;
+	fwspec.param[0] = hwirq;
+	fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
+	fwspec.param_count = 2;
+
+	return irq_create_fwspec_mapping(&fwspec);
+}
+
 /**
  * acpi_register_gsi() - Map a GSI to a linux IRQ number
  * @dev: device for which IRQ has to be mapped
@@ -51,19 +69,7 @@ EXPORT_SYMBOL_GPL(acpi_gsi_to_irq);
 int acpi_register_gsi(struct device *dev, u32 gsi, int trigger,
 		      int polarity)
 {
-	struct irq_fwspec fwspec;
-
-	if (WARN_ON(!acpi_gsi_domain_id)) {
-		pr_warn("GSI: No registered irqchip, giving up\n");
-		return -EINVAL;
-	}
-
-	fwspec.fwnode = acpi_gsi_domain_id;
-	fwspec.param[0] = gsi;
-	fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
-	fwspec.param_count = 2;
-
-	return irq_create_fwspec_mapping(&fwspec);
+	return acpi_register_irq(dev, gsi, trigger, polarity, acpi_gsi_domain_id);
 }
 EXPORT_SYMBOL_GPL(acpi_register_gsi);
 
@@ -92,7 +98,7 @@ EXPORT_SYMBOL_GPL(acpi_unregister_gsi);
  * Return:
  * The referenced device fwhandle or NULL on failure
  */
-static struct fwnode_handle *
+struct fwnode_handle *
 acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source)
 {
 	struct fwnode_handle *result;
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index 14ee631cb7cf..5cccc0f70781 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -22,6 +22,8 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 
+#include "internal.h"
+
 #define PREFIX "ACPI: "
 
 #define _COMPONENT		ACPI_PCI_COMPONENT
@@ -410,6 +412,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 	char *link = NULL;
 	char link_desc[16];
 	int rc;
+	struct fwnode_handle *rs_fwnode;
 
 	pin = dev->pin;
 	if (!pin) {
@@ -438,7 +441,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 			gsi = acpi_pci_link_allocate_irq(entry->link,
 							 entry->index,
 							 &triggering, &polarity,
-							 &link);
+							 &link,
+							 &rs_fwnode);
 		else
 			gsi = entry->index;
 	} else
@@ -462,7 +466,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
 		return 0;
 	}
 
-	rc = acpi_register_gsi(&dev->dev, gsi, triggering, polarity);
+	rc = acpi_register_irq(&dev->dev, gsi, triggering, polarity, rs_fwnode);
 	if (rc < 0) {
 		dev_warn(&dev->dev, "PCI INT %c: failed to register GSI\n",
 			 pin_name(pin));
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index fb4c5632a232..2b6f6478bb30 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -59,6 +59,7 @@ struct acpi_pci_link_irq {
 	u8 resource_type;
 	u8 possible_count;
 	u32 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
+	struct acpi_resource_source resource_source;
 	u8 initialized:1;
 	u8 reserved:7;
 };
@@ -120,6 +121,8 @@ static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
 		{
 			struct acpi_resource_extended_irq *p =
 			    &resource->data.extended_irq;
+			struct acpi_resource_source *rs =
+			    &link->irq.resource_source;
 			if (!p || !p->interrupt_count) {
 				printk(KERN_WARNING PREFIX
 					      "Blank _PRS EXT IRQ resource\n");
@@ -140,6 +143,12 @@ static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
 			link->irq.triggering = p->triggering;
 			link->irq.polarity = p->polarity;
 			link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
+			if (p->resource_source.string_length) {
+				rs->index = p->resource_source.index;
+				rs->string_length = p->resource_source.string_length;
+				rs->string_ptr = kstrdup(p->resource_source.string_ptr,
+							 GFP_KERNEL);
+			}
 			break;
 		}
 	default:
@@ -326,7 +335,8 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
 			resource->res.data.extended_irq.shareable = ACPI_SHARED;
 		resource->res.data.extended_irq.interrupt_count = 1;
 		resource->res.data.extended_irq.interrupts[0] = irq;
-		/* ignore resource_source, it's optional */
+		resource->res.data.extended_irq.resource_source =
+			link->irq.resource_source;
 		break;
 	default:
 		printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type);
@@ -612,7 +622,7 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
  * failure: return -1
  */
 int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
-			       int *polarity, char **name)
+			       int *polarity, char **name, struct fwnode_handle **rs_fwnode)
 {
 	int result;
 	struct acpi_device *device;
@@ -656,6 +666,9 @@ int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
 		*polarity = link->irq.polarity;
 	if (name)
 		*name = acpi_device_bid(link->device);
+	if (rs_fwnode)
+		*rs_fwnode = acpi_get_irq_source_fwhandle(&link->irq.resource_source);
+
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 			  "Link %s is referenced\n",
 			  acpi_device_bid(link->device)));
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h
index 5eb175933a5b..dbdcd2f51d4c 100644
--- a/include/acpi/acpi_drivers.h
+++ b/include/acpi/acpi_drivers.h
@@ -68,7 +68,7 @@
 
 int acpi_irq_penalty_init(void);
 int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
-			       int *polarity, char **name);
+			       int *polarity, char **name, struct fwnode_handle **rs_fwnode);
 int acpi_pci_link_free_irq(acpi_handle handle);
 
 /* ACPI PCI Device Binding (pci_bind.c) */
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 39263c6b52e1..b182a267fe66 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -336,6 +336,16 @@ struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,
 					     const struct irq_domain_ops *ops,
 					     void *host_data);
 
+#ifdef CONFIG_ACPI_GENERIC_GSI
+struct fwnode_handle *acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source);
+#else
+static inline
+struct fwnode_handle *acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source)
+{
+	return NULL;
+}
+#endif
+
 #ifdef CONFIG_X86_IO_APIC
 extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);
 #else
-- 
2.28.0


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

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

end of thread, other threads:[~2020-11-22 16:16 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-22  8:51 [RFC PATCH v3 1/2] PCI/ACPI: Add stacked IRQ domain support to PCI Interrupt Link kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2020-11-22  7:34 Chen Baozi
2020-11-22  7:34 ` Chen Baozi
2020-11-22 16:16 ` kernel test robot

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.