rk3036, rk312x: add iommu switch in dts for vcodec and iep
authorljf <ljf@rock-chips.com>
Fri, 8 Aug 2014 01:46:48 +0000 (09:46 +0800)
committerljf <ljf@rock-chips.com>
Fri, 8 Aug 2014 01:46:48 +0000 (09:46 +0800)
arch/arm/boot/dts/rk3036.dtsi
arch/arm/boot/dts/rk312x.dtsi
arch/arm/mach-rockchip/vcodec_service.c
drivers/video/rockchip/iep/hw_iep_reg.c
drivers/video/rockchip/iep/iep_drv.c

index 4f065c51a034d79c79362e0befecc01907a9e408..82c2229248faf2f0070b250e137bf1c102ba3016 100755 (executable)
                };
        };
 
-        vpu: vpu_service@10108000 {
+       vpu: vpu_service@10108000 {
                compatible = "vpu_service";
+               iommu_enabled = <1>;
                reg = <0x10108000 0x800>;
                interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-names = "irq_dec";
 
        hevc: hevc_service@1010c000 {
                compatible = "rockchip,hevc_service";
+               iommu_enabled = <1>;
                reg = <0x1010c000 0x400>;
                interrupts = <GIC_SPI 57 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-names = "irq_dec";
                clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core";
                name = "hevc_service";
                status = "okay";
-        };
+       };
 
        vop_mmu {
                dbgname = "vop";
index b587bc91f4afcee2a13c1a92546e1f92515c2d02..637a6d6c83aa7a77dde784723f051cef4799acfd 100755 (executable)
 
        vpu: vpu_service@10106000 {
                compatible = "vpu_service";
+               iommu_enabled = <1>;
                reg = <0x10106000 0x800>;
                interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-names = "irq_enc", "irq_dec";
 
        hevc: hevc_service@10104000 {
                compatible = "rockchip,hevc_service";
+               iommu_enabled = <1>;
                reg = <0x10104000 0x400>;
                interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>;
                interrupt-names = "irq_dec";
 
        iep: iep@10108000 {
                compatible = "rockchip,iep";
+               iommu_enabled = <1>;
                reg = <0x10108000 0x800>;
                interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clk_gates9 8>, <&clk_gates9 7>;
index 5ea3129b82f2dd3cfd9d74c8697d62feae26646e..873e83fbb31838b00f8a747e04c5ed0978d4aea1 100755 (executable)
@@ -405,9 +405,9 @@ static const struct file_operations debug_vcodec_fops = {
 #define BIT_VCODEC_SEL_RK312X          (1<<15)\r
 static void vcodec_enter_mode_nolock(enum vcodec_device_id id, u32 *reserved_mode)\r
 {\r
-       if (soc_is_rk3036() || soc_is_rk3126() || soc_is_rk3128()) {\r
-               int bits = soc_is_rk3036() ? BIT_VCODEC_SEL_RK3036 : BIT_VCODEC_SEL_RK312X;\r
-               void __iomem *addr = soc_is_rk3036() ? (RK_GRF_VIRT + RK3036_GRF_SOC_CON1) : (RK_GRF_VIRT + RK312X_GRF_SOC_CON1);\r
+       if (cpu_is_rk3036() || cpu_is_rk312x()) {\r
+               int bits = cpu_is_rk3036() ? BIT_VCODEC_SEL_RK3036 : BIT_VCODEC_SEL_RK312X;\r
+               void __iomem *addr = cpu_is_rk3036() ? (RK_GRF_VIRT + RK3036_GRF_SOC_CON1) : (RK_GRF_VIRT + RK312X_GRF_SOC_CON1);\r
                if (reserved_mode)\r
                        *reserved_mode = readl_relaxed(addr);\r
                if (id == VCODEC_DEVICE_ID_HEVC)\r
@@ -419,23 +419,23 @@ static void vcodec_enter_mode_nolock(enum vcodec_device_id id, u32 *reserved_mod
 \r
 static void vcodec_exit_mode_nolock(enum vcodec_device_id id, u32 reserved_mode)\r
 {\r
-       if (soc_is_rk3036() || soc_is_rk3126() || soc_is_rk3128()) {\r
-               int bits = soc_is_rk3036() ? BIT_VCODEC_SEL_RK3036 : BIT_VCODEC_SEL_RK312X;\r
-               void __iomem *addr = soc_is_rk3036() ? (RK_GRF_VIRT + RK3036_GRF_SOC_CON1) : (RK_GRF_VIRT + RK312X_GRF_SOC_CON1);\r
+       if (cpu_is_rk3036() || cpu_is_rk312x()) {\r
+               int bits = cpu_is_rk3036() ? BIT_VCODEC_SEL_RK3036 : BIT_VCODEC_SEL_RK312X;\r
+               void __iomem *addr = cpu_is_rk3036() ? (RK_GRF_VIRT + RK3036_GRF_SOC_CON1) : (RK_GRF_VIRT + RK312X_GRF_SOC_CON1);\r
                writel_relaxed(reserved_mode | (bits << 16), addr);\r
        }\r
 }\r
 \r
 static void vcodec_enter_mode(enum vcodec_device_id id)\r
 {\r
-       if (soc_is_rk3036() || soc_is_rk3126() || soc_is_rk3128())\r
+       if (cpu_is_rk3036() || cpu_is_rk312x())\r
                mutex_lock(&g_mode_mutex);\r
        vcodec_enter_mode_nolock(id, NULL);\r
 }\r
 \r
 static void vcodec_exit_mode(void)\r
 {\r
-       if (soc_is_rk3036() || soc_is_rk3126() || soc_is_rk3128())\r
+       if (cpu_is_rk3036() || cpu_is_rk312x())\r
                mutex_unlock(&g_mode_mutex);\r
 }\r
 \r
@@ -462,7 +462,7 @@ static int vpu_get_clk(struct vpu_service_info *pservice)
                                break;\r
                        }\r
 \r
-                       if (!soc_is_rk3036() && !soc_is_rk3126() && !soc_is_rk3128()) {\r
+                       if (!cpu_is_rk3036() && !cpu_is_rk312x()) {\r
                                pservice->clk_cabac = devm_clk_get(pservice->dev, "clk_cabac");\r
                                if (IS_ERR(pservice->clk_cabac)) {\r
                                        dev_err(pservice->dev, "failed on clk_get clk_cabac\n");\r
@@ -472,7 +472,7 @@ static int vpu_get_clk(struct vpu_service_info *pservice)
                                pservice->clk_cabac = NULL;\r
                        }\r
 \r
-                       if (!soc_is_rk3036() && !soc_is_rk3126() && !soc_is_rk3128()) {\r
+                       if (!cpu_is_rk3036() && !cpu_is_rk312x()) {\r
                                pservice->pd_video = devm_clk_get(pservice->dev, "pd_hevc");\r
                                if (IS_ERR(pservice->pd_video)) {\r
                                        dev_err(pservice->dev, "failed on clk_get pd_hevc\n");\r
@@ -482,7 +482,7 @@ static int vpu_get_clk(struct vpu_service_info *pservice)
                                pservice->pd_video = NULL;\r
                        }\r
                } else {\r
-                       if (!soc_is_rk3036() && !soc_is_rk3126() && !soc_is_rk3128()) {\r
+                       if (!cpu_is_rk3036() && !cpu_is_rk312x()) {\r
                                pservice->pd_video = devm_clk_get(pservice->dev, "pd_video");\r
                                if (IS_ERR(pservice->pd_video)) {\r
                                        dev_err(pservice->dev, "failed on clk_get pd_video\n");\r
@@ -493,7 +493,7 @@ static int vpu_get_clk(struct vpu_service_info *pservice)
                        }\r
                }\r
 \r
-               if (soc_is_rk3126() || soc_is_rk3128()) {\r
+               if (cpu_is_rk312x()) {\r
                        pservice->pd_video = devm_clk_get(pservice->dev, "pd_video");\r
                        if (IS_ERR(pservice->pd_video)) {\r
                                dev_err(pservice->dev, "failed on clk_get pd_video\n");\r
@@ -1415,7 +1415,7 @@ static long vpu_service_ioctl(struct file *filp, unsigned int cmd, unsigned long
 \r
        return 0;\r
 }\r
-#if 1\r
+\r
 static int vpu_service_check_hw(vpu_service_info *p, unsigned long hw_addr)\r
 {\r
        int ret = -EINVAL, i = 0;\r
@@ -1442,7 +1442,6 @@ static int vpu_service_check_hw(vpu_service_info *p, unsigned long hw_addr)
        iounmap((void *)tmp);\r
        return ret;\r
 }\r
-#endif\r
 \r
 static int vpu_service_open(struct inode *inode, struct file *filp)\r
 {\r
@@ -1554,7 +1553,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
+       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
@@ -1584,7 +1585,7 @@ static int vcodec_probe(struct platform_device *pdev)
        pservice->reg_pproc     = NULL;\r
        atomic_set(&pservice->total_running, 0);\r
        pservice->enabled = false;\r
-#if defined(CONFIG_VCODEC_MMU)    \r
+#if defined(CONFIG_VCODEC_MMU)\r
        pservice->mmu_dev = NULL;\r
 #endif\r
        pservice->dev = dev;\r
@@ -1610,7 +1611,7 @@ static int vcodec_probe(struct platform_device *pdev)
 \r
        {\r
                u32 offset = res->start;\r
-               if (soc_is_rk3036()) {\r
+               if (cpu_is_rk3036()) {\r
                        if (pservice->dev_id == VCODEC_DEVICE_ID_VPU)\r
                                offset += 0x400;\r
                }\r
@@ -1629,7 +1630,7 @@ static int vcodec_probe(struct platform_device *pdev)
 \r
        pservice->reg_size   = pservice->dec_dev.iosize;\r
 \r
-       if (pservice->hw_info->hw_id != HEVC_ID && !soc_is_rk3036()) {\r
+       if (pservice->hw_info->hw_id != HEVC_ID && !cpu_is_rk3036()) {\r
                pservice->enc_dev.iobaseaddr = res->start + pservice->hw_info->enc_offset;\r
                pservice->enc_dev.iosize     = pservice->hw_info->enc_io_size;\r
 \r
@@ -1716,23 +1717,26 @@ 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
+       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
-       pservice->mmu_dev = rockchip_get_sysmmu_device_by_compatible(mmu_dev_dts_name);\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
-       if (pservice->mmu_dev) {\r
-               platform_set_sysmmu(pservice->mmu_dev, pservice->dev);\r
-               iovmm_activate(pservice->dev);\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
@@ -1844,7 +1848,7 @@ static void get_hw_info(struct vpu_service_info *pservice)
 \r
                if (soc_is_rk3190() || soc_is_rk3288())\r
                        dec->maxDecPicWidth = 4096;\r
-               else if (soc_is_rk3036() || soc_is_rk3126() || soc_is_rk3128())\r
+               else if (cpu_is_rk3036() || cpu_is_rk312x())\r
                        dec->maxDecPicWidth = 1920;\r
                else\r
                        dec->maxDecPicWidth = configReg & 0x07FFU;\r
@@ -1878,7 +1882,7 @@ static void get_hw_info(struct vpu_service_info *pservice)
                        dec->refBufSupport |= 8; /* enable HW support for offset */\r
 \r
                /// invalidate fuse register value in rk319x vpu and following.\r
-               if (!soc_is_rk3190() && !soc_is_rk3288() && !soc_is_rk3036() && !soc_is_rk3126() && !soc_is_rk3128()) {\r
+               if (!soc_is_rk3190() && !soc_is_rk3288() && !cpu_is_rk3036() && !cpu_is_rk312x()) {\r
                        VPUHwFuseStatus_t hwFuseSts;\r
                        /* Decoder fuse configuration */\r
                        u32 fuseReg = pservice->dec_dev.hwregs[VPU_DEC_HW_FUSE_CFG];\r
@@ -1995,7 +1999,7 @@ static void get_hw_info(struct vpu_service_info *pservice)
                        }\r
                }\r
 \r
-               if (!soc_is_rk3036()) {\r
+               if (!cpu_is_rk3036()) {\r
                        configReg = pservice->enc_dev.hwregs[63];\r
                        enc->maxEncodedWidth = configReg & ((1 << 11) - 1);\r
                        enc->h264Enabled = (configReg >> 27) & 1;\r
@@ -2018,7 +2022,7 @@ static void get_hw_info(struct vpu_service_info *pservice)
 \r
                pservice->bug_dec_addr = cpu_is_rk30xx();\r
        } else {\r
-               if (soc_is_rk3036()  || soc_is_rk3126() || soc_is_rk3128())\r
+               if (cpu_is_rk3036()  || cpu_is_rk312x())\r
                        dec->maxDecPicWidth = 1920;\r
                else\r
                        dec->maxDecPicWidth = 4096;\r
index 0552a3984fe7bddce6fec116841a5acae12303e7..810206eebf1d207b9d41c6abd6fae930eebd4cd1 100755 (executable)
@@ -1195,7 +1195,7 @@ void iep_config(iep_session *session, IEP_MSG *iep_msg)
     \r
 #if defined(CONFIG_IEP_IOMMU)\r
     INIT_LIST_HEAD(&reg->mem_region_list);    \r
-#endif    \r
+#endif\r
 \r
     //write config\r
     iep_config_src_size(iep_msg);\r
@@ -1249,10 +1249,12 @@ void iep_config(iep_session *session, IEP_MSG *iep_msg)
 #endif\r
 \r
 #if defined(CONFIG_IEP_IOMMU)\r
-    if (0 > iep_reg_address_translate(&iep_service, reg)) {\r
-        IEP_ERR("error: translate reg address failed\n");\r
-        kfree(reg);\r
-        return;\r
+    if (iep_service.iommu_dev) {\r
+        if (0 > iep_reg_address_translate(&iep_service, reg)) {\r
+            IEP_ERR("error: translate reg address failed\n");\r
+            kfree(reg);\r
+            return;\r
+        }\r
     }\r
 #endif\r
 \r
index d5c8d96b102547d4d88707d80734a5fc9daf13d4..f1d0114a201d13a8066a1b8cd1f4d50e498045e2 100755 (executable)
@@ -79,11 +79,13 @@ static void iep_reg_deinit(struct iep_reg *reg)
 #if defined(CONFIG_IEP_IOMMU)\r
     struct iep_mem_region *mem_region = NULL, *n;\r
     // release memory region attach to this registers table.\r
-    list_for_each_entry_safe(mem_region, n, &reg->mem_region_list, reg_lnk) {\r
-        ion_unmap_iommu(iep_service.iommu_dev, iep_service.ion_client, mem_region->hdl);\r
-        ion_free(iep_service.ion_client, mem_region->hdl);\r
-        list_del_init(&mem_region->reg_lnk);\r
-        kfree(mem_region);\r
+    if (iep_service.iommu_dev) {\r
+        list_for_each_entry_safe(mem_region, n, &reg->mem_region_list, reg_lnk) {\r
+            ion_unmap_iommu(iep_service.iommu_dev, iep_service.ion_client, mem_region->hdl);\r
+            ion_free(iep_service.ion_client, mem_region->hdl);\r
+            list_del_init(&mem_region->reg_lnk);\r
+            kfree(mem_region);\r
+        }\r
     }\r
 #endif \r
     list_del_init(&reg->session_link);\r
@@ -797,7 +799,10 @@ static int iep_drv_probe(struct platform_device *pdev)
     int ret = 0;\r
     struct resource *res = NULL;\r
 #if defined(CONFIG_IEP_IOMMU)\r
+    u32 iommu_en = 0;\r
     struct device *mmu_dev = NULL;\r
+    struct device_node *np = pdev->dev.of_node;\r
+    of_property_read_u32(np, "iommu_enabled", &iommu_en);\r
 #endif\r
 \r
     data = (struct iep_drvdata*)devm_kzalloc(&pdev->dev, sizeof(struct iep_drvdata), GFP_KERNEL);\r
@@ -884,24 +889,26 @@ static int iep_drv_probe(struct platform_device *pdev)
     \r
 #if defined(CONFIG_IEP_IOMMU)\r
     iep_service.iommu_dev = NULL;\r
-    iep_power_on();\r
-    iep_service.ion_client = rockchip_ion_client_create("iep");\r
-    if (IS_ERR(iep_service.ion_client)) {\r
-        IEP_ERR("failed to create ion client for vcodec");\r
-        return PTR_ERR(iep_service.ion_client);\r
-    } else {\r
-        IEP_INFO("iep ion client create success!\n");\r
-    }\r
-   \r
-    mmu_dev = rockchip_get_sysmmu_device_by_compatible("iommu,iep_mmu");\r
-    \r
-    if (mmu_dev) {\r
-        platform_set_sysmmu(mmu_dev, &pdev->dev);\r
-        iovmm_activate(&pdev->dev);\r
+    if (iommu_en) {\r
+        iep_power_on();\r
+        iep_service.ion_client = rockchip_ion_client_create("iep");\r
+        if (IS_ERR(iep_service.ion_client)) {\r
+            IEP_ERR("failed to create ion client for vcodec");\r
+            return PTR_ERR(iep_service.ion_client);\r
+        } else {\r
+            IEP_INFO("iep ion client create success!\n");\r
+        }\r
+\r
+        mmu_dev = rockchip_get_sysmmu_device_by_compatible("iommu,iep_mmu");\r
+        \r
+        if (mmu_dev) {\r
+            platform_set_sysmmu(mmu_dev, &pdev->dev);\r
+            iovmm_activate(&pdev->dev);\r
+        }\r
+\r
+        iep_service.iommu_dev = &pdev->dev;\r
+        iep_power_off();\r
     }\r
-    \r
-    iep_service.iommu_dev = &pdev->dev;\r
-    iep_power_off();\r
 #endif\r
 \r
     IEP_INFO("IEP Driver loaded succesfully\n");\r