rk: iommu: support iommu region guard
authorCMY <cmy@rock-chips.com>
Fri, 22 May 2015 09:26:42 +0000 (17:26 +0800)
committerCMY <cmy@rock-chips.com>
Thu, 28 May 2015 03:54:57 +0000 (11:54 +0800)
Add an guard area after each iommu region, it is used to detect cross-border access

Signed-off-by: CMY <cmy@rock-chips.com>
Signed-off-by: XXM <xxm@rock-chips.com>
drivers/iommu/rockchip-iovmm.c

index 595b75c23d042616baa5c66448c2a507d1c471ab..29f885fc0275736c60c7e03e329459b5f8c4d9ad 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "rockchip-iommu.h"
 
+#define IOMMU_REGION_GUARD             (2<<PAGE_SHIFT)
+
 static struct rk_vm_region *find_region(struct rk_iovmm *vmm, dma_addr_t iova)
 {
        struct rk_vm_region *region;
@@ -84,7 +86,8 @@ dma_addr_t rockchip_iovmm_map(struct device *dev,
                goto err_map_nomem;
        }
 
-       start = (dma_addr_t)gen_pool_alloc(vmm->vmm_pool, size);
+       start = (dma_addr_t)gen_pool_alloc(vmm->vmm_pool,
+                                          size+IOMMU_REGION_GUARD);
        if (!start) {
                ret = -ENOMEM;
                goto err_map_noiomem;
@@ -197,7 +200,8 @@ void rockchip_iovmm_unmap(struct device *dev, dma_addr_t iova)
        /*
        rockchip_iommu_tlb_invalidate(dev);
        */
-       gen_pool_free(vmm->vmm_pool, region->start, region->size);
+       gen_pool_free(vmm->vmm_pool, region->start,
+                     region->size+IOMMU_REGION_GUARD);
 
        WARN_ON(unmapped_size != region->size);