From 35845f0bce48a973302856af0709b7f8012c86fe Mon Sep 17 00:00:00 2001 From: Mingwei Yan Date: Mon, 4 Mar 2024 19:17:37 +0800 Subject: [PATCH] media: rockchip: vpss: offline support rkfbcd input Signed-off-by: Mingwei Yan Change-Id: Id537c4426f1251c620d2a5795728c44d0aa6f70b --- drivers/media/platform/rockchip/vpss/regs.h | 2 ++ .../platform/rockchip/vpss/vpss_offline.c | 34 +++++++++++++++++-- include/uapi/linux/rk-video-format.h | 2 ++ include/uapi/linux/rk-vpss-config.h | 1 + 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/rockchip/vpss/regs.h b/drivers/media/platform/rockchip/vpss/regs.h index 8f850bb11b73..afeb2a5f6570 100644 --- a/drivers/media/platform/rockchip/vpss/regs.h +++ b/drivers/media/platform/rockchip/vpss/regs.h @@ -1142,6 +1142,8 @@ #define RKVPSS_MI_RD_BURST4_LEN 0 #define RKVPSS_MI_RD_BURST8_LEN BIT(20) #define RKVPSS_MI_RD_BURST16_LEN (BIT(20) | BIT(21)) +#define RKVPSS_MI_RD_FBCD_YUV444_EN BIT(26) +#define RKVPSS_MI_RD_FBCD_OPT_DIS BIT(27) #define RKVPSS_MI_RD_R2Y_BYPASS BIT(28) #define RKVPSS_MI_RD_OLD BIT(30) #define RKVPSS_MI_RD_NEW_BURST_DIS BIT(31) diff --git a/drivers/media/platform/rockchip/vpss/vpss_offline.c b/drivers/media/platform/rockchip/vpss/vpss_offline.c index 16e265f6a83d..9a4c653f2a7a 100644 --- a/drivers/media/platform/rockchip/vpss/vpss_offline.c +++ b/drivers/media/platform/rockchip/vpss/vpss_offline.c @@ -9,6 +9,7 @@ #include #include #include +#include #include "dev.h" #include "hw.h" @@ -642,6 +643,27 @@ static int rkvpss_ofl_run(struct file *file, struct rkvpss_frame_cfg *cfg) in_size = cfg->input.stride * cfg->input.height; in_ctrl |= RKVPSS_MI_RD_INPUT_ABGR888 | RKVPSS_MI_RD_RB_SWAP; break; + case V4L2_PIX_FMT_FBC0: + if (cfg->input.stride < ALIGN(cfg->input.width, 16)) + cfg->input.stride = ALIGN(cfg->input.width, 16); + in_c_offs = 0; + in_size = cfg->input.stride * cfg->input.height * 3 / 2; + in_ctrl |= RKVPSS_MI_RD_INPUT_420SP; + break; + case V4L2_PIX_FMT_FBC2: + if (cfg->input.stride < ALIGN(cfg->input.width, 16)) + cfg->input.stride = ALIGN(cfg->input.width, 16); + in_c_offs = 0; + in_size = cfg->input.stride * cfg->input.height * 2; + in_ctrl |= RKVPSS_MI_RD_INPUT_422SP; + break; + case V4L2_PIX_FMT_FBC4: + if (cfg->input.stride < ALIGN(cfg->input.width, 16)) + cfg->input.stride = ALIGN(cfg->input.width, 16); + in_c_offs = 0; + in_size = cfg->input.stride * cfg->input.height * 3; + in_ctrl |= RKVPSS_MI_RD_INPUT_422SP | RKVPSS_MI_RD_FBCD_YUV444_EN; + break; default: v4l2_err(&ofl->v4l2_dev, "dev_id:%d no support input format:%c%c%c%c\n", cfg->dev_id, cfg->input.format, cfg->input.format >> 8, @@ -784,8 +806,16 @@ static int rkvpss_ofl_run(struct file *file, struct rkvpss_frame_cfg *cfg) rkvpss_hw_write(hw, RKVPSS_MI_RD_Y_WIDTH, val); val = cfg->input.height; rkvpss_hw_write(hw, RKVPSS_MI_RD_Y_HEIGHT, val); - val = cfg->input.stride; - rkvpss_hw_write(hw, RKVPSS_MI_RD_Y_STRIDE, val); + + if (cfg->input.format == V4L2_PIX_FMT_FBC0 || + cfg->input.format == V4L2_PIX_FMT_FBC2 || + cfg->input.format == V4L2_PIX_FMT_FBC4) { + in_ctrl |= RKVPSS_MI_RD_MODE(2) | RKVPSS_MI_RD_FBCD_OPT_DIS; + rkvpss_hw_write(hw, RKVPSS_MI_RD_Y_STRIDE, 0); + } else { + val = cfg->input.stride; + rkvpss_hw_write(hw, RKVPSS_MI_RD_Y_STRIDE, val); + } mask = RKVPSS_MI_RD_GROUP_MODE(3) | RKVPSS_MI_RD_BURST16_LEN; rkvpss_hw_set_bits(hw, RKVPSS_MI_RD_CTRL, ~mask, in_ctrl); diff --git a/include/uapi/linux/rk-video-format.h b/include/uapi/linux/rk-video-format.h index 938d5adff737..05907e6454ff 100644 --- a/include/uapi/linux/rk-video-format.h +++ b/include/uapi/linux/rk-video-format.h @@ -16,6 +16,8 @@ #define V4L2_PIX_FMT_FBC2 v4l2_fourcc('F', 'B', 'C', '2') /* Rockchip yuv420sp frame buffer compression encoder */ #define V4L2_PIX_FMT_FBC0 v4l2_fourcc('F', 'B', 'C', '0') +/* Rockchip yuv444p frame buffer compression encoder */ +#define V4L2_PIX_FMT_FBC4 v4l2_fourcc('F', 'B', 'C', '4') #define V4L2_PIX_FMT_FBCG v4l2_fourcc('F', 'B', 'C', 'G') /* embedded data 8-bit */ #define V4l2_PIX_FMT_EBD8 v4l2_fourcc('E', 'B', 'D', '8') diff --git a/include/uapi/linux/rk-vpss-config.h b/include/uapi/linux/rk-vpss-config.h index 37644f2f874f..9aabb657669f 100644 --- a/include/uapi/linux/rk-vpss-config.h +++ b/include/uapi/linux/rk-vpss-config.h @@ -181,6 +181,7 @@ struct rkvpss_module_sel { * height: height of input image, range: 32~3504 * stride: virtual width of input image, 16 align. auto calculate according to width and format if 0. * format: V4L2_PIX_FMT_NV12/V4L2_PIX_FMT_NV16/V4L2_PIX_FMT_RGB565/V4L2_PIX_FMT_RGB24/V4L2_PIX_FMT_XBGR32 + * V4L2_PIX_FMT_FBC0/V4L2_PIX_FMT_FBC2/V4L2_PIX_FMT_FBC4 for rkfbcd * buf_fd: dmabuf fd of input image buf */ struct rkvpss_input_cfg {