1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2020-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: MIT
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14 
15 
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23  * DEALINGS IN THE SOFTWARE.
24  */
25 
26 #ifndef VIDEO_EVENT_H
27 #define VIDEO_EVENT_H
28 
29 /*!
30 **************  Defines used for Video HW event logging! ***********************
31 */
32 
33 /*!
34 * Defines a skip factor when event buffer is full,
35 * i.e. 1/(RM_VIDEO_TRACE_SURFACE_SKIP_FACTOR) of the event buffers
36 * will be skipped and over-written.
37 */
38 #define RM_VIDEO_TRACE_SURFACE_SKIP_FACTOR                        (16UL)
39 
40 /*!
41 * Defines max size of a variable data in one record. For event data has a size
42 * that is larger than this define, multiple event records will be used for logging.
43 */
44 #define RM_VIDEO_TRACE_MAX_VARIABLE_DATA_SIZE                     (0x1000UL)
45 
46 /*!
47 * Defines magic value for hardware video events
48 */
49 #define ENG_VIDEO_TRACE_EVENT_MAGIC_HI                            (0xdeadbeefUL)
50 #define ENG_VIDEO_TRACE_EVENT_MAGIC_LO                            (0xdead0001UL)
51 
52 /*!
53 * Define the type of the engine. Since engine uCode can not determine the actual id,
54 * such as NVENC0, NVENC1 etc., we will defer this to RM to determine the actual id
55 * and populate it in final event data structure.
56 */
57 typedef enum
58 {
59     VIDEO_ENGINE_TYPE__NVDEC = 0,
60     VIDEO_ENGINE_TYPE__NVENC,
61     VIDEO_ENGINE_TYPE__NVJPG,
62     VIDEO_ENGINE_TYPE__OFA,
63     VIDEO_ENGINE_TYPE__NUM
64 } VIDEO_ENGINE_TYPE;
65 
66 /*!
67 * Defines video codec types
68 */
69 typedef enum
70 {
71     VIDEO_ENGINE_CODEC_ID__OFA = 0,                 /* Only codec supported for OFA engine. */
72     VIDEO_ENGINE_CODEC_ID__JPEG = 0,                /* Only codec supported for NVJPEG engine. */
73     VIDEO_ENGINE_CODEC_ID__MPEG2 = 0,
74     VIDEO_ENGINE_CODEC_ID__VC1,
75     VIDEO_ENGINE_CODEC_ID__H264,
76     VIDEO_ENGINE_CODEC_ID__MPEG4,
77     VIDEO_ENGINE_CODEC_ID__VP8,
78     VIDEO_ENGINE_CODEC_ID__VP9,
79     VIDEO_ENGINE_CODEC_ID__HEVC,
80     VIDEO_ENGINE_CODEC_ID__AVD,
81     VIDEO_ENGINE_CODEC_ID__NUM
82 } VIDEO_ENGINE_CODEC_ID;
83 
84 /*!
85 * Defines types of video events
86 */
87 typedef enum
88 {
89     VIDEO_ENGINE_EVENT_ID__SESSION_START = 0,
90     VIDEO_ENGINE_EVENT_ID__SESSION_END,
91     VIDEO_ENGINE_EVENT_ID__POWER_STATE_CHANGE,
92     VIDEO_ENGINE_EVENT_ID__LOG_DATA,
93     VIDEO_ENGINE_EVENT_ID__NUM
94 } VIDEO_ENGINE_EVENT_ID;
95 
96 /*!
97 * Defines types of the log data of video events if VIDEO_ENGINE_EVENT__LOG_DATA_MAGIC present
98 * as first DWORD of log data.
99 */
100 typedef enum
101 {
102     VIDEO_ENGINE_EVENT_LOG_DATA_TYPE__GENERIC = 0,  /* Generic opaque data */
103     VIDEO_ENGINE_EVENT_LOG_DATA_TYPE__STR,          /* Log data can be interpret as string */
104     VIDEO_ENGINE_EVENT_LOG_DATA_TYPE__BIN,          /* Log data are binary data */
105     VIDEO_ENGINE_EVENT_LOG_DATA_TYPE__NUM
106 } VIDEO_ENGINE_EVENT_LOG_DATA_TYPE;
107 
108 /*!
109 * Defines return status for VIDEO_ENGINE_EVENT_ID__SESSION_END
110 */
111 typedef enum
112 {
113     VIDEO_ENGINE_STATUS__OK = 0,
114     VIDEO_ENGINE_STATUS__ERR,
115     VIDEO_ENGINE_STATUS__NUM
116 } VIDEO_ENGINE_STATUS;
117 
118 /*!
119 * Defines structs for various types of trace events
120 */
121 typedef struct {
122     NvU8     engine_type;
123     NvU8     engine_id;
124     NvU16    codec_id;
125     NvU32    reserved1;
126 } VIDEO_ENGINE_EVENT__SESSION_START;
127 
128 typedef struct {
129     NvU8     engine_type;
130     NvU8     engine_id;
131     NvU16    codec_id;
132     NvU32    status;
133 } VIDEO_ENGINE_EVENT__SESSION_END;
134 
135 
136 typedef struct {
137     NvU16    from;
138     NvU16    to;
139     NvU32    reserved2;
140 } VIDEO_ENGINE_EVENT__POWER_STATE_CHANGE;
141 
142 typedef struct
143 {
144     NvU8     engine_type;
145     NvU8     engine_id;
146     NvU16    codec_id;
147     NvU32    size;              /* size of data being logged in NvU32 */
148 } VIDEO_ENGINE_EVENT__LOG_DATA;
149 
150 #define VIDEO_ENGINE_EVENT__LOG_DATA_MAGIC  RM_VIDEO_TRACE_EVENT_MAGIC_HI
151 
152 typedef struct
153 {
154     NvU32   magic;
155     VIDEO_ENGINE_EVENT_LOG_DATA_TYPE type;
156     NvU32   data[];
157 } VIDEO_ENGINE_EVENT__LOG_DATA_HDR;
158 
159 /*!
160 * Defines the struct for a full trace record contains various event structs.
161 */
162 typedef struct
163 {
164 
165     NvU32                 magic_lo;
166     NvU32                 magic_hi;
167 
168     union
169     {
170         NvU64             ts;
171         struct
172         {
173             NvU32         ts_lo;
174             NvU32         ts_hi;
175         };
176     };
177 
178     VIDEO_ENGINE_EVENT_ID event_id;
179     NvU32                 seq_no;
180 
181     union {
182 
183         NvU64                                   event_data;
184 
185         VIDEO_ENGINE_EVENT__SESSION_START       event_start;
186         VIDEO_ENGINE_EVENT__SESSION_END         event_end;
187         VIDEO_ENGINE_EVENT__POWER_STATE_CHANGE  event_pstate_change;
188         VIDEO_ENGINE_EVENT__LOG_DATA            event_log_data;
189     };
190 
191     // Client information from RM
192     NvU64 userInfo;
193     NvU32 context_id;
194     NvU32 pid;
195     NvU64 api_id;
196     NvU32 gfid;
197     NvU32 reserved;
198 
199 } VIDEO_ENGINE_EVENT__RECORD;
200 
201 #define VIDEO_ENGINE_EVENT__LOG_DATA_SIZE(s) (sizeof(VIDEO_ENGINE_EVENT__RECORD) + s.event_log_data.size)
202 
203 /*!
204 * Client information passing down by RM and saved at offset VIDEO_ENGINE_EVENT__LOG_INFO__OFFSET
205 * with the size of VIDEO_ENGINE_EVENT__LOG_INFO__SIZE in context allocation.
206 */
207 #define VIDEO_ENGINE_EVENT__LOG_INFO__OFFSET   (0xFA0UL)
208 #define VIDEO_ENGINE_EVENT__LOG_INFO__SIZE     (0x20UL)
209 #define VIDEO_ENGINE_EVENT__LOG_INFO__LOG_SIZE (5UL)
210 #define VIDEO_ENGINE_EVENT__KERNEL_PID         (0xFFFFFFFFUL)
211 #define VIDEO_ENGINE_EVENT__KERNEL_CONTEXT     (0xFFFFFFFFUL)
212 
213 typedef struct {
214     NvU64 userInfo;
215     NvU32 context_id;
216     NvU32 pid;
217     NvU32 gfid;
218     NvU8  engine_id;
219     NvU8  reserved3[31];
220 } VIDEO_ENGINE_EVENT__LOG_INFO;
221 
222 /*!
223 * Data-structure for ringbuffer structure related to video ringbuffer surfaces.
224 */
225 typedef struct {
226     NvU32   bufferSize;
227     NvU32   readPtr;
228     NvU32   writePtr;
229     NvU32   flags;
230     NvU8    pData[];
231 } VIDEO_TRACE_RING_BUFFER, *PVIDEO_TRACE_RING_BUFFER;
232 
233 /* Macro convert data offer to ringbuffer offset*/
234 #define VIDEO_TRACE_RING_BUFFER__DATA_OFFSET(o) (o + sizeof(VIDEO_TRACE_RING_BUFFER))
235 #define VIDEO_TRACE_RING_BUFFER__OFFSET(t) (&(((PVIDEO_TRACE_RING_BUFFER)0)->t))
236 #define VIDEO_TRACE_RING_BUFFER__SIZEOF(t) (sizeof(((PVIDEO_TRACE_RING_BUFFER)0)->t))
237 
238 #define VIDEO_TRACE_FLAG__LOGGING_ENABLED (0x00000001UL)
239 #define VIDEO_TRACE_FLAG__RESERVED        (0xFFFFFFFEUL)
240 
241 #endif // VIDEO_EVENT_H
242