From d53bd4a922ed6885f7cd8739c7082a45260f38d0 Mon Sep 17 00:00:00 2001 From: Ding Wei Date: Thu, 29 Oct 2020 09:41:37 +0800 Subject: [PATCH] video: rockchip: mpp: rkvenc issue for iommu irq repeat when iommu pagefault, mark_irq to disable iommu interrupt, then handle the fault, and unmark_irq to enable hardware. Change-Id: Id40868bfab67ac27e12c181d83a8e70a09a1e498 Signed-off-by: Ding Wei --- drivers/video/rockchip/mpp/mpp_common.c | 16 +++++++++------- drivers/video/rockchip/mpp/mpp_rkvenc.c | 5 +++++ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 0372173e92fd..4a0779b51edd 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -1563,14 +1563,16 @@ int mpp_task_dump_reg(struct mpp_dev *mpp, return -EIO; mpp_err("--- dump register ---\n"); - if (task->reg) { - s = task->hw_info->reg_start; - e = task->hw_info->reg_end; - for (i = s; i <= e; i++) { - u32 reg = i * sizeof(u32); + if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG)) { + if (task->reg) { + s = task->hw_info->reg_start; + e = task->hw_info->reg_end; + for (i = s; i <= e; i++) { + u32 reg = i * sizeof(u32); - mpp_err("reg[%03d]: %04x: 0x%08x\n", - i, reg, task->reg[i]); + mpp_err("reg[%03d]: %04x: 0x%08x\n", + i, reg, task->reg[i]); + } } } diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index 5248060e005e..f0e097a0f0d2 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -1063,6 +1063,7 @@ static void rkvenc_iommu_handle_work(struct work_struct *work_s) struct mpp_dev *mpp = &enc->mpp; unsigned long page_iova = 0; + mpp_debug_enter(); /* avoid another page fault occur after page fault */ down_write(&mpp->iommu_info->rw_sem); @@ -1081,7 +1082,10 @@ static void rkvenc_iommu_handle_work(struct work_struct *work_s) else enc->aux_iova = page_iova; + rk_iommu_unmask_irq(mpp->dev); up_write(&mpp->iommu_info->rw_sem); + + mpp_debug_leave(); } static int rkvenc_iommu_fault_handle(struct iommu_domain *iommu, @@ -1095,6 +1099,7 @@ static int rkvenc_iommu_fault_handle(struct iommu_domain *iommu, mpp_debug(DEBUG_IOMMU, "IOMMU_GET_BUS_ID(status)=%d\n", IOMMU_GET_BUS_ID(status)); if (IOMMU_GET_BUS_ID(status)) { enc->fault_iova = iova; + rk_iommu_mask_irq(mpp->dev); queue_work(enc->iommu_wq, &enc->iommu_work); } mpp_debug_leave();