linux/drivers/gpu/drm/amd/pm/inc/smu9_driver_if.h
<<
>>
Prefs
   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
  80typedef 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
  88typedef 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
  99typedef 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
 112typedef enum {
 113  DSPCLK_DCEFCLK = 0,
 114  DSPCLK_DISPCLK,
 115  DSPCLK_PIXCLK,
 116  DSPCLK_PHYCLK,
 117  DSPCLK_COUNT,
 118} DSPCLK_e;
 119
 120typedef struct {
 121  uint16_t Freq; /* in MHz */
 122  uint16_t Vid;  /* min voltage in SVI2 VID */
 123} DisplayClockTable_t;
 124
 125typedef 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
 327typedef 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
 339typedef enum {
 340  WM_SOCCLK = 0,
 341  WM_DCEFCLK,
 342  WM_COUNT,
 343} WM_CLOCK_e;
 344
 345typedef 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
 353typedef 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
 363typedef 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
 374typedef 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
 383typedef 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