diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c index e0cb86fb7be0..20d55f9f9635 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c @@ -80,6 +80,7 @@ struct rkvdec_link_info rkvdec_link_v2_hw_info = { .irq_base = 0x00, .next_addr_base = 0x1c, .err_mask = 0xf0, + .en_sw_iommu_zap = 1, }; /* vdpu34x link hw info for rk356x */ @@ -142,6 +143,7 @@ struct rkvdec_link_info rkvdec_link_rk356x_hw_info = { .irq_base = 0x00, .next_addr_base = 0x1c, .err_mask = 0xf0, + .en_sw_iommu_zap = 1, }; /* vdpu382 link hw info */ @@ -204,6 +206,7 @@ struct rkvdec_link_info rkvdec_link_vdpu382_hw_info = { .irq_base = 0x00, .next_addr_base = 0x1c, .err_mask = 0xf0, + .en_sw_iommu_zap = 1, }; /* vdpu383 link hw info */ @@ -264,6 +267,7 @@ struct rkvdec_link_info rkvdec_link_vdpu383_hw_info = { .en_base = 0x40, .ip_en_base = 0x58, .ip_en_val = 0x01000000, + .en_sw_iommu_zap = 1, }; /* vdpu384a link hw info */ @@ -509,7 +513,9 @@ static int rkvdec2_link_enqueue(struct rkvdec_link_dev *link_dec, /* start config before all registers are set */ wmb(); - mpp_iommu_flush_tlb(link_dec->mpp->iommu_info); + /* After rv1126b, hw can execute zap. */ + if (link_info->en_sw_iommu_zap) + mpp_iommu_flush_tlb(link_dec->mpp->iommu_info); mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); link_dec->task_running++; diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h index f391bddc223e..a8796bf6078b 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h +++ b/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h @@ -137,6 +137,8 @@ struct rkvdec_link_info { u32 en_base; u32 ip_en_base; u32 ip_en_val; + + u32 en_sw_iommu_zap; }; struct rkvdec_link_dev {