From f13dae5b9cf4db5c5328d8451a4af741cc048e7b Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Wed, 16 Nov 2022 20:37:32 +0800 Subject: [PATCH] video: rockchip: rga3: iommu device uses slave mode Signed-off-by: Yu Qiaowei Change-Id: I1ab682d3ee687ae13ba4d7c252d1d9ec25875efd --- .../rockchip/rga3/include/rga2_reg_info.h | 2 - drivers/video/rockchip/rga3/rga2_reg_info.c | 20 +++++++--- drivers/video/rockchip/rga3/rga3_reg_info.c | 40 ++++++++++++------- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga2_reg_info.h b/drivers/video/rockchip/rga3/include/rga2_reg_info.h index 4c134793d744..37afb7640f8a 100644 --- a/drivers/video/rockchip/rga3/include/rga2_reg_info.h +++ b/drivers/video/rockchip/rga3/include/rga2_reg_info.h @@ -4,8 +4,6 @@ #include "rga_drv.h" -#define RGA2_USE_MASTER_MODE 1 - #define RGA2_SYS_REG_BASE 0x000 #define RGA2_CSC_REG_BASE 0x060 #define RGA2_CMD_REG_BASE 0x100 diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index 0d433138bbd0..2310f70cad8d 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -167,10 +167,6 @@ static void RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg) if (msg->render_mode == 4) render_mode = 3; - /* In slave mode, the current frame completion interrupt must be enabled. */ - if (!RGA2_USE_MASTER_MODE) - msg->CMD_fin_int_enable = 1; - reg = ((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) | (s_RGA2_MODE_CTRL_SW_RENDER_MODE(render_mode))); @@ -2268,6 +2264,10 @@ static int rga2_init_reg(struct rga_job *job) } } + /* In slave mode, the current frame completion interrupt must be enabled. */ + if (scheduler->data->mmu == RGA_IOMMU) + req.CMD_fin_int_enable = 1; + if (rga2_gen_reg_info((uint8_t *)job->cmd_reg, &req) == -1) { pr_err("gen reg info error\n"); return -EINVAL; @@ -2411,9 +2411,19 @@ static void rga2_set_reg_full_csc(struct rga_job *job, struct rga_scheduler_t *s static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) { int i; + bool master_mode_en; uint32_t sys_ctrl; ktime_t now = ktime_get(); + /* + * Currently there is no iova allocated for storing cmd for the IOMMU device, + * so the iommu device needs to use the slave mode. + */ + if (scheduler->data->mmu != RGA_IOMMU) + master_mode_en = true; + else + master_mode_en = false; + if (job->pre_intr_info.enable) rga2_set_pre_intr_reg(job, scheduler); @@ -2444,7 +2454,7 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) m_RGA2_SYS_CTRL_RST_PROTECT_P | m_RGA2_SYS_CTRL_DST_WR_OPT_DIS | m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS; - if (RGA2_USE_MASTER_MODE) { + if (master_mode_en) { /* master mode */ sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(1); diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index efb579b6b532..3fac6dbf3cfc 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -8,6 +8,7 @@ #define pr_fmt(fmt) "rga3_reg: " fmt #include "rga3_reg_info.h" +#include "rga_dma_buf.h" #include "rga_common.h" #include "rga_debugger.h" #include "rga_hw_config.h" @@ -1899,9 +1900,19 @@ static void rga3_dump_read_back_reg(struct rga_scheduler_t *scheduler) static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) { int i; + bool master_mode_en; uint32_t sys_ctrl; ktime_t now = ktime_get(); + /* + * Currently there is no iova allocated for storing cmd for the IOMMU device, + * so the iommu device needs to use the slave mode. + */ + if (scheduler->data->mmu != RGA_IOMMU) + master_mode_en = true; + else + master_mode_en = false; + if (DEBUGGER_EN(REG)) { uint32_t *p; @@ -1917,24 +1928,25 @@ static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, RGA3_INT_EN, scheduler); -#if 0 - /* master mode */ - sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(1); + if (master_mode_en) { + /* master mode */ + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(1); - rga_dma_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); + /* cmd buffer flush cache to ddr */ + rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); - rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); - rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); - rga_write(m_RGA3_CMD_CTRL_CMD_LINE_ST_P, RGA3_CMD_CTRL, scheduler); -#else - /* slave mode */ - sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(0) | m_RGA3_SYS_CTRL_RGA_SART; + rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); + rga_write(m_RGA3_CMD_CTRL_CMD_LINE_ST_P, RGA3_CMD_CTRL, scheduler); + } else { + /* slave mode */ + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(0) | m_RGA3_SYS_CTRL_RGA_SART; - for (i = 0; i <= 50; i++) - rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); + for (i = 0; i <= 50; i++) + rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); - rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); -#endif + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); + } if (DEBUGGER_EN(REG)) { pr_info("sys_ctrl = 0x%x, int_en = 0x%x, int_raw = 0x%x\n",