media: rockchip: isp: fix rawhist weight config error for multi deivce

rawhist weight reg will be automatically incremented by each write.

Change-Id: I531d8a03dda804039237d3400d77127b070c11e9
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-11-19 16:23:04 +08:00
committed by Tao Huang
parent 67e2b460c0
commit 043ff868f8
5 changed files with 219 additions and 162 deletions

View File

@@ -322,6 +322,10 @@ 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)
{
/* multi device to switch sram config */
if (params_vdev->dev->hw_dev->is_single)
return;
if (params_vdev->ops->param_cfgsram)
params_vdev->ops->param_cfgsram(params_vdev);
}

View File

@@ -456,18 +456,22 @@ isp_sdg_enable(struct rkisp_isp_params_vdev *params_vdev,
static void __maybe_unused
isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_lsc_cfg *pconfig, bool is_direct)
const struct isp2x_lsc_cfg *pconfig, bool is_check)
{
int i, j;
unsigned int sram_addr;
unsigned int data;
if (is_check &&
!(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN))
return;
/* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0;
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, true);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, true);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, true);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, true);
/* program data tables (table size is 9 * 17 = 153) */
for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX;
@@ -477,46 +481,34 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
* DWORDs (2nd value of last DWORD unused)
*/
for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) {
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->r_data_tbl[i + j],
pconfig->r_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j],
pconfig->r_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gr_data_tbl[i + j],
pconfig->gr_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j],
pconfig->gr_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gb_data_tbl[i + j],
pconfig->gb_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j],
pconfig->gb_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->b_data_tbl[i + j],
pconfig->b_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j],
pconfig->b_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
}
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->r_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gr_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gb_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->b_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
}
}
@@ -598,8 +590,7 @@ 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 isp21_isp_params_cfg *params_rec = params_vdev->isp21_params;
struct rkisp_device *dev = params_vdev->dev;
unsigned int data;
u32 lsc_ctrl;
@@ -607,10 +598,17 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
/* To config must be off , store the current status firstly */
lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL,
ISP_LSC_EN);
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
/* online mode lsc lut load from ddr quick for some sensor VB short
* readback mode lsc lut AHB config to sram, once for single device,
* need record to switch for multi-device.
*/
if (!IS_HDR_RDBK(dev->rd_mode))
isp_lsc_matrix_cfg_ddr(params_vdev, arg);
else if (dev->hw_dev->is_single)
isp_lsc_matrix_cfg_sram(params_vdev, arg, false);
else
params_rec->others.lsc_cfg = *arg;
for (i = 0; i < 4; i++) {
/* program x size tables */
@@ -646,8 +644,6 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
} else {
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
}
priv_val->cur_lsccfg = *arg;
}
static void
@@ -2249,37 +2245,81 @@ isp_rawhstlite_enable(struct rkisp_isp_params_vdev *params_vdev,
}
static void
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
isp_rawhstbig_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_rawhistbig_cfg *arg,
u32 blk_no, bool is_check)
{
u32 i, j;
u32 value;
u32 hist_ctrl;
u32 block_hsize, block_vsize;
u32 wnd_num_idx, hist_weight_num;
u32 i, j, wnd_num_idx, value;
u8 weight15x15[ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE];
const u32 hist_wnd_num[] = {
5, 5, 15, 15
};
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
u32 addr;
switch (blk_no) {
case 0:
addr = ISP_RAWHIST_BIG1_BASE;
break;
case 1:
addr = ISP_RAWHIST_BIG2_BASE;
break;
case 2:
addr = ISP_RAWHIST_BIG3_BASE;
break;
case 0:
default:
addr = ISP_RAWHIST_BIG1_BASE;
break;
}
value = ISP2X_RAWHSTBIG_CTRL_EN_MASK;
if (is_check &&
!(rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL) & value))
return;
wnd_num_idx = arg->wnd_num;
memset(weight15x15, 0, sizeof(weight15x15));
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
}
}
for (i = 0; i < (ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE / 5); i++) {
value = ISP2X_RAWHSTBIG_WEIGHT_SET(weight15x15[5 * i + 0],
weight15x15[5 * i + 1],
weight15x15[5 * i + 2],
weight15x15[5 * i + 3],
weight15x15[5 * i + 4]);
rkisp_write(params_vdev->dev, addr + ISP_RAWHIST_BIG_WEIGHT_BASE,
value, true);
}
}
static void
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
{
struct isp21_isp_params_cfg *params_rec = params_vdev->isp21_params;
struct rkisp_device *dev = params_vdev->dev;
struct isp2x_rawhistbig_cfg *arg_rec;
u32 hist_ctrl, block_hsize, block_vsize, wnd_num_idx;
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
u32 addr;
switch (blk_no) {
case 1:
addr = ISP_RAWHIST_BIG2_BASE;
arg_rec = &params_rec->meas.rawhist1;
break;
case 2:
addr = ISP_RAWHIST_BIG3_BASE;
arg_rec = &params_rec->meas.rawhist2;
break;
case 0:
default:
addr = ISP_RAWHIST_BIG1_BASE;
arg_rec = &params_rec->meas.rawhist3;
break;
}
wnd_num_idx = arg->wnd_num;
memset(weight15x15, 0x00, sizeof(weight15x15));
/* avoid to override the old enable value */
hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL);
hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK;
@@ -2309,25 +2349,10 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off),
addr + ISP_RAWHIST_BIG_RAW2Y_CC);
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
}
}
rkisp_iowrite32(params_vdev, ISP2X_RAWHSTBIG_WRAM_EN, ISP_RAWHIST_BIG_WRAM_CTRL);
hist_weight_num = ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE;
for (i = 0; i < (hist_weight_num / 5); i++) {
value = ISP2X_RAWHSTBIG_WEIGHT_SET(
weight15x15[5 * i + 0],
weight15x15[5 * i + 1],
weight15x15[5 * i + 2],
weight15x15[5 * i + 3],
weight15x15[5 * i + 4]);
rkisp_iowrite32(params_vdev, value,
addr + ISP_RAWHIST_BIG_WEIGHT_BASE);
}
if (dev->hw_dev->is_single)
isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false);
else
*arg_rec = *arg;
}
static void
@@ -3677,12 +3702,14 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
}
static
void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
void rkisp_params_cfgsram_v21(struct rkisp_isp_params_vdev *params_vdev)
{
struct rkisp_isp_params_val_v21 *priv_val =
(struct rkisp_isp_params_val_v21 *)params_vdev->priv_val;
struct isp21_isp_params_cfg *params = params_vdev->isp21_params;
isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true);
isp_lsc_matrix_cfg_sram(params_vdev, &params->others.lsc_cfg, true);
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist1, 1, true);
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist2, 2, true);
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist3, 0, true);
}
static void
@@ -4071,7 +4098,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
.disable_isp = rkisp_params_disable_isp_v2x,
.isr_hdl = rkisp_params_isr_v2x,
.param_cfg = rkisp_params_cfg_v2x,
.param_cfgsram = rkisp_params_cfgsram_v2x,
.param_cfgsram = rkisp_params_cfgsram_v21,
.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,

View File

@@ -156,7 +156,6 @@ struct rkisp_isp_params_val_v21 {
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;

View File

@@ -532,18 +532,22 @@ isp_sihst_enable(struct rkisp_isp_params_vdev *params_vdev,
static void __maybe_unused
isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_lsc_cfg *pconfig, bool is_direct)
const struct isp2x_lsc_cfg *pconfig, bool is_check)
{
int i, j;
unsigned int sram_addr;
unsigned int data;
if (is_check &&
!(rkisp_ioread32(params_vdev, ISP_LSC_CTRL) & ISP_LSC_EN))
return;
/* CIF_ISP_LSC_TABLE_ADDRESS_153 = ( 17 * 18 ) >> 1 */
sram_addr = CIF_ISP_LSC_TABLE_ADDRESS_0;
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, is_direct);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_ADDR, sram_addr, true);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_ADDR, sram_addr, true);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_ADDR, sram_addr, true);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_ADDR, sram_addr, true);
/* program data tables (table size is 9 * 17 = 153) */
for (i = 0; i < CIF_ISP_LSC_SECTORS_MAX * CIF_ISP_LSC_SECTORS_MAX;
@@ -553,46 +557,34 @@ isp_lsc_matrix_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
* DWORDs (2nd value of last DWORD unused)
*/
for (j = 0; j < CIF_ISP_LSC_SECTORS_MAX - 1; j += 2) {
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->r_data_tbl[i + j],
pconfig->r_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j],
pconfig->r_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gr_data_tbl[i + j],
pconfig->gr_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j],
pconfig->gr_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gb_data_tbl[i + j],
pconfig->gb_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j],
pconfig->gb_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->b_data_tbl[i + j],
pconfig->b_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j],
pconfig->b_data_tbl[i + j + 1]);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
}
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->r_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->r_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_R_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gr_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gr_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_GR_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->gb_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->gb_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_GB_TABLE_DATA, data, true);
data = ISP_ISP_LSC_TABLE_DATA(
pconfig->b_data_tbl[i + j],
0);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, is_direct);
data = ISP_ISP_LSC_TABLE_DATA(pconfig->b_data_tbl[i + j], 0);
rkisp_write(params_vdev->dev, ISP_LSC_B_TABLE_DATA, data, true);
}
}
@@ -674,8 +666,7 @@ 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 isp2x_isp_params_cfg *params_rec = params_vdev->isp2x_params;
struct rkisp_device *dev = params_vdev->dev;
unsigned int data;
u32 lsc_ctrl;
@@ -683,10 +674,17 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
/* To config must be off , store the current status firstly */
lsc_ctrl = rkisp_ioread32(params_vdev, ISP_LSC_CTRL);
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL,
ISP_LSC_EN);
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
/* online mode lsc lut load from ddr quick for some sensor VB short
* readback mode lsc lut AHB config to sram, once for single device,
* need record to switch for multi-device.
*/
if (!IS_HDR_RDBK(dev->rd_mode))
isp_lsc_matrix_cfg_ddr(params_vdev, arg);
else if (dev->hw_dev->is_single)
isp_lsc_matrix_cfg_sram(params_vdev, arg, false);
else
params_rec->others.lsc_cfg = *arg;
for (i = 0; i < 4; i++) {
/* program x size tables */
@@ -722,8 +720,6 @@ isp_lsc_config(struct rkisp_isp_params_vdev *params_vdev,
} else {
isp_param_clear_bits(params_vdev, ISP_LSC_CTRL, ISP_LSC_EN);
}
priv_val->cur_lsccfg = *arg;
}
static void
@@ -2807,37 +2803,82 @@ isp_rawhstlite_enable(struct rkisp_isp_params_vdev *params_vdev,
}
static void
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
isp_rawhstbig_cfg_sram(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_rawhistbig_cfg *arg,
u32 blk_no, bool is_check)
{
u32 i, j;
u32 value;
u32 hist_ctrl;
u32 block_hsize, block_vsize;
u32 wnd_num_idx, hist_weight_num;
u32 i, j, wnd_num_idx, value;
u8 weight15x15[ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE];
const u32 hist_wnd_num[] = {
5, 5, 15, 15
};
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
u32 addr;
switch (blk_no) {
case 0:
addr = ISP_RAWHIST_BIG1_BASE;
break;
case 1:
addr = ISP_RAWHIST_BIG2_BASE;
break;
case 2:
addr = ISP_RAWHIST_BIG3_BASE;
break;
case 0:
default:
addr = ISP_RAWHIST_BIG1_BASE;
break;
}
value = ISP2X_RAWHSTBIG_CTRL_EN_MASK;
if (is_check &&
!(rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL) & value))
return;
wnd_num_idx = arg->wnd_num;
memset(weight15x15, 0, sizeof(weight15x15));
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
}
}
for (i = 0; i < (ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE / 5); i++) {
value = ISP2X_RAWHSTBIG_WEIGHT_SET(weight15x15[5 * i + 0],
weight15x15[5 * i + 1],
weight15x15[5 * i + 2],
weight15x15[5 * i + 3],
weight15x15[5 * i + 4]);
rkisp_write(params_vdev->dev,
addr + ISP_RAWHIST_BIG_WEIGHT_BASE,
value, true);
}
}
static void
isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
const struct isp2x_rawhistbig_cfg *arg, u32 blk_no)
{
struct isp2x_isp_params_cfg *params_rec = params_vdev->isp2x_params;
struct rkisp_device *dev = params_vdev->dev;
struct isp2x_rawhistbig_cfg *arg_rec;
u32 hist_ctrl, block_hsize, block_vsize, wnd_num_idx;
const u32 hist_wnd_num[] = { 5, 5, 15, 15 };
u32 addr;
switch (blk_no) {
case 1:
addr = ISP_RAWHIST_BIG2_BASE;
arg_rec = &params_rec->meas.rawhist1;
break;
case 2:
addr = ISP_RAWHIST_BIG3_BASE;
arg_rec = &params_rec->meas.rawhist2;
break;
case 0:
default:
addr = ISP_RAWHIST_BIG1_BASE;
arg_rec = &params_rec->meas.rawhist3;
break;
}
wnd_num_idx = arg->wnd_num;
memset(weight15x15, 0x00, sizeof(weight15x15));
/* avoid to override the old enable value */
hist_ctrl = rkisp_ioread32(params_vdev, addr + ISP_RAWHIST_BIG_CTRL);
hist_ctrl &= ISP2X_RAWHSTBIG_CTRL_EN_MASK;
@@ -2867,25 +2908,10 @@ isp_rawhstbig_config(struct rkisp_isp_params_vdev *params_vdev,
ISP2X_PACK_4BYTE(arg->rcc, arg->gcc, arg->bcc, arg->off),
addr + ISP_RAWHIST_BIG_RAW2Y_CC);
for (i = 0; i < hist_wnd_num[wnd_num_idx]; i++) {
for (j = 0; j < hist_wnd_num[wnd_num_idx]; j++) {
weight15x15[i * ISP2X_RAWHSTBIG_ROW_NUM + j] =
arg->weight[i * hist_wnd_num[wnd_num_idx] + j];
}
}
rkisp_iowrite32(params_vdev, ISP2X_RAWHSTBIG_WRAM_EN, ISP_RAWHIST_BIG_WRAM_CTRL);
hist_weight_num = ISP2X_RAWHSTBIG_WEIGHT_REG_SIZE;
for (i = 0; i < (hist_weight_num / 5); i++) {
value = ISP2X_RAWHSTBIG_WEIGHT_SET(
weight15x15[5 * i + 0],
weight15x15[5 * i + 1],
weight15x15[5 * i + 2],
weight15x15[5 * i + 3],
weight15x15[5 * i + 4]);
rkisp_iowrite32(params_vdev, value,
addr + ISP_RAWHIST_BIG_WEIGHT_BASE);
}
if (dev->hw_dev->is_single)
isp_rawhstbig_cfg_sram(params_vdev, arg, blk_no, false);
else
*arg_rec = *arg;
}
static void
@@ -4014,10 +4040,12 @@ void __isp_config_hdrshd(struct rkisp_isp_params_vdev *params_vdev)
static
void rkisp_params_cfgsram_v2x(struct rkisp_isp_params_vdev *params_vdev)
{
struct rkisp_isp_params_val_v2x *priv_val =
(struct rkisp_isp_params_val_v2x *)params_vdev->priv_val;
struct isp2x_isp_params_cfg *params = params_vdev->isp2x_params;
isp_lsc_matrix_cfg_sram(params_vdev, &priv_val->cur_lsccfg, true);
isp_lsc_matrix_cfg_sram(params_vdev, &params->others.lsc_cfg, true);
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist1, 1, true);
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist2, 2, true);
isp_rawhstbig_cfg_sram(params_vdev, &params->meas.rawhist3, 0, true);
}
/* Not called when the camera active, thus not isr protection. */

View File

@@ -333,7 +333,6 @@ struct rkisp_isp_params_val_v2x {
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;