rockchip: iommu: workround for rk312x vop iommu
authorsimon <xxm@rock-chips.com>
Tue, 16 Sep 2014 01:46:47 +0000 (09:46 +0800)
committersimon <xxm@rock-chips.com>
Tue, 16 Sep 2014 01:50:30 +0000 (09:50 +0800)
1.disable request 312x vop iommu
2.mask 312x vop iommu intterurpt
3.disable rk312x stall operation when zap iommu tlb cache

drivers/iommu/rockchip-iommu.c

index ca87d01f95f8beabd8fc4eeb27559ea36f916f36..4386d0e88bc864469132835ed4087d1f9da5b4e3 100755 (executable)
@@ -400,13 +400,23 @@ static void iommu_page_fault_done(void __iomem *base, const char *dbgname)
 
 static bool iommu_zap_tlb(void __iomem *base)
 {
-       bool stall_success = iommu_enable_stall(base);
+       bool stall_success;
+
+       if (rk312x_vop_mmu_base != base)
+               stall_success = iommu_enable_stall(base);
+       else
+               stall_success = true;
 
        __raw_writel(IOMMU_COMMAND_ZAP_CACHE,
                     base + IOMMU_REGISTER_COMMAND);
        if (!stall_success)
                return false;
-       iommu_disable_stall(base);
+
+       if (rk312x_vop_mmu_base != base)
+               iommu_disable_stall(base);
+       else
+               return true;
+
        return true;
 }
 extern bool __clk_is_enabled(struct clk *clk);
@@ -461,10 +471,14 @@ static bool iommu_reset(void __iomem *base, const char *dbgname)
                return err;
        }
        err = iommu_raw_reset(base);
-       if (err)
-               __raw_writel(IOMMU_INTERRUPT_PAGE_FAULT |
+       if (err) {
+               if (base != rk312x_vop_mmu_base)
+                       __raw_writel(IOMMU_INTERRUPT_PAGE_FAULT |
                             IOMMU_INTERRUPT_READ_BUS_ERROR,
                             base+IOMMU_REGISTER_INT_MASK);
+               else
+                       __raw_writel(0x00, base + IOMMU_REGISTER_INT_MASK);
+       }
        iommu_disable_stall(base);
        if (!err)
                pr_info("%s: failed: %s\n", __func__, dbgname);
@@ -1248,6 +1262,10 @@ for (i = 0; i < pdev->num_resources; i++, res++) {
                        dev_err(dev,"Unable to find IRQ resource\n");
                        goto err_irq;
                }
+               if (cpu_is_rk312x() && strstr(data->dbgname, "vop")) {
+                       dev_info(dev, "skip request vop mmu irq\n");
+                       continue;
+               }
                ret = devm_request_irq(dev, ret, rockchip_iommu_irq,
                                  IRQF_SHARED, dev_name(dev), data);
                if (ret) {