xref: /OK3568_Linux_fs/kernel/drivers/media/platform/rockchip/isp/isp_stats_v32.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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