media: rockchip: vpss: offline support rkfbcd input

Signed-off-by: Mingwei Yan <mingwei.yan@rock-chips.com>
Change-Id: Id537c4426f1251c620d2a5795728c44d0aa6f70b
This commit is contained in:
Mingwei Yan
2024-03-04 19:17:37 +08:00
committed by Tao Huang
parent de11635f6d
commit 35845f0bce
4 changed files with 37 additions and 2 deletions

View File

@@ -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)

View File

@@ -9,6 +9,7 @@
#include <media/videobuf2-v4l2.h>
#include <linux/pm_runtime.h>
#include <linux/rk-vpss-config.h>
#include <linux/rk-video-format.h>
#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);

View File

@@ -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')

View File

@@ -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 {