From patchwork Wed Sep 27 13:32:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shameerali Kolothum Thodi X-Patchwork-Id: 114370 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp5050445qgf; Wed, 27 Sep 2017 06:35:16 -0700 (PDT) X-Google-Smtp-Source: AOwi7QC8D4Q0OD4ZrvpUUjcsdn2tvOwJuW2nPTg7p+WOhmy/cRUpsjOSMuBnj/7jSoAA8vfVeFVz X-Received: by 10.159.197.6 with SMTP id bj6mr1322286plb.178.1506519316253; Wed, 27 Sep 2017 06:35:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1506519316; cv=none; d=google.com; s=arc-20160816; b=bXppGGWHND57TrmqVZPkxr+9Vdj9t4EFnsPoFzmsi20PNCUJJPxHvyRo6vKfkFeW+Q jgNM1Mxl6t078kDkJzTZkKYhBvU8ADUAdLoF/A3Jl3QyummSEqmgCbOk4nTNcpHrAXvG 0tSrlqKboxRTOmev8/v2q45pNWYMnegLiaFqq9v3fNw2F6+AwhVHVCJNmXc7a/+BbMzG N/sPPOG6HKrsVO0LtCyJHFZKnzv3Ch/JCaqjhmdbvI7g2DmRHNnEmjDlnYxQMdifgogZ HOSwah2sNukXMZiprISX7YCp3lbsMZeSOi0ZdZkSxpj4h2G6eCCIR0yOWb7OAJ71ctd9 fpbw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=o6R5s8ZOv1yNQvGs+jpKetXzRaMcqd1pAwgD0ZLv2mk=; b=RRpJgCdSLVq2TD1hAHbBiT6NXVjYRXi4zqulO/Yy4qltuAty0o6ZJVqyZBWUqE/CGx LsUUtofLMhDVeA3bXk/ChMJ8CkAqp0cvygRA+SmeD3n1PofBKmkzOxV+wajYkA3aEdrd tpZaGK1+CL4DLBZz8QyDWvowurLwjzuzWNU9lsAzgTIwWgdwbuG3QU0WlAhTILXtg6U0 tzdkv7GFYOxPEHzzDGs5j58QhpmuiqDyemFcDwD0TX5qumqNwTvVKatgLdTnx1KCKGct Pwf7K0ksbaIJaKpvjPJCcHquPCi+pBwVdBGjfRUAobth1iJae5xNCcSS9P/Nwa4R7/LJ cbiQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u9si7660961pge.139.2017.09.27.06.35.16; Wed, 27 Sep 2017 06:35:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752734AbdI0NfP (ORCPT + 6 others); Wed, 27 Sep 2017 09:35:15 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7058 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751959AbdI0NfO (ORCPT ); Wed, 27 Sep 2017 09:35:14 -0400 Received: from 172.30.72.58 (EHLO DGGEMS401-HUB.china.huawei.com) ([172.30.72.58]) by dggrg05-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id DID21035; Wed, 27 Sep 2017 21:35:11 +0800 (CST) Received: from S00345302A-PC.china.huawei.com (10.203.177.212) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.301.0; Wed, 27 Sep 2017 21:35:03 +0800 From: Shameer Kolothum To: , , , , , , , CC: , , , , , , , , , , Shameer Kolothum Subject: [PATCH v8 2/5] ACPI/IORT: Add msi address regions reservation helper Date: Wed, 27 Sep 2017 14:32:38 +0100 Message-ID: <20170927133241.21036-3-shameerali.kolothum.thodi@huawei.com> X-Mailer: git-send-email 2.12.0.windows.1 In-Reply-To: <20170927133241.21036-1-shameerali.kolothum.thodi@huawei.com> References: <20170927133241.21036-1-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.203.177.212] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090202.59CBA90F.0190, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: a49d4d311631a27bc26773ff899e93ca Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org On some platforms msi parent address regions have to be excluded from normal IOVA allocation in that they are detected and decoded in a HW specific way by system components and so they cannot be considered normal IOVA address space. Add a helper function that retrieves ITS address regions - the msi parent - through IORT device <-> ITS mappings and reserves it so that these regions will not be translated by IOMMU and will be excluded from IOVA allocations. Signed-off-by: Shameer Kolothum [lorenzo.pieralisi@arm.com: updated commit log/added comments] Signed-off-by: Lorenzo Pieralisi --- drivers/acpi/arm64/iort.c | 96 ++++++++++++++++++++++++++++++++++++++-- drivers/irqchip/irq-gic-v3-its.c | 3 +- include/linux/acpi_iort.h | 7 ++- 3 files changed, 101 insertions(+), 5 deletions(-) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c index 9565d57..14efa9d 100644 --- a/drivers/acpi/arm64/iort.c +++ b/drivers/acpi/arm64/iort.c @@ -39,6 +39,7 @@ struct iort_its_msi_chip { struct list_head list; struct fwnode_handle *fw_node; + phys_addr_t base_addr; u32 translation_id; }; @@ -136,14 +137,16 @@ typedef acpi_status (*iort_find_node_callback) static DEFINE_SPINLOCK(iort_msi_chip_lock); /** - * iort_register_domain_token() - register domain token and related ITS ID - * to the list from where we can get it back later on. + * iort_register_domain_token() - register domain token along with related + * ITS ID and base address to the list from where we can get it back later on. * @trans_id: ITS ID. + * @base: ITS base address. * @fw_node: Domain token. * * Returns: 0 on success, -ENOMEM if no memory when allocating list element */ -int iort_register_domain_token(int trans_id, struct fwnode_handle *fw_node) +int iort_register_domain_token(int trans_id, phys_addr_t base, + struct fwnode_handle *fw_node) { struct iort_its_msi_chip *its_msi_chip; @@ -153,6 +156,7 @@ int iort_register_domain_token(int trans_id, struct fwnode_handle *fw_node) its_msi_chip->fw_node = fw_node; its_msi_chip->translation_id = trans_id; + its_msi_chip->base_addr = base; spin_lock(&iort_msi_chip_lock); list_add(&its_msi_chip->list, &iort_msi_chip_list); @@ -481,6 +485,24 @@ int iort_pmsi_get_dev_id(struct device *dev, u32 *dev_id) return -ENODEV; } +static int __maybe_unused iort_find_its_base(u32 its_id, phys_addr_t *base) +{ + struct iort_its_msi_chip *its_msi_chip; + bool match = false; + + spin_lock(&iort_msi_chip_lock); + list_for_each_entry(its_msi_chip, &iort_msi_chip_list, list) { + if (its_msi_chip->translation_id == its_id) { + *base = its_msi_chip->base_addr; + match = true; + break; + } + } + spin_unlock(&iort_msi_chip_lock); + + return match ? 0 : -ENODEV; +} + /** * iort_dev_find_its_id() - Find the ITS identifier for a device * @dev: The device. @@ -639,6 +661,72 @@ int iort_add_device_replay(const struct iommu_ops *ops, struct device *dev) return err; } + +/** + * iort_iommu_msi_get_resv_regions - Reserved region driver helper + * @dev: Device from iommu_get_resv_regions() + * @head: Reserved region list from iommu_get_resv_regions() + * + * Returns: Number of reserved regions on success (0 if no associated msi + * regions), appropriate error value otherwise. The ITS regions + * associated with the device are the msi reserved regions. + */ +int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) +{ + struct acpi_iort_its_group *its; + struct acpi_iort_node *node, *its_node = NULL; + int i, resv = 0; + + node = iort_find_dev_node(dev); + if (!node) + return -ENODEV; + + /* + * Current logic to reserve ITS regions relies on HW topologies + * where a given PCI or named component maps its IDs to only one + * ITS group; if a PCI or named component can map its IDs to + * different ITS groups through IORT mappings this function has + * to be reworked to ensure we reserve regions for all ITS groups + * a given PCI or named component may map IDs to. + */ + if (dev_is_pci(dev)) { + u32 rid; + + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid, &rid); + its_node = iort_node_map_id(node, rid, NULL, IORT_MSI_TYPE); + } else { + for (i = 0; i < node->mapping_count; i++) { + its_node = iort_node_map_platform_id(node, NULL, + IORT_MSI_TYPE, i); + if (its_node) + break; + } + } + + if (!its_node) + return 0; + + /* Move to ITS specific data */ + its = (struct acpi_iort_its_group *)its_node->node_data; + + for (i = 0; i < its->its_count; i++) { + phys_addr_t base; + + if (!iort_find_its_base(its->identifiers[i], &base)) { + int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO; + struct iommu_resv_region *region; + + region = iommu_alloc_resv_region(base, SZ_128K, prot, + IOMMU_RESV_MSI); + if (region) { + list_add_tail(®ion->list, head); + resv++; + } + } + } + + return (resv == its->its_count) ? resv : -ENODEV; +} #else static inline const struct iommu_ops *iort_fwspec_iommu_ops(struct iommu_fwspec *fwspec) @@ -646,6 +734,8 @@ const struct iommu_ops *iort_fwspec_iommu_ops(struct iommu_fwspec *fwspec) static inline int iort_add_device_replay(const struct iommu_ops *ops, struct device *dev) { return 0; } +int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) +{ return -ENODEV; } #endif static int iort_iommu_xlate(struct device *dev, struct acpi_iort_node *node, diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index e8d8934..19d1ff6 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -3197,7 +3197,8 @@ static int __init gic_acpi_parse_madt_its(struct acpi_subtable_header *header, return -ENOMEM; } - err = iort_register_domain_token(its_entry->translation_id, dom_handle); + err = iort_register_domain_token(its_entry->translation_id, res.start, + dom_handle); if (err) { pr_err("ITS@%pa: Unable to register GICv3 ITS domain token (ITS ID %d) to IORT\n", &res.start, its_entry->translation_id); diff --git a/include/linux/acpi_iort.h b/include/linux/acpi_iort.h index 8d3f0bf..182a577 100644 --- a/include/linux/acpi_iort.h +++ b/include/linux/acpi_iort.h @@ -26,7 +26,8 @@ #define IORT_IRQ_MASK(irq) (irq & 0xffffffffULL) #define IORT_IRQ_TRIGGER_MASK(irq) ((irq >> 32) & 0xffffffffULL) -int iort_register_domain_token(int trans_id, struct fwnode_handle *fw_node); +int iort_register_domain_token(int trans_id, phys_addr_t base, + struct fwnode_handle *fw_node); void iort_deregister_domain_token(int trans_id); struct fwnode_handle *iort_find_domain_token(int trans_id); #ifdef CONFIG_ACPI_IORT @@ -38,6 +39,7 @@ /* IOMMU interface */ void iort_dma_setup(struct device *dev, u64 *dma_addr, u64 *size); const struct iommu_ops *iort_iommu_configure(struct device *dev); +int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head); #else static inline void acpi_iort_init(void) { } static inline u32 iort_msi_map_rid(struct device *dev, u32 req_id) @@ -52,6 +54,9 @@ static inline void iort_dma_setup(struct device *dev, u64 *dma_addr, static inline const struct iommu_ops *iort_iommu_configure(struct device *dev) { return NULL; } +static inline +int iort_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) +{ return -ENODEV; } #endif #endif /* __ACPI_IORT_H__ */ From patchwork Wed Sep 27 13:32:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shameerali Kolothum Thodi X-Patchwork-Id: 114371 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp5050533qgf; Wed, 27 Sep 2017 06:35:21 -0700 (PDT) X-Google-Smtp-Source: AOwi7QD5/tC7NLwwyTzU0RnWUoonX0ddMUuKp+oMd4L1sJW/Dbgzi+AasYNIkfoT2KbJQ90TZ9Cf X-Received: by 10.84.217.129 with SMTP id p1mr1292152pli.87.1506519321092; Wed, 27 Sep 2017 06:35:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1506519321; cv=none; d=google.com; s=arc-20160816; b=gI/9eGpx+u3nWaNEkLnB3JrKu29qlXJ4sOozPN0/zmNDWz0gQn+31FFh3aZ8Zq8z84 wNRmgtPzBWOjER42GEjDPthNKKYKZ94fJeYDPDXPyKCb2wvB3EowpAXhgz+a8pvWqg+b fl9FdJZG6rHBZNjQ6J7RzFZ+/wbw3aCudae3RhkRlIyIMv4wOwDuxApX3Q5xhXXH7h8k jDWz45Zj+WwrbQjmuaXxwK83B7dp5Bb4wOAK+jnLiNu8AwhPl6hAN8WmjCGJm2LzFzvk 6Jk/EHeyvvt+HjqiUfpGmntXiu6oFyOYV112lTyVZY1p+a+w3Nyr3xRsHDN3ucuN6GuF l+nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=P0Ei9YHJIJ8q7BYziLaiwZd/ELIrqt8uECRJlvkAqzk=; b=Ulh4W1lm3O4rtShEmnEEkOM/Xo68EBgwZtQ8/4grTK/XtCqBd9q6U1FEITvGR2+BIO 7Nu7Y3g34r7leVfggpIh4V1doQov1eU2nX2sH1vteROMkhWwu9gbPgBl3wIcV1XZZetx MuafybAkzwSppQgMOX2tyt9ZA9LxPKbDH3oaLT3CHRmkZEvaZ/5WbYENFtz7/RsI/Y34 ofwzbOdyK8H/Skavy1f0WLcnFQ1ug9ooUoASTDGYOvF+48z6vDwvvg0upFKzXMlMNLxO 87rnMPoSIUNucxuqSY2crSaMQKwn+rx1mMBYZTiqq8eN0FtjB5+IPYHU2X6F8KzqAPmx fiKw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u9si7660961pge.139.2017.09.27.06.35.20; Wed, 27 Sep 2017 06:35:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752835AbdI0NfU (ORCPT + 6 others); Wed, 27 Sep 2017 09:35:20 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7059 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751959AbdI0NfT (ORCPT ); Wed, 27 Sep 2017 09:35:19 -0400 Received: from 172.30.72.58 (EHLO DGGEMS401-HUB.china.huawei.com) ([172.30.72.58]) by dggrg05-dlp.huawei.com (MOS 4.4.6-GA FastPath queued) with ESMTP id DID21045; Wed, 27 Sep 2017 21:35:16 +0800 (CST) Received: from S00345302A-PC.china.huawei.com (10.203.177.212) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.301.0; Wed, 27 Sep 2017 21:35:08 +0800 From: Shameer Kolothum To: , , , , , , , CC: , , , , , , , , , , Shameer Kolothum Subject: [PATCH v8 3/5] iommu/of: Add msi address regions reservation helper Date: Wed, 27 Sep 2017 14:32:39 +0100 Message-ID: <20170927133241.21036-4-shameerali.kolothum.thodi@huawei.com> X-Mailer: git-send-email 2.12.0.windows.1 In-Reply-To: <20170927133241.21036-1-shameerali.kolothum.thodi@huawei.com> References: <20170927133241.21036-1-shameerali.kolothum.thodi@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.203.177.212] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A090202.59CBA914.01C8, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 6ecd795c30fff79cfb60a13e0fa29c86 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org From: John Garry On some platforms msi-controller address regions have to be excluded from normal IOVA allocation in that they are detected and decoded in a HW specific way by system components and so they cannot be considered normal IOVA address space. Add a helper function that retrieves msi address regions through device tree msi mapping, so that these regions will not be translated by IOMMU and will be excluded from IOVA allocations. Signed-off-by: John Garry [Shameer: Modified msi-parent retrieval logic] Signed-off-by: Shameer Kolothum --- drivers/iommu/of_iommu.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/of_iommu.h | 10 +++++ 2 files changed, 105 insertions(+) -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c index e60e3db..ffd7fb7 100644 --- a/drivers/iommu/of_iommu.c +++ b/drivers/iommu/of_iommu.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -138,6 +139,14 @@ static int of_iommu_xlate(struct device *dev, return ops->of_xlate(dev, iommu_spec); } +static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data) +{ + u32 *rid = data; + + *rid = alias; + return 0; +} + struct of_pci_iommu_alias_info { struct device *dev; struct device_node *np; @@ -163,6 +172,73 @@ static int of_pci_iommu_init(struct pci_dev *pdev, u16 alias, void *data) return info->np == pdev->bus->dev.of_node; } +static int of_iommu_alloc_resv_region(struct device_node *np, + struct list_head *head) +{ + int prot = IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO; + struct iommu_resv_region *region; + struct resource res; + int err; + + err = of_address_to_resource(np, 0, &res); + if (err) + return err; + + region = iommu_alloc_resv_region(res.start, resource_size(&res), + prot, IOMMU_RESV_MSI); + if (!region) + return -ENOMEM; + + list_add_tail(®ion->list, head); + + return 0; +} + +static int of_pci_msi_get_resv_regions(struct device *dev, + struct list_head *head) +{ + struct device_node *msi_np; + struct device *pdev; + u32 rid; + int err, resv = 0; + + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid, &rid); + + for_each_node_with_property(msi_np, "msi-controller") { + for (pdev = dev; pdev; pdev = pdev->parent) { + if (!of_pci_map_rid(pdev->of_node, rid, "msi-map", + "msi-map-mask", &msi_np, NULL)) { + + err = of_iommu_alloc_resv_region(msi_np, head); + if (err) + return err; + resv++; + } + } + } + + return resv; +} + +static int of_platform_msi_get_resv_regions(struct device *dev, + struct list_head *head) +{ + struct of_phandle_args args; + int err, resv = 0; + + while (!of_parse_phandle_with_args(dev->of_node, "msi-parent", + "#msi-cells", resv, &args)) { + + err = of_iommu_alloc_resv_region(args.np, head); + of_node_put(args.np); + if (err) + return err; + resv++; + } + + return resv; +} + const struct iommu_ops *of_iommu_configure(struct device *dev, struct device_node *master_np) { @@ -235,6 +311,25 @@ const struct iommu_ops *of_iommu_configure(struct device *dev, return ops; } +/** + * of_iommu_msi_get_resv_regions - Reserved region driver helper + * @dev: Device from iommu_get_resv_regions() + * @head: Reserved region list from iommu_get_resv_regions() + * + * Returns: Number of reserved regions on success (0 if no associated + * msi parent), appropriate error value otherwise. + */ +int of_iommu_msi_get_resv_regions(struct device *dev, struct list_head *head) +{ + + if (dev_is_pci(dev)) + return of_pci_msi_get_resv_regions(dev, head); + else if (dev->of_node) + return of_platform_msi_get_resv_regions(dev, head); + + return 0; +} + static int __init of_iommu_init(void) { struct device_node *np; diff --git a/include/linux/of_iommu.h b/include/linux/of_iommu.h index 13394ac..9267772 100644 --- a/include/linux/of_iommu.h +++ b/include/linux/of_iommu.h @@ -14,6 +14,9 @@ extern int of_get_dma_window(struct device_node *dn, const char *prefix, extern const struct iommu_ops *of_iommu_configure(struct device *dev, struct device_node *master_np); +extern int of_iommu_msi_get_resv_regions(struct device *dev, + struct list_head *head); + #else static inline int of_get_dma_window(struct device_node *dn, const char *prefix, @@ -29,6 +32,13 @@ static inline const struct iommu_ops *of_iommu_configure(struct device *dev, return NULL; } +static int of_iommu_msi_get_resv_regions(struct device *dev, + struct list_head *head) +{ + return -ENODEV; +} + + #endif /* CONFIG_OF_IOMMU */ extern struct of_device_id __iommu_of_table;