From d2fa6b515150dcb51ba5ea89dfee064aa6da7c4a Mon Sep 17 00:00:00 2001 From: Yandong Lin Date: Fri, 17 Mar 2023 11:12:19 +0800 Subject: [PATCH] video: rockchip: mpp: fix bus err for px30 dec/enc When encoding and decoding in parallel, iommu switch failed cause bus err. rk_iommu ff442800.iommu: BUS_ERROR occurred at 0x0000000000000000 Rootcause: Get a invalid dte addr when px30_workaround_combo_init, because of iommu not enable status. solution: read a valid dte addr when iommu enable status. Signed-off-by: Yandong Lin Change-Id: I4b84c650a6e132928a6dc91a26985abd8c273cfe --- drivers/video/rockchip/mpp/hack/mpp_hack_px30.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c b/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c index 379049eaf8fc..07912bcc3436 100644 --- a/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c +++ b/drivers/video/rockchip/mpp/hack/mpp_hack_px30.c @@ -19,6 +19,7 @@ #include "../mpp_common.h" #include "../mpp_iommu.h" #include "mpp_hack_px30.h" +#include #define RK_MMU_DTE_ADDR 0x00 /* Directory table address */ #define RK_MMU_STATUS 0x04 @@ -177,7 +178,17 @@ int px30_workaround_combo_init(struct mpp_dev *mpp) iommu->grf_val = mpp->grf_info->val & MPP_GRF_VAL_MASK; if (mpp->hw_ops->clk_on) mpp->hw_ops->clk_on(mpp); - iommu->dte_addr = mpp_iommu_get_dte_addr(iommu); + /* + * ensure that iommu is enable, so that read valid dte value + */ + if (rockchip_iommu_is_enabled(mpp->dev)) + iommu->dte_addr = mpp_iommu_get_dte_addr(iommu); + else { + rockchip_iommu_enable(mpp->dev); + iommu->dte_addr = mpp_iommu_get_dte_addr(iommu); + rockchip_iommu_disable(mpp->dev); + } + dev_err(mpp->dev, "%s dte_addr %08x\n", __func__, iommu->dte_addr); if (mpp->hw_ops->clk_off) mpp->hw_ops->clk_off(mpp); INIT_LIST_HEAD(&iommu->link);