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