1 /* 2 * SPDX-FileCopyrightText: Copyright (c) 2004-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 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 */ 23 24 #pragma once 25 26 #include <nvtypes.h> 27 28 // 29 // This file was generated with FINN, an NVIDIA coding tool. 30 // Source file: ctrl/ctrl2080/ctrl2080nvd.finn 31 // 32 33 #include "ctrl/ctrl2080/ctrl2080base.h" 34 35 #include "ctrl/ctrlxxxx.h" 36 /* 37 * NV2080_CTRL_CMD_NVD_GET_DUMP_SIZE 38 * 39 * This command gets the expected dump size of a particular GPU dump component. 40 * Note that events that occur between this command and a later 41 * NV2080_CTRL_CMD_NVD_GET_DUMP command could alter the size of 42 * the buffer required. 43 * 44 * component 45 * One of NVDUMP_COMPONENT < 0x400 defined in nvdump.h to estimate 46 * the size of. 47 * size 48 * This parameter returns the expected size. 49 * 50 * Possible status values returned are: 51 * NV_OK 52 * NV_ERR_INVALID_ARGUMENT if component is invalid. 53 * 54 */ 55 56 #define NV2080_CTRL_CMD_NVD_GET_DUMP_SIZE (0x20802401) /* finn: Evaluated from "(FINN_NV20_SUBDEVICE_0_NVD_INTERFACE_ID << 8) | NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID" */ 57 58 #define NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS_MESSAGE_ID (0x1U) 59 60 typedef struct NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS { 61 NvU32 component; 62 NvU32 size; 63 } NV2080_CTRL_NVD_GET_DUMP_SIZE_PARAMS; 64 65 /* 66 * NV2080_CTRL_CMD_NVD_GET_DUMP 67 * 68 * This command gets a dump of a particular GPU dump component. If triggers 69 * is non-zero, the command waits for the trigger to occur 70 * before it returns. 71 * 72 * pBuffer 73 * This parameter points to the buffer for the data. 74 * component 75 * One of NVDUMP_COMPONENT < 0x400 defined in nvdump.h to select 76 * for dumping. 77 * size 78 * On entry, this parameter specifies the maximum length for 79 * the returned data. On exit, it specifies the number of bytes 80 * returned. 81 * 82 * Possible status values returned are: 83 * NV_OK 84 * NVOS_ERROR_INVALID_ARGUMENT if component is invalid. 85 * NVOS_ERROR_INVALID_ADDRESS if pBuffer is invalid 86 * NVOS_ERROR_INVALID_???? if the buffer was too small 87 * 88 * 89 */ 90 #define NV2080_CTRL_CMD_NVD_GET_DUMP (0x20802402) /* finn: Evaluated from "(FINN_NV20_SUBDEVICE_0_NVD_INTERFACE_ID << 8) | NV2080_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID" */ 91 92 #define NV2080_CTRL_NVD_GET_DUMP_PARAMS_MESSAGE_ID (0x2U) 93 94 typedef struct NV2080_CTRL_NVD_GET_DUMP_PARAMS { 95 NV_DECLARE_ALIGNED(NvP64 pBuffer, 8); 96 NvU32 component; 97 NvU32 size; 98 } NV2080_CTRL_NVD_GET_DUMP_PARAMS; 99 100 /* 101 * NV2080_CTRL_CMD_NVD_GET_NOCAT_JOURNAL 102 * 103 * This command returns the contents of the Journal used by NOCAT, and 104 * optionally clears the data 105 * 106 * clear: 107 * [IN] indicates if should the data be cleared after reporting 108 * 109 * JournalRecords : 110 * [OUT] an array of Journal records reported. 111 * 112 * outstandingAssertCount: 113 * [OUT] number of asserts that remain to be reported on. 114 * 115 * reportedAssertCount: 116 * [OUT] the number of asserts contained in the report 117 * 118 * asserts: 119 * [OUT] an array of up to NV2080_NOCAT_JOURNAL_MAX_ASSERT_RECORDS assert reports 120 */ 121 122 123 #define NV2080_CTRL_CMD_NVD_GET_NOCAT_JOURNAL (0x20802409) /* finn: Evaluated from "(FINN_NV20_SUBDEVICE_0_NVD_INTERFACE_ID << 8) | NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS_MESSAGE_ID" */ 124 125 #define NV2080_NOCAT_JOURNAL_MAX_DIAG_BUFFER 1024 126 #define NV2080_NOCAT_JOURNAL_MAX_STR_LEN 65 127 #define NV2080_NOCAT_JOURNAL_MAX_JOURNAL_RECORDS 10 128 #define NV2080_NOCAT_JOURNAL_MAX_ASSERT_RECORDS 32 129 130 // structure to hold clock details. 131 typedef struct NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS { 132 NvS32 userMinOffset; 133 NvS32 userMaxOffset; 134 NvU32 factoryMinOffset; 135 NvU32 factoryMaxOffset; 136 NvU32 lastActiveClock; 137 NvU32 lastActiveVolt; 138 NvU32 lastActivePoint; 139 NvU32 kappa; 140 } NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS; 141 142 143 // structure to hold clock configuration & state. 144 typedef struct NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG { 145 NvU32 pstateVer; 146 NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS gpcOverclock; 147 NV2080_NOCAT_JOURNAL_OVERCLOCK_DETAILS mclkOverclock; 148 NvBool bUserOverclocked; 149 NvBool bFactoryOverclocked; 150 } NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG; 151 152 // structure to hold the GPU context at the time of the report. 153 typedef struct NV2080_NOCAT_JOURNAL_GPU_STATE { 154 NvBool bValid; 155 NvU32 strap; 156 NvU16 deviceId; 157 NvU16 vendorId; 158 NvU16 subsystemVendor; 159 NvU16 subsystemId; 160 NvU16 revision; 161 NvU16 type; 162 NvU32 vbiosVersion; 163 NvBool bOptimus; 164 NvBool bMsHybrid; 165 NvBool bFullPower; 166 NvU32 vbiosOemVersion; 167 NvU16 memoryType; 168 NvU8 tag[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 169 NvU8 vbiosProject[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 170 NvBool bInFullchipReset; 171 NvBool bInSecBusReset; 172 NvBool bInGc6Reset; 173 NV2080_NOCAT_JOURNAL_OVERCLOCK_CFG overclockCfg; 174 } NV2080_NOCAT_JOURNAL_GPU_STATE; 175 176 #define NV2080_NOCAT_JOURNAL_REC_TYPE_UNKNOWN 0 177 #define NV2080_NOCAT_JOURNAL_REC_TYPE_BUGCHECK 1 178 #define NV2080_NOCAT_JOURNAL_REC_TYPE_ENGINE 2 179 #define NV2080_NOCAT_JOURNAL_REC_TYPE_TDR 3 180 #define NV2080_NOCAT_JOURNAL_REC_TYPE_RC 4 181 #define NV2080_NOCAT_JOURNAL_REC_TYPE_ASSERT 5 182 #define NV2080_NOCAT_JOURNAL_REC_TYPE_ANY 6 183 184 // this should be relative to the highest type value 185 #define NV2080_NOCAT_JOURNAL_REC_TYPE_COUNT (0x7) /* finn: Evaluated from "NV2080_NOCAT_JOURNAL_REC_TYPE_ANY + 1" */ 186 typedef struct NV2080_NOCAT_JOURNAL_ENTRY { 187 NvU8 recType; 188 NvU32 bugcheck; 189 NvU32 tdrBucketId; 190 NvU8 source[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 191 NvU32 subsystem; 192 NV_DECLARE_ALIGNED(NvU64 errorCode, 8); 193 NvU32 diagBufferLen; 194 NvU8 diagBuffer[NV2080_NOCAT_JOURNAL_MAX_DIAG_BUFFER]; 195 NvU8 faultingEngine[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 196 NvU32 mmuFaultType; 197 NvU32 mmuErrorSrc; 198 NvU8 tdrReason[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 199 } NV2080_NOCAT_JOURNAL_ENTRY; 200 201 typedef struct NV2080_NOCAT_JOURNAL_RECORD { 202 NvU32 GPUTag; 203 NV_DECLARE_ALIGNED(NvU64 loadAddress, 8); 204 NV_DECLARE_ALIGNED(NvU64 timeStamp, 8); 205 NV_DECLARE_ALIGNED(NvU64 stateMask, 8); 206 NV2080_NOCAT_JOURNAL_GPU_STATE nocatGpuState; 207 NV_DECLARE_ALIGNED(NV2080_NOCAT_JOURNAL_ENTRY nocatJournalEntry, 8); 208 } NV2080_NOCAT_JOURNAL_RECORD; 209 210 // NOCAT activity counter indexes 211 // collection activity 212 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_REQ_IDX 0 213 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_GRANDFATHERED_RECORD_IDX 1 214 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOCATED_IDX 2 215 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECTED_IDX 3 216 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NOTIFICATIONS_IDX 4 217 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_ALLOC_FAILED_IDX 5 218 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_FAILED_IDX 6 219 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COLLECT_LOCKED_OUT_IDX 7 220 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CTRL_INSERT_RECORDS_IDX 8 221 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RPC_INSERT_RECORDS_IDX 9 222 223 // Journal Lock activity 224 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCKED_IDX 10 225 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_LOCK_UPDATED_IDX 11 226 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_JOURNAL_UNLOCKED_IDX 12 227 228 // lookup activity 229 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_RECORDS_IDX 13 230 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_BUFFER_IDX 14 231 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_MATCH_FOUND_IDX 15 232 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_NO_MATCH_IDX 16 233 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_CLOSEST_FOUND_IDX 17 234 235 // reporting activity 236 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REQUESTED_IDX 18 237 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_REPORTED_IDX 19 238 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_DROPPED_IDX 20 239 240 // update activity 241 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_REQ_IDX 21 242 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATED_IDX 22 243 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_UPDATE_FAILED_IDX 23 244 245 // general errors 246 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BUSY_IDX 24 247 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_PARAM_IDX 25 248 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_BAD_TYPE_IDX 26 249 250 // reserved entries for temporary use. 251 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES5_IDX 27 252 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES4_IDX 28 253 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES3_IDX 29 254 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES2_IDX 30 255 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES1_IDX 31 256 257 // this should be relative to the highest counter index 258 #define NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COUNTER_COUNT (0x20) /* finn: Evaluated from "NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_RES1_IDX + 1" */ 259 260 #define NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY 0:0 261 #define NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_YES 1 262 #define NV2080_CTRL_NOCAT_GET_COUNTERS_ONLY_NO 0 263 264 #define NV2080_CTRL_NOCAT_GET_RESET_COUNTERS 1:1 265 #define NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_YES 1 266 #define NV2080_CTRL_NOCAT_GET_RESET_COUNTERS_NO 0 267 268 269 #define NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS_MESSAGE_ID (0x9U) 270 271 typedef struct NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS { 272 NvU32 flags; 273 NvU32 nocatRecordCount; 274 NvU32 nocatOutstandingRecordCount; 275 NV_DECLARE_ALIGNED(NV2080_NOCAT_JOURNAL_RECORD journalRecords[NV2080_NOCAT_JOURNAL_MAX_JOURNAL_RECORDS], 8); 276 NvU32 activityCounters[NV2080_NOCAT_JOURNAL_REPORT_ACTIVITY_COUNTER_COUNT]; 277 NvU8 reserved[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 278 } NV2080_CTRL_NVD_GET_NOCAT_JOURNAL_PARAMS; 279 280 /* 281 * NV2080_CTRL_CMD_NVD_SET_NOCAT_JOURNAL_DATA 282 * 283 * This command reports the TDR data collected by KMD to be added to the 284 * nocat record 285 * 286 * dataType 287 * [IN] specifies the type of data provided. 288 * targetRecordType 289 * [IN] specifies record type the data is intended for. 290 * nocatJournalData 291 * [IN] specifies the data to be added. 292 */ 293 294 #define NV2080_CTRL_CMD_NVD_SET_NOCAT_JOURNAL_DATA (0x2080240b) /* finn: Evaluated from "(FINN_NV20_SUBDEVICE_0_NVD_INTERFACE_ID << 8) | NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_MESSAGE_ID" */ 295 296 // data types & structures 297 #define NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_EMPTY 0 298 #define NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_TDR_REASON 1 299 #define NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_SET_TAG 2 300 #define NV2080_CTRL_NOCAT_JOURNAL_DATA_TYPE_RCLOG 3 301 302 #define NV2080_CTRL_NOCAT_TDR_TYPE_NONE 0 303 #define NV2080_CTRL_NOCAT_TDR_TYPE_LEGACY 1 304 #define NV2080_CTRL_NOCAT_TDR_TYPE_FULLCHIP 2 305 #define NV2080_CTRL_NOCAT_TDR_TYPE_BUSRESET 3 306 #define NV2080_CTRL_NOCAT_TDR_TYPE_GC6_RESET 4 307 #define NV2080_CTRL_NOCAT_TDR_TYPE_SURPRISE_REMOVAL 5 308 #define NV2080_CTRL_NOCAT_TDR_TYPE_UCODE_RESET 6 309 #define NV2080_CTRL_NOCAT_TDR_TYPE_TEST 7 310 311 typedef struct NV2080CtrlNocatJournalDataTdrReason { 312 NvU32 flags; 313 NvU8 source[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 314 NvU32 subsystem; 315 NV_DECLARE_ALIGNED(NvU64 errorCode, 8); 316 NvU32 reasonCode; 317 } NV2080CtrlNocatJournalDataTdrReason; 318 319 #define NV2080_CTRL_NOCAT_TAG_CLEAR 0:0 320 #define NV2080_CTRL_NOCAT_TAG_CLEAR_YES 1 321 #define NV2080_CTRL_NOCAT_TAG_CLEAR_NO 0 322 typedef struct NV2080CtrlNocatJournalSetTag { 323 NvU32 flags; 324 NvU8 tag[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 325 } NV2080CtrlNocatJournalSetTag; 326 327 typedef struct NV2080CtrlNocatJournalRclog { 328 NvU32 flags; 329 NvU32 rclogSize; // rclog size 330 NvU32 rmGpuId; // RMGpuId associated with the adapter 331 NvU32 APIType; // API Type (dx9, dx1x, ogl, etc.) 332 NvU32 contextType; // Context type (OGL, DX, etc.) 333 NvU32 exceptType; // ROBUST_CHANNEL_* error identifier 334 NvU8 processImageName[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; // process image name (without path) 335 } NV2080CtrlNocatJournalRclog; 336 337 #define NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS_MESSAGE_ID (0xBU) 338 339 typedef struct NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS { 340 NvU32 dataType; 341 NvU32 targetRecordType; 342 union { 343 NV_DECLARE_ALIGNED(NV2080CtrlNocatJournalDataTdrReason tdrReason, 8); 344 NV2080CtrlNocatJournalSetTag tagData; 345 NV2080CtrlNocatJournalRclog rclog; 346 } nocatJournalData; 347 } NV2080_CTRL_NVD_SET_NOCAT_JOURNAL_DATA_PARAMS; 348 /* 349 * NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD 350 * 351 * This command Inserts a NOCAT Journal record from an outside component. 352 * 353 * nocatJournalData 354 * [IN] specifies the data to be added. 355 */ 356 357 #define NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD (0x2080240c) /* finn: Evaluated from "(FINN_NV20_SUBDEVICE_0_NVD_INTERFACE_ID << 8) | NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS_MESSAGE_ID" */ 358 359 #define NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR 0:0 360 #define NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_YES 1 361 #define NV2080_CTRL_NOCAT_INSERT_ALLOW_NULL_STR_NO 0 362 #define NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER 1:1 363 #define NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_YES 1 364 #define NV2080_CTRL_NOCAT_INSERT_ALLOW_0_LEN_BUFFER_NO 0 365 366 typedef struct NV2080CtrlNocatJournalInsertRecord { 367 NvU32 flags; 368 NV_DECLARE_ALIGNED(NvU64 timestamp, 8); 369 NvU8 recType; 370 NvU32 bugcheck; 371 char source[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 372 NvU32 subsystem; 373 NV_DECLARE_ALIGNED(NvU64 errorCode, 8); 374 char faultingEngine[NV2080_NOCAT_JOURNAL_MAX_STR_LEN]; 375 NvU32 tdrReason; 376 NvU32 diagBufferLen; 377 NvU8 diagBuffer[NV2080_NOCAT_JOURNAL_MAX_DIAG_BUFFER]; 378 } NV2080CtrlNocatJournalInsertRecord; 379 #define NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS_MESSAGE_ID (0xCU) 380 381 typedef struct NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS { 382 NV_DECLARE_ALIGNED(NV2080CtrlNocatJournalInsertRecord nocatJournalRecord, 8); 383 } NV2080_CTRL_CMD_NVD_INSERT_NOCAT_JOURNAL_RECORD_PARAMS; 384 /* _ctr2080nvd_h_ */ 385