From 89ff0a2a21a36790db6a0fa4e91294b2cc6a9024 Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Fri, 22 Apr 2022 17:55:31 +0800 Subject: [PATCH] video: rockchip: mpp: rkvenc2: Dump status reg on timeout Signed-off-by: Herman Chen Change-Id: If69e18d1597fd40206d991eb962110f78fc8d3f2 --- drivers/video/rockchip/mpp/mpp_common.c | 9 +++++++++ drivers/video/rockchip/mpp/mpp_common.h | 1 + drivers/video/rockchip/mpp/mpp_rkvenc2.c | 15 +++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index f3a1e7c08de5..dc84eb6b5281 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -1998,6 +1998,15 @@ static int mpp_iommu_handle(struct iommu_domain *iommu, return 0; } +void mpp_reg_show(struct mpp_dev *mpp, u32 offset) +{ + if (!mpp) + return; + + dev_err(mpp->dev, "reg[%03d]: %04x: 0x%08x\n", + offset >> 2, offset, mpp_read_relaxed(mpp, offset)); +} + /* The device will do more probing work after this */ int mpp_dev_probe(struct mpp_dev *mpp, struct platform_device *pdev) diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h index 655bbb69eace..b1c5271f34a7 100644 --- a/drivers/video/rockchip/mpp/mpp_common.h +++ b/drivers/video/rockchip/mpp/mpp_common.h @@ -634,6 +634,7 @@ int mpp_task_dump_mem_region(struct mpp_dev *mpp, int mpp_task_dump_reg(struct mpp_dev *mpp, struct mpp_task *task); int mpp_task_dump_hw_reg(struct mpp_dev *mpp); +void mpp_reg_show(struct mpp_dev *mpp, u32 offset); void mpp_free_task(struct kref *ref); void mpp_session_deinit(struct mpp_session *session); diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc2.c b/drivers/video/rockchip/mpp/mpp_rkvenc2.c index 8761a09a9ffc..e7afbd9209d8 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc2.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc2.c @@ -1626,6 +1626,9 @@ static int rkvenc2_task_default_process(struct mpp_dev *mpp, return ret; } +#define RKVENC2_TIMEOUT_DUMP_REG_START (0x5100) +#define RKVENC2_TIMEOUT_DUMP_REG_END (0x5160) + static void rkvenc2_task_timeout_process(struct mpp_session *session, struct mpp_task *task) { @@ -1636,6 +1639,18 @@ static void rkvenc2_task_timeout_process(struct mpp_session *session, session->pid, session->index, atomic_read(&session->task_count), task->task_id, kref_read(&task->ref)); + if (task->mpp) { + struct mpp_dev *mpp = task->mpp; + u32 start = RKVENC2_TIMEOUT_DUMP_REG_START; + u32 end = RKVENC2_TIMEOUT_DUMP_REG_END; + u32 offset; + + dev_err(mpp->dev, "core %d dump timeout status:\n", mpp->core_id); + + for (offset = start; offset < end; offset += sizeof(u32)) + mpp_reg_show(mpp, offset); + } + rkvenc2_task_pop_pending(task); }