From f9bd64b4803c791870ab40e2c87726b43bd7218b Mon Sep 17 00:00:00 2001 From: Ding Wei Date: Mon, 27 Apr 2020 09:18:47 +0800 Subject: [PATCH] video: rockchip: mpp: add dump info when alloc failed changes: 1. task->info ==> task->mpp_task.info 2. export mpp_task->reg for dump register setting Change-Id: I78b024d083e04fcbf8fd76fbe5f24798d912103a Signed-off-by: Ding Wei --- drivers/video/rockchip/mpp/mpp_common.c | 69 ++++++++++++++++++------- drivers/video/rockchip/mpp/mpp_common.h | 19 +++++-- drivers/video/rockchip/mpp/mpp_iommu.c | 2 + drivers/video/rockchip/mpp/mpp_rkvdec.c | 25 +++++---- drivers/video/rockchip/mpp/mpp_rkvenc.c | 24 +++++---- drivers/video/rockchip/mpp/mpp_vdpu1.c | 30 ++++++----- drivers/video/rockchip/mpp/mpp_vdpu2.c | 27 +++++----- drivers/video/rockchip/mpp/mpp_vepu1.c | 25 +++++---- drivers/video/rockchip/mpp/mpp_vepu2.c | 25 +++++---- 9 files changed, 158 insertions(+), 88 deletions(-) diff --git a/drivers/video/rockchip/mpp/mpp_common.c b/drivers/video/rockchip/mpp/mpp_common.c index 1784cb548e84..47689947b2ce 100644 --- a/drivers/video/rockchip/mpp/mpp_common.c +++ b/drivers/video/rockchip/mpp/mpp_common.c @@ -1186,8 +1186,8 @@ int mpp_translate_reg_address(struct mpp_session *session, mem_region = mpp_task_attach_fd(task, usr_fd); if (IS_ERR(mem_region)) { - mpp_debug(DEBUG_IOMMU, "reg[%3d]: %08x fd %d failed\n", - tbl[i], reg[tbl[i]], usr_fd); + mpp_err("reg[%3d]: 0x%08x fd %d failed\n", + tbl[i], reg[tbl[i]], usr_fd); return PTR_ERR(mem_region); } mpp_debug(DEBUG_IOMMU, @@ -1333,24 +1333,16 @@ int mpp_task_finalize(struct mpp_session *session, return 0; } -static int mpp_iommu_handle(struct iommu_domain *iommu, - struct device *iommu_dev, - unsigned long iova, - int status, void *arg) +int mpp_task_dump_mem_region(struct mpp_dev *mpp, + struct mpp_task *task) { - u32 i, s, e; struct mpp_mem_region *mem = NULL, *n; - struct mpp_dev *mpp = (struct mpp_dev *)arg; - struct mpp_task *task = mpp->cur_task; - - dev_err(mpp->dev, "fault addr 0x%08lx status %x\n", iova, status); if (!task) return -EIO; + mpp_err("--- dump mem region ---\n"); if (!list_empty(&task->mem_region_list)) { - /* dump mem region */ - mpp_err("--- dump mem region ---\n"); list_for_each_entry_safe(mem, n, &task->mem_region_list, reg_link) { @@ -1361,15 +1353,56 @@ static int mpp_iommu_handle(struct iommu_domain *iommu, dev_err(mpp->dev, "no memory region mapped\n"); } - /* dump register */ - s = mpp->var->hw_info->reg_start; - e = mpp->var->hw_info->reg_end; + return 0; +} + +int mpp_task_dump_reg(struct mpp_dev *mpp, + struct mpp_task *task) +{ + u32 i, s, e; + + if (!task) + 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); + + mpp_err("reg[%03d]: %04x: 0x%08x\n", + i, reg, task->reg[i]); + } + } + + return 0; +} + +static int mpp_iommu_handle(struct iommu_domain *iommu, + struct device *iommu_dev, + unsigned long iova, + int status, void *arg) +{ + u32 i, s, e; + struct mpp_dev *mpp = (struct mpp_dev *)arg; + struct mpp_task *task = mpp->cur_task; + + dev_err(mpp->dev, "fault addr 0x%08lx status %x\n", iova, status); + + if (!task) + return -EIO; + + mpp_task_dump_mem_region(mpp, task); + + s = task->hw_info->reg_start; + e = task->hw_info->reg_end; mpp_err("--- dump register ---\n"); for (i = s; i <= e; i++) { u32 reg = i * sizeof(u32); - mpp_err("reg[%3d]: %08x\n", - i, readl_relaxed(mpp->reg_base + reg)); + mpp_err("reg[%03d]: %04x: 0x%08x\n", + i, reg, readl_relaxed(mpp->reg_base + reg)); } if (mpp->iommu_info->hdl) diff --git a/drivers/video/rockchip/mpp/mpp_common.h b/drivers/video/rockchip/mpp/mpp_common.h index 24b598f7e1b6..3ac73faa5c73 100644 --- a/drivers/video/rockchip/mpp/mpp_common.h +++ b/drivers/video/rockchip/mpp/mpp_common.h @@ -248,6 +248,9 @@ struct mpp_task { /* record context running start time */ struct timeval start; + /* hardware info for current task */ + struct mpp_hw_info *hw_info; + u32 *reg; }; struct mpp_taskqueue { @@ -378,6 +381,10 @@ int mpp_task_finish(struct mpp_session *session, struct mpp_task *task); int mpp_task_finalize(struct mpp_session *session, struct mpp_task *task); +int mpp_task_dump_mem_region(struct mpp_dev *mpp, + struct mpp_task *task); +int mpp_task_dump_reg(struct mpp_dev *mpp, + struct mpp_task *task); int mpp_dev_probe(struct mpp_dev *mpp, struct platform_device *pdev); @@ -407,7 +414,8 @@ static inline int mpp_write(struct mpp_dev *mpp, u32 reg, u32 val) { int idx = reg / sizeof(u32); - mpp_debug(DEBUG_SET_REG, "write reg[%3d]: %08x: %08x\n", idx, reg, val); + mpp_debug(DEBUG_SET_REG, + "write reg[%03d]: %04x: 0x%08x\n", idx, reg, val); writel(val, mpp->reg_base + reg); return 0; @@ -417,7 +425,8 @@ static inline int mpp_write_relaxed(struct mpp_dev *mpp, u32 reg, u32 val) { int idx = reg / sizeof(u32); - mpp_debug(DEBUG_SET_REG, "write reg[%3d]: %08x: %08x\n", idx, reg, val); + mpp_debug(DEBUG_SET_REG, + "write reg[%03d]: %04x: 0x%08x\n", idx, reg, val); writel_relaxed(val, mpp->reg_base + reg); return 0; @@ -429,7 +438,8 @@ static inline u32 mpp_read(struct mpp_dev *mpp, u32 reg) int idx = reg / sizeof(u32); val = readl(mpp->reg_base + reg); - mpp_debug(DEBUG_GET_REG, "read reg[%3d]: %08x: %08x\n", idx, reg, val); + mpp_debug(DEBUG_GET_REG, + "read reg[%03d]: %04x: 0x%08x\n", idx, reg, val); return val; } @@ -440,7 +450,8 @@ static inline u32 mpp_read_relaxed(struct mpp_dev *mpp, u32 reg) int idx = reg / sizeof(u32); val = readl_relaxed(mpp->reg_base + reg); - mpp_debug(DEBUG_GET_REG, "read reg[%3d] %08x: %08x\n", idx, reg, val); + mpp_debug(DEBUG_GET_REG, + "read reg[%03d] %04x: 0x%08x\n", idx, reg, val); return val; } diff --git a/drivers/video/rockchip/mpp/mpp_iommu.c b/drivers/video/rockchip/mpp/mpp_iommu.c index 833079ff8f90..14cc134b2459 100644 --- a/drivers/video/rockchip/mpp/mpp_iommu.c +++ b/drivers/video/rockchip/mpp/mpp_iommu.c @@ -209,12 +209,14 @@ struct mpp_dma_buffer *mpp_dma_import_fd(struct mpp_iommu_info *iommu_info, attach = dma_buf_attach(buffer->dmabuf, dma->dev); if (IS_ERR(attach)) { + mpp_err("dma_buf_attach fd %d failed\n", fd); ret = PTR_ERR(attach); goto fail_attach; } sgt = dma_buf_map_attachment(attach, buffer->dir); if (IS_ERR(sgt)) { + mpp_err("dma_buf_map_attachment fd %d failed\n", fd); ret = PTR_ERR(sgt); goto fail_map; } diff --git a/drivers/video/rockchip/mpp/mpp_rkvdec.c b/drivers/video/rockchip/mpp/mpp_rkvdec.c index 4578655863c6..e46b8f0d7bc7 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvdec.c +++ b/drivers/video/rockchip/mpp/mpp_rkvdec.c @@ -136,7 +136,6 @@ enum RKVDEC_HW_ID { struct rkvdec_task { struct mpp_task mpp_task; - struct mpp_hw_info *hw_info; unsigned long aclk_freq; unsigned long clk_core_freq; @@ -745,6 +744,7 @@ static int rkvdec_extract_task_msg(struct rkvdec_task *task, int ret; struct mpp_request *req; struct reg_offset_info *off_inf = &task->off_inf; + struct mpp_hw_info *hw_info = task->mpp_task.hw_info; for (i = 0; i < msgs->req_cnt; i++) { u32 off_s, off_e; @@ -755,8 +755,8 @@ static int rkvdec_extract_task_msg(struct rkvdec_task *task, switch (req->cmd) { case MPP_CMD_SET_REG_WRITE: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -770,8 +770,8 @@ static int rkvdec_extract_task_msg(struct rkvdec_task *task, req, sizeof(*req)); } break; case MPP_CMD_SET_REG_READ: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -808,6 +808,7 @@ static void *rkvdec_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs) { int ret; + struct mpp_task *mpp_task = NULL; struct rkvdec_task *task = NULL; struct mpp_dev *mpp = session->mpp; @@ -817,8 +818,10 @@ static void *rkvdec_alloc_task(struct mpp_session *session, if (!task) return NULL; - mpp_task_init(session, &task->mpp_task); - task->hw_info = mpp->var->hw_info; + mpp_task = &task->mpp_task; + mpp_task_init(session, mpp_task); + mpp_task->hw_info = mpp->var->hw_info; + mpp_task->reg = task->reg; /* extract reqs for current task */ ret = rkvdec_extract_task_msg(task, msgs); if (ret) @@ -839,10 +842,12 @@ static void *rkvdec_alloc_task(struct mpp_session *session, mpp_debug_leave(); - return &task->mpp_task; + return mpp_task; fail: - mpp_task_finalize(session, &task->mpp_task); + mpp_task_dump_mem_region(mpp, mpp_task); + mpp_task_dump_reg(mpp, mpp_task); + mpp_task_finalize(session, mpp_task); kfree(task); return NULL; } @@ -874,7 +879,7 @@ static int rkvdec_run(struct mpp_dev *mpp, dec = to_rkvdec_dev(mpp); task = to_rkvdec_task(mpp_task); - reg_en = task->hw_info->reg_en; + reg_en = mpp_task->hw_info->reg_en; switch (dec->state) { case RKVDEC_STATE_NORMAL: { u32 reg; diff --git a/drivers/video/rockchip/mpp/mpp_rkvenc.c b/drivers/video/rockchip/mpp/mpp_rkvenc.c index 28d64db2cbff..821a4196c22f 100644 --- a/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -118,7 +118,6 @@ enum RKVENC_MODE { struct rkvenc_task { struct mpp_task mpp_task; - struct mpp_hw_info *hw_info; int link_flags; int fmt; @@ -294,8 +293,8 @@ static void *rkvenc_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs) { int ret; - - struct rkvenc_task *task; + struct mpp_task *mpp_task = NULL; + struct rkvenc_task *task = NULL; struct mpp_dev *mpp = session->mpp; mpp_debug_enter(); @@ -304,9 +303,10 @@ static void *rkvenc_alloc_task(struct mpp_session *session, if (!task) return NULL; - mpp_task_init(session, &task->mpp_task); - task->hw_info = mpp->var->hw_info; - + mpp_task = &task->mpp_task; + mpp_task_init(session, mpp_task); + mpp_task->hw_info = mpp->var->hw_info; + mpp_task->reg = task->reg; /* extract reqs for current task */ ret = rkvenc_extract_task_msg(task, msgs); if (ret) @@ -314,21 +314,23 @@ static void *rkvenc_alloc_task(struct mpp_session *session, /* process fd in register */ if (!(msgs->flags & MPP_FLAGS_REG_FD_NO_TRANS)) { ret = mpp_translate_reg_address(session, - &task->mpp_task, task->fmt, + mpp_task, task->fmt, task->reg, &task->off_inf); if (ret) goto fail; - mpp_translate_reg_offset_info(&task->mpp_task, + mpp_translate_reg_offset_info(mpp_task, &task->off_inf, task->reg); } task->link_mode = RKVENC_MODE_ONEFRAME; mpp_debug_leave(); - return &task->mpp_task; + return mpp_task; fail: - mpp_task_finalize(session, &task->mpp_task); + mpp_task_dump_mem_region(mpp, mpp_task); + mpp_task_dump_reg(mpp, mpp_task); + mpp_task_finalize(session, mpp_task); kfree(task); return NULL; } @@ -380,7 +382,7 @@ static int rkvenc_run(struct mpp_dev *mpp, case RKVENC_MODE_ONEFRAME: { int i; struct mpp_request *req; - u32 reg_en = task->hw_info->reg_en; + u32 reg_en = mpp_task->hw_info->reg_en; /* * Tips: ensure osd plt clock is 0 before setting register, diff --git a/drivers/video/rockchip/mpp/mpp_vdpu1.c b/drivers/video/rockchip/mpp/mpp_vdpu1.c index 91c6b19bff99..6756077a9957 100644 --- a/drivers/video/rockchip/mpp/mpp_vdpu1.c +++ b/drivers/video/rockchip/mpp/mpp_vdpu1.c @@ -97,7 +97,6 @@ enum VPUD1_HW_ID { struct vdpu_task { struct mpp_task mpp_task; - struct mpp_hw_info *hw_info; /* enable of post process */ bool pp_enable; @@ -285,6 +284,7 @@ static int vdpu_extract_task_msg(struct vdpu_task *task, int ret; struct mpp_request *req; struct reg_offset_info *off_inf = &task->off_inf; + struct mpp_hw_info *hw_info = task->mpp_task.hw_info; for (i = 0; i < msgs->req_cnt; i++) { u32 off_s, off_e; @@ -295,8 +295,8 @@ static int vdpu_extract_task_msg(struct vdpu_task *task, switch (req->cmd) { case MPP_CMD_SET_REG_WRITE: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -310,8 +310,8 @@ static int vdpu_extract_task_msg(struct vdpu_task *task, req, sizeof(*req)); } break; case MPP_CMD_SET_REG_READ: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -348,7 +348,8 @@ static void *vdpu_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs) { int ret; - struct vdpu_task *task; + struct mpp_task *mpp_task = NULL; + struct vdpu_task *task = NULL; struct mpp_dev *mpp = session->mpp; mpp_debug_enter(); @@ -357,14 +358,15 @@ static void *vdpu_alloc_task(struct mpp_session *session, if (!task) return NULL; - mpp_task_init(session, &task->mpp_task); - + mpp_task = &task->mpp_task; + mpp_task_init(session, mpp_task); if (session->device_type == MPP_DEVICE_VDPU1_PP) { task->pp_enable = true; - task->hw_info = &vdpu_pp_v1_hw_info; + mpp_task->hw_info = &vdpu_pp_v1_hw_info; } else { - task->hw_info = mpp->var->hw_info; + mpp_task->hw_info = mpp->var->hw_info; } + mpp_task->reg = task->reg; /* extract reqs for current task */ ret = vdpu_extract_task_msg(task, msgs); if (ret) @@ -379,10 +381,12 @@ static void *vdpu_alloc_task(struct mpp_session *session, mpp_debug_leave(); - return &task->mpp_task; + return mpp_task; fail: - mpp_task_finalize(session, &task->mpp_task); + mpp_task_dump_mem_region(mpp, mpp_task); + mpp_task_dump_reg(mpp, mpp_task); + mpp_task_finalize(session, mpp_task); kfree(task); return NULL; } @@ -405,7 +409,7 @@ static int vdpu_run(struct mpp_dev *mpp, /* clear cache */ mpp_write_relaxed(mpp, VDPU1_REG_CLR_CACHE_BASE, 1); /* set registers for hardware */ - reg_en = task->hw_info->reg_en; + reg_en = mpp_task->hw_info->reg_en; for (i = 0; i < task->w_req_cnt; i++) { struct mpp_request *req = &task->w_reqs[i]; int s = req->offset / sizeof(u32); diff --git a/drivers/video/rockchip/mpp/mpp_vdpu2.c b/drivers/video/rockchip/mpp/mpp_vdpu2.c index b1a0fd624d72..f8eb29d4ab04 100644 --- a/drivers/video/rockchip/mpp/mpp_vdpu2.c +++ b/drivers/video/rockchip/mpp/mpp_vdpu2.c @@ -83,9 +83,6 @@ struct vdpu_task { struct mpp_task mpp_task; - struct mpp_hw_info *hw_info; - /* enable of post process */ - bool pp_enable; unsigned long aclk_freq; u32 reg[VDPU2_REG_NUM]; @@ -244,6 +241,7 @@ static int vdpu_extract_task_msg(struct vdpu_task *task, int ret; struct mpp_request *req; struct reg_offset_info *off_inf = &task->off_inf; + struct mpp_hw_info *hw_info = task->mpp_task.hw_info; for (i = 0; i < msgs->req_cnt; i++) { u32 off_s, off_e; @@ -254,8 +252,8 @@ static int vdpu_extract_task_msg(struct vdpu_task *task, switch (req->cmd) { case MPP_CMD_SET_REG_WRITE: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -269,8 +267,8 @@ static int vdpu_extract_task_msg(struct vdpu_task *task, req, sizeof(*req)); } break; case MPP_CMD_SET_REG_READ: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -307,6 +305,7 @@ static void *vdpu_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs) { int ret; + struct mpp_task *mpp_task = NULL; struct vdpu_task *task = NULL; struct mpp_dev *mpp = session->mpp; @@ -316,8 +315,10 @@ static void *vdpu_alloc_task(struct mpp_session *session, if (!task) return NULL; - mpp_task_init(session, &task->mpp_task); - task->hw_info = mpp->var->hw_info; + mpp_task = &task->mpp_task; + mpp_task_init(session, mpp_task); + mpp_task->hw_info = mpp->var->hw_info; + mpp_task->reg = task->reg; /* extract reqs for current task */ ret = vdpu_extract_task_msg(task, msgs); if (ret) @@ -332,10 +333,12 @@ static void *vdpu_alloc_task(struct mpp_session *session, mpp_debug_leave(); - return &task->mpp_task; + return mpp_task; fail: - mpp_task_finalize(session, &task->mpp_task); + mpp_task_dump_mem_region(mpp, mpp_task); + mpp_task_dump_reg(mpp, mpp_task); + mpp_task_finalize(session, mpp_task); kfree(task); return NULL; } @@ -358,7 +361,7 @@ static int vdpu_run(struct mpp_dev *mpp, /* clear cache */ mpp_write_relaxed(mpp, VDPU2_REG_CLR_CACHE_BASE, 1); /* set registers for hardware */ - reg_en = task->hw_info->reg_en; + reg_en = mpp_task->hw_info->reg_en; for (i = 0; i < task->w_req_cnt; i++) { struct mpp_request *req = &task->w_reqs[i]; int s = req->offset / sizeof(u32); diff --git a/drivers/video/rockchip/mpp/mpp_vepu1.c b/drivers/video/rockchip/mpp/mpp_vepu1.c index a64a9b1298a0..eaf29af47882 100644 --- a/drivers/video/rockchip/mpp/mpp_vepu1.c +++ b/drivers/video/rockchip/mpp/mpp_vepu1.c @@ -68,7 +68,6 @@ struct vepu_task { struct mpp_task mpp_task; - struct mpp_hw_info *hw_info; unsigned long aclk_freq; u32 reg[VEPU1_REG_NUM]; @@ -160,6 +159,7 @@ static int vepu_extract_task_msg(struct vepu_task *task, int ret; struct mpp_request *req; struct reg_offset_info *off_inf = &task->off_inf; + struct mpp_hw_info *hw_info = task->mpp_task.hw_info; for (i = 0; i < msgs->req_cnt; i++) { u32 off_s, off_e; @@ -170,8 +170,8 @@ static int vepu_extract_task_msg(struct vepu_task *task, switch (req->cmd) { case MPP_CMD_SET_REG_WRITE: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -185,8 +185,8 @@ static int vepu_extract_task_msg(struct vepu_task *task, req, sizeof(*req)); } break; case MPP_CMD_SET_REG_READ: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -223,6 +223,7 @@ static void *vepu_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs) { int ret; + struct mpp_task *mpp_task = NULL; struct vepu_task *task = NULL; struct mpp_dev *mpp = session->mpp; @@ -232,8 +233,10 @@ static void *vepu_alloc_task(struct mpp_session *session, if (!task) return NULL; - mpp_task_init(session, &task->mpp_task); - task->hw_info = mpp->var->hw_info; + mpp_task = &task->mpp_task; + mpp_task_init(session, mpp_task); + mpp_task->hw_info = mpp->var->hw_info; + mpp_task->reg = task->reg; /* extract reqs for current task */ ret = vepu_extract_task_msg(task, msgs); if (ret) @@ -247,10 +250,12 @@ static void *vepu_alloc_task(struct mpp_session *session, mpp_debug_leave(); - return &task->mpp_task; + return mpp_task; fail: - mpp_task_finalize(session, &task->mpp_task); + mpp_task_dump_mem_region(mpp, mpp_task); + mpp_task_dump_reg(mpp, mpp_task); + mpp_task_finalize(session, mpp_task); kfree(task); return NULL; } @@ -273,7 +278,7 @@ static int vepu_run(struct mpp_dev *mpp, /* clear cache */ mpp_write_relaxed(mpp, VEPU1_REG_CLR_CACHE_BASE, 1); /* set registers for hardware */ - reg_en = task->hw_info->reg_en; + reg_en = mpp_task->hw_info->reg_en; /* First, flush correct encoder format */ mpp_write_relaxed(mpp, VEPU1_REG_ENC_EN, task->reg[reg_en] & VEPU1_FORMAT_MASK); diff --git a/drivers/video/rockchip/mpp/mpp_vepu2.c b/drivers/video/rockchip/mpp/mpp_vepu2.c index 7bfa62d64e5c..a09f42c5b209 100644 --- a/drivers/video/rockchip/mpp/mpp_vepu2.c +++ b/drivers/video/rockchip/mpp/mpp_vepu2.c @@ -77,7 +77,6 @@ struct vepu_task { struct mpp_task mpp_task; - struct mpp_hw_info *hw_info; unsigned long aclk_freq; u32 reg[VEPU2_REG_NUM]; @@ -169,6 +168,7 @@ static int vepu_extract_task_msg(struct vepu_task *task, int ret; struct mpp_request *req; struct reg_offset_info *off_inf = &task->off_inf; + struct mpp_hw_info *hw_info = task->mpp_task.hw_info; for (i = 0; i < msgs->req_cnt; i++) { u32 off_s, off_e; @@ -179,8 +179,8 @@ static int vepu_extract_task_msg(struct vepu_task *task, switch (req->cmd) { case MPP_CMD_SET_REG_WRITE: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -194,8 +194,8 @@ static int vepu_extract_task_msg(struct vepu_task *task, req, sizeof(*req)); } break; case MPP_CMD_SET_REG_READ: { - off_s = task->hw_info->reg_start * sizeof(u32); - off_e = task->hw_info->reg_end * sizeof(u32); + off_s = hw_info->reg_start * sizeof(u32); + off_e = hw_info->reg_end * sizeof(u32); ret = mpp_check_req(req, 0, sizeof(task->reg), off_s, off_e); if (ret) @@ -232,6 +232,7 @@ static void *vepu_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs) { int ret; + struct mpp_task *mpp_task = NULL; struct vepu_task *task = NULL; struct mpp_dev *mpp = session->mpp; @@ -241,8 +242,10 @@ static void *vepu_alloc_task(struct mpp_session *session, if (!task) return NULL; - mpp_task_init(session, &task->mpp_task); - task->hw_info = mpp->var->hw_info; + mpp_task = &task->mpp_task; + mpp_task_init(session, mpp_task); + mpp_task->hw_info = mpp->var->hw_info; + mpp_task->reg = task->reg; /* extract reqs for current task */ ret = vepu_extract_task_msg(task, msgs); if (ret) @@ -256,10 +259,12 @@ static void *vepu_alloc_task(struct mpp_session *session, mpp_debug_leave(); - return &task->mpp_task; + return mpp_task; fail: - mpp_task_finalize(session, &task->mpp_task); + mpp_task_dump_mem_region(mpp, mpp_task); + mpp_task_dump_reg(mpp, mpp_task); + mpp_task_finalize(session, mpp_task); kfree(task); return NULL; } @@ -282,7 +287,7 @@ static int vepu_run(struct mpp_dev *mpp, /* clear cache */ mpp_write_relaxed(mpp, VEPU2_REG_CLR_CACHE_BASE, 1); - reg_en = task->hw_info->reg_en; + reg_en = mpp_task->hw_info->reg_en; /* First, flush correct encoder format */ mpp_write_relaxed(mpp, VEPU2_REG_ENC_EN, task->reg[reg_en] & VEPU2_FORMAT_MASK);