Skip to content

Commit 26a8f14

Browse files
Yu Qiaoweirkhuangtao
authored andcommitted
video/rockchip: rga2: Support A+B->C blend mode.
The mode A is src, B is src1, and C is dst. Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: I124665d7b727d921b33c0efbe5f3b048141a3879
1 parent 90f84e5 commit 26a8f14

4 files changed

Lines changed: 34 additions & 12 deletions

File tree

drivers/video/rockchip/rga2/rga2_drv.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,15 @@ static void print_debug_info(struct rga2_req *req)
322322
req->src.act_w, req->src.act_h, req->src.vir_w, req->src.vir_h,
323323
req->src.x_offset, req->src.y_offset,
324324
rga2_get_format_name(req->src.format));
325+
if (req->src1.yrgb_addr != 0 ||
326+
req->src1.uv_addr != 0 ||
327+
req->src1.v_addr != 0) {
328+
INFO("src1 : y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d xoff=%d yoff=%d format=%s\n",
329+
req->src1.yrgb_addr, req->src1.uv_addr, req->src1.v_addr,
330+
req->src1.act_w, req->src1.act_h, req->src1.vir_w, req->src1.vir_h,
331+
req->src1.x_offset, req->src1.y_offset,
332+
rga2_get_format_name(req->src1.format));
333+
}
325334
INFO("dst : y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d xoff=%d yoff=%d format=%s\n",
326335
req->dst.yrgb_addr, req->dst.uv_addr, req->dst.v_addr,
327336
req->dst.act_w, req->dst.act_h, req->dst.vir_w, req->dst.vir_h,

drivers/video/rockchip/rga2/rga2_mmu_info.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,7 @@ static int rga2_mmu_info_BitBlt_mode(struct rga2_reg *reg, struct rga2_req *req)
749749
/* change the buf address in req struct */
750750
req->mmu_info.src1_base_addr = ((unsigned long)(MMU_Base_phys
751751
+ Src0MemSize));
752-
req->src1.yrgb_addr = (req->src.yrgb_addr & (~PAGE_MASK));
752+
req->src1.yrgb_addr = (req->src1.yrgb_addr & (~PAGE_MASK));
753753
}
754754
if (DstMemSize) {
755755
if (req->sg_dst) {

drivers/video/rockchip/rga2/rga2_reg_info.c

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -266,13 +266,7 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
266266
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
267267
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(msg->alpha_swp)));
268268
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
269-
if(msg->src.format <= RGA2_FORMAT_BGRA_4444)
270-
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(0)));
271-
else
272-
if(msg->dst.format >= RGA2_FORMAT_YCbCr_422_SP)
273-
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(0)));
274-
else
275-
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
269+
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
276270

277271
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE(msg->rotate_mode & 0x3)));
278272
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE((msg->rotate_mode >> 4) & 0x3)));
@@ -412,8 +406,11 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
412406
reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_UP_E)) | (s_RGA2_DST_INFO_SW_DITHER_UP_E(msg->alpha_rop_flag >> 5)));
413407
reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_DOWN_E)) | (s_RGA2_DST_INFO_SW_DITHER_DOWN_E(msg->alpha_rop_flag >> 6)));
414408
reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_MODE)) | (s_RGA2_DST_INFO_SW_DITHER_MODE(msg->dither_mode)));
415-
reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 4)));
416-
reg = ((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 6)));
409+
reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 2)));
410+
reg = ((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 4)));
411+
/* Some older chips do not support src1 csc mode, they do not have these two registers. */
412+
reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_MODE)) | (s_RGA2_DST_INFO_SW_SRC1_CSC_MODE(msg->yuv2rgb_mode >> 5)));
413+
reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 7)));
417414

418415

419416
*bRGA_DST_INFO = reg;
@@ -1053,6 +1050,7 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
10531050

10541051
format_name_convert(&req->src.format, req_rga->src.format);
10551052
format_name_convert(&req->dst.format, req_rga->dst.format);
1053+
format_name_convert(&req->src1.format, req_rga->pat.format);
10561054

10571055
if(req_rga->rotate_mode == 1) {
10581056
if(req_rga->sina == 0 && req_rga->cosa == 65536) {
@@ -1116,7 +1114,10 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
11161114
memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
11171115

11181116
req->palette_mode = req_rga->palette_mode;
1119-
req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
1117+
if ((req_rga->yuv2rgb_mode & 0x3) != 0)
1118+
req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
1119+
else
1120+
req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
11201121
req->endian_mode = req_rga->endian_mode;
11211122
req->rgb2yuv_mode = 0;
11221123

@@ -1229,6 +1230,11 @@ void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
12291230
req->mmu_info.dst_mmu_flag = 0;
12301231
req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;
12311232
}
1233+
1234+
if (req_rga->pat.yrgb_addr >= 0xa0000000) {
1235+
req->mmu_info.src1_mmu_flag = 0;
1236+
req->src1.yrgb_addr = req_rga->pat.yrgb_addr - 0x60000000;
1237+
}
12321238
}
12331239
}
12341240
}
@@ -1323,7 +1329,10 @@ void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
13231329
req->bg_color = req_rga->bg_color;
13241330
memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
13251331
req->palette_mode = req_rga->palette_mode;
1326-
req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
1332+
if ((req_rga->yuv2rgb_mode & 0x3) != 0)
1333+
req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
1334+
else
1335+
req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
13271336
req->endian_mode = req_rga->endian_mode;
13281337
req->rgb2yuv_mode = 0;
13291338
req->fading_alpha_value = 0;

drivers/video/rockchip/rga2/rga2_reg_info.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@
142142
#define m_RGA2_DST_INFO_SW_DITHER_MODE ( 0x3<<14)
143143
#define m_RGA2_DST_INFO_SW_DST_CSC_MODE ( 0x3<<16) //add
144144
#define m_RGA2_DST_INFO_SW_CSC_CLIP_MODE ( 0x1<<18)
145+
#define m_RGA2_DST_INFO_SW_SRC1_CSC_MODE ( 0x3<<20) //add
146+
#define m_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE ( 0x1<<22)
145147

146148
#define s_RGA2_DST_INFO_SW_DST_FMT(x) ( (x&0xf)<<0 )
147149
#define s_RGA2_DST_INFO_SW_DST_RB_SWAP(x) ( (x&0x1)<<4 )
@@ -155,6 +157,8 @@
155157
#define s_RGA2_DST_INFO_SW_DITHER_MODE(x) ( (x&0x3)<<14)
156158
#define s_RGA2_DST_INFO_SW_DST_CSC_MODE(x) ( (x&0x3)<<16) //add
157159
#define s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(x) ( (x&0x1)<<18)
160+
#define s_RGA2_DST_INFO_SW_SRC1_CSC_MODE(x) ( (x&0x3)<<20) //add
161+
#define s_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE(x) ( (x&0x1)<<22)
158162

159163

160164
/* RGA_ALPHA_CTRL0 */

0 commit comments

Comments
 (0)