]> Pileus Git - ~andy/linux/blobdiff - drivers/iommu/msm_iommu.c
Merge branch 'iommu/page-sizes' into x86/amd
[~andy/linux] / drivers / iommu / msm_iommu.c
index 5865dd2e28f928b0cf55ff1c5ebddfe5786e1d16..08a90b88e40d80feb9d01185e534a1351cf7473d 100644 (file)
@@ -42,6 +42,9 @@ __asm__ __volatile__ (                                                        \
 #define RCP15_PRRR(reg)                MRC(reg, p15, 0, c10, c2, 0)
 #define RCP15_NMRR(reg)                MRC(reg, p15, 0, c10, c2, 1)
 
+/* bitmap of the page sizes currently supported */
+#define MSM_IOMMU_PGSIZES      (SZ_4K | SZ_64K | SZ_1M | SZ_16M)
+
 static int msm_iommu_tex_class[4];
 
 DEFINE_SPINLOCK(msm_iommu_lock);
@@ -352,7 +355,7 @@ fail:
 }
 
 static int msm_iommu_map(struct iommu_domain *domain, unsigned long va,
-                        phys_addr_t pa, int order, int prot)
+                        phys_addr_t pa, size_t len, int prot)
 {
        struct msm_priv *priv;
        unsigned long flags;
@@ -363,7 +366,6 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va,
        unsigned long *sl_pte;
        unsigned long sl_offset;
        unsigned int pgprot;
-       size_t len = 0x1000UL << order;
        int ret = 0, tex, sh;
 
        spin_lock_irqsave(&msm_iommu_lock, flags);
@@ -463,8 +465,8 @@ fail:
        return ret;
 }
 
-static int msm_iommu_unmap(struct iommu_domain *domain, unsigned long va,
-                           int order)
+static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long va,
+                           size_t len)
 {
        struct msm_priv *priv;
        unsigned long flags;
@@ -474,7 +476,6 @@ static int msm_iommu_unmap(struct iommu_domain *domain, unsigned long va,
        unsigned long *sl_table;
        unsigned long *sl_pte;
        unsigned long sl_offset;
-       size_t len = 0x1000UL << order;
        int i, ret = 0;
 
        spin_lock_irqsave(&msm_iommu_lock, flags);
@@ -544,15 +545,12 @@ static int msm_iommu_unmap(struct iommu_domain *domain, unsigned long va,
 
        ret = __flush_iotlb(domain);
 
-       /*
-        * the IOMMU API requires us to return the order of the unmapped
-        * page (on success).
-        */
-       if (!ret)
-               ret = order;
 fail:
        spin_unlock_irqrestore(&msm_iommu_lock, flags);
-       return ret;
+
+       /* the IOMMU API requires us to return how many bytes were unmapped */
+       len = ret ? 0 : len;
+       return len;
 }
 
 static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain,
@@ -684,7 +682,8 @@ static struct iommu_ops msm_iommu_ops = {
        .map = msm_iommu_map,
        .unmap = msm_iommu_unmap,
        .iova_to_phys = msm_iommu_iova_to_phys,
-       .domain_has_cap = msm_iommu_domain_has_cap
+       .domain_has_cap = msm_iommu_domain_has_cap,
+       .pgsize_bitmap = MSM_IOMMU_PGSIZES,
 };
 
 static int __init get_tex_class(int icp, int ocp, int mt, int nos)