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