The prot flags passed to the IOMMU map handler are defined in
include/linux/iommu.h as IOMMU_(READ|WRITE|CACHE|EXEC). However, the
driver expects to receive MMU_RAM_* OMAP-specific flags. This causes
IOMMU flags being interpreted as page sizes, leading to failures.

Hardcode the OMAP mapping parameters to little-endian, 8-bits and
non-mixed page attributes. Furthermore, as the OMAP IOMMU doesn't
support read-only or write-only mappings, ignore the prot value.

Signed-off-by: Laurent Pinchart <[email protected]>
Reviewed-by: Sakari Ailus <[email protected]>
Acked-by: Suman Anna <[email protected]>
---
 drivers/iommu/omap-iommu.c | 17 +++++++----------
 1 file changed, 7 insertions(+), 10 deletions(-)

diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c
index a47dbdc..6923217 100644
--- a/drivers/iommu/omap-iommu.c
+++ b/drivers/iommu/omap-iommu.c
@@ -1040,8 +1040,7 @@ static void iopte_cachep_ctor(void *iopte)
        clean_dcache_area(iopte, IOPTE_TABLE_SIZE);
 }
 
-static u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa,
-                                  u32 flags)
+static u32 iotlb_init_entry(struct iotlb_entry *e, u32 da, u32 pa, int pgsz)
 {
        memset(e, 0, sizeof(*e));
 
@@ -1049,10 +1048,10 @@ static u32 iotlb_init_entry(struct iotlb_entry *e, u32 
da, u32 pa,
        e->pa           = pa;
        e->valid        = MMU_CAM_V;
        /* FIXME: add OMAP1 support */
-       e->pgsz         = flags & MMU_CAM_PGSZ_MASK;
-       e->endian       = flags & MMU_RAM_ENDIAN_MASK;
-       e->elsz         = flags & MMU_RAM_ELSZ_MASK;
-       e->mixed        = flags & MMU_RAM_MIXED_MASK;
+       e->pgsz         = pgsz;
+       e->endian       = MMU_RAM_ENDIAN_LITTLE;
+       e->elsz         = MMU_RAM_ELSZ_8;
+       e->mixed        = 0;
 
        return iopgsz_to_bytes(e->pgsz);
 }
@@ -1065,7 +1064,7 @@ static int omap_iommu_map(struct iommu_domain *domain, 
unsigned long da,
        struct device *dev = oiommu->dev;
        struct iotlb_entry e;
        int omap_pgsz;
-       u32 ret, flags;
+       u32 ret;
 
        omap_pgsz = bytes_to_iopgsz(bytes);
        if (omap_pgsz < 0) {
@@ -1075,9 +1074,7 @@ static int omap_iommu_map(struct iommu_domain *domain, 
unsigned long da,
 
        dev_dbg(dev, "mapping da 0x%lx to pa 0x%x size 0x%x\n", da, pa, bytes);
 
-       flags = omap_pgsz | prot;
-
-       iotlb_init_entry(&e, da, pa, flags);
+       iotlb_init_entry(&e, da, pa, omap_pgsz);
 
        ret = omap_iopgtable_store_entry(oiommu, &e);
        if (ret)
-- 
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to