x86/amd-iommu: Implement ->{un}map callbacks for iommu-api
authorJoerg Roedel <joerg.roedel@amd.com>
Thu, 21 Jan 2010 15:37:36 +0000 (16:37 +0100)
committerJoerg Roedel <joerg.roedel@amd.com>
Sun, 7 Mar 2010 17:01:12 +0000 (18:01 +0100)
This patch implements the new callbacks for the IOMMU-API
with functions that can handle different page sizes in the
IOMMU page table.

Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
arch/x86/kernel/amd_iommu.c

index 52e44af..0e068c9 100644 (file)
@@ -2552,6 +2552,33 @@ static void amd_iommu_unmap_range(struct iommu_domain *dom,
        iommu_flush_tlb_pde(domain);
 }
 
+static int amd_iommu_map(struct iommu_domain *dom, unsigned long iova,
+                        phys_addr_t paddr, int gfp_order, int iommu_prot)
+{
+       unsigned long page_size = 0x1000UL << gfp_order;
+       struct protection_domain *domain = dom->priv;
+       int prot = 0;
+
+       if (iommu_prot & IOMMU_READ)
+               prot |= IOMMU_PROT_IR;
+       if (iommu_prot & IOMMU_WRITE)
+               prot |= IOMMU_PROT_IW;
+
+       return iommu_map_page(domain, iova, paddr, prot, page_size);
+}
+
+static int amd_iommu_unmap(struct iommu_domain *dom, unsigned long iova,
+                          int gfp_order)
+{
+       struct protection_domain *domain = dom->priv;
+       unsigned long page_size, unmap_size;
+
+       page_size  = 0x1000UL << gfp_order;
+       unmap_size = iommu_unmap_page(domain, iova, page_size);
+
+       return get_order(unmap_size);
+}
+
 static phys_addr_t amd_iommu_iova_to_phys(struct iommu_domain *dom,
                                          unsigned long iova)
 {
@@ -2587,6 +2614,8 @@ static struct iommu_ops amd_iommu_ops = {
        .domain_destroy = amd_iommu_domain_destroy,
        .attach_dev = amd_iommu_attach_device,
        .detach_dev = amd_iommu_detach_device,
+       .map = amd_iommu_map,
+       .unmap = amd_iommu_unmap,
        .map_range = amd_iommu_map_range,
        .unmap_range = amd_iommu_unmap_range,
        .iova_to_phys = amd_iommu_iova_to_phys,