video/rockchip: rga2: Added support for ARGB format

Add ARGB8888/XRGB8888/ARGB5551/ARGB4444/ABGR8888/XBGR8888/ABGR5551/ABGR4444.

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: I9eb8f5fbcc1a87a5750b7dc2eaf808f8395856a0
This commit is contained in:
Yu Qiaowei
2021-09-17 11:20:24 +08:00
committed by Tao Huang
parent 50ec41b5c2
commit 1b8283e911
4 changed files with 100 additions and 6 deletions

View File

@@ -124,7 +124,16 @@ enum
RGA2_FORMAT_BPP_1 = 0x24,
RGA2_FORMAT_BPP_2 = 0x25,
RGA2_FORMAT_BPP_4 = 0x26,
RGA2_FORMAT_BPP_8 = 0x27
RGA2_FORMAT_BPP_8 = 0x27,
RGA2_FORMAT_ARGB_8888 = 0x28,
RGA2_FORMAT_XRGB_8888 = 0x29,
RGA2_FORMAT_ARGB_5551 = 0x2a,
RGA2_FORMAT_ARGB_4444 = 0x2b,
RGA2_FORMAT_ABGR_8888 = 0x2c,
RGA2_FORMAT_XBGR_8888 = 0x2d,
RGA2_FORMAT_ABGR_5551 = 0x2e,
RGA2_FORMAT_ABGR_4444 = 0x2f,
};
typedef struct mdp_img
@@ -316,7 +325,7 @@ typedef struct rga_img_info_t
unsigned short vir_h;
unsigned short endian_mode; //for BPP
unsigned short alpha_swap;
unsigned short alpha_swap; /* not use */
}
rga_img_info_t;
@@ -584,7 +593,7 @@ struct rga2_req
u8 alpha_zero_key;
u8 src_trans_mode;
u8 alpha_swp;
u8 alpha_swp; /* not use */
u8 dither_mode;
u8 rgb2yuv_mode;

View File

@@ -247,6 +247,23 @@ static const char *rga2_get_format_name(uint32_t format)
case RGA2_FORMAT_BGRA_4444:
return "BGRA4444";
case RGA2_FORMAT_ARGB_8888:
return "ARGB8888";
case RGA2_FORMAT_XRGB_8888:
return "XBGR8888";
case RGA2_FORMAT_ARGB_5551:
return "ARGB5551";
case RGA2_FORMAT_ARGB_4444:
return "ARGB4444";
case RGA2_FORMAT_ABGR_8888:
return "ABGR8888";
case RGA2_FORMAT_XBGR_8888:
return "XBGR8888";
case RGA2_FORMAT_ABGR_5551:
return "ABGR5551";
case RGA2_FORMAT_ABGR_4444:
return "ABGR4444";
case RGA2_FORMAT_YCbCr_422_SP:
return "YCbCr422SP";
case RGA2_FORMAT_YCbCr_422_P:

View File

@@ -151,6 +151,10 @@ static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
case RGA2_FORMAT_RGBX_8888:
case RGA2_FORMAT_BGRA_8888:
case RGA2_FORMAT_BGRX_8888:
case RGA2_FORMAT_ARGB_8888:
case RGA2_FORMAT_XRGB_8888:
case RGA2_FORMAT_ABGR_8888:
case RGA2_FORMAT_XBGR_8888:
bits = 32;
break;
case RGA2_FORMAT_RGB_888:
@@ -167,6 +171,10 @@ static int rga2_memory_check(void *vaddr, u32 w, u32 h, u32 format, int fd)
case RGA2_FORMAT_YCrCb_422_P:
case RGA2_FORMAT_BGRA_5551:
case RGA2_FORMAT_BGRA_4444:
case RGA2_FORMAT_ARGB_5551:
case RGA2_FORMAT_ARGB_4444:
case RGA2_FORMAT_ABGR_5551:
case RGA2_FORMAT_ABGR_4444:
bits = 16;
break;
case RGA2_FORMAT_YCbCr_420_SP:
@@ -619,6 +627,10 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
case RGA2_FORMAT_RGBX_8888 :
case RGA2_FORMAT_BGRA_8888 :
case RGA2_FORMAT_BGRX_8888 :
case RGA2_FORMAT_ARGB_8888 :
case RGA2_FORMAT_XRGB_8888 :
case RGA2_FORMAT_ABGR_8888 :
case RGA2_FORMAT_XBGR_8888 :
stride = (w * 4 + 3) & (~3);
size_yrgb = stride*h;
start = yrgb_addr >> PAGE_SHIFT;
@@ -641,6 +653,10 @@ static int rga2_buf_size_cal(unsigned long yrgb_addr, unsigned long uv_addr, uns
case RGA2_FORMAT_BGR_565 :
case RGA2_FORMAT_BGRA_5551 :
case RGA2_FORMAT_BGRA_4444 :
case RGA2_FORMAT_ARGB_5551 :
case RGA2_FORMAT_ARGB_4444 :
case RGA2_FORMAT_ABGR_5551 :
case RGA2_FORMAT_ABGR_4444 :
stride = (w*2 + 3) & (~3);
size_yrgb = stride * h;
start = yrgb_addr >> PAGE_SHIFT;
@@ -787,6 +803,10 @@ static int rga2_UserMemory_cheeck(struct page **pages, u32 w, u32 h, u32 format,
case RGA2_FORMAT_RGBX_8888:
case RGA2_FORMAT_BGRA_8888:
case RGA2_FORMAT_BGRX_8888:
case RGA2_FORMAT_ARGB_8888:
case RGA2_FORMAT_XRGB_8888:
case RGA2_FORMAT_ABGR_8888:
case RGA2_FORMAT_XBGR_8888:
bits = 32;
break;
case RGA2_FORMAT_RGB_888:
@@ -803,6 +823,10 @@ static int rga2_UserMemory_cheeck(struct page **pages, u32 w, u32 h, u32 format,
case RGA2_FORMAT_YCrCb_422_P:
case RGA2_FORMAT_BGRA_5551:
case RGA2_FORMAT_BGRA_4444:
case RGA2_FORMAT_ARGB_5551:
case RGA2_FORMAT_ARGB_4444:
case RGA2_FORMAT_ABGR_5551:
case RGA2_FORMAT_ABGR_4444:
bits = 16;
break;
case RGA2_FORMAT_YCbCr_420_SP:

View File

@@ -162,6 +162,7 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
RK_U8 src0_rb_swp = 0;
RK_U8 src0_rgb_pack = 0;
RK_U8 src0_alpha_swp = 0;
RK_U8 src0_cbcr_swp = 0;
RK_U8 pixel_width = 1;
@@ -251,6 +252,17 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
case RGA2_FORMAT_BGRA_5551 : src0_format = 0x5; pixel_width = 2; break;
case RGA2_FORMAT_BGRA_4444 : src0_format = 0x6; pixel_width = 2; break;
/* ARGB */
/* In colorkey mode, xrgb/xbgr does not need to enable the alpha channel */
case RGA2_FORMAT_ARGB_8888 : src0_format = 0x0; pixel_width = 4; src0_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_8888 : src0_format = 0x0; pixel_width = 4; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
case RGA2_FORMAT_XRGB_8888 : src0_format = 0x1; pixel_width = 4; src0_alpha_swp = 1; msg->src_trans_mode &= 0x07; break;
case RGA2_FORMAT_XBGR_8888 : src0_format = 0x1; pixel_width = 4; src0_alpha_swp = 1; src0_rb_swp = 0x1; msg->src_trans_mode &= 0x07; break;
case RGA2_FORMAT_ARGB_5551 : src0_format = 0x5; pixel_width = 2; src0_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_5551 : src0_format = 0x5; pixel_width = 2; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
case RGA2_FORMAT_ARGB_4444 : src0_format = 0x6; pixel_width = 2; src0_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_4444 : src0_format = 0x6; pixel_width = 2; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
case RGA2_FORMAT_YVYU_422 : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 1; src0_rb_swp = 0x1; break;//rbswap=ycswap
case RGA2_FORMAT_VYUY_422 : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 1; src0_rb_swp = 0x0; break;
case RGA2_FORMAT_YUYV_422 : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 0; src0_rb_swp = 0x1; break;
@@ -275,7 +287,7 @@ static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(msg->alpha_swp)));
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(src0_alpha_swp)));
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
@@ -363,10 +375,12 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
RK_U8 src1_format = 0;
RK_U8 src1_rb_swp = 0;
RK_U8 src1_rgb_pack = 0;
RK_U8 src1_alpha_swp = 0;
RK_U8 dst_format = 0;
RK_U8 dst_rb_swp = 0;
RK_U8 dst_rgb_pack = 0;
RK_U8 dst_cbcr_swp = 0;
RK_U8 dst_alpha_swp = 0;
RK_U8 dst_fmt_yuv400_en = 0;
RK_U8 dst_fmt_y4_en = 0;
@@ -416,12 +430,22 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
case RGA2_FORMAT_BGR_565 : src1_format = 0x4; spw = 2; src1_rb_swp = 0x1; break;
case RGA2_FORMAT_BGRA_5551 : src1_format = 0x5; spw = 2; break;
case RGA2_FORMAT_BGRA_4444 : src1_format = 0x6; spw = 2; break;
/* ARGB */
case RGA2_FORMAT_ARGB_8888 : src1_format = 0x0; spw = 4; src1_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_8888 : src1_format = 0x0; spw = 4; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
case RGA2_FORMAT_XRGB_8888 : src1_format = 0x1; spw = 4; src1_alpha_swp = 1; break;
case RGA2_FORMAT_XBGR_8888 : src1_format = 0x1; spw = 4; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
case RGA2_FORMAT_ARGB_5551 : src1_format = 0x5; spw = 2; src1_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_5551 : src1_format = 0x5; spw = 2; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
case RGA2_FORMAT_ARGB_4444 : src1_format = 0x6; spw = 2; src1_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_4444 : src1_format = 0x6; spw = 2; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
default : spw = 4; break;
};
reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_FMT)) | (s_RGA2_DST_INFO_SW_SRC1_FMT(src1_format)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_RB_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_RB_SWP(src1_rb_swp)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(msg->alpha_swp >> 1)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(src1_alpha_swp)));
switch (msg->dst.format)
@@ -439,6 +463,16 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
case RGA2_FORMAT_BGRA_5551 : dst_format = 0x5; dpw = 2; break;
case RGA2_FORMAT_BGRA_4444 : dst_format = 0x6; dpw = 2; break;
/* ARGB */
case RGA2_FORMAT_ARGB_8888 : dst_format = 0x0; dpw = 4; dst_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_8888 : dst_format = 0x0; dpw = 4; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
case RGA2_FORMAT_XRGB_8888 : dst_format = 0x1; dpw = 4; dst_alpha_swp = 1; break;
case RGA2_FORMAT_XBGR_8888 : dst_format = 0x1; dpw = 4; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
case RGA2_FORMAT_ARGB_5551 : dst_format = 0x5; dpw = 2; dst_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_5551 : dst_format = 0x5; dpw = 2; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
case RGA2_FORMAT_ARGB_4444 : dst_format = 0x6; dpw = 2; dst_alpha_swp = 1; break;
case RGA2_FORMAT_ABGR_4444 : dst_format = 0x6; dpw = 2; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
case RGA2_FORMAT_YCbCr_422_SP : dst_format = 0x8; x_div = 1; y_div = 1; break;
case RGA2_FORMAT_YCbCr_422_P : dst_format = 0x9; x_div = 2; y_div = 1; break;
case RGA2_FORMAT_YCbCr_420_SP : dst_format = 0xa; x_div = 1; y_div = 2; break;
@@ -463,7 +497,7 @@ static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT)) | (s_RGA2_DST_INFO_SW_DST_FMT(dst_format)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_RB_SWAP)) | (s_RGA2_DST_INFO_SW_DST_RB_SWAP(dst_rb_swp)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(msg->alpha_swp >> 2)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(dst_alpha_swp)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UV_SWAP)) | (s_RGA2_DST_INFO_SW_DST_UV_SWAP(dst_cbcr_swp)));
reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN)) | (s_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN(dst_fmt_yuv400_en)));
@@ -1119,6 +1153,16 @@ static void format_name_convert(uint32_t *df, uint32_t sf)
case 0x24:*df = RGA2_FORMAT_BGR_565; break;
case 0x25:*df = RGA2_FORMAT_BGRA_5551; break;
case 0x26:*df = RGA2_FORMAT_BGRA_4444; break;
case 0x28 : *df = RGA2_FORMAT_ARGB_8888; break;
case 0x29 : *df = RGA2_FORMAT_XRGB_8888; break;
case 0x2a : *df = RGA2_FORMAT_ARGB_5551; break;
case 0x2b : *df = RGA2_FORMAT_ARGB_4444; break;
case 0x2c : *df = RGA2_FORMAT_ABGR_8888; break;
case 0x2d : *df = RGA2_FORMAT_XBGR_8888; break;
case 0x2e : *df = RGA2_FORMAT_ABGR_5551; break;
case 0x2f : *df = RGA2_FORMAT_ABGR_4444; break;
}
}