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