lkml.org 
[lkml]   [2021]   [Jul]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 01/24] iommu: Pull IOVA cookie management into the core
    Date
    Now that everyone has converged on iommu-dma for IOMMU_DOMAIN_DMA
    support, we can abandon the notion of drivers being responsible for the
    cookie type, and consolidate all the management into the core code.

    CC: Marek Szyprowski <m.szyprowski@samsung.com>
    CC: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
    CC: Geert Uytterhoeven <geert+renesas@glider.be>
    CC: Yong Wu <yong.wu@mediatek.com>
    CC: Heiko Stuebner <heiko@sntech.de>
    CC: Chunyan Zhang <chunyan.zhang@unisoc.com>
    CC: Chunyan Zhang <chunyan.zhang@unisoc.com>
    CC: Maxime Ripard <mripard@kernel.org>
    CC: Jean-Philippe Brucker <jean-philippe@linaro.org>
    Signed-off-by: Robin Murphy <robin.murphy@arm.com>
    ---
    drivers/iommu/iommu.c | 7 +++++++
    include/linux/iommu.h | 3 ++-
    2 files changed, 9 insertions(+), 1 deletion(-)

    diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
    index f2cda9950bd5..ea5a9ea8d431 100644
    --- a/drivers/iommu/iommu.c
    +++ b/drivers/iommu/iommu.c
    @@ -7,6 +7,7 @@
    #define pr_fmt(fmt) "iommu: " fmt

    #include <linux/device.h>
    +#include <linux/dma-iommu.h>
    #include <linux/kernel.h>
    #include <linux/bits.h>
    #include <linux/bug.h>
    @@ -1946,6 +1947,11 @@ static struct iommu_domain *__iommu_domain_alloc(struct bus_type *bus,
    /* Assume all sizes by default; the driver may override this later */
    domain->pgsize_bitmap = bus->iommu_ops->pgsize_bitmap;

    + /* Temporarily ignore -EEXIST while drivers still get their own cookies */
    + if (type == IOMMU_DOMAIN_DMA && iommu_get_dma_cookie(domain) == -ENOMEM) {
    + iommu_domain_free(domain);
    + domain = NULL;
    + }
    return domain;
    }

    @@ -1957,6 +1963,7 @@ EXPORT_SYMBOL_GPL(iommu_domain_alloc);

    void iommu_domain_free(struct iommu_domain *domain)
    {
    + iommu_put_dma_cookie(domain);
    domain->ops->domain_free(domain);
    }
    EXPORT_SYMBOL_GPL(iommu_domain_free);
    diff --git a/include/linux/iommu.h b/include/linux/iommu.h
    index 4997c78e2670..141779d76035 100644
    --- a/include/linux/iommu.h
    +++ b/include/linux/iommu.h
    @@ -40,6 +40,7 @@ struct iommu_domain;
    struct notifier_block;
    struct iommu_sva;
    struct iommu_fault_event;
    +struct iommu_dma_cookie;

    /* iommu fault flags */
    #define IOMMU_FAULT_READ 0x0
    @@ -86,7 +87,7 @@ struct iommu_domain {
    iommu_fault_handler_t handler;
    void *handler_token;
    struct iommu_domain_geometry geometry;
    - void *iova_cookie;
    + struct iommu_dma_cookie *iova_cookie;
    };

    enum iommu_cap {
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-07-28 17:59    [W:4.170 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site