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