1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2015, Intel Corporation.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms and conditions of the GNU General Public License,
8 * version 2, as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 */
15
16 #include "debug.h"
17
18 #ifndef __INLINE_INPUT_SYSTEM__
19 #define __INLINE_INPUT_SYSTEM__
20 #endif
21 #ifndef __INLINE_IBUF_CTRL__
22 #define __INLINE_IBUF_CTRL__
23 #endif
24 #ifndef __INLINE_CSI_RX__
25 #define __INLINE_CSI_RX__
26 #endif
27 #ifndef __INLINE_PIXELGEN__
28 #define __INLINE_PIXELGEN__
29 #endif
30 #ifndef __INLINE_STREAM2MMIO__
31 #define __INLINE_STREAM2MMIO__
32 #endif
33
34 #include <linux/args.h>
35 #include <linux/string.h> /* for strscpy() */
36
37 #include "ia_css_debug.h"
38 #include "ia_css_debug_pipe.h"
39 #include "ia_css_irq.h"
40 #include "ia_css_stream.h"
41 #include "ia_css_pipeline.h"
42 #include "ia_css_isp_param.h"
43 #include "sh_css_params.h"
44 #include "ia_css_bufq.h"
45 /* ISP2401 */
46 #include "ia_css_queue.h"
47
48 #include "ia_css_isp_params.h"
49
50 #include "system_local.h"
51 #include "assert_support.h"
52 #include "print_support.h"
53
54 #include "fifo_monitor.h"
55
56 #include "input_formatter.h"
57 #include "dma.h"
58 #include "irq.h"
59 #include "gp_device.h"
60 #include "sp.h"
61 #include "isp.h"
62 #include "type_support.h"
63 #include "math_support.h" /* CEIL_DIV */
64 #include "input_system.h" /* input_formatter_reg_load */
65 #include "ia_css_tagger_common.h"
66
67 #include "sh_css_internal.h"
68 #include "ia_css_isys.h"
69 #include "sh_css_sp.h" /* sh_css_sp_get_debug_state() */
70
71 #include "css_trace.h" /* tracer */
72
73 #include "device_access.h" /* for ia_css_device_load_uint32 */
74
75 /* Include all kernel host interfaces for ISP1 */
76 #include "anr/anr_1.0/ia_css_anr.host.h"
77 #include "cnr/cnr_1.0/ia_css_cnr.host.h"
78 #include "csc/csc_1.0/ia_css_csc.host.h"
79 #include "de/de_1.0/ia_css_de.host.h"
80 #include "dp/dp_1.0/ia_css_dp.host.h"
81 #include "bnr/bnr_1.0/ia_css_bnr.host.h"
82 #include "fpn/fpn_1.0/ia_css_fpn.host.h"
83 #include "gc/gc_1.0/ia_css_gc.host.h"
84 #include "ob/ob_1.0/ia_css_ob.host.h"
85 #include "s3a/s3a_1.0/ia_css_s3a.host.h"
86 #include "sc/sc_1.0/ia_css_sc.host.h"
87 #include "tnr/tnr_1.0/ia_css_tnr.host.h"
88 #include "uds/uds_1.0/ia_css_uds_param.h"
89 #include "wb/wb_1.0/ia_css_wb.host.h"
90 #include "ynr/ynr_1.0/ia_css_ynr.host.h"
91
92 /* Include additional kernel host interfaces for ISP2 */
93 #include "aa/aa_2/ia_css_aa2.host.h"
94 #include "anr/anr_2/ia_css_anr2.host.h"
95 #include "cnr/cnr_2/ia_css_cnr2.host.h"
96 #include "de/de_2/ia_css_de2.host.h"
97 #include "gc/gc_2/ia_css_gc2.host.h"
98 #include "ynr/ynr_2/ia_css_ynr2.host.h"
99
100 #define DPG_START "ia_css_debug_pipe_graph_dump_start "
101 #define DPG_END " ia_css_debug_pipe_graph_dump_end\n"
102
103 #define ENABLE_LINE_MAX_LENGTH (25)
104
105 static struct pipe_graph_class {
106 bool do_init;
107 int height;
108 int width;
109 int eff_height;
110 int eff_width;
111 enum atomisp_input_format stream_format;
112 } pg_inst = {true, 0, 0, 0, 0, N_ATOMISP_INPUT_FORMAT};
113
114 static const char *const queue_id_to_str[] = {
115 /* [SH_CSS_QUEUE_A_ID] =*/ "queue_A",
116 /* [SH_CSS_QUEUE_B_ID] =*/ "queue_B",
117 /* [SH_CSS_QUEUE_C_ID] =*/ "queue_C",
118 /* [SH_CSS_QUEUE_D_ID] =*/ "queue_D",
119 /* [SH_CSS_QUEUE_E_ID] =*/ "queue_E",
120 /* [SH_CSS_QUEUE_F_ID] =*/ "queue_F",
121 /* [SH_CSS_QUEUE_G_ID] =*/ "queue_G",
122 /* [SH_CSS_QUEUE_H_ID] =*/ "queue_H"
123 };
124
125 static const char *const pipe_id_to_str[] = {
126 /* [IA_CSS_PIPE_ID_PREVIEW] =*/ "preview",
127 /* [IA_CSS_PIPE_ID_COPY] =*/ "copy",
128 /* [IA_CSS_PIPE_ID_VIDEO] =*/ "video",
129 /* [IA_CSS_PIPE_ID_CAPTURE] =*/ "capture",
130 /* [IA_CSS_PIPE_ID_YUVPP] =*/ "yuvpp",
131 };
132
133 static char dot_id_input_bin[SH_CSS_MAX_BINARY_NAME + 10];
134 static char ring_buffer[200];
135
ia_css_debug_dtrace(unsigned int level,const char * fmt,...)136 void ia_css_debug_dtrace(unsigned int level, const char *fmt, ...)
137 {
138 va_list ap;
139
140 va_start(ap, fmt);
141 ia_css_debug_vdtrace(level, fmt, ap);
142 va_end(ap);
143 }
144
ia_css_debug_set_dtrace_level(const unsigned int trace_level)145 void ia_css_debug_set_dtrace_level(const unsigned int trace_level)
146 {
147 dbg_level = trace_level;
148 return;
149 }
150
ia_css_debug_get_dtrace_level(void)151 unsigned int ia_css_debug_get_dtrace_level(void)
152 {
153 return dbg_level;
154 }
155
debug_stream_format2str(const enum atomisp_input_format stream_format)156 static const char *debug_stream_format2str(const enum atomisp_input_format
157 stream_format)
158 {
159 switch (stream_format) {
160 case ATOMISP_INPUT_FORMAT_YUV420_8_LEGACY:
161 return "yuv420-8-legacy";
162 case ATOMISP_INPUT_FORMAT_YUV420_8:
163 return "yuv420-8";
164 case ATOMISP_INPUT_FORMAT_YUV420_10:
165 return "yuv420-10";
166 case ATOMISP_INPUT_FORMAT_YUV420_16:
167 return "yuv420-16";
168 case ATOMISP_INPUT_FORMAT_YUV422_8:
169 return "yuv422-8";
170 case ATOMISP_INPUT_FORMAT_YUV422_10:
171 return "yuv422-10";
172 case ATOMISP_INPUT_FORMAT_YUV422_16:
173 return "yuv422-16";
174 case ATOMISP_INPUT_FORMAT_RGB_444:
175 return "rgb444";
176 case ATOMISP_INPUT_FORMAT_RGB_555:
177 return "rgb555";
178 case ATOMISP_INPUT_FORMAT_RGB_565:
179 return "rgb565";
180 case ATOMISP_INPUT_FORMAT_RGB_666:
181 return "rgb666";
182 case ATOMISP_INPUT_FORMAT_RGB_888:
183 return "rgb888";
184 case ATOMISP_INPUT_FORMAT_RAW_6:
185 return "raw6";
186 case ATOMISP_INPUT_FORMAT_RAW_7:
187 return "raw7";
188 case ATOMISP_INPUT_FORMAT_RAW_8:
189 return "raw8";
190 case ATOMISP_INPUT_FORMAT_RAW_10:
191 return "raw10";
192 case ATOMISP_INPUT_FORMAT_RAW_12:
193 return "raw12";
194 case ATOMISP_INPUT_FORMAT_RAW_14:
195 return "raw14";
196 case ATOMISP_INPUT_FORMAT_RAW_16:
197 return "raw16";
198 case ATOMISP_INPUT_FORMAT_BINARY_8:
199 return "binary8";
200 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT1:
201 return "generic-short1";
202 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT2:
203 return "generic-short2";
204 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT3:
205 return "generic-short3";
206 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT4:
207 return "generic-short4";
208 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT5:
209 return "generic-short5";
210 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT6:
211 return "generic-short6";
212 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT7:
213 return "generic-short7";
214 case ATOMISP_INPUT_FORMAT_GENERIC_SHORT8:
215 return "generic-short8";
216 case ATOMISP_INPUT_FORMAT_YUV420_8_SHIFT:
217 return "yuv420-8-shift";
218 case ATOMISP_INPUT_FORMAT_YUV420_10_SHIFT:
219 return "yuv420-10-shift";
220 case ATOMISP_INPUT_FORMAT_EMBEDDED:
221 return "embedded-8";
222 case ATOMISP_INPUT_FORMAT_USER_DEF1:
223 return "user-def-8-type-1";
224 case ATOMISP_INPUT_FORMAT_USER_DEF2:
225 return "user-def-8-type-2";
226 case ATOMISP_INPUT_FORMAT_USER_DEF3:
227 return "user-def-8-type-3";
228 case ATOMISP_INPUT_FORMAT_USER_DEF4:
229 return "user-def-8-type-4";
230 case ATOMISP_INPUT_FORMAT_USER_DEF5:
231 return "user-def-8-type-5";
232 case ATOMISP_INPUT_FORMAT_USER_DEF6:
233 return "user-def-8-type-6";
234 case ATOMISP_INPUT_FORMAT_USER_DEF7:
235 return "user-def-8-type-7";
236 case ATOMISP_INPUT_FORMAT_USER_DEF8:
237 return "user-def-8-type-8";
238
239 default:
240 assert(!"Unknown stream format");
241 return "unknown-stream-format";
242 }
243 };
244
debug_frame_format2str(const enum ia_css_frame_format frame_format)245 static const char *debug_frame_format2str(const enum ia_css_frame_format
246 frame_format)
247 {
248 switch (frame_format) {
249 case IA_CSS_FRAME_FORMAT_NV11:
250 return "NV11";
251 case IA_CSS_FRAME_FORMAT_NV12:
252 return "NV12";
253 case IA_CSS_FRAME_FORMAT_NV12_16:
254 return "NV12_16";
255 case IA_CSS_FRAME_FORMAT_NV12_TILEY:
256 return "NV12_TILEY";
257 case IA_CSS_FRAME_FORMAT_NV16:
258 return "NV16";
259 case IA_CSS_FRAME_FORMAT_NV21:
260 return "NV21";
261 case IA_CSS_FRAME_FORMAT_NV61:
262 return "NV61";
263 case IA_CSS_FRAME_FORMAT_YV12:
264 return "YV12";
265 case IA_CSS_FRAME_FORMAT_YV16:
266 return "YV16";
267 case IA_CSS_FRAME_FORMAT_YUV420:
268 return "YUV420";
269 case IA_CSS_FRAME_FORMAT_YUV420_16:
270 return "YUV420_16";
271 case IA_CSS_FRAME_FORMAT_YUV422:
272 return "YUV422";
273 case IA_CSS_FRAME_FORMAT_YUV422_16:
274 return "YUV422_16";
275 case IA_CSS_FRAME_FORMAT_UYVY:
276 return "UYVY";
277 case IA_CSS_FRAME_FORMAT_YUYV:
278 return "YUYV";
279 case IA_CSS_FRAME_FORMAT_YUV444:
280 return "YUV444";
281 case IA_CSS_FRAME_FORMAT_YUV_LINE:
282 return "YUV_LINE";
283 case IA_CSS_FRAME_FORMAT_RAW:
284 return "RAW";
285 case IA_CSS_FRAME_FORMAT_RGB565:
286 return "RGB565";
287 case IA_CSS_FRAME_FORMAT_PLANAR_RGB888:
288 return "PLANAR_RGB888";
289 case IA_CSS_FRAME_FORMAT_RGBA888:
290 return "RGBA888";
291 case IA_CSS_FRAME_FORMAT_QPLANE6:
292 return "QPLANE6";
293 case IA_CSS_FRAME_FORMAT_BINARY_8:
294 return "BINARY_8";
295 case IA_CSS_FRAME_FORMAT_MIPI:
296 return "MIPI";
297 case IA_CSS_FRAME_FORMAT_RAW_PACKED:
298 return "RAW_PACKED";
299 case IA_CSS_FRAME_FORMAT_CSI_MIPI_YUV420_8:
300 return "CSI_MIPI_YUV420_8";
301 case IA_CSS_FRAME_FORMAT_CSI_MIPI_LEGACY_YUV420_8:
302 return "CSI_MIPI_LEGACY_YUV420_8";
303 case IA_CSS_FRAME_FORMAT_CSI_MIPI_YUV420_10:
304 return "CSI_MIPI_YUV420_10";
305
306 default:
307 assert(!"Unknown frame format");
308 return "unknown-frame-format";
309 }
310 }
311
debug_print_fifo_channel_state(const fifo_channel_state_t * state,const char * descr)312 static void debug_print_fifo_channel_state(const fifo_channel_state_t *state,
313 const char *descr)
314 {
315 assert(state);
316 assert(descr);
317
318 ia_css_debug_dtrace(2, "FIFO channel: %s\n", descr);
319 ia_css_debug_dtrace(2, "\t%-32s: %d\n", "source valid",
320 state->src_valid);
321 ia_css_debug_dtrace(2, "\t%-32s: %d\n", "fifo accept",
322 state->fifo_accept);
323 ia_css_debug_dtrace(2, "\t%-32s: %d\n", "fifo valid",
324 state->fifo_valid);
325 ia_css_debug_dtrace(2, "\t%-32s: %d\n", "sink accept",
326 state->sink_accept);
327 return;
328 }
329
ia_css_debug_dump_pif_a_isp_fifo_state(void)330 void ia_css_debug_dump_pif_a_isp_fifo_state(void)
331 {
332 fifo_channel_state_t pif_to_isp, isp_to_pif;
333
334 fifo_channel_get_state(FIFO_MONITOR0_ID,
335 FIFO_CHANNEL_IF0_TO_ISP0, &pif_to_isp);
336 fifo_channel_get_state(FIFO_MONITOR0_ID,
337 FIFO_CHANNEL_ISP0_TO_IF0, &isp_to_pif);
338 debug_print_fifo_channel_state(&pif_to_isp, "Primary IF A to ISP");
339 debug_print_fifo_channel_state(&isp_to_pif, "ISP to Primary IF A");
340 }
341
ia_css_debug_dump_pif_b_isp_fifo_state(void)342 void ia_css_debug_dump_pif_b_isp_fifo_state(void)
343 {
344 fifo_channel_state_t pif_to_isp, isp_to_pif;
345
346 fifo_channel_get_state(FIFO_MONITOR0_ID,
347 FIFO_CHANNEL_IF1_TO_ISP0, &pif_to_isp);
348 fifo_channel_get_state(FIFO_MONITOR0_ID,
349 FIFO_CHANNEL_ISP0_TO_IF1, &isp_to_pif);
350 debug_print_fifo_channel_state(&pif_to_isp, "Primary IF B to ISP");
351 debug_print_fifo_channel_state(&isp_to_pif, "ISP to Primary IF B");
352 }
353
ia_css_debug_dump_str2mem_sp_fifo_state(void)354 void ia_css_debug_dump_str2mem_sp_fifo_state(void)
355 {
356 fifo_channel_state_t s2m_to_sp, sp_to_s2m;
357
358 fifo_channel_get_state(FIFO_MONITOR0_ID,
359 FIFO_CHANNEL_STREAM2MEM0_TO_SP0, &s2m_to_sp);
360 fifo_channel_get_state(FIFO_MONITOR0_ID,
361 FIFO_CHANNEL_SP0_TO_STREAM2MEM0, &sp_to_s2m);
362 debug_print_fifo_channel_state(&s2m_to_sp, "Stream-to-memory to SP");
363 debug_print_fifo_channel_state(&sp_to_s2m, "SP to stream-to-memory");
364 }
365
ia_css_debug_dump_all_fifo_state(void)366 void ia_css_debug_dump_all_fifo_state(void)
367 {
368 int i;
369 fifo_monitor_state_t state;
370
371 fifo_monitor_get_state(FIFO_MONITOR0_ID, &state);
372
373 for (i = 0; i < N_FIFO_CHANNEL; i++)
374 debug_print_fifo_channel_state(&state.fifo_channels[i],
375 "squepfstqkt");
376 return;
377 }
378
debug_binary_info_print(const struct ia_css_binary_xinfo * info)379 static void debug_binary_info_print(const struct ia_css_binary_xinfo *info)
380 {
381 assert(info);
382 ia_css_debug_dtrace(2, "id = %d\n", info->sp.id);
383 ia_css_debug_dtrace(2, "mode = %d\n", info->sp.pipeline.mode);
384 ia_css_debug_dtrace(2, "max_input_width = %d\n", info->sp.input.max_width);
385 ia_css_debug_dtrace(2, "min_output_width = %d\n",
386 info->sp.output.min_width);
387 ia_css_debug_dtrace(2, "max_output_width = %d\n",
388 info->sp.output.max_width);
389 ia_css_debug_dtrace(2, "top_cropping = %d\n", info->sp.pipeline.top_cropping);
390 ia_css_debug_dtrace(2, "left_cropping = %d\n", info->sp.pipeline.left_cropping);
391 ia_css_debug_dtrace(2, "xmem_addr = %d\n", info->xmem_addr);
392 ia_css_debug_dtrace(2, "enable_vf_veceven = %d\n",
393 info->sp.enable.vf_veceven);
394 ia_css_debug_dtrace(2, "enable_dis = %d\n", info->sp.enable.dis);
395 ia_css_debug_dtrace(2, "enable_uds = %d\n", info->sp.enable.uds);
396 ia_css_debug_dtrace(2, "enable ds = %d\n", info->sp.enable.ds);
397 ia_css_debug_dtrace(2, "s3atbl_use_dmem = %d\n", info->sp.s3a.s3atbl_use_dmem);
398 return;
399 }
400
ia_css_debug_binary_print(const struct ia_css_binary * bi)401 void ia_css_debug_binary_print(const struct ia_css_binary *bi)
402 {
403 unsigned int i;
404
405 debug_binary_info_print(bi->info);
406 ia_css_debug_dtrace(2,
407 "input: %dx%d, format = %d, padded width = %d\n",
408 bi->in_frame_info.res.width,
409 bi->in_frame_info.res.height,
410 bi->in_frame_info.format,
411 bi->in_frame_info.padded_width);
412 ia_css_debug_dtrace(2,
413 "internal :%dx%d, format = %d, padded width = %d\n",
414 bi->internal_frame_info.res.width,
415 bi->internal_frame_info.res.height,
416 bi->internal_frame_info.format,
417 bi->internal_frame_info.padded_width);
418 for (i = 0; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) {
419 if (bi->out_frame_info[i].res.width != 0) {
420 ia_css_debug_dtrace(2,
421 "out%d: %dx%d, format = %d, padded width = %d\n",
422 i,
423 bi->out_frame_info[i].res.width,
424 bi->out_frame_info[i].res.height,
425 bi->out_frame_info[i].format,
426 bi->out_frame_info[i].padded_width);
427 }
428 }
429 ia_css_debug_dtrace(2,
430 "vf out: %dx%d, format = %d, padded width = %d\n",
431 bi->vf_frame_info.res.width,
432 bi->vf_frame_info.res.height,
433 bi->vf_frame_info.format,
434 bi->vf_frame_info.padded_width);
435 ia_css_debug_dtrace(2, "online = %d\n", bi->online);
436 ia_css_debug_dtrace(2, "input_buf_vectors = %d\n",
437 bi->input_buf_vectors);
438 ia_css_debug_dtrace(2, "deci_factor_log2 = %d\n", bi->deci_factor_log2);
439 ia_css_debug_dtrace(2, "vf_downscale_log2 = %d\n",
440 bi->vf_downscale_log2);
441 ia_css_debug_dtrace(2, "dis_deci_factor_log2 = %d\n",
442 bi->dis.deci_factor_log2);
443 ia_css_debug_dtrace(2, "dis hor coef num = %d\n",
444 bi->dis.coef.pad.width);
445 ia_css_debug_dtrace(2, "dis ver coef num = %d\n",
446 bi->dis.coef.pad.height);
447 ia_css_debug_dtrace(2, "dis hor proj num = %d\n",
448 bi->dis.proj.pad.height);
449 ia_css_debug_dtrace(2, "sctbl_width_per_color = %d\n",
450 bi->sctbl_width_per_color);
451 ia_css_debug_dtrace(2, "s3atbl_width = %d\n", bi->s3atbl_width);
452 ia_css_debug_dtrace(2, "s3atbl_height = %d\n", bi->s3atbl_height);
453 return;
454 }
455
ia_css_debug_frame_print(const struct ia_css_frame * frame,const char * descr)456 void ia_css_debug_frame_print(const struct ia_css_frame *frame,
457 const char *descr)
458 {
459 char *data = NULL;
460
461 assert(frame);
462 assert(descr);
463
464 data = (char *)HOST_ADDRESS(frame->data);
465 ia_css_debug_dtrace(2, "frame %s (%p):\n", descr, frame);
466 ia_css_debug_dtrace(2, " resolution = %dx%d\n",
467 frame->frame_info.res.width, frame->frame_info.res.height);
468 ia_css_debug_dtrace(2, " padded width = %d\n",
469 frame->frame_info.padded_width);
470 ia_css_debug_dtrace(2, " format = %d\n", frame->frame_info.format);
471 switch (frame->frame_info.format) {
472 case IA_CSS_FRAME_FORMAT_NV12:
473 case IA_CSS_FRAME_FORMAT_NV16:
474 case IA_CSS_FRAME_FORMAT_NV21:
475 case IA_CSS_FRAME_FORMAT_NV61:
476 ia_css_debug_dtrace(2, " Y = %p\n",
477 data + frame->planes.nv.y.offset);
478 ia_css_debug_dtrace(2, " UV = %p\n",
479 data + frame->planes.nv.uv.offset);
480 break;
481 case IA_CSS_FRAME_FORMAT_YUYV:
482 case IA_CSS_FRAME_FORMAT_UYVY:
483 case IA_CSS_FRAME_FORMAT_CSI_MIPI_YUV420_8:
484 case IA_CSS_FRAME_FORMAT_CSI_MIPI_LEGACY_YUV420_8:
485 case IA_CSS_FRAME_FORMAT_YUV_LINE:
486 ia_css_debug_dtrace(2, " YUYV = %p\n",
487 data + frame->planes.yuyv.offset);
488 break;
489 case IA_CSS_FRAME_FORMAT_YUV420:
490 case IA_CSS_FRAME_FORMAT_YUV422:
491 case IA_CSS_FRAME_FORMAT_YUV444:
492 case IA_CSS_FRAME_FORMAT_YV12:
493 case IA_CSS_FRAME_FORMAT_YV16:
494 case IA_CSS_FRAME_FORMAT_YUV420_16:
495 case IA_CSS_FRAME_FORMAT_YUV422_16:
496 ia_css_debug_dtrace(2, " Y = %p\n",
497 data + frame->planes.yuv.y.offset);
498 ia_css_debug_dtrace(2, " U = %p\n",
499 data + frame->planes.yuv.u.offset);
500 ia_css_debug_dtrace(2, " V = %p\n",
501 data + frame->planes.yuv.v.offset);
502 break;
503 case IA_CSS_FRAME_FORMAT_RAW_PACKED:
504 ia_css_debug_dtrace(2, " RAW PACKED = %p\n",
505 data + frame->planes.raw.offset);
506 break;
507 case IA_CSS_FRAME_FORMAT_RAW:
508 ia_css_debug_dtrace(2, " RAW = %p\n",
509 data + frame->planes.raw.offset);
510 break;
511 case IA_CSS_FRAME_FORMAT_RGBA888:
512 case IA_CSS_FRAME_FORMAT_RGB565:
513 ia_css_debug_dtrace(2, " RGB = %p\n",
514 data + frame->planes.rgb.offset);
515 break;
516 case IA_CSS_FRAME_FORMAT_QPLANE6:
517 ia_css_debug_dtrace(2, " R = %p\n",
518 data + frame->planes.plane6.r.offset);
519 ia_css_debug_dtrace(2, " RatB = %p\n",
520 data + frame->planes.plane6.r_at_b.offset);
521 ia_css_debug_dtrace(2, " Gr = %p\n",
522 data + frame->planes.plane6.gr.offset);
523 ia_css_debug_dtrace(2, " Gb = %p\n",
524 data + frame->planes.plane6.gb.offset);
525 ia_css_debug_dtrace(2, " B = %p\n",
526 data + frame->planes.plane6.b.offset);
527 ia_css_debug_dtrace(2, " BatR = %p\n",
528 data + frame->planes.plane6.b_at_r.offset);
529 break;
530 case IA_CSS_FRAME_FORMAT_BINARY_8:
531 ia_css_debug_dtrace(2, " Binary data = %p\n",
532 data + frame->planes.binary.data.offset);
533 break;
534 default:
535 ia_css_debug_dtrace(2, " unknown frame type\n");
536 break;
537 }
538 return;
539 }
540
541 #if SP_DEBUG != SP_DEBUG_NONE
542
ia_css_debug_print_sp_debug_state(const struct sh_css_sp_debug_state * state)543 void ia_css_debug_print_sp_debug_state(const struct sh_css_sp_debug_state
544 *state)
545 {
546 #endif
547
548 #if SP_DEBUG == SP_DEBUG_DUMP
549
550 assert(state);
551 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
552 "current SP software counter: %d\n",
553 state->debug[0]);
554 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
555 "empty output buffer queue head: 0x%x\n",
556 state->debug[1]);
557 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
558 "empty output buffer queue tail: 0x%x\n",
559 state->debug[2]);
560 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
561 "empty s3a buffer queue head: 0x%x\n",
562 state->debug[3]);
563 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
564 "empty s3a buffer queue tail: 0x%x\n",
565 state->debug[4]);
566 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
567 "full output buffer queue head: 0x%x\n",
568 state->debug[5]);
569 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
570 "full output buffer queue tail: 0x%x\n",
571 state->debug[6]);
572 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
573 "full s3a buffer queue head: 0x%x\n",
574 state->debug[7]);
575 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
576 "full s3a buffer queue tail: 0x%x\n",
577 state->debug[8]);
578 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "event queue head: 0x%x\n",
579 state->debug[9]);
580 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "event queue tail: 0x%x\n",
581 state->debug[10]);
582 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
583 "num of stages of current pipeline: 0x%x\n",
584 state->debug[11]);
585 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "DDR address of stage 1: 0x%x\n",
586 state->debug[12]);
587 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "DDR address of stage 2: 0x%x\n",
588 state->debug[13]);
589 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
590 "current stage out_vf buffer idx: 0x%x\n",
591 state->debug[14]);
592 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
593 "current stage output buffer idx: 0x%x\n",
594 state->debug[15]);
595 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
596 "current stage s3a buffer idx: 0x%x\n",
597 state->debug[16]);
598 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
599 "first char of current stage name: 0x%x\n",
600 state->debug[17]);
601 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "current SP thread id: 0x%x\n",
602 state->debug[18]);
603 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
604 "empty output buffer address 1: 0x%x\n",
605 state->debug[19]);
606 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
607 "empty output buffer address 2: 0x%x\n",
608 state->debug[20]);
609 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
610 "empty out_vf buffer address 1: 0x%x\n",
611 state->debug[21]);
612 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
613 "empty out_vf buffer address 2: 0x%x\n",
614 state->debug[22]);
615 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
616 "empty s3a_hi buffer address 1: 0x%x\n",
617 state->debug[23]);
618 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
619 "empty s3a_hi buffer address 2: 0x%x\n",
620 state->debug[24]);
621 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
622 "empty s3a_lo buffer address 1: 0x%x\n",
623 state->debug[25]);
624 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
625 "empty s3a_lo buffer address 2: 0x%x\n",
626 state->debug[26]);
627 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
628 "empty dis_hor buffer address 1: 0x%x\n",
629 state->debug[27]);
630 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
631 "empty dis_hor buffer address 2: 0x%x\n",
632 state->debug[28]);
633 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
634 "empty dis_ver buffer address 1: 0x%x\n",
635 state->debug[29]);
636 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
637 "empty dis_ver buffer address 2: 0x%x\n",
638 state->debug[30]);
639 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
640 "empty param buffer address: 0x%x\n",
641 state->debug[31]);
642 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
643 "first incorrect frame address: 0x%x\n",
644 state->debug[32]);
645 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
646 "first incorrect frame container address: 0x%x\n",
647 state->debug[33]);
648 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
649 "first incorrect frame container payload: 0x%x\n",
650 state->debug[34]);
651 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
652 "first incorrect s3a_hi address: 0x%x\n",
653 state->debug[35]);
654 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
655 "first incorrect s3a_hi container address: 0x%x\n",
656 state->debug[36]);
657 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
658 "first incorrect s3a_hi container payload: 0x%x\n",
659 state->debug[37]);
660 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
661 "first incorrect s3a_lo address: 0x%x\n",
662 state->debug[38]);
663 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
664 "first incorrect s3a_lo container address: 0x%x\n",
665 state->debug[39]);
666 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
667 "first incorrect s3a_lo container payload: 0x%x\n",
668 state->debug[40]);
669 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
670 "number of calling flash start function: 0x%x\n",
671 state->debug[41]);
672 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
673 "number of calling flash close function: 0x%x\n",
674 state->debug[42]);
675 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "number of flashed frame: 0x%x\n",
676 state->debug[43]);
677 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "flash in use flag: 0x%x\n",
678 state->debug[44]);
679 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
680 "number of update frame flashed flag: 0x%x\n",
681 state->debug[46]);
682 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
683 "number of active threads: 0x%x\n",
684 state->debug[45]);
685
686 #elif SP_DEBUG == SP_DEBUG_COPY
687
688 /* Remember last_index because we only want to print new entries */
689 static int last_index;
690 int sp_index = state->index;
691 int n;
692
693 assert(state);
694 if (sp_index < last_index) {
695 /* SP has been reset */
696 last_index = 0;
697 }
698
699 if (last_index == 0) {
700 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
701 "copy-trace init: sp_dbg_if_start_line=%d, sp_dbg_if_start_column=%d, sp_dbg_if_cropped_height=%d, sp_debg_if_cropped_width=%d\n",
702 state->if_start_line,
703 state->if_start_column,
704 state->if_cropped_height,
705 state->if_cropped_width);
706 }
707
708 if ((last_index + SH_CSS_SP_DBG_TRACE_DEPTH) < sp_index) {
709 /* last index can be multiple rounds behind */
710 /* while trace size is only SH_CSS_SP_DBG_TRACE_DEPTH */
711 last_index = sp_index - SH_CSS_SP_DBG_TRACE_DEPTH;
712 }
713
714 for (n = last_index; n < sp_index; n++) {
715 int i = n % SH_CSS_SP_DBG_TRACE_DEPTH;
716
717 if (state->trace[i].frame != 0) {
718 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
719 "copy-trace: frame=%d, line=%d, pixel_distance=%d, mipi_used_dword=%d, sp_index=%d\n",
720 state->trace[i].frame,
721 state->trace[i].line,
722 state->trace[i].pixel_distance,
723 state->trace[i].mipi_used_dword,
724 state->trace[i].sp_index);
725 }
726 }
727
728 last_index = sp_index;
729
730 #elif SP_DEBUG == SP_DEBUG_TRACE
731
732 /*
733 * This is just an example how TRACE_FILE_ID (see ia_css_debug.sp.h) will
734 * me mapped on the file name string.
735 *
736 * Adjust this to your trace case!
737 */
738 static char const *const id2filename[8] = {
739 "param_buffer.sp.c | tagger.sp.c | pipe_data.sp.c",
740 "isp_init.sp.c",
741 "sp_raw_copy.hive.c",
742 "dma_configure.sp.c",
743 "sp.hive.c",
744 "event_proxy_sp.hive.c",
745 "circular_buffer.sp.c",
746 "frame_buffer.sp.c"
747 };
748
749 /* Example SH_CSS_SP_DBG_NR_OF_TRACES==1 */
750 /* Adjust this to your trace case */
751 static char const *trace_name[SH_CSS_SP_DBG_NR_OF_TRACES] = {
752 "default"
753 };
754
755 /* Remember host_index_last because we only want to print new entries */
756 static int host_index_last[SH_CSS_SP_DBG_NR_OF_TRACES] = { 0 };
757 int t, n;
758
759 assert(state);
760
761 for (t = 0; t < SH_CSS_SP_DBG_NR_OF_TRACES; t++) {
762 int sp_index_last = state->index_last[t];
763
764 if (sp_index_last < host_index_last[t]) {
765 /* SP has been reset */
766 host_index_last[t] = 0;
767 }
768
769 if ((host_index_last[t] + SH_CSS_SP_DBG_TRACE_DEPTH) <
770 sp_index_last) {
771 /* last index can be multiple rounds behind */
772 /* while trace size is only SH_CSS_SP_DBG_TRACE_DEPTH */
773 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
774 "Warning: trace %s has gap of %d traces\n",
775 trace_name[t],
776 (sp_index_last -
777 (host_index_last[t] +
778 SH_CSS_SP_DBG_TRACE_DEPTH)));
779
780 host_index_last[t] =
781 sp_index_last - SH_CSS_SP_DBG_TRACE_DEPTH;
782 }
783
784 for (n = host_index_last[t]; n < sp_index_last; n++) {
785 int i = n % SH_CSS_SP_DBG_TRACE_DEPTH;
786 int l = state->trace[t][i].location &
787 ((1 << SH_CSS_SP_DBG_TRACE_FILE_ID_BIT_POS) - 1);
788 int fid = state->trace[t][i].location >>
789 SH_CSS_SP_DBG_TRACE_FILE_ID_BIT_POS;
790 int ts = state->trace[t][i].time_stamp;
791
792 if (ts) {
793 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
794 "%05d trace=%s, file=%s:%d, data=0x%08x\n",
795 ts,
796 trace_name[t],
797 id2filename[fid], l,
798 state->trace[t][i].data);
799 }
800 }
801 host_index_last[t] = sp_index_last;
802 }
803
804 #elif SP_DEBUG == SP_DEBUG_MINIMAL
805 int i;
806 int base = 0;
807 int limit = SH_CSS_NUM_SP_DEBUG;
808 int step = 1;
809
810 assert(state);
811
812 for (i = base; i < limit; i += step) {
813 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
814 "sp_dbg_trace[%d] = %d\n",
815 i, state->debug[i]);
816 }
817 #endif
818
819 #if SP_DEBUG != SP_DEBUG_NONE
820
821 return;
822 }
823 #endif
824
ia_css_debug_dump_sp_sw_debug_info(void)825 void ia_css_debug_dump_sp_sw_debug_info(void)
826 {
827 #if SP_DEBUG != SP_DEBUG_NONE
828 struct sh_css_sp_debug_state state;
829
830 sh_css_sp_get_debug_state(&state);
831 ia_css_debug_print_sp_debug_state(&state);
832 #endif
833 ia_css_bufq_dump_queue_info();
834 ia_css_pipeline_dump_thread_map_info();
835 return;
836 }
837
838 /* this function is for debug use, it can make SP go to sleep
839 state after each frame, then user can dump the stable SP dmem.
840 this function can be called after ia_css_start_sp()
841 and before sh_css_init_buffer_queues()
842 */
ia_css_debug_enable_sp_sleep_mode(enum ia_css_sp_sleep_mode mode)843 void ia_css_debug_enable_sp_sleep_mode(enum ia_css_sp_sleep_mode mode)
844 {
845 const struct ia_css_fw_info *fw;
846 unsigned int HIVE_ADDR_sp_sleep_mode;
847
848 fw = &sh_css_sp_fw;
849 HIVE_ADDR_sp_sleep_mode = fw->info.sp.sleep_mode;
850
851 (void)HIVE_ADDR_sp_sleep_mode; /* Suppress warnings in CRUN */
852
853 sp_dmem_store_uint32(SP0_ID,
854 (unsigned int)sp_address_of(sp_sleep_mode),
855 (uint32_t)mode);
856 }
857
ia_css_debug_wake_up_sp(void)858 void ia_css_debug_wake_up_sp(void)
859 {
860 /*hrt_ctl_start(SP); */
861 sp_ctrl_setbit(SP0_ID, SP_SC_REG, SP_START_BIT);
862 }
863
864 #define FIND_DMEM_PARAMS_TYPE(stream, kernel, type) \
865 (struct CONCATENATE(CONCATENATE(sh_css_isp_, type), _params) *) \
866 findf_dmem_params(stream, offsetof(struct ia_css_memory_offsets, dmem.kernel))
867
868 #define FIND_DMEM_PARAMS(stream, kernel) FIND_DMEM_PARAMS_TYPE(stream, kernel, kernel)
869
870 /* Find a stage that support the kernel and return the parameters for that kernel */
871 static char *
findf_dmem_params(struct ia_css_stream * stream,short idx)872 findf_dmem_params(struct ia_css_stream *stream, short idx)
873 {
874 int i;
875
876 for (i = 0; i < stream->num_pipes; i++) {
877 struct ia_css_pipe *pipe = stream->pipes[i];
878 struct ia_css_pipeline *pipeline = ia_css_pipe_get_pipeline(pipe);
879 struct ia_css_pipeline_stage *stage;
880
881 for (stage = pipeline->stages; stage; stage = stage->next) {
882 struct ia_css_binary *binary = stage->binary;
883 short *offsets = (short *)&binary->info->mem_offsets.offsets.param->dmem;
884 short dmem_offset = offsets[idx];
885 const struct ia_css_host_data *isp_data =
886 ia_css_isp_param_get_mem_init(&binary->mem_params,
887 IA_CSS_PARAM_CLASS_PARAM, IA_CSS_ISP_DMEM0);
888 if (dmem_offset < 0)
889 continue;
890 return &isp_data->address[dmem_offset];
891 }
892 }
893 return NULL;
894 }
895
ia_css_debug_dump_isp_params(struct ia_css_stream * stream,unsigned int enable)896 void ia_css_debug_dump_isp_params(struct ia_css_stream *stream,
897 unsigned int enable)
898 {
899 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE, "ISP PARAMETERS:\n");
900
901 assert(stream);
902 if ((enable & IA_CSS_DEBUG_DUMP_FPN)
903 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
904 ia_css_fpn_dump(FIND_DMEM_PARAMS(stream, fpn), IA_CSS_DEBUG_VERBOSE);
905 }
906 if ((enable & IA_CSS_DEBUG_DUMP_OB)
907 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
908 ia_css_ob_dump(FIND_DMEM_PARAMS(stream, ob), IA_CSS_DEBUG_VERBOSE);
909 }
910 if ((enable & IA_CSS_DEBUG_DUMP_SC)
911 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
912 ia_css_sc_dump(FIND_DMEM_PARAMS(stream, sc), IA_CSS_DEBUG_VERBOSE);
913 }
914 if ((enable & IA_CSS_DEBUG_DUMP_WB)
915 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
916 ia_css_wb_dump(FIND_DMEM_PARAMS(stream, wb), IA_CSS_DEBUG_VERBOSE);
917 }
918 if ((enable & IA_CSS_DEBUG_DUMP_DP)
919 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
920 ia_css_dp_dump(FIND_DMEM_PARAMS(stream, dp), IA_CSS_DEBUG_VERBOSE);
921 }
922 if ((enable & IA_CSS_DEBUG_DUMP_BNR)
923 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
924 ia_css_bnr_dump(FIND_DMEM_PARAMS(stream, bnr), IA_CSS_DEBUG_VERBOSE);
925 }
926 if ((enable & IA_CSS_DEBUG_DUMP_S3A)
927 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
928 ia_css_s3a_dump(FIND_DMEM_PARAMS(stream, s3a), IA_CSS_DEBUG_VERBOSE);
929 }
930 if ((enable & IA_CSS_DEBUG_DUMP_DE)
931 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
932 ia_css_de_dump(FIND_DMEM_PARAMS(stream, de), IA_CSS_DEBUG_VERBOSE);
933 }
934 if ((enable & IA_CSS_DEBUG_DUMP_YNR)
935 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
936 ia_css_nr_dump(FIND_DMEM_PARAMS_TYPE(stream, nr, ynr), IA_CSS_DEBUG_VERBOSE);
937 ia_css_yee_dump(FIND_DMEM_PARAMS(stream, yee), IA_CSS_DEBUG_VERBOSE);
938 }
939 if ((enable & IA_CSS_DEBUG_DUMP_CSC)
940 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
941 ia_css_csc_dump(FIND_DMEM_PARAMS(stream, csc), IA_CSS_DEBUG_VERBOSE);
942 ia_css_yuv2rgb_dump(FIND_DMEM_PARAMS_TYPE(stream, yuv2rgb, csc),
943 IA_CSS_DEBUG_VERBOSE);
944 ia_css_rgb2yuv_dump(FIND_DMEM_PARAMS_TYPE(stream, rgb2yuv, csc),
945 IA_CSS_DEBUG_VERBOSE);
946 }
947 if ((enable & IA_CSS_DEBUG_DUMP_GC)
948 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
949 ia_css_gc_dump(FIND_DMEM_PARAMS(stream, gc), IA_CSS_DEBUG_VERBOSE);
950 }
951 if ((enable & IA_CSS_DEBUG_DUMP_TNR)
952 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
953 ia_css_tnr_dump(FIND_DMEM_PARAMS(stream, tnr), IA_CSS_DEBUG_VERBOSE);
954 }
955 if ((enable & IA_CSS_DEBUG_DUMP_ANR)
956 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
957 ia_css_anr_dump(FIND_DMEM_PARAMS(stream, anr), IA_CSS_DEBUG_VERBOSE);
958 }
959 if ((enable & IA_CSS_DEBUG_DUMP_CE)
960 || (enable & IA_CSS_DEBUG_DUMP_ALL)) {
961 ia_css_ce_dump(FIND_DMEM_PARAMS(stream, ce), IA_CSS_DEBUG_VERBOSE);
962 }
963 }
964
sh_css_dump_sp_raw_copy_linecount(bool reduced)965 void sh_css_dump_sp_raw_copy_linecount(bool reduced)
966 {
967 const struct ia_css_fw_info *fw;
968 unsigned int HIVE_ADDR_raw_copy_line_count;
969 s32 raw_copy_line_count;
970 static s32 prev_raw_copy_line_count = -1;
971
972 fw = &sh_css_sp_fw;
973 HIVE_ADDR_raw_copy_line_count =
974 fw->info.sp.raw_copy_line_count;
975
976 (void)HIVE_ADDR_raw_copy_line_count;
977
978 sp_dmem_load(SP0_ID,
979 (unsigned int)sp_address_of(raw_copy_line_count),
980 &raw_copy_line_count,
981 sizeof(raw_copy_line_count));
982
983 /* only indicate if copy loop is active */
984 if (reduced)
985 raw_copy_line_count = (raw_copy_line_count < 0) ? raw_copy_line_count : 1;
986 /* do the handling */
987 if (prev_raw_copy_line_count != raw_copy_line_count) {
988 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
989 "sh_css_dump_sp_raw_copy_linecount() line_count=%d\n",
990 raw_copy_line_count);
991 prev_raw_copy_line_count = raw_copy_line_count;
992 }
993 }
994
ia_css_debug_dump_isp_binary(void)995 void ia_css_debug_dump_isp_binary(void)
996 {
997 const struct ia_css_fw_info *fw;
998 unsigned int HIVE_ADDR_pipeline_sp_curr_binary_id;
999 u32 curr_binary_id;
1000 static u32 prev_binary_id = 0xFFFFFFFF;
1001 static u32 sample_count;
1002
1003 fw = &sh_css_sp_fw;
1004 HIVE_ADDR_pipeline_sp_curr_binary_id = fw->info.sp.curr_binary_id;
1005
1006 (void)HIVE_ADDR_pipeline_sp_curr_binary_id;
1007
1008 sp_dmem_load(SP0_ID,
1009 (unsigned int)sp_address_of(pipeline_sp_curr_binary_id),
1010 &curr_binary_id,
1011 sizeof(curr_binary_id));
1012
1013 /* do the handling */
1014 sample_count++;
1015 if (prev_binary_id != curr_binary_id) {
1016 ia_css_debug_dtrace(IA_CSS_DEBUG_VERBOSE,
1017 "sh_css_dump_isp_binary() pipe_id=%d, binary_id=%d, sample_count=%d\n",
1018 (curr_binary_id >> 16),
1019 (curr_binary_id & 0x0ffff),
1020 sample_count);
1021 sample_count = 0;
1022 prev_binary_id = curr_binary_id;
1023 }
1024 }
1025
1026 /*
1027 * @brief Initialize the debug mode.
1028 * Refer to "ia_css_debug.h" for more details.
1029 */
ia_css_debug_mode_init(void)1030 bool ia_css_debug_mode_init(void)
1031 {
1032 bool rc;
1033
1034 rc = sh_css_sp_init_dma_sw_reg(0);
1035 return rc;
1036 }
1037
1038 /*
1039 * @brief Disable the DMA channel.
1040 * Refer to "ia_css_debug.h" for more details.
1041 */
1042 bool
ia_css_debug_mode_disable_dma_channel(int dma_id,int channel_id,int request_type)1043 ia_css_debug_mode_disable_dma_channel(int dma_id,
1044 int channel_id, int request_type)
1045 {
1046 bool rc;
1047
1048 rc = sh_css_sp_set_dma_sw_reg(dma_id, channel_id, request_type, false);
1049
1050 return rc;
1051 }
1052
1053 /*
1054 * @brief Enable the DMA channel.
1055 * Refer to "ia_css_debug.h" for more details.
1056 */
1057 bool
ia_css_debug_mode_enable_dma_channel(int dma_id,int channel_id,int request_type)1058 ia_css_debug_mode_enable_dma_channel(int dma_id,
1059 int channel_id, int request_type)
1060 {
1061 bool rc;
1062
1063 rc = sh_css_sp_set_dma_sw_reg(dma_id, channel_id, request_type, true);
1064
1065 return rc;
1066 }
1067
dtrace_dot(const char * fmt,...)1068 static void __printf(1, 2) dtrace_dot(const char *fmt, ...)
1069 {
1070 va_list ap;
1071
1072 assert(fmt);
1073 va_start(ap, fmt);
1074
1075 ia_css_debug_dtrace(IA_CSS_DEBUG_INFO, "%s", DPG_START);
1076 ia_css_debug_vdtrace(IA_CSS_DEBUG_INFO, fmt, ap);
1077 ia_css_debug_dtrace(IA_CSS_DEBUG_INFO, "%s", DPG_END);
1078 va_end(ap);
1079 }
1080
1081 static void
ia_css_debug_pipe_graph_dump_frame(const struct ia_css_frame * frame,enum ia_css_pipe_id id,char const * blob_name,char const * frame_name,bool in_frame)1082 ia_css_debug_pipe_graph_dump_frame(
1083 const struct ia_css_frame *frame,
1084 enum ia_css_pipe_id id,
1085 char const *blob_name,
1086 char const *frame_name,
1087 bool in_frame)
1088 {
1089 char bufinfo[100];
1090
1091 if (frame->dynamic_queue_id == SH_CSS_INVALID_QUEUE_ID) {
1092 snprintf(bufinfo, sizeof(bufinfo), "Internal");
1093 } else {
1094 snprintf(bufinfo, sizeof(bufinfo), "Queue: %s %s",
1095 pipe_id_to_str[id],
1096 queue_id_to_str[frame->dynamic_queue_id]);
1097 }
1098 dtrace_dot(
1099 "node [shape = box, fixedsize=true, width=2, height=0.7]; \"%p\" [label = \"%s\\n%d(%d) x %d, %dbpp\\n%s\"];",
1100 frame,
1101 debug_frame_format2str(frame->frame_info.format),
1102 frame->frame_info.res.width,
1103 frame->frame_info.padded_width,
1104 frame->frame_info.res.height,
1105 frame->frame_info.raw_bit_depth,
1106 bufinfo);
1107
1108 if (in_frame) {
1109 dtrace_dot(
1110 "\"%p\"->\"%s(pipe%d)\" [label = %s_frame];",
1111 frame,
1112 blob_name, id, frame_name);
1113 } else {
1114 dtrace_dot(
1115 "\"%s(pipe%d)\"->\"%p\" [label = %s_frame];",
1116 blob_name, id,
1117 frame,
1118 frame_name);
1119 }
1120 }
1121
1122 void
ia_css_debug_pipe_graph_dump_prologue(void)1123 ia_css_debug_pipe_graph_dump_prologue(void)
1124 {
1125 dtrace_dot("digraph sh_css_pipe_graph {");
1126 dtrace_dot("rankdir=LR;");
1127
1128 dtrace_dot("fontsize=9;");
1129 dtrace_dot("label = \"\\nEnable options: rp=reduced pipe, vfve=vf_veceven, dvse=dvs_envelope, dvs6=dvs_6axis, bo=block_out, fbds=fixed_bayer_ds, bf6=bayer_fir_6db, rawb=raw_binning, cont=continuous, disc=dis_crop\\n"
1130 "dp2a=dp_2adjacent, outp=output, outt=out_table, reff=ref_frame, par=params, gam=gamma, cagdc=ca_gdc, ispa=isp_addresses, inf=in_frame, outf=out_frame, hs=high_speed, inpc=input_chunking\"");
1131 }
1132
ia_css_debug_pipe_graph_dump_epilogue(void)1133 void ia_css_debug_pipe_graph_dump_epilogue(void)
1134 {
1135 if (strlen(ring_buffer) > 0) {
1136 dtrace_dot(ring_buffer);
1137 }
1138
1139 if (pg_inst.stream_format != N_ATOMISP_INPUT_FORMAT) {
1140 /* An input stream format has been set so assume we have
1141 * an input system and sensor
1142 */
1143
1144 dtrace_dot(
1145 "node [shape = doublecircle, fixedsize=true, width=2.5]; \"input_system\" [label = \"Input system\"];");
1146
1147 dtrace_dot(
1148 "\"input_system\"->\"%s\" [label = \"%s\"];",
1149 dot_id_input_bin, debug_stream_format2str(pg_inst.stream_format));
1150
1151 dtrace_dot(
1152 "node [shape = doublecircle, fixedsize=true, width=2.5]; \"sensor\" [label = \"Sensor\"];");
1153
1154 dtrace_dot(
1155 "\"sensor\"->\"input_system\" [label = \"%s\\n%d x %d\\n(%d x %d)\"];",
1156 debug_stream_format2str(pg_inst.stream_format),
1157 pg_inst.width, pg_inst.height,
1158 pg_inst.eff_width, pg_inst.eff_height);
1159 }
1160
1161 dtrace_dot("}");
1162
1163 /* Reset temp strings */
1164 memset(dot_id_input_bin, 0, sizeof(dot_id_input_bin));
1165 memset(ring_buffer, 0, sizeof(ring_buffer));
1166
1167 pg_inst.do_init = true;
1168 pg_inst.width = 0;
1169 pg_inst.height = 0;
1170 pg_inst.eff_width = 0;
1171 pg_inst.eff_height = 0;
1172 pg_inst.stream_format = N_ATOMISP_INPUT_FORMAT;
1173 }
1174
1175 void
ia_css_debug_pipe_graph_dump_stage(struct ia_css_pipeline_stage * stage,enum ia_css_pipe_id id)1176 ia_css_debug_pipe_graph_dump_stage(
1177 struct ia_css_pipeline_stage *stage,
1178 enum ia_css_pipe_id id)
1179 {
1180 char blob_name[SH_CSS_MAX_BINARY_NAME + 10] = "<unknown type>";
1181 char const *bin_type = "<unknown type>";
1182 int i;
1183
1184 assert(stage);
1185 if (stage->sp_func != IA_CSS_PIPELINE_NO_FUNC)
1186 return;
1187
1188 if (pg_inst.do_init) {
1189 ia_css_debug_pipe_graph_dump_prologue();
1190 pg_inst.do_init = false;
1191 }
1192
1193 if (stage->binary) {
1194 bin_type = "binary";
1195 if (stage->binary->info->blob)
1196 snprintf(blob_name, sizeof(blob_name), "%s_stage%d",
1197 stage->binary->info->blob->name, stage->stage_num);
1198 } else if (stage->firmware) {
1199 bin_type = "firmware";
1200
1201 strscpy(blob_name, IA_CSS_EXT_ISP_PROG_NAME(stage->firmware),
1202 sizeof(blob_name));
1203 }
1204
1205 /* Guard in case of binaries that don't have any binary_info */
1206 if (stage->binary_info) {
1207 char enable_info1[100];
1208 char enable_info2[100];
1209 char enable_info3[100];
1210 char enable_info[302];
1211 struct ia_css_binary_info *bi = stage->binary_info;
1212
1213 /* Split it in 2 function-calls to keep the amount of
1214 * parameters per call "reasonable"
1215 */
1216 snprintf(enable_info1, sizeof(enable_info1),
1217 "%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
1218 bi->enable.reduced_pipe ? "rp," : "",
1219 bi->enable.vf_veceven ? "vfve," : "",
1220 bi->enable.dis ? "dis," : "",
1221 bi->enable.dvs_envelope ? "dvse," : "",
1222 bi->enable.uds ? "uds," : "",
1223 bi->enable.dvs_6axis ? "dvs6," : "",
1224 bi->enable.block_output ? "bo," : "",
1225 bi->enable.ds ? "ds," : "",
1226 bi->enable.bayer_fir_6db ? "bf6," : "",
1227 bi->enable.raw_binning ? "rawb," : "",
1228 bi->enable.continuous ? "cont," : "",
1229 bi->enable.s3a ? "s3a," : "",
1230 bi->enable.fpnr ? "fpnr," : "",
1231 bi->enable.sc ? "sc," : ""
1232 );
1233
1234 snprintf(enable_info2, sizeof(enable_info2),
1235 "%s%s%s%s%s%s%s%s%s%s%s",
1236 bi->enable.macc ? "macc," : "",
1237 bi->enable.output ? "outp," : "",
1238 bi->enable.ref_frame ? "reff," : "",
1239 bi->enable.tnr ? "tnr," : "",
1240 bi->enable.xnr ? "xnr," : "",
1241 bi->enable.params ? "par," : "",
1242 bi->enable.ca_gdc ? "cagdc," : "",
1243 bi->enable.isp_addresses ? "ispa," : "",
1244 bi->enable.in_frame ? "inf," : "",
1245 bi->enable.out_frame ? "outf," : "",
1246 bi->enable.high_speed ? "hs," : ""
1247 );
1248
1249 /* And merge them into one string */
1250 snprintf(enable_info, sizeof(enable_info), "%s%s",
1251 enable_info1, enable_info2);
1252 {
1253 int l, p;
1254 char *ei = enable_info;
1255
1256 l = strlen(ei);
1257
1258 /* Replace last ',' with \0 if present */
1259 if (l && enable_info[l - 1] == ',')
1260 enable_info[--l] = '\0';
1261
1262 if (l > ENABLE_LINE_MAX_LENGTH) {
1263 /* Too big for one line, find last comma */
1264 p = ENABLE_LINE_MAX_LENGTH;
1265 while (ei[p] != ',')
1266 p--;
1267 /* Last comma found, copy till that comma */
1268 strscpy(enable_info1, ei,
1269 p > sizeof(enable_info1) ? sizeof(enable_info1) : p);
1270
1271 ei += p + 1;
1272 l = strlen(ei);
1273
1274 if (l <= ENABLE_LINE_MAX_LENGTH) {
1275 /* The 2nd line fits */
1276 /* we cannot use ei as argument because
1277 * it is not guaranteed dword aligned
1278 */
1279
1280 strscpy(enable_info2, ei,
1281 l > sizeof(enable_info2) ? sizeof(enable_info2) : l);
1282
1283 snprintf(enable_info, sizeof(enable_info), "%s\\n%s",
1284 enable_info1, enable_info2);
1285
1286 } else {
1287 /* 2nd line is still too long */
1288 p = ENABLE_LINE_MAX_LENGTH;
1289 while (ei[p] != ',')
1290 p--;
1291
1292 strscpy(enable_info2, ei,
1293 p > sizeof(enable_info2) ? sizeof(enable_info2) : p);
1294
1295 ei += p + 1;
1296 l = strlen(ei);
1297
1298 if (l <= ENABLE_LINE_MAX_LENGTH) {
1299 /* The 3rd line fits */
1300 /* we cannot use ei as argument because
1301 * it is not guaranteed dword aligned
1302 */
1303 strscpy(enable_info3, ei,
1304 sizeof(enable_info3));
1305 snprintf(enable_info, sizeof(enable_info),
1306 "%s\\n%s\\n%s",
1307 enable_info1, enable_info2,
1308 enable_info3);
1309 } else {
1310 /* 3rd line is still too long */
1311 p = ENABLE_LINE_MAX_LENGTH;
1312 while (ei[p] != ',')
1313 p--;
1314 strscpy(enable_info3, ei,
1315 p > sizeof(enable_info3) ? sizeof(enable_info3) : p);
1316 ei += p + 1;
1317 strscpy(enable_info3, ei,
1318 sizeof(enable_info3));
1319 snprintf(enable_info, sizeof(enable_info),
1320 "%s\\n%s\\n%s",
1321 enable_info1, enable_info2,
1322 enable_info3);
1323 }
1324 }
1325 }
1326 }
1327
1328 dtrace_dot("node [shape = circle, fixedsize=true, width=2.5, label=\"%s\\n%s\\n\\n%s\"]; \"%s(pipe%d)\"",
1329 bin_type, blob_name, enable_info, blob_name, id);
1330 } else {
1331 dtrace_dot("node [shape = circle, fixedsize=true, width=2.5, label=\"%s\\n%s\\n\"]; \"%s(pipe%d)\"",
1332 bin_type, blob_name, blob_name, id);
1333 }
1334
1335 if (stage->stage_num == 0) {
1336 /*
1337 * There are some implicit assumptions about which bin is the
1338 * input binary e.g. which one is connected to the input system
1339 * Priority:
1340 * 1) sp_raw_copy bin has highest priority
1341 * 2) First stage==0 binary of preview, video or capture
1342 */
1343 if (strlen(dot_id_input_bin) == 0) {
1344 snprintf(dot_id_input_bin, sizeof(dot_id_input_bin),
1345 "%s(pipe%d)", blob_name, id);
1346 }
1347 }
1348
1349 if (stage->args.in_frame) {
1350 ia_css_debug_pipe_graph_dump_frame(
1351 stage->args.in_frame, id, blob_name,
1352 "in", true);
1353 }
1354
1355 for (i = 0; i < NUM_VIDEO_TNR_FRAMES; i++) {
1356 if (stage->args.tnr_frames[i]) {
1357 ia_css_debug_pipe_graph_dump_frame(
1358 stage->args.tnr_frames[i], id,
1359 blob_name, "tnr_frame", true);
1360 }
1361 }
1362
1363 for (i = 0; i < MAX_NUM_VIDEO_DELAY_FRAMES; i++) {
1364 if (stage->args.delay_frames[i]) {
1365 ia_css_debug_pipe_graph_dump_frame(
1366 stage->args.delay_frames[i], id,
1367 blob_name, "delay_frame", true);
1368 }
1369 }
1370
1371 for (i = 0; i < IA_CSS_BINARY_MAX_OUTPUT_PORTS; i++) {
1372 if (stage->args.out_frame[i]) {
1373 ia_css_debug_pipe_graph_dump_frame(
1374 stage->args.out_frame[i], id, blob_name,
1375 "out", false);
1376 }
1377 }
1378
1379 if (stage->args.out_vf_frame) {
1380 ia_css_debug_pipe_graph_dump_frame(
1381 stage->args.out_vf_frame, id, blob_name,
1382 "out_vf", false);
1383 }
1384 }
1385
1386 void
ia_css_debug_pipe_graph_dump_sp_raw_copy(struct ia_css_frame * out_frame)1387 ia_css_debug_pipe_graph_dump_sp_raw_copy(
1388 struct ia_css_frame *out_frame)
1389 {
1390 assert(out_frame);
1391 if (pg_inst.do_init) {
1392 ia_css_debug_pipe_graph_dump_prologue();
1393 pg_inst.do_init = false;
1394 }
1395
1396 dtrace_dot("node [shape = circle, fixedsize=true, width=2.5, label=\"%s\\n%s\"]; \"%s(pipe%d)\"",
1397 "sp-binary", "sp_raw_copy", "sp_raw_copy", 1);
1398
1399 snprintf(ring_buffer, sizeof(ring_buffer),
1400 "node [shape = box, fixedsize=true, width=2, height=0.7]; \"%p\" [label = \"%s\\n%d(%d) x %d\\nRingbuffer\"];",
1401 out_frame,
1402 debug_frame_format2str(out_frame->frame_info.format),
1403 out_frame->frame_info.res.width,
1404 out_frame->frame_info.padded_width,
1405 out_frame->frame_info.res.height);
1406
1407 dtrace_dot(ring_buffer);
1408
1409 dtrace_dot(
1410 "\"%s(pipe%d)\"->\"%p\" [label = out_frame];",
1411 "sp_raw_copy", 1, out_frame);
1412
1413 snprintf(dot_id_input_bin, sizeof(dot_id_input_bin), "%s(pipe%d)",
1414 "sp_raw_copy", 1);
1415 }
1416
1417 void
ia_css_debug_pipe_graph_dump_stream_config(const struct ia_css_stream_config * stream_config)1418 ia_css_debug_pipe_graph_dump_stream_config(
1419 const struct ia_css_stream_config *stream_config)
1420 {
1421 pg_inst.width = stream_config->input_config.input_res.width;
1422 pg_inst.height = stream_config->input_config.input_res.height;
1423 pg_inst.eff_width = stream_config->input_config.effective_res.width;
1424 pg_inst.eff_height = stream_config->input_config.effective_res.height;
1425 pg_inst.stream_format = stream_config->input_config.format;
1426 }
1427
1428 void
ia_css_debug_dump_resolution(const struct ia_css_resolution * res,const char * label)1429 ia_css_debug_dump_resolution(
1430 const struct ia_css_resolution *res,
1431 const char *label)
1432 {
1433 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s: =%d x =%d\n",
1434 label, res->width, res->height);
1435 }
1436
1437 void
ia_css_debug_dump_frame_info(const struct ia_css_frame_info * info,const char * label)1438 ia_css_debug_dump_frame_info(
1439 const struct ia_css_frame_info *info,
1440 const char *label)
1441 {
1442 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s\n", label);
1443 ia_css_debug_dump_resolution(&info->res, "res");
1444 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "padded_width: %d\n",
1445 info->padded_width);
1446 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "format: %d\n", info->format);
1447 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "raw_bit_depth: %d\n",
1448 info->raw_bit_depth);
1449 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "raw_bayer_order: %d\n",
1450 info->raw_bayer_order);
1451 }
1452
1453 void
ia_css_debug_dump_capture_config(const struct ia_css_capture_config * config)1454 ia_css_debug_dump_capture_config(
1455 const struct ia_css_capture_config *config)
1456 {
1457 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s\n", __func__);
1458 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "mode: %d\n", config->mode);
1459 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "enable_xnr: %d\n",
1460 config->enable_xnr);
1461 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "enable_raw_output: %d\n",
1462 config->enable_raw_output);
1463 }
1464
1465 void
ia_css_debug_dump_pipe_extra_config(const struct ia_css_pipe_extra_config * extra_config)1466 ia_css_debug_dump_pipe_extra_config(
1467 const struct ia_css_pipe_extra_config *extra_config)
1468 {
1469 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s\n", __func__);
1470 if (extra_config) {
1471 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1472 "enable_raw_binning: %d\n",
1473 extra_config->enable_raw_binning);
1474 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "enable_yuv_ds: %d\n",
1475 extra_config->enable_yuv_ds);
1476 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1477 "enable_high_speed: %d\n",
1478 extra_config->enable_high_speed);
1479 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1480 "enable_dvs_6axis: %d\n",
1481 extra_config->enable_dvs_6axis);
1482 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1483 "enable_reduced_pipe: %d\n",
1484 extra_config->enable_reduced_pipe);
1485 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1486 "enable_fractional_ds: %d\n",
1487 extra_config->enable_fractional_ds);
1488 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "disable_vf_pp: %d\n",
1489 extra_config->disable_vf_pp);
1490 }
1491 }
1492
1493 void
ia_css_debug_dump_pipe_config(const struct ia_css_pipe_config * config)1494 ia_css_debug_dump_pipe_config(
1495 const struct ia_css_pipe_config *config)
1496 {
1497 unsigned int i;
1498
1499 IA_CSS_ENTER_PRIVATE("config = %p", config);
1500 if (!config) {
1501 IA_CSS_ERROR("NULL input parameter");
1502 IA_CSS_LEAVE_PRIVATE("");
1503 return;
1504 }
1505 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "mode: %d\n", config->mode);
1506 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "isp_pipe_version: %d\n",
1507 config->isp_pipe_version);
1508 ia_css_debug_dump_resolution(&config->bayer_ds_out_res,
1509 "bayer_ds_out_res");
1510 ia_css_debug_dump_resolution(&config->capt_pp_in_res,
1511 "capt_pp_in_res");
1512 ia_css_debug_dump_resolution(&config->vf_pp_in_res, "vf_pp_in_res");
1513
1514 if (IS_ISP2401) {
1515 ia_css_debug_dump_resolution(&config->output_system_in_res,
1516 "output_system_in_res");
1517 }
1518 ia_css_debug_dump_resolution(&config->dvs_crop_out_res,
1519 "dvs_crop_out_res");
1520 for (i = 0; i < IA_CSS_PIPE_MAX_OUTPUT_STAGE; i++) {
1521 ia_css_debug_dump_frame_info(&config->output_info[i], "output_info");
1522 ia_css_debug_dump_frame_info(&config->vf_output_info[i],
1523 "vf_output_info");
1524 }
1525 ia_css_debug_dump_capture_config(&config->default_capture_config);
1526 ia_css_debug_dump_resolution(&config->dvs_envelope, "dvs_envelope");
1527 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "dvs_frame_delay: %d\n",
1528 config->dvs_frame_delay);
1529 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "enable_dz: %d\n",
1530 config->enable_dz);
1531 IA_CSS_LEAVE_PRIVATE("");
1532 }
1533
1534 void
ia_css_debug_dump_stream_config_source(const struct ia_css_stream_config * config)1535 ia_css_debug_dump_stream_config_source(
1536 const struct ia_css_stream_config *config)
1537 {
1538 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s()\n", __func__);
1539 switch (config->mode) {
1540 case IA_CSS_INPUT_MODE_SENSOR:
1541 case IA_CSS_INPUT_MODE_BUFFERED_SENSOR:
1542 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "source.port\n");
1543 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "port: %d\n",
1544 config->source.port.port);
1545 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "num_lanes: %d\n",
1546 config->source.port.num_lanes);
1547 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "timeout: %d\n",
1548 config->source.port.timeout);
1549 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "compression: %d\n",
1550 config->source.port.compression.type);
1551 break;
1552 case IA_CSS_INPUT_MODE_PRBS:
1553 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "source.prbs\n");
1554 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "id: %d\n",
1555 config->source.prbs.id);
1556 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "h_blank: %d\n",
1557 config->source.prbs.h_blank);
1558 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "v_blank: %d\n",
1559 config->source.prbs.v_blank);
1560 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "seed: 0x%x\n",
1561 config->source.prbs.seed);
1562 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "seed1: 0x%x\n",
1563 config->source.prbs.seed1);
1564 break;
1565 default:
1566 case IA_CSS_INPUT_MODE_FIFO:
1567 case IA_CSS_INPUT_MODE_MEMORY:
1568 break;
1569 }
1570 }
1571
1572 void
ia_css_debug_dump_mipi_buffer_config(const struct ia_css_mipi_buffer_config * config)1573 ia_css_debug_dump_mipi_buffer_config(
1574 const struct ia_css_mipi_buffer_config *config)
1575 {
1576 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s()\n", __func__);
1577 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "size_mem_words: %d\n",
1578 config->size_mem_words);
1579 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "nof_mipi_buffers: %d\n",
1580 config->nof_mipi_buffers);
1581 }
1582
1583 void
ia_css_debug_dump_metadata_config(const struct ia_css_metadata_config * config)1584 ia_css_debug_dump_metadata_config(
1585 const struct ia_css_metadata_config *config)
1586 {
1587 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s()\n", __func__);
1588 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "data_type: %d\n",
1589 config->data_type);
1590 ia_css_debug_dump_resolution(&config->resolution, "resolution");
1591 }
1592
1593 void
ia_css_debug_dump_stream_config(const struct ia_css_stream_config * config,int num_pipes)1594 ia_css_debug_dump_stream_config(
1595 const struct ia_css_stream_config *config,
1596 int num_pipes)
1597 {
1598 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%s()\n", __func__);
1599 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "num_pipes: %d\n", num_pipes);
1600 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "mode: %d\n", config->mode);
1601 ia_css_debug_dump_stream_config_source(config);
1602 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "channel_id: %d\n",
1603 config->channel_id);
1604 ia_css_debug_dump_resolution(&config->input_config.input_res, "input_res");
1605 ia_css_debug_dump_resolution(&config->input_config.effective_res,
1606 "effective_res");
1607 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "format: %d\n",
1608 config->input_config.format);
1609 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "bayer_order: %d\n",
1610 config->input_config.bayer_order);
1611 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "sensor_binning_factor: %d\n",
1612 config->sensor_binning_factor);
1613 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "pixels_per_clock: %d\n",
1614 config->pixels_per_clock);
1615 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "online: %d\n",
1616 config->online);
1617 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "init_num_cont_raw_buf: %d\n",
1618 config->init_num_cont_raw_buf);
1619 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1620 "target_num_cont_raw_buf: %d\n",
1621 config->target_num_cont_raw_buf);
1622 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "pack_raw_pixels: %d\n",
1623 config->pack_raw_pixels);
1624 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "continuous: %d\n",
1625 config->continuous);
1626 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "flash_gpio_pin: %d\n",
1627 config->flash_gpio_pin);
1628 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "left_padding: %d\n",
1629 config->left_padding);
1630 ia_css_debug_dump_mipi_buffer_config(&config->mipi_buffer_config);
1631 ia_css_debug_dump_metadata_config(&config->metadata_config);
1632 }
1633
1634 /*
1635 Trace support.
1636
1637 This tracer is using a buffer to trace the flow of the FW and dump misc values (see below for details).
1638 Currently, support is only for SKC.
1639 To enable support for other platforms:
1640 - Allocate a buffer for tracing in DMEM. The longer the better.
1641 - Use the DBG_init routine in sp.hive.c to initiatilize the tracer with the address and size selected.
1642 - Add trace points in the SP code wherever needed.
1643 - Enable the dump below with the required address and required adjustments.
1644 Dump is called at the end of ia_css_debug_dump_sp_state().
1645 */
1646
1647 /*
1648 dump_trace() : dump the trace points from DMEM2.
1649 for every trace point, the following are printed: index, major:minor and the 16-bit attached value.
1650 The routine looks for the first 0, and then prints from it cyclically.
1651 Data forma in DMEM2:
1652 first 4 DWORDS: header
1653 DWORD 0: data description
1654 byte 0: version
1655 byte 1: number of threads (for future use)
1656 byte 2+3: number ot TPs
1657 DWORD 1: command byte + data (for future use)
1658 byte 0: command
1659 byte 1-3: command signature
1660 DWORD 2-3: additional data (for future use)
1661 Following data is 4-byte oriented:
1662 byte 0: major
1663 byte 1: minor
1664 byte 2-3: data
1665 */
1666 #if TRACE_ENABLE_SP0 || TRACE_ENABLE_SP1 || TRACE_ENABLE_ISP
debug_dump_one_trace(enum TRACE_CORE_ID proc_id)1667 static void debug_dump_one_trace(enum TRACE_CORE_ID proc_id)
1668 {
1669 #if defined(HAS_TRACER_V2)
1670 u32 start_addr;
1671 u32 start_addr_data;
1672 u32 item_size;
1673 u32 tmp;
1674 u8 tid_val;
1675 enum TRACE_DUMP_FORMAT dump_format;
1676
1677 int i, j, max_trace_points, point_num, limit = -1;
1678 /* using a static buffer here as the driver has issues allocating memory */
1679 static u32 trace_read_buf[TRACE_BUFF_SIZE] = {0};
1680 static struct trace_header_t header;
1681 u8 *header_arr;
1682
1683 /* read the header and parse it */
1684 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "~~~ Tracer ");
1685 switch (proc_id) {
1686 case TRACE_SP0_ID:
1687 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "SP0");
1688 start_addr = TRACE_SP0_ADDR;
1689 start_addr_data = TRACE_SP0_DATA_ADDR;
1690 item_size = TRACE_SP0_ITEM_SIZE;
1691 max_trace_points = TRACE_SP0_MAX_POINTS;
1692 break;
1693 case TRACE_SP1_ID:
1694 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "SP1");
1695 start_addr = TRACE_SP1_ADDR;
1696 start_addr_data = TRACE_SP1_DATA_ADDR;
1697 item_size = TRACE_SP1_ITEM_SIZE;
1698 max_trace_points = TRACE_SP1_MAX_POINTS;
1699 break;
1700 case TRACE_ISP_ID:
1701 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "ISP");
1702 start_addr = TRACE_ISP_ADDR;
1703 start_addr_data = TRACE_ISP_DATA_ADDR;
1704 item_size = TRACE_ISP_ITEM_SIZE;
1705 max_trace_points = TRACE_ISP_MAX_POINTS;
1706 break;
1707 default:
1708 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1709 "\t\ttraces are not supported for this processor ID - exiting\n");
1710 return;
1711 }
1712
1713 if (!IS_ISP2401) {
1714 tmp = ia_css_device_load_uint32(start_addr);
1715 point_num = (tmp >> 16) & 0xFFFF;
1716
1717 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, " ver %d %d points\n", tmp & 0xFF,
1718 point_num);
1719 } else {
1720 /* Loading byte-by-byte as using the master routine had issues */
1721 header_arr = (uint8_t *)&header;
1722 for (i = 0; i < (int)sizeof(struct trace_header_t); i++)
1723 header_arr[i] = ia_css_device_load_uint8(start_addr + (i));
1724
1725 point_num = header.max_tracer_points;
1726
1727 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, " ver %d %d points\n", header.version,
1728 point_num);
1729
1730 tmp = header.version;
1731 }
1732 if ((tmp & 0xFF) != TRACER_VER) {
1733 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "\t\tUnknown version - exiting\n");
1734 return;
1735 }
1736 if (point_num > max_trace_points) {
1737 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "\t\tToo many points - exiting\n");
1738 return;
1739 }
1740 /* copy the TPs and find the first 0 */
1741 for (i = 0; i < point_num; i++) {
1742 trace_read_buf[i] = ia_css_device_load_uint32(start_addr_data +
1743 (i * item_size));
1744 if ((limit == (-1)) && (trace_read_buf[i] == 0))
1745 limit = i;
1746 }
1747 if (IS_ISP2401) {
1748 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "Status:\n");
1749 for (i = 0; i < SH_CSS_MAX_SP_THREADS; i++)
1750 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE,
1751 "\tT%d: %3d (%02x) %6d (%04x) %10d (%08x)\n", i,
1752 header.thr_status_byte[i], header.thr_status_byte[i],
1753 header.thr_status_word[i], header.thr_status_word[i],
1754 header.thr_status_dword[i], header.thr_status_dword[i]);
1755 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "Scratch:\n");
1756 for (i = 0; i < MAX_SCRATCH_DATA; i++)
1757 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "%10d (%08x) ",
1758 header.scratch_debug[i], header.scratch_debug[i]);
1759 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "\n");
1760 }
1761 /* two 0s in the beginning: empty buffer */
1762 if ((trace_read_buf[0] == 0) && (trace_read_buf[1] == 0)) {
1763 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "\t\tEmpty tracer - exiting\n");
1764 return;
1765 }
1766 /* no overrun: start from 0 */
1767 if ((limit == point_num - 1) ||
1768 /* first 0 is at the end - border case */
1769 (trace_read_buf[limit + 1] ==
1770 0)) /* did not make a full cycle after the memset */
1771 limit = 0;
1772 /* overrun: limit is the first non-zero after the first zero */
1773 else
1774 limit++;
1775
1776 /* print the TPs */
1777 for (i = 0; i < point_num; i++) {
1778 j = (limit + i) % point_num;
1779 if (trace_read_buf[j]) {
1780 if (!IS_ISP2401) {
1781 TRACE_DUMP_FORMAT dump_format = FIELD_FORMAT_UNPACK(trace_read_buf[j]);
1782 } else {
1783 tid_val = FIELD_TID_UNPACK(trace_read_buf[j]);
1784 dump_format = TRACE_DUMP_FORMAT_POINT;
1785
1786 /*
1787 * When tid value is 111b, the data will be interpreted differently:
1788 * tid val is ignored, major field contains 2 bits (msb) for format type
1789 */
1790 if (tid_val == FIELD_TID_SEL_FORMAT_PAT) {
1791 dump_format = FIELD_FORMAT_UNPACK(trace_read_buf[j]);
1792 }
1793 }
1794 switch (dump_format) {
1795 case TRACE_DUMP_FORMAT_POINT:
1796 ia_css_debug_dtrace(
1797 IA_CSS_DEBUG_TRACE, "\t\t%d %d:%d value - %d\n",
1798 j, FIELD_MAJOR_UNPACK(trace_read_buf[j]),
1799 FIELD_MINOR_UNPACK(trace_read_buf[j]),
1800 FIELD_VALUE_UNPACK(trace_read_buf[j]));
1801 break;
1802 /* ISP2400 */
1803 case TRACE_DUMP_FORMAT_VALUE24_HEX:
1804 ia_css_debug_dtrace(
1805 IA_CSS_DEBUG_TRACE, "\t\t%d, %d, 24bit value %x H\n",
1806 j,
1807 FIELD_MAJOR_UNPACK(trace_read_buf[j]),
1808 FIELD_VALUE_24_UNPACK(trace_read_buf[j]));
1809 break;
1810 /* ISP2400 */
1811 case TRACE_DUMP_FORMAT_VALUE24_DEC:
1812 ia_css_debug_dtrace(
1813 IA_CSS_DEBUG_TRACE, "\t\t%d, %d, 24bit value %d D\n",
1814 j,
1815 FIELD_MAJOR_UNPACK(trace_read_buf[j]),
1816 FIELD_VALUE_24_UNPACK(trace_read_buf[j]));
1817 break;
1818 /* ISP2401 */
1819 case TRACE_DUMP_FORMAT_POINT_NO_TID:
1820 ia_css_debug_dtrace(
1821 IA_CSS_DEBUG_TRACE, "\t\t%d %d:%d value - %x (%d)\n",
1822 j,
1823 FIELD_MAJOR_W_FMT_UNPACK(trace_read_buf[j]),
1824 FIELD_MINOR_UNPACK(trace_read_buf[j]),
1825 FIELD_VALUE_UNPACK(trace_read_buf[j]),
1826 FIELD_VALUE_UNPACK(trace_read_buf[j]));
1827 break;
1828 /* ISP2401 */
1829 case TRACE_DUMP_FORMAT_VALUE24:
1830 ia_css_debug_dtrace(
1831 IA_CSS_DEBUG_TRACE, "\t\t%d, %d, 24bit value %x (%d)\n",
1832 j,
1833 FIELD_MAJOR_UNPACK(trace_read_buf[j]),
1834 FIELD_MAJOR_W_FMT_UNPACK(trace_read_buf[j]),
1835 FIELD_VALUE_24_UNPACK(trace_read_buf[j]),
1836 FIELD_VALUE_24_UNPACK(trace_read_buf[j]));
1837 break;
1838 case TRACE_DUMP_FORMAT_VALUE24_TIMING:
1839 ia_css_debug_dtrace(
1840 IA_CSS_DEBUG_TRACE, "\t\t%d, %d, timing %x\n",
1841 j,
1842 FIELD_MAJOR_UNPACK(trace_read_buf[j]),
1843 FIELD_VALUE_24_UNPACK(trace_read_buf[j]));
1844 break;
1845 case TRACE_DUMP_FORMAT_VALUE24_TIMING_DELTA:
1846 ia_css_debug_dtrace(
1847 IA_CSS_DEBUG_TRACE, "\t\t%d, %d, timing delta %x\n",
1848 j,
1849 FIELD_MAJOR_UNPACK(trace_read_buf[j]),
1850 FIELD_VALUE_24_UNPACK(trace_read_buf[j]));
1851 break;
1852 default:
1853 ia_css_debug_dtrace(
1854 IA_CSS_DEBUG_TRACE,
1855 "no such trace dump format %d",
1856 dump_format);
1857 break;
1858 }
1859 }
1860 }
1861 #else
1862 (void)proc_id;
1863 #endif /* HAS_TRACER_V2 */
1864 }
1865 #endif /* TRACE_ENABLE_SP0 || TRACE_ENABLE_SP1 || TRACE_ENABLE_ISP */
1866
ia_css_debug_dump_trace(void)1867 void ia_css_debug_dump_trace(void)
1868 {
1869 #if TRACE_ENABLE_SP0
1870 debug_dump_one_trace(TRACE_SP0_ID);
1871 #endif
1872 #if TRACE_ENABLE_SP1
1873 debug_dump_one_trace(TRACE_SP1_ID);
1874 #endif
1875 #if TRACE_ENABLE_ISP
1876 debug_dump_one_trace(TRACE_ISP_ID);
1877 #endif
1878 }
1879
1880 /* ISP2401 */
ia_css_debug_pc_dump(sp_ID_t id,unsigned int num_of_dumps)1881 void ia_css_debug_pc_dump(sp_ID_t id, unsigned int num_of_dumps)
1882 {
1883 unsigned int pc;
1884 unsigned int i;
1885 hrt_data sc = sp_ctrl_load(id, SP_SC_REG);
1886
1887 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "SP%-1d Status reg: 0x%X\n", id, sc);
1888 sc = sp_ctrl_load(id, SP_CTRL_SINK_REG);
1889 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "SP%-1d Stall reg: 0x%X\n", id, sc);
1890 for (i = 0; i < num_of_dumps; i++) {
1891 pc = sp_ctrl_load(id, SP_PC_REG);
1892 ia_css_debug_dtrace(IA_CSS_DEBUG_TRACE, "SP%-1d PC: 0x%X\n", id, pc);
1893 }
1894 }
1895