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>;
// release memory region attach to this registers table.\r
if (pservice->mmu_dev) {\r
list_for_each_entry_safe(mem_region, n, ®->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
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
#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