diff --git a/drivers/media/platform/rockchip/isp/isp_params.c b/drivers/media/platform/rockchip/isp/isp_params.c index 9d3cad3fd490..b4af45b26c30 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.c +++ b/drivers/media/platform/rockchip/isp/isp_params.c @@ -344,19 +344,22 @@ void rkisp_params_first_cfg(struct rkisp_isp_params_vdev *params_vdev, /* Not called when the camera active, thus not isr protection. */ void rkisp_params_disable_isp(struct rkisp_isp_params_vdev *params_vdev) { - params_vdev->ops->disable_isp(params_vdev); + if (params_vdev->ops->disable_isp) + params_vdev->ops->disable_isp(params_vdev); } -void rkisp_params_get_ldchbuf_inf(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_info *ldchbuf) +void rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev *params_vdev, + void *meshbuf) { - params_vdev->ops->get_ldchbuf_inf(params_vdev, ldchbuf); + if (params_vdev->ops->get_meshbuf_inf) + params_vdev->ops->get_meshbuf_inf(params_vdev, meshbuf); } -void rkisp_params_set_ldchbuf_size(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_size *ldchsize) +void rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, + void *meshsize) { - params_vdev->ops->set_ldchbuf_size(params_vdev, ldchsize); + if (params_vdev->ops->set_meshbuf_size) + params_vdev->ops->set_meshbuf_size(params_vdev, meshsize); } void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev) diff --git a/drivers/media/platform/rockchip/isp/isp_params.h b/drivers/media/platform/rockchip/isp/isp_params.h index 1784155bfb4d..30d7ad6f501a 100644 --- a/drivers/media/platform/rockchip/isp/isp_params.h +++ b/drivers/media/platform/rockchip/isp/isp_params.h @@ -5,9 +5,17 @@ #define _RKISP_ISP_PARAM_H #include +#include #include #include "common.h" +#define ISP_PACK_4BYTE(a, b, c, d) \ + (((a) & 0xFF) << 0 | ((b) & 0xFF) << 8 | \ + ((c) & 0xFF) << 16 | ((d) & 0xFF) << 24) + +#define ISP_PACK_2SHORT(a, b) \ + (((a) & 0xFFFF) << 0 | ((b) & 0xFFFF) << 16) + enum rkisp_params_type { RKISP_PARAMS_ALL, RKISP_PARAMS_IMD, @@ -25,10 +33,10 @@ struct rkisp_isp_params_ops { void (*param_cfg)(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id, enum rkisp_params_type type); void (*param_cfgsram)(struct rkisp_isp_params_vdev *params_vdev); - void (*get_ldchbuf_inf)(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_info *ldchbuf); - void (*set_ldchbuf_size)(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_size *ldchsize); + void (*get_meshbuf_inf)(struct rkisp_isp_params_vdev *params_vdev, + void *meshbuf); + void (*set_meshbuf_size)(struct rkisp_isp_params_vdev *params_vdev, + void *meshsize); void (*stream_stop)(struct rkisp_isp_params_vdev *params_vdev); void (*fop_release)(struct rkisp_isp_params_vdev *params_vdev); }; @@ -70,18 +78,45 @@ struct rkisp_isp_params_vdev { struct rkisp_buffer *cur_buf; u32 rdbk_times; - struct isp2x_hdrtmo_cfg last_hdrtmo; - struct isp2x_hdrmge_cfg last_hdrmge; - struct isp21_drc_cfg last_hdrdrc; - struct isp2x_hdrtmo_cfg cur_hdrtmo; - struct isp2x_hdrmge_cfg cur_hdrmge; - struct isp21_drc_cfg cur_hdrdrc; - struct isp2x_lsc_cfg cur_lsccfg; struct sensor_exposure_cfg exposure; bool is_subs_evt; }; +static inline void +rkisp_iowrite32(struct rkisp_isp_params_vdev *params_vdev, + u32 value, u32 addr) +{ + rkisp_write(params_vdev->dev, addr, value, false); +} + +static inline u32 +rkisp_ioread32(struct rkisp_isp_params_vdev *params_vdev, + u32 addr) +{ + return rkisp_read(params_vdev->dev, addr, false); +} + +static inline void +isp_param_set_bits(struct rkisp_isp_params_vdev *params_vdev, + u32 reg, u32 bit_mask) +{ + u32 val; + + val = rkisp_ioread32(params_vdev, reg); + rkisp_iowrite32(params_vdev, val | bit_mask, reg); +} + +static inline void +isp_param_clear_bits(struct rkisp_isp_params_vdev *params_vdev, + u32 reg, u32 bit_mask) +{ + u32 val; + + val = rkisp_ioread32(params_vdev, reg); + rkisp_iowrite32(params_vdev, val & ~bit_mask, reg); +} + /* config params before ISP streaming */ void rkisp_params_first_cfg(struct rkisp_isp_params_vdev *params_vdev, struct ispsd_in_fmt *in_fmt, @@ -99,10 +134,10 @@ void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev, u32 isp_mis); void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id); void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev); -void rkisp_params_get_ldchbuf_inf(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_info *ldchbuf); -void rkisp_params_set_ldchbuf_size(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_size *ldchsize); +void rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev *params_vdev, + void *meshbuf); +void rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev, + void *meshsize); void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev); #endif /* _RKISP_ISP_PARAM_H */ diff --git a/drivers/media/platform/rockchip/isp/isp_params_v1x.c b/drivers/media/platform/rockchip/isp/isp_params_v1x.c index 1a62bd278165..4ca6c6dbbd2c 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v1x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v1x.c @@ -43,26 +43,6 @@ static inline u32 rkisp1_ioread32(struct rkisp_isp_params_vdev *params_vdev, return ioread32(params_vdev->dev->base_addr + addr); } -static inline void isp_param_set_bits(struct rkisp_isp_params_vdev - *params_vdev, - u32 reg, u32 bit_mask) -{ - u32 val; - - val = rkisp1_ioread32(params_vdev, reg); - rkisp1_iowrite32(params_vdev, val | bit_mask, reg); -} - -static inline void isp_param_clear_bits(struct rkisp_isp_params_vdev - *params_vdev, - u32 reg, u32 bit_mask) -{ - u32 val; - - val = rkisp1_ioread32(params_vdev, reg); - rkisp1_iowrite32(params_vdev, val & ~bit_mask, reg); -} - /* ISP BP interface function */ static void isp_dpcc_config(struct rkisp_isp_params_vdev *params_vdev, const struct cifisp_dpcc_config *arg) @@ -2261,18 +2241,6 @@ rkisp1_get_param_size_v1x(struct rkisp_isp_params_vdev *params_vdev, unsigned in sizes[0] = sizeof(struct rkisp1_isp_params_cfg); } -static void -rkisp_params_get_ldchbuf_inf_v1x(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_info *ldchbuf) -{ -} - -static void -rkisp_params_set_ldchbuf_size_v1x(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_size *ldchsize) -{ -} - /* Not called when the camera active, thus not isr protection. */ static void rkisp1_params_disable_isp_v1x(struct rkisp_isp_params_vdev *params_vdev) { @@ -2354,8 +2322,6 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .first_cfg = rkisp1_params_first_cfg_v1x, .disable_isp = rkisp1_params_disable_isp_v1x, .isr_hdl = rkisp1_params_isr_v1x, - .get_ldchbuf_inf = rkisp_params_get_ldchbuf_inf_v1x, - .set_ldchbuf_size = rkisp_params_set_ldchbuf_size_v1x, }; int rkisp_init_params_vdev_v1x(struct rkisp_isp_params_vdev *params_vdev) diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.c b/drivers/media/platform/rockchip/isp/isp_params_v21.c index 4cacb4a9a102..cc28330dc510 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.c @@ -23,40 +23,6 @@ #define ISP2X_NOBIG_OVERFLOW_SIZE (2688 * 1536) #define ISP2X_AUTO_BIGMODE_WIDTH 2688 -static inline void -rkisp_iowrite32(struct rkisp_isp_params_vdev *params_vdev, - u32 value, u32 addr) -{ - rkisp_write(params_vdev->dev, addr, value, false); -} - -static inline u32 -rkisp_ioread32(struct rkisp_isp_params_vdev *params_vdev, - u32 addr) -{ - return rkisp_read(params_vdev->dev, addr, false); -} - -static inline void -isp_param_set_bits(struct rkisp_isp_params_vdev *params_vdev, - u32 reg, u32 bit_mask) -{ - u32 val; - - val = rkisp_ioread32(params_vdev, reg); - rkisp_iowrite32(params_vdev, val | bit_mask, reg); -} - -static inline void -isp_param_clear_bits(struct rkisp_isp_params_vdev *params_vdev, - u32 reg, u32 bit_mask) -{ - u32 val; - - val = rkisp_ioread32(params_vdev, reg); - rkisp_iowrite32(params_vdev, val & ~bit_mask, reg); -} - static inline size_t isp_param_get_insize(struct rkisp_isp_params_vdev *params_vdev) { @@ -632,6 +598,8 @@ static void isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_lsc_cfg *arg) { + struct rkisp_isp_params_val_v21 *priv_val = + (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; unsigned int data; u32 lsc_ctrl; @@ -679,7 +647,7 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); } - params_vdev->cur_lsccfg = *arg; + priv_val->cur_lsccfg = *arg; } static void @@ -3700,19 +3668,21 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev) { struct rkisp_isp_params_v21_ops *ops = (struct rkisp_isp_params_v21_ops *)params_vdev->priv_ops; + struct rkisp_isp_params_val_v21 *priv_val = + (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; - ops->hdrmge_config(params_vdev, - ¶ms_vdev->last_hdrmge, RKISP_PARAMS_SHD); + ops->hdrmge_config(params_vdev, &priv_val->last_hdrmge, RKISP_PARAMS_SHD); - ops->hdrdrc_config(params_vdev, - ¶ms_vdev->last_hdrdrc, RKISP_PARAMS_SHD); + ops->hdrdrc_config(params_vdev, &priv_val->last_hdrdrc, RKISP_PARAMS_SHD); } static void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev) { - isp_lsc_matrix_cfg_sram(params_vdev, - ¶ms_vdev->cur_lsccfg, true); + struct rkisp_isp_params_val_v21 *priv_val = + (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + + isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true); } static void @@ -3777,10 +3747,10 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) ISP2X_SYS_BIGMODE_MANUAL | ISP2X_SYS_BIGMODE_FORCEEN, false); } - params_vdev->cur_hdrmge = params_vdev->isp21_params->others.hdrmge_cfg; - params_vdev->cur_hdrdrc = params_vdev->isp21_params->others.drc_cfg; - params_vdev->last_hdrmge = params_vdev->cur_hdrmge; - params_vdev->last_hdrdrc = params_vdev->cur_hdrdrc; + priv_val->cur_hdrmge = params_vdev->isp21_params->others.hdrmge_cfg; + priv_val->cur_hdrdrc = params_vdev->isp21_params->others.drc_cfg; + priv_val->last_hdrmge = priv_val->cur_hdrmge; + priv_val->last_hdrdrc = priv_val->cur_hdrdrc; spin_unlock(¶ms_vdev->config_lock); } @@ -3875,9 +3845,10 @@ rkisp_get_param_size_v2x(struct rkisp_isp_params_vdev *params_vdev, static void rkisp_params_get_ldchbuf_inf_v2x(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_info *ldchbuf) + void *buf) { struct rkisp_isp_params_val_v21 *priv_val; + struct rkisp_ldchbuf_info *ldchbuf = buf; int i; priv_val = params_vdev->priv_val; @@ -3889,8 +3860,10 @@ rkisp_params_get_ldchbuf_inf_v2x(struct rkisp_isp_params_vdev *params_vdev, static void rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_size *ldchsize) + void *size) { + struct rkisp_ldchbuf_size *ldchsize = size; + rkisp_deinit_ldch_buf(params_vdev); rkisp_init_ldch_buf(params_vdev, ldchsize); } @@ -4024,10 +3997,13 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, __isp_config_hdrshd(params_vdev); if (type != RKISP_PARAMS_IMD) { - params_vdev->last_hdrmge = params_vdev->cur_hdrmge; - params_vdev->last_hdrdrc = params_vdev->cur_hdrdrc; - params_vdev->cur_hdrmge = new_params->others.hdrmge_cfg; - params_vdev->cur_hdrdrc = new_params->others.drc_cfg; + struct rkisp_isp_params_val_v21 *priv_val = + (struct rkisp_isp_params_val_v21 *)params_vdev->priv_val; + + priv_val->last_hdrmge = priv_val->cur_hdrmge; + priv_val->last_hdrdrc = priv_val->cur_hdrdrc; + priv_val->cur_hdrmge = new_params->others.hdrmge_cfg; + priv_val->cur_hdrdrc = new_params->others.drc_cfg; vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); cur_buf = NULL; } @@ -4096,8 +4072,8 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .isr_hdl = rkisp_params_isr_v2x, .param_cfg = rkisp_params_cfg_v2x, .param_cfgsram = rkisp_params_cfgsram_v2x, - .get_ldchbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, - .set_ldchbuf_size = rkisp_params_set_ldchbuf_size_v2x, + .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, + .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x, .stream_stop = rkisp_params_stream_stop_v2x, .fop_release = rkisp_params_fop_release_v2x, }; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v21.h b/drivers/media/platform/rockchip/isp/isp_params_v21.h index 35c214c6740e..65262efe9bee 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v21.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v21.h @@ -8,174 +8,7 @@ #include #include "common.h" #include "isp_params.h" - -#define ISP2X_YUVAE_ENA BIT(0) -#define ISP2X_YUVAE_WNDNUM_SET BIT(1) -#define ISP2X_YUVAE_SUBWIN1_EN BIT(4) -#define ISP2X_YUVAE_SUBWIN2_EN BIT(5) -#define ISP2X_YUVAE_SUBWIN3_EN BIT(6) -#define ISP2X_YUVAE_SUBWIN4_EN BIT(7) -#define ISP2X_YUVAE_YSEL BIT(16) -#define ISP2X_YUVAE_H_OFFSET_SET(x) ((x) & 0x1FFF) -#define ISP2X_YUVAE_V_OFFSET_SET(x) (((x) & 0x1FFF) << 16) -#define ISP2X_YUVAE_H_SIZE_SET(x) ((x) & 0x7FF) -#define ISP2X_YUVAE_V_SIZE_SET(x) (((x) & 0x7FF) << 16) -#define ISP2X_YUVAE_SUBWIN_H_OFFSET_SET(x) ((x) & 0x1FFF) -#define ISP2X_YUVAE_SUBWIN_V_OFFSET_SET(x) (((x) & 0x1FFF) << 16) -#define ISP2X_YUVAE_SUBWIN_H_SIZE_SET(x) ((x) & 0x1FFF) -#define ISP2X_YUVAE_SUBWIN_V_SIZE_SET(x) (((x) & 0x1FFF) << 16) - -#define ISP2X_RAWAE_LITE_ENA BIT(0) -#define ISP2X_RAWAE_LITE_WNDNUM_SET(x) (((x) & 0x1) << 1) -#define ISP2X_RAWAE_LITE_H_OFFSET_SET(x) ((x) & 0x1FFF) -#define ISP2X_RAWAE_LITE_V_OFFSET_SET(x) (((x) & 0x1FFF) << 16) -#define ISP2X_RAWAE_LITE_H_SIZE_SET(x) ((x) & 0x1FFF) -#define ISP2X_RAWAE_LITE_V_SIZE_SET(x) (((x) & 0x1FFF) << 16) - -#define ISP2X_RAWAEBIG_ENA BIT(0) -#define ISP2X_RAWAEBIG_WNDNUM_SET(x) (((x) & 0x3) << 1) -#define ISP2X_RAWAEBIG_SUBWIN1_EN BIT(4) -#define ISP2X_RAWAEBIG_SUBWIN2_EN BIT(5) -#define ISP2X_RAWAEBIG_SUBWIN3_EN BIT(6) -#define ISP2X_RAWAEBIG_SUBWIN4_EN BIT(7) -#define ISP2X_RAWAEBIG_H_OFFSET_SET(x) ((x) & 0x1FFF) -#define ISP2X_RAWAEBIG_V_OFFSET_SET(x) (((x) & 0x1FFF) << 16) -#define ISP2X_RAWAEBIG_H_SIZE_SET(x) ((x) & 0x7FF) -#define ISP2X_RAWAEBIG_V_SIZE_SET(x) (((x) & 0x7FF) << 16) -#define ISP2X_RAWAEBIG_SUBWIN_H_OFFSET_SET(x) ((x) & 0x1FFF) -#define ISP2X_RAWAEBIG_SUBWIN_V_OFFSET_SET(x) (((x) & 0x1FFF) << 16) -#define ISP2X_RAWAEBIG_SUBWIN_H_SIZE_SET(x) ((x) & 0x1FFF) -#define ISP2X_RAWAEBIG_SUBWIN_V_SIZE_SET(x) (((x) & 0x1FFF) << 16) - -#define ISP2X_SIAWB_YMAX_CMP_EN BIT(2) -#define ISP2X_SIAWB_RGB_MODE_EN BIT(31) -#define ISP2X_SIAWB_SET_FRAMES(x) (((x) & 0x07) << 28) -#define ISP2X_SIAWB_MODE_SET(x) ((x) << 0) - -#define ISP2X_SIAF_ENA BIT(0) -#define ISP2X_SIAF_WIN_X(x) (((x) & 0x1FFF) << 16) -#define ISP2X_SIAF_WIN_Y(x) ((x) & 0x1FFF) -#define ISP2X_SIAF_SET_SHIFT_A(x, y) (((x) & 0x7) << 16 | ((y) & 0x7) << 0) -#define ISP2X_SIAF_SET_SHIFT_B(x, y) (((x) & 0x7) << 20 | ((y) & 0x7) << 4) -#define ISP2X_SIAF_SET_SHIFT_C(x, y) (((x) & 0x7) << 24 | ((y) & 0x7) << 8) -#define ISP2X_SIAF_GET_LUM_SHIFT_A(x) (((x) & 0x70000) >> 16) -#define ISP2X_SIAF_GET_AFM_SHIFT_A(x) ((x) & 0x7) - -#define ISP2X_RAWAF_ENA BIT(0) -#define ISP2X_RAWAF_GAMMA_ENA BIT(1) -#define ISP2X_RAWAF_GAUS_ENA BIT(2) - -#define ISP2X_RAWAF_INT_LINE0_EN BIT(27) -#define ISP2X_RAWAF_INT_LINE1_EN BIT(28) -#define ISP2X_RAWAF_INT_LINE2_EN BIT(29) -#define ISP2X_RAWAF_INT_LINE3_EN BIT(30) -#define ISP2X_RAWAF_INT_LINE4_EN BIT(31) -#define ISP2X_RAWAF_INT_LINE0_NUM(x) (((x) & 0xF) << 0) -#define ISP2X_RAWAF_INT_LINE1_NUM(x) (((x) & 0xF) << 4) -#define ISP2X_RAWAF_INT_LINE2_NUM(x) (((x) & 0xF) << 8) -#define ISP2X_RAWAF_INT_LINE3_NUM(x) (((x) & 0xF) << 12) -#define ISP2X_RAWAF_INT_LINE4_NUM(x) (((x) & 0xF) << 16) - -#define ISP2X_RAWAF_THRES(x) ((x) & 0xFFFF) - -#define ISP2X_RAWAF_WIN_X(x) (((x) & 0x1FFF) << 16) -#define ISP2X_RAWAF_WIN_Y(x) ((x) & 0x1FFF) -#define ISP2X_RAWAF_SET_SHIFT_A(x, y) (((x) & 0x7) << 16 | ((y) & 0x7) << 0) -#define ISP2X_RAWAF_SET_SHIFT_B(x, y) (((x) & 0x7) << 20 | ((y) & 0x7) << 4) - -#define ISP2X_SIHST_CTRL_EN_SET(x) (((x) & 0x01) << 0) -#define ISP2X_SIHST_CTRL_EN_MASK ISP2X_SIHST_CTRL_EN_SET(0x01) -#define ISP2X_SIHST_CTRL_STEPSIZE_SET(x) (((x) & 0x7F) << 1) -#define ISP2X_SIHST_CTRL_MODE_SET(x) (((x) & 0x07) << 8) -#define ISP2X_SIHST_CTRL_MODE_MASK ISP2X_SIHST_CTRL_MODE_SET(0x07) -#define ISP2X_SIHST_CTRL_AUTOSTOP_SET(x) (((x) & 0x01) << 11) -#define ISP2X_SIHST_CTRL_WATERLINE_SET(x) (((x) & 0xFFF) << 12) -#define ISP2X_SIHST_CTRL_DATASEL_SET(x) (((x) & 0x07) << 24) -#define ISP2X_SIHST_CTRL_INTRSEL_SET(x) (((x) & 0x01) << 27) -#define ISP2X_SIHST_CTRL_INTRSEL_MASK ISP2X_SIHST_CTRL_INTRSEL_SET(0x01) -#define ISP2X_SIHST_CTRL_WNDNUM_SET(x) (((x) & 0x03) << 28) -#define ISP2X_SIHST_CTRL_WNDNUM_MASK ISP2X_SIHST_CTRL_WNDNUM_SET(0x03) - -#define ISP2X_SIHST_ROW_NUM 15 -#define ISP2X_SIHST_COLUMN_NUM 15 -#define ISP2X_SIHST_WEIGHT_REG_SIZE \ - (ISP2X_SIHST_ROW_NUM * ISP2X_SIHST_COLUMN_NUM) - -#define ISP2X_SIHST_WEIGHT_SET(v0, v1, v2, v3) \ - (((v0) & 0x3F) | (((v1) & 0x3F) << 8) |\ - (((v2) & 0x3F) << 16) |\ - (((v3) & 0x3F) << 24)) - -#define ISP2X_SIHST_OFFS_SET(v0, v1) \ - (((v0) & 0x1FFF) | (((v1) & 0x1FFF) << 16)) -#define ISP2X_SIHST_SIZE_SET(v0, v1) \ - (((v0) & 0x1FFF) | (((v1) & 0x1FFF) << 16)) - -#define ISP2X_RAWHSTBIG_CTRL_EN_SET(x) (((x) & 0x01) << 0) -#define ISP2X_RAWHSTBIG_CTRL_EN_MASK ISP2X_RAWHSTBIG_CTRL_EN_SET(0x01) -#define ISP2X_RAWHSTBIG_CTRL_STEPSIZE_SET(x) (((x) & 0x07) << 1) -#define ISP2X_RAWHSTBIG_CTRL_MODE_SET(x) (((x) & 0x07) << 8) -#define ISP2X_RAWHSTBIG_CTRL_MODE_MASK ISP2X_RAWHSTBIG_CTRL_MODE_SET(0x07) -#define ISP2X_RAWHSTBIG_CTRL_WATERLINE_SET(x) (((x) & 0xFFF) << 12) -#define ISP2X_RAWHSTBIG_CTRL_DATASEL_SET(x) (((x) & 0x07) << 24) -#define ISP2X_RAWHSTBIG_CTRL_WNDNUM_SET(x) (((x) & 0x03) << 28) -#define ISP2X_RAWHSTBIG_CTRL_WNDNUM_MASK ISP2X_RAWHSTBIG_CTRL_WNDNUM_SET(0x03) - -#define ISP2X_RAWHSTBIG_WRAM_EN BIT(31) - -#define ISP2X_RAWHSTBIG_ROW_NUM 15 -#define ISP2X_RAWHSTBIG_COLUMN_NUM 15 -#define ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE \ - (ISP2X_RAWHSTBIG_ROW_NUM * ISP2X_RAWHSTBIG_COLUMN_NUM) - -#define ISP2X_RAWHSTBIG_WEIGHT_SET(v0, v1, v2, v3, v4) \ - (((v0) & 0x3F) | (((v1) & 0x3F) << 6) |\ - (((v2) & 0x3F) << 12) |\ - (((v3) & 0x3F) << 18) |\ - (((v4) & 0x3F) << 24)) - -#define ISP2X_RAWHSTBIG_OFFS_SET(v0, v1) \ - (((v0) & 0x1FFF) | (((v1) & 0x1FFF) << 16)) -#define ISP2X_RAWHSTBIG_SIZE_SET(v0, v1) \ - (((v0) & 0x7FF) | (((v1) & 0x7FF) << 16)) - -#define ISP2X_RAWHSTLITE_CTRL_EN_SET(x) (((x) & 0x01) << 0) -#define ISP2X_RAWHSTLITE_CTRL_EN_MASK ISP2X_RAWHSTBIG_CTRL_EN_SET(0x01) -#define ISP2X_RAWHSTLITE_CTRL_STEPSIZE_SET(x) (((x) & 0x07) << 1) -#define ISP2X_RAWHSTLITE_CTRL_MODE_SET(x) (((x) & 0x07) << 8) -#define ISP2X_RAWHSTLITE_CTRL_MODE_MASK ISP2X_RAWHSTBIG_CTRL_MODE_SET(0x07) -#define ISP2X_RAWHSTLITE_CTRL_WATERLINE_SET(x) (((x) & 0xFFF) << 12) -#define ISP2X_RAWHSTLITE_CTRL_DATASEL_SET(x) (((x) & 0x07) << 24) - -#define ISP2X_RAWHSTLITE_ROW_NUM 5 -#define ISP2X_RAWHSTLITE_COLUMN_NUM 5 -#define ISP2X_RAWHSTLITE_WEIGHT_REG_SIZE \ - (ISP2X_RAWHSTLITE_ROW_NUM * ISP2X_RAWHSTLITE_COLUMN_NUM) - -#define ISP2X_RAWHSTLITE_WEIGHT_SET(v0, v1, v2, v3) \ - (((v0) & 0x3F) | (((v1) & 0x3F) << 8) |\ - (((v2) & 0x3F) << 16) |\ - (((v3) & 0x3F) << 24)) - -#define ISP2X_RAWHSTLITE_OFFS_SET(v0, v1) \ - (((v0) & 0x1FFF) | (((v1) & 0x1FFF) << 16)) -#define ISP2X_RAWHSTLITE_SIZE_SET(v0, v1) \ - (((v0) & 0x7FF) | (((v1) & 0x7FF) << 16)) - -#define ISP2X_RAWAWB_ENA BIT(0) -#define ISP2X_RAWAWB_WPTH2_SET(x) (((x) & 0x1FF) << 9) - -#define ISP2X_ISPPATH_RAWAE_SEL_SET(x) (((x) & 0x03) << 16) -#define ISP2X_ISPPATH_RAWAF_SEL_SET(x) (((x) & 0x03) << 18) -#define ISP2X_ISPPATH_RAWAWB_SEL_SET(x) (((x) & 0x03) << 20) -#define ISP2X_ISPPATH_RAWAE_SWAP_SET(x) (((x) & 0x03) << 22) - -#define RKISP_PARAM_3DLUT_BUF_NUM 2 -#define RKISP_PARAM_3DLUT_BUF_SIZE (9 * 9 * 9 * 4) - -#define RKISP_PARAM_LSC_LUT_BUF_NUM 2 -#define RKISP_PARAM_LSC_LUT_TBL_SIZE (9 * 17 * 4) -#define RKISP_PARAM_LSC_LUT_BUF_SIZE (RKISP_PARAM_LSC_LUT_TBL_SIZE * 4) +#include "isp_params_v2x.h" struct rkisp_isp_params_vdev; struct rkisp_isp_params_v21_ops { @@ -319,6 +152,12 @@ struct rkisp_isp_params_val_v21 { struct rkisp_dummy_buffer buf_3dnr; + struct isp2x_hdrmge_cfg last_hdrmge; + struct isp21_drc_cfg last_hdrdrc; + struct isp2x_hdrmge_cfg cur_hdrmge; + struct isp21_drc_cfg cur_hdrdrc; + struct isp2x_lsc_cfg cur_lsccfg; + u8 dhaz_en; u8 wdr_en; u8 tmo_en; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.c b/drivers/media/platform/rockchip/isp/isp_params_v2x.c index b663b0e78caa..907c0eec9e90 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.c +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.c @@ -23,40 +23,6 @@ #define ISP2X_REG_WR_MASK BIT(31) //disable write protect #define ISP2X_NOBIG_OVERFLOW_SIZE (2560 * 1440) -static inline void -rkisp_iowrite32(struct rkisp_isp_params_vdev *params_vdev, - u32 value, u32 addr) -{ - rkisp_write(params_vdev->dev, addr, value, false); -} - -static inline u32 -rkisp_ioread32(struct rkisp_isp_params_vdev *params_vdev, - u32 addr) -{ - return rkisp_read(params_vdev->dev, addr, false); -} - -static inline void -isp_param_set_bits(struct rkisp_isp_params_vdev *params_vdev, - u32 reg, u32 bit_mask) -{ - u32 val; - - val = rkisp_ioread32(params_vdev, reg); - rkisp_iowrite32(params_vdev, val | bit_mask, reg); -} - -static inline void -isp_param_clear_bits(struct rkisp_isp_params_vdev *params_vdev, - u32 reg, u32 bit_mask) -{ - u32 val; - - val = rkisp_ioread32(params_vdev, reg); - rkisp_iowrite32(params_vdev, val & ~bit_mask, reg); -} - static inline size_t isp_param_get_insize(struct rkisp_isp_params_vdev *params_vdev) { @@ -708,6 +674,8 @@ static void isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, const struct isp2x_lsc_cfg *arg) { + struct rkisp_isp_params_val_v2x *priv_val = + (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; struct rkisp_device *dev = params_vdev->dev; unsigned int data; u32 lsc_ctrl; @@ -755,7 +723,7 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev, isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN); } - params_vdev->cur_lsccfg = *arg; + priv_val->cur_lsccfg = *arg; } static void @@ -4036,18 +4004,20 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev) { struct rkisp_isp_params_v2x_ops *ops = (struct rkisp_isp_params_v2x_ops *)params_vdev->priv_ops; + struct rkisp_isp_params_val_v2x *priv_val = + (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; - ops->hdrmge_config(params_vdev, - ¶ms_vdev->last_hdrmge, RKISP_PARAMS_ALL); - ops->hdrtmo_config(params_vdev, - ¶ms_vdev->last_hdrtmo, RKISP_PARAMS_ALL); + ops->hdrmge_config(params_vdev, &priv_val->last_hdrmge, RKISP_PARAMS_ALL); + ops->hdrtmo_config(params_vdev, &priv_val->last_hdrtmo, RKISP_PARAMS_ALL); } static void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev) { - isp_lsc_matrix_cfg_sram(params_vdev, - ¶ms_vdev->cur_lsccfg, true); + struct rkisp_isp_params_val_v2x *priv_val = + (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + + isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true); } /* Not called when the camera active, thus not isr protection. */ @@ -4077,10 +4047,10 @@ rkisp_params_first_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev) __isp_isr_meas_en(params_vdev, params_vdev->isp2x_params, RKISP_PARAMS_ALL); params_vdev->first_cfg_params = false; - params_vdev->cur_hdrtmo = params_vdev->isp2x_params->others.hdrtmo_cfg; - params_vdev->cur_hdrmge = params_vdev->isp2x_params->others.hdrmge_cfg; - params_vdev->last_hdrtmo = params_vdev->cur_hdrtmo; - params_vdev->last_hdrmge = params_vdev->cur_hdrmge; + priv_val->cur_hdrtmo = params_vdev->isp2x_params->others.hdrtmo_cfg; + priv_val->cur_hdrmge = params_vdev->isp2x_params->others.hdrmge_cfg; + priv_val->last_hdrtmo = priv_val->cur_hdrtmo; + priv_val->last_hdrmge = priv_val->cur_hdrmge; spin_unlock(¶ms_vdev->config_lock); } @@ -4179,9 +4149,10 @@ rkisp_get_param_size_v2x(struct rkisp_isp_params_vdev *params_vdev, static void rkisp_params_get_ldchbuf_inf_v2x(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_info *ldchbuf) + void *buf) { struct rkisp_isp_params_val_v2x *priv_val; + struct rkisp_ldchbuf_info *ldchbuf = buf; int i; priv_val = params_vdev->priv_val; @@ -4193,8 +4164,10 @@ rkisp_params_get_ldchbuf_inf_v2x(struct rkisp_isp_params_vdev *params_vdev, static void rkisp_params_set_ldchbuf_size_v2x(struct rkisp_isp_params_vdev *params_vdev, - struct rkisp_ldchbuf_size *ldchsize) + void *size) { + struct rkisp_ldchbuf_size *ldchsize = size; + rkisp_deinit_ldch_buf(params_vdev); rkisp_init_ldch_buf(params_vdev, ldchsize); } @@ -4319,10 +4292,13 @@ rkisp_params_cfg_v2x(struct rkisp_isp_params_vdev *params_vdev, __isp_config_hdrshd(params_vdev); if (type != RKISP_PARAMS_IMD) { - params_vdev->last_hdrtmo = params_vdev->cur_hdrtmo; - params_vdev->last_hdrmge = params_vdev->cur_hdrmge; - params_vdev->cur_hdrtmo = new_params->others.hdrtmo_cfg; - params_vdev->cur_hdrmge = new_params->others.hdrmge_cfg; + struct rkisp_isp_params_val_v2x *priv_val = + (struct rkisp_isp_params_val_v2x *)params_vdev->priv_val; + + priv_val->last_hdrtmo = priv_val->cur_hdrtmo; + priv_val->last_hdrmge = priv_val->cur_hdrmge; + priv_val->cur_hdrtmo = new_params->others.hdrtmo_cfg; + priv_val->cur_hdrmge = new_params->others.hdrmge_cfg; vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE); cur_buf = NULL; } @@ -4377,8 +4353,8 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = { .isr_hdl = rkisp_params_isr_v2x, .param_cfg = rkisp_params_cfg_v2x, .param_cfgsram = rkisp_params_cfgsram_v2x, - .get_ldchbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, - .set_ldchbuf_size = rkisp_params_set_ldchbuf_size_v2x, + .get_meshbuf_inf = rkisp_params_get_ldchbuf_inf_v2x, + .set_meshbuf_size = rkisp_params_set_ldchbuf_size_v2x, .fop_release = rkisp_params_fop_release_v2x, }; diff --git a/drivers/media/platform/rockchip/isp/isp_params_v2x.h b/drivers/media/platform/rockchip/isp/isp_params_v2x.h index a7416f991fad..132e0b867216 100644 --- a/drivers/media/platform/rockchip/isp/isp_params_v2x.h +++ b/drivers/media/platform/rockchip/isp/isp_params_v2x.h @@ -329,6 +329,12 @@ struct rkisp_isp_params_val_v2x { struct rkisp_dummy_buffer buf_lsclut[RKISP_PARAM_LSC_LUT_BUF_NUM]; u32 buf_lsclut_idx; + struct isp2x_hdrtmo_cfg last_hdrtmo; + struct isp2x_hdrmge_cfg last_hdrmge; + struct isp2x_hdrtmo_cfg cur_hdrtmo; + struct isp2x_hdrmge_cfg cur_hdrmge; + struct isp2x_lsc_cfg cur_lsccfg; + u8 dhaz_en; u8 wdr_en; u8 tmo_en; diff --git a/drivers/media/platform/rockchip/isp/rkisp.c b/drivers/media/platform/rockchip/isp/rkisp.c index 14c2670f7bac..90ca7b4de539 100644 --- a/drivers/media/platform/rockchip/isp/rkisp.c +++ b/drivers/media/platform/rockchip/isp/rkisp.c @@ -2475,8 +2475,6 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) struct rkisp_device *isp_dev = sd_to_isp_dev(sd); struct rkisp_thunderboot_resmem *resmem; struct rkisp_thunderboot_resmem_head *head; - struct rkisp_ldchbuf_info *ldchbuf; - struct rkisp_ldchbuf_size *ldchsize; struct rkisp_thunderboot_shmem *shmem; struct isp2x_buf_idxfd *idxfd; void *resmem_va; @@ -2532,12 +2530,12 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) isp_dev->resmem_size = 0; break; case RKISP_CMD_GET_LDCHBUF_INFO: - ldchbuf = (struct rkisp_ldchbuf_info *)arg; - rkisp_params_get_ldchbuf_inf(&isp_dev->params_vdev, ldchbuf); + case RKISP_CMD_GET_MESHBUF_INFO: + rkisp_params_get_meshbuf_inf(&isp_dev->params_vdev, arg); break; case RKISP_CMD_SET_LDCHBUF_SIZE: - ldchsize = (struct rkisp_ldchbuf_size *)arg; - rkisp_params_set_ldchbuf_size(&isp_dev->params_vdev, ldchsize); + case RKISP_CMD_SET_MESHBUF_SIZE: + rkisp_params_set_meshbuf_size(&isp_dev->params_vdev, arg); break; case RKISP_CMD_GET_SHM_BUFFD: shmem = (struct rkisp_thunderboot_shmem *)arg; @@ -2563,6 +2561,8 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, struct rkisp_thunderboot_resmem resmem; struct rkisp_ldchbuf_info ldchbuf; struct rkisp_ldchbuf_size ldchsize; + struct rkisp_meshbuf_info meshbuf; + struct rkisp_meshbuf_size meshsize; struct rkisp_thunderboot_shmem shmem; struct isp2x_buf_idxfd idxfd; long ret = 0; @@ -2594,6 +2594,18 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd, return -EFAULT; ret = rkisp_ioctl(sd, cmd, &ldchsize); break; + case RKISP_CMD_GET_MESHBUF_INFO: + if (copy_from_user(&meshsize, up, sizeof(meshsize))) + return -EFAULT; + ret = rkisp_ioctl(sd, cmd, &meshbuf); + if (!ret && copy_to_user(up, &meshbuf, sizeof(meshbuf))) + ret = -EFAULT; + break; + case RKISP_CMD_SET_MESHBUF_SIZE: + if (copy_from_user(&meshsize, up, sizeof(meshsize))) + return -EFAULT; + ret = rkisp_ioctl(sd, cmd, &meshsize); + break; case RKISP_CMD_GET_SHM_BUFFD: if (copy_from_user(&shmem, up, sizeof(shmem))) return -EFAULT; diff --git a/include/uapi/linux/rkisp2-config.h b/include/uapi/linux/rkisp2-config.h index 3005af710588..68f59ef7f460 100644 --- a/include/uapi/linux/rkisp2-config.h +++ b/include/uapi/linux/rkisp2-config.h @@ -35,6 +35,12 @@ #define RKISP_CMD_GET_FBCBUF_FD \ _IOR('V', BASE_VIDIOC_PRIVATE + 7, struct isp2x_buf_idxfd) +#define RKISP_CMD_GET_MESHBUF_INFO \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct rkisp_meshbuf_info) + +#define RKISP_CMD_SET_MESHBUF_SIZE \ + _IOW('V', BASE_VIDIOC_PRIVATE + 9, struct rkisp_meshbuf_size) + /****************ISP VIDEO IOCTL******************************/ #define RKISP_CMD_GET_CSI_MEMORY_MODE \ @@ -212,6 +218,31 @@ #define ISP2X_FBCBUF_FD_NUM 64 +#define ISP2X_MESH_BUF_NUM 2 + +enum isp2x_mesh_buf_stat { + MESH_BUF_INIT = 0, + MESH_BUF_WAIT2CHIP, + MESH_BUF_CHIPINUSE, +}; + +struct rkisp_meshbuf_info { + u64 module_id; + s32 buf_fd[ISP2X_MESH_BUF_NUM]; + u32 buf_size[ISP2X_MESH_BUF_NUM]; +} __attribute__ ((packed)); + +struct rkisp_meshbuf_size { + u64 module_id; + u32 meas_width; + u32 meas_height; +} __attribute__ ((packed)); + +struct isp2x_mesh_head { + enum isp2x_mesh_buf_stat stat; + u32 data_oft; +} __attribute__ ((packed)); + /* trigger event mode * T_TRY: trigger maybe with retry * T_TRY_YES: trigger to retry