• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2019 Fuzhou 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_v2x.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 void
rkisp_stats_get_siawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)37 rkisp_stats_get_siawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
38 			       struct rkisp_isp2x_stat_buffer *pbuf)
39 {
40 	u32 reg_val;
41 
42 	if (!pbuf)
43 		return;
44 
45 	pbuf->meas_type |= ISP2X_STAT_SIAWB;
46 	reg_val = rkisp_read(stats_vdev->dev, CIF_ISP_AWB_WHITE_CNT_V10, true);
47 	pbuf->params.siawb.awb_mean[0].cnt = ISP2X_SIAWB_GET_PIXEL_CNT(reg_val);
48 	reg_val = rkisp_read(stats_vdev->dev, CIF_ISP_AWB_MEAN_V10, true);
49 
50 	pbuf->params.siawb.awb_mean[0].mean_cr_or_r =
51 		ISP2X_SIAWB_GET_MEAN_CR_R(reg_val);
52 	pbuf->params.siawb.awb_mean[0].mean_cb_or_b =
53 		ISP2X_SIAWB_GET_MEAN_CB_B(reg_val);
54 	pbuf->params.siawb.awb_mean[0].mean_y_or_g =
55 		ISP2X_SIAWB_GET_MEAN_Y_G(reg_val);
56 }
57 
58 static void
rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)59 rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
60 				struct rkisp_isp2x_stat_buffer *pbuf)
61 {
62 	u64 msb, lsb;
63 	u32 value;
64 	int i;
65 
66 	if (!pbuf)
67 		goto out;
68 
69 	pbuf->meas_type |= ISP2X_STAT_RAWAWB;
70 
71 	for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
72 		pbuf->params.rawawb.ro_rawawb_sum_r_nor[i] =
73 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_NOR_0 + 0x30 * i, true);
74 		pbuf->params.rawawb.ro_rawawb_sum_g_nor[i] =
75 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_NOR_0 + 0x30 * i, true);
76 		pbuf->params.rawawb.ro_rawawb_sum_b_nor[i] =
77 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_NOR_0 + 0x30 * i, true);
78 		pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
79 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NUM_NOR_0 + 0x30 * i, true);
80 		pbuf->params.rawawb.ro_rawawb_sum_r_big[i] =
81 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_BIG_0 + 0x30 * i, true);
82 		pbuf->params.rawawb.ro_rawawb_sum_g_big[i] =
83 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_BIG_0 + 0x30 * i, true);
84 		pbuf->params.rawawb.ro_rawawb_sum_b_big[i] =
85 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_BIG_0 + 0x30 * i, true);
86 		pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
87 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NUM_BIG_0 + 0x30 * i, true);
88 		pbuf->params.rawawb.ro_rawawb_sum_r_sma[i] =
89 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_SMA_0 + 0x30 * i, true);
90 		pbuf->params.rawawb.ro_rawawb_sum_g_sma[i] =
91 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_SMA_0 + 0x30 * i, true);
92 		pbuf->params.rawawb.ro_rawawb_sum_b_sma[i] =
93 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_SMA_0 + 0x30 * i, true);
94 		pbuf->params.rawawb.ro_rawawb_wp_num_sma[i] =
95 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NUM_SMA_0 + 0x30 * i, true);
96 	}
97 
98 	for (i = 0; i < ISP2X_RAWAWB_MULWD_NUM; i++) {
99 		pbuf->params.rawawb.ro_sum_r_nor_multiwindow[i] =
100 			rkisp_read(stats_vdev->dev,
101 				   ISP_RAWAWB_SUM_R_NOR_MULTIWINDOW_0 + 0x30 * i, true);
102 		pbuf->params.rawawb.ro_sum_g_nor_multiwindow[i] =
103 			rkisp_read(stats_vdev->dev,
104 				   ISP_RAWAWB_SUM_G_NOR_MULTIWINDOW_0 + 0x30 * i, true);
105 		pbuf->params.rawawb.ro_sum_b_nor_multiwindow[i] =
106 			rkisp_read(stats_vdev->dev,
107 				   ISP_RAWAWB_SUM_B_NOR_MULTIWINDOW_0 + 0x30 * i, true);
108 		pbuf->params.rawawb.ro_wp_nm_nor_multiwindow[i] =
109 			rkisp_read(stats_vdev->dev,
110 				   ISP_RAWAWB_WP_NM_NOR_MULTIWINDOW_0 + 0x30 * i, true);
111 		pbuf->params.rawawb.ro_sum_r_big_multiwindow[i] =
112 			rkisp_read(stats_vdev->dev,
113 				   ISP_RAWAWB_SUM_R_BIG_MULTIWINDOW_0 + 0x30 * i, true);
114 		pbuf->params.rawawb.ro_sum_g_big_multiwindow[i] =
115 			rkisp_read(stats_vdev->dev,
116 				   ISP_RAWAWB_SUM_G_BIG_MULTIWINDOW_0 + 0x30 * i, true);
117 		pbuf->params.rawawb.ro_sum_b_big_multiwindow[i] =
118 			rkisp_read(stats_vdev->dev,
119 				   ISP_RAWAWB_SUM_B_BIG_MULTIWINDOW_0 + 0x30 * i, true);
120 		pbuf->params.rawawb.ro_wp_nm_big_multiwindow[i] =
121 			rkisp_read(stats_vdev->dev,
122 				   ISP_RAWAWB_WP_NM_BIG_MULTIWINDOW_0 + 0x30 * i, true);
123 		pbuf->params.rawawb.ro_sum_r_sma_multiwindow[i] =
124 			rkisp_read(stats_vdev->dev,
125 				   ISP_RAWAWB_SUM_R_SMA_MULTIWINDOW_0 + 0x30 * i, true);
126 		pbuf->params.rawawb.ro_sum_g_sma_multiwindow[i] =
127 			rkisp_read(stats_vdev->dev,
128 				   ISP_RAWAWB_SUM_G_SMA_MULTIWINDOW_0 + 0x30 * i, true);
129 		pbuf->params.rawawb.ro_sum_b_sma_multiwindow[i] =
130 			rkisp_read(stats_vdev->dev,
131 				   ISP_RAWAWB_SUM_B_SMA_MULTIWINDOW_0 + 0x30 * i, true);
132 		pbuf->params.rawawb.ro_wp_nm_sma_multiwindow[i] =
133 			rkisp_read(stats_vdev->dev,
134 				   ISP_RAWAWB_WP_NM_SMA_MULTIWINDOW_0 + 0x30 * i, true);
135 	}
136 
137 	for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
138 		pbuf->params.rawawb.ro_sum_r_exc[i] =
139 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_R_EXC_0 + 0x10 * i, true);
140 		pbuf->params.rawawb.ro_sum_g_exc[i] =
141 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_G_EXC_0 + 0x10 * i, true);
142 		pbuf->params.rawawb.ro_sum_b_exc[i] =
143 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_SUM_B_EXC_0 + 0x10 * i, true);
144 		pbuf->params.rawawb.ro_wp_nm_exc[i] =
145 			rkisp_read(stats_vdev->dev, ISP_RAWAWB_WP_NM_EXC_0 + 0x10 * i, true);
146 	}
147 
148 	for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM; i++) {
149 		lsb = rkisp_read(stats_vdev->dev, ISP_RAWAWB_RAM_DATA, true);
150 		msb = rkisp_read(stats_vdev->dev, ISP_RAWAWB_RAM_DATA, true);
151 		pbuf->params.rawawb.ramdata[i].b = lsb & 0x3FFFF;
152 		pbuf->params.rawawb.ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
153 		pbuf->params.rawawb.ramdata[i].r = (msb & 0x3FFFF0) >> 4;
154 		pbuf->params.rawawb.ramdata[i].wp = (msb & 0xE0000000) >> 29;
155 	}
156 
157 out:
158 	value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
159 	value |= ISP2X_3A_MEAS_DONE;
160 	rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true);
161 }
162 
163 static void
rkisp_stats_get_siaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)164 rkisp_stats_get_siaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
165 			      struct rkisp_isp2x_stat_buffer *pbuf)
166 {
167 	struct isp2x_siaf_stat *af;
168 
169 	if (!pbuf)
170 		return;
171 
172 	pbuf->meas_type |= ISP2X_STAT_SIAF;
173 
174 	af = &pbuf->params.siaf;
175 	af->win[0].sum = rkisp_read(stats_vdev->dev, ISP_AFM_SUM_A, true);
176 	af->win[0].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_A, true);
177 	af->win[1].sum = rkisp_read(stats_vdev->dev, ISP_AFM_SUM_B, true);
178 	af->win[1].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_B, true);
179 	af->win[2].sum = rkisp_read(stats_vdev->dev, ISP_AFM_SUM_C, true);
180 	af->win[2].lum = rkisp_read(stats_vdev->dev, ISP_AFM_LUM_C, true);
181 }
182 
183 static void
rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)184 rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
185 			       struct rkisp_isp2x_stat_buffer *pbuf)
186 {
187 	struct isp2x_rawaf_stat *af;
188 	u32 value, read_line;
189 	u32 line_num[ISP2X_RAWAF_LINE_NUM + 1];
190 	int i;
191 
192 	if (!pbuf)
193 		goto out;
194 
195 	af = &pbuf->params.rawaf;
196 	pbuf->meas_type |= ISP2X_STAT_RAWAF;
197 
198 	af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
199 	af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
200 	af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
201 	af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
202 	af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
203 
204 	memset(line_num, 0, sizeof(line_num));
205 	line_num[ISP2X_RAWAF_LINE_NUM] = ISP2X_RAWAF_SUMDATA_ROW;
206 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_LINE, true);
207 	for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
208 		if (value & (ISP2X_RAWAF_INT_LINE0_EN << i)) {
209 			line_num[i] = (value >> (4 * i)) & 0xF;
210 			line_num[ISP2X_RAWAF_LINE_NUM] -= line_num[i];
211 		}
212 	}
213 
214 	read_line = 0;
215 	for (i = 0; i < ISP2X_RAWAF_LINE_NUM; i++) {
216 		if (af->int_state & (1 << i))
217 			read_line += line_num[i];
218 	}
219 
220 	if (!read_line)
221 		read_line = line_num[ISP2X_RAWAF_LINE_NUM];
222 
223 	for (i = 0; i < read_line * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
224 		af->ramdata[i] = rkisp_read(stats_vdev->dev, ISP_RAWAF_RAM_DATA, true);
225 
226 out:
227 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
228 	value |= ISP2X_3A_MEAS_DONE;
229 	rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
230 	rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
231 }
232 
233 static void
rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)234 rkisp_stats_get_yuvae_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
235 			       struct rkisp_isp2x_stat_buffer *pbuf)
236 {
237 	u32 value;
238 	int i;
239 
240 	if (!pbuf)
241 		goto out;
242 
243 	pbuf->meas_type |= ISP2X_STAT_YUVAE;
244 	for (i = 0; i < ISP2X_YUVAE_MEAN_NUM / 4; i++) {
245 		value = rkisp_read(stats_vdev->dev, ISP_YUVAE_RO_MEAN_BASE_ADDR, true);
246 		pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
247 		pbuf->params.yuvae.mean[4 * i + 1] = ISP2X_EXP_GET_MEAN_xy1(value);
248 		pbuf->params.yuvae.mean[4 * i + 2] = ISP2X_EXP_GET_MEAN_xy2(value);
249 		pbuf->params.yuvae.mean[4 * i + 3] = ISP2X_EXP_GET_MEAN_xy3(value);
250 	}
251 	value = rkisp_read(stats_vdev->dev, ISP_YUVAE_RO_MEAN_BASE_ADDR, true);
252 	pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
253 
254 	for (i = 0; i < ISP2X_YUVAE_SUBWIN_NUM; i++)
255 		pbuf->params.yuvae.ro_yuvae_sumy[i] =
256 			rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true);
257 
258 out:
259 	value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
260 	value |= ISP2X_3A_MEAS_DONE;
261 	rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true);
262 }
263 
264 static void
rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)265 rkisp_stats_get_sihst_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
266 			       struct rkisp_isp2x_stat_buffer *pbuf)
267 {
268 	u32 value;
269 	int i, j;
270 
271 	if (!pbuf)
272 		return;
273 
274 	pbuf->meas_type |= ISP2X_STAT_SIHST;
275 	for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) {
276 		for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) {
277 			value = rkisp_read(stats_vdev->dev,
278 					   ISP_HIST_HIST_BIN + i * 0x40 + j * 4, true);
279 			pbuf->params.sihst.win_stat[i].hist_bins[2 * j] =
280 				ISP2X_HIST_GET_BIN0(value);
281 			pbuf->params.sihst.win_stat[i].hist_bins[2 * j + 1] =
282 				ISP2X_HIST_GET_BIN1(value);
283 		}
284 	}
285 }
286 
287 static void
rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)288 rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
289 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
290 {
291 	u32 addr, value;
292 	int i;
293 
294 	switch (blk_no) {
295 	case 0:
296 		addr = RAWAE_BIG1_BASE;
297 		break;
298 	case 1:
299 		addr = RAWAE_BIG2_BASE;
300 		break;
301 	case 2:
302 		addr = RAWAE_BIG3_BASE;
303 		break;
304 	default:
305 		addr = RAWAE_BIG1_BASE;
306 		break;
307 	}
308 
309 	if (!ae)
310 		goto out;
311 
312 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
313 		ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
314 
315 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
316 		ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
317 
318 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
319 		ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
320 
321 	for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
322 		value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_RO_MEAN_BASE_ADDR, true);
323 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
324 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
325 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
326 	}
327 
328 out:
329 	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
330 	value |= ISP2X_3A_MEAS_DONE;
331 	rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
332 }
333 
334 static void
rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)335 rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
336 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
337 {
338 	u32 addr, value;
339 	int i;
340 
341 	switch (blk_no) {
342 	case 0:
343 		addr = ISP_RAWHIST_BIG1_BASE;
344 		break;
345 	case 1:
346 		addr = ISP_RAWHIST_BIG2_BASE;
347 		break;
348 	case 2:
349 		addr = ISP_RAWHIST_BIG3_BASE;
350 		break;
351 	default:
352 		addr = ISP_RAWHIST_BIG1_BASE;
353 		break;
354 	}
355 
356 	if (!hst)
357 		goto out;
358 
359 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
360 		hst->hist_bin[i] = rkisp_read(stats_vdev->dev,
361 					      addr + ISP_RAWHIST_BIG_RO_BASE_BIN, true);
362 
363 out:
364 	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
365 	value |= ISP2X_3A_MEAS_DONE;
366 	rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
367 }
368 
369 static void
rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)370 rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
371 				struct rkisp_isp2x_stat_buffer *pbuf)
372 {
373 	if (!pbuf)
374 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1);
375 	else
376 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae1, 1);
377 }
378 
379 static void
rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)380 rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
381 				 struct rkisp_isp2x_stat_buffer *pbuf)
382 {
383 	if (!pbuf)
384 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1);
385 	else
386 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist1, 1);
387 }
388 
389 static void
rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)390 rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
391 				struct rkisp_isp2x_stat_buffer *pbuf)
392 {
393 	if (!pbuf)
394 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2);
395 	else
396 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae2, 2);
397 }
398 
399 static void
rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)400 rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
401 				 struct rkisp_isp2x_stat_buffer *pbuf)
402 {
403 	if (!pbuf)
404 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2);
405 	else
406 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist2, 2);
407 }
408 
409 static void
rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)410 rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
411 				struct rkisp_isp2x_stat_buffer *pbuf)
412 {
413 	if (!pbuf)
414 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0);
415 	else
416 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, &pbuf->params.rawae3, 0);
417 }
418 
419 static void
rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)420 rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
421 				 struct rkisp_isp2x_stat_buffer *pbuf)
422 {
423 	if (!pbuf)
424 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0);
425 	else
426 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, &pbuf->params.rawhist3, 0);
427 }
428 
429 static void
rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)430 rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
431 				   struct rkisp_isp2x_stat_buffer *pbuf)
432 {
433 	struct isp2x_rawaelite_stat *ae;
434 	u32 value;
435 	int i;
436 
437 	if (!pbuf)
438 		goto out;
439 
440 	ae = &pbuf->params.rawae0;
441 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
442 
443 	if ((value & ISP2X_3A_MEAS_DONE) == 0)
444 		return;
445 
446 	for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
447 		value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_RO_MEAN + 4 * i, true);
448 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
449 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
450 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
451 	}
452 
453 out:
454 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
455 	value |= ISP2X_3A_MEAS_DONE;
456 	rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
457 }
458 
459 static void
rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)460 rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
461 				    struct rkisp_isp2x_stat_buffer *pbuf)
462 {
463 	struct isp2x_rawhistlite_stat *hst;
464 	u32 value;
465 	int i;
466 
467 	if (!pbuf)
468 		goto out;
469 
470 	hst = &pbuf->params.rawhist0;
471 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
472 		hst->hist_bin[i] = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_RO_BASE_BIN, true);
473 
474 out:
475 	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
476 	value |= ISP2X_3A_MEAS_DONE;
477 	rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
478 }
479 
480 static void
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)481 rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev,
482 			  struct rkisp_isp2x_stat_buffer *pbuf)
483 {
484 	struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt;
485 	enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
486 	struct isp2x_bls_stat *bls;
487 	u32 value;
488 
489 	if (!pbuf)
490 		return;
491 
492 	bls = &pbuf->params.bls;
493 	value = rkisp_read(stats_vdev->dev, ISP_BLS_CTRL, true);
494 	if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
495 		pbuf->meas_type |= ISP2X_STAT_BLS;
496 
497 		switch (raw_type) {
498 		case RAW_BGGR:
499 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
500 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
501 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
502 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
503 			break;
504 		case RAW_GBRG:
505 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
506 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
507 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
508 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
509 			break;
510 		case RAW_GRBG:
511 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
512 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
513 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
514 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
515 			break;
516 		case RAW_RGGB:
517 			bls->meas_r = rkisp_read(stats_vdev->dev, ISP_BLS_A_MEASURED, true);
518 			bls->meas_gr = rkisp_read(stats_vdev->dev, ISP_BLS_B_MEASURED, true);
519 			bls->meas_gb = rkisp_read(stats_vdev->dev, ISP_BLS_C_MEASURED, true);
520 			bls->meas_b = rkisp_read(stats_vdev->dev, ISP_BLS_D_MEASURED, true);
521 			break;
522 		default:
523 			break;
524 		}
525 	}
526 }
527 
528 static void
rkisp_stats_get_tmo_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)529 rkisp_stats_get_tmo_stats(struct rkisp_isp_stats_vdev *stats_vdev,
530 			  struct rkisp_isp2x_stat_buffer *pbuf)
531 {
532 	struct rkisp_device *dev = stats_vdev->dev;
533 	struct rkisp_isp_params_vdev *params_vdev = &dev->params_vdev;
534 	struct isp2x_hdrtmo_stat *tmo;
535 	u32 value, i;
536 
537 	if (!pbuf || !params_vdev->hdrtmo_en)
538 		return;
539 
540 	tmo = &pbuf->params.hdrtmo;
541 	value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_CTRL, true);
542 	if (value & ISP_HDRTMO_EN) {
543 		pbuf->meas_type |= ISP2X_STAT_HDRTMO;
544 
545 		value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO0, true);
546 		tmo->lglow = value >> 16;
547 		tmo->lgmin = value & 0xFFFF;
548 
549 		value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO1, true);
550 		tmo->lghigh = value >> 16;
551 		tmo->lgmax = value & 0xFFFF;
552 
553 		value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO2, true);
554 		tmo->weightkey = (value >> 16) & 0xFF;
555 		tmo->lgmean = value & 0xFFFF;
556 
557 		value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO3, true);
558 		tmo->lgrange1 = value >> 16;
559 		tmo->lgrange0 = value & 0xFFFF;
560 
561 		value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO4, true);
562 		tmo->palpha = (value >> 16) & 0x3FF;
563 		tmo->lgavgmax = value & 0xFFFF;
564 
565 		value = rkisp_read(stats_vdev->dev, ISP_HDRTMO_LG_RO5, true);
566 		tmo->linecnt = value & 0x1FFF;
567 
568 		for (i = 0; i < ISP2X_HDRTMO_MINMAX_NUM; i++)
569 			tmo->min_max[i] = rkisp_read(stats_vdev->dev,
570 						     ISP_HDRTMO_HIST_RO0 + 4 * i, true);
571 	}
572 }
573 
574 static void
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)575 rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev,
576 			   struct rkisp_isp2x_stat_buffer *pbuf)
577 {
578 	struct isp2x_dhaz_stat *dhaz;
579 	u32 value, i;
580 
581 	if (!pbuf)
582 		return;
583 
584 	dhaz = &pbuf->params.dhaz;
585 	value = rkisp_read(stats_vdev->dev, ISP_DHAZ_CTRL, true);
586 	if (value & ISP_DHAZ_ENMUX) {
587 		pbuf->meas_type |= ISP2X_STAT_DHAZ;
588 
589 		value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD0, true);
590 		dhaz->dhaz_adp_air_base = value >> 16;
591 		dhaz->dhaz_adp_wt = value & 0xFFFF;
592 
593 		value = rkisp_read(stats_vdev->dev, ISP_DHAZ_ADP_RD1, true);
594 		dhaz->dhaz_adp_gratio = value >> 16;
595 		dhaz->dhaz_adp_tmax = value & 0xFFFF;
596 
597 		for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
598 			value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG0 + 4 * i, true);
599 			dhaz->h_r_iir[2 * i] = value & 0xFFFF;
600 			dhaz->h_r_iir[2 * i + 1] = value >> 16;
601 		}
602 
603 		for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
604 			value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG32 + 4 * i, true);
605 			dhaz->h_g_iir[2 * i] = value & 0xFFFF;
606 			dhaz->h_g_iir[2 * i + 1] = value >> 16;
607 		}
608 
609 		for (i = 0; i < ISP2X_DHAZ_HIST_IIR_NUM / 2; i++) {
610 			value = rkisp_read(stats_vdev->dev, ISP_DHAZ_HIST_REG64 + 4 * i, true);
611 			dhaz->h_b_iir[2 * i] = value & 0xFFFF;
612 			dhaz->h_b_iir[2 * i + 1] = value >> 16;
613 		}
614 	}
615 }
616 
617 static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_reg_ops_v2x = {
618 	.get_siawb_meas = rkisp_stats_get_siawb_meas_reg,
619 	.get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg,
620 	.get_siaf_meas = rkisp_stats_get_siaf_meas_reg,
621 	.get_rawaf_meas = rkisp_stats_get_rawaf_meas_reg,
622 	.get_yuvae_meas = rkisp_stats_get_yuvae_meas_reg,
623 	.get_sihst_meas = rkisp_stats_get_sihst_meas_reg,
624 	.get_rawae0_meas = rkisp_stats_get_rawaelite_meas_reg,
625 	.get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_reg,
626 	.get_rawae1_meas = rkisp_stats_get_rawae1_meas_reg,
627 	.get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_reg,
628 	.get_rawae2_meas = rkisp_stats_get_rawae2_meas_reg,
629 	.get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_reg,
630 	.get_rawae3_meas = rkisp_stats_get_rawae3_meas_reg,
631 	.get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_reg,
632 	.get_bls_stats = rkisp_stats_get_bls_stats,
633 	.get_tmo_stats = rkisp_stats_get_tmo_stats,
634 	.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
635 };
636 
637 static void
rkisp_stats_get_siawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)638 rkisp_stats_get_siawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
639 			       struct rkisp_isp2x_stat_buffer *pbuf)
640 {
641 	u32 reg_val;
642 	u32 *ddr_addr;
643 	u32 rd_buf_idx;
644 
645 	if (!pbuf)
646 		return;
647 
648 	pbuf->meas_type |= ISP2X_STAT_SIAWB;
649 
650 	rd_buf_idx = stats_vdev->rd_buf_idx;
651 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C60;
652 
653 	reg_val = ddr_addr[0];
654 	pbuf->params.siawb.awb_mean[0].cnt = ISP2X_SIAWB_GET_PIXEL_CNT(reg_val);
655 
656 	reg_val = ddr_addr[1];
657 	pbuf->params.siawb.awb_mean[0].mean_cr_or_r =
658 		ISP2X_SIAWB_GET_MEAN_CR_R(reg_val);
659 	pbuf->params.siawb.awb_mean[0].mean_cb_or_b =
660 		ISP2X_SIAWB_GET_MEAN_CB_B(reg_val);
661 	pbuf->params.siawb.awb_mean[0].mean_y_or_g =
662 		ISP2X_SIAWB_GET_MEAN_Y_G(reg_val);
663 }
664 
665 static void
rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)666 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
667 				struct rkisp_isp2x_stat_buffer *pbuf)
668 {
669 	u32 value, rd_buf_idx, tmp_oft;
670 	u32 *reg_addr, *raw_addr;
671 	u64 msb, lsb;
672 	u32 i;
673 
674 	if (!pbuf)
675 		goto OUT;
676 
677 	pbuf->meas_type |= ISP2X_STAT_RAWAWB;
678 
679 	tmp_oft = ISP_RAWAWB_SUM_R_NOR_0;
680 	rd_buf_idx = stats_vdev->rd_buf_idx;
681 	raw_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2000;
682 	reg_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2710;
683 
684 	for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
685 		pbuf->params.rawawb.ro_rawawb_sum_r_nor[i] =
686 			reg_addr[(ISP_RAWAWB_SUM_R_NOR_0 - tmp_oft + 0x30 * i) / 4];
687 		pbuf->params.rawawb.ro_rawawb_sum_g_nor[i] =
688 			reg_addr[(ISP_RAWAWB_SUM_G_NOR_0 - tmp_oft + 0x30 * i) / 4];
689 		pbuf->params.rawawb.ro_rawawb_sum_b_nor[i] =
690 			reg_addr[(ISP_RAWAWB_SUM_B_NOR_0 - tmp_oft + 0x30 * i) / 4];
691 		pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
692 			reg_addr[(ISP_RAWAWB_WP_NUM_NOR_0 - tmp_oft + 0x30 * i) / 4];
693 		pbuf->params.rawawb.ro_rawawb_sum_r_big[i] =
694 			reg_addr[(ISP_RAWAWB_SUM_R_BIG_0 - tmp_oft + 0x30 * i) / 4];
695 		pbuf->params.rawawb.ro_rawawb_sum_g_big[i] =
696 			reg_addr[(ISP_RAWAWB_SUM_G_BIG_0 - tmp_oft + 0x30 * i) / 4];
697 		pbuf->params.rawawb.ro_rawawb_sum_b_big[i] =
698 			reg_addr[(ISP_RAWAWB_SUM_B_BIG_0 - tmp_oft + 0x30 * i) / 4];
699 		pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
700 			reg_addr[(ISP_RAWAWB_WP_NUM_BIG_0 - tmp_oft + 0x30 * i) / 4];
701 		pbuf->params.rawawb.ro_rawawb_sum_r_sma[i] =
702 			reg_addr[(ISP_RAWAWB_SUM_R_SMA_0 - tmp_oft + 0x30 * i) / 4];
703 		pbuf->params.rawawb.ro_rawawb_sum_g_sma[i] =
704 			reg_addr[(ISP_RAWAWB_SUM_G_SMA_0 - tmp_oft + 0x30 * i) / 4];
705 		pbuf->params.rawawb.ro_rawawb_sum_b_sma[i] =
706 			reg_addr[(ISP_RAWAWB_SUM_B_SMA_0 - tmp_oft + 0x30 * i) / 4];
707 		pbuf->params.rawawb.ro_rawawb_wp_num_sma[i] =
708 			reg_addr[(ISP_RAWAWB_WP_NUM_SMA_0 - tmp_oft + 0x30 * i) / 4];
709 	}
710 
711 	for (i = 0; i < ISP2X_RAWAWB_MULWD_NUM; i++) {
712 		pbuf->params.rawawb.ro_sum_r_nor_multiwindow[i] =
713 			reg_addr[(ISP_RAWAWB_SUM_R_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
714 		pbuf->params.rawawb.ro_sum_g_nor_multiwindow[i] =
715 			reg_addr[(ISP_RAWAWB_SUM_G_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
716 		pbuf->params.rawawb.ro_sum_b_nor_multiwindow[i] =
717 			reg_addr[(ISP_RAWAWB_SUM_B_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
718 		pbuf->params.rawawb.ro_wp_nm_nor_multiwindow[i] =
719 			reg_addr[(ISP_RAWAWB_WP_NM_NOR_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
720 		pbuf->params.rawawb.ro_sum_r_big_multiwindow[i] =
721 			reg_addr[(ISP_RAWAWB_SUM_R_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
722 		pbuf->params.rawawb.ro_sum_g_big_multiwindow[i] =
723 			reg_addr[(ISP_RAWAWB_SUM_G_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
724 		pbuf->params.rawawb.ro_sum_b_big_multiwindow[i] =
725 			reg_addr[(ISP_RAWAWB_SUM_B_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
726 		pbuf->params.rawawb.ro_wp_nm_big_multiwindow[i] =
727 			reg_addr[(ISP_RAWAWB_WP_NM_BIG_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
728 		pbuf->params.rawawb.ro_sum_r_sma_multiwindow[i] =
729 			reg_addr[(ISP_RAWAWB_SUM_R_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
730 		pbuf->params.rawawb.ro_sum_g_sma_multiwindow[i] =
731 			reg_addr[(ISP_RAWAWB_SUM_G_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
732 		pbuf->params.rawawb.ro_sum_b_sma_multiwindow[i] =
733 			reg_addr[(ISP_RAWAWB_SUM_B_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
734 		pbuf->params.rawawb.ro_wp_nm_sma_multiwindow[i] =
735 			reg_addr[(ISP_RAWAWB_WP_NM_SMA_MULTIWINDOW_0 - tmp_oft + 0x30 * i) / 4];
736 	}
737 
738 	for (i = 0; i < ISP2X_RAWAWB_SUM_NUM; i++) {
739 		pbuf->params.rawawb.ro_sum_r_exc[i] =
740 			reg_addr[(ISP_RAWAWB_SUM_R_EXC_0 - tmp_oft + 0x10 * i) / 4];
741 		pbuf->params.rawawb.ro_sum_g_exc[i] =
742 			reg_addr[(ISP_RAWAWB_SUM_G_EXC_0 - tmp_oft + 0x10 * i) / 4];
743 		pbuf->params.rawawb.ro_sum_b_exc[i] =
744 			reg_addr[(ISP_RAWAWB_SUM_B_EXC_0 - tmp_oft + 0x10 * i) / 4];
745 		pbuf->params.rawawb.ro_wp_nm_exc[i] =
746 			reg_addr[(ISP_RAWAWB_WP_NM_EXC_0 - tmp_oft + 0x10 * i) / 4];
747 	}
748 
749 	for (i = 0; i < ISP2X_RAWAWB_RAMDATA_NUM / 2; i++) {
750 		lsb = raw_addr[4 * i];
751 		msb = raw_addr[4 * i + 1];
752 		pbuf->params.rawawb.ramdata[2 * i].b = lsb & 0x3FFFF;
753 		pbuf->params.rawawb.ramdata[2 * i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
754 		pbuf->params.rawawb.ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
755 		pbuf->params.rawawb.ramdata[2 * i].wp = (msb & 0x01C00000) >> 22;
756 
757 		lsb = ((raw_addr[4 * i + 2] & 0x3FFFFFF) << 6) | ((raw_addr[4 * i + 1] & 0xFC000000) >> 26);
758 		msb = ((raw_addr[4 * i + 3] & 0x3FFFFFF) << 6) | ((raw_addr[4 * i + 2] & 0xFC000000) >> 26);
759 		pbuf->params.rawawb.ramdata[2 * i + 1].b = lsb & 0x3FFFF;
760 		pbuf->params.rawawb.ramdata[2 * i + 1].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
761 		pbuf->params.rawawb.ramdata[2 * i + 1].r = (msb & 0x3FFFF0) >> 4;
762 		pbuf->params.rawawb.ramdata[2 * i + 1].wp = (msb & 0x01C00000) >> 22;
763 	}
764 
765 	lsb = raw_addr[4 * i];
766 	msb = raw_addr[4 * i + 1];
767 	pbuf->params.rawawb.ramdata[2 * i].b = lsb & 0x3FFFF;
768 	pbuf->params.rawawb.ramdata[2 * i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
769 	pbuf->params.rawawb.ramdata[2 * i].r = (msb & 0x3FFFF0) >> 4;
770 	pbuf->params.rawawb.ramdata[2 * i].wp = (msb & 0x01C00000) >> 22;
771 
772 OUT:
773 	value = rkisp_read(stats_vdev->dev, ISP_RAWAWB_CTRL, true);
774 	value |= ISP2X_3A_MEAS_DONE;
775 	rkisp_write(stats_vdev->dev, ISP_RAWAWB_CTRL, value, true);
776 }
777 
778 static void
rkisp_stats_get_siaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)779 rkisp_stats_get_siaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
780 			      struct rkisp_isp2x_stat_buffer *pbuf)
781 {
782 	struct isp2x_siaf_stat *af;
783 	u32 *ddr_addr;
784 	u32 rd_buf_idx;
785 
786 	if (!pbuf)
787 		return;
788 
789 	pbuf->meas_type |= ISP2X_STAT_SIAF;
790 
791 	af = &pbuf->params.siaf;
792 	rd_buf_idx = stats_vdev->rd_buf_idx;
793 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C40;
794 	af->win[0].sum = ddr_addr[0];
795 	af->win[0].lum = ddr_addr[4];
796 	af->win[1].sum = ddr_addr[1];
797 	af->win[1].lum = ddr_addr[5];
798 	af->win[2].sum = ddr_addr[2];
799 	af->win[2].lum = ddr_addr[6];
800 }
801 
802 static void
rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)803 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
804 			       struct rkisp_isp2x_stat_buffer *pbuf)
805 {
806 	u32 *ddr_addr;
807 	struct isp2x_rawaf_stat *af;
808 	u32 value, rd_buf_idx;
809 	int i;
810 
811 	if (!pbuf)
812 		goto OUT;
813 
814 	af = &pbuf->params.rawaf;
815 	pbuf->meas_type |= ISP2X_STAT_RAWAF;
816 
817 	rd_buf_idx = stats_vdev->rd_buf_idx;
818 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x1C00;
819 
820 	af->afm_sum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_A, true);
821 	af->afm_sum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_SUM_B, true);
822 	af->afm_lum[0] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_A, true);
823 	af->afm_lum[1] = rkisp_read(stats_vdev->dev, ISP_RAWAF_LUM_B, true);
824 	af->int_state = rkisp_read(stats_vdev->dev, ISP_RAWAF_INT_STATE, true);
825 
826 	for (i = 0; i < ISP2X_RAWAF_SUMDATA_ROW * ISP2X_RAWAF_SUMDATA_COLUMN; i++)
827 		af->ramdata[i] = ddr_addr[i];
828 
829 OUT:
830 	value = rkisp_read(stats_vdev->dev, ISP_RAWAF_CTRL, true);
831 	value |= ISP2X_3A_MEAS_DONE;
832 	rkisp_write(stats_vdev->dev, ISP_RAWAF_CTRL, value, true);
833 	rkisp_write(stats_vdev->dev, ISP_RAWAF_INT_STATE, 0, true);
834 }
835 
836 static void
rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)837 rkisp_stats_get_yuvae_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
838 			       struct rkisp_isp2x_stat_buffer *pbuf)
839 {
840 	u32 *ddr_addr;
841 	u32 value, rd_buf_idx;
842 	int i;
843 
844 	if (!pbuf)
845 		goto OUT;
846 
847 	pbuf->meas_type |= ISP2X_STAT_YUVAE;
848 
849 	rd_buf_idx = stats_vdev->rd_buf_idx;
850 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2B00;
851 	for (i = 0; i < ISP2X_YUVAE_MEAN_NUM / 4; i++) {
852 		value = ddr_addr[i];
853 		pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
854 		pbuf->params.yuvae.mean[4 * i + 1] = ISP2X_EXP_GET_MEAN_xy1(value);
855 		pbuf->params.yuvae.mean[4 * i + 2] = ISP2X_EXP_GET_MEAN_xy2(value);
856 		pbuf->params.yuvae.mean[4 * i + 3] = ISP2X_EXP_GET_MEAN_xy3(value);
857 	}
858 	value = ddr_addr[i];
859 	pbuf->params.yuvae.mean[4 * i + 0] = ISP2X_EXP_GET_MEAN_xy0(value);
860 
861 	for (i = 0; i < ISP2X_YUVAE_SUBWIN_NUM; i++)
862 		pbuf->params.yuvae.ro_yuvae_sumy[i] =
863 			rkisp_read(stats_vdev->dev, ISP_YUVAE_WND1_SUMY + 4 * i, true);
864 
865 OUT:
866 	value = rkisp_read(stats_vdev->dev, ISP_YUVAE_CTRL, true);
867 	value |= ISP2X_3A_MEAS_DONE;
868 	rkisp_write(stats_vdev->dev, ISP_YUVAE_CTRL, value, true);
869 }
870 
871 static void
rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)872 rkisp_stats_get_sihst_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
873 			       struct rkisp_isp2x_stat_buffer *pbuf)
874 {
875 	u32 *ddr_addr;
876 	u32 rd_buf_idx;
877 	u32 value;
878 	int i, j;
879 
880 	if (!pbuf)
881 		return;
882 
883 	pbuf->meas_type |= ISP2X_STAT_SIHST;
884 
885 	rd_buf_idx = stats_vdev->rd_buf_idx;
886 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x2C00;
887 	for (i = 0; i < ISP2X_SIHIST_WIN_NUM; i++) {
888 		ddr_addr += i * 0x40;
889 		for (j = 0; j < ISP2X_SIHIST_BIN_N_MAX / 2; j++) {
890 			value = ddr_addr[j];
891 			pbuf->params.sihst.win_stat[i].hist_bins[2 * j] =
892 				ISP2X_HIST_GET_BIN0(value);
893 			pbuf->params.sihst.win_stat[i].hist_bins[2 * j + 1] =
894 				ISP2X_HIST_GET_BIN1(value);
895 		}
896 	}
897 }
898 
899 static void
rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no)900 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
901 				  struct isp2x_rawaebig_stat *ae, u32 blk_no)
902 {
903 	u32 *ddr_addr;
904 	u32 value, rd_buf_idx;
905 	u32 addr;
906 	int i;
907 
908 	rd_buf_idx = stats_vdev->rd_buf_idx;
909 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr;
910 
911 	switch (blk_no) {
912 	case 1:
913 		addr = RAWAE_BIG2_BASE;
914 		ddr_addr += 0x0390 >> 2;
915 		break;
916 	case 2:
917 		addr = RAWAE_BIG3_BASE;
918 		ddr_addr += 0x0720 >> 2;
919 		break;
920 	default:
921 		addr = RAWAE_BIG1_BASE;
922 		break;
923 	}
924 
925 	if (!ae)
926 		goto OUT;
927 
928 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
929 		ae->sumr[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMR + i * 4, true);
930 
931 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
932 		ae->sumg[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMG + i * 4, true);
933 
934 	for (i = 0; i < ISP2X_RAWAEBIG_SUBWIN_NUM; i++)
935 		ae->sumb[i] = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_WND1_SUMB + i * 4, true);
936 
937 	for (i = 0; i < ISP2X_RAWAEBIG_MEAN_NUM; i++) {
938 		value = ddr_addr[i];
939 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
940 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
941 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
942 	}
943 
944 OUT:
945 	value = rkisp_read(stats_vdev->dev, addr + RAWAE_BIG_CTRL, true);
946 	value |= ISP2X_3A_MEAS_DONE;
947 	rkisp_write(stats_vdev->dev, addr + RAWAE_BIG_CTRL, value, true);
948 }
949 
950 static void
rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no)951 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
952 				   struct isp2x_rawhistbig_stat *hst, u32 blk_no)
953 {
954 	u32 *ddr_addr;
955 	u32 value, rd_buf_idx;
956 	u32 addr;
957 	int i;
958 
959 	rd_buf_idx = stats_vdev->rd_buf_idx;
960 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00;
961 
962 	switch (blk_no) {
963 	case 1:
964 		addr = ISP_RAWHIST_BIG2_BASE;
965 		ddr_addr += 0x0800 >> 2;
966 		break;
967 	case 2:
968 		addr = ISP_RAWHIST_BIG3_BASE;
969 		ddr_addr += 0x0C00 >> 2;
970 		break;
971 	default:
972 		addr = ISP_RAWHIST_BIG1_BASE;
973 		break;
974 	}
975 
976 	if (!hst)
977 		goto OUT;
978 
979 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
980 		hst->hist_bin[i] = ddr_addr[i];
981 
982 OUT:
983 	value = rkisp_read(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, true);
984 	value |= ISP2X_3A_MEAS_DONE;
985 	rkisp_write(stats_vdev->dev, addr + ISP_RAWHIST_BIG_CTRL, value, true);
986 }
987 
988 static void
rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)989 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
990 				struct rkisp_isp2x_stat_buffer *pbuf)
991 {
992 	if (!pbuf)
993 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1);
994 	else
995 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae1, 1);
996 }
997 
998 static void
rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)999 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1000 				 struct rkisp_isp2x_stat_buffer *pbuf)
1001 {
1002 	if (!pbuf)
1003 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1);
1004 	else
1005 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist1, 1);
1006 }
1007 
1008 static void
rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1009 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1010 				struct rkisp_isp2x_stat_buffer *pbuf)
1011 {
1012 	if (!pbuf)
1013 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2);
1014 	else
1015 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae2, 2);
1016 }
1017 
1018 static void
rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1019 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1020 				 struct rkisp_isp2x_stat_buffer *pbuf)
1021 {
1022 	if (!pbuf)
1023 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2);
1024 	else
1025 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist2, 2);
1026 }
1027 
1028 static void
rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1029 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1030 				struct rkisp_isp2x_stat_buffer *pbuf)
1031 {
1032 	if (!pbuf)
1033 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0);
1034 	else
1035 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, &pbuf->params.rawae3, 0);
1036 }
1037 
1038 static void
rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1039 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1040 				 struct rkisp_isp2x_stat_buffer *pbuf)
1041 {
1042 	if (!pbuf)
1043 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0);
1044 	else
1045 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, &pbuf->params.rawhist3, 0);
1046 }
1047 
1048 static void
rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1049 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1050 				   struct rkisp_isp2x_stat_buffer *pbuf)
1051 {
1052 	struct isp2x_rawaelite_stat *ae;
1053 	u32 *ddr_addr;
1054 	u32 value, rd_buf_idx;
1055 	int i;
1056 
1057 	if (!pbuf)
1058 		goto OUT;
1059 
1060 	ae = &pbuf->params.rawae0;
1061 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
1062 	if ((value & ISP2X_3A_MEAS_DONE) == 0)
1063 		return;
1064 
1065 	rd_buf_idx = stats_vdev->rd_buf_idx;
1066 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0AB0;
1067 	for (i = 0; i < ISP2X_RAWAELITE_MEAN_NUM; i++) {
1068 		value = ddr_addr[i];
1069 		ae->data[i].channelg_xy = ISP2X_RAWAEBIG_GET_MEAN_G(value);
1070 		ae->data[i].channelb_xy = ISP2X_RAWAEBIG_GET_MEAN_B(value);
1071 		ae->data[i].channelr_xy = ISP2X_RAWAEBIG_GET_MEAN_R(value);
1072 	}
1073 
1074 OUT:
1075 	value = rkisp_read(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, true);
1076 	value |= ISP2X_3A_MEAS_DONE;
1077 	rkisp_write(stats_vdev->dev, ISP_RAWAE_LITE_CTRL, value, true);
1078 }
1079 
1080 static void
rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp2x_stat_buffer * pbuf)1081 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
1082 				    struct rkisp_isp2x_stat_buffer *pbuf)
1083 {
1084 	struct isp2x_rawhistlite_stat *hst;
1085 	u32 *ddr_addr;
1086 	u32 value, rd_buf_idx;
1087 	int i;
1088 
1089 	if (!pbuf)
1090 		goto OUT;
1091 
1092 	hst = &pbuf->params.rawhist0;
1093 
1094 	rd_buf_idx = stats_vdev->rd_buf_idx;
1095 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + 0x0C00 + 0x0400;
1096 
1097 	for (i = 0; i < ISP2X_HIST_BIN_N_MAX; i++)
1098 		hst->hist_bin[i] = ddr_addr[i];
1099 
1100 OUT:
1101 	value = rkisp_read(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, true);
1102 	value |= ISP2X_3A_MEAS_DONE;
1103 	rkisp_write(stats_vdev->dev, ISP_RAWHIST_LITE_CTRL, value, true);
1104 }
1105 
1106 static struct rkisp_stats_v2x_ops __maybe_unused rkisp_stats_ddr_ops_v2x = {
1107 	.get_siawb_meas = rkisp_stats_get_siawb_meas_ddr,
1108 	.get_rawawb_meas = rkisp_stats_get_rawawb_meas_ddr,
1109 	.get_siaf_meas = rkisp_stats_get_siaf_meas_ddr,
1110 	.get_rawaf_meas = rkisp_stats_get_rawaf_meas_ddr,
1111 	.get_yuvae_meas = rkisp_stats_get_yuvae_meas_ddr,
1112 	.get_sihst_meas = rkisp_stats_get_sihst_meas_ddr,
1113 	.get_rawae0_meas = rkisp_stats_get_rawaelite_meas_ddr,
1114 	.get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_ddr,
1115 	.get_rawae1_meas = rkisp_stats_get_rawae1_meas_ddr,
1116 	.get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_ddr,
1117 	.get_rawae2_meas = rkisp_stats_get_rawae2_meas_ddr,
1118 	.get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_ddr,
1119 	.get_rawae3_meas = rkisp_stats_get_rawae3_meas_ddr,
1120 	.get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_ddr,
1121 	.get_bls_stats = rkisp_stats_get_bls_stats,
1122 	.get_tmo_stats = rkisp_stats_get_tmo_stats,
1123 	.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
1124 };
1125 
1126 static void
rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)1127 rkisp_stats_send_meas_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
1128 			  struct rkisp_isp_readout_work *meas_work)
1129 {
1130 	unsigned int cur_frame_id = -1;
1131 	struct rkisp_isp2x_stat_buffer *cur_stat_buf = NULL;
1132 	struct rkisp_buffer *cur_buf = NULL;
1133 	struct rkisp_stats_v2x_ops *ops =
1134 		(struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops;
1135 
1136 	cur_frame_id = meas_work->frame_id;
1137 	spin_lock(&stats_vdev->rd_lock);
1138 	/* get one empty buffer */
1139 	if (!list_empty(&stats_vdev->stat)) {
1140 		cur_buf = list_first_entry(&stats_vdev->stat,
1141 					   struct rkisp_buffer, queue);
1142 		list_del(&cur_buf->queue);
1143 	}
1144 	spin_unlock(&stats_vdev->rd_lock);
1145 
1146 	if (cur_buf) {
1147 		cur_stat_buf =
1148 			(struct rkisp_isp2x_stat_buffer *)(cur_buf->vaddr[0]);
1149 		cur_stat_buf->frame_id = cur_frame_id;
1150 	}
1151 
1152 	if (meas_work->isp_ris & ISP2X_SIAWB_DONE) {
1153 		ops->get_siawb_meas(stats_vdev, cur_stat_buf);
1154 
1155 		if (cur_stat_buf)
1156 			cur_stat_buf->meas_type |= ISP2X_STAT_SIAWB;
1157 	}
1158 
1159 	if (meas_work->isp_ris & ISP2X_SIAF_FIN) {
1160 		ops->get_siaf_meas(stats_vdev, cur_stat_buf);
1161 		if (cur_stat_buf)
1162 			cur_stat_buf->meas_type |= ISP2X_STAT_SIAF;
1163 	}
1164 
1165 	if (meas_work->isp_ris & ISP2X_AFM_SUM_OF)
1166 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1167 			  "ISP2X_AFM_SUM_OF\n");
1168 
1169 	if (meas_work->isp_ris & ISP2X_AFM_LUM_OF)
1170 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1171 			  "ISP2X_AFM_LUM_OF\n");
1172 
1173 	if (meas_work->isp_ris & ISP2X_YUVAE_END) {
1174 		ops->get_yuvae_meas(stats_vdev, cur_stat_buf);
1175 		if (cur_stat_buf)
1176 			cur_stat_buf->meas_type |= ISP2X_STAT_YUVAE;
1177 	}
1178 
1179 	if (meas_work->isp_ris & ISP2X_SIHST_RDY) {
1180 		ops->get_sihst_meas(stats_vdev, cur_stat_buf);
1181 		if (cur_stat_buf)
1182 			cur_stat_buf->meas_type |= ISP2X_STAT_SIHST;
1183 	}
1184 
1185 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAWB) {
1186 		ops->get_rawawb_meas(stats_vdev, cur_stat_buf);
1187 		if (cur_stat_buf)
1188 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAWB;
1189 	}
1190 
1191 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF) {
1192 		ops->get_rawaf_meas(stats_vdev, cur_stat_buf);
1193 		if (cur_stat_buf)
1194 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAF;
1195 	}
1196 
1197 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_SUM)
1198 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1199 			  "ISP2X_3A_RAWAF_SUM\n");
1200 
1201 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAF_LUM)
1202 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1203 			  "ISP2X_3A_RAWAF_LUM\n");
1204 
1205 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_BIG) {
1206 		ops->get_rawae3_meas(stats_vdev, cur_stat_buf);
1207 		if (cur_stat_buf)
1208 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE3;
1209 	}
1210 
1211 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_BIG) {
1212 		ops->get_rawhst3_meas(stats_vdev, cur_stat_buf);
1213 		if (cur_stat_buf)
1214 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST3;
1215 	}
1216 
1217 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH0) {
1218 		ops->get_rawae0_meas(stats_vdev, cur_stat_buf);
1219 		if (cur_stat_buf)
1220 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE0;
1221 	}
1222 
1223 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH1) {
1224 		ops->get_rawae1_meas(stats_vdev, cur_stat_buf);
1225 		if (cur_stat_buf)
1226 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE1;
1227 	}
1228 
1229 	if (meas_work->isp3a_ris & ISP2X_3A_RAWAE_CH2) {
1230 		ops->get_rawae2_meas(stats_vdev, cur_stat_buf);
1231 		if (cur_stat_buf)
1232 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWAE2;
1233 	}
1234 
1235 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH0) {
1236 		ops->get_rawhst0_meas(stats_vdev, cur_stat_buf);
1237 		if (cur_stat_buf)
1238 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST0;
1239 	}
1240 
1241 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH1) {
1242 		ops->get_rawhst1_meas(stats_vdev, cur_stat_buf);
1243 		if (cur_stat_buf)
1244 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST1;
1245 	}
1246 
1247 	if (meas_work->isp3a_ris & ISP2X_3A_RAWHIST_CH2) {
1248 		ops->get_rawhst2_meas(stats_vdev, cur_stat_buf);
1249 		if (cur_stat_buf)
1250 			cur_stat_buf->meas_type |= ISP2X_STAT_RAWHST2;
1251 	}
1252 
1253 	if (meas_work->isp_ris & ISP2X_FRAME) {
1254 		ops->get_bls_stats(stats_vdev, cur_stat_buf);
1255 		ops->get_tmo_stats(stats_vdev, cur_stat_buf);
1256 		ops->get_dhaz_stats(stats_vdev, cur_stat_buf);
1257 	}
1258 
1259 	if (cur_buf) {
1260 		bool reg_withstream = false;
1261 		struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd);
1262 
1263 		vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
1264 				      sizeof(struct rkisp_isp2x_stat_buffer));
1265 		cur_buf->vb.sequence = cur_frame_id;
1266 		cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
1267 		v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_GET_REG_WITHSTREAM, &reg_withstream);
1268 		if (reg_withstream) {
1269 			struct rkisp_isp2x_stat_buffer *tmp_statsbuf;
1270 
1271 			tmp_statsbuf = (struct rkisp_isp2x_stat_buffer *)stats_vdev->tmp_statsbuf.vaddr;
1272 			if (tmp_statsbuf)
1273 				memcpy(tmp_statsbuf, cur_stat_buf, sizeof(*cur_stat_buf));
1274 		}
1275 		vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1276 	}
1277 }
1278 
1279 static void
rkisp_stats_clr_3a_isr(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1280 rkisp_stats_clr_3a_isr(struct rkisp_isp_stats_vdev *stats_vdev,
1281 		u32 isp_ris, u32 isp3a_ris)
1282 {
1283 	struct rkisp_stats_v2x_ops *ops =
1284 		(struct rkisp_stats_v2x_ops *)stats_vdev->priv_ops;
1285 
1286 	if (isp_ris & ISP2X_SIAWB_DONE)
1287 		ops->get_siawb_meas(stats_vdev, NULL);
1288 
1289 	if (isp_ris & ISP2X_SIAF_FIN)
1290 		ops->get_siaf_meas(stats_vdev, NULL);
1291 
1292 	if (isp_ris & ISP2X_YUVAE_END)
1293 		ops->get_yuvae_meas(stats_vdev, NULL);
1294 
1295 	if (isp_ris & ISP2X_SIHST_RDY)
1296 		ops->get_sihst_meas(stats_vdev, NULL);
1297 
1298 	if (isp3a_ris & ISP2X_3A_RAWAWB)
1299 		ops->get_rawawb_meas(stats_vdev, NULL);
1300 
1301 	if (isp3a_ris & ISP2X_3A_RAWAF)
1302 		ops->get_rawaf_meas(stats_vdev, NULL);
1303 
1304 	if (isp3a_ris & ISP2X_3A_RAWAE_BIG)
1305 		ops->get_rawae3_meas(stats_vdev, NULL);
1306 
1307 	if (isp3a_ris & ISP2X_3A_RAWHIST_BIG)
1308 		ops->get_rawhst3_meas(stats_vdev, NULL);
1309 
1310 	if (isp3a_ris & ISP2X_3A_RAWAE_CH0)
1311 		ops->get_rawae0_meas(stats_vdev, NULL);
1312 
1313 	if (isp3a_ris & ISP2X_3A_RAWAE_CH1)
1314 		ops->get_rawae1_meas(stats_vdev, NULL);
1315 
1316 	if (isp3a_ris & ISP2X_3A_RAWAE_CH2)
1317 		ops->get_rawae2_meas(stats_vdev, NULL);
1318 
1319 	if (isp3a_ris & ISP2X_3A_RAWHIST_CH0)
1320 		ops->get_rawhst0_meas(stats_vdev, NULL);
1321 
1322 	if (isp3a_ris & ISP2X_3A_RAWHIST_CH1)
1323 		ops->get_rawhst1_meas(stats_vdev, NULL);
1324 
1325 	if (isp3a_ris & ISP2X_3A_RAWHIST_CH2)
1326 		ops->get_rawhst2_meas(stats_vdev, NULL);
1327 }
1328 
1329 static void
rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1330 rkisp_stats_isr_v2x(struct rkisp_isp_stats_vdev *stats_vdev,
1331 		    u32 isp_ris, u32 isp3a_ris)
1332 {
1333 	struct rkisp_device *dev = stats_vdev->dev;
1334 	u32 isp_mis_tmp = 0;
1335 	struct rkisp_isp_readout_work work;
1336 	u32 cur_frame_id;
1337 	u32 iq_isr_mask = ISP2X_SIAWB_DONE | ISP2X_SIAF_FIN |
1338 		ISP2X_YUVAE_END | ISP2X_SIHST_RDY | ISP2X_AFM_SUM_OF | ISP2X_AFM_LUM_OF;
1339 	u32 iq_3a_mask = 0;
1340 	u32 hdl_ris, hdl_3aris, unhdl_ris, unhdl_3aris;
1341 	u32 wr_buf_idx;
1342 	u32 temp_isp_ris, temp_isp3a_ris;
1343 
1344 	rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
1345 #ifdef LOG_ISR_EXE_TIME
1346 	ktime_t in_t = ktime_get();
1347 #endif
1348 	if (IS_HDR_RDBK(dev->hdr.op_mode))
1349 		iq_3a_mask = ISP2X_3A_RAWAE_BIG;
1350 	spin_lock(&stats_vdev->irq_lock);
1351 
1352 	temp_isp_ris = rkisp_read(stats_vdev->dev, ISP_ISP_RIS, true);
1353 	temp_isp3a_ris = rkisp_read(stats_vdev->dev, ISP_ISP3A_RIS, true);
1354 	isp_mis_tmp = isp_ris & iq_isr_mask;
1355 	if (isp_mis_tmp) {
1356 		rkisp_write(stats_vdev->dev, ISP_ISP_ICR, isp_mis_tmp, true);
1357 
1358 		isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP_MIS, true);
1359 		if (isp_mis_tmp)
1360 			v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1361 				 "isp icr 3A info err: 0x%x 0x%x\n",
1362 				 isp_mis_tmp, isp_ris);
1363 	}
1364 
1365 	isp_mis_tmp = isp3a_ris & iq_3a_mask;
1366 	if (isp_mis_tmp) {
1367 		rkisp_write(stats_vdev->dev, ISP_ISP3A_ICR, isp_mis_tmp, true);
1368 
1369 		isp_mis_tmp &= rkisp_read(stats_vdev->dev, ISP_ISP3A_MIS, true);
1370 		if (isp_mis_tmp)
1371 			v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1372 				 "isp3A icr 3A info err: 0x%x 0x%x\n",
1373 				 isp_mis_tmp, isp_ris);
1374 	}
1375 
1376 	if (!stats_vdev->streamon)
1377 		goto unlock;
1378 
1379 	if ((isp_ris & ISP2X_FRAME) && stats_vdev->rd_stats_from_ddr) {
1380 		wr_buf_idx = stats_vdev->wr_buf_idx;
1381 		stats_vdev->rd_buf_idx = wr_buf_idx;
1382 
1383 		wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
1384 		stats_vdev->wr_buf_idx = wr_buf_idx;
1385 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1386 			    RKISP_RD_STATS_BUF_SIZE, false);
1387 		rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1388 			    stats_vdev->stats_buf[wr_buf_idx].dma_addr, false);
1389 		rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1390 			       SW_3A_DDR_WRITE_EN, false);
1391 	}
1392 
1393 	unhdl_ris = 0;
1394 	unhdl_3aris = 0;
1395 	if (stats_vdev->rdbk_mode) {
1396 		hdl_ris = isp_ris & ~stats_vdev->isp_rdbk;
1397 		hdl_3aris = isp3a_ris & ~stats_vdev->isp3a_rdbk;
1398 		unhdl_ris = isp_ris & stats_vdev->isp_rdbk;
1399 		unhdl_3aris = isp3a_ris & stats_vdev->isp3a_rdbk;
1400 		stats_vdev->isp_rdbk |= hdl_ris;
1401 		stats_vdev->isp3a_rdbk |= hdl_3aris;
1402 	}
1403 
1404 	if (isp_ris & CIF_ISP_FRAME) {
1405 		work.readout = RKISP_ISP_READOUT_MEAS;
1406 		work.frame_id = cur_frame_id;
1407 		work.isp_ris = temp_isp_ris | isp_ris;
1408 		work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
1409 		work.timestamp = ktime_get_ns();
1410 
1411 		if (!IS_HDR_RDBK(dev->hdr.op_mode)) {
1412 			if (!kfifo_is_full(&stats_vdev->rd_kfifo))
1413 				kfifo_in(&stats_vdev->rd_kfifo,
1414 					 &work, sizeof(work));
1415 			else
1416 				v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1417 					 "stats kfifo is full\n");
1418 
1419 			tasklet_schedule(&stats_vdev->rd_tasklet);
1420 		} else {
1421 			rkisp_stats_send_meas_v2x(stats_vdev, &work);
1422 		}
1423 	}
1424 
1425 	/*
1426 	 * The last time that rx perform 'back read' don't clear done flag
1427 	 * in advance, otherwise the statistics will be abnormal.
1428 	 */
1429 	if (!(isp3a_ris & ISP2X_3A_RAWAE_BIG) ||
1430 	    stats_vdev->dev->params_vdev.rdbk_times > 1)
1431 		rkisp_stats_clr_3a_isr(stats_vdev, unhdl_ris, unhdl_3aris);
1432 
1433 #ifdef LOG_ISR_EXE_TIME
1434 	if (isp_ris & iq_isr_mask) {
1435 		unsigned int diff_us =
1436 		    ktime_to_us(ktime_sub(ktime_get(), in_t));
1437 
1438 		if (diff_us > g_longest_isr_time)
1439 			g_longest_isr_time = diff_us;
1440 
1441 		v4l2_info(stats_vdev->vnode.vdev.v4l2_dev,
1442 			  "isp_isr time %d %d\n", diff_us, g_longest_isr_time);
1443 	}
1444 #endif
1445 
1446 unlock:
1447 	spin_unlock(&stats_vdev->irq_lock);
1448 }
1449 
1450 static void
rkisp_stats_rdbk_enable_v2x(struct rkisp_isp_stats_vdev * stats_vdev,bool en)1451 rkisp_stats_rdbk_enable_v2x(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
1452 {
1453 	if (!en) {
1454 		stats_vdev->isp_rdbk = 0;
1455 		stats_vdev->isp3a_rdbk = 0;
1456 	}
1457 
1458 	stats_vdev->rdbk_mode = en;
1459 }
1460 
1461 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
1462 	.isr_hdl = rkisp_stats_isr_v2x,
1463 	.send_meas = rkisp_stats_send_meas_v2x,
1464 	.rdbk_enable = rkisp_stats_rdbk_enable_v2x,
1465 };
1466 
rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev * stats_vdev)1467 void rkisp_stats_first_ddr_config_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
1468 {
1469 	bool reg_withstream = false;
1470 	struct v4l2_subdev *sd = v4l2_get_subdev_hostdata(&stats_vdev->dev->br_dev.sd);
1471 
1472 	if (stats_vdev->rd_stats_from_ddr) {
1473 		stats_vdev->wr_buf_idx = 0;
1474 		stats_vdev->rd_buf_idx = 0;
1475 
1476 		rkisp_write(stats_vdev->dev, MI_DBR_WR_SIZE,
1477 			    RKISP_RD_STATS_BUF_SIZE, false);
1478 		rkisp_write(stats_vdev->dev, MI_SWS_3A_WR_BASE,
1479 			    stats_vdev->stats_buf[0].dma_addr, false);
1480 		rkisp_set_bits(stats_vdev->dev, CTRL_SWS_CFG, SW_3A_DDR_WRITE_EN,
1481 			       SW_3A_DDR_WRITE_EN, false);
1482 	}
1483 
1484 	v4l2_subdev_call(sd, core, ioctl, RKISP_ISPP_CMD_GET_REG_WITHSTREAM, &reg_withstream);
1485 	if (reg_withstream) {
1486 		stats_vdev->tmp_statsbuf.is_need_vaddr = true;
1487 		stats_vdev->tmp_statsbuf.size = sizeof(struct rkisp_isp2x_stat_buffer);
1488 		rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->tmp_statsbuf);
1489 	}
1490 }
1491 
rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev * stats_vdev)1492 void rkisp_init_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
1493 {
1494 	stats_vdev->vdev_fmt.fmt.meta.dataformat =
1495 		V4L2_META_FMT_RK_ISP1_STAT_3A;
1496 	stats_vdev->vdev_fmt.fmt.meta.buffersize =
1497 		sizeof(struct rkisp_isp2x_stat_buffer);
1498 
1499 	stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
1500 	stats_vdev->priv_ops = &rkisp_stats_reg_ops_v2x;
1501 
1502 #ifdef RKISP_RD_STATS_FROM_DDR
1503 	{
1504 		int i;
1505 
1506 		stats_vdev->priv_ops = &rkisp_stats_ddr_ops_v2x;
1507 		stats_vdev->rd_stats_from_ddr = true;
1508 		stats_vdev->rd_buf_idx = 0;
1509 		stats_vdev->wr_buf_idx = 0;
1510 		for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
1511 			stats_vdev->stats_buf[i].is_need_vaddr = true;
1512 			stats_vdev->stats_buf[i].size = RKISP_RD_STATS_BUF_SIZE;
1513 			rkisp_alloc_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1514 		}
1515 	}
1516 #endif
1517 }
1518 
rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev * stats_vdev)1519 void rkisp_uninit_stats_vdev_v2x(struct rkisp_isp_stats_vdev *stats_vdev)
1520 {
1521 	int i;
1522 
1523 	for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++)
1524 		rkisp_free_buffer(stats_vdev->dev, &stats_vdev->stats_buf[i]);
1525 }
1526