* 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.