1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
3
4 #include <linux/kfifo.h>
5 #include <media/v4l2-common.h>
6 #include <media/v4l2-ioctl.h>
7 #include <media/videobuf2-core.h>
8 #include <media/videobuf2-vmalloc.h> /* for ISP statistics */
9 #include "dev.h"
10 #include "regs.h"
11 #include "common.h"
12 #include "isp_stats.h"
13 #include "isp_stats_v2x.h"
14
15 #define ISP2X_SIAWB_GET_MEAN_CR_R(x) ((x) & 0xFF)
16 #define ISP2X_SIAWB_GET_MEAN_CB_B(x) (((x) >> 8) & 0xFF)
17 #define ISP2X_SIAWB_GET_MEAN_Y_G(x) (((x) >> 16) & 0xFF)
18 #define ISP2X_SIAWB_GET_PIXEL_CNT(x) ((x) & 0x3FFFFFF)
19
20 #define ISP2X_HIST_GET_BIN0(x) ((x) & 0xFFFF)
21 #define ISP2X_HIST_GET_BIN1(x) (((x) >> 16) & 0xFFFF)
22
23 #define ISP2X_3A_MEAS_DONE BIT(31)
24
25 #define ISP2X_EXP_GET_MEAN_xy0(x) ((x) & 0xFF)
26 #define ISP2X_EXP_GET_MEAN_xy1(x) (((x) >> 8) & 0xFF)
27 #define ISP2X_EXP_GET_MEAN_xy2(x) (((x) >> 16) & 0xFF)
28 #define ISP2X_EXP_GET_MEAN_xy3(x) (((x) >> 24) & 0xFF)
29
30 #define ISP2X_RAWAEBIG_GET_MEAN_G(x) ((x) & 0xFFF)
31 #define ISP2X_RAWAEBIG_GET_MEAN_B(x) (((x) >> 12) & 0x3FF)
32 #define ISP2X_RAWAEBIG_GET_MEAN_R(x) (((x) >> 22) & 0x3FF)
33
34 #define ISP2X_RAWAF_INT_LINE0_EN BIT(27)
35
36 static void
rkisp_stats_get_siawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)37 rkisp_stats_get_siawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
38 struct rkisp_isp2x_stat_buffer *pbuf)
39 {
40 u32 reg_val;
41
42 if (!pbuf)
43 return;
44
45 pbuf->meas_type |= ISP2X_STAT_SIAWB;
46 reg_val = rkisp_read(stats_vdev->dev, CIF_ISP_AWB_WHITE_CNT_V10, true);
47 pbuf->params.siawb.awb_mean[0].cnt = ISP2X_SIAWB_GET_PIXEL_CNT(reg_val);
48 reg_val = rkisp_read(stats_vdev->dev, CIF_ISP_AWB_MEAN_V10, true);
49
50 pbuf->params.siawb.awb_mean[0].mean_cr_or_r =
51 ISP2X_SIAWB_GET_MEAN_CR_R(reg_val);
52 pbuf->params.siawb.awb_mean[0].mean_cb_or_b =
53 ISP2X_SIAWB_GET_MEAN_CB_B(reg_val);
54 pbuf->params.siawb.awb_mean[0].mean_y_or_g =
55 ISP2X_SIAWB_GET_MEAN_Y_G(reg_val);
56 }
57
58 static void
rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)59 rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
60 struct rkisp_isp2x_stat_buffer *pbuf)
61 {
62 u64 msb, lsb;
63 u32 value;
64 int i;
65
66 if (!pbuf)
67 goto out;
68
69 pbuf->meas_type |= ISP2X_STAT_RAWAWB;
70
71 for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
72 pbuf->params.rawawb.ro_rawawb_sum_r_nor[i] =
73 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_NOR_0 + 0x30 * i, true);
74 pbuf->params.rawawb.ro_rawawb_sum_g_nor[i] =
75 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_NOR_0 + 0x30 * i, true);
76 pbuf->params.rawawb.ro_rawawb_sum_b_nor[i] =
77 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_NOR_0 + 0x30 * i, true);
78 pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
79 rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NUM_NOR_0 + 0x30 * i, true);
80 pbuf->params.rawawb.ro_rawawb_sum_r_big[i] =
81 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_BIG_0 + 0x30 * i, true);
82 pbuf->params.rawawb.ro_rawawb_sum_g_big[i] =
83 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_BIG_0 + 0x30 * i, true);
84 pbuf->params.rawawb.ro_rawawb_sum_b_big[i] =
85 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_BIG_0 + 0x30 * i, true);
86 pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
87 rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NUM_BIG_0 + 0x30 * i, true);
88 pbuf->params.rawawb.ro_rawawb_sum_r_sma[i] =
89 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_SMA_0 + 0x30 * i, true);
90 pbuf->params.rawawb.ro_rawawb_sum_g_sma[i] =
91 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_SMA_0 + 0x30 * i, true);
92 pbuf->params.rawawb.ro_rawawb_sum_b_sma[i] =
93 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_SMA_0 + 0x30 * i, true);
94 pbuf->params.rawawb.ro_rawawb_wp_num_sma[i] =
95 rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NUM_SMA_0 + 0x30 * i, true);
96 }
97
98 for (i = 0; i < ISP2X_RAWAWB_MULWD_NUM; i++) {
99 pbuf->params.rawawb.ro_sum_r_nor_multiwindow[i] =
100 rkisp_read(stats_vdev->dev,
101 ISP_RAWAWB_SUM_R_NOR_MULTIWINDOW_0 + 0x30 * i, true);
102 pbuf->params.rawawb.ro_sum_g_nor_multiwindow[i] =
103 rkisp_read(stats_vdev->dev,
104 ISP_RAWAWB_SUM_G_NOR_MULTIWINDOW_0 + 0x30 * i, true);
105 pbuf->params.rawawb.ro_sum_b_nor_multiwindow[i] =
106 rkisp_read(stats_vdev->dev,
107 ISP_RAWAWB_SUM_B_NOR_MULTIWINDOW_0 + 0x30 * i, true);
108 pbuf->params.rawawb.ro_wp_nm_nor_multiwindow[i] =
109 rkisp_read(stats_vdev->dev,
110 ISP_RAWAWB_WP_NM_NOR_MULTIWINDOW_0 + 0x30 * i, true);
111 pbuf->params.rawawb.ro_sum_r_big_multiwindow[i] =
112 rkisp_read(stats_vdev->dev,
113 ISP_RAWAWB_SUM_R_BIG_MULTIWINDOW_0 + 0x30 * i, true);
114 pbuf->params.rawawb.ro_sum_g_big_multiwindow[i] =
115 rkisp_read(stats_vdev->dev,
116 ISP_RAWAWB_SUM_G_BIG_MULTIWINDOW_0 + 0x30 * i, true);
117 pbuf->params.rawawb.ro_sum_b_big_multiwindow[i] =
118 rkisp_read(stats_vdev->dev,
119 ISP_RAWAWB_SUM_B_BIG_MULTIWINDOW_0 + 0x30 * i, true);
120 pbuf->params.rawawb.ro_wp_nm_big_multiwindow[i] =
121 rkisp_read(stats_vdev->dev,
122 ISP_RAWAWB_WP_NM_BIG_MULTIWINDOW_0 + 0x30 * i, true);
123 pbuf->params.rawawb.ro_sum_r_sma_multiwindow[i] =
124 rkisp_read(stats_vdev->dev,
125 ISP_RAWAWB_SUM_R_SMA_MULTIWINDOW_0 + 0x30 * i, true);
126 pbuf->params.rawawb.ro_sum_g_sma_multiwindow[i] =
127 rkisp_read(stats_vdev->dev,
128 ISP_RAWAWB_SUM_G_SMA_MULTIWINDOW_0 + 0x30 * i, true);
129 pbuf->params.rawawb.ro_sum_b_sma_multiwindow[i] =
130 rkisp_read(stats_vdev->dev,
131 ISP_RAWAWB_SUM_B_SMA_MULTIWINDOW_0 + 0x30 * i, true);
132 pbuf->params.rawawb.ro_wp_nm_sma_multiwindow[i] =
133 rkisp_read(stats_vdev->dev,
134 ISP_RAWAWB_WP_NM_SMA_MULTIWINDOW_0 + 0x30 * i, true);
135 }
136
137 for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
138 pbuf->params.rawawb.ro_sum_r_exc[i] =
139 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_EXC_0 + 0x10 * i, true);
140 pbuf->params.rawawb.ro_sum_g_exc[i] =
141 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_EXC_0 + 0x10 * i, true);
142 pbuf->params.rawawb.ro_sum_b_exc[i] =
143 rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_EXC_0 + 0x10 * i, true);
144 pbuf->params.rawawb.ro_wp_nm_exc[i] =
145 rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NM_EXC_0 + 0x10 * i, true);
146 }
147
148 for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
149 lsb = rkisp_read(stats_vdev->dev, ISP_RAWAWB_RAM_DATA, true);
150 msb = rkisp_read(stats_vdev->dev, ISP_RAWAWB_RAM_DATA, true);
151 pbuf->params.rawawb.ramdata[i].b = lsb & 0x3FFFF;
152 pbuf->params.rawawb.ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
153 pbuf->params.rawawb.ramdata[i].r = (msb & 0x3FFFF0) >> 4;
154 pbuf->params.rawawb.ramdata[i].wp = (msb & 0xE0000000) >> 29;
155 }
156
157 out:
158 value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
159 value |= ISP2X_3A_MEAS_DONE;
160 rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true);
161 }
162
163 static void
rkisp_stats_get_siaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)164 rkisp_stats_get_siaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
165 struct rkisp_isp2x_stat_buffer *pbuf)
166 {
167 struct isp2x_siaf_stat *af;
168
169 if (!pbuf)
170 return;
171
172 pbuf->meas_type |= ISP2X_STAT_SIAF;
173
174 af = &pbuf->params.siaf;
175 af->win[0].sum = rkisp_read(stats_vdev->dev, ISP_AFM_SUM_A, true);
176 af->win[0].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_A, true);
177 af->win[1].sum = rkisp_read(stats_vdev->dev, ISP_AFM_SUM_B, true);
178 af->win[1].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_B, true);
179 af->win[2].sum = rkisp_read(stats_vdev->dev, ISP_AFM_SUM_C, true);
180 af->win[2].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_C, true);
181 }
182
183 static void
rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)184 rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
185 struct rkisp_isp2x_stat_buffer *pbuf)
186 {
187 struct isp2x_rawaf_stat *af;
188 u32 value, read_line;
189 u32 line_num[ISP2X_RAWAF_LINE_NUM + 1];
190 int i;
191
192 if (!pbuf)
193 goto out;
194
195 af = &pbuf->params.rawaf;
196 pbuf->meas_type |= ISP2X_STAT_RAWAF;
197
198 af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
199 af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
200 af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
201 af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
202 af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
203
204 memset(line_num, 0, sizeof(line_num));
205 line_num[ISP2X_RAWAF_LINE_NUM] = ISP2X_RAWAF_SUMDATA_ROW;
206 value = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_LINE, true);
207 for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
208 if (value & (ISP2X_RAWAF_INT_LINE0_EN << i)) {
209 line_num[i] = (value >> (4 * i)) & 0xF;
210 line_num[ISP2X_RAWAF_LINE_NUM] -= line_num[i];
211 }
212 }
213
214 read_line = 0;
215 for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
216 if (af->int_state & (1 << i))
217 read_line += line_num[i];
218 }
219
220 if (!read_line)
221 read_line = line_num[ISP2X_RAWAF_LINE_NUM];
222
223 for (i = 0; i < read_line * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
224 af->ramdata[i] = rkisp_read(stats_vdev->dev, ISP_RAWAF_RAM_DATA, true);
225
226 out:
227 value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
228 value |= ISP2X_3A_MEAS_DONE;
229 rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
230 rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
231 }
232
233 static void
rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)234 rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
235 struct rkisp_isp2x_stat_buffer *pbuf)
236 {
237 u32 value;
238 int i;
239
240 if (!pbuf)
241 goto out;
242
243 pbuf->meas_type |= ISP2X_STAT_YUVAE;
244 for (i = 0; i < ISP2X_YUVAE_MEAN_NUM / 4; i++) {
245 value = rkisp_read(stats_vdev->dev, ISP_YUVAE_RO_MEAN_BASE_ADDR, true);
246 pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
247 pbuf->params.yuvae.mean[4 * i + 1] = ISP2X_EXP_GET_MEAN_xy1(value);
248 pbuf->params.yuvae.mean[4 * i + 2] = ISP2X_EXP_GET_MEAN_xy2(value);
249 pbuf->params.yuvae.mean[4 * i + 3] = ISP2X_EXP_GET_MEAN_xy3(value);
250 }
251 value = rkisp_read(stats_vdev->dev, ISP_YUVAE_RO_MEAN_BASE_ADDR, true);
252 pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
253
254 for (i = 0; i < ISP2X_YUVAE_SUBWIN_NUM; i++)
255 pbuf->params.yuvae.ro_yuvae_sumy[i] =
256 rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true);
257
258 out:
259 value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
260 value |= ISP2X_3A_MEAS_DONE;
261 rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true);
262 }
263
264 static void
rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)265 rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
266 struct rkisp_isp2x_stat_buffer *pbuf)
267 {
268 u32 value;
269 int i, j;
270
271 if (!pbuf)
272 return;
273
274 pbuf->meas_type |= ISP2X_STAT_SIHST;
275 for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) {
276 for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) {
277 value = rkisp_read(stats_vdev->dev,
278 ISP_HIST_HIST_BIN + i * 0x40 + j * 4, true);
279 pbuf->params.sihst.win_stat[i].hist_bins[2 * j] =
280 ISP2X_HIST_GET_BIN0(value);
281 pbuf->params.sihst.win_stat[i].hist_bins[2 * j + 1] =
282 ISP2X_HIST_GET_BIN1(value);
283 }
284 }
285 }
286
287 static void
rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)288 rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
289 struct isp2x_rawaebig_stat *ae, u32 blk_no)
290 {
291 u32 addr, value;
292 int i;
293
294 switch (blk_no) {
295 case 0:
296 addr = RAWAE_BIG1_BASE;
297 break;
298 case 1:
299 addr = RAWAE_BIG2_BASE;
300 break;
301 case 2:
302 addr = RAWAE_BIG3_BASE;
303 break;
304 default:
305 addr = RAWAE_BIG1_BASE;
306 break;
307 }
308
309 if (!ae)
310 goto out;
311
312 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
313 ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
314
315 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
316 ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
317
318 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
319 ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
320
321 for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
322 value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_RO_MEAN_BASE_ADDR, true);
323 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
324 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
325 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
326 }
327
328 out:
329 value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
330 value |= ISP2X_3A_MEAS_DONE;
331 rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
332 }
333
334 static void
rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)335 rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
336 struct isp2x_rawhistbig_stat *hst, u32 blk_no)
337 {
338 u32 addr, value;
339 int i;
340
341 switch (blk_no) {
342 case 0:
343 addr = ISP_RAWHIST_BIG1_BASE;
344 break;
345 case 1:
346 addr = ISP_RAWHIST_BIG2_BASE;
347 break;
348 case 2:
349 addr = ISP_RAWHIST_BIG3_BASE;
350 break;
351 default:
352 addr = ISP_RAWHIST_BIG1_BASE;
353 break;
354 }
355
356 if (!hst)
357 goto out;
358
359 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
360 hst->hist_bin[i] = rkisp_read(stats_vdev->dev,
361 addr + ISP_RAWHIST_BIG_RO_BASE_BIN, true);
362
363 out:
364 value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
365 value |= ISP2X_3A_MEAS_DONE;
366 rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
367 }
368
369 static void
rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)370 rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
371 struct rkisp_isp2x_stat_buffer *pbuf)
372 {
373 if (!pbuf)
374 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1);
375 else
376 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1);
377 }
378
379 static void
rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)380 rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
381 struct rkisp_isp2x_stat_buffer *pbuf)
382 {
383 if (!pbuf)
384 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1);
385 else
386 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1);
387 }
388
389 static void
rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)390 rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
391 struct rkisp_isp2x_stat_buffer *pbuf)
392 {
393 if (!pbuf)
394 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2);
395 else
396 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae2, 2);
397 }
398
399 static void
rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)400 rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
401 struct rkisp_isp2x_stat_buffer *pbuf)
402 {
403 if (!pbuf)
404 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2);
405 else
406 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2);
407 }
408
409 static void
rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)410 rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
411 struct rkisp_isp2x_stat_buffer *pbuf)
412 {
413 if (!pbuf)
414 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0);
415 else
416 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0);
417 }
418
419 static void
rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)420 rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
421 struct rkisp_isp2x_stat_buffer *pbuf)
422 {
423 if (!pbuf)
424 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0);
425 else
426 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0);
427 }
428
429 static void
rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)430 rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
431 struct rkisp_isp2x_stat_buffer *pbuf)
432 {
433 struct isp2x_rawaelite_stat *ae;
434 u32 value;
435 int i;
436
437 if (!pbuf)
438 goto out;
439
440 ae = &pbuf->params.rawae0;
441 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
442
443 if ((value & ISP2X_3A_MEAS_DONE) == 0)
444 return;
445
446 for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
447 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_RO_MEAN + 4 * i, true);
448 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
449 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
450 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
451 }
452
453 out:
454 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
455 value |= ISP2X_3A_MEAS_DONE;
456 rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
457 }
458
459 static void
rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)460 rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
461 struct rkisp_isp2x_stat_buffer *pbuf)
462 {
463 struct isp2x_rawhistlite_stat *hst;
464 u32 value;
465 int i;
466
467 if (!pbuf)
468 goto out;
469
470 hst = &pbuf->params.rawhist0;
471 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
472 hst->hist_bin[i] = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_RO_BASE_BIN, true);
473
474 out:
475 value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
476 value |= ISP2X_3A_MEAS_DONE;
477 rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
478 }
479
480 static void
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)481 rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev,
482 struct rkisp_isp2x_stat_buffer *pbuf)
483 {
484 struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt;
485 enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
486 struct isp2x_bls_stat *bls;
487 u32 value;
488
489 if (!pbuf)
490 return;
491
492 bls = &pbuf->params.bls;
493 value = rkisp_read(stats_vdev->dev, ISP_BLS_CTRL, true);
494 if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
495 pbuf->meas_type |= ISP2X_STAT_BLS;
496
497 switch (raw_type) {
498 case RAW_BGGR:
499 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
500 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
501 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
502 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
503 break;
504 case RAW_GBRG:
505 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
506 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
507 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
508 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
509 break;
510 case RAW_GRBG:
511 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
512 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
513 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
514 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
515 break;
516 case RAW_RGGB:
517 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
518 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
519 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
520 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
521 break;
522 default:
523 break;
524 }
525 }
526 }
527
528 static void
rkisp_stats_get_tmo_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)529 rkisp_stats_get_tmo_stats(struct rkisp_isp_stats_vdev *stats_vdev,
530 struct rkisp_isp2x_stat_buffer *pbuf)
531 {
532 struct rkisp_device *dev = stats_vdev->dev;
533 struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
534 struct isp2x_hdrtmo_stat *tmo;
535 u32 value, i;
536
537 if (!pbuf || !params_vdev->hdrtmo_en)
538 return;
539
540 tmo = &pbuf->params.hdrtmo;
541 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_CTRL, true);
542 if (value & ISP_HDRTMO_EN) {
543 pbuf->meas_type |= ISP2X_STAT_HDRTMO;
544
545 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO0, true);
546 tmo->lglow = value >> 16;
547 tmo->lgmin = value & 0xFFFF;
548
549 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO1, true);
550 tmo->lghigh = value >> 16;
551 tmo->lgmax = value & 0xFFFF;
552
553 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO2, true);
554 tmo->weightkey = (value >> 16) & 0xFF;
555 tmo->lgmean = value & 0xFFFF;
556
557 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO3, true);
558 tmo->lgrange1 = value >> 16;
559 tmo->lgrange0 = value & 0xFFFF;
560
561 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO4, true);
562 tmo->palpha = (value >> 16) & 0x3FF;
563 tmo->lgavgmax = value & 0xFFFF;
564
565 value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO5, true);
566 tmo->linecnt = value & 0x1FFF;
567
568 for (i = 0; i < ISP2X_HDRTMO_MINMAX_NUM; i++)
569 tmo->min_max[i] = rkisp_read(stats_vdev->dev,
570 ISP_HDRTMO_HIST_RO0 + 4 * i, true);
571 }
572 }
573
574 static void
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)575 rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev,
576 struct rkisp_isp2x_stat_buffer *pbuf)
577 {
578 struct isp2x_dhaz_stat *dhaz;
579 u32 value, i;
580
581 if (!pbuf)
582 return;
583
584 dhaz = &pbuf->params.dhaz;
585 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_CTRL, true);
586 if (value & ISP_DHAZ_ENMUX) {
587 pbuf->meas_type |= ISP2X_STAT_DHAZ;
588
589 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD0, true);
590 dhaz->dhaz_adp_air_base = value >> 16;
591 dhaz->dhaz_adp_wt = value & 0xFFFF;
592
593 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD1, true);
594 dhaz->dhaz_adp_gratio = value >> 16;
595 dhaz->dhaz_adp_tmax = value & 0xFFFF;
596
597 for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
598 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG0 + 4 * i, true);
599 dhaz->h_r_iir[2 * i] = value & 0xFFFF;
600 dhaz->h_r_iir[2 * i + 1] = value >> 16;
601 }
602
603 for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
604 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG32 + 4 * i, true);
605 dhaz->h_g_iir[2 * i] = value & 0xFFFF;
606 dhaz->h_g_iir[2 * i + 1] = value >> 16;
607 }
608
609 for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
610 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG64 + 4 * i, true);
611 dhaz->h_b_iir[2 * i] = value & 0xFFFF;
612 dhaz->h_b_iir[2 * i + 1] = value >> 16;
613 }
614 }
615 }
616
617 static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_reg_ops_v2x = {
618 .get_siawb_meas = rkisp_stats_get_siawb_meas_reg,
619 .get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg,
620 .get_siaf_meas = rkisp_stats_get_siaf_meas_reg,
621 .get_rawaf_meas = rkisp_stats_get_rawaf_meas_reg,
622 .get_yuvae_meas = rkisp_stats_get_yuvae_meas_reg,
623 .get_sihst_meas = rkisp_stats_get_sihst_meas_reg,
624 .get_rawae0_meas = rkisp_stats_get_rawaelite_meas_reg,
625 .get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_reg,
626 .get_rawae1_meas = rkisp_stats_get_rawae1_meas_reg,
627 .get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_reg,
628 .get_rawae2_meas = rkisp_stats_get_rawae2_meas_reg,
629 .get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_reg,
630 .get_rawae3_meas = rkisp_stats_get_rawae3_meas_reg,
631 .get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_reg,
632 .get_bls_stats = rkisp_stats_get_bls_stats,
633 .get_tmo_stats = rkisp_stats_get_tmo_stats,
634 .get_dhaz_stats = rkisp_stats_get_dhaz_stats,
635 };
636
637 static void
rkisp_stats_get_siawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)638 rkisp_stats_get_siawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
639 struct rkisp_isp2x_stat_buffer *pbuf)
640 {
641 u32 reg_val;
642 u32 *ddr_addr;
643 u32 rd_buf_idx;
644
645 if (!pbuf)
646 return;
647
648 pbuf->meas_type |= ISP2X_STAT_SIAWB;
649
650 rd_buf_idx = stats_vdev->rd_buf_idx;
651 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C60;
652
653 reg_val = ddr_addr[0];
654 pbuf->params.siawb.awb_mean[0].cnt = ISP2X_SIAWB_GET_PIXEL_CNT(reg_val);
655
656 reg_val = ddr_addr[1];
657 pbuf->params.siawb.awb_mean[0].mean_cr_or_r =
658 ISP2X_SIAWB_GET_MEAN_CR_R(reg_val);
659 pbuf->params.siawb.awb_mean[0].mean_cb_or_b =
660 ISP2X_SIAWB_GET_MEAN_CB_B(reg_val);
661 pbuf->params.siawb.awb_mean[0].mean_y_or_g =
662 ISP2X_SIAWB_GET_MEAN_Y_G(reg_val);
663 }
664
665 static void
rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)666 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
667 struct rkisp_isp2x_stat_buffer *pbuf)
668 {
669 u32 value, rd_buf_idx, tmp_oft;
670 u32 *reg_addr, *raw_addr;
671 u64 msb, lsb;
672 u32 i;
673
674 if (!pbuf)
675 goto OUT;
676
677 pbuf->meas_type |= ISP2X_STAT_RAWAWB;
678
679 tmp_oft = ISP_RAWAWB_SUM_R_NOR_0;
680 rd_buf_idx = stats_vdev->rd_buf_idx;
681 raw_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2000;
682 reg_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2710;
683
684 for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
685 pbuf->params.rawawb.ro_rawawb_sum_r_nor[i] =
686 reg_addr[(ISP_RAWAWB_SUM_R_NOR_0 - tmp_oft + 0x30 * i) / 4];
687 pbuf->params.rawawb.ro_rawawb_sum_g_nor[i] =
688 reg_addr[(ISP_RAWAWB_SUM_G_NOR_0 - tmp_oft + 0x30 * i) / 4];
689 pbuf->params.rawawb.ro_rawawb_sum_b_nor[i] =
690 reg_addr[(ISP_RAWAWB_SUM_B_NOR_0 - tmp_oft + 0x30 * i) / 4];
691 pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
692 reg_addr[(ISP_RAWAWB_WP_NUM_NOR_0 - tmp_oft + 0x30 * i) / 4];
693 pbuf->params.rawawb.ro_rawawb_sum_r_big[i] =
694 reg_addr[(ISP_RAWAWB_SUM_R_BIG_0 - tmp_oft + 0x30 * i) / 4];
695 pbuf->params.rawawb.ro_rawawb_sum_g_big[i] =
696 reg_addr[(ISP_RAWAWB_SUM_G_BIG_0 - tmp_oft + 0x30 * i) / 4];
697 pbuf->params.rawawb.ro_rawawb_sum_b_big[i] =
698 reg_addr[(ISP_RAWAWB_SUM_B_BIG_0 - tmp_oft + 0x30 * i) / 4];
699 pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
700 reg_addr[(ISP_RAWAWB_WP_NUM_BIG_0 - tmp_oft + 0x30 * i) / 4];
701 pbuf->params.rawawb.ro_rawawb_sum_r_sma[i] =
702 reg_addr[(ISP_RAWAWB_SUM_R_SMA_0 - tmp_oft + 0x30 * i) / 4];
703 pbuf->params.rawawb.ro_rawawb_sum_g_sma[i] =
704 reg_addr[(ISP_RAWAWB_SUM_G_SMA_0 - tmp_oft + 0x30 * i) / 4];
705 pbuf->params.rawawb.ro_rawawb_sum_b_sma[i] =
706 reg_addr[(ISP_RAWAWB_SUM_B_SMA_0 - tmp_oft + 0x30 * i) / 4];
707 pbuf->params.rawawb.ro_rawawb_wp_num_sma[i] =
708 reg_addr[(ISP_RAWAWB_WP_NUM_SMA_0 - tmp_oft + 0x30 * i) / 4];
709 }
710
711 for (i = 0; i < ISP2X_RAWAWB_MULWD_NUM; i++) {
712 pbuf->params.rawawb.ro_sum_r_nor_multiwindow[i] =
713 reg_addr[(ISP_RAWAWB_SUM_R_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
714 pbuf->params.rawawb.ro_sum_g_nor_multiwindow[i] =
715 reg_addr[(ISP_RAWAWB_SUM_G_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
716 pbuf->params.rawawb.ro_sum_b_nor_multiwindow[i] =
717 reg_addr[(ISP_RAWAWB_SUM_B_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
718 pbuf->params.rawawb.ro_wp_nm_nor_multiwindow[i] =
719 reg_addr[(ISP_RAWAWB_WP_NM_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
720 pbuf->params.rawawb.ro_sum_r_big_multiwindow[i] =
721 reg_addr[(ISP_RAWAWB_SUM_R_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
722 pbuf->params.rawawb.ro_sum_g_big_multiwindow[i] =
723 reg_addr[(ISP_RAWAWB_SUM_G_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
724 pbuf->params.rawawb.ro_sum_b_big_multiwindow[i] =
725 reg_addr[(ISP_RAWAWB_SUM_B_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
726 pbuf->params.rawawb.ro_wp_nm_big_multiwindow[i] =
727 reg_addr[(ISP_RAWAWB_WP_NM_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
728 pbuf->params.rawawb.ro_sum_r_sma_multiwindow[i] =
729 reg_addr[(ISP_RAWAWB_SUM_R_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
730 pbuf->params.rawawb.ro_sum_g_sma_multiwindow[i] =
731 reg_addr[(ISP_RAWAWB_SUM_G_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
732 pbuf->params.rawawb.ro_sum_b_sma_multiwindow[i] =
733 reg_addr[(ISP_RAWAWB_SUM_B_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
734 pbuf->params.rawawb.ro_wp_nm_sma_multiwindow[i] =
735 reg_addr[(ISP_RAWAWB_WP_NM_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
736 }
737
738 for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
739 pbuf->params.rawawb.ro_sum_r_exc[i] =
740 reg_addr[(ISP_RAWAWB_SUM_R_EXC_0 - tmp_oft + 0x10 * i) / 4];
741 pbuf->params.rawawb.ro_sum_g_exc[i] =
742 reg_addr[(ISP_RAWAWB_SUM_G_EXC_0 - tmp_oft + 0x10 * i) / 4];
743 pbuf->params.rawawb.ro_sum_b_exc[i] =
744 reg_addr[(ISP_RAWAWB_SUM_B_EXC_0 - tmp_oft + 0x10 * i) / 4];
745 pbuf->params.rawawb.ro_wp_nm_exc[i] =
746 reg_addr[(ISP_RAWAWB_WP_NM_EXC_0 - tmp_oft + 0x10 * i) / 4];
747 }
748
749 for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM / 2; i++) {
750 lsb = raw_addr[4 * i];
751 msb = raw_addr[4 * i + 1];
752 pbuf->params.rawawb.ramdata[2 * i].b = lsb & 0x3FFFF;
753 pbuf->params.rawawb.ramdata[2 * i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
754 pbuf->params.rawawb.ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
755 pbuf->params.rawawb.ramdata[2 * i].wp = (msb & 0x01C00000) >> 22;
756
757 lsb = ((raw_addr[4 * i + 2] & 0x3FFFFFF) << 6) | ((raw_addr[4 * i + 1] & 0xFC000000) >> 26);
758 msb = ((raw_addr[4 * i + 3] & 0x3FFFFFF) << 6) | ((raw_addr[4 * i + 2] & 0xFC000000) >> 26);
759 pbuf->params.rawawb.ramdata[2 * i + 1].b = lsb & 0x3FFFF;
760 pbuf->params.rawawb.ramdata[2 * i + 1].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
761 pbuf->params.rawawb.ramdata[2 * i + 1].r = (msb & 0x3FFFF0) >> 4;
762 pbuf->params.rawawb.ramdata[2 * i + 1].wp = (msb & 0x01C00000) >> 22;
763 }
764
765 lsb = raw_addr[4 * i];
766 msb = raw_addr[4 * i + 1];
767 pbuf->params.rawawb.ramdata[2 * i].b = lsb & 0x3FFFF;
768 pbuf->params.rawawb.ramdata[2 * i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
769 pbuf->params.rawawb.ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
770 pbuf->params.rawawb.ramdata[2 * i].wp = (msb & 0x01C00000) >> 22;
771
772 OUT:
773 value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
774 value |= ISP2X_3A_MEAS_DONE;
775 rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true);
776 }
777
778 static void
rkisp_stats_get_siaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)779 rkisp_stats_get_siaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
780 struct rkisp_isp2x_stat_buffer *pbuf)
781 {
782 struct isp2x_siaf_stat *af;
783 u32 *ddr_addr;
784 u32 rd_buf_idx;
785
786 if (!pbuf)
787 return;
788
789 pbuf->meas_type |= ISP2X_STAT_SIAF;
790
791 af = &pbuf->params.siaf;
792 rd_buf_idx = stats_vdev->rd_buf_idx;
793 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C40;
794 af->win[0].sum = ddr_addr[0];
795 af->win[0].lum = ddr_addr[4];
796 af->win[1].sum = ddr_addr[1];
797 af->win[1].lum = ddr_addr[5];
798 af->win[2].sum = ddr_addr[2];
799 af->win[2].lum = ddr_addr[6];
800 }
801
802 static void
rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)803 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
804 struct rkisp_isp2x_stat_buffer *pbuf)
805 {
806 u32 *ddr_addr;
807 struct isp2x_rawaf_stat *af;
808 u32 value, rd_buf_idx;
809 int i;
810
811 if (!pbuf)
812 goto OUT;
813
814 af = &pbuf->params.rawaf;
815 pbuf->meas_type |= ISP2X_STAT_RAWAF;
816
817 rd_buf_idx = stats_vdev->rd_buf_idx;
818 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x1C00;
819
820 af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
821 af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
822 af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
823 af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
824 af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
825
826 for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
827 af->ramdata[i] = ddr_addr[i];
828
829 OUT:
830 value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
831 value |= ISP2X_3A_MEAS_DONE;
832 rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
833 rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
834 }
835
836 static void
rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)837 rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
838 struct rkisp_isp2x_stat_buffer *pbuf)
839 {
840 u32 *ddr_addr;
841 u32 value, rd_buf_idx;
842 int i;
843
844 if (!pbuf)
845 goto OUT;
846
847 pbuf->meas_type |= ISP2X_STAT_YUVAE;
848
849 rd_buf_idx = stats_vdev->rd_buf_idx;
850 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2B00;
851 for (i = 0; i < ISP2X_YUVAE_MEAN_NUM / 4; i++) {
852 value = ddr_addr[i];
853 pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
854 pbuf->params.yuvae.mean[4 * i + 1] = ISP2X_EXP_GET_MEAN_xy1(value);
855 pbuf->params.yuvae.mean[4 * i + 2] = ISP2X_EXP_GET_MEAN_xy2(value);
856 pbuf->params.yuvae.mean[4 * i + 3] = ISP2X_EXP_GET_MEAN_xy3(value);
857 }
858 value = ddr_addr[i];
859 pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
860
861 for (i = 0; i < ISP2X_YUVAE_SUBWIN_NUM; i++)
862 pbuf->params.yuvae.ro_yuvae_sumy[i] =
863 rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true);
864
865 OUT:
866 value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
867 value |= ISP2X_3A_MEAS_DONE;
868 rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true);
869 }
870
871 static void
rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)872 rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
873 struct rkisp_isp2x_stat_buffer *pbuf)
874 {
875 u32 *ddr_addr;
876 u32 rd_buf_idx;
877 u32 value;
878 int i, j;
879
880 if (!pbuf)
881 return;
882
883 pbuf->meas_type |= ISP2X_STAT_SIHST;
884
885 rd_buf_idx = stats_vdev->rd_buf_idx;
886 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C00;
887 for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) {
888 ddr_addr += i * 0x40;
889 for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) {
890 value = ddr_addr[j];
891 pbuf->params.sihst.win_stat[i].hist_bins[2 * j] =
892 ISP2X_HIST_GET_BIN0(value);
893 pbuf->params.sihst.win_stat[i].hist_bins[2 * j + 1] =
894 ISP2X_HIST_GET_BIN1(value);
895 }
896 }
897 }
898
899 static void
rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)900 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
901 struct isp2x_rawaebig_stat *ae, u32 blk_no)
902 {
903 u32 *ddr_addr;
904 u32 value, rd_buf_idx;
905 u32 addr;
906 int i;
907
908 rd_buf_idx = stats_vdev->rd_buf_idx;
909 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr;
910
911 switch (blk_no) {
912 case 1:
913 addr = RAWAE_BIG2_BASE;
914 ddr_addr += 0x0390 >> 2;
915 break;
916 case 2:
917 addr = RAWAE_BIG3_BASE;
918 ddr_addr += 0x0720 >> 2;
919 break;
920 default:
921 addr = RAWAE_BIG1_BASE;
922 break;
923 }
924
925 if (!ae)
926 goto OUT;
927
928 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
929 ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
930
931 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
932 ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
933
934 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
935 ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
936
937 for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
938 value = ddr_addr[i];
939 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
940 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
941 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
942 }
943
944 OUT:
945 value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
946 value |= ISP2X_3A_MEAS_DONE;
947 rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
948 }
949
950 static void
rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)951 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
952 struct isp2x_rawhistbig_stat *hst, u32 blk_no)
953 {
954 u32 *ddr_addr;
955 u32 value, rd_buf_idx;
956 u32 addr;
957 int i;
958
959 rd_buf_idx = stats_vdev->rd_buf_idx;
960 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00;
961
962 switch (blk_no) {
963 case 1:
964 addr = ISP_RAWHIST_BIG2_BASE;
965 ddr_addr += 0x0800 >> 2;
966 break;
967 case 2:
968 addr = ISP_RAWHIST_BIG3_BASE;
969 ddr_addr += 0x0C00 >> 2;
970 break;
971 default:
972 addr = ISP_RAWHIST_BIG1_BASE;
973 break;
974 }
975
976 if (!hst)
977 goto OUT;
978
979 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
980 hst->hist_bin[i] = ddr_addr[i];
981
982 OUT:
983 value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
984 value |= ISP2X_3A_MEAS_DONE;
985 rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
986 }
987
988 static void
rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)989 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
990 struct rkisp_isp2x_stat_buffer *pbuf)
991 {
992 if (!pbuf)
993 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
994 else
995 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
996 }
997
998 static void
rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)999 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1000 struct rkisp_isp2x_stat_buffer *pbuf)
1001 {
1002 if (!pbuf)
1003 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
1004 else
1005 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
1006 }
1007
1008 static void
rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1009 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1010 struct rkisp_isp2x_stat_buffer *pbuf)
1011 {
1012 if (!pbuf)
1013 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
1014 else
1015 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
1016 }
1017
1018 static void
rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1019 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1020 struct rkisp_isp2x_stat_buffer *pbuf)
1021 {
1022 if (!pbuf)
1023 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
1024 else
1025 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
1026 }
1027
1028 static void
rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1029 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1030 struct rkisp_isp2x_stat_buffer *pbuf)
1031 {
1032 if (!pbuf)
1033 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
1034 else
1035 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
1036 }
1037
1038 static void
rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1039 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1040 struct rkisp_isp2x_stat_buffer *pbuf)
1041 {
1042 if (!pbuf)
1043 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
1044 else
1045 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
1046 }
1047
1048 static void
rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1049 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1050 struct rkisp_isp2x_stat_buffer *pbuf)
1051 {
1052 struct isp2x_rawaelite_stat *ae;
1053 u32 *ddr_addr;
1054 u32 value, rd_buf_idx;
1055 int i;
1056
1057 if (!pbuf)
1058 goto OUT;
1059
1060 ae = &pbuf->params.rawae0;
1061 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
1062 if ((value & ISP2X_3A_MEAS_DONE) == 0)
1063 return;
1064
1065 rd_buf_idx = stats_vdev->rd_buf_idx;
1066 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0;
1067 for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
1068 value = ddr_addr[i];
1069 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
1070 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
1071 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
1072 }
1073
1074 OUT:
1075 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
1076 value |= ISP2X_3A_MEAS_DONE;
1077 rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
1078 }
1079
1080 static void
rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1081 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1082 struct rkisp_isp2x_stat_buffer *pbuf)
1083 {
1084 struct isp2x_rawhistlite_stat *hst;
1085 u32 *ddr_addr;
1086 u32 value, rd_buf_idx;
1087 int i;
1088
1089 if (!pbuf)
1090 goto OUT;
1091
1092 hst = &pbuf->params.rawhist0;
1093
1094 rd_buf_idx = stats_vdev->rd_buf_idx;
1095 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00 + 0x0400;
1096
1097 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
1098 hst->hist_bin[i] = ddr_addr[i];
1099
1100 OUT:
1101 value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
1102 value |= ISP2X_3A_MEAS_DONE;
1103 rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
1104 }
1105
1106 static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_ddr_ops_v2x = {
1107 .get_siawb_meas = rkisp_stats_get_siawb_meas_ddr,
1108 .get_rawawb_meas = rkisp_stats_get_rawawb_meas_ddr,
1109 .get_siaf_meas = rkisp_stats_get_siaf_meas_ddr,
1110 .get_rawaf_meas = rkisp_stats_get_rawaf_meas_ddr,
1111 .get_yuvae_meas = rkisp_stats_get_yuvae_meas_ddr,
1112 .get_sihst_meas = rkisp_stats_get_sihst_meas_ddr,
1113 .get_rawae0_meas = rkisp_stats_get_rawaelite_meas_ddr,
1114 .get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_ddr,
1115 .get_rawae1_meas = rkisp_stats_get_rawae1_meas_ddr,
1116 .get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_ddr,
1117 .get_rawae2_meas = rkisp_stats_get_rawae2_meas_ddr,
1118 .get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_ddr,
1119 .get_rawae3_meas = rkisp_stats_get_rawae3_meas_ddr,
1120 .get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_ddr,
1121 .get_bls_stats = rkisp_stats_get_bls_stats,
1122 .get_tmo_stats = rkisp_stats_get_tmo_stats,
1123 .get_dhaz_stats = rkisp_stats_get_dhaz_stats,
1124 };
1125
1126 static void
rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)1127 rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
1128 struct rkisp_isp_readout_work *meas_work)
1129 {
1130 unsigned int cur_frame_id = -1;
1131 struct rkisp_isp2x_stat_buffer *cur_stat_buf = NULL;
1132 struct rkisp_buffer *cur_buf = NULL;
1133 struct rkisp_stats_v2x_ops *ops =
1134 (struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops;
1135
1136 cur_frame_id = meas_work->frame_id;
1137 spin_lock(&stats_vdev->rd_lock);
1138 /* get one empty buffer */
1139 if (!list_empty(&stats_vdev->stat)) {
1140 cur_buf = list_first_entry(&stats_vdev->stat,
1141 struct rkisp_buffer, queue);
1142 list_del(&cur_buf->queue);
1143 }
1144 spin_unlock(&stats_vdev->rd_lock);
1145
1146 if (cur_buf) {
1147 cur_stat_buf =
1148 (struct rkisp_isp2x_stat_buffer *)(cur_buf->vaddr[0]);
1149 cur_stat_buf->frame_id = cur_frame_id;
1150 }
1151
1152 if (meas_work->isp_ris & ISP2X_SIAWB_DONE) {
1153 ops->get_siawb_meas(stats_vdev, cur_stat_buf);
1154
1155 if (cur_stat_buf)
1156 cur_stat_buf->meas_type |= ISP2X_STAT_SIAWB;
1157 }
1158
1159 if (meas_work->isp_ris & ISP2X_SIAF_FIN) {
1160 ops->get_siaf_meas(stats_vdev, cur_stat_buf);
1161 if (cur_stat_buf)
1162 cur_stat_buf->meas_type |= ISP2X_STAT_SIAF;
1163 }
1164
1165 if (meas_work->isp_ris & ISP2X_AFM_SUM_OF)
1166 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1167 "ISP2X_AFM_SUM_OF\n");
1168
1169 if (meas_work->isp_ris & ISP2X_AFM_LUM_OF)
1170 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1171 "ISP2X_AFM_LUM_OF\n");
1172
1173 if (meas_work->isp_ris & ISP2X_YUVAE_END) {
1174 ops->get_yuvae_meas(stats_vdev, cur_stat_buf);
1175 if (cur_stat_buf)
1176 cur_stat_buf->meas_type |= ISP2X_STAT_YUVAE;
1177 }
1178
1179 if (meas_work->isp_ris & ISP2X_SIHST_RDY) {
1180 ops->get_sihst_meas(stats_vdev, cur_stat_buf);
1181 if (cur_stat_buf)
1182 cur_stat_buf->meas_type |= ISP2X_STAT_SIHST;
1183 }
1184
1185 if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB) {
1186 ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
1187 if (cur_stat_buf)
1188 cur_stat_buf->meas_type |= ISP2X_STAT_RAWAWB;
1189 }
1190
1191 if (meas_work->isp3a_ris & ISP2X_3A_RAWAF) {
1192 ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
1193 if (cur_stat_buf)
1194 cur_stat_buf->meas_type |= ISP2X_STAT_RAWAF;
1195 }
1196
1197 if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_SUM)
1198 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1199 "ISP2X_3A_RAWAF_SUM\n");
1200
1201 if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_LUM)
1202 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1203 "ISP2X_3A_RAWAF_LUM\n");
1204
1205 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG) {
1206 ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
1207 if (cur_stat_buf)
1208 cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE3;
1209 }
1210
1211 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG) {
1212 ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
1213 if (cur_stat_buf)
1214 cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST3;
1215 }
1216
1217 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0) {
1218 ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
1219 if (cur_stat_buf)
1220 cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE0;
1221 }
1222
1223 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1) {
1224 ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
1225 if (cur_stat_buf)
1226 cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE1;
1227 }
1228
1229 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2) {
1230 ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
1231 if (cur_stat_buf)
1232 cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE2;
1233 }
1234
1235 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0) {
1236 ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
1237 if (cur_stat_buf)
1238 cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST0;
1239 }
1240
1241 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1) {
1242 ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
1243 if (cur_stat_buf)
1244 cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST1;
1245 }
1246
1247 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2) {
1248 ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
1249 if (cur_stat_buf)
1250 cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST2;
1251 }
1252
1253 if (meas_work->isp_ris & ISP2X_FRAME) {
1254 ops->get_bls_stats(stats_vdev, cur_stat_buf);
1255 ops->get_tmo_stats(stats_vdev, cur_stat_buf);
1256 ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
1257 }
1258
1259 if (cur_buf) {
1260 bool reg_withstream = false;
1261 struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd);
1262
1263 vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
1264 sizeof(struct rkisp_isp2x_stat_buffer));
1265 cur_buf->vb.sequence = cur_frame_id;
1266 cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
1267 v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_GET_REG_WITHSTREAM, ®_withstream);
1268 if (reg_withstream) {
1269 struct rkisp_isp2x_stat_buffer *tmp_statsbuf;
1270
1271 tmp_statsbuf = (struct rkisp_isp2x_stat_buffer *)stats_vdev->tmp_statsbuf.vaddr;
1272 if (tmp_statsbuf)
1273 memcpy(tmp_statsbuf, cur_stat_buf, sizeof(*cur_stat_buf));
1274 }
1275 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1276 }
1277 }
1278
1279 static void
rkisp_stats_clr_3a_isr(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1280 rkisp_stats_clr_3a_isr(struct rkisp_isp_stats_vdev *stats_vdev,
1281 u32 isp_ris, u32 isp3a_ris)
1282 {
1283 struct rkisp_stats_v2x_ops *ops =
1284 (struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops;
1285
1286 if (isp_ris & ISP2X_SIAWB_DONE)
1287 ops->get_siawb_meas(stats_vdev, NULL);
1288
1289 if (isp_ris & ISP2X_SIAF_FIN)
1290 ops->get_siaf_meas(stats_vdev, NULL);
1291
1292 if (isp_ris & ISP2X_YUVAE_END)
1293 ops->get_yuvae_meas(stats_vdev, NULL);
1294
1295 if (isp_ris & ISP2X_SIHST_RDY)
1296 ops->get_sihst_meas(stats_vdev, NULL);
1297
1298 if (isp3a_ris & ISP2X_3A_RAWAWB)
1299 ops->get_rawawb_meas(stats_vdev, NULL);
1300
1301 if (isp3a_ris & ISP2X_3A_RAWAF)
1302 ops->get_rawaf_meas(stats_vdev, NULL);
1303
1304 if (isp3a_ris & ISP2X_3A_RAWAE_BIG)
1305 ops->get_rawae3_meas(stats_vdev, NULL);
1306
1307 if (isp3a_ris & ISP2X_3A_RAWHIST_BIG)
1308 ops->get_rawhst3_meas(stats_vdev, NULL);
1309
1310 if (isp3a_ris & ISP2X_3A_RAWAE_CH0)
1311 ops->get_rawae0_meas(stats_vdev, NULL);
1312
1313 if (isp3a_ris & ISP2X_3A_RAWAE_CH1)
1314 ops->get_rawae1_meas(stats_vdev, NULL);
1315
1316 if (isp3a_ris & ISP2X_3A_RAWAE_CH2)
1317 ops->get_rawae2_meas(stats_vdev, NULL);
1318
1319 if (isp3a_ris & ISP2X_3A_RAWHIST_CH0)
1320 ops->get_rawhst0_meas(stats_vdev, NULL);
1321
1322 if (isp3a_ris & ISP2X_3A_RAWHIST_CH1)
1323 ops->get_rawhst1_meas(stats_vdev, NULL);
1324
1325 if (isp3a_ris & ISP2X_3A_RAWHIST_CH2)
1326 ops->get_rawhst2_meas(stats_vdev, NULL);
1327 }
1328
1329 static void
rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1330 rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
1331 u32 isp_ris, u32 isp3a_ris)
1332 {
1333 struct rkisp_device *dev = stats_vdev->dev;
1334 u32 isp_mis_tmp = 0;
1335 struct rkisp_isp_readout_work work;
1336 u32 cur_frame_id;
1337 u32 iq_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
1338 ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF;
1339 u32 iq_3a_mask = 0;
1340 u32 hdl_ris, hdl_3aris, unhdl_ris, unhdl_3aris;
1341 u32 wr_buf_idx;
1342 u32 temp_isp_ris, temp_isp3a_ris;
1343
1344 rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
1345 #ifdef LOG_ISR_EXE_TIME
1346 ktime_t in_t = ktime_get();
1347 #endif
1348 if (IS_HDR_RDBK(dev->hdr.op_mode))
1349 iq_3a_mask = ISP2X_3A_RAWAE_BIG;
1350 spin_lock(&stats_vdev->irq_lock);
1351
1352 temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true);
1353 temp_isp3a_ris = rkisp_read(stats_vdev->dev, ISP_ISP3A_RIS, true);
1354 isp_mis_tmp = isp_ris & iq_isr_mask;
1355 if (isp_mis_tmp) {
1356 rkisp_write(stats_vdev->dev, ISP_ISP_ICR, isp_mis_tmp, true);
1357
1358 isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP_MIS, true);
1359 if (isp_mis_tmp)
1360 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1361 "isp icr 3A info err: 0x%x 0x%x\n",
1362 isp_mis_tmp, isp_ris);
1363 }
1364
1365 isp_mis_tmp = isp3a_ris & iq_3a_mask;
1366 if (isp_mis_tmp) {
1367 rkisp_write(stats_vdev->dev, ISP_ISP3A_ICR, isp_mis_tmp, true);
1368
1369 isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP3A_MIS, true);
1370 if (isp_mis_tmp)
1371 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1372 "isp3A icr 3A info err: 0x%x 0x%x\n",
1373 isp_mis_tmp, isp_ris);
1374 }
1375
1376 if (!stats_vdev->streamon)
1377 goto unlock;
1378
1379 if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) {
1380 wr_buf_idx = stats_vdev->wr_buf_idx;
1381 stats_vdev->rd_buf_idx = wr_buf_idx;
1382
1383 wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
1384 stats_vdev->wr_buf_idx = wr_buf_idx;
1385 rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1386 RKISP_RD_STATS_BUF_SIZE, false);
1387 rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1388 stats_vdev->stats_buf[wr_buf_idx].dma_addr, false);
1389 rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1390 SW_3A_DDR_WRITE_EN, false);
1391 }
1392
1393 unhdl_ris = 0;
1394 unhdl_3aris = 0;
1395 if (stats_vdev->rdbk_mode) {
1396 hdl_ris = isp_ris & ~stats_vdev->isp_rdbk;
1397 hdl_3aris = isp3a_ris & ~stats_vdev->isp3a_rdbk;
1398 unhdl_ris = isp_ris & stats_vdev->isp_rdbk;
1399 unhdl_3aris = isp3a_ris & stats_vdev->isp3a_rdbk;
1400 stats_vdev->isp_rdbk |= hdl_ris;
1401 stats_vdev->isp3a_rdbk |= hdl_3aris;
1402 }
1403
1404 if (isp_ris & CIF_ISP_FRAME) {
1405 work.readout = RKISP_ISP_READOUT_MEAS;
1406 work.frame_id = cur_frame_id;
1407 work.isp_ris = temp_isp_ris | isp_ris;
1408 work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
1409 work.timestamp = ktime_get_ns();
1410
1411 if (!IS_HDR_RDBK(dev->hdr.op_mode)) {
1412 if (!kfifo_is_full(&stats_vdev->rd_kfifo))
1413 kfifo_in(&stats_vdev->rd_kfifo,
1414 &work, sizeof(work));
1415 else
1416 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1417 "stats kfifo is full\n");
1418
1419 tasklet_schedule(&stats_vdev->rd_tasklet);
1420 } else {
1421 rkisp_stats_send_meas_v2x(stats_vdev, &work);
1422 }
1423 }
1424
1425 /*
1426 * The last time that rx perform 'back read' don't clear done flag
1427 * in advance, otherwise the statistics will be abnormal.
1428 */
1429 if (!(isp3a_ris & ISP2X_3A_RAWAE_BIG) ||
1430 stats_vdev->dev->params_vdev.rdbk_times > 1)
1431 rkisp_stats_clr_3a_isr(stats_vdev, unhdl_ris, unhdl_3aris);
1432
1433 #ifdef LOG_ISR_EXE_TIME
1434 if (isp_ris & iq_isr_mask) {
1435 unsigned int diff_us =
1436 ktime_to_us(ktime_sub(ktime_get(), in_t));
1437
1438 if (diff_us > g_longest_isr_time)
1439 g_longest_isr_time = diff_us;
1440
1441 v4l2_info(stats_vdev->vnode.vdev.v4l2_dev,
1442 "isp_isr time %d %d\n", diff_us, g_longest_isr_time);
1443 }
1444 #endif
1445
1446 unlock:
1447 spin_unlock(&stats_vdev->irq_lock);
1448 }
1449
1450 static void
rkisp_stats_rdbk_enable_v2x(struct rkisp_isp_stats_vdev * stats_vdev,bool en)1451 rkisp_stats_rdbk_enable_v2x(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
1452 {
1453 if (!en) {
1454 stats_vdev->isp_rdbk = 0;
1455 stats_vdev->isp3a_rdbk = 0;
1456 }
1457
1458 stats_vdev->rdbk_mode = en;
1459 }
1460
1461 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
1462 .isr_hdl = rkisp_stats_isr_v2x,
1463 .send_meas = rkisp_stats_send_meas_v2x,
1464 .rdbk_enable = rkisp_stats_rdbk_enable_v2x,
1465 };
1466
rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev * stats_vdev)1467 void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
1468 {
1469 bool reg_withstream = false;
1470 struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd);
1471
1472 if (stats_vdev->rd_stats_from_ddr) {
1473 stats_vdev->wr_buf_idx = 0;
1474 stats_vdev->rd_buf_idx = 0;
1475
1476 rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1477 RKISP_RD_STATS_BUF_SIZE, false);
1478 rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1479 stats_vdev->stats_buf[0].dma_addr, false);
1480 rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1481 SW_3A_DDR_WRITE_EN, false);
1482 }
1483
1484 v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_GET_REG_WITHSTREAM, ®_withstream);
1485 if (reg_withstream) {
1486 stats_vdev->tmp_statsbuf.is_need_vaddr = true;
1487 stats_vdev->tmp_statsbuf.size = sizeof(struct rkisp_isp2x_stat_buffer);
1488 rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->tmp_statsbuf);
1489 }
1490 }
1491
rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev * stats_vdev)1492 void rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
1493 {
1494 stats_vdev->vdev_fmt.fmt.meta.dataformat =
1495 V4L2_META_FMT_RK_ISP1_STAT_3A;
1496 stats_vdev->vdev_fmt.fmt.meta.buffersize =
1497 sizeof(struct rkisp_isp2x_stat_buffer);
1498
1499 stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
1500 stats_vdev->priv_ops = &rkisp_stats_reg_ops_v2x;
1501
1502 #ifdef RKISP_RD_STATS_FROM_DDR
1503 {
1504 int i;
1505
1506 stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v2x;
1507 stats_vdev->rd_stats_from_ddr = true;
1508 stats_vdev->rd_buf_idx = 0;
1509 stats_vdev->wr_buf_idx = 0;
1510 for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
1511 stats_vdev->stats_buf[i].is_need_vaddr = true;
1512 stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
1513 rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1514 }
1515 }
1516 #endif
1517 }
1518
rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev * stats_vdev)1519 void rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
1520 {
1521 int i;
1522
1523 for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
1524 rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1525 }
1526