1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Support for Intel Camera Imaging ISP subsystem.
4 * Copyright (c) 2015, Intel Corporation.
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.
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
16 #ifndef __CSS_TRACE_H_
17 #define __CSS_TRACE_H_
19 #include <type_support.h>
20 #include "sh_css_internal.h" /* for SH_CSS_MAX_SP_THREADS */
23 structs and constants for tracing
26 /* one tracer item: major, minor and counter. The counter value can be used for GP data */
33 #define MAX_SCRATCH_DATA 4
34 #define MAX_CMD_DATA 2
36 /* trace header: holds the version and the topology of the tracer. */
37 struct trace_header_t {
38 /* 1st dword: descriptor */
41 u16 max_tracer_points;
42 /* 2nd field: command + data */
46 u32 data[MAX_CMD_DATA];
47 /* 3rd field: debug pointer */
48 /* 5th & 6th dword: debug pointer mechanism */
49 u32 debug_ptr_signature;
51 /* Rest of the header: status & scratch data */
52 u8 thr_status_byte[SH_CSS_MAX_SP_THREADS];
53 u16 thr_status_word[SH_CSS_MAX_SP_THREADS];
54 u32 thr_status_dword[SH_CSS_MAX_SP_THREADS];
55 u32 scratch_debug[MAX_SCRATCH_DATA];
58 /* offsets for master_port read/write */
59 #define HDR_HDR_OFFSET 0 /* offset of the header */
60 #define HDR_COMMAND_OFFSET offsetof(struct trace_header_t, command)
61 #define HDR_DATA_OFFSET offsetof(struct trace_header_t, data)
62 #define HDR_DEBUG_SIGNATURE_OFFSET offsetof(struct trace_header_t, debug_ptr_signature)
63 #define HDR_DEBUG_POINTER_OFFSET offsetof(struct trace_header_t, debug_ptr_value)
64 #define HDR_STATUS_OFFSET offsetof(struct trace_header_t, thr_status_byte)
65 #define HDR_STATUS_OFFSET_BYTE offsetof(struct trace_header_t, thr_status_byte)
66 #define HDR_STATUS_OFFSET_WORD offsetof(struct trace_header_t, thr_status_word)
67 #define HDR_STATUS_OFFSET_DWORD offsetof(struct trace_header_t, thr_status_dword)
68 #define HDR_STATUS_OFFSET_SCRATCH offsetof(struct trace_header_t, scratch_debug)
71 Trace version history:
72 1: initial version, hdr = descr, command & ptr.
73 2: added ISP + 24-bit fields.
75 4: added status in header.
79 #define TRACE_BUFF_ADDR 0xA000
80 #define TRACE_BUFF_SIZE 0x1000 /* 4K allocated */
82 #define TRACE_ENABLE_SP0 0
83 #define TRACE_ENABLE_SP1 0
84 #define TRACE_ENABLE_ISP 0
92 /* TODO: add timing format? */
93 enum TRACE_DUMP_FORMAT {
94 TRACE_DUMP_FORMAT_POINT_NO_TID,
95 TRACE_DUMP_FORMAT_VALUE24,
96 TRACE_DUMP_FORMAT_VALUE24_TIMING,
97 TRACE_DUMP_FORMAT_VALUE24_TIMING_DELTA,
98 TRACE_DUMP_FORMAT_POINT
101 /* currently divided as follows:*/
102 #if (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 3)
103 /* can be divided as needed */
104 #define TRACE_SP0_SIZE (TRACE_BUFF_SIZE / 4)
105 #define TRACE_SP1_SIZE (TRACE_BUFF_SIZE / 4)
106 #define TRACE_ISP_SIZE (TRACE_BUFF_SIZE / 2)
107 #elif (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 2)
109 #define TRACE_SP0_SIZE (TRACE_BUFF_SIZE / 2)
111 #define TRACE_SP0_SIZE (0)
114 #define TRACE_SP1_SIZE (TRACE_BUFF_SIZE / 2)
116 #define TRACE_SP1_SIZE (0)
119 #define TRACE_ISP_SIZE (TRACE_BUFF_SIZE / 2)
121 #define TRACE_ISP_SIZE (0)
123 #elif (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 1)
125 #define TRACE_SP0_SIZE (TRACE_BUFF_SIZE)
127 #define TRACE_SP0_SIZE (0)
130 #define TRACE_SP1_SIZE (TRACE_BUFF_SIZE)
132 #define TRACE_SP1_SIZE (0)
135 #define TRACE_ISP_SIZE (TRACE_BUFF_SIZE)
137 #define TRACE_ISP_SIZE (0)
140 #define TRACE_SP0_SIZE (0)
141 #define TRACE_SP1_SIZE (0)
142 #define TRACE_ISP_SIZE (0)
145 #define TRACE_SP0_ADDR (TRACE_BUFF_ADDR)
146 #define TRACE_SP1_ADDR (TRACE_SP0_ADDR + TRACE_SP0_SIZE)
147 #define TRACE_ISP_ADDR (TRACE_SP1_ADDR + TRACE_SP1_SIZE)
149 /* check if it's a legal division */
150 #if (TRACE_BUFF_SIZE < TRACE_SP0_SIZE + TRACE_SP1_SIZE + TRACE_ISP_SIZE)
151 #error trace sizes are not divided correctly and are above limit
154 #define TRACE_SP0_HEADER_ADDR (TRACE_SP0_ADDR)
155 #define TRACE_SP0_HEADER_SIZE (sizeof(struct trace_header_t))
156 #define TRACE_SP0_ITEM_SIZE (sizeof(struct trace_item_t))
157 #define TRACE_SP0_DATA_ADDR (TRACE_SP0_HEADER_ADDR + TRACE_SP0_HEADER_SIZE)
158 #define TRACE_SP0_DATA_SIZE (TRACE_SP0_SIZE - TRACE_SP0_HEADER_SIZE)
159 #define TRACE_SP0_MAX_POINTS (TRACE_SP0_DATA_SIZE / TRACE_SP0_ITEM_SIZE)
161 #define TRACE_SP1_HEADER_ADDR (TRACE_SP1_ADDR)
162 #define TRACE_SP1_HEADER_SIZE (sizeof(struct trace_header_t))
163 #define TRACE_SP1_ITEM_SIZE (sizeof(struct trace_item_t))
164 #define TRACE_SP1_DATA_ADDR (TRACE_SP1_HEADER_ADDR + TRACE_SP1_HEADER_SIZE)
165 #define TRACE_SP1_DATA_SIZE (TRACE_SP1_SIZE - TRACE_SP1_HEADER_SIZE)
166 #define TRACE_SP1_MAX_POINTS (TRACE_SP1_DATA_SIZE / TRACE_SP1_ITEM_SIZE)
168 #define TRACE_ISP_HEADER_ADDR (TRACE_ISP_ADDR)
169 #define TRACE_ISP_HEADER_SIZE (sizeof(struct trace_header_t))
170 #define TRACE_ISP_ITEM_SIZE (sizeof(struct trace_item_t))
171 #define TRACE_ISP_DATA_ADDR (TRACE_ISP_HEADER_ADDR + TRACE_ISP_HEADER_SIZE)
172 #define TRACE_ISP_DATA_SIZE (TRACE_ISP_SIZE - TRACE_ISP_HEADER_SIZE)
173 #define TRACE_ISP_MAX_POINTS (TRACE_ISP_DATA_SIZE / TRACE_ISP_ITEM_SIZE)
178 #define MAJOR_ISP_STAGE_ENTRY 2
179 #define MAJOR_DMA_PRXY 3
180 #define MAJOR_START_ISP 4
182 #define MAJOR_OBSERVER_ISP0_EVENT 21
183 #define MAJOR_OBSERVER_OUTPUT_FORM_EVENT 22
184 #define MAJOR_OBSERVER_OUTPUT_SCAL_EVENT 23
185 #define MAJOR_OBSERVER_IF_ACK 24
186 #define MAJOR_OBSERVER_SP0_EVENT 25
187 #define MAJOR_OBSERVER_SP_TERMINATE_EVENT 26
188 #define MAJOR_OBSERVER_DMA_ACK 27
189 #define MAJOR_OBSERVER_ACC_ACK 28
191 #define DEBUG_PTR_SIGNATURE 0xABCD /* signature for the debug parameter pointer */
193 /* command codes (1st byte) */
195 CMD_SET_ONE_MAJOR = 1, /* mask in one major. 2nd byte in the command is the major code */
196 CMD_UNSET_ONE_MAJOR = 2, /* mask out one major. 2nd byte in the command is the major code */
197 CMD_SET_ALL_MAJORS = 3, /* set the major print mask. the full mask is in the data DWORD */
198 CMD_SET_VERBOSITY = 4 /* set verbosity level */
201 /* command signature */
202 #define CMD_SIGNATURE 0xAABBCC00
204 /* shared macros in traces infrastructure */
205 /* increment the pointer cyclicly */
206 #define DBG_NEXT_ITEM(x, max_items) (((x + 1) >= max_items) ? 0 : x + 1)
207 #define DBG_PREV_ITEM(x, max_items) ((x) ? x - 1 : max_items - 1)
209 #define FIELD_MASK(width) (((1 << (width)) - 1))
210 #define FIELD_PACK(value, mask, offset) (((value) & (mask)) << (offset))
211 #define FIELD_UNPACK(value, mask, offset) (((value) >> (offset)) & (mask))
213 #define FIELD_VALUE_OFFSET (0)
214 #define FIELD_VALUE_WIDTH (16)
215 #define FIELD_VALUE_MASK FIELD_MASK(FIELD_VALUE_WIDTH)
216 #define FIELD_VALUE_PACK(f) FIELD_PACK(f, FIELD_VALUE_MASK, FIELD_VALUE_OFFSET)
217 #define FIELD_VALUE_UNPACK(f) FIELD_UNPACK(f, FIELD_VALUE_MASK, FIELD_VALUE_OFFSET)
219 #define FIELD_MINOR_OFFSET (FIELD_VALUE_OFFSET + FIELD_VALUE_WIDTH)
220 #define FIELD_MINOR_WIDTH (8)
221 #define FIELD_MINOR_MASK FIELD_MASK(FIELD_MINOR_WIDTH)
222 #define FIELD_MINOR_PACK(f) FIELD_PACK(f, FIELD_MINOR_MASK, FIELD_MINOR_OFFSET)
223 #define FIELD_MINOR_UNPACK(f) FIELD_UNPACK(f, FIELD_MINOR_MASK, FIELD_MINOR_OFFSET)
225 #define FIELD_MAJOR_OFFSET (FIELD_MINOR_OFFSET + FIELD_MINOR_WIDTH)
226 #define FIELD_MAJOR_WIDTH (5)
227 #define FIELD_MAJOR_MASK FIELD_MASK(FIELD_MAJOR_WIDTH)
228 #define FIELD_MAJOR_PACK(f) FIELD_PACK(f, FIELD_MAJOR_MASK, FIELD_MAJOR_OFFSET)
229 #define FIELD_MAJOR_UNPACK(f) FIELD_UNPACK(f, FIELD_MAJOR_MASK, FIELD_MAJOR_OFFSET)
231 /* for quick traces - only insertion, compatible with the regular point */
232 #define FIELD_FULL_MAJOR_WIDTH (8)
233 #define FIELD_FULL_MAJOR_MASK FIELD_MASK(FIELD_FULL_MAJOR_WIDTH)
234 #define FIELD_FULL_MAJOR_PACK(f) FIELD_PACK(f, FIELD_FULL_MAJOR_MASK, FIELD_MAJOR_OFFSET)
236 /* The following 2 fields are used only when FIELD_TID value is 111b.
237 * it means we don't want to use thread id, but format. In this case,
238 * the last 2 MSB bits of the major field will indicates the format
240 #define FIELD_MAJOR_W_FMT_OFFSET FIELD_MAJOR_OFFSET
241 #define FIELD_MAJOR_W_FMT_WIDTH (3)
242 #define FIELD_MAJOR_W_FMT_MASK FIELD_MASK(FIELD_MAJOR_W_FMT_WIDTH)
243 #define FIELD_MAJOR_W_FMT_PACK(f) FIELD_PACK(f, FIELD_MAJOR_W_FMT_MASK, FIELD_MAJOR_W_FMT_OFFSET)
244 #define FIELD_MAJOR_W_FMT_UNPACK(f) FIELD_UNPACK(f, FIELD_MAJOR_W_FMT_MASK, FIELD_MAJOR_W_FMT_OFFSET)
246 #define FIELD_FORMAT_OFFSET (FIELD_MAJOR_OFFSET + FIELD_MAJOR_W_FMT_WIDTH)
247 #define FIELD_FORMAT_WIDTH (2)
248 #define FIELD_FORMAT_MASK FIELD_MASK(FIELD_MAJOR_W_FMT_WIDTH)
249 #define FIELD_FORMAT_PACK(f) FIELD_PACK(f, FIELD_FORMAT_MASK, FIELD_FORMAT_OFFSET)
250 #define FIELD_FORMAT_UNPACK(f) FIELD_UNPACK(f, FIELD_FORMAT_MASK, FIELD_FORMAT_OFFSET)
252 #define FIELD_TID_SEL_FORMAT_PAT (7)
254 #define FIELD_TID_OFFSET (FIELD_MAJOR_OFFSET + FIELD_MAJOR_WIDTH)
255 #define FIELD_TID_WIDTH (3)
256 #define FIELD_TID_MASK FIELD_MASK(FIELD_TID_WIDTH)
257 #define FIELD_TID_PACK(f) FIELD_PACK(f, FIELD_TID_MASK, FIELD_TID_OFFSET)
258 #define FIELD_TID_UNPACK(f) FIELD_UNPACK(f, FIELD_TID_MASK, FIELD_TID_OFFSET)
260 #define FIELD_VALUE_24_OFFSET (0)
261 #define FIELD_VALUE_24_WIDTH (24)
262 #define FIELD_VALUE_24_MASK FIELD_MASK(FIELD_VALUE_24_WIDTH)
263 #define FIELD_VALUE_24_PACK(f) FIELD_PACK(f, FIELD_VALUE_24_MASK, FIELD_VALUE_24_OFFSET)
264 #define FIELD_VALUE_24_UNPACK(f) FIELD_UNPACK(f, FIELD_VALUE_24_MASK, FIELD_VALUE_24_OFFSET)
266 #define PACK_TRACEPOINT(tid, major, minor, value) \
267 (FIELD_TID_PACK(tid) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
269 #define PACK_QUICK_TRACEPOINT(major, minor) \
270 (FIELD_FULL_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor))
272 #define PACK_FORMATTED_TRACEPOINT(format, major, minor, value) \
273 (FIELD_TID_PACK(FIELD_TID_SEL_FORMAT_PAT) | FIELD_FORMAT_PACK(format) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
275 #define PACK_TRACE_VALUE24(major, value) \
276 (FIELD_TID_PACK(FIELD_TID_SEL_FORMAT_PAT) | FIELD_MAJOR_PACK(major) | FIELD_VALUE_24_PACK(value))
278 #endif /* __CSS_TRACE_H_ */