lkml.org 
[lkml]   [2015]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/22] iommu/amd: Implement dm_region call-backs
    Date
    From: Joerg Roedel <jroedel@suse.de>

    Add the get_dm_regions and put_dm_regions callbacks to the
    iommu_ops of the AMD IOMMU driver.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    drivers/iommu/amd_iommu.c | 37 +++++++++++++++++++++++++++++++++++++
    1 file changed, 37 insertions(+)

    diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
    index e43d489..9da3f0e 100644
    --- a/drivers/iommu/amd_iommu.c
    +++ b/drivers/iommu/amd_iommu.c
    @@ -3412,6 +3412,41 @@ static bool amd_iommu_capable(enum iommu_cap cap)
    return false;
    }

    +static void amd_iommu_get_dm_regions(struct device *dev,
    + struct list_head *head)
    +{
    + struct unity_map_entry *entry;
    + u16 devid;
    +
    + devid = get_device_id(dev);
    +
    + list_for_each_entry(entry, &amd_iommu_unity_map, list) {
    + struct iommu_dm_region *region;
    +
    + if (devid < entry->devid_start || devid > entry->devid_end)
    + continue;
    +
    + region = kzalloc(sizeof(*region), GFP_KERNEL);
    + region->start = entry->address_start;
    + region->length = entry->address_end - entry->address_start;
    + if (entry->prot & IOMMU_PROT_IR)
    + region->prot |= IOMMU_READ;
    + if (entry->prot & IOMMU_PROT_IW)
    + region->prot |= IOMMU_WRITE;
    +
    + list_add_tail(&region->list, head);
    + }
    +}
    +
    +static void amd_iommu_put_dm_regions(struct device *dev,
    + struct list_head *head)
    +{
    + struct iommu_dm_region *entry, *next;
    +
    + list_for_each_entry_safe(entry, next, head, list)
    + kfree(entry);
    +}
    +
    static const struct iommu_ops amd_iommu_ops = {
    .capable = amd_iommu_capable,
    .domain_alloc = amd_iommu_domain_alloc,
    @@ -3422,6 +3457,8 @@ static const struct iommu_ops amd_iommu_ops = {
    .unmap = amd_iommu_unmap,
    .map_sg = default_iommu_map_sg,
    .iova_to_phys = amd_iommu_iova_to_phys,
    + .get_dm_regions = amd_iommu_get_dm_regions,
    + .put_dm_regions = amd_iommu_put_dm_regions,
    .pgsize_bitmap = AMD_IOMMU_PGSIZES,
    };

    --
    1.9.1


    \
     
     \ /
      Last update: 2015-05-28 19:21    [W:4.056 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site