add iommu switch in dts for vcodec driver. disable iommu_unmap.
authorljf <ljf@rock-chips.com>
Thu, 7 Aug 2014 08:35:40 +0000 (16:35 +0800)
committerljf <ljf@rock-chips.com>
Thu, 7 Aug 2014 08:35:40 +0000 (16:35 +0800)
arch/arm/boot/dts/rk3288.dtsi
arch/arm/mach-rockchip/vcodec_service.c

index 9785eb6cb6d152e2ec0485458c3bfc5eecc166f8..6353a8babb727b628e79cb2e8bb2a30cde0fb78d 100755 (executable)
 
        vpu: vpu_service@ff9a0000 {
                compatible = "vpu_service";
+               iommu_enabled = <1>;
                reg = <0xff9a0000 0x800>;
                interrupts = <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-names = "irq_enc", "irq_dec";
 
        hevc: hevc_service@ff9c0000 {
                compatible = "rockchip,hevc_service";
+               iommu_enabled = <1>;
                reg = <0xff9c0000 0x800>;
                interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-names = "irq_dec";
 
        iep: iep@ff900000 {
                compatible = "rockchip,iep";
+               iommu_enabled = <1>;
                reg = <0xff900000 0x800>;
                interrupts = <GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clk_gates15 2>, <&clk_gates15 3>;
index 1d410e28d9ab5aca7d01681348fc57c84fa744ae..5b4bd9dcb295afcb726ba01367948535714eec09 100755 (executable)
@@ -873,7 +873,12 @@ static void reg_deinit(struct vpu_service_info *pservice, vpu_reg *reg)
        // release memory region attach to this registers table.\r
        if (pservice->mmu_dev) {\r
                list_for_each_entry_safe(mem_region, n, &reg->mem_region_list, reg_lnk) {\r
-                       ion_unmap_iommu(pservice->dev, pservice->ion_client, mem_region->hdl);\r
+                       /* do not unmap iommu manually,\r
+                          unmap will proccess when memory release */\r
+                       /*ion_unmap_iommu(pservice->dev,\r
+                                       pservice->ion_client,\r
+                                       mem_region->hdl);\r
+                       vcodec_exit_mode();*/\r
                        ion_free(pservice->ion_client, mem_region->hdl);\r
                        list_del_init(&mem_region->reg_lnk);\r
                        kfree(mem_region);\r
@@ -1453,7 +1458,9 @@ static int vcodec_probe(struct platform_device *pdev)
     struct vpu_service_info *pservice = devm_kzalloc(dev, sizeof(struct vpu_service_info), GFP_KERNEL);\r
     char *prop = (char*)dev_name(dev);\r
 #if defined(CONFIG_VCODEC_MMU)\r
-    char mmu_dev_dts_name[40];\r
+       u32 iommu_en = 0;\r
+       char mmu_dev_dts_name[40];\r
+       of_property_read_u32(np, "iommu_enabled", &iommu_en);\r
 #endif\r
 \r
     pr_info("probe device %s\n", dev_name(dev));\r
@@ -1605,26 +1612,27 @@ static int vcodec_probe(struct platform_device *pdev)
 #endif\r
 \r
 #if defined(CONFIG_VCODEC_MMU)\r
-    pservice->ion_client = rockchip_ion_client_create("vpu");\r
-    if (IS_ERR(pservice->ion_client)) {\r
-        dev_err(&pdev->dev, "failed to create ion client for vcodec");\r
-        return PTR_ERR(pservice->ion_client);\r
-    } else {\r
-        dev_info(&pdev->dev, "vcodec ion client create success!\n");\r
-    }\r
-    \r
-    if (pservice->hw_info->hw_id == HEVC_ID) {\r
-        sprintf(mmu_dev_dts_name, "iommu,hevc_mmu");\r
-    } else {\r
-        sprintf(mmu_dev_dts_name, "iommu,vpu_mmu");\r
-    }\r
-    \r
-    pservice->mmu_dev = rockchip_get_sysmmu_device_by_compatible(mmu_dev_dts_name);\r
-    \r
-    if (pservice->mmu_dev) {\r
-        platform_set_sysmmu(pservice->mmu_dev, pservice->dev);\r
-        iovmm_activate(pservice->dev);\r
-    }\r
+       if (iommu_en) {\r
+               pservice->ion_client = rockchip_ion_client_create("vpu");\r
+               if (IS_ERR(pservice->ion_client)) {\r
+                       dev_err(&pdev->dev, "failed to create ion client for vcodec");\r
+                       return PTR_ERR(pservice->ion_client);\r
+               } else {\r
+                       dev_info(&pdev->dev, "vcodec ion client create success!\n");\r
+               }\r
+\r
+               if (pservice->hw_info->hw_id == HEVC_ID)\r
+                       sprintf(mmu_dev_dts_name, "iommu,hevc_mmu");\r
+               else\r
+                       sprintf(mmu_dev_dts_name, "iommu,vpu_mmu");\r
+\r
+               pservice->mmu_dev = rockchip_get_sysmmu_device_by_compatible(mmu_dev_dts_name);\r
+\r
+               if (pservice->mmu_dev) {\r
+                       platform_set_sysmmu(pservice->mmu_dev, pservice->dev);\r
+                       iovmm_activate(pservice->dev);\r
+               }\r
+       }\r
 #endif\r
 \r
     vpu_service_power_off(pservice);\r