• 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_v3x.h"
14 
15 #define ISP2X_HIST_GET_BIN0(x)		((x) & 0xFFFF)
16 #define ISP2X_HIST_GET_BIN1(x)		(((x) >> 16) & 0xFFFF)
17 
18 #define ISP3X_3A_MEAS_DONE		BIT(31)
19 
20 #define ISP2X_EXP_GET_MEAN_xy0(x)	((x) & 0xFF)
21 #define ISP2X_EXP_GET_MEAN_xy1(x)	(((x) >> 8) & 0xFF)
22 #define ISP2X_EXP_GET_MEAN_xy2(x)	(((x) >> 16) & 0xFF)
23 #define ISP2X_EXP_GET_MEAN_xy3(x)	(((x) >> 24) & 0xFF)
24 
25 #define ISP3X_RAWAEBIG_GET_MEAN_G(x)	((x) & 0xFFF)
26 #define ISP3X_RAWAEBIG_GET_MEAN_B(x)	(((x) >> 12) & 0x3FF)
27 #define ISP3X_RAWAEBIG_GET_MEAN_R(x)	(((x) >> 22) & 0x3FF)
28 
29 #define ISP2X_RAWAF_INT_LINE0_EN	BIT(27)
30 
isp3_stats_read(struct rkisp_isp_stats_vdev * stats_vdev,u32 addr,u32 id)31 static u32 isp3_stats_read(struct rkisp_isp_stats_vdev *stats_vdev,
32 			   u32 addr, u32 id)
33 {
34 	u32 val;
35 
36 	if (id == ISP3_LEFT)
37 		val = rkisp_read(stats_vdev->dev, addr, true);
38 	else
39 		val = rkisp_next_read(stats_vdev->dev, addr, true);
40 	return val;
41 }
42 
isp3_stats_write(struct rkisp_isp_stats_vdev * stats_vdev,u32 addr,u32 value,u32 id)43 static void isp3_stats_write(struct rkisp_isp_stats_vdev *stats_vdev,
44 			     u32 addr, u32 value, u32 id)
45 {
46 	if (id == ISP3_LEFT)
47 		rkisp_write(stats_vdev->dev, addr, value, true);
48 	else
49 		rkisp_next_write(stats_vdev->dev, addr, value, true);
50 }
51 
52 static int
rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)53 rkisp_stats_get_rawawb_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
54 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
55 {
56 	u64 msb, lsb;
57 	u32 value, ctrl;
58 	int i;
59 
60 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL, id);
61 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
62 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
63 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
64 		return -ENODATA;
65 	}
66 
67 	if (!pbuf)
68 		goto out;
69 
70 	pbuf->meas_type |= ISP3X_STAT_RAWAWB;
71 	for (i = 0; i < ISP3X_RAWAWB_HSTBIN_NUM / 2; i++) {
72 		value = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_Y_HIST01 + 4 * i, id);
73 		pbuf->params.rawawb.ro_yhist_bin[2 * i] = value & 0xFFFF;
74 		pbuf->params.rawawb.ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
75 	}
76 
77 	for (i = 0; i < ISP3X_RAWAWB_SUM_NUM; i++) {
78 		pbuf->params.rawawb.ro_rawawb_sum_rgain_nor[i] =
79 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_RGAIN_NOR_0 + 0x30 * i, id);
80 		pbuf->params.rawawb.ro_rawawb_sum_bgain_nor[i] =
81 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_BGAIN_NOR_0 + 0x30 * i, id);
82 		pbuf->params.rawawb.ro_rawawb_wp_num_nor[i] =
83 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WP_NUM_NOR_0 + 0x30 * i, id);
84 		pbuf->params.rawawb.ro_rawawb_sum_rgain_big[i] =
85 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_RGAIN_BIG_0 + 0x30 * i, id);
86 		pbuf->params.rawawb.ro_rawawb_sum_bgain_big[i] =
87 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_BGAIN_BIG_0 + 0x30 * i, id);
88 		pbuf->params.rawawb.ro_rawawb_wp_num_big[i] =
89 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WP_NUM_BIG_0 + 0x30 * i, id);
90 
91 		pbuf->params.rawawb.ro_wp_num2[i] =
92 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WPNUM2_0 + 4 * i, id);
93 	}
94 
95 	for (i = 0; i < ISP3X_RAWAWB_MULWD_NUM; i++) {
96 		pbuf->params.rawawb.ro_sum_r_nor_multiwindow[i] =
97 			isp3_stats_read(stats_vdev,
98 					ISP3X_RAWAWB_SUM_R_NOR_MULTIWINDOW0 + 0x30 * i, id);
99 		pbuf->params.rawawb.ro_sum_b_nor_multiwindow[i] =
100 			isp3_stats_read(stats_vdev,
101 					ISP3X_RAWAWB_SUM_B_NOR_MULTIWINDOW0 + 0x30 * i, id);
102 		pbuf->params.rawawb.ro_wp_nm_nor_multiwindow[i] =
103 			isp3_stats_read(stats_vdev,
104 					ISP3X_RAWAWB_WP_NM_NOR_MULTIWINDOW0 + 0x30 * i, id);
105 		pbuf->params.rawawb.ro_sum_r_big_multiwindow[i] =
106 			isp3_stats_read(stats_vdev,
107 					ISP3X_RAWAWB_SUM_R_BIG_MULTIWINDOW0 + 0x30 * i, id);
108 		pbuf->params.rawawb.ro_sum_b_big_multiwindow[i] =
109 			isp3_stats_read(stats_vdev,
110 					ISP3X_RAWAWB_SUM_B_BIG_MULTIWINDOW0 + 0x30 * i, id);
111 		pbuf->params.rawawb.ro_wp_nm_big_multiwindow[i] =
112 			isp3_stats_read(stats_vdev,
113 					ISP3X_RAWAWB_WP_NM_BIG_MULTIWINDOW0 + 0x30 * i, id);
114 	}
115 
116 	for (i = 0; i < ISP3X_RAWAWB_EXCL_STAT_NUM; i++) {
117 		pbuf->params.rawawb.ro_sum_r_exc[i] =
118 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_R_EXC0 + 0x10 * i, id);
119 		pbuf->params.rawawb.ro_sum_b_exc[i] =
120 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_SUM_B_EXC0 + 0x10 * i, id);
121 		pbuf->params.rawawb.ro_wp_nm_exc[i] =
122 			isp3_stats_read(stats_vdev, ISP3X_RAWAWB_WP_NM_EXC0 + 0x10 * i, id);
123 	}
124 
125 	for (i = 0; i < ISP3X_RAWAWB_RAMDATA_NUM; i++) {
126 		lsb = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_RAM_DATA_BASE, id);
127 		msb = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_RAM_DATA_BASE, id);
128 		pbuf->params.rawawb.ramdata[i].b = lsb & 0x3FFFF;
129 		pbuf->params.rawawb.ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
130 		pbuf->params.rawawb.ramdata[i].r = (msb & 0x3FFFF0) >> 4;
131 		pbuf->params.rawawb.ramdata[i].wp = (msb & 0xFFC00000) >> 22;
132 	}
133 
134 out:
135 	isp3_stats_write(stats_vdev, ISP3X_RAWAWB_CTRL, ctrl, id);
136 	return 0;
137 }
138 
139 static int
rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)140 rkisp_stats_get_rawaf_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
141 			       struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
142 {
143 	struct isp3x_rawaf_stat *af;
144 	u32 i, ctrl;
145 
146 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL, id);
147 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
148 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
149 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
150 		return -ENODATA;
151 	}
152 
153 	if (!pbuf)
154 		goto out;
155 
156 	af = &pbuf->params.rawaf;
157 	pbuf->meas_type |= ISP3X_STAT_RAWAF;
158 	af->afm_sum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_SUM_B, id);
159 	af->afm_lum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_LUM_B, id);
160 	af->int_state = isp3_stats_read(stats_vdev, ISP3X_RAWAF_INT_STATE, id);
161 	af->highlit_cnt_winb = isp3_stats_read(stats_vdev, ISP3X_RAWAF_HIGHLIT_CNT_WINB, id);
162 
163 	for (i = 0; i < ISP3X_RAWAF_SUMDATA_NUM; i++) {
164 		af->ramdata[i].v1 = isp3_stats_read(stats_vdev, ISP3X_RAWAF_RAM_DATA, id);
165 		af->ramdata[i].v2 = isp3_stats_read(stats_vdev, ISP3X_RAWAF_RAM_DATA, id);
166 		af->ramdata[i].h1 = isp3_stats_read(stats_vdev, ISP3X_RAWAF_RAM_DATA, id);
167 		af->ramdata[i].h2 = isp3_stats_read(stats_vdev, ISP3X_RAWAF_RAM_DATA, id);
168 	}
169 
170 out:
171 	isp3_stats_write(stats_vdev, ISP3X_RAWAF_CTRL, ctrl, id);
172 	return 0;
173 }
174 
175 static int
rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no,u32 id)176 rkisp_stats_get_rawaebig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
177 				  struct isp2x_rawaebig_stat *ae,
178 				  u32 blk_no, u32 id)
179 {
180 	u32 addr, value, ctrl;
181 	int i;
182 
183 	switch (blk_no) {
184 	case 1:
185 		addr = ISP3X_RAWAE_BIG2_BASE;
186 		break;
187 	case 2:
188 		addr = ISP3X_RAWAE_BIG3_BASE;
189 		break;
190 	case 0:
191 	default:
192 		addr = ISP3X_RAWAE_BIG1_BASE;
193 		break;
194 	}
195 
196 	ctrl = isp3_stats_read(stats_vdev, addr + ISP3X_RAWAE_BIG_CTRL, id);
197 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
198 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
199 			 "%s fail, id:%d addr:0x%x ctrl:0x%x\n",
200 			 __func__, id, addr, ctrl);
201 		return -ENODATA;
202 	}
203 
204 	if (!ae)
205 		goto out;
206 
207 	for (i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++)
208 		ae->sumr[i] = isp3_stats_read(stats_vdev,
209 				addr + ISP3X_RAWAE_BIG_WND1_SUMR + i * 4, id);
210 
211 	for (i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++)
212 		ae->sumg[i] = isp3_stats_read(stats_vdev,
213 				addr + ISP3X_RAWAE_BIG_WND1_SUMG + i * 4, id);
214 
215 	for (i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++)
216 		ae->sumb[i] = isp3_stats_read(stats_vdev,
217 				addr + ISP3X_RAWAE_BIG_WND1_SUMB + i * 4, id);
218 
219 	for (i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
220 		value = isp3_stats_read(stats_vdev,
221 				addr + ISP3X_RAWAE_BIG_RO_MEAN_BASE_ADDR, id);
222 		ae->data[i].channelg_xy = ISP3X_RAWAEBIG_GET_MEAN_G(value);
223 		ae->data[i].channelb_xy = ISP3X_RAWAEBIG_GET_MEAN_B(value);
224 		ae->data[i].channelr_xy = ISP3X_RAWAEBIG_GET_MEAN_R(value);
225 	}
226 
227 out:
228 	isp3_stats_write(stats_vdev, addr + ISP3X_RAWAE_BIG_CTRL, ctrl, id);
229 	return 0;
230 }
231 
232 static int
rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no,u32 id)233 rkisp_stats_get_rawhstbig_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
234 				   struct isp2x_rawhistbig_stat *hst,
235 				   u32 blk_no, u32 id)
236 {
237 	u32 addr, ctrl;
238 	int i;
239 
240 	switch (blk_no) {
241 	case 1:
242 		addr = ISP3X_RAWHIST_BIG2_BASE;
243 		break;
244 	case 2:
245 		addr = ISP3X_RAWHIST_BIG3_BASE;
246 		break;
247 	case 0:
248 	default:
249 		addr = ISP3X_RAWHIST_BIG1_BASE;
250 		break;
251 	}
252 
253 	ctrl = isp3_stats_read(stats_vdev, addr + ISP3X_RAWHIST_BIG_CTRL, id);
254 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
255 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
256 			 "%s fail, id:%d addr:0x%x ctrl:0x%x\n",
257 			 __func__, id, addr, ctrl);
258 		return -ENODATA;
259 	}
260 
261 	if (!hst)
262 		goto out;
263 
264 	for (i = 0; i < ISP3X_HIST_BIN_N_MAX; i++)
265 		hst->hist_bin[i] = isp3_stats_read(stats_vdev,
266 					addr + ISP3X_RAWHIST_BIG_RO_BASE_BIN, id);
267 
268 out:
269 	isp3_stats_write(stats_vdev, addr + ISP3X_RAWHIST_BIG_CTRL, ctrl, id);
270 	return 0;
271 }
272 
273 static int
rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)274 rkisp_stats_get_rawae1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
275 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
276 {
277 	int ret = 0;
278 
279 	if (!pbuf) {
280 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 1, id);
281 	} else {
282 		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev,
283 							&pbuf->params.rawae1, 1, id);
284 		if (!ret)
285 			pbuf->meas_type |= ISP3X_STAT_RAWAE1;
286 	}
287 
288 	return ret;
289 }
290 
291 static int
rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)292 rkisp_stats_get_rawhst1_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
293 				 struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
294 {
295 	int ret = 0;
296 
297 	if (!pbuf) {
298 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 1, id);
299 	} else {
300 		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev,
301 							 &pbuf->params.rawhist1, 1, id);
302 		if (!ret)
303 			pbuf->meas_type |= ISP3X_STAT_RAWHST1;
304 	}
305 
306 	return ret;
307 }
308 
309 static int
rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)310 rkisp_stats_get_rawae2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
311 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
312 {
313 	int ret = 0;
314 
315 	if (!pbuf) {
316 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 2, id);
317 	} else {
318 		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev,
319 							&pbuf->params.rawae2, 2, id);
320 		if (!ret)
321 			pbuf->meas_type |= ISP3X_STAT_RAWAE2;
322 	}
323 
324 	return ret;
325 }
326 
327 static int
rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)328 rkisp_stats_get_rawhst2_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
329 				 struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
330 {
331 	int ret = 0;
332 
333 	if (!pbuf) {
334 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 2, id);
335 	} else {
336 		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev,
337 							 &pbuf->params.rawhist2, 2, id);
338 		if (!ret)
339 			pbuf->meas_type |= ISP3X_STAT_RAWHST2;
340 	}
341 
342 	return ret;
343 }
344 
345 static int
rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)346 rkisp_stats_get_rawae3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
347 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
348 {
349 	int ret = 0;
350 
351 	if (!pbuf) {
352 		rkisp_stats_get_rawaebig_meas_reg(stats_vdev, NULL, 0, id);
353 	} else {
354 		ret = rkisp_stats_get_rawaebig_meas_reg(stats_vdev,
355 							&pbuf->params.rawae3, 0, id);
356 		if (!ret)
357 			pbuf->meas_type |= ISP3X_STAT_RAWAE3;
358 	}
359 
360 	return ret;
361 }
362 
363 static int
rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)364 rkisp_stats_get_rawhst3_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
365 				 struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
366 {
367 	int ret = 0;
368 
369 	if (!pbuf) {
370 		rkisp_stats_get_rawhstbig_meas_reg(stats_vdev, NULL, 0, id);
371 	} else {
372 		ret = rkisp_stats_get_rawhstbig_meas_reg(stats_vdev,
373 							 &pbuf->params.rawhist3, 0, id);
374 		if (!ret)
375 			pbuf->meas_type |= ISP3X_STAT_RAWHST3;
376 	}
377 
378 	return ret;
379 }
380 
381 static int
rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)382 rkisp_stats_get_rawaelite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
383 				   struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
384 {
385 	struct isp2x_rawaelite_stat *ae;
386 	u32 value, ctrl;
387 	int i;
388 
389 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_CTRL, id);
390 	if ((ctrl & ISP3X_3A_MEAS_DONE) == 0) {
391 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
392 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
393 		return -ENODATA;
394 	}
395 
396 	if (!pbuf)
397 		goto out;
398 
399 	pbuf->meas_type |= ISP3X_STAT_RAWAE0;
400 	ae = &pbuf->params.rawae0;
401 	for (i = 0; i < ISP3X_RAWAELITE_MEAN_NUM; i++) {
402 		value = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_RO_MEAN + 4 * i, id);
403 		ae->data[i].channelg_xy = ISP3X_RAWAEBIG_GET_MEAN_G(value);
404 		ae->data[i].channelb_xy = ISP3X_RAWAEBIG_GET_MEAN_B(value);
405 		ae->data[i].channelr_xy = ISP3X_RAWAEBIG_GET_MEAN_R(value);
406 	}
407 
408 out:
409 	isp3_stats_write(stats_vdev, ISP3X_RAWAE_LITE_CTRL, ctrl, id);
410 	return 0;
411 }
412 
413 static int
rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)414 rkisp_stats_get_rawhstlite_meas_reg(struct rkisp_isp_stats_vdev *stats_vdev,
415 				    struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
416 {
417 	struct isp2x_rawhistlite_stat *hst;
418 	u32 ctrl;
419 	int i;
420 
421 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_CTRL, id);
422 	if ((ctrl & ISP3X_3A_MEAS_DONE) == 0) {
423 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
424 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
425 		return -ENODATA;
426 	}
427 
428 	if (!pbuf)
429 		goto out;
430 
431 	pbuf->meas_type |= ISP3X_STAT_RAWHST0;
432 	hst = &pbuf->params.rawhist0;
433 	for (i = 0; i < ISP3X_HIST_BIN_N_MAX; i++)
434 		hst->hist_bin[i] = isp3_stats_read(stats_vdev,
435 					ISP3X_RAWHIST_LITE_RO_BASE_BIN, id);
436 
437 out:
438 	isp3_stats_write(stats_vdev, ISP3X_RAWHIST_LITE_CTRL, ctrl, id);
439 	return 0;
440 }
441 
442 static int
rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)443 rkisp_stats_get_bls_stats(struct rkisp_isp_stats_vdev *stats_vdev,
444 			  struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
445 {
446 	struct ispsd_in_fmt in_fmt = stats_vdev->dev->isp_sdev.in_fmt;
447 	enum rkisp_fmt_raw_pat_type raw_type = in_fmt.bayer_pat;
448 	struct isp2x_bls_stat *bls;
449 	u32 value;
450 
451 	if (!pbuf)
452 		return 0;
453 
454 	bls = &pbuf->params.bls;
455 	value = isp3_stats_read(stats_vdev, ISP3X_BLS_CTRL, id);
456 	if (value & (ISP_BLS_ENA | ISP_BLS_MODE_MEASURED)) {
457 		pbuf->meas_type |= ISP3X_STAT_BLS;
458 
459 		switch (raw_type) {
460 		case RAW_BGGR:
461 			bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED, id);
462 			bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED, id);
463 			bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED, id);
464 			bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED, id);
465 			break;
466 		case RAW_GBRG:
467 			bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED, id);
468 			bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED, id);
469 			bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED, id);
470 			bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED, id);
471 			break;
472 		case RAW_GRBG:
473 			bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED, id);
474 			bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED, id);
475 			bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED, id);
476 			bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED, id);
477 			break;
478 		case RAW_RGGB:
479 			bls->meas_r = isp3_stats_read(stats_vdev, ISP3X_BLS_A_MEASURED, id);
480 			bls->meas_gr = isp3_stats_read(stats_vdev, ISP3X_BLS_B_MEASURED, id);
481 			bls->meas_gb = isp3_stats_read(stats_vdev, ISP3X_BLS_C_MEASURED, id);
482 			bls->meas_b = isp3_stats_read(stats_vdev, ISP3X_BLS_D_MEASURED, id);
483 			break;
484 		default:
485 			break;
486 		}
487 	}
488 	return 0;
489 }
490 
491 static int
rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)492 rkisp_stats_get_dhaz_stats(struct rkisp_isp_stats_vdev *stats_vdev,
493 			   struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
494 {
495 	struct isp3x_dhaz_stat *dhaz;
496 	u32 value, i;
497 
498 	if (!pbuf)
499 		return 0;
500 
501 	dhaz = &pbuf->params.dhaz;
502 	value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_CTRL, id);
503 	if (value & ISP_DHAZ_ENMUX) {
504 		pbuf->meas_type |= ISP3X_STAT_DHAZ;
505 
506 		value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_SUMH_RD, id);
507 		dhaz->dhaz_pic_sumh = value;
508 
509 		value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_ADP_RD0, id);
510 		dhaz->dhaz_adp_air_base = value >> 16;
511 		dhaz->dhaz_adp_wt = value & 0xFFFF;
512 
513 		value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_ADP_RD1, id);
514 		dhaz->dhaz_adp_gratio = value >> 16;
515 		dhaz->dhaz_adp_tmax = value & 0xFFFF;
516 
517 		for (i = 0; i < ISP3X_DHAZ_HIST_IIR_NUM / 2; i++) {
518 			value = isp3_stats_read(stats_vdev, ISP3X_DHAZ_HIST_REG0 + 4 * i, id);
519 			dhaz->h_rgb_iir[2 * i] = value & 0xFFFF;
520 			dhaz->h_rgb_iir[2 * i + 1] = value >> 16;
521 		}
522 	}
523 	return 0;
524 }
525 
526 static struct rkisp_stats_ops_v3x __maybe_unused stats_reg_ops_v3x = {
527 	.get_rawawb_meas = rkisp_stats_get_rawawb_meas_reg,
528 	.get_rawaf_meas = rkisp_stats_get_rawaf_meas_reg,
529 	.get_rawae0_meas = rkisp_stats_get_rawaelite_meas_reg,
530 	.get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_reg,
531 	.get_rawae1_meas = rkisp_stats_get_rawae1_meas_reg,
532 	.get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_reg,
533 	.get_rawae2_meas = rkisp_stats_get_rawae2_meas_reg,
534 	.get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_reg,
535 	.get_rawae3_meas = rkisp_stats_get_rawae3_meas_reg,
536 	.get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_reg,
537 	.get_bls_stats = rkisp_stats_get_bls_stats,
538 	.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
539 };
540 
541 static int
rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)542 rkisp_stats_get_rawawb_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
543 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
544 {
545 	struct isp3x_rawawb_meas_stat *rawawb;
546 	u32 offs = id * ISP3X_RD_STATS_BUF_SIZE;
547 	u32 value, rd_buf_idx, ctrl;
548 	u32 *reg_addr, *raw_addr;
549 	u64 msb, lsb;
550 	u32 i;
551 
552 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAWB_CTRL, id);
553 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
554 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
555 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
556 		return -ENODATA;
557 	}
558 
559 	if (!pbuf)
560 		goto out;
561 
562 	rawawb = &pbuf->params.rawawb;
563 	pbuf->meas_type |= ISP3X_STAT_RAWAWB;
564 	rd_buf_idx = stats_vdev->rd_buf_idx;
565 	raw_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs + 0x2b00;
566 	reg_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs + 0x2b00 + 0x710;
567 	for (i = 0; i < ISP3X_RAWAWB_SUM_NUM; i++) {
568 		rawawb->ro_rawawb_sum_rgain_nor[i] =
569 			reg_addr[(0x20 * i + 0x0) / 4];
570 		rawawb->ro_rawawb_sum_bgain_nor[i] =
571 			reg_addr[(0x20 * i + 0x4) / 4];
572 		rawawb->ro_rawawb_wp_num_nor[i] =
573 			reg_addr[(0x20 * i + 0x8) / 4];
574 		rawawb->ro_wp_num2[i] =
575 			reg_addr[(0x20 * i + 0xc) / 4];
576 		rawawb->ro_rawawb_sum_rgain_big[i] =
577 			reg_addr[(0x20 * i + 0x10) / 4];
578 		rawawb->ro_rawawb_sum_bgain_big[i] =
579 			reg_addr[(0x20 * i + 0x14) / 4];
580 		rawawb->ro_rawawb_wp_num_big[i] =
581 			reg_addr[(0x20 * i + 0x18) / 4];
582 	}
583 
584 	for (i = 0; i < ISP3X_RAWAWB_HSTBIN_NUM / 2; i++) {
585 		value = reg_addr[(0x04 * i + 0xE0) / 4];
586 		rawawb->ro_yhist_bin[2 * i] = value & 0xFFFF;
587 		rawawb->ro_yhist_bin[2 * i + 1] = (value & 0xFFFF0000) >> 16;
588 	}
589 
590 	for (i = 0; i < ISP3X_RAWAWB_MULWD_NUM; i++) {
591 		rawawb->ro_sum_r_nor_multiwindow[i] =
592 			reg_addr[(0x20 * i + 0xF0) / 4];
593 		rawawb->ro_sum_b_nor_multiwindow[i] =
594 			reg_addr[(0x20 * i + 0xF4) / 4];
595 		rawawb->ro_wp_nm_nor_multiwindow[i] =
596 			reg_addr[(0x20 * i + 0xF8) / 4];
597 		rawawb->ro_sum_r_big_multiwindow[i] =
598 			reg_addr[(0x20 * i + 0x100) / 4];
599 		rawawb->ro_sum_b_big_multiwindow[i] =
600 			reg_addr[(0x20 * i + 0x104) / 4];
601 		rawawb->ro_wp_nm_big_multiwindow[i] =
602 			reg_addr[(0x20 * i + 0x108) / 4];
603 	}
604 
605 	for (i = 0; i < ISP3X_RAWAWB_EXCL_STAT_NUM; i++) {
606 		rawawb->ro_sum_r_exc[i] = reg_addr[(0x10 * i + 0x170) / 4];
607 		rawawb->ro_sum_b_exc[i] = reg_addr[(0x10 * i + 0x174) / 4];
608 		rawawb->ro_wp_nm_exc[i] = reg_addr[(0x10 * i + 0x178) / 4];
609 	}
610 
611 	for (i = 0; i < ISP3X_RAWAWB_RAMDATA_NUM; i++) {
612 		lsb = raw_addr[2 * i];
613 		msb = raw_addr[2 * i + 1];
614 		rawawb->ramdata[i].b = lsb & 0x3FFFF;
615 		rawawb->ramdata[i].g = ((lsb & 0xFFFC0000) >> 18) | (msb & 0xF) << 14;
616 		rawawb->ramdata[i].r = (msb & 0x3FFFF0) >> 4;
617 		rawawb->ramdata[i].wp = (msb & 0xFFC00000) >> 22;
618 	}
619 
620 out:
621 	isp3_stats_write(stats_vdev, ISP3X_RAWAWB_CTRL, ctrl, id);
622 	return 0;
623 }
624 
625 static int
rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)626 rkisp_stats_get_rawaf_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
627 			       struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
628 {
629 	struct isp3x_rawaf_stat *af;
630 	u32 offs = id * ISP3X_RD_STATS_BUF_SIZE;
631 	u32 i, rd_buf_idx, *ddr_addr, ctrl;
632 
633 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAF_CTRL, id);
634 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
635 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
636 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
637 		return -ENODATA;
638 	}
639 
640 	if (!pbuf)
641 		goto out;
642 
643 	af = &pbuf->params.rawaf;
644 	pbuf->meas_type |= ISP3X_STAT_RAWAF;
645 
646 	rd_buf_idx = stats_vdev->rd_buf_idx;
647 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs + 0x1C00;
648 
649 	af->afm_sum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_SUM_B, id);
650 	af->afm_lum_b = isp3_stats_read(stats_vdev, ISP3X_RAWAF_LUM_B, id);
651 	af->int_state = isp3_stats_read(stats_vdev, ISP3X_RAWAF_INT_STATE, id);
652 	af->highlit_cnt_winb = isp3_stats_read(stats_vdev, ISP3X_RAWAF_HIGHLIT_CNT_WINB, id);
653 
654 	for (i = 0; i < ISP3X_RAWAF_SUMDATA_NUM; i++) {
655 		af->ramdata[i].v1 = ddr_addr[i * 4];
656 		af->ramdata[i].v2 = ddr_addr[i * 4 + 1];
657 		af->ramdata[i].h1 = ddr_addr[i * 4 + 2];
658 		af->ramdata[i].h2 = ddr_addr[i * 4 + 3];
659 	}
660 
661 out:
662 	isp3_stats_write(stats_vdev, ISP3X_RAWAF_CTRL, ctrl, id);
663 	return 0;
664 }
665 
666 static int
rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawaebig_stat * ae,u32 blk_no,u32 id)667 rkisp_stats_get_rawaebig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
668 				  struct isp2x_rawaebig_stat *ae,
669 				  u32 blk_no, u32 id)
670 {
671 	u32 offs = id * ISP3X_RD_STATS_BUF_SIZE;
672 	u32 i, value, addr, rd_buf_idx, ctrl;
673 	u32 *ddr_addr;
674 
675 	rd_buf_idx = stats_vdev->rd_buf_idx;
676 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs;
677 
678 	switch (blk_no) {
679 	case 1:
680 		addr = RAWAE_BIG2_BASE;
681 		ddr_addr += 0x0390 >> 2;
682 		break;
683 	case 2:
684 		addr = RAWAE_BIG3_BASE;
685 		ddr_addr += 0x0720 >> 2;
686 		break;
687 	default:
688 		addr = RAWAE_BIG1_BASE;
689 		break;
690 	}
691 
692 	ctrl = isp3_stats_read(stats_vdev, addr + ISP3X_RAWAE_BIG_CTRL, id);
693 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
694 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
695 			 "%s fail, id:%d addr:0x%x ctrl:0x%x\n",
696 			 __func__, id, addr, ctrl);
697 		return -ENODATA;
698 	}
699 
700 	if (!ae)
701 		goto out;
702 
703 	for (i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++)
704 		ae->sumr[i] = isp3_stats_read(stats_vdev,
705 				addr + ISP3X_RAWAE_BIG_WND1_SUMR + i * 4, id);
706 
707 	for (i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++)
708 		ae->sumg[i] = isp3_stats_read(stats_vdev,
709 				addr + ISP3X_RAWAE_BIG_WND1_SUMG + i * 4, id);
710 
711 	for (i = 0; i < ISP3X_RAWAEBIG_SUBWIN_NUM; i++)
712 		ae->sumb[i] = isp3_stats_read(stats_vdev,
713 				addr + ISP3X_RAWAE_BIG_WND1_SUMB + i * 4, id);
714 
715 	for (i = 0; i < ISP3X_RAWAEBIG_MEAN_NUM; i++) {
716 		value = ddr_addr[i];
717 		ae->data[i].channelg_xy = ISP3X_RAWAEBIG_GET_MEAN_G(value);
718 		ae->data[i].channelb_xy = ISP3X_RAWAEBIG_GET_MEAN_B(value);
719 		ae->data[i].channelr_xy = ISP3X_RAWAEBIG_GET_MEAN_R(value);
720 	}
721 
722 out:
723 	isp3_stats_write(stats_vdev, addr + ISP3X_RAWAE_BIG_CTRL, ctrl, id);
724 	return 0;
725 }
726 
727 static int
rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct isp2x_rawhistbig_stat * hst,u32 blk_no,u32 id)728 rkisp_stats_get_rawhstbig_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
729 				   struct isp2x_rawhistbig_stat *hst,
730 				   u32 blk_no, u32 id)
731 {
732 	u32 offs = id * ISP3X_RD_STATS_BUF_SIZE;
733 	u32 i, rd_buf_idx, *ddr_addr, addr, ctrl;
734 
735 	rd_buf_idx = stats_vdev->rd_buf_idx;
736 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs + 0x0C00;
737 
738 	switch (blk_no) {
739 	case 1:
740 		ddr_addr += 0x0800 >> 2;
741 		addr = ISP3X_RAWHIST_BIG2_BASE;
742 		break;
743 	case 2:
744 		ddr_addr += 0x0C00 >> 2;
745 		addr = ISP3X_RAWHIST_BIG3_BASE;
746 		break;
747 	case 0:
748 	default:
749 		addr = ISP3X_RAWHIST_BIG1_BASE;
750 		break;
751 	}
752 
753 	ctrl = isp3_stats_read(stats_vdev, addr + ISP3X_RAWHIST_BIG_CTRL, id);
754 	if (!(ctrl & ISP3X_3A_MEAS_DONE)) {
755 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
756 			 "%s fail, id:%d addr:0x%x ctrl:0x%x\n",
757 			 __func__, id, addr, ctrl);
758 		return -ENODATA;
759 	}
760 
761 	if (!hst)
762 		goto out;
763 
764 	for (i = 0; i < ISP3X_HIST_BIN_N_MAX; i++)
765 		hst->hist_bin[i] = ddr_addr[i];
766 
767 out:
768 	isp3_stats_write(stats_vdev, addr + ISP3X_RAWHIST_BIG_CTRL, ctrl, id);
769 	return 0;
770 }
771 
772 static int
rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)773 rkisp_stats_get_rawae1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
774 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
775 {
776 	int ret = 0;
777 
778 	if (!pbuf) {
779 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 1, id);
780 	} else {
781 		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev,
782 							&pbuf->params.rawae1, 1, id);
783 		if (!ret)
784 			pbuf->meas_type |= ISP3X_STAT_RAWAE1;
785 	}
786 
787 	return ret;
788 }
789 
790 static int
rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)791 rkisp_stats_get_rawhst1_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
792 				 struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
793 {
794 	int ret = 0;
795 
796 	if (!pbuf) {
797 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 1, id);
798 	} else {
799 		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev,
800 							 &pbuf->params.rawhist1, 1, id);
801 		if (!ret)
802 			pbuf->meas_type |= ISP3X_STAT_RAWHST1;
803 	}
804 
805 	return ret;
806 }
807 
808 static int
rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)809 rkisp_stats_get_rawae2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
810 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
811 {
812 	int ret = 0;
813 
814 	if (!pbuf) {
815 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 2, id);
816 	} else {
817 		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev,
818 							&pbuf->params.rawae2, 2, id);
819 		if (!ret)
820 			pbuf->meas_type |= ISP3X_STAT_RAWAE2;
821 	}
822 
823 	return ret;
824 }
825 
826 static int
rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)827 rkisp_stats_get_rawhst2_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
828 				 struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
829 {
830 	int ret = 0;
831 
832 	if (!pbuf) {
833 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 2, id);
834 	} else {
835 		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev,
836 							 &pbuf->params.rawhist2, 2, id);
837 		if (!ret)
838 			pbuf->meas_type |= ISP3X_STAT_RAWHST2;
839 	}
840 
841 	return ret;
842 }
843 
844 static int
rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)845 rkisp_stats_get_rawae3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
846 				struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
847 {
848 	int ret = 0;
849 
850 	if (!pbuf) {
851 		rkisp_stats_get_rawaebig_meas_ddr(stats_vdev, NULL, 0, id);
852 	} else {
853 		ret = rkisp_stats_get_rawaebig_meas_ddr(stats_vdev,
854 							&pbuf->params.rawae3, 0, id);
855 		if (!ret)
856 			pbuf->meas_type |= ISP3X_STAT_RAWAE3;
857 	}
858 
859 	return ret;
860 }
861 
862 static int
rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)863 rkisp_stats_get_rawhst3_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
864 				 struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
865 {
866 	int ret = 0;
867 
868 	if (!pbuf) {
869 		rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev, NULL, 0, id);
870 	} else {
871 		ret = rkisp_stats_get_rawhstbig_meas_ddr(stats_vdev,
872 							 &pbuf->params.rawhist3, 0, id);
873 		if (!ret)
874 			pbuf->meas_type |= ISP3X_STAT_RAWHST3;
875 	}
876 
877 	return ret;
878 }
879 
880 static int
rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)881 rkisp_stats_get_rawaelite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
882 				   struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
883 {
884 	struct isp2x_rawaelite_stat *ae;
885 	u32 offs = id * ISP3X_RD_STATS_BUF_SIZE;
886 	u32 i, value, rd_buf_idx, *ddr_addr, ctrl;
887 
888 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWAE_LITE_CTRL, id);
889 	if ((ctrl & ISP3X_3A_MEAS_DONE) == 0) {
890 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
891 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
892 		return -ENODATA;
893 	}
894 
895 	if (!pbuf)
896 		goto out;
897 
898 	pbuf->meas_type |= ISP3X_STAT_RAWAE0;
899 	ae = &pbuf->params.rawae0;
900 	rd_buf_idx = stats_vdev->rd_buf_idx;
901 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs + 0x0AB0;
902 	for (i = 0; i < ISP3X_RAWAELITE_MEAN_NUM; i++) {
903 		value = ddr_addr[i];
904 		ae->data[i].channelg_xy = ISP3X_RAWAEBIG_GET_MEAN_G(value);
905 		ae->data[i].channelb_xy = ISP3X_RAWAEBIG_GET_MEAN_B(value);
906 		ae->data[i].channelr_xy = ISP3X_RAWAEBIG_GET_MEAN_R(value);
907 	}
908 
909 out:
910 	isp3_stats_write(stats_vdev, ISP3X_RAWAE_LITE_CTRL, ctrl, id);
911 	return 0;
912 }
913 
914 static int
rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * pbuf,u32 id)915 rkisp_stats_get_rawhstlite_meas_ddr(struct rkisp_isp_stats_vdev *stats_vdev,
916 				    struct rkisp3x_isp_stat_buffer *pbuf, u32 id)
917 {
918 	struct isp2x_rawhistlite_stat *hst;
919 	u32 offs = id * ISP3X_RD_STATS_BUF_SIZE;
920 	u32 *ddr_addr, rd_buf_idx, i, ctrl;
921 
922 	ctrl = isp3_stats_read(stats_vdev, ISP3X_RAWHIST_LITE_CTRL, id);
923 	if ((ctrl & ISP3X_3A_MEAS_DONE) == 0) {
924 		v4l2_dbg(1, rkisp_debug, &stats_vdev->dev->v4l2_dev,
925 			 "%s fail, id:%d ctrl:0x%x\n", __func__, id, ctrl);
926 		return -ENODATA;
927 	}
928 
929 	if (!pbuf)
930 		goto out;
931 
932 	pbuf->meas_type |= ISP3X_STAT_RAWHST0;
933 	hst = &pbuf->params.rawhist0;
934 	rd_buf_idx = stats_vdev->rd_buf_idx;
935 	ddr_addr = stats_vdev->stats_buf[rd_buf_idx].vaddr + offs + 0x0C00 + 0x0400;
936 
937 	for (i = 0; i < ISP3X_HIST_BIN_N_MAX; i++)
938 		hst->hist_bin[i] = ddr_addr[i];
939 
940 out:
941 	isp3_stats_write(stats_vdev, ISP3X_RAWHIST_LITE_CTRL, ctrl, id);
942 	return 0;
943 }
944 
945 static struct rkisp_stats_ops_v3x __maybe_unused stats_ddr_ops_v3x = {
946 	.get_rawawb_meas = rkisp_stats_get_rawawb_meas_ddr,
947 	.get_rawaf_meas = rkisp_stats_get_rawaf_meas_ddr,
948 	.get_rawae0_meas = rkisp_stats_get_rawaelite_meas_ddr,
949 	.get_rawhst0_meas = rkisp_stats_get_rawhstlite_meas_ddr,
950 	.get_rawae1_meas = rkisp_stats_get_rawae1_meas_ddr,
951 	.get_rawhst1_meas = rkisp_stats_get_rawhst1_meas_ddr,
952 	.get_rawae2_meas = rkisp_stats_get_rawae2_meas_ddr,
953 	.get_rawhst2_meas = rkisp_stats_get_rawhst2_meas_ddr,
954 	.get_rawae3_meas = rkisp_stats_get_rawae3_meas_ddr,
955 	.get_rawhst3_meas = rkisp_stats_get_rawhst3_meas_ddr,
956 	.get_bls_stats = rkisp_stats_get_bls_stats,
957 	.get_dhaz_stats = rkisp_stats_get_dhaz_stats,
958 };
959 
960 static void
rkisp_merge_dual_dhaz_params(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp3x_isp_stat_buffer * left_stat,struct rkisp3x_isp_stat_buffer * right_stat)961 rkisp_merge_dual_dhaz_params(struct rkisp_isp_stats_vdev *stats_vdev,
962 			     struct rkisp3x_isp_stat_buffer *left_stat,
963 			     struct rkisp3x_isp_stat_buffer *right_stat)
964 {
965 	struct rkisp_device *dev = stats_vdev->dev;
966 	struct isp3x_dhaz_cfg *dhaz_cfg;
967 	struct isp3x_dhaz_stat *l_dhaz;
968 	struct isp3x_dhaz_stat *r_dhaz;
969 	u32 i, val, hist_out0, hist_out1, hist_out2, pic_sumh;
970 	u32 num = isp3_stats_read(stats_vdev, ISP3X_DHAZ_IIR0, 0) & 0x1f;
971 
972 	if (!left_stat || !right_stat ||
973 	    !(left_stat->meas_type & ISP3X_STAT_DHAZ) ||
974 	    !(right_stat->meas_type & ISP3X_STAT_DHAZ) ||
975 	    !(isp3_stats_read(stats_vdev, ISP3X_DHAZ_CTRL, 0) & BIT(25)))
976 		return;
977 
978 	dhaz_cfg = &dev->params_vdev.isp3x_params->others.dhaz_cfg;
979 	l_dhaz = &left_stat->params.dhaz;
980 	r_dhaz = &right_stat->params.dhaz;
981 
982 	if (!num || (!l_dhaz->dhaz_pic_sumh && !r_dhaz->dhaz_pic_sumh)) {
983 		v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
984 			 "%s 0 params, num:%d sumh:%d %d\n", __func__,
985 			 num, l_dhaz->dhaz_pic_sumh, r_dhaz->dhaz_pic_sumh);
986 		return;
987 	}
988 
989 	val = ISP_PACK_2SHORT((l_dhaz->dhaz_adp_wt + r_dhaz->dhaz_adp_wt) / 2,
990 			      (l_dhaz->dhaz_adp_air_base + r_dhaz->dhaz_adp_air_base) / 2);
991 	isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR0, val, 0);
992 	isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR0, val, 1);
993 
994 	val = ISP_PACK_2SHORT((l_dhaz->dhaz_adp_tmax + r_dhaz->dhaz_adp_tmax) / 2,
995 			      (l_dhaz->dhaz_adp_gratio + r_dhaz->dhaz_adp_gratio) / 2);
996 	isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR1, val, 0);
997 	isp3_stats_write(stats_vdev, ISP3X_DHAZ_ADT_WR1, val, 1);
998 
999 	num =  min_t(u32, num, left_stat->frame_id + 1);
1000 	pic_sumh = l_dhaz->dhaz_pic_sumh + r_dhaz->dhaz_pic_sumh;
1001 	for (i = 0; i < ISP3X_DHAZ_HIST_WR_NUM / 3; i++) {
1002 		hist_out0 = (l_dhaz->h_rgb_iir[i * 3] * l_dhaz->dhaz_pic_sumh +
1003 			     r_dhaz->h_rgb_iir[i * 3] * r_dhaz->dhaz_pic_sumh) / pic_sumh;
1004 		hist_out0 = (dhaz_cfg->hist_wr[i * 3] * (num - 1) + hist_out0) / num;
1005 		dhaz_cfg->hist_wr[i * 3] = hist_out0;
1006 
1007 		hist_out1 = (l_dhaz->h_rgb_iir[i * 3 + 1] * l_dhaz->dhaz_pic_sumh +
1008 			     r_dhaz->h_rgb_iir[i * 3 + 1] * r_dhaz->dhaz_pic_sumh) / pic_sumh;
1009 		hist_out1 = (dhaz_cfg->hist_wr[i * 3 + 1] * (num - 1) + hist_out1) / num;
1010 		dhaz_cfg->hist_wr[i * 3 + 1] = hist_out1;
1011 
1012 		hist_out2 = (l_dhaz->h_rgb_iir[i * 3 + 2] * l_dhaz->dhaz_pic_sumh +
1013 			     r_dhaz->h_rgb_iir[i * 3 + 2] * r_dhaz->dhaz_pic_sumh) / pic_sumh;
1014 		hist_out2 = (dhaz_cfg->hist_wr[i * 3 + 2] * (num - 1) + hist_out2) / num;
1015 		dhaz_cfg->hist_wr[i * 3 + 2] = hist_out2;
1016 
1017 		val = hist_out0 | hist_out1 << 10 | hist_out2 << 20;
1018 		isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 0);
1019 		isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 1);
1020 	}
1021 	val = (l_dhaz->h_rgb_iir[i * 3] * l_dhaz->dhaz_pic_sumh +
1022 	       r_dhaz->h_rgb_iir[i * 3] * r_dhaz->dhaz_pic_sumh) / pic_sumh;
1023 	val = (dhaz_cfg->hist_wr[i * 3] * (num - 1) + val) / num;
1024 	dhaz_cfg->hist_wr[i * 3] = val;
1025 	isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 0);
1026 	isp3_stats_write(stats_vdev, ISP3X_DHAZ_HIST_WR0 + i * 4, val, 1);
1027 }
1028 
1029 static void
rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev * stats_vdev,struct rkisp_isp_readout_work * meas_work)1030 rkisp_stats_send_meas_v3x(struct rkisp_isp_stats_vdev *stats_vdev,
1031 			  struct rkisp_isp_readout_work *meas_work)
1032 {
1033 	unsigned int cur_frame_id = -1;
1034 	struct rkisp_buffer *cur_buf = stats_vdev->cur_buf;
1035 	struct rkisp3x_isp_stat_buffer *cur_stat_buf = NULL;
1036 	struct rkisp_stats_ops_v3x *ops =
1037 		(struct rkisp_stats_ops_v3x *)stats_vdev->priv_ops;
1038 	int ret = 0;
1039 	u32 size = sizeof(struct rkisp3x_isp_stat_buffer);
1040 
1041 	cur_frame_id = meas_work->frame_id;
1042 	spin_lock(&stats_vdev->rd_lock);
1043 	/* get one empty buffer */
1044 	if (!cur_buf) {
1045 		if (!list_empty(&stats_vdev->stat)) {
1046 			cur_buf = list_first_entry(&stats_vdev->stat,
1047 						   struct rkisp_buffer, queue);
1048 			list_del(&cur_buf->queue);
1049 		}
1050 	}
1051 	spin_unlock(&stats_vdev->rd_lock);
1052 
1053 	if (cur_buf) {
1054 		cur_stat_buf =
1055 			(struct rkisp3x_isp_stat_buffer *)(cur_buf->vaddr[0]);
1056 		cur_stat_buf->frame_id = cur_frame_id;
1057 	}
1058 
1059 	if (meas_work->isp_ris & ISP3X_AFM_SUM_OF)
1060 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1061 			  "ISP3X_AFM_SUM_OF\n");
1062 
1063 	if (meas_work->isp_ris & ISP3X_AFM_LUM_OF)
1064 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1065 			  "ISP3X_AFM_LUM_OF\n");
1066 
1067 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAF_SUM)
1068 		v4l2_warn(stats_vdev->vnode.vdev.v4l2_dev,
1069 			  "ISP3X_3A_RAWAF_SUM\n");
1070 
1071 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB)
1072 		ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf, 0);
1073 
1074 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAF)
1075 		ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf, 0);
1076 
1077 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG)
1078 		ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf, 0);
1079 
1080 	if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG)
1081 		ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf, 0);
1082 
1083 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0)
1084 		ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf, 0);
1085 
1086 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH1)
1087 		ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf, 0);
1088 
1089 	if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH2)
1090 		ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf, 0);
1091 
1092 	if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0)
1093 		ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf, 0);
1094 
1095 	if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH1)
1096 		ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf, 0);
1097 
1098 	if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH2)
1099 		ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf, 0);
1100 
1101 	if (meas_work->isp_ris & ISP3X_FRAME) {
1102 		ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf, 0);
1103 		ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf, 0);
1104 	}
1105 
1106 	if (stats_vdev->dev->hw_dev->is_unite) {
1107 		struct rkisp3x_isp_stat_buffer *left_stat = cur_stat_buf;
1108 
1109 		size *= 2;
1110 		if (cur_buf) {
1111 			cur_stat_buf++;
1112 			cur_stat_buf->frame_id = cur_frame_id;
1113 		}
1114 		if (meas_work->isp3a_ris & ISP3X_3A_RAWAWB)
1115 			ret |= ops->get_rawawb_meas(stats_vdev, cur_stat_buf, 1);
1116 		if (meas_work->isp3a_ris & ISP3X_3A_RAWAF)
1117 			ret |= ops->get_rawaf_meas(stats_vdev, cur_stat_buf, 1);
1118 		if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_BIG)
1119 			ret |= ops->get_rawae3_meas(stats_vdev, cur_stat_buf, 1);
1120 		if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_BIG)
1121 			ret |= ops->get_rawhst3_meas(stats_vdev, cur_stat_buf, 1);
1122 		if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH0)
1123 			ret |= ops->get_rawae0_meas(stats_vdev, cur_stat_buf, 1);
1124 		if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH1)
1125 			ret |= ops->get_rawae1_meas(stats_vdev, cur_stat_buf, 1);
1126 		if (meas_work->isp3a_ris & ISP3X_3A_RAWAE_CH2)
1127 			ret |= ops->get_rawae2_meas(stats_vdev, cur_stat_buf, 1);
1128 		if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH0)
1129 			ret |= ops->get_rawhst0_meas(stats_vdev, cur_stat_buf, 1);
1130 		if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH1)
1131 			ret |= ops->get_rawhst1_meas(stats_vdev, cur_stat_buf, 1);
1132 		if (meas_work->isp3a_ris & ISP3X_3A_RAWHIST_CH2)
1133 			ret |= ops->get_rawhst2_meas(stats_vdev, cur_stat_buf, 1);
1134 		if (meas_work->isp_ris & ISP3X_FRAME) {
1135 			ret |= ops->get_bls_stats(stats_vdev, cur_stat_buf, 1);
1136 			ret |= ops->get_dhaz_stats(stats_vdev, cur_stat_buf, 1);
1137 		}
1138 		rkisp_merge_dual_dhaz_params(stats_vdev, left_stat, cur_stat_buf);
1139 	}
1140 
1141 	if (cur_buf && !ret) {
1142 		vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0, size);
1143 		cur_buf->vb.sequence = cur_frame_id;
1144 		cur_buf->vb.vb2_buf.timestamp = meas_work->timestamp;
1145 		vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
1146 		cur_buf = NULL;
1147 	}
1148 
1149 	stats_vdev->cur_buf = cur_buf;
1150 }
1151 
1152 static void
rkisp_stats_isr_v3x(struct rkisp_isp_stats_vdev * stats_vdev,u32 isp_ris,u32 isp3a_ris)1153 rkisp_stats_isr_v3x(struct rkisp_isp_stats_vdev *stats_vdev,
1154 		    u32 isp_ris, u32 isp3a_ris)
1155 {
1156 	struct rkisp_device *dev = stats_vdev->dev;
1157 	struct rkisp_hw_dev *hw = dev->hw_dev;
1158 	void __iomem *base = !hw->is_unite ?
1159 		hw->base_addr : hw->base_next_addr;
1160 	struct rkisp_isp_readout_work work;
1161 	u32 iq_isr_mask = ISP3X_SIAWB_DONE | ISP3X_SIAF_FIN |
1162 		ISP3X_EXP_END | ISP3X_SIHST_RDY | ISP3X_AFM_SUM_OF | ISP3X_AFM_LUM_OF;
1163 	u32 cur_frame_id, isp_mis_tmp = 0, iq_3a_mask = 0;
1164 	u32 wr_buf_idx, temp_isp_ris, temp_isp3a_ris;
1165 
1166 	rkisp_dmarx_get_frame(stats_vdev->dev, &cur_frame_id, NULL, NULL, true);
1167 
1168 	if (IS_HDR_RDBK(dev->hdr.op_mode))
1169 		iq_3a_mask = ISP3X_3A_RAWAE_BIG;
1170 
1171 	spin_lock(&stats_vdev->irq_lock);
1172 
1173 	temp_isp_ris = readl(base + ISP3X_ISP_RIS);
1174 	temp_isp3a_ris = readl(base + ISP3X_ISP_3A_RIS);
1175 	isp_mis_tmp = isp_ris & iq_isr_mask;
1176 	if (isp_mis_tmp) {
1177 		writel(isp_mis_tmp, base + ISP3X_ISP_ICR);
1178 
1179 		isp_mis_tmp &= readl(base + ISP3X_ISP_MIS);
1180 		if (isp_mis_tmp)
1181 			v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1182 				 "isp icr 3A info err: 0x%x 0x%x\n",
1183 				 isp_mis_tmp, isp_ris);
1184 	}
1185 
1186 	isp_mis_tmp = isp3a_ris & iq_3a_mask;
1187 	if (isp_mis_tmp) {
1188 		writel(isp_mis_tmp, base + ISP3X_ISP_3A_ICR);
1189 
1190 		isp_mis_tmp &= readl(base + ISP3X_ISP_3A_MIS);
1191 		if (isp_mis_tmp)
1192 			v4l2_err(stats_vdev->vnode.vdev.v4l2_dev,
1193 				 "isp3A icr 3A info err: 0x%x 0x%x\n",
1194 				 isp_mis_tmp, isp_ris);
1195 	}
1196 
1197 	if (!stats_vdev->streamon)
1198 		goto unlock;
1199 
1200 	if ((isp_ris & ISP3X_FRAME) && stats_vdev->rd_stats_from_ddr) {
1201 		wr_buf_idx = stats_vdev->wr_buf_idx;
1202 		stats_vdev->rd_buf_idx = wr_buf_idx;
1203 		rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]);
1204 		wr_buf_idx = (wr_buf_idx + 1) % RKISP_STATS_DDR_BUF_NUM;
1205 		stats_vdev->wr_buf_idx = wr_buf_idx;
1206 		rkisp_finish_buffer(dev, &stats_vdev->stats_buf[wr_buf_idx]);
1207 
1208 		rkisp_write(dev, ISP3X_MI_3A_WR_BASE,
1209 			    stats_vdev->stats_buf[wr_buf_idx].dma_addr, false);
1210 		if (dev->hw_dev->is_unite)
1211 			rkisp_next_write(dev, ISP3X_MI_3A_WR_BASE,
1212 					 stats_vdev->stats_buf[wr_buf_idx].dma_addr +
1213 					 ISP3X_RD_STATS_BUF_SIZE, false);
1214 	}
1215 
1216 	if (isp_ris & ISP3X_FRAME) {
1217 		work.readout = RKISP_ISP_READOUT_MEAS;
1218 		work.frame_id = cur_frame_id;
1219 		work.isp_ris = temp_isp_ris | isp_ris;
1220 		work.isp3a_ris = temp_isp3a_ris | iq_3a_mask;
1221 		work.timestamp = ktime_get_ns();
1222 
1223 		rkisp_stats_send_meas_v3x(stats_vdev, &work);
1224 	}
1225 
1226 unlock:
1227 	spin_unlock(&stats_vdev->irq_lock);
1228 }
1229 
1230 static void
rkisp_stats_rdbk_enable_v3x(struct rkisp_isp_stats_vdev * stats_vdev,bool en)1231 rkisp_stats_rdbk_enable_v3x(struct rkisp_isp_stats_vdev *stats_vdev, bool en)
1232 {
1233 	if (!en) {
1234 		stats_vdev->isp_rdbk = 0;
1235 		stats_vdev->isp3a_rdbk = 0;
1236 	}
1237 
1238 	stats_vdev->rdbk_mode = en;
1239 }
1240 
1241 static struct rkisp_isp_stats_ops rkisp_isp_stats_ops_tbl = {
1242 	.isr_hdl = rkisp_stats_isr_v3x,
1243 	.send_meas = rkisp_stats_send_meas_v3x,
1244 	.rdbk_enable = rkisp_stats_rdbk_enable_v3x,
1245 };
1246 
rkisp_stats_first_ddr_config_v3x(struct rkisp_isp_stats_vdev * stats_vdev)1247 void rkisp_stats_first_ddr_config_v3x(struct rkisp_isp_stats_vdev *stats_vdev)
1248 {
1249 	struct rkisp_device *dev = stats_vdev->dev;
1250 	int i, mult = dev->hw_dev->is_unite ? 2 : 1;
1251 
1252 	if (dev->isp_sdev.in_fmt.fmt_type == FMT_YUV)
1253 		return;
1254 
1255 	stats_vdev->rd_stats_from_ddr = false;
1256 	stats_vdev->priv_ops = &stats_reg_ops_v3x;
1257 
1258 	if (!IS_HDR_RDBK(stats_vdev->dev->hdr.op_mode)) {
1259 		for (i = 0; i < RKISP_STATS_DDR_BUF_NUM; i++) {
1260 			stats_vdev->stats_buf[i].is_need_vaddr = true;
1261 			stats_vdev->stats_buf[i].size = ISP3X_RD_STATS_BUF_SIZE * mult;
1262 			if (rkisp_alloc_buffer(dev, &stats_vdev->stats_buf[i]))
1263 				goto err;
1264 		}
1265 
1266 		stats_vdev->priv_ops = &stats_ddr_ops_v3x;
1267 		stats_vdev->rd_stats_from_ddr = true;
1268 		stats_vdev->rd_buf_idx = 0;
1269 		stats_vdev->wr_buf_idx = 0;
1270 
1271 		rkisp_unite_write(dev, ISP3X_MI_DBR_WR_SIZE,
1272 				  ISP3X_RD_STATS_BUF_SIZE,
1273 				  false, dev->hw_dev->is_unite);
1274 		rkisp_unite_set_bits(dev, ISP3X_SWS_CFG, 0,
1275 				     ISP3X_3A_DDR_WRITE_EN, false,
1276 				     dev->hw_dev->is_unite);
1277 		rkisp_write(dev, ISP3X_MI_3A_WR_BASE,
1278 			    stats_vdev->stats_buf[0].dma_addr, false);
1279 		if (dev->hw_dev->is_unite)
1280 			rkisp_next_write(dev, ISP3X_MI_3A_WR_BASE,
1281 					 stats_vdev->stats_buf[0].dma_addr +
1282 					 ISP3X_RD_STATS_BUF_SIZE, false);
1283 	}
1284 
1285 	return;
1286 err:
1287 	for (i -= 1; i >= 0; i--)
1288 		rkisp_free_buffer(dev, &stats_vdev->stats_buf[i]);
1289 	dev_err(dev->dev, "alloc stats ddr buf fail\n");
1290 }
1291 
rkisp_init_stats_vdev_v3x(struct rkisp_isp_stats_vdev * stats_vdev)1292 void rkisp_init_stats_vdev_v3x(struct rkisp_isp_stats_vdev *stats_vdev)
1293 {
1294 	int mult = stats_vdev->dev->hw_dev->is_unite ? 2 : 1;
1295 
1296 	stats_vdev->vdev_fmt.fmt.meta.dataformat =
1297 		V4L2_META_FMT_RK_ISP1_STAT_3A;
1298 	stats_vdev->vdev_fmt.fmt.meta.buffersize =
1299 		mult * sizeof(struct rkisp3x_isp_stat_buffer);
1300 
1301 	stats_vdev->ops = &rkisp_isp_stats_ops_tbl;
1302 	stats_vdev->priv_ops = &stats_reg_ops_v3x;
1303 	stats_vdev->rd_stats_from_ddr = false;
1304 }
1305 
rkisp_uninit_stats_vdev_v3x(struct rkisp_isp_stats_vdev * stats_vdev)1306 void rkisp_uninit_stats_vdev_v3x(struct rkisp_isp_stats_vdev *stats_vdev)
1307 {
1308 
1309 }
1310