1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020 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_v21.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 int
rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)37 rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
38 struct rkisp_isp21_stat_buffer *pbuf)
39 {
40 u64 msb, lsb;
41 u32 value;
42 int i;
43
44 value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_CTRL, true);
45 if (!(value & ISP2X_3A_MEAS_DONE))
46 return -ENODATA;
47
48 if (!pbuf)
49 return 0;
50
51 pbuf->meas_type |= ISP2X_STAT_RAWAWB;
52 for (i = 0; i < ISP21_RAWAWB_HSTBIN_NUM / 2; i++) {
53 value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_Y_HIST01 + 4 * i, true);
54 pbuf->params.rawawb.ro_yhist_bin[2 * i] = value & 0xFFFF;
55 pbuf->params.rawawb.ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
56 }
57
58 for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
59 pbuf->params.rawawb.ro_rawawb_sum_rgain_nor[i] =
60 rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_RGAIN_NOR_0 + 0x30 * i, true);
61 pbuf->params.rawawb.ro_rawawb_sum_bgain_nor[i] =
62 rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_BGAIN_NOR_0 + 0x30 * i, true);
63 pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
64 rkisp_read(stats_vdev->dev, ISP21_RAWAWB_WP_NUM_NOR_0 + 0x30 * i, true);
65 pbuf->params.rawawb.ro_rawawb_sum_rgain_big[i] =
66 rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_RGAIN_BIG_0 + 0x30 * i, true);
67 pbuf->params.rawawb.ro_rawawb_sum_bgain_big[i] =
68 rkisp_read(stats_vdev->dev, ISP21_RAWAWB_SUM_BGAIN_BIG_0 + 0x30 * i, true);
69 pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
70 rkisp_read(stats_vdev->dev, ISP21_RAWAWB_WP_NUM_BIG_0 + 0x30 * i, true);
71 }
72
73 for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
74 lsb = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_RAM_DATA_BASE, true);
75 msb = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_RAM_DATA_BASE, true);
76 pbuf->params.rawawb.ramdata[i].b = lsb & 0x3FFFF;
77 pbuf->params.rawawb.ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
78 pbuf->params.rawawb.ramdata[i].r = (msb & 0x3FFFF0) >> 4;
79 pbuf->params.rawawb.ramdata[i].wp = (msb & 0xFFC00000) >> 22;
80 }
81
82 return 0;
83 }
84
85 static int
rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)86 rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
87 struct rkisp_isp21_stat_buffer *pbuf)
88 {
89 struct isp2x_rawaf_stat *af;
90 u32 value, read_line;
91 u32 line_num[ISP2X_RAWAF_LINE_NUM + 1];
92 int i;
93
94 value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
95 if (!(value & ISP2X_3A_MEAS_DONE))
96 return -ENODATA;
97
98 if (!pbuf)
99 return 0;
100
101 af = &pbuf->params.rawaf;
102 pbuf->meas_type |= ISP2X_STAT_RAWAF;
103 af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
104 af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
105 af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
106 af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
107 af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
108
109 memset(line_num, 0, sizeof(line_num));
110 line_num[ISP2X_RAWAF_LINE_NUM] = ISP2X_RAWAF_SUMDATA_ROW;
111 value = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_LINE, true);
112 for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
113 if (value & (ISP2X_RAWAF_INT_LINE0_EN << i)) {
114 line_num[i] = (value >> (4 * i)) & 0xF;
115 line_num[ISP2X_RAWAF_LINE_NUM] -= line_num[i];
116 }
117 }
118
119 read_line = 0;
120 for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
121 if (af->int_state & (1 << i))
122 read_line += line_num[i];
123 }
124
125 if (!read_line)
126 read_line = line_num[ISP2X_RAWAF_LINE_NUM];
127
128 for (i = 0; i < read_line * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
129 af->ramdata[i] = rkisp_read(stats_vdev->dev, ISP_RAWAF_RAM_DATA, true);
130
131 return 0;
132 }
133
134 static int
rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)135 rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
136 struct isp2x_rawaebig_stat *ae, u32 blk_no)
137 {
138 u32 addr, value;
139 int i;
140
141 switch (blk_no) {
142 case 0:
143 addr = RAWAE_BIG1_BASE;
144 break;
145 case 1:
146 addr = RAWAE_BIG2_BASE;
147 break;
148 case 2:
149 addr = RAWAE_BIG3_BASE;
150 break;
151 default:
152 addr = RAWAE_BIG1_BASE;
153 break;
154 }
155
156 value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
157 if (!(value & ISP2X_3A_MEAS_DONE))
158 return -ENODATA;
159
160 if (!ae)
161 return 0;
162
163 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
164 ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
165
166 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
167 ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
168
169 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
170 ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
171
172 for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
173 value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_RO_MEAN_BASE_ADDR, true);
174 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
175 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
176 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
177 }
178
179 return 0;
180 }
181
182 static int
rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)183 rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
184 struct isp2x_rawhistbig_stat *hst, u32 blk_no)
185 {
186 u32 addr, value;
187 int i;
188
189 switch (blk_no) {
190 case 0:
191 addr = ISP_RAWHIST_BIG1_BASE;
192 break;
193 case 1:
194 addr = ISP_RAWHIST_BIG2_BASE;
195 break;
196 case 2:
197 addr = ISP_RAWHIST_BIG3_BASE;
198 break;
199 default:
200 addr = ISP_RAWHIST_BIG1_BASE;
201 break;
202 }
203
204 value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
205 if (!(value & ISP2X_3A_MEAS_DONE))
206 return -ENODATA;
207
208 if (!hst)
209 return 0;
210
211 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++) {
212 hst->hist_bin[i] = rkisp_read(stats_vdev->dev,
213 addr + ISP_RAWHIST_BIG_RO_BASE_BIN, true);
214 }
215
216 return 0;
217 }
218
219 static int
rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)220 rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
221 struct rkisp_isp21_stat_buffer *pbuf)
222 {
223 int ret = 0;
224
225 if (!pbuf) {
226 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1);
227 } else {
228 ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1);
229 if (!ret)
230 pbuf->meas_type |= ISP2X_STAT_RAWAE1;
231 }
232
233 return ret;
234 }
235
236 static int
rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)237 rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
238 struct rkisp_isp21_stat_buffer *pbuf)
239 {
240 int ret = 0;
241
242 if (!pbuf) {
243 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1);
244 } else {
245 ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1);
246 if (!ret)
247 pbuf->meas_type |= ISP2X_STAT_RAWHST1;
248 }
249
250 return ret;
251 }
252
253 static int
rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)254 rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
255 struct rkisp_isp21_stat_buffer *pbuf)
256 {
257 int ret = 0;
258
259 if (!pbuf) {
260 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2);
261 } else {
262 ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae2, 2);
263 if (!ret)
264 pbuf->meas_type |= ISP2X_STAT_RAWAE2;
265 }
266
267 return ret;
268 }
269
270 static int
rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)271 rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
272 struct rkisp_isp21_stat_buffer *pbuf)
273 {
274 int ret = 0;
275
276 if (!pbuf) {
277 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2);
278 } else {
279 ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2);
280 if (!ret)
281 pbuf->meas_type |= ISP2X_STAT_RAWHST2;
282 }
283
284 return ret;
285 }
286
287 static int
rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)288 rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
289 struct rkisp_isp21_stat_buffer *pbuf)
290 {
291 int ret = 0;
292
293 if (!pbuf) {
294 rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0);
295 } else {
296 ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0);
297 if (!ret)
298 pbuf->meas_type |= ISP2X_STAT_RAWAE3;
299 }
300
301 return ret;
302 }
303
304 static int
rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)305 rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
306 struct rkisp_isp21_stat_buffer *pbuf)
307 {
308 int ret = 0;
309
310 if (!pbuf) {
311 rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0);
312 } else {
313 ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0);
314 if (!ret)
315 pbuf->meas_type |= ISP2X_STAT_RAWHST3;
316 }
317
318 return ret;
319 }
320
321 static int
rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)322 rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
323 struct rkisp_isp21_stat_buffer *pbuf)
324 {
325 struct isp2x_rawaelite_stat *ae;
326 u32 value;
327 int i;
328
329 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
330 if ((value & ISP2X_3A_MEAS_DONE) == 0)
331 return -ENODATA;
332
333 if (!pbuf)
334 return 0;
335
336 pbuf->meas_type |= ISP2X_STAT_RAWAE0;
337 ae = &pbuf->params.rawae0;
338 for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
339 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_RO_MEAN + 4 * i, true);
340 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
341 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
342 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
343 }
344
345 return 0;
346 }
347
348 static int
rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)349 rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
350 struct rkisp_isp21_stat_buffer *pbuf)
351 {
352 struct isp2x_rawhistlite_stat *hst;
353 u32 value;
354 int i;
355
356 value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
357 if ((value & ISP2X_3A_MEAS_DONE) == 0)
358 return -ENODATA;
359
360 if (!pbuf)
361 return 0;
362
363 pbuf->meas_type |= ISP2X_STAT_RAWHST0;
364 hst = &pbuf->params.rawhist0;
365 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
366 hst->hist_bin[i] = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_RO_BASE_BIN, true);
367
368 return 0;
369 }
370
371 static int
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)372 rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev,
373 struct rkisp_isp21_stat_buffer *pbuf)
374 {
375 struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt;
376 enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
377 struct isp2x_bls_stat *bls;
378 u32 value;
379
380 if (!pbuf)
381 return 0;
382
383 bls = &pbuf->params.bls;
384 value = rkisp_read(stats_vdev->dev, ISP_BLS_CTRL, true);
385 if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
386 pbuf->meas_type |= ISP2X_STAT_BLS;
387
388 switch (raw_type) {
389 case RAW_BGGR:
390 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
391 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
392 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
393 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
394 break;
395 case RAW_GBRG:
396 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
397 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
398 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
399 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
400 break;
401 case RAW_GRBG:
402 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
403 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
404 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
405 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
406 break;
407 case RAW_RGGB:
408 bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
409 bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
410 bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
411 bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
412 break;
413 default:
414 break;
415 }
416 }
417 return 0;
418 }
419
420 static int
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)421 rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev,
422 struct rkisp_isp21_stat_buffer *pbuf)
423 {
424 struct isp21_dhaz_stat *dhaz;
425 u32 value, i;
426
427 if (!pbuf)
428 return 0;
429
430 dhaz = &pbuf->params.dhaz;
431 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_CTRL, true);
432 if (value & ISP_DHAZ_ENMUX) {
433 pbuf->meas_type |= ISP2X_STAT_DHAZ;
434
435 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD0, true);
436 dhaz->dhaz_adp_air_base = value >> 16;
437 dhaz->dhaz_adp_wt = value & 0xFFFF;
438
439 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD1, true);
440 dhaz->dhaz_adp_gratio = value >> 16;
441 dhaz->dhaz_adp_tmax = value & 0xFFFF;
442
443 for (i = 0; i < ISP21_DHAZ_HIST_IIR_NUM / 2; i++) {
444 value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG0 + 4 * i, true);
445 dhaz->h_rgb_iir[2 * i] = value & 0xFFFF;
446 dhaz->h_rgb_iir[2 * i + 1] = value >> 16;
447 }
448 }
449 return 0;
450 }
451
452 static struct rkisp_stats_v21_ops __maybe_unused rkisp_stats_reg_ops_v21 = {
453 .get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg,
454 .get_rawaf_meas = rkisp_stats_get_rawaf_meas_reg,
455 .get_rawae0_meas = rkisp_stats_get_rawaelite_meas_reg,
456 .get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_reg,
457 .get_rawae1_meas = rkisp_stats_get_rawae1_meas_reg,
458 .get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_reg,
459 .get_rawae2_meas = rkisp_stats_get_rawae2_meas_reg,
460 .get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_reg,
461 .get_rawae3_meas = rkisp_stats_get_rawae3_meas_reg,
462 .get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_reg,
463 .get_bls_stats = rkisp_stats_get_bls_stats,
464 .get_dhaz_stats = rkisp_stats_get_dhaz_stats,
465 };
466
467 static int
rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)468 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
469 struct rkisp_isp21_stat_buffer *pbuf)
470 {
471 struct isp21_rawawb_meas_stat *rawawb;
472 u32 value, rd_buf_idx;
473 u32 *reg_addr, *raw_addr;
474 u64 msb, lsb;
475 u32 i;
476
477 if (!pbuf)
478 return 0;
479
480 rawawb = &pbuf->params.rawawb;
481 pbuf->meas_type |= ISP2X_STAT_RAWAWB;
482 rd_buf_idx = stats_vdev->rd_buf_idx;
483 raw_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2000;
484 reg_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2710;
485 for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
486 rawawb->ro_rawawb_sum_rgain_nor[i] =
487 reg_addr[(0x20 * i + 0x0) / 4];
488 rawawb->ro_rawawb_sum_bgain_nor[i] =
489 reg_addr[(0x20 * i + 0x4) / 4];
490 rawawb->ro_rawawb_wp_num_nor[i] =
491 reg_addr[(0x20 * i + 0x8) / 4];
492 rawawb->ro_rawawb_sum_rgain_big[i] =
493 reg_addr[(0x20 * i + 0x10) / 4];
494 rawawb->ro_rawawb_sum_bgain_big[i] =
495 reg_addr[(0x20 * i + 0x14) / 4];
496 rawawb->ro_rawawb_wp_num_big[i] =
497 reg_addr[(0x20 * i + 0x18) / 4];
498 }
499
500 for (i = 0; i < ISP21_RAWAWB_HSTBIN_NUM / 2; i++) {
501 value = reg_addr[(0x04 * i + 0xE0) / 4];
502 rawawb->ro_yhist_bin[2 * i] = value & 0xFFFF;
503 rawawb->ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
504 }
505
506 for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
507 lsb = raw_addr[2 * i];
508 msb = raw_addr[2 * i + 1];
509 rawawb->ramdata[i].b = lsb & 0x3FFFF;
510 rawawb->ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
511 rawawb->ramdata[i].r = (msb & 0x3FFFF0) >> 4;
512 rawawb->ramdata[i].wp = (msb & 0xFFC00000) >> 22;
513 }
514 return 0;
515 }
516
517 static int
rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)518 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
519 struct rkisp_isp21_stat_buffer *pbuf)
520 {
521 u32 *ddr_addr;
522 struct isp2x_rawaf_stat *af;
523 u32 i, rd_buf_idx;
524
525 if (!pbuf)
526 return 0;
527
528 af = &pbuf->params.rawaf;
529 pbuf->meas_type |= ISP2X_STAT_RAWAF;
530
531 rd_buf_idx = stats_vdev->rd_buf_idx;
532 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x1C00;
533
534 af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
535 af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
536 af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
537 af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
538 af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
539
540 for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
541 af->ramdata[i] = ddr_addr[i];
542
543 return 0;
544 }
545
546 static int
rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)547 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
548 struct isp2x_rawaebig_stat *ae, u32 blk_no)
549 {
550 u32 *ddr_addr;
551 u32 i, value, addr, rd_buf_idx;
552
553 rd_buf_idx = stats_vdev->rd_buf_idx;
554 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr;
555
556 switch (blk_no) {
557 case 1:
558 addr = RAWAE_BIG2_BASE;
559 ddr_addr += 0x0390 >> 2;
560 break;
561 case 2:
562 addr = RAWAE_BIG3_BASE;
563 ddr_addr += 0x0720 >> 2;
564 break;
565 default:
566 addr = RAWAE_BIG1_BASE;
567 break;
568 }
569
570 if (!ae)
571 return 0;
572
573 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
574 ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
575
576 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
577 ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
578
579 for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
580 ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
581
582 for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
583 value = ddr_addr[i];
584 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
585 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
586 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
587 }
588
589 return 0;
590 }
591
592 static int
rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)593 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
594 struct isp2x_rawhistbig_stat *hst, u32 blk_no)
595 {
596 u32 *ddr_addr;
597 u32 i, rd_buf_idx;
598
599 rd_buf_idx = stats_vdev->rd_buf_idx;
600 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00;
601
602 switch (blk_no) {
603 case 1:
604 ddr_addr += 0x0800 >> 2;
605 break;
606 case 2:
607 ddr_addr += 0x0C00 >> 2;
608 break;
609 default:
610 break;
611 }
612
613 if (!hst)
614 return 0;
615
616 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
617 hst->hist_bin[i] = ddr_addr[i];
618
619 return 0;
620 }
621
622 static int
rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)623 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
624 struct rkisp_isp21_stat_buffer *pbuf)
625 {
626 int ret = 0;
627
628 if (!pbuf) {
629 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
630 } else {
631 ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
632 if (!ret)
633 pbuf->meas_type |= ISP2X_STAT_RAWAE1;
634 }
635
636 return ret;
637 }
638
639 static int
rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)640 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
641 struct rkisp_isp21_stat_buffer *pbuf)
642 {
643 int ret = 0;
644
645 if (!pbuf) {
646 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
647 } else {
648 ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
649 if (!ret)
650 pbuf->meas_type |= ISP2X_STAT_RAWHST1;
651 }
652
653 return ret;
654 }
655
656 static int
rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)657 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
658 struct rkisp_isp21_stat_buffer *pbuf)
659 {
660 int ret = 0;
661
662 if (!pbuf) {
663 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
664 } else {
665 ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
666 if (!ret)
667 pbuf->meas_type |= ISP2X_STAT_RAWAE2;
668 }
669
670 return ret;
671 }
672
673 static int
rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)674 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
675 struct rkisp_isp21_stat_buffer *pbuf)
676 {
677 int ret = 0;
678
679 if (!pbuf) {
680 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
681 } else {
682 ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
683 if (!ret)
684 pbuf->meas_type |= ISP2X_STAT_RAWHST2;
685 }
686
687 return ret;
688 }
689
690 static int
rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)691 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
692 struct rkisp_isp21_stat_buffer *pbuf)
693 {
694 int ret = 0;
695
696 if (!pbuf) {
697 rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
698 } else {
699 ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
700 if (!ret)
701 pbuf->meas_type |= ISP2X_STAT_RAWAE3;
702 }
703
704 return ret;
705 }
706
707 static int
rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)708 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
709 struct rkisp_isp21_stat_buffer *pbuf)
710 {
711 int ret = 0;
712
713 if (!pbuf) {
714 rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
715 } else {
716 ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
717 if (!ret)
718 pbuf->meas_type |= ISP2X_STAT_RAWHST3;
719 }
720
721 return ret;
722 }
723
724 static int
rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)725 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
726 struct rkisp_isp21_stat_buffer *pbuf)
727 {
728 struct isp2x_rawaelite_stat *ae;
729 u32 *ddr_addr;
730 u32 i, value, rd_buf_idx;
731
732 if (!pbuf)
733 return 0;
734
735 pbuf->meas_type |= ISP2X_STAT_RAWAE0;
736 ae = &pbuf->params.rawae0;
737 rd_buf_idx = stats_vdev->rd_buf_idx;
738 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0;
739 for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
740 value = ddr_addr[i];
741 ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
742 ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
743 ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
744 }
745
746 return 0;
747 }
748
749 static int
rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp21_stat_buffer * pbuf)750 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
751 struct rkisp_isp21_stat_buffer *pbuf)
752 {
753 struct isp2x_rawhistlite_stat *hst;
754 u32 *ddr_addr, rd_buf_idx, i;
755
756 if (!pbuf)
757 return 0;
758
759 pbuf->meas_type |= ISP2X_STAT_RAWHST0;
760 hst = &pbuf->params.rawhist0;
761 rd_buf_idx = stats_vdev->rd_buf_idx;
762 ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00 + 0x0400;
763
764 for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
765 hst->hist_bin[i] = ddr_addr[i];
766
767 return 0;
768 }
769
770 static struct rkisp_stats_v21_ops __maybe_unused rkisp_stats_ddr_ops_v21 = {
771 .get_rawawb_meas = rkisp_stats_get_rawawb_meas_ddr,
772 .get_rawaf_meas = rkisp_stats_get_rawaf_meas_ddr,
773 .get_rawae0_meas = rkisp_stats_get_rawaelite_meas_ddr,
774 .get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_ddr,
775 .get_rawae1_meas = rkisp_stats_get_rawae1_meas_ddr,
776 .get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_ddr,
777 .get_rawae2_meas = rkisp_stats_get_rawae2_meas_ddr,
778 .get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_ddr,
779 .get_rawae3_meas = rkisp_stats_get_rawae3_meas_ddr,
780 .get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_ddr,
781 .get_bls_stats = rkisp_stats_get_bls_stats,
782 .get_dhaz_stats = rkisp_stats_get_dhaz_stats,
783 };
784
785 static int
rkisp_stats_restart_rawawb_meas(struct rkisp_isp_stats_vdev * stats_vdev)786 rkisp_stats_restart_rawawb_meas(struct rkisp_isp_stats_vdev *stats_vdev)
787 {
788 u32 value;
789
790 value = rkisp_read(stats_vdev->dev, ISP21_RAWAWB_CTRL, true);
791 if (value & ISP2X_3A_MEAS_DONE)
792 rkisp_write(stats_vdev->dev, ISP21_RAWAWB_CTRL, value, true);
793 return 0;
794 }
795
796 static int
rkisp_stats_restart_rawaf_meas(struct rkisp_isp_stats_vdev * stats_vdev)797 rkisp_stats_restart_rawaf_meas(struct rkisp_isp_stats_vdev *stats_vdev)
798 {
799 u32 value;
800
801 value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
802 if (value & ISP2X_3A_MEAS_DONE) {
803 rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
804 rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
805 }
806 return 0;
807 }
808
809 static int
rkisp_stats_restart_rawaebig_meas(struct rkisp_isp_stats_vdev * stats_vdev,u32 blk_no)810 rkisp_stats_restart_rawaebig_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 blk_no)
811 {
812 u32 addr, value;
813
814 switch (blk_no) {
815 case 0:
816 addr = RAWAE_BIG1_BASE;
817 break;
818 case 1:
819 addr = RAWAE_BIG2_BASE;
820 break;
821 case 2:
822 addr = RAWAE_BIG3_BASE;
823 break;
824 default:
825 addr = RAWAE_BIG1_BASE;
826 break;
827 }
828
829 value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
830 if (value & ISP2X_3A_MEAS_DONE)
831 rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
832 return 0;
833 }
834
835 static int
rkisp_stats_restart_rawhstbig_meas(struct rkisp_isp_stats_vdev * stats_vdev,u32 blk_no)836 rkisp_stats_restart_rawhstbig_meas(struct rkisp_isp_stats_vdev *stats_vdev, u32 blk_no)
837 {
838 u32 addr, value;
839
840 switch (blk_no) {
841 case 0:
842 addr = ISP_RAWHIST_BIG1_BASE;
843 break;
844 case 1:
845 addr = ISP_RAWHIST_BIG2_BASE;
846 break;
847 case 2:
848 addr = ISP_RAWHIST_BIG3_BASE;
849 break;
850 default:
851 addr = ISP_RAWHIST_BIG1_BASE;
852 break;
853 }
854
855 value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
856 if (value & ISP2X_3A_MEAS_DONE)
857 rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
858 return 0;
859 }
860
861 static int
rkisp_stats_restart_rawae1_meas(struct rkisp_isp_stats_vdev * stats_vdev)862 rkisp_stats_restart_rawae1_meas(struct rkisp_isp_stats_vdev *stats_vdev)
863 {
864 return rkisp_stats_restart_rawaebig_meas(stats_vdev, 1);
865 }
866
867 static int
rkisp_stats_restart_rawhst1_meas(struct rkisp_isp_stats_vdev * stats_vdev)868 rkisp_stats_restart_rawhst1_meas(struct rkisp_isp_stats_vdev *stats_vdev)
869 {
870 return rkisp_stats_restart_rawhstbig_meas(stats_vdev, 1);
871 }
872
873 static int
rkisp_stats_restart_rawae2_meas(struct rkisp_isp_stats_vdev * stats_vdev)874 rkisp_stats_restart_rawae2_meas(struct rkisp_isp_stats_vdev *stats_vdev)
875 {
876 return rkisp_stats_restart_rawaebig_meas(stats_vdev, 2);
877 }
878
879 static int
rkisp_stats_restart_rawhst2_meas(struct rkisp_isp_stats_vdev * stats_vdev)880 rkisp_stats_restart_rawhst2_meas(struct rkisp_isp_stats_vdev *stats_vdev)
881 {
882 return rkisp_stats_restart_rawhstbig_meas(stats_vdev, 2);
883 }
884
885 static int
rkisp_stats_restart_rawae3_meas(struct rkisp_isp_stats_vdev * stats_vdev)886 rkisp_stats_restart_rawae3_meas(struct rkisp_isp_stats_vdev *stats_vdev)
887 {
888 return rkisp_stats_restart_rawaebig_meas(stats_vdev, 0);
889 }
890
891 static int
rkisp_stats_restart_rawhst3_meas(struct rkisp_isp_stats_vdev * stats_vdev)892 rkisp_stats_restart_rawhst3_meas(struct rkisp_isp_stats_vdev *stats_vdev)
893 {
894 return rkisp_stats_restart_rawhstbig_meas(stats_vdev, 0);
895 }
896
897 static int
rkisp_stats_restart_rawae0_meas(struct rkisp_isp_stats_vdev * stats_vdev)898 rkisp_stats_restart_rawae0_meas(struct rkisp_isp_stats_vdev *stats_vdev)
899 {
900 u32 value;
901
902 value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
903 if (value & ISP2X_3A_MEAS_DONE)
904 rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
905 return 0;
906 }
907
908 static int
rkisp_stats_restart_rawhst0_meas(struct rkisp_isp_stats_vdev * stats_vdev)909 rkisp_stats_restart_rawhst0_meas(struct rkisp_isp_stats_vdev *stats_vdev)
910 {
911 u32 value;
912
913 value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
914 if (value & ISP2X_3A_MEAS_DONE)
915 rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
916 return 0;
917 }
918
919 static void
rkisp_stats_restart_meas(struct rkisp_isp_stats_vdev * stats_vdev)920 rkisp_stats_restart_meas(struct rkisp_isp_stats_vdev *stats_vdev)
921 {
922 rkisp_stats_restart_rawawb_meas(stats_vdev);
923 rkisp_stats_restart_rawaf_meas(stats_vdev);
924 rkisp_stats_restart_rawae1_meas(stats_vdev);
925 rkisp_stats_restart_rawae2_meas(stats_vdev);
926 rkisp_stats_restart_rawae3_meas(stats_vdev);
927 rkisp_stats_restart_rawae0_meas(stats_vdev);
928 rkisp_stats_restart_rawhst1_meas(stats_vdev);
929 rkisp_stats_restart_rawhst2_meas(stats_vdev);
930 rkisp_stats_restart_rawhst3_meas(stats_vdev);
931 rkisp_stats_restart_rawhst0_meas(stats_vdev);
932 }
933
934 static void
rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)935 rkisp_stats_send_meas_v21(struct rkisp_isp_stats_vdev *stats_vdev,
936 struct rkisp_isp_readout_work *meas_work)
937 {
938 unsigned int cur_frame_id = -1;
939 struct rkisp_buffer *cur_buf = stats_vdev->cur_buf;
940 struct rkisp_isp21_stat_buffer *cur_stat_buf = NULL;
941 struct rkisp_stats_v21_ops *ops =
942 (struct rkisp_stats_v21_ops *)stats_vdev->priv_ops;
943 int ret = 0;
944
945 cur_frame_id = meas_work->frame_id;
946 spin_lock(&stats_vdev->rd_lock);
947 /* get one empty buffer */
948 if (!cur_buf) {
949 if (!list_empty(&stats_vdev->stat)) {
950 cur_buf = list_first_entry(&stats_vdev->stat,
951 struct rkisp_buffer, queue);
952 list_del(&cur_buf->queue);
953 }
954 }
955 spin_unlock(&stats_vdev->rd_lock);
956
957 if (cur_buf) {
958 cur_stat_buf =
959 (struct rkisp_isp21_stat_buffer *)(cur_buf->vaddr[0]);
960 cur_stat_buf->frame_id = cur_frame_id;
961 }
962
963 if (meas_work->isp_ris & ISP2X_AFM_SUM_OF)
964 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
965 "ISP2X_AFM_SUM_OF\n");
966
967 if (meas_work->isp_ris & ISP2X_AFM_LUM_OF)
968 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
969 "ISP2X_AFM_LUM_OF\n");
970
971 if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB)
972 ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
973
974 if (meas_work->isp3a_ris & ISP2X_3A_RAWAF)
975 ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
976
977 if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_SUM)
978 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
979 "ISP2X_3A_RAWAF_SUM\n");
980
981 if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_LUM)
982 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
983 "ISP2X_3A_RAWAF_LUM\n");
984
985 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG)
986 ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
987
988 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG)
989 ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
990
991 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0)
992 ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
993
994 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1)
995 ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
996
997 if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2)
998 ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
999
1000 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0)
1001 ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
1002
1003 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1)
1004 ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
1005
1006 if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2)
1007 ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
1008
1009 if (meas_work->isp_ris & ISP2X_FRAME) {
1010 ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf);
1011 ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
1012 }
1013
1014 rkisp_stats_restart_meas(stats_vdev);
1015
1016 if (cur_buf && !ret) {
1017 vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
1018 sizeof(struct rkisp_isp2x_stat_buffer));
1019 cur_buf->vb.sequence = cur_frame_id;
1020 cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
1021 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1022 cur_buf = NULL;
1023 }
1024
1025 stats_vdev->cur_buf = cur_buf;
1026 }
1027
1028 static void
rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1029 rkisp_stats_isr_v21(struct rkisp_isp_stats_vdev *stats_vdev,
1030 u32 isp_ris, u32 isp3a_ris)
1031 {
1032 struct rkisp_device *dev = stats_vdev->dev;
1033 struct rkisp_isp_readout_work work;
1034 u32 iq_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
1035 ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF;
1036 u32 cur_frame_id, isp_mis_tmp = 0, iq_3a_mask = 0;
1037 u32 wr_buf_idx, temp_isp_ris, temp_isp3a_ris;
1038
1039 rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
1040
1041 if (IS_HDR_RDBK(dev->hdr.op_mode))
1042 iq_3a_mask = ISP2X_3A_RAWAE_BIG;
1043
1044 spin_lock(&stats_vdev->irq_lock);
1045
1046 temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true);
1047 temp_isp3a_ris = rkisp_read(stats_vdev->dev, ISP_ISP3A_RIS, true);
1048 isp_mis_tmp = isp_ris & iq_isr_mask;
1049 if (isp_mis_tmp) {
1050 rkisp_write(stats_vdev->dev, ISP_ISP_ICR, isp_mis_tmp, true);
1051
1052 isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP_MIS, true);
1053 if (isp_mis_tmp)
1054 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1055 "isp icr 3A info err: 0x%x 0x%x\n",
1056 isp_mis_tmp, isp_ris);
1057 }
1058
1059 isp_mis_tmp = isp3a_ris & iq_3a_mask;
1060 if (isp_mis_tmp) {
1061 rkisp_write(stats_vdev->dev, ISP_ISP3A_ICR, isp_mis_tmp, true);
1062
1063 isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP3A_MIS, true);
1064 if (isp_mis_tmp)
1065 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1066 "isp3A icr 3A info err: 0x%x 0x%x\n",
1067 isp_mis_tmp, isp_ris);
1068 }
1069
1070 if (!stats_vdev->streamon)
1071 goto unlock;
1072
1073 if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) {
1074 wr_buf_idx = stats_vdev->wr_buf_idx;
1075 stats_vdev->rd_buf_idx = wr_buf_idx;
1076 rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]);
1077 wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
1078 stats_vdev->wr_buf_idx = wr_buf_idx;
1079 rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1080 RKISP_RD_STATS_BUF_SIZE, false);
1081 rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1082 stats_vdev->stats_buf[wr_buf_idx].dma_addr, false);
1083 rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1084 SW_3A_DDR_WRITE_EN, false);
1085 }
1086
1087
1088 if (isp_ris & CIF_ISP_FRAME) {
1089 work.readout = RKISP_ISP_READOUT_MEAS;
1090 work.frame_id = cur_frame_id;
1091 work.isp_ris = temp_isp_ris | isp_ris;
1092 work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
1093 work.timestamp = ktime_get_ns();
1094
1095 rkisp_stats_send_meas_v21(stats_vdev, &work);
1096 }
1097
1098 unlock:
1099 spin_unlock(&stats_vdev->irq_lock);
1100 }
1101
1102 static void
rkisp_stats_rdbk_enable_v21(struct rkisp_isp_stats_vdev * stats_vdev,bool en)1103 rkisp_stats_rdbk_enable_v21(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
1104 {
1105 if (!en) {
1106 stats_vdev->isp_rdbk = 0;
1107 stats_vdev->isp3a_rdbk = 0;
1108 }
1109
1110 stats_vdev->rdbk_mode = en;
1111 }
1112
1113 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
1114 .isr_hdl = rkisp_stats_isr_v21,
1115 .send_meas = rkisp_stats_send_meas_v21,
1116 .rdbk_enable = rkisp_stats_rdbk_enable_v21,
1117 };
1118
rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev * stats_vdev)1119 void rkisp_stats_first_ddr_config_v21(struct rkisp_isp_stats_vdev *stats_vdev)
1120 {
1121 stats_vdev->rd_stats_from_ddr = false;
1122 stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
1123
1124 if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode) &&
1125 stats_vdev->stats_buf[0].mem_priv) {
1126 stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v21;
1127 stats_vdev->rd_stats_from_ddr = true;
1128 stats_vdev->rd_buf_idx = 0;
1129 stats_vdev->wr_buf_idx = 0;
1130
1131 rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1132 RKISP_RD_STATS_BUF_SIZE, false);
1133 rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1134 stats_vdev->stats_buf[0].dma_addr, false);
1135 rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1136 SW_3A_DDR_WRITE_EN, false);
1137 }
1138 }
1139
rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev * stats_vdev)1140 void rkisp_init_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
1141 {
1142 int i;
1143
1144 stats_vdev->vdev_fmt.fmt.meta.dataformat =
1145 V4L2_META_FMT_RK_ISP1_STAT_3A;
1146 stats_vdev->vdev_fmt.fmt.meta.buffersize =
1147 sizeof(struct rkisp_isp2x_stat_buffer);
1148
1149 stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
1150 stats_vdev->priv_ops = &rkisp_stats_reg_ops_v21;
1151 stats_vdev->rd_stats_from_ddr = false;
1152
1153 for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
1154 stats_vdev->stats_buf[i].is_need_vaddr = true;
1155 stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
1156 rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1157 }
1158 }
1159
rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev * stats_vdev)1160 void rkisp_uninit_stats_vdev_v21(struct rkisp_isp_stats_vdev *stats_vdev)
1161 {
1162 int i;
1163
1164 for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
1165 rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1166 }
1167