root/sys/dev/pci/drm/amd/pm/powerplay/hwmgr/vega10_pptable.h
/*
 * Copyright 2016 Advanced Micro Devices, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 */
#ifndef _VEGA10_PPTABLE_H_
#define _VEGA10_PPTABLE_H_

#pragma pack(push, 1)

#define ATOM_VEGA10_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK 0x0f
#define ATOM_VEGA10_PP_FANPARAMETERS_NOFAN                                 0x80

#define ATOM_VEGA10_PP_THERMALCONTROLLER_NONE      0
#define ATOM_VEGA10_PP_THERMALCONTROLLER_LM96163   17
#define ATOM_VEGA10_PP_THERMALCONTROLLER_VEGA10    24

#define ATOM_VEGA10_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL   0x89
#define ATOM_VEGA10_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL   0x8D

#define ATOM_VEGA10_PP_PLATFORM_CAP_POWERPLAY                   0x1
#define ATOM_VEGA10_PP_PLATFORM_CAP_SBIOSPOWERSOURCE            0x2
#define ATOM_VEGA10_PP_PLATFORM_CAP_HARDWAREDC                  0x4
#define ATOM_VEGA10_PP_PLATFORM_CAP_BACO                        0x8
#define ATOM_VEGA10_PP_PLATFORM_COMBINE_PCC_WITH_THERMAL_SIGNAL 0x10


/* ATOM_PPLIB_NONCLOCK_INFO::usClassification */
#define ATOM_PPLIB_CLASSIFICATION_UI_MASK               0x0007
#define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT              0
#define ATOM_PPLIB_CLASSIFICATION_UI_NONE               0
#define ATOM_PPLIB_CLASSIFICATION_UI_BATTERY            1
#define ATOM_PPLIB_CLASSIFICATION_UI_BALANCED           3
#define ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE        5
/* 2, 4, 6, 7 are reserved */

#define ATOM_PPLIB_CLASSIFICATION_BOOT                  0x0008
#define ATOM_PPLIB_CLASSIFICATION_THERMAL               0x0010
#define ATOM_PPLIB_CLASSIFICATION_LIMITEDPOWERSOURCE    0x0020
#define ATOM_PPLIB_CLASSIFICATION_REST                  0x0040
#define ATOM_PPLIB_CLASSIFICATION_FORCED                0x0080
#define ATOM_PPLIB_CLASSIFICATION_ACPI                  0x1000

/* ATOM_PPLIB_NONCLOCK_INFO::usClassification2 */
#define ATOM_PPLIB_CLASSIFICATION2_LIMITEDPOWERSOURCE_2 0x0001

#define ATOM_Vega10_DISALLOW_ON_DC                   0x00004000
#define ATOM_Vega10_ENABLE_VARIBRIGHT                0x00008000

#define ATOM_Vega10_TABLE_REVISION_VEGA10         8

#define ATOM_Vega10_VoltageMode_AVFS_Interpolate     0
#define ATOM_Vega10_VoltageMode_AVFS_WorstCase       1
#define ATOM_Vega10_VoltageMode_Static               2

typedef struct _ATOM_Vega10_POWERPLAYTABLE {
        struct atom_common_table_header sHeader;
        UCHAR  ucTableRevision;
        USHORT usTableSize;                        /* the size of header structure */
        ULONG  ulGoldenPPID;                       /* PPGen use only */
        ULONG  ulGoldenRevision;                   /* PPGen use only */
        USHORT usFormatID;                         /* PPGen use only */
        ULONG  ulPlatformCaps;                     /* See ATOM_Vega10_CAPS_* */
        ULONG  ulMaxODEngineClock;                 /* For Overdrive. */
        ULONG  ulMaxODMemoryClock;                 /* For Overdrive. */
        USHORT usPowerControlLimit;
        USHORT usUlvVoltageOffset;                 /* in mv units */
        USHORT usUlvSmnclkDid;
        USHORT usUlvMp1clkDid;
        USHORT usUlvGfxclkBypass;
        USHORT usGfxclkSlewRate;
        UCHAR  ucGfxVoltageMode;
        UCHAR  ucSocVoltageMode;
        UCHAR  ucUclkVoltageMode;
        UCHAR  ucUvdVoltageMode;
        UCHAR  ucVceVoltageMode;
        UCHAR  ucMp0VoltageMode;
        UCHAR  ucDcefVoltageMode;
        USHORT usStateArrayOffset;                 /* points to ATOM_Vega10_State_Array */
        USHORT usFanTableOffset;                   /* points to ATOM_Vega10_Fan_Table */
        USHORT usThermalControllerOffset;          /* points to ATOM_Vega10_Thermal_Controller */
        USHORT usSocclkDependencyTableOffset;      /* points to ATOM_Vega10_SOCCLK_Dependency_Table */
        USHORT usMclkDependencyTableOffset;        /* points to ATOM_Vega10_MCLK_Dependency_Table */
        USHORT usGfxclkDependencyTableOffset;      /* points to ATOM_Vega10_GFXCLK_Dependency_Table */
        USHORT usDcefclkDependencyTableOffset;     /* points to ATOM_Vega10_DCEFCLK_Dependency_Table */
        USHORT usVddcLookupTableOffset;            /* points to ATOM_Vega10_Voltage_Lookup_Table */
        USHORT usVddmemLookupTableOffset;          /* points to ATOM_Vega10_Voltage_Lookup_Table */
        USHORT usMMDependencyTableOffset;          /* points to ATOM_Vega10_MM_Dependency_Table */
        USHORT usVCEStateTableOffset;              /* points to ATOM_Vega10_VCE_State_Table */
        USHORT usReserve;                          /* No PPM Support for Vega10 */
        USHORT usPowerTuneTableOffset;             /* points to ATOM_Vega10_PowerTune_Table */
        USHORT usHardLimitTableOffset;             /* points to ATOM_Vega10_Hard_Limit_Table */
        USHORT usVddciLookupTableOffset;           /* points to ATOM_Vega10_Voltage_Lookup_Table */
        USHORT usPCIETableOffset;                  /* points to ATOM_Vega10_PCIE_Table */
        USHORT usPixclkDependencyTableOffset;      /* points to ATOM_Vega10_PIXCLK_Dependency_Table */
        USHORT usDispClkDependencyTableOffset;     /* points to ATOM_Vega10_DISPCLK_Dependency_Table */
        USHORT usPhyClkDependencyTableOffset;      /* points to ATOM_Vega10_PHYCLK_Dependency_Table */
} ATOM_Vega10_POWERPLAYTABLE;

typedef struct _ATOM_Vega10_State {
        UCHAR  ucSocClockIndexHigh;
        UCHAR  ucSocClockIndexLow;
        UCHAR  ucGfxClockIndexHigh;
        UCHAR  ucGfxClockIndexLow;
        UCHAR  ucMemClockIndexHigh;
        UCHAR  ucMemClockIndexLow;
        USHORT usClassification;
        ULONG  ulCapsAndSettings;
        USHORT usClassification2;
} ATOM_Vega10_State;

typedef struct _ATOM_Vega10_State_Array {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                         /* Number of entries. */
        ATOM_Vega10_State states[];                             /* Dynamically allocate entries. */
} ATOM_Vega10_State_Array;

typedef struct _ATOM_Vega10_CLK_Dependency_Record {
        ULONG  ulClk;                                               /* Frequency of Clock */
        UCHAR  ucVddInd;                                            /* Base voltage */
} ATOM_Vega10_CLK_Dependency_Record;

typedef struct _ATOM_Vega10_GFXCLK_Dependency_Record {
        ULONG  ulClk;                                               /* Clock Frequency */
        UCHAR  ucVddInd;                                            /* SOC_VDD index */
        USHORT usCKSVOffsetandDisable;                              /* Bits 0~30: Voltage offset for CKS, Bit 31: Disable/enable for the GFXCLK level. */
        USHORT usAVFSOffset;                                        /* AVFS Voltage offset */
} ATOM_Vega10_GFXCLK_Dependency_Record;

typedef struct _ATOM_Vega10_GFXCLK_Dependency_Record_V2 {
        ULONG  ulClk;
        UCHAR  ucVddInd;
        USHORT usCKSVOffsetandDisable;
        USHORT usAVFSOffset;
        UCHAR  ucACGEnable;
        UCHAR  ucReserved[3];
} ATOM_Vega10_GFXCLK_Dependency_Record_V2;

typedef struct _ATOM_Vega10_MCLK_Dependency_Record {
        ULONG  ulMemClk;                                            /* Clock Frequency */
        UCHAR  ucVddInd;                                            /* SOC_VDD index */
        UCHAR  ucVddMemInd;                                         /* MEM_VDD - only non zero for MCLK record */
        UCHAR  ucVddciInd;                                          /* VDDCI   = only non zero for MCLK record */
} ATOM_Vega10_MCLK_Dependency_Record;

typedef struct _ATOM_Vega10_GFXCLK_Dependency_Table {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                     /* Number of entries. */
        ATOM_Vega10_GFXCLK_Dependency_Record entries[];         /* Dynamically allocate entries. */
} ATOM_Vega10_GFXCLK_Dependency_Table;

typedef struct _ATOM_Vega10_MCLK_Dependency_Table {
    UCHAR ucRevId;
    UCHAR ucNumEntries;                                         /* Number of entries. */
    ATOM_Vega10_MCLK_Dependency_Record entries[];            /* Dynamically allocate entries. */
} ATOM_Vega10_MCLK_Dependency_Table;

typedef struct _ATOM_Vega10_SOCCLK_Dependency_Table {
    UCHAR ucRevId;
    UCHAR ucNumEntries;                                         /* Number of entries. */
    ATOM_Vega10_CLK_Dependency_Record entries[];            /* Dynamically allocate entries. */
} ATOM_Vega10_SOCCLK_Dependency_Table;

typedef struct _ATOM_Vega10_DCEFCLK_Dependency_Table {
    UCHAR ucRevId;
    UCHAR ucNumEntries;                                         /* Number of entries. */
    ATOM_Vega10_CLK_Dependency_Record entries[];            /* Dynamically allocate entries. */
} ATOM_Vega10_DCEFCLK_Dependency_Table;

typedef struct _ATOM_Vega10_PIXCLK_Dependency_Table {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                         /* Number of entries. */
        ATOM_Vega10_CLK_Dependency_Record entries[];            /* Dynamically allocate entries. */
} ATOM_Vega10_PIXCLK_Dependency_Table;

typedef struct _ATOM_Vega10_DISPCLK_Dependency_Table {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                         /* Number of entries.*/
        ATOM_Vega10_CLK_Dependency_Record entries[];            /* Dynamically allocate entries. */
} ATOM_Vega10_DISPCLK_Dependency_Table;

typedef struct _ATOM_Vega10_PHYCLK_Dependency_Table {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                         /* Number of entries. */
        ATOM_Vega10_CLK_Dependency_Record entries[];            /* Dynamically allocate entries. */
} ATOM_Vega10_PHYCLK_Dependency_Table;

typedef struct _ATOM_Vega10_MM_Dependency_Record {
    UCHAR  ucVddcInd;                                           /* SOC_VDD voltage */
    ULONG  ulDClk;                                              /* UVD D-clock */
    ULONG  ulVClk;                                              /* UVD V-clock */
    ULONG  ulEClk;                                              /* VCE clock */
    ULONG  ulPSPClk;                                            /* PSP clock */
} ATOM_Vega10_MM_Dependency_Record;

typedef struct _ATOM_Vega10_MM_Dependency_Table {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                         /* Number of entries */
        ATOM_Vega10_MM_Dependency_Record entries[];             /* Dynamically allocate entries */
} ATOM_Vega10_MM_Dependency_Table;

typedef struct _ATOM_Vega10_PCIE_Record {
        ULONG ulLCLK;                                               /* LClock */
        UCHAR ucPCIEGenSpeed;                                       /* PCIE Speed */
        UCHAR ucPCIELaneWidth;                                      /* PCIE Lane Width */
} ATOM_Vega10_PCIE_Record;

typedef struct _ATOM_Vega10_PCIE_Table {
        UCHAR  ucRevId;
        UCHAR  ucNumEntries;                                        /* Number of entries */
        ATOM_Vega10_PCIE_Record entries[];                      /* Dynamically allocate entries. */
} ATOM_Vega10_PCIE_Table;

typedef struct _ATOM_Vega10_Voltage_Lookup_Record {
        USHORT usVdd;                                               /* Base voltage */
} ATOM_Vega10_Voltage_Lookup_Record;

typedef struct _ATOM_Vega10_Voltage_Lookup_Table {
        UCHAR ucRevId;
        UCHAR ucNumEntries;                                          /* Number of entries */
        ATOM_Vega10_Voltage_Lookup_Record entries[];             /* Dynamically allocate entries */
} ATOM_Vega10_Voltage_Lookup_Table;

typedef struct _ATOM_Vega10_Fan_Table {
        UCHAR   ucRevId;                         /* Change this if the table format changes or version changes so that the other fields are not the same. */
        USHORT  usFanOutputSensitivity;          /* Sensitivity of fan reaction to temepature changes. */
        USHORT  usFanRPMMax;                     /* The default value in RPM. */
        USHORT  usThrottlingRPM;
        USHORT  usFanAcousticLimit;              /* Minimum Fan Controller Frequency Acoustic Limit. */
        USHORT  usTargetTemperature;             /* The default ideal temperature in Celcius. */
        USHORT  usMinimumPWMLimit;               /* The minimum PWM that the advanced fan controller can set. */
        USHORT  usTargetGfxClk;                   /* The ideal Fan Controller GFXCLK Frequency Acoustic Limit. */
        USHORT  usFanGainEdge;
        USHORT  usFanGainHotspot;
        USHORT  usFanGainLiquid;
        USHORT  usFanGainVrVddc;
        USHORT  usFanGainVrMvdd;
        USHORT  usFanGainPlx;
        USHORT  usFanGainHbm;
        UCHAR   ucEnableZeroRPM;
        USHORT  usFanStopTemperature;
        USHORT  usFanStartTemperature;
} ATOM_Vega10_Fan_Table;

typedef struct _ATOM_Vega10_Fan_Table_V2 {
        UCHAR   ucRevId;
        USHORT  usFanOutputSensitivity;
        USHORT  usFanAcousticLimitRpm;
        USHORT  usThrottlingRPM;
        USHORT  usTargetTemperature;
        USHORT  usMinimumPWMLimit;
        USHORT  usTargetGfxClk;
        USHORT  usFanGainEdge;
        USHORT  usFanGainHotspot;
        USHORT  usFanGainLiquid;
        USHORT  usFanGainVrVddc;
        USHORT  usFanGainVrMvdd;
        USHORT  usFanGainPlx;
        USHORT  usFanGainHbm;
        UCHAR   ucEnableZeroRPM;
        USHORT  usFanStopTemperature;
        USHORT  usFanStartTemperature;
        UCHAR   ucFanParameters;
        UCHAR   ucFanMinRPM;
        UCHAR   ucFanMaxRPM;
} ATOM_Vega10_Fan_Table_V2;

typedef struct _ATOM_Vega10_Fan_Table_V3 {
        UCHAR   ucRevId;
        USHORT  usFanOutputSensitivity;
        USHORT  usFanAcousticLimitRpm;
        USHORT  usThrottlingRPM;
        USHORT  usTargetTemperature;
        USHORT  usMinimumPWMLimit;
        USHORT  usTargetGfxClk;
        USHORT  usFanGainEdge;
        USHORT  usFanGainHotspot;
        USHORT  usFanGainLiquid;
        USHORT  usFanGainVrVddc;
        USHORT  usFanGainVrMvdd;
        USHORT  usFanGainPlx;
        USHORT  usFanGainHbm;
        UCHAR   ucEnableZeroRPM;
        USHORT  usFanStopTemperature;
        USHORT  usFanStartTemperature;
        UCHAR   ucFanParameters;
        UCHAR   ucFanMinRPM;
        UCHAR   ucFanMaxRPM;
        USHORT  usMGpuThrottlingRPM;
} ATOM_Vega10_Fan_Table_V3;

typedef struct _ATOM_Vega10_Thermal_Controller {
        UCHAR ucRevId;
        UCHAR ucType;           /* one of ATOM_VEGA10_PP_THERMALCONTROLLER_*/
        UCHAR ucI2cLine;        /* as interpreted by DAL I2C */
        UCHAR ucI2cAddress;
        UCHAR ucFanParameters;  /* Fan Control Parameters. */
        UCHAR ucFanMinRPM;      /* Fan Minimum RPM (hundreds) -- for display purposes only.*/
        UCHAR ucFanMaxRPM;      /* Fan Maximum RPM (hundreds) -- for display purposes only.*/
    UCHAR ucFlags;          /* to be defined */
} ATOM_Vega10_Thermal_Controller;

typedef struct _ATOM_Vega10_VCE_State_Record {
    UCHAR  ucVCEClockIndex;         /*index into usVCEDependencyTableOffset of 'ATOM_Vega10_MM_Dependency_Table' type */
    UCHAR  ucFlag;                  /* 2 bits indicates memory p-states */
    UCHAR  ucSCLKIndex;             /* index into ATOM_Vega10_SCLK_Dependency_Table */
    UCHAR  ucMCLKIndex;             /* index into ATOM_Vega10_MCLK_Dependency_Table */
} ATOM_Vega10_VCE_State_Record;

typedef struct _ATOM_Vega10_VCE_State_Table {
    UCHAR ucRevId;
    UCHAR ucNumEntries;
    ATOM_Vega10_VCE_State_Record entries[];
} ATOM_Vega10_VCE_State_Table;

typedef struct _ATOM_Vega10_PowerTune_Table {
        UCHAR  ucRevId;
        USHORT usSocketPowerLimit;
        USHORT usBatteryPowerLimit;
        USHORT usSmallPowerLimit;
        USHORT usTdcLimit;
        USHORT usEdcLimit;
        USHORT usSoftwareShutdownTemp;
        USHORT usTemperatureLimitHotSpot;
        USHORT usTemperatureLimitLiquid1;
        USHORT usTemperatureLimitLiquid2;
        USHORT usTemperatureLimitHBM;
        USHORT usTemperatureLimitVrSoc;
        USHORT usTemperatureLimitVrMem;
        USHORT usTemperatureLimitPlx;
        USHORT usLoadLineResistance;
        UCHAR  ucLiquid1_I2C_address;
        UCHAR  ucLiquid2_I2C_address;
        UCHAR  ucVr_I2C_address;
        UCHAR  ucPlx_I2C_address;
        UCHAR  ucLiquid_I2C_LineSCL;
        UCHAR  ucLiquid_I2C_LineSDA;
        UCHAR  ucVr_I2C_LineSCL;
        UCHAR  ucVr_I2C_LineSDA;
        UCHAR  ucPlx_I2C_LineSCL;
        UCHAR  ucPlx_I2C_LineSDA;
        USHORT usTemperatureLimitTedge;
} ATOM_Vega10_PowerTune_Table;

typedef struct _ATOM_Vega10_PowerTune_Table_V2 {
        UCHAR  ucRevId;
        USHORT usSocketPowerLimit;
        USHORT usBatteryPowerLimit;
        USHORT usSmallPowerLimit;
        USHORT usTdcLimit;
        USHORT usEdcLimit;
        USHORT usSoftwareShutdownTemp;
        USHORT usTemperatureLimitHotSpot;
        USHORT usTemperatureLimitLiquid1;
        USHORT usTemperatureLimitLiquid2;
        USHORT usTemperatureLimitHBM;
        USHORT usTemperatureLimitVrSoc;
        USHORT usTemperatureLimitVrMem;
        USHORT usTemperatureLimitPlx;
        USHORT usLoadLineResistance;
        UCHAR ucLiquid1_I2C_address;
        UCHAR ucLiquid2_I2C_address;
        UCHAR ucLiquid_I2C_Line;
        UCHAR ucVr_I2C_address;
        UCHAR ucVr_I2C_Line;
        UCHAR ucPlx_I2C_address;
        UCHAR ucPlx_I2C_Line;
        USHORT usTemperatureLimitTedge;
} ATOM_Vega10_PowerTune_Table_V2;

typedef struct _ATOM_Vega10_PowerTune_Table_V3 {
        UCHAR  ucRevId;
        USHORT usSocketPowerLimit;
        USHORT usBatteryPowerLimit;
        USHORT usSmallPowerLimit;
        USHORT usTdcLimit;
        USHORT usEdcLimit;
        USHORT usSoftwareShutdownTemp;
        USHORT usTemperatureLimitHotSpot;
        USHORT usTemperatureLimitLiquid1;
        USHORT usTemperatureLimitLiquid2;
        USHORT usTemperatureLimitHBM;
        USHORT usTemperatureLimitVrSoc;
        USHORT usTemperatureLimitVrMem;
        USHORT usTemperatureLimitPlx;
        USHORT usLoadLineResistance;
        UCHAR  ucLiquid1_I2C_address;
        UCHAR  ucLiquid2_I2C_address;
        UCHAR  ucLiquid_I2C_Line;
        UCHAR  ucVr_I2C_address;
        UCHAR  ucVr_I2C_Line;
        UCHAR  ucPlx_I2C_address;
        UCHAR  ucPlx_I2C_Line;
        USHORT usTemperatureLimitTedge;
        USHORT usBoostStartTemperature;
        USHORT usBoostStopTemperature;
        ULONG  ulBoostClock;
        ULONG  Reserved[2];
} ATOM_Vega10_PowerTune_Table_V3;

typedef struct _ATOM_Vega10_Hard_Limit_Record {
    ULONG  ulSOCCLKLimit;
    ULONG  ulGFXCLKLimit;
    ULONG  ulMCLKLimit;
    USHORT usVddcLimit;
    USHORT usVddciLimit;
    USHORT usVddMemLimit;
} ATOM_Vega10_Hard_Limit_Record;

typedef struct _ATOM_Vega10_Hard_Limit_Table {
    UCHAR ucRevId;
    UCHAR ucNumEntries;
    ATOM_Vega10_Hard_Limit_Record entries[];
} ATOM_Vega10_Hard_Limit_Table;

typedef struct _Vega10_PPTable_Generic_SubTable_Header {
    UCHAR  ucRevId;
} Vega10_PPTable_Generic_SubTable_Header;

#pragma pack(pop)

#endif