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