1 /* 2 * Copyright 2016 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 */ 23 24 #ifndef SMU9_DRIVER_IF_H 25 #define SMU9_DRIVER_IF_H 26 27 #include "smu9.h" 28 29 /**** IMPORTANT *** 30 * SMU TEAM: Always increment the interface version if 31 * any structure is changed in this file 32 */ 33 #define SMU9_DRIVER_IF_VERSION 0xE 34 35 #define PPTABLE_V10_SMU_VERSION 1 36 37 #define NUM_GFXCLK_DPM_LEVELS 8 38 #define NUM_UVD_DPM_LEVELS 8 39 #define NUM_VCE_DPM_LEVELS 8 40 #define NUM_MP0CLK_DPM_LEVELS 8 41 #define NUM_UCLK_DPM_LEVELS 4 42 #define NUM_SOCCLK_DPM_LEVELS 8 43 #define NUM_DCEFCLK_DPM_LEVELS 8 44 #define NUM_LINK_LEVELS 2 45 46 #define MAX_GFXCLK_DPM_LEVEL (NUM_GFXCLK_DPM_LEVELS - 1) 47 #define MAX_UVD_DPM_LEVEL (NUM_UVD_DPM_LEVELS - 1) 48 #define MAX_VCE_DPM_LEVEL (NUM_VCE_DPM_LEVELS - 1) 49 #define MAX_MP0CLK_DPM_LEVEL (NUM_MP0CLK_DPM_LEVELS - 1) 50 #define MAX_UCLK_DPM_LEVEL (NUM_UCLK_DPM_LEVELS - 1) 51 #define MAX_SOCCLK_DPM_LEVEL (NUM_SOCCLK_DPM_LEVELS - 1) 52 #define MAX_DCEFCLK_DPM_LEVEL (NUM_DCEFCLK_DPM_LEVELS - 1) 53 #define MAX_LINK_DPM_LEVEL (NUM_LINK_LEVELS - 1) 54 55 #define MIN_GFXCLK_DPM_LEVEL 0 56 #define MIN_UVD_DPM_LEVEL 0 57 #define MIN_VCE_DPM_LEVEL 0 58 #define MIN_MP0CLK_DPM_LEVEL 0 59 #define MIN_UCLK_DPM_LEVEL 0 60 #define MIN_SOCCLK_DPM_LEVEL 0 61 #define MIN_DCEFCLK_DPM_LEVEL 0 62 #define MIN_LINK_DPM_LEVEL 0 63 64 #define NUM_EVV_VOLTAGE_LEVELS 8 65 #define MAX_EVV_VOLTAGE_LEVEL (NUM_EVV_VOLTAGE_LEVELS - 1) 66 #define MIN_EVV_VOLTAGE_LEVEL 0 67 68 #define NUM_PSP_LEVEL_MAP 4 69 70 /* Gemini Modes */ 71 #define PPSMC_GeminiModeNone 0 /* Single GPU board */ 72 #define PPSMC_GeminiModeMaster 1 /* Master GPU on a Gemini board */ 73 #define PPSMC_GeminiModeSlave 2 /* Slave GPU on a Gemini board */ 74 75 /* Voltage Modes for DPMs */ 76 #define VOLTAGE_MODE_AVFS_INTERPOLATE 0 77 #define VOLTAGE_MODE_AVFS_WORST_CASE 1 78 #define VOLTAGE_MODE_STATIC 2 79 80 typedef struct { 81 uint32_t FbMult; /* Feedback Multiplier, bit 8:0 int, bit 15:12 post_div, bit 31:16 frac */ 82 uint32_t SsFbMult; /* Spread FB Mult: bit 8:0 int, bit 31:16 frac */ 83 uint16_t SsSlewFrac; 84 uint8_t SsOn; 85 uint8_t Did; /* DID */ 86 } PllSetting_t; 87 88 typedef struct { 89 int32_t a0; 90 int32_t a1; 91 int32_t a2; 92 93 uint8_t a0_shift; 94 uint8_t a1_shift; 95 uint8_t a2_shift; 96 uint8_t padding; 97 } GbVdroopTable_t; 98 99 typedef struct { 100 int32_t m1; 101 int32_t m2; 102 int32_t b; 103 104 uint8_t m1_shift; 105 uint8_t m2_shift; 106 uint8_t b_shift; 107 uint8_t padding; 108 } QuadraticInt_t; 109 110 #define NUM_DSPCLK_LEVELS 8 111 112 typedef enum { 113 DSPCLK_DCEFCLK = 0, 114 DSPCLK_DISPCLK, 115 DSPCLK_PIXCLK, 116 DSPCLK_PHYCLK, 117 DSPCLK_COUNT, 118 } DSPCLK_e; 119 120 typedef struct { 121 uint16_t Freq; /* in MHz */ 122 uint16_t Vid; /* min voltage in SVI2 VID */ 123 } DisplayClockTable_t; 124 125 typedef struct { 126 /* PowerTune */ 127 uint16_t SocketPowerLimit; /* Watts */ 128 uint16_t TdcLimit; /* Amps */ 129 uint16_t EdcLimit; /* Amps */ 130 uint16_t TedgeLimit; /* Celcius */ 131 uint16_t ThotspotLimit; /* Celcius */ 132 uint16_t ThbmLimit; /* Celcius */ 133 uint16_t Tvr_socLimit; /* Celcius */ 134 uint16_t Tvr_memLimit; /* Celcius */ 135 uint16_t Tliquid1Limit; /* Celcius */ 136 uint16_t Tliquid2Limit; /* Celcius */ 137 uint16_t TplxLimit; /* Celcius */ 138 uint16_t LoadLineResistance; /* in mOhms */ 139 uint32_t FitLimit; /* Failures in time (failures per million parts over the defined lifetime) */ 140 141 /* External Component Communication Settings */ 142 uint8_t Liquid1_I2C_address; 143 uint8_t Liquid2_I2C_address; 144 uint8_t Vr_I2C_address; 145 uint8_t Plx_I2C_address; 146 147 uint8_t GeminiMode; 148 uint8_t spare17[3]; 149 uint32_t GeminiApertureHigh; 150 uint32_t GeminiApertureLow; 151 152 uint8_t Liquid_I2C_LineSCL; 153 uint8_t Liquid_I2C_LineSDA; 154 uint8_t Vr_I2C_LineSCL; 155 uint8_t Vr_I2C_LineSDA; 156 uint8_t Plx_I2C_LineSCL; 157 uint8_t Plx_I2C_LineSDA; 158 uint8_t paddingx[2]; 159 160 /* ULV Settings */ 161 uint8_t UlvOffsetVid; /* SVI2 VID */ 162 uint8_t UlvSmnclkDid; /* DID for ULV mode. 0 means CLK will not be modified in ULV. */ 163 uint8_t UlvMp1clkDid; /* DID for ULV mode. 0 means CLK will not be modified in ULV. */ 164 uint8_t UlvGfxclkBypass; /* 1 to turn off/bypass Gfxclk during ULV, 0 to leave Gfxclk on during ULV */ 165 166 /* VDDCR_SOC Voltages */ 167 uint8_t SocVid[NUM_EVV_VOLTAGE_LEVELS]; 168 169 /* This is the minimum voltage needed to run the SOC. */ 170 uint8_t MinVoltageVid; /* Minimum Voltage ("Vmin") of ASIC */ 171 uint8_t MaxVoltageVid; /* Maximum Voltage allowable */ 172 uint8_t MaxVidStep; /* Max VID step that SMU will request. Multiple steps are taken if voltage change exceeds this value. */ 173 uint8_t padding8; 174 175 uint8_t UlvPhaseSheddingPsi0; /* set this to 1 to set PSI0/1 to 1 in ULV mode */ 176 uint8_t UlvPhaseSheddingPsi1; /* set this to 1 to set PSI0/1 to 1 in ULV mode */ 177 uint8_t padding8_2[2]; 178 179 /* SOC Frequencies */ 180 PllSetting_t GfxclkLevel [NUM_GFXCLK_DPM_LEVELS]; 181 182 uint8_t SocclkDid [NUM_SOCCLK_DPM_LEVELS]; /* DID */ 183 uint8_t SocDpmVoltageIndex [NUM_SOCCLK_DPM_LEVELS]; 184 185 uint8_t VclkDid [NUM_UVD_DPM_LEVELS]; /* DID */ 186 uint8_t DclkDid [NUM_UVD_DPM_LEVELS]; /* DID */ 187 uint8_t UvdDpmVoltageIndex [NUM_UVD_DPM_LEVELS]; 188 189 uint8_t EclkDid [NUM_VCE_DPM_LEVELS]; /* DID */ 190 uint8_t VceDpmVoltageIndex [NUM_VCE_DPM_LEVELS]; 191 192 uint8_t Mp0clkDid [NUM_MP0CLK_DPM_LEVELS]; /* DID */ 193 uint8_t Mp0DpmVoltageIndex [NUM_MP0CLK_DPM_LEVELS]; 194 195 DisplayClockTable_t DisplayClockTable[DSPCLK_COUNT][NUM_DSPCLK_LEVELS]; 196 QuadraticInt_t DisplayClock2Gfxclk[DSPCLK_COUNT]; 197 198 uint8_t GfxDpmVoltageMode; 199 uint8_t SocDpmVoltageMode; 200 uint8_t UclkDpmVoltageMode; 201 uint8_t UvdDpmVoltageMode; 202 203 uint8_t VceDpmVoltageMode; 204 uint8_t Mp0DpmVoltageMode; 205 uint8_t DisplayDpmVoltageMode; 206 uint8_t padding8_3; 207 208 uint16_t GfxclkSlewRate; 209 uint16_t padding; 210 211 uint32_t LowGfxclkInterruptThreshold; /* in units of 10KHz */ 212 213 /* Alpha parameters for clock averages. ("255"=1) */ 214 uint8_t GfxclkAverageAlpha; 215 uint8_t SocclkAverageAlpha; 216 uint8_t UclkAverageAlpha; 217 uint8_t GfxActivityAverageAlpha; 218 219 /* UCLK States */ 220 uint8_t MemVid[NUM_UCLK_DPM_LEVELS]; /* VID */ 221 PllSetting_t UclkLevel[NUM_UCLK_DPM_LEVELS]; /* Full PLL settings */ 222 uint8_t MemSocVoltageIndex[NUM_UCLK_DPM_LEVELS]; 223 uint8_t LowestUclkReservedForUlv; /* Set this to 1 if UCLK DPM0 is reserved for ULV-mode only */ 224 uint8_t paddingUclk[3]; 225 uint16_t NumMemoryChannels; /* Used for memory bandwidth calculations */ 226 uint16_t MemoryChannelWidth; /* Used for memory bandwidth calculations */ 227 228 /* CKS Settings */ 229 uint8_t CksEnable[NUM_GFXCLK_DPM_LEVELS]; 230 uint8_t CksVidOffset[NUM_GFXCLK_DPM_LEVELS]; 231 232 /* MP0 Mapping Table */ 233 uint8_t PspLevelMap[NUM_PSP_LEVEL_MAP]; 234 235 /* Link DPM Settings */ 236 uint8_t PcieGenSpeed[NUM_LINK_LEVELS]; /* 0:PciE-gen1 1:PciE-gen2 2:PciE-gen3 */ 237 uint8_t PcieLaneCount[NUM_LINK_LEVELS]; /* 1=x1, 2=x2, 3=x4, 4=x8, 5=x12, 6=x16 */ 238 uint8_t LclkDid[NUM_LINK_LEVELS]; /* Leave at 0 to use hardcoded values in FW */ 239 uint8_t paddingLinkDpm[2]; 240 241 /* Fan Control */ 242 uint16_t FanStopTemp; /* Celcius */ 243 uint16_t FanStartTemp; /* Celcius */ 244 245 uint16_t FanGainEdge; 246 uint16_t FanGainHotspot; 247 uint16_t FanGainLiquid; 248 uint16_t FanGainVrVddc; 249 uint16_t FanGainVrMvdd; 250 uint16_t FanGainPlx; 251 uint16_t FanGainHbm; 252 uint16_t FanPwmMin; 253 uint16_t FanAcousticLimitRpm; 254 uint16_t FanThrottlingRpm; 255 uint16_t FanMaximumRpm; 256 uint16_t FanTargetTemperature; 257 uint16_t FanTargetGfxclk; 258 uint8_t FanZeroRpmEnable; 259 uint8_t FanSpare; 260 261 /* The following are AFC override parameters. Leave at 0 to use FW defaults. */ 262 int16_t FuzzyFan_ErrorSetDelta; 263 int16_t FuzzyFan_ErrorRateSetDelta; 264 int16_t FuzzyFan_PwmSetDelta; 265 uint16_t FuzzyFan_Reserved; 266 267 /* GPIO Settings */ 268 uint8_t AcDcGpio; /* GPIO pin configured for AC/DC switching */ 269 uint8_t AcDcPolarity; /* GPIO polarity for AC/DC switching */ 270 uint8_t VR0HotGpio; /* GPIO pin configured for VR0 HOT event */ 271 uint8_t VR0HotPolarity; /* GPIO polarity for VR0 HOT event */ 272 uint8_t VR1HotGpio; /* GPIO pin configured for VR1 HOT event */ 273 uint8_t VR1HotPolarity; /* GPIO polarity for VR1 HOT event */ 274 uint8_t Padding1; /* replace GPIO pin configured for CTF */ 275 uint8_t Padding2; /* replace GPIO polarity for CTF */ 276 277 /* LED Display Settings */ 278 uint8_t LedPin0; /* GPIO number for LedPin[0] */ 279 uint8_t LedPin1; /* GPIO number for LedPin[1] */ 280 uint8_t LedPin2; /* GPIO number for LedPin[2] */ 281 uint8_t padding8_4; 282 283 /* AVFS */ 284 uint8_t OverrideBtcGbCksOn; 285 uint8_t OverrideAvfsGbCksOn; 286 uint8_t PaddingAvfs8[2]; 287 288 GbVdroopTable_t BtcGbVdroopTableCksOn; 289 GbVdroopTable_t BtcGbVdroopTableCksOff; 290 291 QuadraticInt_t AvfsGbCksOn; /* Replacement equation */ 292 QuadraticInt_t AvfsGbCksOff; /* Replacement equation */ 293 294 uint8_t StaticVoltageOffsetVid[NUM_GFXCLK_DPM_LEVELS]; /* This values are added on to the final voltage calculation */ 295 296 /* Ageing Guardband Parameters */ 297 uint32_t AConstant[3]; 298 uint16_t DC_tol_sigma; 299 uint16_t Platform_mean; 300 uint16_t Platform_sigma; 301 uint16_t PSM_Age_CompFactor; 302 303 uint32_t DpmLevelPowerDelta; 304 305 uint8_t EnableBoostState; 306 uint8_t AConstant_Shift; 307 uint8_t DC_tol_sigma_Shift; 308 uint8_t PSM_Age_CompFactor_Shift; 309 310 uint16_t BoostStartTemperature; 311 uint16_t BoostStopTemperature; 312 313 PllSetting_t GfxBoostState; 314 315 uint8_t AcgEnable[NUM_GFXCLK_DPM_LEVELS]; 316 GbVdroopTable_t AcgBtcGbVdroopTable; 317 QuadraticInt_t AcgAvfsGb; 318 319 /* ACG Frequency Table, in Mhz */ 320 uint32_t AcgFreqTable[NUM_GFXCLK_DPM_LEVELS]; 321 322 /* Padding - ignore */ 323 uint32_t MmHubPadding[3]; /* SMU internal use */ 324 325 } PPTable_t; 326 327 typedef struct { 328 uint16_t MinClock; // This is either DCEFCLK or SOCCLK (in MHz) 329 uint16_t MaxClock; // This is either DCEFCLK or SOCCLK (in MHz) 330 uint16_t MinUclk; 331 uint16_t MaxUclk; 332 333 uint8_t WmSetting; 334 uint8_t Padding[3]; 335 } WatermarkRowGeneric_t; 336 337 #define NUM_WM_RANGES 4 338 339 typedef enum { 340 WM_SOCCLK = 0, 341 WM_DCEFCLK, 342 WM_COUNT, 343 } WM_CLOCK_e; 344 345 typedef struct { 346 /* Watermarks */ 347 WatermarkRowGeneric_t WatermarkRow[WM_COUNT][NUM_WM_RANGES]; 348 349 uint32_t MmHubPadding[7]; /* SMU internal use */ 350 } Watermarks_t; 351 352 #ifdef PPTABLE_V10_SMU_VERSION 353 typedef struct { 354 float AvfsGbCksOn[NUM_GFXCLK_DPM_LEVELS]; 355 float AcBtcGbCksOn[NUM_GFXCLK_DPM_LEVELS]; 356 float AvfsGbCksOff[NUM_GFXCLK_DPM_LEVELS]; 357 float AcBtcGbCksOff[NUM_GFXCLK_DPM_LEVELS]; 358 float DcBtcGb; 359 360 uint32_t MmHubPadding[7]; /* SMU internal use */ 361 } AvfsTable_t; 362 #else 363 typedef struct { 364 uint32_t AvfsGbCksOn[NUM_GFXCLK_DPM_LEVELS]; 365 uint32_t AcBtcGbCksOn[NUM_GFXCLK_DPM_LEVELS]; 366 uint32_t AvfsGbCksOff[NUM_GFXCLK_DPM_LEVELS]; 367 uint32_t AcBtcGbCksOff[NUM_GFXCLK_DPM_LEVELS]; 368 uint32_t DcBtcGb; 369 370 uint32_t MmHubPadding[7]; /* SMU internal use */ 371 } AvfsTable_t; 372 #endif 373 374 typedef struct { 375 uint16_t avgPsmCount[30]; 376 uint16_t minPsmCount[30]; 377 float avgPsmVoltage[30]; 378 float minPsmVoltage[30]; 379 380 uint32_t MmHubPadding[7]; /* SMU internal use */ 381 } AvfsDebugTable_t; 382 383 typedef struct { 384 uint8_t AvfsEn; 385 uint8_t AvfsVersion; 386 uint8_t Padding[2]; 387 388 int32_t VFT0_m1; /* Q8.24 */ 389 int32_t VFT0_m2; /* Q12.12 */ 390 int32_t VFT0_b; /* Q32 */ 391 392 int32_t VFT1_m1; /* Q8.16 */ 393 int32_t VFT1_m2; /* Q12.12 */ 394 int32_t VFT1_b; /* Q32 */ 395 396 int32_t VFT2_m1; /* Q8.16 */ 397 int32_t VFT2_m2; /* Q12.12 */ 398 int32_t VFT2_b; /* Q32 */ 399 400 int32_t AvfsGb0_m1; /* Q8.16 */ 401 int32_t AvfsGb0_m2; /* Q12.12 */ 402 int32_t AvfsGb0_b; /* Q32 */ 403 404 int32_t AcBtcGb_m1; /* Q8.24 */ 405 int32_t AcBtcGb_m2; /* Q12.12 */ 406 int32_t AcBtcGb_b; /* Q32 */ 407 408 uint32_t AvfsTempCold; 409 uint32_t AvfsTempMid; 410 uint32_t AvfsTempHot; 411 412 uint32_t InversionVoltage; /* in mV with 2 fractional bits */ 413 414 int32_t P2V_m1; /* Q8.24 */ 415 int32_t P2V_m2; /* Q12.12 */ 416 int32_t P2V_b; /* Q32 */ 417 418 uint32_t P2VCharzFreq; /* in 10KHz units */ 419 420 uint32_t EnabledAvfsModules; 421 422 uint32_t MmHubPadding[7]; /* SMU internal use */ 423 } AvfsFuseOverride_t; 424 425 /* These defines are used with the following messages: 426 * SMC_MSG_TransferTableDram2Smu 427 * SMC_MSG_TransferTableSmu2Dram 428 */ 429 #define TABLE_PPTABLE 0 430 #define TABLE_WATERMARKS 1 431 #define TABLE_AVFS 2 432 #define TABLE_AVFS_PSM_DEBUG 3 433 #define TABLE_AVFS_FUSE_OVERRIDE 4 434 #define TABLE_PMSTATUSLOG 5 435 #define TABLE_COUNT 6 436 437 /* These defines are used with the SMC_MSG_SetUclkFastSwitch message. */ 438 #define UCLK_SWITCH_SLOW 0 439 #define UCLK_SWITCH_FAST 1 440 441 /* GFX DIDT Configuration */ 442 #define SQ_Enable_MASK 0x1 443 #define SQ_IR_MASK 0x2 444 #define SQ_PCC_MASK 0x4 445 #define SQ_EDC_MASK 0x8 446 447 #define TCP_Enable_MASK 0x100 448 #define TCP_IR_MASK 0x200 449 #define TCP_PCC_MASK 0x400 450 #define TCP_EDC_MASK 0x800 451 452 #define TD_Enable_MASK 0x10000 453 #define TD_IR_MASK 0x20000 454 #define TD_PCC_MASK 0x40000 455 #define TD_EDC_MASK 0x80000 456 457 #define DB_Enable_MASK 0x1000000 458 #define DB_IR_MASK 0x2000000 459 #define DB_PCC_MASK 0x4000000 460 #define DB_EDC_MASK 0x8000000 461 462 #define SQ_Enable_SHIFT 0 463 #define SQ_IR_SHIFT 1 464 #define SQ_PCC_SHIFT 2 465 #define SQ_EDC_SHIFT 3 466 467 #define TCP_Enable_SHIFT 8 468 #define TCP_IR_SHIFT 9 469 #define TCP_PCC_SHIFT 10 470 #define TCP_EDC_SHIFT 11 471 472 #define TD_Enable_SHIFT 16 473 #define TD_IR_SHIFT 17 474 #define TD_PCC_SHIFT 18 475 #define TD_EDC_SHIFT 19 476 477 #define DB_Enable_SHIFT 24 478 #define DB_IR_SHIFT 25 479 #define DB_PCC_SHIFT 26 480 #define DB_EDC_SHIFT 27 481 482 #define REMOVE_FMAX_MARGIN_BIT 0x0 483 #define REMOVE_DCTOL_MARGIN_BIT 0x1 484 #define REMOVE_PLATFORM_MARGIN_BIT 0x2 485 486 #endif 487