1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 1993-2022 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 #ifndef NBSITBL_H
25 #define NBSITBL_H
26 
27 #include "ctrl/ctrl0000/ctrl0000system.h" // NV0000_SYSTEM_MAX_APPROVAL_COOKIE_STRING_LENGTH
28 #include "ctrl/ctrl2080/ctrl2080bios.h"   // NV2080_CTRL_BIOS_NBSI_NUM_MODULES
29 #include "core/core.h"
30 #include "platform/pci_exp_table.h"
31 
32 // Maximum number of NBSI OS strings (including generic)
33 #define MAX_NBSI_OS 3
34 #define MAX_NBSI_OS_STR_LEN 10
35 
36 #define NBSI_SOURCE_LOC NvU16
37 
38 typedef enum _NBSI_TBL_SOURCES                   // keep in sync with nvapi.spec
39 {
40     NBSI_TBL_SOURCE_BEST_FIT = 0,
41     NBSI_TBL_SOURCE_REGISTRY = 1,
42     NBSI_TBL_SOURCE_VBIOS    = 2,
43     NBSI_TBL_SOURCE_SBIOS    = 8,
44     NBSI_TBL_SOURCE_ACPI     = 0x10,
45     NBSI_TBL_SOURCE_UEFI     = 0x20
46 } NBSI_TBL_SOURCES, * PNBSI_TBL_SOURCES;
47 #define NBSI_TBL_SOURCE_MAX 6                    // number of NBSI_TBL_SOURCES entries (not including BEST FIT)
48 
49 #define NBSI_TBL_SOURCE_ALL      (NBSI_TBL_SOURCE_REGISTRY | \
50                                   NBSI_TBL_SOURCE_VBIOS |    \
51                                   NBSI_TBL_SOURCE_SBIOS |    \
52                                   NBSI_TBL_SOURCE_ACPI |     \
53                                   NBSI_TBL_SOURCE_UEFI)
54 #define NBSI_TBL_SOURCE_NONE     0
55 
56 typedef enum _NBSI_ACPI_METHOD
57 {
58     NBSI_TBL_SOURCE_ACPI_UNKNOWN,
59     NBSI_TBL_SOURCE_ACPI_BY_OBJ_TYPE,
60     NBSI_TBL_SOURCE_ACPI_BY_ALL_OBJ,
61     NBSI_TBL_SOURCE_ACPI_BOTH_METHODS
62 } NBSI_ACPI_METHOD, *PNBSI_ACPI_METHOD;
63 
64 typedef struct _NBSI_CACHE_ENTRY_OBJ {
65     NvU16            globType;
66     NBSI_SOURCE_LOC  globSource;
67     NvU8             globIndex;
68     NBSI_SOURCE_LOC  altGlobSource;
69     NvU8             altGlobIndex;
70     NvU8           * pObj;
71 } NBSI_CACHE_ENTRY_OBJ, *PNBSI_CACHE_ENTRY_OBJ;
72 
73 typedef struct _NBSI_CACHE_OBJ {
74     // Number of entries we've found and cached.
75     NvU8 tblCacheNumEntries;
76     // Maximum entries we might have.
77     NvU8 tblCacheMaxNumEntries;
78     // Pointers to cache entries
79     PNBSI_CACHE_ENTRY_OBJ pCacheEntry[1];
80 } NBSI_CACHE_OBJ, *PNBSI_CACHE_OBJ;
81 
82 //
83 // The following two structs (DRVR_VER0 and DRVR_VER) attempt to handle
84 // the driver version.
85 // Driver revision example: 7.15.11.7782
86 // The format is: a.bb.1c.dddd
87 // where a represents the OS (7 for Vista/Vista64)
88 //       bb represents the DX version (15 for DX10)
89 //          the 1 in 1c is specified by MS
90 //       c.dddd is the NV-specific driver version.
91 // old version of this structure had byte to hold minRev but the new
92 // version uses 20 bits.
93 //
94 typedef struct _DRVR_VER0
95 {
96     NvU8    majVer : 8;
97     NvU8    minVer : 8;
98     NvU8    majRev : 8;
99     NvU8    minRev : 8;
100 } DRVR_VER0, * PDRVR_VER0;
101 
102 typedef struct _DRVR_VER
103 {
104     NvU32 Rev : 20;
105     NvU32 DX : 8;
106     NvU32 OS : 4;
107 } DRVR_VER, * PDRVR_VER;
108 
109 typedef struct _NBSI_OBJ {
110     // Setting for current maximum OS strings in use.
111     NvU8 curMaxNbsiOSes;
112 
113     // Default hash strings for OS strings (done once so to speed up the system)
114     NvU32 nbsiOSstrHash[MAX_NBSI_OS];
115 
116     // Default string for a blank path hash (done once so to speed up the system)
117     NvU16 nbsiBlankPathHash;
118 
119     // Contains the OS strings.
120     NvU8  nbsiOSstr[MAX_NBSI_OS][MAX_NBSI_OS_STR_LEN+1];
121     NvU32 nbsiOSstrLen[MAX_NBSI_OS];
122 
123     // Currently available locations of NBSI directory
124     NBSI_SOURCE_LOC availDirLoc[NV_MAX_DEVICES];
125 
126     // nbsi driver object save.
127     NvU8 * nbsiDrvrTable[NV_MAX_DEVICES];
128 
129     // pointer to array of pointers (cache of tables)
130     PNBSI_CACHE_OBJ pTblCache[NV_MAX_DEVICES];
131 
132     // pointer to override tables
133     NvU8 * regOverrideList[NV_MAX_DEVICES];
134 
135     // Current Driver version for best fit check.
136     DRVR_VER DriverVer;
137 
138 } NBSI_OBJ, *PNBSI_OBJ;
139 
140 
141 #ifndef VARIABLE_SIZE_ARRAY
142 #define VARIABLE_SIZE_ARRAY 1 // The size of this array may vary.
143 #endif
144 
145 // For offsets which are present but not defined (an error case) have
146 // a predefined undefined link. This allows me to build a table which
147 // has all 12 module types defined, but valid links on only the ones I'm
148 // using... And I can fail the search if asked to search one that's not
149 // defined.
150 #define NBSI_UNDEFINED_OFFSET 0xffffffff
151 
152 typedef enum _NBSI_ELEMENT_TYPES
153 {
154     NBSI_BYTE = 0,
155     NBSI_WORD,
156     NBSI_DWORD,
157     NBSI_QWORD,
158     NBSI_BYTE_ARRAY,
159     NBSI_BYTE_ARRAY_EXTENDED,
160     numNBSI_TYPES
161 } NBSI_ELEMENT_TYPES;
162 
163 // size of element header in bytes. 24 bits.
164 #define NBSI_ELEMENT_HDRSIZ 3
165 
166 #pragma pack(1)
167 typedef struct _NBSI_ELEMENT
168 {
169     struct ELEMENT_HDR_PARTA
170     {
171         NvU8   type: 4;
172         NvU8   lsnValueID: 4;
173     } hdrPartA;
174     struct ELEMENT_HDR_PARTB
175     {
176         NvU16   mswValueID;
177     } hdrPartB;
178     union ELEMENT_DATA
179     {
180         NvU8    dataByte;
181         NvU16   dataWord;
182         NvU32   dataDWord;
183         NvU64   dataQWord;
184         struct
185         {
186             NvU8   size;
187             NvU8   data[VARIABLE_SIZE_ARRAY];
188         } ba;
189         struct
190         {
191             NvU16  size;
192             NvU8   data[VARIABLE_SIZE_ARRAY];
193         } bax;
194     } data;
195 } NBSI_ELEMENT, *PNBSI_ELEMENT;
196 #pragma pack()
197 
198 #pragma pack(1)
199 typedef struct _NBSI_ELEMENTS
200 {
201     NvU32         numElements;
202     NBSI_ELEMENT  elements[VARIABLE_SIZE_ARRAY];
203 } NBSI_ELEMENTS, *PNBSI_ELEMENTS;
204 #pragma pack()
205 
206 #pragma pack(1)
207 typedef struct _NBSI_SCOPE
208 {
209     NvU16   pathID;
210     NvU32   offset; // Relative Offset from this member i.e. &ulOffset
211 } NBSI_SCOPE, *PNBSI_SCOPE;
212 #pragma pack()
213 
214 #pragma pack(1)
215 typedef struct _NBSI_SCOPES
216 {
217     NvU32       numPaths;
218     NBSI_SCOPE  paths[VARIABLE_SIZE_ARRAY];
219 } NBSI_SCOPES, *PNBSI_SCOPES;
220 #pragma pack()
221 
222 #pragma pack(1)
223 typedef struct _NBSI_MODULE
224 {
225     NvU16   moduleID;
226     NvU32   offset;  // Relative Offset from this member i.e. &ulOffset
227 } NBSI_MODULE, *PNBSI_MODULE;
228 #pragma pack()
229 
230 // Maximum understood dir version
231 #define MAXNBSIDIRVER 1
232 
233 #define NBSIDIRHDRSTRING (NvU32) (('N'<<24)+('B'<<16)+('S'<<8)+'I')
234 #define MXMHDRSTRING (NvU32) (('_'<<24)+('M'<<16)+('X'<<8)+'M')
235 
236 // A directory of globs
237 #pragma pack(1)
238 typedef union _NBSI_DIRECTORY
239 {
240     struct OLD_FORMAT                   // Original version for Beta
241     {
242         NvU8  numGlobs;                 // number of globs
243         NvU8  dirVer;                   // dirVer
244         NvU16 globType[1];              // NBSI_GLOB_TYPE (placeholder)
245     } od;
246     struct NEW_FORMAT                   // Shipping version
247     {
248         NvU32 nbsiHeaderString;         // header string NBSIDIRHDRSTRING
249         NvU32 size;                     // size of entire directory
250         NvU8  numGlobs;                 // number of globs
251         NvU8  dirVer;                   // dirVer
252         NvU16 globType[1];              // NBSI_GLOB_TYPE (placeholder
253     } d;
254 } NBSI_DIRECTORY, *PNBSI_DIRECTORY;
255 #pragma pack()
256 
257 #define nbsiobjtype(ch1,ch2) (NvU16) ((ch1<<8) + ch2)
258 typedef enum _NBSI_GLOB_TYPES
259 {
260     NBSI_RSRVD_GLOB     = 0,     // Reserved Glob type
261     NBSI_DRIVER         = nbsiobjtype('D','R'),  // Driver Object
262     NBSI_VBIOS          = nbsiobjtype('V','B'),  // VBIOS Object
263     NBSI_HDCP           = nbsiobjtype('H','K'),  // HDCP Keys
264     NBSI_INFOROM        = nbsiobjtype('I','R'),  // InfoROM object
265     NBSI_HDD            = nbsiobjtype('H','D'),  // Storage Driver
266     NBSI_NONVOLATILE    = nbsiobjtype('N','V'),  // CMOS settings
267     NBSI_PLAT_INFO      = nbsiobjtype('P','I'),  // PlatformInfo Object
268     NBSI_PLAT_INFO_WAR  = nbsiobjtype('I','P'),  // PlatformInfo WAR Bug 986051
269     NBSI_VALKEY         = nbsiobjtype('V','K'),  // Validation key
270     NBSI_TEGRA_INFO     = nbsiobjtype('T','G'),  // Tegra Info object
271     NBSI_TEGRA_DCB      = nbsiobjtype('T','D'),  // Tegra DCB object
272     NBSI_TEGRA_PANEL    = nbsiobjtype('T','P'),  // Tegra TPB object
273     NBSI_TEGRA_DSI      = nbsiobjtype('T','S'),  // Tegra DSI information
274     NBSI_SYS_INFO       = nbsiobjtype('G','D'),  // System Info object
275     NBSI_TEGRA_TMDS     = nbsiobjtype('T','T'),  // Tegra TMDS configuration block
276     NBSI_OPTIMUS_PLAT   = nbsiobjtype('O','P'),  // Optimus Platform key
277 } NBSI_GLOB_TYPE, * PNBSI_GLOB_TYPE;
278 
279 #pragma pack(1)
280 typedef struct _NBSI_UID0
281 {
282       NvU16   svid;       // Sub-system Vendor ID
283       NvU16   ssid;       // Sub-system Device ID
284       struct {
285           NvU16   vid;    // Chip Vendor ID (NVIDIA)
286           NvU16   did;    // Chip Device ID
287           NvU8    revId;  // Chip RevID
288       } Chip;
289       DRVR_VER0 Driver;   // Target Driver Version
290       struct {            // Target BIOS Version
291           NvU8    minVer : 8;
292           NvU8    majVer : 8;
293       } VBIOS;
294       struct {            // Platform Firmware Version
295           NvU8    minVer : 4;
296           NvU8    majVer : 4;
297       } Platform;
298 } NBSI_UID0, *PNBSI_UID0;
299 #pragma pack()
300 
301 #pragma pack(1)
302 typedef struct _NBSI_UID
303 {
304       NvU16   svid;       // Sub-system Vendor ID
305       NvU16   ssid;       // Sub-system Device ID
306       struct {
307           NvU16   vid;    // Chip Vendor ID (NVIDIA)
308           NvU16   did;    // Chip Device ID
309           NvU8    revId;  // Chip RevID
310       } Chip;
311       DRVR_VER Driver;    // Target Driver Version
312       struct {            // Target BIOS Version
313           NvU8    minVer : 8;
314           NvU8    majVer : 8;
315       } VBIOS;
316       struct {            // Platform Firmware Version
317           NvU8    minVer : 4;
318           NvU8    majVer : 4;
319       } Platform;
320 } NBSI_UID, *PNBSI_UID;
321 #pragma pack()
322 
323 #pragma pack(1)
324 typedef struct _DSM_GEN_OBJ_HDR
325 {
326     NvU64       sig;          // Common hash signature
327     NvU16       globType;     // NBSI_GLOB_TYPE (i.e. NBSI_HDCP, NBSI_VALKEY etc.)
328     NvU32       size;         // Entire size in bytes object, including header and object data.
329     NvU16       majMinVer;    // Version of Generic Object in Maj:Min format
330 } DSM_GEN_OBJ_HDR, *PDSM_GEN_OBJ_HDR;
331 #pragma pack()
332 #define DSM_GEN_HDR_SIZE (sizeof(DSM_GEN_OBJ_HDR))
333 
334 
335 #pragma pack(1)
336 typedef struct _NBSI_GEN_OBJ
337 {
338     DSM_GEN_OBJ_HDR  objHdr;
339     // actual packed object data
340     NvU8             objData[VARIABLE_SIZE_ARRAY];
341 } NBSI_GEN_OBJ, *PNBSI_GEN_OBJ;
342 #pragma pack()
343 #define NBSI_GEN_HDR_SIZE (sizeof(NBSI_GEN_OBJ)-VARIABLE_SIZE_ARRAY)
344 
345 #define NBSI_MAX_TABLE_SIZE (256*1024) // define some maximum size
346 #define NBSI_MIN_GEN_OBJ_SIZE NBSI_GEN_HDR_SIZE
347 
348 #define NBSI_DRIVERVER_0100 0x0100
349 #pragma pack(1)
350 typedef struct _NBSI_DRIVER_OBJ0
351 {
352     DSM_GEN_OBJ_HDR objHdr;       // object header. globType = NBSI_GLOB_TYPE ('DR')
353     NBSI_UID0       uid;          // Platform UID
354     NvU32           numModules;
355                                   // num_modules may vary... this is placeholder
356     NBSI_MODULE     modules[NV2080_CTRL_BIOS_NBSI_NUM_MODULES];
357     // actual packed object data
358     NvU8            objData[VARIABLE_SIZE_ARRAY];
359 } NBSI_DRIVER_OBJ0, *PNBSI_DRIVER_OBJ0;
360 #pragma pack()
361 
362 #pragma pack(1)
363 typedef struct _NBSI_DRIVER_OBJ
364 {
365     DSM_GEN_OBJ_HDR objHdr;       // object header. globType = NBSI_GLOB_TYPE ('DR')
366     NBSI_UID        uid;          // Platform UID
367     NvU32           numModules;
368                                   // num_modules may vary... this is placeholder
369     NBSI_MODULE     modules[NV2080_CTRL_BIOS_NBSI_NUM_MODULES];
370     // actual packed object data
371     NvU8            objData[VARIABLE_SIZE_ARRAY];
372 } NBSI_DRIVER_OBJ, *PNBSI_DRIVER_OBJ;
373 #pragma pack()
374 
375 #endif // NBSITBL_H
376