GNU Linux-libre 4.14.254-gnu1
[releases.git] / drivers / staging / media / atomisp / pci / atomisp2 / css2400 / css_trace.h
1 /*
2  * Support for Intel Camera Imaging ISP subsystem.
3  * Copyright (c) 2015, Intel Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms and conditions of the GNU General Public License,
7  * version 2, as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  */
14
15 #ifndef __CSS_TRACE_H_
16 #define __CSS_TRACE_H_
17
18 #include <type_support.h>
19 #ifdef ISP2401
20 #include "sh_css_internal.h"    /* for SH_CSS_MAX_SP_THREADS */
21 #endif
22
23 /*
24         structs and constants for tracing
25 */
26
27 /* one tracer item: major, minor and counter. The counter value can be used for GP data */
28 struct trace_item_t {
29         uint8_t   major;
30         uint8_t   minor;
31         uint16_t  counter;
32 };
33
34 #ifdef ISP2401
35 #define MAX_SCRATCH_DATA        4
36 #define MAX_CMD_DATA            2
37
38 #endif
39 /* trace header: holds the version and the topology of the tracer. */
40 struct trace_header_t {
41 #ifndef ISP2401
42         /* 1st dword */
43 #else
44         /* 1st dword: descriptor */
45 #endif
46         uint8_t   version;
47         uint8_t   max_threads;
48         uint16_t  max_tracer_points;
49 #ifdef ISP2401
50         /* 2nd field: command + data */
51 #endif
52         /* 2nd dword */
53         uint32_t  command;
54         /* 3rd & 4th dword */
55 #ifndef ISP2401
56         uint32_t  data[2];
57 #else
58         uint32_t  data[MAX_CMD_DATA];
59         /* 3rd field: debug pointer */
60 #endif
61         /* 5th & 6th dword: debug pointer mechanism */
62         uint32_t  debug_ptr_signature;
63         uint32_t  debug_ptr_value;
64 #ifdef ISP2401
65         /* Rest of the header: status & scratch data */
66         uint8_t   thr_status_byte[SH_CSS_MAX_SP_THREADS];
67         uint16_t  thr_status_word[SH_CSS_MAX_SP_THREADS];
68         uint32_t  thr_status_dword[SH_CSS_MAX_SP_THREADS];
69         uint32_t  scratch_debug[MAX_SCRATCH_DATA];
70 #endif
71 };
72
73 #ifndef ISP2401
74 #define TRACER_VER                      2
75 #else
76 /* offsets for master_port read/write */
77 #define HDR_HDR_OFFSET              0   /* offset of the header */
78 #define HDR_COMMAND_OFFSET          offsetof(struct trace_header_t, command)
79 #define HDR_DATA_OFFSET             offsetof(struct trace_header_t, data)
80 #define HDR_DEBUG_SIGNATURE_OFFSET  offsetof(struct trace_header_t, debug_ptr_signature)
81 #define HDR_DEBUG_POINTER_OFFSET    offsetof(struct trace_header_t, debug_ptr_value)
82 #define HDR_STATUS_OFFSET           offsetof(struct trace_header_t, thr_status_byte)
83 #define HDR_STATUS_OFFSET_BYTE      offsetof(struct trace_header_t, thr_status_byte)
84 #define HDR_STATUS_OFFSET_WORD      offsetof(struct trace_header_t, thr_status_word)
85 #define HDR_STATUS_OFFSET_DWORD     offsetof(struct trace_header_t, thr_status_dword)
86 #define HDR_STATUS_OFFSET_SCRATCH   offsetof(struct trace_header_t, scratch_debug)
87
88 /*
89 Trace version history:
90  1: initial version, hdr = descr, command & ptr.
91  2: added ISP + 24-bit fields.
92  3: added thread ID.
93  4: added status in header.
94 */
95 #define TRACER_VER                      4
96
97 #endif
98 #define TRACE_BUFF_ADDR       0xA000
99 #define TRACE_BUFF_SIZE       0x1000    /* 4K allocated */
100
101 #define TRACE_ENABLE_SP0 0
102 #define TRACE_ENABLE_SP1 0
103 #define TRACE_ENABLE_ISP 0
104
105 #ifndef ISP2401
106 typedef enum {
107 #else
108 enum TRACE_CORE_ID {
109 #endif
110         TRACE_SP0_ID,
111         TRACE_SP1_ID,
112         TRACE_ISP_ID
113 #ifndef ISP2401
114 } TRACE_CORE_ID;
115 #else
116 };
117 #endif
118
119 /* TODO: add timing format? */
120 #ifndef ISP2401
121 typedef enum {
122         TRACE_DUMP_FORMAT_POINT,
123         TRACE_DUMP_FORMAT_VALUE24_HEX,
124         TRACE_DUMP_FORMAT_VALUE24_DEC,
125 #else
126 enum TRACE_DUMP_FORMAT {
127         TRACE_DUMP_FORMAT_POINT_NO_TID,
128         TRACE_DUMP_FORMAT_VALUE24,
129 #endif
130         TRACE_DUMP_FORMAT_VALUE24_TIMING,
131 #ifndef ISP2401
132         TRACE_DUMP_FORMAT_VALUE24_TIMING_DELTA
133 } TRACE_DUMP_FORMAT;
134 #else
135         TRACE_DUMP_FORMAT_VALUE24_TIMING_DELTA,
136         TRACE_DUMP_FORMAT_POINT
137 };
138 #endif
139
140
141 /* currently divided as follows:*/
142 #if (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 3)
143 /* can be divided as needed */
144 #define TRACE_SP0_SIZE (TRACE_BUFF_SIZE/4)
145 #define TRACE_SP1_SIZE (TRACE_BUFF_SIZE/4)
146 #define TRACE_ISP_SIZE (TRACE_BUFF_SIZE/2)
147 #elif (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 2)
148 #if TRACE_ENABLE_SP0
149 #define TRACE_SP0_SIZE (TRACE_BUFF_SIZE/2)
150 #else
151 #define TRACE_SP0_SIZE (0)
152 #endif
153 #if TRACE_ENABLE_SP1
154 #define TRACE_SP1_SIZE (TRACE_BUFF_SIZE/2)
155 #else
156 #define TRACE_SP1_SIZE (0)
157 #endif
158 #if TRACE_ENABLE_ISP
159 #define TRACE_ISP_SIZE (TRACE_BUFF_SIZE/2)
160 #else
161 #define TRACE_ISP_SIZE (0)
162 #endif
163 #elif (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 1)
164 #if TRACE_ENABLE_SP0
165 #define TRACE_SP0_SIZE (TRACE_BUFF_SIZE)
166 #else
167 #define TRACE_SP0_SIZE (0)
168 #endif
169 #if TRACE_ENABLE_SP1
170 #define TRACE_SP1_SIZE (TRACE_BUFF_SIZE)
171 #else
172 #define TRACE_SP1_SIZE (0)
173 #endif
174 #if TRACE_ENABLE_ISP
175 #define TRACE_ISP_SIZE (TRACE_BUFF_SIZE)
176 #else
177 #define TRACE_ISP_SIZE (0)
178 #endif
179 #else
180 #define TRACE_SP0_SIZE (0)
181 #define TRACE_SP1_SIZE (0)
182 #define TRACE_ISP_SIZE (0)
183 #endif
184
185 #define TRACE_SP0_ADDR (TRACE_BUFF_ADDR)
186 #define TRACE_SP1_ADDR (TRACE_SP0_ADDR + TRACE_SP0_SIZE)
187 #define TRACE_ISP_ADDR (TRACE_SP1_ADDR + TRACE_SP1_SIZE)
188
189 /* check if it's a legal division */
190 #if (TRACE_BUFF_SIZE < TRACE_SP0_SIZE + TRACE_SP1_SIZE + TRACE_ISP_SIZE)
191 #error trace sizes are not divided correctly and are above limit
192 #endif
193
194 #define TRACE_SP0_HEADER_ADDR (TRACE_SP0_ADDR)
195 #define TRACE_SP0_HEADER_SIZE (sizeof(struct trace_header_t))
196 #ifndef ISP2401
197 #define TRACE_SP0_ITEM_SIZE (sizeof(struct trace_item_t))
198 #define TRACE_SP0_DATA_ADDR (TRACE_SP0_HEADER_ADDR + TRACE_SP0_HEADER_SIZE)
199 #define TRACE_SP0_DATA_SIZE (TRACE_SP0_SIZE - TRACE_SP0_HEADER_SIZE)
200 #define TRACE_SP0_MAX_POINTS (TRACE_SP0_DATA_SIZE / TRACE_SP0_ITEM_SIZE)
201 #else
202 #define TRACE_SP0_ITEM_SIZE   (sizeof(struct trace_item_t))
203 #define TRACE_SP0_DATA_ADDR   (TRACE_SP0_HEADER_ADDR + TRACE_SP0_HEADER_SIZE)
204 #define TRACE_SP0_DATA_SIZE   (TRACE_SP0_SIZE - TRACE_SP0_HEADER_SIZE)
205 #define TRACE_SP0_MAX_POINTS  (TRACE_SP0_DATA_SIZE / TRACE_SP0_ITEM_SIZE)
206 #endif
207
208 #define TRACE_SP1_HEADER_ADDR (TRACE_SP1_ADDR)
209 #define TRACE_SP1_HEADER_SIZE (sizeof(struct trace_header_t))
210 #ifndef ISP2401
211 #define TRACE_SP1_ITEM_SIZE (sizeof(struct trace_item_t))
212 #define TRACE_SP1_DATA_ADDR (TRACE_SP1_HEADER_ADDR + TRACE_SP1_HEADER_SIZE)
213 #define TRACE_SP1_DATA_SIZE (TRACE_SP1_SIZE - TRACE_SP1_HEADER_SIZE)
214 #define TRACE_SP1_MAX_POINTS (TRACE_SP1_DATA_SIZE / TRACE_SP1_ITEM_SIZE)
215 #else
216 #define TRACE_SP1_ITEM_SIZE   (sizeof(struct trace_item_t))
217 #define TRACE_SP1_DATA_ADDR   (TRACE_SP1_HEADER_ADDR + TRACE_SP1_HEADER_SIZE)
218 #define TRACE_SP1_DATA_SIZE   (TRACE_SP1_SIZE - TRACE_SP1_HEADER_SIZE)
219 #define TRACE_SP1_MAX_POINTS  (TRACE_SP1_DATA_SIZE / TRACE_SP1_ITEM_SIZE)
220 #endif
221
222 #define TRACE_ISP_HEADER_ADDR (TRACE_ISP_ADDR)
223 #define TRACE_ISP_HEADER_SIZE (sizeof(struct trace_header_t))
224 #ifndef ISP2401
225 #define TRACE_ISP_ITEM_SIZE (sizeof(struct trace_item_t))
226 #define TRACE_ISP_DATA_ADDR (TRACE_ISP_HEADER_ADDR + TRACE_ISP_HEADER_SIZE)
227 #define TRACE_ISP_DATA_SIZE (TRACE_ISP_SIZE - TRACE_ISP_HEADER_SIZE)
228 #define TRACE_ISP_MAX_POINTS (TRACE_ISP_DATA_SIZE / TRACE_ISP_ITEM_SIZE)
229
230 #else
231 #define TRACE_ISP_ITEM_SIZE   (sizeof(struct trace_item_t))
232 #define TRACE_ISP_DATA_ADDR   (TRACE_ISP_HEADER_ADDR + TRACE_ISP_HEADER_SIZE)
233 #define TRACE_ISP_DATA_SIZE   (TRACE_ISP_SIZE - TRACE_ISP_HEADER_SIZE)
234 #define TRACE_ISP_MAX_POINTS  (TRACE_ISP_DATA_SIZE / TRACE_ISP_ITEM_SIZE)
235 #endif
236
237 #ifndef ISP2401
238 /* offsets for master_port read/write */
239 #define HDR_HDR_OFFSET              0   /* offset of the header */
240 #define HDR_COMMAND_OFFSET          4   /* offset of the command */
241 #define HDR_DATA_OFFSET             8   /* offset of the command data */
242 #define HDR_DEBUG_SIGNATURE_OFFSET  16  /* offset of the param debug signature in trace_header_t */
243 #define HDR_DEBUG_POINTER_OFFSET    20  /* offset of the param debug pointer in trace_header_t */
244 #endif
245
246 /* common majors */
247 #ifdef ISP2401
248 /* SP0 */
249 #endif
250 #define MAJOR_MAIN              1
251 #define MAJOR_ISP_STAGE_ENTRY   2
252 #define MAJOR_DMA_PRXY          3
253 #define MAJOR_START_ISP         4
254 #ifdef ISP2401
255 /* SP1 */
256 #define MAJOR_OBSERVER_ISP0_EVENT          21
257 #define MAJOR_OBSERVER_OUTPUT_FORM_EVENT   22
258 #define MAJOR_OBSERVER_OUTPUT_SCAL_EVENT   23
259 #define MAJOR_OBSERVER_IF_ACK              24
260 #define MAJOR_OBSERVER_SP0_EVENT           25
261 #define MAJOR_OBSERVER_SP_TERMINATE_EVENT  26
262 #define MAJOR_OBSERVER_DMA_ACK             27
263 #define MAJOR_OBSERVER_ACC_ACK             28
264 #endif
265
266 #define DEBUG_PTR_SIGNATURE     0xABCD  /* signature for the debug parameter pointer */
267
268 /* command codes (1st byte) */
269 typedef enum {
270         CMD_SET_ONE_MAJOR = 1,          /* mask in one major. 2nd byte in the command is the major code */
271         CMD_UNSET_ONE_MAJOR = 2,        /* mask out one major. 2nd byte in the command is the major code */
272         CMD_SET_ALL_MAJORS = 3,         /* set the major print mask. the full mask is in the data DWORD */
273         CMD_SET_VERBOSITY = 4           /* set verbosity level */
274 } DBG_commands;
275
276 /* command signature */
277 #define CMD_SIGNATURE   0xAABBCC00
278
279 /* shared macros in traces infrastructure */
280 /* increment the pointer cyclicly */
281 #define DBG_NEXT_ITEM(x, max_items) (((x+1) >= max_items) ? 0 : x+1)
282 #define DBG_PREV_ITEM(x, max_items) ((x) ? x-1 : max_items-1)
283
284 #define FIELD_MASK(width) (((1 << (width)) - 1))
285 #define FIELD_PACK(value,mask,offset) (((value) & (mask)) << (offset))
286 #define FIELD_UNPACK(value,mask,offset) (((value) >> (offset)) & (mask))
287
288
289 #define FIELD_VALUE_OFFSET              (0)
290 #define FIELD_VALUE_WIDTH               (16)
291 #define FIELD_VALUE_MASK                FIELD_MASK(FIELD_VALUE_WIDTH)
292 #define FIELD_VALUE_PACK(f)             FIELD_PACK(f,FIELD_VALUE_MASK,FIELD_VALUE_OFFSET)
293 #ifndef ISP2401
294 #define FIELD_VALUE_UNPACK(f)   FIELD_UNPACK(f,FIELD_VALUE_MASK,FIELD_VALUE_OFFSET)
295 #else
296 #define FIELD_VALUE_UNPACK(f)           FIELD_UNPACK(f,FIELD_VALUE_MASK,FIELD_VALUE_OFFSET)
297 #endif
298
299 #define FIELD_MINOR_OFFSET              (FIELD_VALUE_OFFSET + FIELD_VALUE_WIDTH)
300 #define FIELD_MINOR_WIDTH               (8)
301 #define FIELD_MINOR_MASK                FIELD_MASK(FIELD_MINOR_WIDTH)
302 #define FIELD_MINOR_PACK(f)             FIELD_PACK(f,FIELD_MINOR_MASK,FIELD_MINOR_OFFSET)
303 #ifndef ISP2401
304 #define FIELD_MINOR_UNPACK(f)   FIELD_UNPACK(f,FIELD_MINOR_MASK,FIELD_MINOR_OFFSET)
305 #else
306 #define FIELD_MINOR_UNPACK(f)           FIELD_UNPACK(f,FIELD_MINOR_MASK,FIELD_MINOR_OFFSET)
307 #endif
308
309 #define FIELD_MAJOR_OFFSET              (FIELD_MINOR_OFFSET + FIELD_MINOR_WIDTH)
310 #define FIELD_MAJOR_WIDTH               (5)
311 #define FIELD_MAJOR_MASK                FIELD_MASK(FIELD_MAJOR_WIDTH)
312 #define FIELD_MAJOR_PACK(f)             FIELD_PACK(f,FIELD_MAJOR_MASK,FIELD_MAJOR_OFFSET)
313 #ifndef ISP2401
314 #define FIELD_MAJOR_UNPACK(f)   FIELD_UNPACK(f,FIELD_MAJOR_MASK,FIELD_MAJOR_OFFSET)
315 #else
316 #define FIELD_MAJOR_UNPACK(f)           FIELD_UNPACK(f,FIELD_MAJOR_MASK,FIELD_MAJOR_OFFSET)
317 #endif
318
319 #ifndef ISP2401
320 #define FIELD_FORMAT_OFFSET             (FIELD_MAJOR_OFFSET + FIELD_MAJOR_WIDTH)
321 #define FIELD_FORMAT_WIDTH              (3)
322 #define FIELD_FORMAT_MASK               FIELD_MASK(FIELD_FORMAT_WIDTH)
323 #define FIELD_FORMAT_PACK(f)    FIELD_PACK(f,FIELD_FORMAT_MASK,FIELD_FORMAT_OFFSET)
324 #define FIELD_FORMAT_UNPACK(f)  FIELD_UNPACK(f,FIELD_FORMAT_MASK,FIELD_FORMAT_OFFSET)
325 #else
326 /* for quick traces - only insertion, compatible with the regular point */
327 #define FIELD_FULL_MAJOR_WIDTH          (8)
328 #define FIELD_FULL_MAJOR_MASK           FIELD_MASK(FIELD_FULL_MAJOR_WIDTH)
329 #define FIELD_FULL_MAJOR_PACK(f)        FIELD_PACK(f,FIELD_FULL_MAJOR_MASK,FIELD_MAJOR_OFFSET)
330
331 /* The following 2 fields are used only when FIELD_TID value is 111b.
332  * it means we don't want to use thread id, but format. In this case,
333  * the last 2 MSB bits of the major field will indicates the format
334  */
335 #define FIELD_MAJOR_W_FMT_OFFSET        FIELD_MAJOR_OFFSET
336 #define FIELD_MAJOR_W_FMT_WIDTH         (3)
337 #define FIELD_MAJOR_W_FMT_MASK          FIELD_MASK(FIELD_MAJOR_W_FMT_WIDTH)
338 #define FIELD_MAJOR_W_FMT_PACK(f)       FIELD_PACK(f,FIELD_MAJOR_W_FMT_MASK,FIELD_MAJOR_W_FMT_OFFSET)
339 #define FIELD_MAJOR_W_FMT_UNPACK(f)     FIELD_UNPACK(f,FIELD_MAJOR_W_FMT_MASK,FIELD_MAJOR_W_FMT_OFFSET)
340
341 #define FIELD_FORMAT_OFFSET             (FIELD_MAJOR_OFFSET + FIELD_MAJOR_W_FMT_WIDTH)
342 #define FIELD_FORMAT_WIDTH              (2)
343 #define FIELD_FORMAT_MASK               FIELD_MASK(FIELD_MAJOR_W_FMT_WIDTH)
344 #define FIELD_FORMAT_PACK(f)            FIELD_PACK(f,FIELD_FORMAT_MASK,FIELD_FORMAT_OFFSET)
345 #define FIELD_FORMAT_UNPACK(f)          FIELD_UNPACK(f,FIELD_FORMAT_MASK,FIELD_FORMAT_OFFSET)
346
347 #define FIELD_TID_SEL_FORMAT_PAT        (7)
348
349 #define FIELD_TID_OFFSET                (FIELD_MAJOR_OFFSET + FIELD_MAJOR_WIDTH)
350 #define FIELD_TID_WIDTH                 (3)
351 #define FIELD_TID_MASK                  FIELD_MASK(FIELD_TID_WIDTH)
352 #define FIELD_TID_PACK(f)               FIELD_PACK(f,FIELD_TID_MASK,FIELD_TID_OFFSET)
353 #define FIELD_TID_UNPACK(f)             FIELD_UNPACK(f,FIELD_TID_MASK,FIELD_TID_OFFSET)
354 #endif
355
356 #define FIELD_VALUE_24_OFFSET           (0)
357 #define FIELD_VALUE_24_WIDTH            (24)
358 #ifndef ISP2401
359 #define FIELD_VALUE_24_MASK                     FIELD_MASK(FIELD_VALUE_24_WIDTH)
360 #else
361 #define FIELD_VALUE_24_MASK             FIELD_MASK(FIELD_VALUE_24_WIDTH)
362 #endif
363 #define FIELD_VALUE_24_PACK(f)          FIELD_PACK(f,FIELD_VALUE_24_MASK,FIELD_VALUE_24_OFFSET)
364 #define FIELD_VALUE_24_UNPACK(f)        FIELD_UNPACK(f,FIELD_VALUE_24_MASK,FIELD_VALUE_24_OFFSET)
365
366 #ifndef ISP2401
367 #define PACK_TRACEPOINT(format,major, minor, value)     \
368         (FIELD_FORMAT_PACK(format) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
369 #else
370 #define PACK_TRACEPOINT(tid, major, minor, value)       \
371         (FIELD_TID_PACK(tid) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
372
373 #define PACK_QUICK_TRACEPOINT(major, minor)     \
374         (FIELD_FULL_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor))
375
376 #define PACK_FORMATTED_TRACEPOINT(format, major, minor, value)  \
377         (FIELD_TID_PACK(FIELD_TID_SEL_FORMAT_PAT) | FIELD_FORMAT_PACK(format) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
378 #endif
379
380 #ifndef ISP2401
381 #define PACK_TRACE_VALUE24(format, major, value)        \
382         (FIELD_FORMAT_PACK(format) | FIELD_MAJOR_PACK(major) | FIELD_VALUE_24_PACK(value))
383 #else
384 #define PACK_TRACE_VALUE24(major, value)        \
385         (FIELD_TID_PACK(FIELD_TID_SEL_FORMAT_PAT) | FIELD_MAJOR_PACK(major) | FIELD_VALUE_24_PACK(value))
386 #endif
387
388 #endif /* __CSS_TRACE_H_ */