File Index
Files and directories
Sign in
FILE

css_trace.h

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/media/atomisp/pci/css_trace.h C
  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 */
 18struct 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. */
 28struct 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/*
 62Trace 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
 77enum TRACE_CORE_ID {
 78	TRACE_SP0_ID,
 79	TRACE_SP1_ID,
 80	TRACE_ISP_ID
 81};
 82
 83/* TODO: add timing format? */
 84enum 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) */
185typedef 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_ */
~/ Read-only file preview.