diff --git a/drivers/video/rockchip/rga2/rga2.h b/drivers/video/rockchip/rga2/rga2.h index 68268bb461c1..335970c44ed6 100644 --- a/drivers/video/rockchip/rga2/rga2.h +++ b/drivers/video/rockchip/rga2/rga2.h @@ -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; diff --git a/drivers/video/rockchip/rga2/rga2_drv.c b/drivers/video/rockchip/rga2/rga2_drv.c index 15064e7615fb..3d7891306272 100644 --- a/drivers/video/rockchip/rga2/rga2_drv.c +++ b/drivers/video/rockchip/rga2/rga2_drv.c @@ -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: diff --git a/drivers/video/rockchip/rga2/rga2_mmu_info.c b/drivers/video/rockchip/rga2/rga2_mmu_info.c index 6f38719f7242..af97f7a93998 100644 --- a/drivers/video/rockchip/rga2/rga2_mmu_info.c +++ b/drivers/video/rockchip/rga2/rga2_mmu_info.c @@ -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: diff --git a/drivers/video/rockchip/rga2/rga2_reg_info.c b/drivers/video/rockchip/rga2/rga2_reg_info.c index 544e968a3d92..d66df54ee595 100644 --- a/drivers/video/rockchip/rga2/rga2_reg_info.c +++ b/drivers/video/rockchip/rga2/rga2_reg_info.c @@ -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; } }