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