From 2c2f6687dc9a0b19f457e3fcef289fe8b514007e Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Wed, 22 Feb 2023 14:43:19 +0800 Subject: [PATCH] video: rockchip: rga3: improve the resolution limitation of VSP When the horizontal input exceeds 2k (here refers to 1996), need to switch from BI-cubic to BI-linear. When there is an HSD(horizontal scale down), need to check the horizontal input after the HSD. Signed-off-by: Yu Qiaowei Change-Id: I3e4ceeb0e85811ccb131c22fe77ebaa571b8a922 --- .../rockchip/rga3/include/rga2_reg_info.h | 2 ++ drivers/video/rockchip/rga3/rga2_reg_info.c | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga2_reg_info.h b/drivers/video/rockchip/rga3/include/rga2_reg_info.h index 66c467d4df46..6a5601b114cd 100644 --- a/drivers/video/rockchip/rga3/include/rga2_reg_info.h +++ b/drivers/video/rockchip/rga3/include/rga2_reg_info.h @@ -432,6 +432,8 @@ #define s_RGA2_MMU_CTRL1_SW_ELS_MMU_EN(x) ((x & 0x1) << 12) #define s_RGA2_MMU_CTRL1_SW_ELS_MMU_FLUSH(x) ((x & 0x1) << 13) +#define RGA2_VSP_BICUBIC_LIMIT 1996 + extern const struct rga_backend_ops rga2_ops; #endif diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index c95ea04be224..b1b176c9eea8 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -226,6 +226,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg) u32 sw, sh; u32 dw, dh; u8 rotate_mode; + u8 vsp_scale_mode = 0; u8 scale_w_flag, scale_h_flag; bRGA_SRC_INFO = (u32 *) (base + RGA2_SRC_INFO_OFFSET); @@ -289,6 +290,18 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg) scale_w_flag = 3; } + /* VSP scale mode select, HSD > VSD > VSP > HSP */ + if (scale_h_flag == 0x2) { + /* After HSD, VSP needs to check dst_width */ + if ((scale_w_flag == 0x1) && (dw < RGA2_VSP_BICUBIC_LIMIT)) + vsp_scale_mode = 0x0; + else if (sw < RGA2_VSP_BICUBIC_LIMIT) + vsp_scale_mode = 0x0; + else + /* default select bilinear */ + vsp_scale_mode = 0x1; + } + switch (msg->src.format) { case RGA_FORMAT_RGBA_8888: src0_format = 0x0; @@ -559,8 +572,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg) ((msg->alpha_rop_flag >> 4) & 0x1))); reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) | - (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL(( - msg->scale_bicu_mode >> 4)))); + (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((vsp_scale_mode)))); reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10)))); @@ -1843,9 +1855,6 @@ static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler, break; } - if ((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h)) - req->scale_bicu_mode |= (1 << 4); - req->LUT_addr = req_rga->LUT_addr; req->rop_mask_addr = req_rga->rop_mask_addr;