video: rockchip: fb: delete DISPLAY_POLICY_BOX_TEMP
[firefly-linux-kernel-4.4.55.git] / drivers / iommu / rockchip-iovmm.c
old mode 100755 (executable)
new mode 100644 (file)
index 3be0072..29f885f
@@ -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;
@@ -30,10 +32,19 @@ static struct rk_vm_region *find_region(struct rk_iovmm *vmm, dma_addr_t iova)
        return NULL;
 }
 
+int rockchip_iovmm_invalidate_tlb(struct device *dev)
+{
+       int ret = rockchip_iommu_tlb_invalidate_global(dev);
+
+       return ret;
+}
+
 void rockchip_iovmm_set_fault_handler(struct device *dev,
                                       rockchip_iommu_fault_handler_t handler)
 {
-       return;
+       struct iommu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
+
+       data->fault_handler = handler;
 }
 
 int rockchip_iovmm_activate(struct device *dev)
@@ -75,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;
@@ -139,12 +151,15 @@ dma_addr_t rockchip_iovmm_map(struct device *dev,
        spin_unlock(&vmm->lock);
 
        ret = rockchip_iommu_tlb_invalidate(dev);
-       if (ret)
+       if (ret) {
+               spin_lock(&vmm->lock);
+               list_del(&region->node);
+               spin_unlock(&vmm->lock);
                goto err_map_map;
-
-       dev_dbg(dev->archdata.iommu, "IOVMM: Allocated VM region @ %pad%#zx bytes.\n",
+       }
+       dev_dbg(dev->archdata.iommu, "IOVMM: Allocated VM region @ %p/%#X bytes.\n",
        &region->start, region->size);
-       
+
        return region->start;
 
 err_map_map:
@@ -185,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);