1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2022 Rockchip Electronics Co., Ltd. */
3
4 #include <linux/kfifo.h>
5 #include <linux/rk-isp32-config.h>
6 #include <media/v4l2-common.h>
7 #include <media/v4l2-ioctl.h>
8 #include <media/videobuf2-core.h>
9 #include <media/videobuf2-vmalloc.h> /* for ISP statistics */
10 #include "dev.h"
11 #include "regs.h"
12 #include "common.h"
13 #include "isp_stats.h"
14 #include "isp_stats_v32.h"
15 #include "isp_params_v32.h"
16
17 #define ISP32_3A_MEAS_DONE BIT(31)
18
isp3_module_done(struct rkisp_isp_stats_vdev * stats_vdev,u32 reg,u32 value)19 static void isp3_module_done(struct rkisp_isp_stats_vdev *stats_vdev,
20 u32 reg, u32 value)
21 {
22 void __iomem *base = stats_vdev->dev->hw_dev->base_addr;
23
24 writel(value, base + reg);
25 }
26
isp3_stats_read(struct rkisp_isp_stats_vdev * stats_vdev,u32 addr)27 static u32 isp3_stats_read(struct rkisp_isp_stats_vdev *stats_vdev, u32 addr)
28 {
29 return rkisp_read(stats_vdev->dev, addr, true);
30 }
31
isp3_stats_write(struct rkisp_isp_stats_vdev * stats_vdev,u32 addr,u32 value)32 static void isp3_stats_write(struct rkisp_isp_stats_vdev *stats_vdev,
33 u32 addr, u32 value)
34 {
35 rkisp_write(stats_vdev->dev, addr, value, true);
36 }
37
38 static int
rkisp_stats_get_vsm_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)39 rkisp_stats_get_vsm_stats(struct rkisp_isp_stats_vdev *stats_vdev,
40 struct rkisp32_isp_stat_buffer *pbuf)
41 {
42 struct isp32_vsm_stat *vsm;
43 u32 value;
44
45 if (!pbuf)
46 return 0;
47
48 vsm = &pbuf->params.vsm;
49 if (isp3_stats_read(stats_vdev, ISP32_VSM_MODE)) {
50 value = isp3_stats_read(stats_vdev, ISP32_VSM_DELTA_H);
51 vsm->delta_h = value;
52 value = isp3_stats_read(stats_vdev, ISP32_VSM_DELTA_V);
53 vsm->delta_v = value;
54 pbuf->meas_type |= ISP32_STAT_VSM;
55 }
56 return 0;
57 }
58
59 static int
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev * stats_vdev,void * pbuf)60 rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev, void *pbuf)
61 {
62 struct rkisp_device *dev = stats_vdev->dev;
63 struct ispsd_in_fmt in_fmt = dev->isp_sdev.in_fmt;
64 enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
65 struct isp2x_bls_stat *bls;
66 u32 value;
67
68 if (!pbuf)
69 return 0;
70
71 value = isp3_stats_read(stats_vdev, ISP3X_BLS_CTRL);
72 if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
73 if (dev->isp_ver == ISP_V32) {
74 struct rkisp32_isp_stat_buffer *p = pbuf;
75
76 bls = &p->params.bls;
77 p->meas_type |= ISP32_STAT_BLS;
78 } else {
79 struct rkisp32_lite_stat_buffer *p = pbuf;
80
81 bls = &p->params.bls;
82 p->meas_type |= ISP32_STAT_BLS;
83 }
84
85 switch (raw_type) {
86 case RAW_BGGR:
87 bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED);
88 bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED);
89 bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED);
90 bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED);
91 break;
92 case RAW_GBRG:
93 bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED);
94 bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED);
95 bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED);
96 bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED);
97 break;
98 case RAW_GRBG:
99 bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED);
100 bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED);
101 bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED);
102 bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED);
103 break;
104 case RAW_RGGB:
105 bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED);
106 bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED);
107 bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED);
108 bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED);
109 break;
110 default:
111 break;
112 }
113 }
114 return 0;
115 }
116
117 static int
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev * stats_vdev,void * pbuf)118 rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev, void *pbuf)
119 {
120 struct rkisp_device *dev = stats_vdev->dev;
121 struct isp3x_dhaz_stat *dhaz;
122 u32 value, i;
123
124 if (!pbuf)
125 return 0;
126
127 value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_CTRL);
128 if (value & ISP_DHAZ_ENMUX) {
129 if (dev->isp_ver == ISP_V32) {
130 struct rkisp32_isp_stat_buffer *p = pbuf;
131
132 dhaz = &p->params.dhaz;
133 p->meas_type |= ISP32_STAT_DHAZ;
134 } else {
135 struct rkisp32_lite_stat_buffer *p = pbuf;
136
137 dhaz = &p->params.dhaz;
138 p->meas_type |= ISP32_STAT_DHAZ;
139 }
140
141 value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_SUMH_RD);
142 dhaz->dhaz_pic_sumh = value;
143
144 value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_ADP_RD0);
145 dhaz->dhaz_adp_air_base = value >> 16;
146 dhaz->dhaz_adp_wt = value & 0xFFFF;
147
148 value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_ADP_RD1);
149 dhaz->dhaz_adp_gratio = value >> 16;
150 dhaz->dhaz_adp_tmax = value & 0xFFFF;
151
152 for (i = 0; i < ISP3X_DHAZ_HIST_IIR_NUM / 2; i++) {
153 value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_HIST_REG0 + 4 * i);
154 dhaz->h_rgb_iir[2 * i] = value & 0xFFFF;
155 dhaz->h_rgb_iir[2 * i + 1] = value >> 16;
156 }
157 }
158 return 0;
159 }
160
161 static int
rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)162 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
163 struct rkisp32_isp_stat_buffer *pbuf)
164 {
165 u32 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL);
166
167 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
168 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
169 "%s fail, ctrl:0x%x\n", __func__, ctrl);
170 return -ENODATA;
171 }
172
173 if (!pbuf)
174 goto out;
175
176 pbuf->meas_type |= ISP32_STAT_RAWAWB;
177 out:
178 isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, ctrl);
179 return 0;
180 }
181
182 static int
rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)183 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
184 struct rkisp32_isp_stat_buffer *pbuf)
185 {
186 struct isp32_rawaf_stat *af;
187 u32 ctrl;
188
189 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL);
190 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
191 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
192 "%s fail, ctrl:0x%x\n", __func__, ctrl);
193 return -ENODATA;
194 }
195
196 if (!pbuf || stats_vdev->af_meas_done_next)
197 goto out;
198
199 af = &pbuf->params.rawaf;
200 pbuf->meas_type |= ISP32_STAT_RAWAF;
201
202 af->afm_sum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_SUM_B);
203 af->afm_lum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_LUM_B);
204 af->int_state = isp3_stats_read(stats_vdev, ISP3X_RAWAF_INT_STATE);
205 af->highlit_cnt_winb = isp3_stats_read(stats_vdev, ISP3X_RAWAF_HIGHLIT_CNT_WINB);
206
207 out:
208 /* af should not clean mease done during isp working for af_ae_mode */
209 stats_vdev->af_meas_done_next = false;
210 if ((ctrl & ISP3X_RAWAF_AE_MODE) &&
211 (isp3_stats_read(stats_vdev, ISP3X_DPCC0_BASE) & ISP3X_DPCC_WORKING))
212 stats_vdev->af_meas_done_next = true;
213 else
214 isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, ctrl);
215 return 0;
216 }
217
218 static int
rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf,u32 blk_no)219 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
220 struct rkisp32_isp_stat_buffer *pbuf,
221 u32 blk_no)
222 {
223 struct isp32_rawaebig_stat1 *ae = NULL;
224 u32 i, base, addr, ctrl, meas_type;
225
226 switch (blk_no) {
227 case 1:
228 base = RAWAE_BIG2_BASE;
229 meas_type = ISP32_STAT_RAWAE1;
230 if (pbuf)
231 ae = &pbuf->params.rawae1_1;
232 break;
233 case 2:
234 base = RAWAE_BIG3_BASE;
235 meas_type = ISP32_STAT_RAWAE2;
236 if (pbuf)
237 ae = &pbuf->params.rawae2_1;
238 break;
239 default:
240 base = RAWAE_BIG1_BASE;
241 meas_type = ISP32_STAT_RAWAE3;
242 if (pbuf)
243 ae = &pbuf->params.rawae3_1;
244 break;
245 }
246
247 ctrl = isp3_stats_read(stats_vdev, base + ISP3X_RAWAE_BIG_CTRL);
248 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
249 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
250 "%s fail, addr:0x%x ctrl:0x%x\n",
251 __func__, base, ctrl);
252 return -ENODATA;
253 }
254
255 if (!ae || stats_vdev->ae_meas_done_next)
256 goto out;
257
258 for (i = 0; i < ISP32_RAWAEBIG_SUBWIN_NUM; i++) {
259 addr = base + ISP3X_RAWAE_BIG_WND1_SUMR + i * 4;
260 ae->sumr[i] = isp3_stats_read(stats_vdev, addr);
261 addr = base + ISP3X_RAWAE_BIG_WND1_SUMG + i * 4;
262 ae->sumg[i] = isp3_stats_read(stats_vdev, addr);
263 addr = base + ISP3X_RAWAE_BIG_WND1_SUMB + i * 4;
264 ae->sumb[i] = isp3_stats_read(stats_vdev, addr);
265 }
266
267 pbuf->meas_type |= meas_type;
268
269 out:
270 /* ae should not clean mease done during isp working for af_ae_mode */
271 if (blk_no == 0 && stats_vdev->af_meas_done_next) {
272 stats_vdev->ae_meas_done_next = true;
273 } else {
274 isp3_module_done(stats_vdev, base + ISP3X_RAWAE_BIG_CTRL, ctrl);
275 if (blk_no == 0)
276 stats_vdev->ae_meas_done_next = false;
277 }
278 return 0;
279 }
280
281 static int
rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf,u32 blk_no)282 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
283 struct rkisp32_isp_stat_buffer *pbuf,
284 u32 blk_no)
285 {
286 u32 addr, ctrl, meas_type;
287
288 switch (blk_no) {
289 case 1:
290 addr = ISP3X_RAWHIST_BIG2_BASE;
291 meas_type = ISP32_STAT_RAWHST1;
292 break;
293 case 2:
294 addr = ISP3X_RAWHIST_BIG3_BASE;
295 meas_type = ISP32_STAT_RAWHST2;
296 break;
297 case 0:
298 default:
299 addr = ISP3X_RAWHIST_BIG1_BASE;
300 meas_type = ISP32_STAT_RAWHST3;
301 break;
302 }
303
304 ctrl = isp3_stats_read(stats_vdev, addr + ISP3X_RAWHIST_BIG_CTRL);
305 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
306 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
307 "%s fail, addr:0x%x ctrl:0x%x\n",
308 __func__, addr, ctrl);
309 return -ENODATA;
310 }
311
312 if (!pbuf)
313 goto out;
314
315 pbuf->meas_type |= meas_type;
316 out:
317 isp3_module_done(stats_vdev, addr + ISP3X_RAWHIST_BIG_CTRL, ctrl);
318 return 0;
319 }
320
321 static int
rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)322 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
323 struct rkisp32_isp_stat_buffer *pbuf)
324 {
325 return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, pbuf, 1);
326 }
327
328 static int
rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)329 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
330 struct rkisp32_isp_stat_buffer *pbuf)
331 {
332 return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, pbuf, 1);
333 }
334
335 static int
rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)336 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
337 struct rkisp32_isp_stat_buffer *pbuf)
338 {
339 return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, pbuf, 2);
340 }
341
342 static int
rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)343 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
344 struct rkisp32_isp_stat_buffer *pbuf)
345 {
346 return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, pbuf, 2);
347 }
348
349 static int
rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)350 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
351 struct rkisp32_isp_stat_buffer *pbuf)
352 {
353 return rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, pbuf, 0);
354 }
355
356 static int
rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)357 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
358 struct rkisp32_isp_stat_buffer *pbuf)
359 {
360 return rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, pbuf, 0);
361 }
362
363 static int
rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)364 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
365 struct rkisp32_isp_stat_buffer *pbuf)
366 {
367 u32 ctrl;
368
369 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_CTRL);
370 if ((ctrl & ISP32_3A_MEAS_DONE) == 0) {
371 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
372 "%s fail, ctrl:0x%x\n", __func__, ctrl);
373 return -ENODATA;
374 }
375
376 if (!pbuf)
377 goto out;
378
379 pbuf->meas_type |= ISP32_STAT_RAWAE0;
380
381 out:
382 isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_CTRL, ctrl);
383 return 0;
384 }
385
386 static int
rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_isp_stat_buffer * pbuf)387 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
388 struct rkisp32_isp_stat_buffer *pbuf)
389 {
390 u32 ctrl;
391
392 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_CTRL);
393 if ((ctrl & ISP32_3A_MEAS_DONE) == 0) {
394 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
395 "%s fail, ctrl:0x%x\n", __func__, ctrl);
396 return -ENODATA;
397 }
398
399 if (!pbuf)
400 goto out;
401
402 pbuf->meas_type |= ISP32_STAT_RAWHST0;
403
404 out:
405 isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_CTRL, ctrl);
406 return 0;
407 }
408
409 static struct rkisp_stats_ops_v32 __maybe_unused stats_ddr_ops_v32 = {
410 .get_rawawb_meas = rkisp_stats_get_rawawb_meas_ddr,
411 .get_rawaf_meas = rkisp_stats_get_rawaf_meas_ddr,
412 .get_rawae0_meas = rkisp_stats_get_rawaelite_meas_ddr,
413 .get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_ddr,
414 .get_rawae1_meas = rkisp_stats_get_rawae1_meas_ddr,
415 .get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_ddr,
416 .get_rawae2_meas = rkisp_stats_get_rawae2_meas_ddr,
417 .get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_ddr,
418 .get_rawae3_meas = rkisp_stats_get_rawae3_meas_ddr,
419 .get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_ddr,
420 .get_bls_stats = rkisp_stats_get_bls_stats,
421 .get_dhaz_stats = rkisp_stats_get_dhaz_stats,
422 .get_vsm_stats = rkisp_stats_get_vsm_stats,
423 };
424
425 static void
rkisp_stats_update_buf(struct rkisp_isp_stats_vdev * stats_vdev)426 rkisp_stats_update_buf(struct rkisp_isp_stats_vdev *stats_vdev)
427 {
428 struct rkisp_device *dev = stats_vdev->dev;
429 struct rkisp_buffer *buf;
430 unsigned long flags;
431
432 spin_lock_irqsave(&stats_vdev->rd_lock, flags);
433 if (!stats_vdev->nxt_buf && !list_empty(&stats_vdev->stat)) {
434 buf = list_first_entry(&stats_vdev->stat,
435 struct rkisp_buffer, queue);
436 list_del(&buf->queue);
437 stats_vdev->nxt_buf = buf;
438 }
439 spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
440
441 if (stats_vdev->nxt_buf) {
442 rkisp_write(dev, ISP3X_MI_3A_WR_BASE, stats_vdev->nxt_buf->buff_addr[0], false);
443 v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
444 "%s BASE:0x%x SHD:0x%x\n",
445 __func__, stats_vdev->nxt_buf->buff_addr[0],
446 isp3_stats_read(stats_vdev, ISP3X_MI_3A_WR_BASE));
447 if (!dev->hw_dev->is_single) {
448 stats_vdev->cur_buf = stats_vdev->nxt_buf;
449 stats_vdev->nxt_buf = NULL;
450 }
451 } else if (stats_vdev->stats_buf[0].mem_priv) {
452 rkisp_write(dev, ISP3X_MI_3A_WR_BASE,
453 stats_vdev->stats_buf[0].dma_addr, false);
454 }
455 }
456
457 static void
rkisp_stats_info2ddr(struct rkisp_isp_stats_vdev * stats_vdev,void * pbuf)458 rkisp_stats_info2ddr(struct rkisp_isp_stats_vdev *stats_vdev, void *pbuf)
459 {
460 struct rkisp_device *dev = stats_vdev->dev;
461 struct rkisp_isp_params_val_v32 *priv_val;
462 struct rkisp_dummy_buffer *buf;
463 int idx, buf_fd = -1;
464 u32 reg = 0, ctrl;
465
466 priv_val = (struct rkisp_isp_params_val_v32 *)dev->params_vdev.priv_val;
467 if (!priv_val->buf_info_owner && priv_val->buf_info_idx >= 0) {
468 priv_val->buf_info_idx = -1;
469 rkisp_clear_bits(dev, ISP3X_GAIN_CTRL, ISP3X_GAIN_2DDR_EN, false);
470 rkisp_clear_bits(dev, ISP3X_RAWAWB_CTRL, ISP32_RAWAWB_2DDR_PATH_EN, false);
471 return;
472 }
473
474 if (priv_val->buf_info_owner == RKISP_INFO2DRR_OWNER_GAIN) {
475 reg = ISP3X_GAIN_CTRL;
476 ctrl = ISP3X_GAIN_2DDR_EN;
477 } else {
478 reg = ISP3X_RAWAWB_CTRL;
479 ctrl = ISP32_RAWAWB_2DDR_PATH_EN;
480 }
481
482 idx = priv_val->buf_info_idx;
483 if (idx >= 0) {
484 buf = &priv_val->buf_info[idx];
485 rkisp_finish_buffer(dev, buf);
486 if (*(u32 *)buf->vaddr != RKISP_INFO2DDR_BUF_INIT && pbuf &&
487 (reg != ISP3X_RAWAWB_CTRL ||
488 !(rkisp_read(dev, reg, true) & ISP32_RAWAWB_2DDR_PATH_ERR))) {
489 if (dev->isp_ver == ISP_V32) {
490 struct rkisp32_isp_stat_buffer *p = pbuf;
491
492 p->params.info2ddr.buf_fd = buf->dma_fd;
493 p->params.info2ddr.owner = priv_val->buf_info_owner;
494 p->meas_type |= ISP32_STAT_INFO2DDR;
495 } else {
496 struct rkisp32_lite_stat_buffer *p = pbuf;
497
498 p->params.info2ddr.buf_fd = buf->dma_fd;
499 p->params.info2ddr.owner = priv_val->buf_info_owner;
500 p->meas_type |= ISP32_STAT_INFO2DDR;
501 }
502 buf_fd = buf->dma_fd;
503 } else if (reg == ISP3X_RAWAWB_CTRL &&
504 rkisp_read(dev, reg, true) & ISP32_RAWAWB_2DDR_PATH_ERR) {
505 v4l2_warn(&dev->v4l2_dev, "rawawb2ddr path error idx:%d\n", idx);
506 }
507
508 if (buf_fd == -1)
509 return;
510 }
511 /* get next unused buf to hw */
512 for (idx = 0; idx < priv_val->buf_info_cnt; idx++) {
513 buf = &priv_val->buf_info[idx];
514 if (*(u32 *)buf->vaddr == RKISP_INFO2DDR_BUF_INIT)
515 break;
516 }
517
518 if (idx == priv_val->buf_info_cnt) {
519 rkisp_clear_bits(dev, reg, ctrl, false);
520 priv_val->buf_info_idx = -1;
521 } else {
522 buf = &priv_val->buf_info[idx];
523 rkisp_write(dev, ISP3X_MI_GAIN_WR_BASE, buf->dma_addr, false);
524 if (dev->hw_dev->is_single)
525 rkisp_write(dev, ISP3X_MI_WR_CTRL2, ISP3X_GAINSELF_UPD, true);
526 if (priv_val->buf_info_idx < 0)
527 rkisp_set_bits(dev, reg, 0, ctrl, false);
528 priv_val->buf_info_idx = idx;
529 }
530 }
531
532 static void
rkisp_stats_send_meas(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)533 rkisp_stats_send_meas(struct rkisp_isp_stats_vdev *stats_vdev,
534 struct rkisp_isp_readout_work *meas_work)
535 {
536 unsigned int cur_frame_id = -1;
537 struct rkisp_buffer *cur_buf = stats_vdev->cur_buf;
538 struct rkisp32_isp_stat_buffer *cur_stat_buf = NULL;
539 struct rkisp_stats_ops_v32 *ops =
540 (struct rkisp_stats_ops_v32 *)stats_vdev->priv_ops;
541 struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev;
542 u32 size = sizeof(struct rkisp32_isp_stat_buffer);
543 int ret = 0;
544 bool is_dummy = false;
545 unsigned long flags;
546
547 if (!stats_vdev->rdbk_drop) {
548 if (!cur_buf && stats_vdev->stats_buf[0].mem_priv) {
549 rkisp_finish_buffer(stats_vdev->dev, &stats_vdev->stats_buf[0]);
550 cur_stat_buf = stats_vdev->stats_buf[0].vaddr;
551 cur_stat_buf->frame_id = -1;
552 is_dummy = true;
553 } else if (cur_buf) {
554 cur_stat_buf = cur_buf->vaddr[0];
555 }
556 /* config buf for next frame */
557 stats_vdev->cur_buf = NULL;
558 if (stats_vdev->nxt_buf) {
559 stats_vdev->cur_buf = stats_vdev->nxt_buf;
560 stats_vdev->nxt_buf = NULL;
561 }
562 rkisp_stats_update_buf(stats_vdev);
563
564 cur_frame_id = meas_work->frame_id;
565 } else {
566 cur_buf = NULL;
567 }
568
569 if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB)
570 ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
571
572 if (meas_work->isp3a_ris & ISP3X_3A_RAWAF ||
573 stats_vdev->af_meas_done_next)
574 ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
575
576 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG ||
577 stats_vdev->ae_meas_done_next)
578 ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
579
580 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG)
581 ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
582
583 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0)
584 ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
585
586 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH1)
587 ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
588
589 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH2)
590 ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
591
592 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0)
593 ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
594
595 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH1)
596 ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
597
598 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH2)
599 ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
600
601 if (meas_work->isp_ris & ISP3X_FRAME) {
602 ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf);
603 ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
604 ret |= ops->get_vsm_stats(stats_vdev, cur_stat_buf);
605 }
606
607 if (ret || (cur_stat_buf && !cur_stat_buf->meas_type)) {
608 if (cur_buf) {
609 spin_lock_irqsave(&stats_vdev->rd_lock, flags);
610 list_add_tail(&cur_buf->queue, &stats_vdev->stat);
611 spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
612 }
613 } else {
614 if (is_dummy) {
615 spin_lock_irqsave(&stats_vdev->rd_lock, flags);
616 if (!list_empty(&stats_vdev->stat)) {
617 cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue);
618 list_del(&cur_buf->queue);
619 } else {
620 cur_stat_buf->frame_id = cur_frame_id;
621 cur_stat_buf->params_id = params_vdev->cur_frame_id;
622 }
623 spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
624 if (cur_buf) {
625 memcpy(cur_buf->vaddr[0], cur_stat_buf, size);
626 cur_stat_buf = cur_buf->vaddr[0];
627 }
628 }
629 if (cur_buf && cur_stat_buf) {
630 cur_stat_buf->frame_id = cur_frame_id;
631 cur_stat_buf->params_id = params_vdev->cur_frame_id;
632 cur_stat_buf->params.info2ddr.buf_fd = -1;
633 cur_stat_buf->params.info2ddr.owner = 0;
634 rkisp_stats_info2ddr(stats_vdev, cur_stat_buf);
635
636 vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
637 cur_buf->vb.sequence = cur_frame_id;
638 cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
639 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
640 }
641 }
642 }
643
644 static int
rkisp_stats_get_rawawb_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_lite_stat_buffer * pbuf)645 rkisp_stats_get_rawawb_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
646 struct rkisp32_lite_stat_buffer *pbuf)
647 {
648 struct isp32_lite_rawawb_meas_stat *awb;
649 u32 i, val, ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL);
650
651 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
652 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
653 "%s fail, ctrl:0x%x\n", __func__, ctrl);
654 return -ENODATA;
655 }
656
657 if (!pbuf)
658 goto out;
659 awb = &pbuf->params.rawawb;
660 for (i = 0; i < ISP32_RAWAWB_SUM_NUM; i++) {
661 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_RGAIN_NOR_0 + 0x30 * i);
662 awb->sum[i].rgain_nor = val;
663 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_BGAIN_NOR_0 + 0x30 * i);
664 awb->sum[i].bgain_nor = val;
665 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WP_NUM_NOR_0 + 0x30 * i);
666 awb->sum[i].wp_num_nor = val;
667
668 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_RGAIN_BIG_0 + 0x30 * i);
669 awb->sum[i].rgain_big = val;
670 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_BGAIN_BIG_0 + 0x30 * i);
671 awb->sum[i].bgain_big = val;
672 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WP_NUM_BIG_0 + 0x30 * i);
673 awb->sum[i].wp_num_big = val;
674
675 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WPNUM2_0 + 4 * i);
676 awb->sum[i].wp_num2 = val;
677 }
678
679 for (i = 0; i < ISP32_RAWAWB_EXCL_STAT_NUM; i++) {
680 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_R_EXC0 + 0x10 * i);
681 awb->sum_exc[i].rgain_exc = val;
682 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_B_EXC0 + 0x10 * i);
683 awb->sum_exc[i].bgain_exc = val;
684 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WP_NM_EXC0 + 0x10 * i);
685 awb->sum_exc[i].wp_num_exc = val;
686 }
687
688 for (i = 0; i < ISP32_RAWAWB_HSTBIN_NUM / 2; i++) {
689 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_Y_HIST01 + 4 * i);
690 awb->yhist_bin[2 * i] = val & 0xffff;
691 awb->yhist_bin[2 * i + 1] = (val >> 16) & 0xffff;
692 }
693
694 /* RAMDATA R/G/B/WP */
695 for (i = 0; i < ISP32L_RAWAWB_RAMDATA_RGB_NUM; i++) {
696 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_RAM_DATA_BASE);
697 awb->ramdata_r[i] = val & 0x1fffff;
698 awb->ramdata_g[i] = (val >> 21) & 0x7ff;
699 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_RAM_DATA_BASE);
700 awb->ramdata_g[i] |= ((val & 0x3ff) << 11);
701 awb->ramdata_b[i] = (val >> 10) & 0x1fffff;
702 }
703 for (i = 0; i < ISP32L_RAWAWB_RAMDATA_WP_NUM; i++) {
704 val = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_RAM_DATA_BASE);
705 awb->ramdata_wpnum0[i] = val & 0x3fff;
706 awb->ramdata_wpnum1[i] = (val >> 16) & 0x3fff;
707 }
708
709 pbuf->meas_type |= ISP32_STAT_RAWAWB;
710 out:
711 isp3_module_done(stats_vdev, ISP3X_RAWAWB_CTRL, ctrl);
712 return 0;
713 }
714
715 static int
rkisp_stats_get_rawaf_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_lite_stat_buffer * pbuf)716 rkisp_stats_get_rawaf_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
717 struct rkisp32_lite_stat_buffer *pbuf)
718 {
719 struct isp32_lite_rawaf_stat *af;
720 u32 i, val, ctrl;
721
722 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL);
723 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
724 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
725 "%s fail, ctrl:0x%x\n", __func__, ctrl);
726 return -ENODATA;
727 }
728
729 if (!pbuf || stats_vdev->af_meas_done_next)
730 goto out;
731
732 af = &pbuf->params.rawaf;
733 af->afm_sum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_SUM_B);
734 af->afm_lum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_LUM_B);
735 af->int_state = isp3_stats_read(stats_vdev, ISP3X_RAWAF_INT_STATE);
736 af->highlit_cnt_winb = isp3_stats_read(stats_vdev, ISP3X_RAWAF_HIGHLIT_CNT_WINB);
737 /* hiir: first 25 word, viir: remaining 25 word */
738 for (i = 0; i < ISP32L_RAWAF_WND_DATA; i++) {
739 val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_RAM_DATA);
740 af->ramdata.hiir_wnd_data[i] = val;
741 }
742 for (i = 0; i < ISP32L_RAWAF_WND_DATA; i++) {
743 val = isp3_stats_read(stats_vdev, ISP3X_RAWAF_RAM_DATA);
744 af->ramdata.viir_wnd_data[i] = val;
745 }
746
747 pbuf->meas_type |= ISP32_STAT_RAWAF;
748 out:
749 /* af should not clean mease done during isp working for af_ae_mode */
750 stats_vdev->af_meas_done_next = false;
751 if ((ctrl & ISP3X_RAWAF_AE_MODE) &&
752 (isp3_stats_read(stats_vdev, ISP3X_DPCC0_BASE) & ISP3X_DPCC_WORKING))
753 stats_vdev->af_meas_done_next = true;
754 else
755 isp3_module_done(stats_vdev, ISP3X_RAWAF_CTRL, ctrl);
756 return 0;
757 }
758
759 static int
rkisp_stats_get_rawae3_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_lite_stat_buffer * pbuf)760 rkisp_stats_get_rawae3_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
761 struct rkisp32_lite_stat_buffer *pbuf)
762 {
763 struct isp32_lite_rawaebig_stat *ae = NULL;
764 u32 i, val, addr, ctrl, base = RAWAE_BIG1_BASE;
765
766 ctrl = isp3_stats_read(stats_vdev, base + ISP3X_RAWAE_BIG_CTRL);
767 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
768 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
769 "%s fail, addr:0x%x ctrl:0x%x\n",
770 __func__, base, ctrl);
771 return -ENODATA;
772 }
773
774 if (!pbuf || stats_vdev->ae_meas_done_next)
775 goto out;
776
777 ae = &pbuf->params.rawae3;
778 addr = base + ISP3X_RAWAE_BIG_WND1_SUMR;
779 ae->sumr = isp3_stats_read(stats_vdev, addr);
780 addr = base + ISP3X_RAWAE_BIG_WND1_SUMG;
781 ae->sumg = isp3_stats_read(stats_vdev, addr);
782 addr = base + ISP3X_RAWAE_BIG_WND1_SUMB;
783 ae->sumb = isp3_stats_read(stats_vdev, addr);
784
785 addr = base + ISP3X_RAWAE_BIG_RO_MEAN_BASE_ADDR;
786 for (i = 0; i < ISP32_RAWAEBIG_MEAN_NUM; i++) {
787 val = isp3_stats_read(stats_vdev, addr);
788 ae->data[i].channelg_xy = val & 0xfff;
789 ae->data[i].channelb_xy = (val >> 12) & 0x3ff;
790 ae->data[i].channelr_xy = (val >> 22) & 0x3ff;
791 }
792
793 pbuf->meas_type |= ISP32_STAT_RAWAE3;
794 out:
795 /* ae should not clean mease done during isp working for af_ae_mode */
796 if (stats_vdev->af_meas_done_next) {
797 stats_vdev->ae_meas_done_next = true;
798 } else {
799 isp3_module_done(stats_vdev, base + ISP3X_RAWAE_BIG_CTRL, ctrl);
800 stats_vdev->ae_meas_done_next = false;
801 }
802 return 0;
803 }
804
805 static int
rkisp_stats_get_rawhst3_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_lite_stat_buffer * pbuf)806 rkisp_stats_get_rawhst3_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
807 struct rkisp32_lite_stat_buffer *pbuf)
808 {
809 struct isp2x_rawhistbig_stat *hst;
810 u32 i, ctrl, addr, base = ISP3X_RAWHIST_BIG1_BASE;
811
812 ctrl = isp3_stats_read(stats_vdev, base + ISP3X_RAWHIST_BIG_CTRL);
813 if (!(ctrl & ISP32_3A_MEAS_DONE)) {
814 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
815 "%s fail, addr:0x%x ctrl:0x%x\n",
816 __func__, base, ctrl);
817 return -ENODATA;
818 }
819
820 if (!pbuf)
821 goto out;
822 hst = &pbuf->params.rawhist3;
823 addr = base + ISP3X_RAWHIST_BIG_RO_BASE_BIN;
824 for (i = 0; i < ISP3X_HIST_BIN_N_MAX; i++)
825 hst->hist_bin[i] = isp3_stats_read(stats_vdev, addr);
826
827 pbuf->meas_type |= ISP32_STAT_RAWHST3;
828 out:
829 isp3_module_done(stats_vdev, base + ISP3X_RAWHIST_BIG_CTRL, ctrl);
830 return 0;
831 }
832
833 static int
rkisp_stats_get_rawaelite_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_lite_stat_buffer * pbuf)834 rkisp_stats_get_rawaelite_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
835 struct rkisp32_lite_stat_buffer *pbuf)
836 {
837 struct isp2x_rawaelite_stat *ae;
838 u32 i, val, ctrl;
839
840 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_CTRL);
841 if ((ctrl & ISP32_3A_MEAS_DONE) == 0) {
842 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
843 "%s fail, ctrl:0x%x\n", __func__, ctrl);
844 return -ENODATA;
845 }
846
847 if (!pbuf)
848 goto out;
849 ae = &pbuf->params.rawae0;
850 for (i = 0; i < ISP32_RAWAELITE_MEAN_NUM; i++) {
851 val = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_RO_MEAN + 4 * i);
852 ae->data[i].channelg_xy = val & 0xfff;
853 ae->data[i].channelb_xy = (val >> 12) & 0x3ff;
854 ae->data[i].channelr_xy = (val >> 22) & 0x3ff;
855 }
856
857 pbuf->meas_type |= ISP32_STAT_RAWAE0;
858 out:
859 isp3_module_done(stats_vdev, ISP3X_RAWAE_LITE_CTRL, ctrl);
860 return 0;
861 }
862
863 static int
rkisp_stats_get_rawhstlite_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp32_lite_stat_buffer * pbuf)864 rkisp_stats_get_rawhstlite_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
865 struct rkisp32_lite_stat_buffer *pbuf)
866 {
867 struct isp32_lite_rawhistlite_stat *hst;
868 u32 i, ctrl;
869
870 ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_CTRL);
871 if ((ctrl & ISP32_3A_MEAS_DONE) == 0) {
872 v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
873 "%s fail, ctrl:0x%x\n", __func__, ctrl);
874 return -ENODATA;
875 }
876
877 if (!pbuf)
878 goto out;
879 hst = &pbuf->params.rawhist0;
880 for (i = 0; i < ISP32L_HIST_LITE_BIN_N_MAX; i++)
881 hst->hist_bin[i] = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_RO_BASE_BIN);
882
883 pbuf->meas_type |= ISP32_STAT_RAWHST0;
884 out:
885 isp3_module_done(stats_vdev, ISP3X_RAWHIST_LITE_CTRL, ctrl);
886 return 0;
887 }
888
889 static void
rkisp_stats_send_meas_lite(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)890 rkisp_stats_send_meas_lite(struct rkisp_isp_stats_vdev *stats_vdev,
891 struct rkisp_isp_readout_work *meas_work)
892 {
893 struct rkisp_isp_params_vdev *params_vdev = &stats_vdev->dev->params_vdev;
894 unsigned int cur_frame_id = meas_work->frame_id;
895 struct rkisp_buffer *cur_buf = NULL;
896 struct rkisp32_lite_stat_buffer *cur_stat_buf = NULL;
897 u32 size = sizeof(struct rkisp32_lite_stat_buffer);
898 int ret = 0;
899
900 spin_lock(&stats_vdev->rd_lock);
901 if (!list_empty(&stats_vdev->stat)) {
902 cur_buf = list_first_entry(&stats_vdev->stat, struct rkisp_buffer, queue);
903 list_del(&cur_buf->queue);
904 }
905 spin_unlock(&stats_vdev->rd_lock);
906
907 if (cur_buf) {
908 cur_stat_buf = (struct rkisp32_lite_stat_buffer *)(cur_buf->vaddr[0]);
909 cur_stat_buf->frame_id = cur_frame_id;
910 cur_stat_buf->params_id = params_vdev->cur_frame_id;
911 cur_stat_buf->params.info2ddr.buf_fd = -1;
912 cur_stat_buf->params.info2ddr.owner = 0;
913 }
914
915 if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB)
916 ret |= rkisp_stats_get_rawawb_meas_lite(stats_vdev, cur_stat_buf);
917
918 if (meas_work->isp3a_ris & ISP3X_3A_RAWAF ||
919 stats_vdev->af_meas_done_next)
920 ret |= rkisp_stats_get_rawaf_meas_lite(stats_vdev, cur_stat_buf);
921
922 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG ||
923 stats_vdev->ae_meas_done_next)
924 ret |= rkisp_stats_get_rawae3_meas_lite(stats_vdev, cur_stat_buf);
925
926 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG)
927 ret |= rkisp_stats_get_rawhst3_meas_lite(stats_vdev, cur_stat_buf);
928
929 if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0)
930 ret |= rkisp_stats_get_rawaelite_meas_lite(stats_vdev, cur_stat_buf);
931
932 if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0)
933 ret |= rkisp_stats_get_rawhstlite_meas_lite(stats_vdev, cur_stat_buf);
934
935 if (meas_work->isp_ris & ISP3X_FRAME) {
936 ret |= rkisp_stats_get_bls_stats(stats_vdev, cur_stat_buf);
937 ret |= rkisp_stats_get_dhaz_stats(stats_vdev, cur_stat_buf);
938 }
939
940 if (cur_buf) {
941 if (ret || !cur_stat_buf->meas_type) {
942 unsigned long flags;
943
944 spin_lock_irqsave(&stats_vdev->rd_lock, flags);
945 list_add_tail(&cur_buf->queue, &stats_vdev->stat);
946 spin_unlock_irqrestore(&stats_vdev->rd_lock, flags);
947 } else {
948 rkisp_stats_info2ddr(stats_vdev, cur_stat_buf);
949 vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
950 cur_buf->vb.sequence = cur_frame_id;
951 cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
952 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
953 }
954 }
955 }
956
957 static void
rkisp_stats_send_meas_v32(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)958 rkisp_stats_send_meas_v32(struct rkisp_isp_stats_vdev *stats_vdev,
959 struct rkisp_isp_readout_work *meas_work)
960 {
961 if (meas_work->isp_ris & ISP3X_AFM_SUM_OF)
962 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
963 "ISP3X_AFM_SUM_OF\n");
964
965 if (meas_work->isp_ris & ISP3X_AFM_LUM_OF)
966 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
967 "ISP3X_AFM_LUM_OF\n");
968
969 if (meas_work->isp3a_ris & ISP3X_3A_RAWAF_SUM)
970 v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
971 "ISP3X_3A_RAWAF_SUM\n");
972
973 if (stats_vdev->dev->isp_ver == ISP_V32)
974 rkisp_stats_send_meas(stats_vdev, meas_work);
975 else
976 rkisp_stats_send_meas_lite(stats_vdev, meas_work);
977 }
978
979 static void
rkisp_stats_isr_v32(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)980 rkisp_stats_isr_v32(struct rkisp_isp_stats_vdev *stats_vdev,
981 u32 isp_ris, u32 isp3a_ris)
982 {
983 struct rkisp_isp_readout_work work;
984 u32 iq_isr_mask = ISP3X_SIAWB_DONE | ISP3X_SIAF_FIN |
985 ISP3X_EXP_END | ISP3X_SIHST_RDY | ISP3X_AFM_SUM_OF | ISP3X_AFM_LUM_OF;
986 u32 cur_frame_id, isp_mis_tmp = 0;
987 u32 temp_isp_ris, temp_isp3a_ris;
988
989 rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
990
991 spin_lock(&stats_vdev->irq_lock);
992
993 temp_isp_ris = isp3_stats_read(stats_vdev, ISP3X_ISP_RIS);
994 temp_isp3a_ris = isp3_stats_read(stats_vdev, ISP3X_ISP_3A_RIS);
995
996 isp_mis_tmp = isp_ris & iq_isr_mask;
997 if (isp_mis_tmp) {
998 isp3_stats_write(stats_vdev, ISP3X_ISP_ICR, isp_mis_tmp);
999
1000 isp_mis_tmp &= isp3_stats_read(stats_vdev, ISP3X_ISP_MIS);
1001 if (isp_mis_tmp)
1002 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1003 "isp icr 3A info err: 0x%x 0x%x\n",
1004 isp_mis_tmp, isp_ris);
1005 }
1006
1007 isp_mis_tmp = temp_isp3a_ris;
1008 if (isp_mis_tmp) {
1009 isp3_stats_write(stats_vdev, ISP3X_ISP_3A_ICR, isp_mis_tmp);
1010
1011 isp_mis_tmp &= isp3_stats_read(stats_vdev, ISP3X_ISP_3A_MIS);
1012 if (isp_mis_tmp)
1013 v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1014 "isp3A icr 3A info err: 0x%x 0x%x\n",
1015 isp_mis_tmp, isp3a_ris);
1016 }
1017
1018 if (isp_ris & ISP3X_FRAME) {
1019 work.readout = RKISP_ISP_READOUT_MEAS;
1020 work.frame_id = cur_frame_id;
1021 work.isp_ris = temp_isp_ris | isp_ris;
1022 work.isp3a_ris = temp_isp3a_ris;
1023 work.timestamp = ktime_get_ns();
1024 rkisp_stats_send_meas_v32(stats_vdev, &work);
1025 }
1026
1027 spin_unlock(&stats_vdev->irq_lock);
1028 }
1029
1030 static void
rkisp_stats_rdbk_enable_v32(struct rkisp_isp_stats_vdev * stats_vdev,bool en)1031 rkisp_stats_rdbk_enable_v32(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
1032 {
1033 if (!en) {
1034 stats_vdev->isp_rdbk = 0;
1035 stats_vdev->isp3a_rdbk = 0;
1036 }
1037
1038 stats_vdev->rdbk_mode = en;
1039 }
1040
1041 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
1042 .isr_hdl = rkisp_stats_isr_v32,
1043 .send_meas = rkisp_stats_send_meas_v32,
1044 .rdbk_enable = rkisp_stats_rdbk_enable_v32,
1045 };
1046
rkisp_stats_first_ddr_config_v32(struct rkisp_isp_stats_vdev * stats_vdev)1047 void rkisp_stats_first_ddr_config_v32(struct rkisp_isp_stats_vdev *stats_vdev)
1048 {
1049 struct rkisp_device *dev = stats_vdev->dev;
1050 u32 size = stats_vdev->vdev_fmt.fmt.meta.buffersize;
1051
1052 if (dev->isp_sdev.in_fmt.fmt_type == FMT_YUV)
1053 return;
1054
1055 stats_vdev->stats_buf[0].is_need_vaddr = true;
1056 stats_vdev->stats_buf[0].size = size;
1057 if (rkisp_alloc_buffer(dev, &stats_vdev->stats_buf[0]))
1058 v4l2_warn(&dev->v4l2_dev, "stats alloc buf fail\n");
1059 else
1060 memset(stats_vdev->stats_buf[0].vaddr, 0, size);
1061 rkisp_stats_update_buf(stats_vdev);
1062 rkisp_write(dev, ISP3X_MI_DBR_WR_SIZE, size, false);
1063 rkisp_set_bits(dev, ISP3X_SWS_CFG, 0, ISP3X_3A_DDR_WRITE_EN, false);
1064 if (stats_vdev->nxt_buf) {
1065 stats_vdev->cur_buf = stats_vdev->nxt_buf;
1066 stats_vdev->nxt_buf = NULL;
1067 }
1068 }
1069
rkisp_stats_next_ddr_config_v32(struct rkisp_isp_stats_vdev * stats_vdev)1070 void rkisp_stats_next_ddr_config_v32(struct rkisp_isp_stats_vdev *stats_vdev)
1071 {
1072 struct rkisp_hw_dev *hw = stats_vdev->dev->hw_dev;
1073
1074 if (!stats_vdev->streamon)
1075 return;
1076 /* pingpong buf */
1077 if (hw->is_single)
1078 rkisp_stats_update_buf(stats_vdev);
1079 }
1080
rkisp_init_stats_vdev_v32(struct rkisp_isp_stats_vdev * stats_vdev)1081 void rkisp_init_stats_vdev_v32(struct rkisp_isp_stats_vdev *stats_vdev)
1082 {
1083 u32 size;
1084
1085 stats_vdev->vdev_fmt.fmt.meta.dataformat =
1086 V4L2_META_FMT_RK_ISP1_STAT_3A;
1087 if (stats_vdev->dev->isp_ver == ISP_V32) {
1088 stats_vdev->priv_ops = &stats_ddr_ops_v32;
1089 stats_vdev->rd_stats_from_ddr = true;
1090 size = sizeof(struct rkisp32_isp_stat_buffer);
1091 } else {
1092 stats_vdev->priv_ops = NULL;
1093 stats_vdev->rd_stats_from_ddr = false;
1094 size = sizeof(struct rkisp32_lite_stat_buffer);
1095 }
1096 stats_vdev->vdev_fmt.fmt.meta.buffersize = size;
1097 stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
1098 }
1099
rkisp_uninit_stats_vdev_v32(struct rkisp_isp_stats_vdev * stats_vdev)1100 void rkisp_uninit_stats_vdev_v32(struct rkisp_isp_stats_vdev *stats_vdev)
1101 {
1102
1103 }
1104