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