lkml.org 
[lkml]   [2012]   [Apr]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH 3/3] iommu: Create attach/detach group interface
    Date
    IOMMU ops should be working at a group level rather than a device
    level as we cannot arbitrarily assign devices from the same group
    to different domains. For now this is just a simple wrapper that
    makes use of the dma_dev within a group.

    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    ---

    drivers/iommu/iommu.c | 12 ++++++++++++
    include/linux/iommu.h | 15 +++++++++++++++
    2 files changed, 27 insertions(+), 0 deletions(-)

    diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
    index 6a51ed9..af77da1 100644
    --- a/drivers/iommu/iommu.c
    +++ b/drivers/iommu/iommu.c
    @@ -327,6 +327,18 @@ void iommu_detach_device(struct iommu_domain *domain, struct device *dev)
    }
    EXPORT_SYMBOL_GPL(iommu_detach_device);

    +int iommu_attach_group(struct iommu_domain *domain, struct iommu_group *group)
    +{
    + return iommu_attach_device(domain, group->dma_dev);
    +}
    +EXPORT_SYMBOL_GPL(iommu_attach_group);
    +
    +void iommu_detach_group(struct iommu_domain *domain, struct iommu_group *group)
    +{
    + iommu_detach_device(domain, group->dma_dev);
    +}
    +EXPORT_SYMBOL_GPL(iommu_detach_group);
    +
    phys_addr_t iommu_iova_to_phys(struct iommu_domain *domain,
    unsigned long iova)
    {
    diff --git a/include/linux/iommu.h b/include/linux/iommu.h
    index 24004d6..d4e9a7a 100644
    --- a/include/linux/iommu.h
    +++ b/include/linux/iommu.h
    @@ -107,6 +107,10 @@ extern int iommu_attach_device(struct iommu_domain *domain,
    struct device *dev);
    extern void iommu_detach_device(struct iommu_domain *domain,
    struct device *dev);
    +extern int iommu_attach_group(struct iommu_domain *domain,
    + struct iommu_group *group);
    +extern void iommu_detach_group(struct iommu_domain *domain,
    + struct iommu_group *group);
    extern int iommu_map(struct iommu_domain *domain, unsigned long iova,
    phys_addr_t paddr, size_t size, int prot);
    extern size_t iommu_unmap(struct iommu_domain *domain, unsigned long iova,
    @@ -194,6 +198,17 @@ static inline void iommu_detach_device(struct iommu_domain *domain,
    {
    }

    +static inline int iommu_attach_group(struct iommu_domain *domain,
    + struct iommu_group *group)
    +{
    + return -ENODEV;
    +}
    +
    +static inline void iommu_detach_group(struct iommu_domain *domain,
    + struct iommu_group *group)
    +{
    +}
    +
    static inline int iommu_map(struct iommu_domain *domain, unsigned long iova,
    phys_addr_t paddr, int gfp_order, int prot)
    {


    \
     
     \ /
      Last update: 2012-04-02 23:17    [W:0.023 / U:0.176 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site