video: rockchip: rga3: support Yin_Yout mode

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: Ia94e4e58575eabcc122390ad126a1c5d9e6f468e
This commit is contained in:
Yu Qiaowei
2022-03-03 21:01:49 +08:00
committed by Tao Huang
parent 943b11ebfa
commit 06622a5859
5 changed files with 30 additions and 7 deletions

View File

@@ -624,6 +624,8 @@ struct rga2_req {
/* RGA2 1106 add */
struct rga_mosaic_info mosaic_info;
uint8_t yin_yout_en;
};
struct rga3_req {

View File

@@ -356,8 +356,6 @@
int rga2_gen_reg_info(unsigned char *base,
unsigned char *csc_base, struct rga2_req *msg);
void rga_cmd_to_rga2_cmd(struct rga_req *req_rga, struct rga2_req *req);
void rga2_soft_reset(struct rga_scheduler_t *scheduler);
int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler);
int rga2_init_reg(struct rga_job *job);

View File

@@ -17,6 +17,7 @@ bool rga_is_yuv422_packed_format(uint32_t format);
bool rga_is_yuv8bit_format(uint32_t format);
bool rga_is_yuv10bit_format(uint32_t format);
bool rga_is_yuv422p_format(uint32_t format);
bool rga_is_only_y_format(uint32_t format);
int rga_get_format_bits(uint32_t format);

View File

@@ -11,6 +11,7 @@
#include "rga2_reg_info.h"
#include "rga2_mmu_info.h"
#include "rga_common.h"
#include "rga_hw_config.h"
extern struct rga2_mmu_info_t rga2_mmu_info;
@@ -189,6 +190,9 @@ static void RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)
reg = ((reg & (~m_RGA2_MODE_CTRL_SW_MOSAIC_EN)) |
(s_RGA2_MODE_CTRL_SW_MOSAIC_EN(msg->mosaic_info.enable)));
reg = ((reg & (~m_RGA2_MODE_CTRL_SW_YIN_YOUT_EN)) |
(s_RGA2_MODE_CTRL_SW_YIN_YOUT_EN(msg->yin_yout_en)));
*bRGA_MODE_CTL = reg;
}
@@ -201,7 +205,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
u32 *bRGA_MASK_ADDR;
u32 *bRGA_SRC_TR_COLOR0, *bRGA_SRC_TR_COLOR1;
u8 src_fmt_yuv400_en = 0;
u8 disable_uv_channel_en = 0;
u32 reg = 0;
u8 src0_format = 0;
@@ -492,7 +496,8 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
case RGA_FORMAT_YCbCr_400:
src0_format = 0x8;
src_fmt_yuv400_en = 1;
/* When Yin_Yout is enabled, no need to go through the software. */
disable_uv_channel_en = msg->yin_yout_en ? false : true;
xdiv = 1;
ydiv = 1;
break;
@@ -558,7 +563,7 @@ static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;
uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);
if (src_fmt_yuv400_en == 1) {
if (disable_uv_channel_en == 1) {
/*
* When Y400 as the input format, because the current
* RGA does not support closing
@@ -1690,7 +1695,8 @@ int rga2_gen_reg_info(u8 *base, u8 *csc_base, struct rga2_req *msg)
return 0;
}
void rga_cmd_to_rga2_cmd(struct rga_req *req_rga, struct rga2_req *req)
static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler,
struct rga_req *req_rga, struct rga2_req *req)
{
u16 alpha_mode_0, alpha_mode_1;
@@ -1826,6 +1832,11 @@ void rga_cmd_to_rga2_cmd(struct rga_req *req_rga, struct rga2_req *req)
/* RGA2 1106 add */
memcpy(&req->mosaic_info, &req_rga->mosaic_info, sizeof(req_rga->mosaic_info));
if ((scheduler->data->feature & RGA_YIN_YOUT) &&
rga_is_only_y_format(req->src.format) &&
rga_is_only_y_format(req->dst.format))
req->yin_yout_en = true;
if (((req_rga->alpha_rop_flag) & 1)) {
if ((req_rga->alpha_rop_flag >> 3) & 1) {
/* porter duff alpha enable */
@@ -2137,7 +2148,7 @@ int rga2_init_reg(struct rga_job *job)
memset(&req, 0x0, sizeof(req));
rga_cmd_to_rga2_cmd(&job->rga_command_base, &req);
rga_cmd_to_rga2_cmd(scheduler, &job->rga_command_base, &req);
/* check value if legal */
ret = rga2_check_param(&req);

View File

@@ -173,6 +173,17 @@ bool rga_is_yuv422p_format(uint32_t format)
}
}
bool rga_is_only_y_format(uint32_t format)
{
switch (format) {
case RGA_FORMAT_YCbCr_400:
case RGA_FORMAT_Y4:
return true;
default:
return false;
}
}
int rga_get_format_bits(uint32_t format)
{
int bits = 0;