get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.0/patches/2175498/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2175498,
    "url": "http://patchwork.ozlabs.org/api/1.0/patches/2175498/?format=api",
    "project": {
        "id": 28,
        "url": "http://patchwork.ozlabs.org/api/1.0/projects/28/?format=api",
        "name": "Linux PCI development",
        "link_name": "linux-pci",
        "list_id": "linux-pci.vger.kernel.org",
        "list_email": "linux-pci@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null
    },
    "msgid": "<20251218-gicv5-host-acpi-v2-7-eec76cd1d40b@kernel.org>",
    "date": "2025-12-18T10:14:33",
    "name": "[v2,7/7] irqchip/gic-v5: Add ACPI IWB probing",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "ed12be4a38732633825f4b5e13a2886c8ad06c30",
    "submitter": {
        "id": 84664,
        "url": "http://patchwork.ozlabs.org/api/1.0/people/84664/?format=api",
        "name": "Lorenzo Pieralisi",
        "email": "lpieralisi@kernel.org"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-pci/patch/20251218-gicv5-host-acpi-v2-7-eec76cd1d40b@kernel.org/mbox/",
    "series": [
        {
            "id": 485814,
            "url": "http://patchwork.ozlabs.org/api/1.0/series/485814/?format=api",
            "date": "2025-12-18T10:14:26",
            "name": "irqchip/gic-v5: Code first ACPI boot support",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/485814/mbox/"
        }
    ],
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2175498/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <linux-pci+bounces-43280-incoming=patchwork.ozlabs.org@vger.kernel.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linux-pci@vger.kernel.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=iVGVHrKa;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-pci+bounces-43280-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"iVGVHrKa\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"
        ],
        "Received": [
            "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4dX6PC6lLmz1xty\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 18 Dec 2025 21:30:07 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 2118830CB793\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 18 Dec 2025 10:26:58 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 4E63433F392;\n\tThu, 18 Dec 2025 10:15:39 +0000 (UTC)",
            "from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 205C033F37B;\n\tThu, 18 Dec 2025 10:15:39 +0000 (UTC)",
            "by smtp.kernel.org (Postfix) with ESMTPSA id EDA6CC116C6;\n\tThu, 18 Dec 2025 10:15:34 +0000 (UTC)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1766052939; cv=none;\n b=qB+YO1P4kcwBvmht4Uj6+L5ANj/ykpxKvAUj9tpnFV6kmb705TVJf3EEXWKy/sfTkW4w4hMZuLg9sm7OYa14wpPVfxEOUFd21LPe3QHkmEbOW4JzMN2ixewQewbj3o+ckjBCRDFC7OUF1AV3mURR3HKEp16FY36ZTd4t38LNvOA=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1766052939; c=relaxed/simple;\n\tbh=nTj9AwGWa68OxCQB2ktt6UeErE1xFTjgXOQwZaEU084=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=t1XKLFomQb4RzUN0SNS1iDjMz2VhmG1Vdu207OawflNTm+5wRodLE0+uGUoaapEP4OaHgyHoxKJqekk3pDcBIaTnuOJGD2BjwVv/cB6sjf34pPSBzOjXpxrf2M819dzRMoCSgho55UyuvgNRQ5qHBMUcgdnUVEnrjRXCnQEKqrM=",
        "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=iVGVHrKa; arc=none smtp.client-ip=10.30.226.201",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1766052939;\n\tbh=nTj9AwGWa68OxCQB2ktt6UeErE1xFTjgXOQwZaEU084=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:From;\n\tb=iVGVHrKankckqVetezOf6ZpRVgN2+0U+Ps7lIpaDUegsDIKXYDF/QqPxOa40l9FJI\n\t xcw2vbI3gged1gJ7N95KwKPdw/r/cHgOnpKTXZTQf4PZlRNBnaTPHW8IjsFmU+5h/1\n\t VxLzD/ynhiKwn1VwaHAiyhOwxGBuGzQfk4e2U8CxqmO50syPhk9EgF+sixO0sWL8AA\n\t NXAAsHk6w77vB4iUpAa7zFbvr2hNJ+Om4ymdVxoisca2EWJ5PSb//KA8mb6YXg6HjU\n\t BLlopX6cOV902Frm4RnAKpWeIuW2KFOXZNbwgbPQUsog0grGnYPmdfx73GWdkQxjQb\n\t zOEYxrRSVLbAQ==",
        "From": "Lorenzo Pieralisi <lpieralisi@kernel.org>",
        "Date": "Thu, 18 Dec 2025 11:14:33 +0100",
        "Subject": "[PATCH v2 7/7] irqchip/gic-v5: Add ACPI IWB probing",
        "Precedence": "bulk",
        "X-Mailing-List": "linux-pci@vger.kernel.org",
        "List-Id": "<linux-pci.vger.kernel.org>",
        "List-Subscribe": "<mailto:linux-pci+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:linux-pci+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "7bit",
        "Message-Id": "<20251218-gicv5-host-acpi-v2-7-eec76cd1d40b@kernel.org>",
        "References": "<20251218-gicv5-host-acpi-v2-0-eec76cd1d40b@kernel.org>",
        "In-Reply-To": "<20251218-gicv5-host-acpi-v2-0-eec76cd1d40b@kernel.org>",
        "To": "\"Rafael J. Wysocki\" <rafael@kernel.org>, Len Brown <lenb@kernel.org>,\n Robert Moore <robert.moore@intel.com>, Thomas Gleixner <tglx@linutronix.de>,\n Hanjun Guo <guohanjun@huawei.com>, Sudeep Holla <sudeep.holla@arm.com>,\n Marc Zyngier <maz@kernel.org>, Bjorn Helgaas <bhelgaas@google.com>",
        "Cc": "linux-acpi@vger.kernel.org, acpica-devel@lists.linux.dev,\n linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org,\n linux-pci@vger.kernel.org, Lorenzo Pieralisi <lpieralisi@kernel.org>",
        "X-Mailer": "b4 0.14.3"
    },
    "content": "To probe an IWB in an ACPI based system it is required:\n\n- to implement the IORT functions handling the IWB IORT node and create\n  functions to retrieve IWB firmware information\n- to augment the driver to match the DSDT ACPI \"ARMH0003\" device and\n  retrieve the IWB wire and trigger mask from the GSI interrupt descriptor\n  in the IWB msi_domain_ops.msi_translate() function\n\nMake the required driver changes to enable IWB probing in ACPI systems.\n\nThe GICv5 GSI format requires special handling for IWB routed IRQs.\n\nAdd IWB GSI detection to the top level driver gic_v5_get_gsi_domain_id()\nfunction so that the correct IRQ domain for a GSI can be detected by\nparsing the GSI and check whether it is an IWB-backed IRQ or not.\n\nSigned-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org>\nCc: Thomas Gleixner <tglx@linutronix.de>\nCc: Hanjun Guo <guohanjun@huawei.com>\nCc: Sudeep Holla <sudeep.holla@arm.com>\nCc: Marc Zyngier <maz@kernel.org>\n---\n drivers/acpi/arm64/iort.c          | 95 ++++++++++++++++++++++++++++++++------\n drivers/irqchip/irq-gic-v5-iwb.c   | 42 +++++++++++++----\n drivers/irqchip/irq-gic-v5.c       |  4 ++\n include/linux/acpi_iort.h          |  1 +\n include/linux/irqchip/arm-gic-v5.h |  6 +++\n 5 files changed, 123 insertions(+), 25 deletions(-)",
    "diff": "diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c\nindex 17dbe66da804..4b0b753db738 100644\n--- a/drivers/acpi/arm64/iort.c\n+++ b/drivers/acpi/arm64/iort.c\n@@ -264,39 +264,47 @@ static acpi_status iort_match_node_callback(struct acpi_iort_node *node,\n \tstruct device *dev = context;\n \tacpi_status status = AE_NOT_FOUND;\n \n-\tif (node->type == ACPI_IORT_NODE_NAMED_COMPONENT) {\n+\tif (node->type == ACPI_IORT_NODE_NAMED_COMPONENT ||\n+\t    node->type == ACPI_IORT_NODE_IWB) {\n \t\tstruct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };\n-\t\tstruct acpi_device *adev;\n \t\tstruct acpi_iort_named_component *ncomp;\n-\t\tstruct device *nc_dev = dev;\n+\t\tstruct acpi_iort_iwb *iwb;\n+\t\tstruct device *cdev = dev;\n+\t\tstruct acpi_device *adev;\n+\t\tconst char *device_name;\n \n \t\t/*\n \t\t * Walk the device tree to find a device with an\n \t\t * ACPI companion; there is no point in scanning\n-\t\t * IORT for a device matching a named component if\n+\t\t * IORT for a device matching a named component or IWB if\n \t\t * the device does not have an ACPI companion to\n \t\t * start with.\n \t\t */\n \t\tdo {\n-\t\t\tadev = ACPI_COMPANION(nc_dev);\n+\t\t\tadev = ACPI_COMPANION(cdev);\n \t\t\tif (adev)\n \t\t\t\tbreak;\n \n-\t\t\tnc_dev = nc_dev->parent;\n-\t\t} while (nc_dev);\n+\t\t\tcdev = cdev->parent;\n+\t\t} while (cdev);\n \n \t\tif (!adev)\n \t\t\tgoto out;\n \n \t\tstatus = acpi_get_name(adev->handle, ACPI_FULL_PATHNAME, &buf);\n \t\tif (ACPI_FAILURE(status)) {\n-\t\t\tdev_warn(nc_dev, \"Can't get device full path name\\n\");\n+\t\t\tdev_warn(cdev, \"Can't get device full path name\\n\");\n \t\t\tgoto out;\n \t\t}\n \n-\t\tncomp = (struct acpi_iort_named_component *)node->node_data;\n-\t\tstatus = !strcmp(ncomp->device_name, buf.pointer) ?\n-\t\t\t\t\t\t\tAE_OK : AE_NOT_FOUND;\n+\t\tif (node->type == ACPI_IORT_NODE_NAMED_COMPONENT) {\n+\t\t\tncomp = (struct acpi_iort_named_component *)node->node_data;\n+\t\t\tdevice_name = ncomp->device_name;\n+\t\t} else {\n+\t\t\tiwb = (struct acpi_iort_iwb *)node->node_data;\n+\t\t\tdevice_name = iwb->device_name;\n+\t\t}\n+\t\tstatus = !strcmp(device_name, buf.pointer) ?  AE_OK : AE_NOT_FOUND;\n \t\tacpi_os_free(buf.pointer);\n \t} else if (node->type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX) {\n \t\tstruct acpi_iort_root_complex *pci_rc;\n@@ -317,12 +325,28 @@ static acpi_status iort_match_node_callback(struct acpi_iort_node *node,\n \treturn status;\n }\n \n+static acpi_status iort_match_iwb_callback(struct acpi_iort_node *node, void *context)\n+{\n+\tacpi_status status = AE_NOT_FOUND;\n+\tu32 *id = context;\n+\n+\tif (node->type == ACPI_IORT_NODE_IWB) {\n+\t\tstruct acpi_iort_iwb *iwb;\n+\n+\t\tiwb = (struct acpi_iort_iwb *)node->node_data;\n+\t\tstatus = iwb->iwb_index == *id ? AE_OK : AE_NOT_FOUND;\n+\t}\n+\n+\treturn status;\n+}\n+\n static int iort_id_map(struct acpi_iort_id_mapping *map, u8 type, u32 rid_in,\n \t\t       u32 *rid_out, bool check_overlap)\n {\n \t/* Single mapping does not care for input id */\n \tif (map->flags & ACPI_IORT_ID_SINGLE_MAPPING) {\n \t\tif (type == ACPI_IORT_NODE_NAMED_COMPONENT ||\n+\t\t    type == ACPI_IORT_NODE_IWB\t\t   ||\n \t\t    type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX) {\n \t\t\t*rid_out = map->output_base;\n \t\t\treturn 0;\n@@ -392,6 +416,7 @@ static struct acpi_iort_node *iort_node_get_id(struct acpi_iort_node *node,\n \n \tif (map->flags & ACPI_IORT_ID_SINGLE_MAPPING) {\n \t\tif (node->type == ACPI_IORT_NODE_NAMED_COMPONENT ||\n+\t\t    node->type == ACPI_IORT_NODE_IWB ||\n \t\t    node->type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX ||\n \t\t    node->type == ACPI_IORT_NODE_SMMU_V3 ||\n \t\t    node->type == ACPI_IORT_NODE_PMCG) {\n@@ -562,9 +587,14 @@ static struct acpi_iort_node *iort_find_dev_node(struct device *dev)\n \t\t\treturn node;\n \t\t/*\n \t\t * if not, then it should be a platform device defined in\n-\t\t * DSDT/SSDT (with Named Component node in IORT)\n+\t\t * DSDT/SSDT (with Named Component node in IORT) or an\n+\t\t * IWB device in the DSDT/SSDT.\n \t\t */\n-\t\treturn iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,\n+\t\tnode = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,\n+\t\t\t\t      iort_match_node_callback, dev);\n+\t\tif (node)\n+\t\t\treturn node;\n+\t\treturn iort_scan_node(ACPI_IORT_NODE_IWB,\n \t\t\t\t      iort_match_node_callback, dev);\n \t}\n \n@@ -756,6 +786,35 @@ struct irq_domain *iort_get_device_domain(struct device *dev, u32 id,\n \treturn irq_find_matching_fwnode(handle, bus_token);\n }\n \n+struct fwnode_handle *iort_iwb_handle(u32 iwb_id)\n+{\n+\tstruct fwnode_handle *fwnode;\n+\tstruct acpi_iort_node *node;\n+\tstruct acpi_device *device;\n+\tstruct acpi_iort_iwb *iwb;\n+\tacpi_status status;\n+\tacpi_handle handle;\n+\n+\t/* find its associated IWB node */\n+\tnode = iort_scan_node(ACPI_IORT_NODE_IWB, iort_match_iwb_callback, &iwb_id);\n+\tif (!node)\n+\t\treturn NULL;\n+\n+\tiwb = (struct acpi_iort_iwb *)node->node_data;\n+\tstatus = acpi_get_handle(NULL, iwb->device_name, &handle);\n+\tif (ACPI_FAILURE(status))\n+\t\treturn NULL;\n+\n+\tdevice = acpi_get_acpi_dev(handle);\n+\tif (!device)\n+\t\treturn NULL;\n+\n+\tfwnode = acpi_fwnode_handle(device);\n+\tacpi_put_acpi_dev(device);\n+\n+\treturn fwnode;\n+}\n+\n static void iort_set_device_domain(struct device *dev,\n \t\t\t\t   struct acpi_iort_node *node)\n {\n@@ -816,8 +875,14 @@ static struct irq_domain *iort_get_platform_device_domain(struct device *dev)\n \t/* find its associated iort node */\n \tnode = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,\n \t\t\t      iort_match_node_callback, dev);\n-\tif (!node)\n-\t\treturn NULL;\n+\tif (!node) {\n+\t\t/* find its associated iort node */\n+\t\tnode = iort_scan_node(ACPI_IORT_NODE_IWB,\n+\t\t\t\t      iort_match_node_callback, dev);\n+\n+\t\tif (!node)\n+\t\t\treturn NULL;\n+\t}\n \n \t/* then find its msi parent node */\n \tfor (i = 0; i < node->mapping_count; i++) {\ndiff --git a/drivers/irqchip/irq-gic-v5-iwb.c b/drivers/irqchip/irq-gic-v5-iwb.c\nindex ad9fdc14d1c6..c7d5fd34d053 100644\n--- a/drivers/irqchip/irq-gic-v5-iwb.c\n+++ b/drivers/irqchip/irq-gic-v5-iwb.c\n@@ -4,6 +4,7 @@\n  */\n #define pr_fmt(fmt)\t\"GICv5 IWB: \" fmt\n \n+#include <linux/acpi.h>\n #include <linux/init.h>\n #include <linux/kernel.h>\n #include <linux/msi.h>\n@@ -136,18 +137,31 @@ static int gicv5_iwb_irq_domain_translate(struct irq_domain *d, struct irq_fwspe\n \t\t\t\t\t  irq_hw_number_t *hwirq,\n \t\t\t\t\t  unsigned int *type)\n {\n-\tif (!is_of_node(fwspec->fwnode))\n-\t\treturn -EINVAL;\n+\tif (is_of_node(fwspec->fwnode)) {\n \n-\tif (fwspec->param_count < 2)\n-\t\treturn -EINVAL;\n+\t\tif (fwspec->param_count < 2)\n+\t\t\treturn -EINVAL;\n \n-\t/*\n-\t * param[0] is be the wire\n-\t * param[1] is the interrupt type\n-\t */\n-\t*hwirq = fwspec->param[0];\n-\t*type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK;\n+\t\t/*\n+\t\t * param[0] is be the wire\n+\t\t * param[1] is the interrupt type\n+\t\t */\n+\t\t*hwirq = fwspec->param[0];\n+\t\t*type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK;\n+\t}\n+\n+\tif (is_acpi_device_node(fwspec->fwnode)) {\n+\n+\t\tif (fwspec->param_count < 2)\n+\t\t\treturn -EINVAL;\n+\n+\t\t/*\n+\t\t * Extract the wire from param[0]\n+\t\t * param[1] is the interrupt type\n+\t\t */\n+\t\t*hwirq = FIELD_GET(GICV5_GSI_IWB_WIRE, fwspec->param[0]);\n+\t\t*type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK;\n+\t}\n \n \treturn 0;\n }\n@@ -265,10 +279,18 @@ static const struct of_device_id gicv5_iwb_of_match[] = {\n };\n MODULE_DEVICE_TABLE(of, gicv5_iwb_of_match);\n \n+#ifdef CONFIG_ACPI\n+static const struct acpi_device_id iwb_acpi_match[] = {\n+\t{ \"ARMH0003\", 0 },\n+\t{}\n+};\n+#endif\n+\n static struct platform_driver gicv5_iwb_platform_driver = {\n \t.driver = {\n \t\t.name\t\t\t= \"GICv5 IWB\",\n \t\t.of_match_table\t\t= gicv5_iwb_of_match,\n+\t\t.acpi_match_table\t= ACPI_PTR(iwb_acpi_match),\n \t\t.suppress_bind_attrs\t= true,\n \t},\n \t.probe\t\t\t\t= gicv5_iwb_device_probe,\ndiff --git a/drivers/irqchip/irq-gic-v5.c b/drivers/irqchip/irq-gic-v5.c\nindex 23fd551c4347..da867dd2e77d 100644\n--- a/drivers/irqchip/irq-gic-v5.c\n+++ b/drivers/irqchip/irq-gic-v5.c\n@@ -5,6 +5,7 @@\n \n #define pr_fmt(fmt)\t\"GICv5: \" fmt\n \n+#include <linux/acpi_iort.h>\n #include <linux/cpuhotplug.h>\n #include <linux/idr.h>\n #include <linux/irqdomain.h>\n@@ -1187,6 +1188,9 @@ static struct fwnode_handle *gsi_domain_handle;\n \n static struct fwnode_handle *gic_v5_get_gsi_domain_id(u32 gsi)\n {\n+\tif (FIELD_GET(GICV5_GSI_IC_TYPE, gsi) == GICV5_GSI_IWB_TYPE)\n+\t\treturn iort_iwb_handle(FIELD_GET(GICV5_GSI_IWB_FRAME_ID, gsi));\n+\n \treturn gsi_domain_handle;\n }\n \ndiff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h\nindex 2d22268677a9..17bb3374f4ca 100644\n--- a/include/linux/acpi_iort.h\n+++ b/include/linux/acpi_iort.h\n@@ -27,6 +27,7 @@ int iort_register_domain_token(int trans_id, phys_addr_t base,\n \t\t\t       struct fwnode_handle *fw_node);\n void iort_deregister_domain_token(int trans_id);\n struct fwnode_handle *iort_find_domain_token(int trans_id);\n+struct fwnode_handle *iort_iwb_handle(u32 iwb_id);\n \n #ifdef CONFIG_ACPI_IORT\n u32 iort_msi_map_id(struct device *dev, u32 id);\ndiff --git a/include/linux/irqchip/arm-gic-v5.h b/include/linux/irqchip/arm-gic-v5.h\nindex 334b6986435c..3da1ad80fc9d 100644\n--- a/include/linux/irqchip/arm-gic-v5.h\n+++ b/include/linux/irqchip/arm-gic-v5.h\n@@ -265,6 +265,12 @@\n \n #define GICV5_IWB_WENABLE_STATUSR_IDLE\t\tBIT(0)\n \n+#define GICV5_GSI_IC_TYPE\t\t\tGENMASK(31, 29)\n+#define GICV5_GSI_IWB_TYPE\t\t\t0x7\n+\n+#define GICV5_GSI_IWB_FRAME_ID\t\t\tGENMASK(28, 16)\n+#define GICV5_GSI_IWB_WIRE\t\t\tGENMASK(15, 0)\n+\n /*\n  * Global Data structures and functions\n  */\n",
    "prefixes": [
        "v2",
        "7/7"
    ]
}