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