Commit d579fd82 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher

drm/amd/powerplay: added I2C controller configuration

PPTABLE structure is stretched to add I2C controller
configuration. Hold on the PPTABLE_V20_SMU_VERSION bump
until the VBIOS is ready.
Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Reviewed-by: default avatarFeifei Xu <Feifei.Xu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent dd46e5f0
...@@ -1532,6 +1532,94 @@ struct atom_smc_dpm_info_v4_3 ...@@ -1532,6 +1532,94 @@ struct atom_smc_dpm_info_v4_3
uint32_t boardreserved[10]; uint32_t boardreserved[10];
}; };
struct smudpm_i2ccontrollerconfig_t {
uint32_t enabled;
uint32_t slaveaddress;
uint32_t controllerport;
uint32_t controllername;
uint32_t thermalthrottler;
uint32_t i2cprotocol;
uint32_t i2cspeed;
};
struct atom_smc_dpm_info_v4_4
{
struct atom_common_table_header table_header;
uint32_t i2c_padding[3];
uint16_t maxvoltagestepgfx;
uint16_t maxvoltagestepsoc;
uint8_t vddgfxvrmapping;
uint8_t vddsocvrmapping;
uint8_t vddmem0vrmapping;
uint8_t vddmem1vrmapping;
uint8_t gfxulvphasesheddingmask;
uint8_t soculvphasesheddingmask;
uint8_t externalsensorpresent;
uint8_t padding8_v;
uint16_t gfxmaxcurrent;
uint8_t gfxoffset;
uint8_t padding_telemetrygfx;
uint16_t socmaxcurrent;
uint8_t socoffset;
uint8_t padding_telemetrysoc;
uint16_t mem0maxcurrent;
uint8_t mem0offset;
uint8_t padding_telemetrymem0;
uint16_t mem1maxcurrent;
uint8_t mem1offset;
uint8_t padding_telemetrymem1;
uint8_t acdcgpio;
uint8_t acdcpolarity;
uint8_t vr0hotgpio;
uint8_t vr0hotpolarity;
uint8_t vr1hotgpio;
uint8_t vr1hotpolarity;
uint8_t padding1;
uint8_t padding2;
uint8_t ledpin0;
uint8_t ledpin1;
uint8_t ledpin2;
uint8_t padding8_4;
uint8_t pllgfxclkspreadenabled;
uint8_t pllgfxclkspreadpercent;
uint16_t pllgfxclkspreadfreq;
uint8_t uclkspreadenabled;
uint8_t uclkspreadpercent;
uint16_t uclkspreadfreq;
uint8_t fclkspreadenabled;
uint8_t fclkspreadpercent;
uint16_t fclkspreadfreq;
uint8_t fllgfxclkspreadenabled;
uint8_t fllgfxclkspreadpercent;
uint16_t fllgfxclkspreadfreq;
struct smudpm_i2ccontrollerconfig_t i2ccontrollers[7];
uint32_t boardreserved[10];
};
/* /*
*************************************************************************** ***************************************************************************
Data Table asic_profiling_info structure Data Table asic_profiling_info structure
......
...@@ -417,8 +417,8 @@ static void dump_pptable(PPTable_t *pptable) ...@@ -417,8 +417,8 @@ static void dump_pptable(PPTable_t *pptable)
pr_info("FanGainEdge = %d\n", pptable->FanGainEdge); pr_info("FanGainEdge = %d\n", pptable->FanGainEdge);
pr_info("FanGainHotspot = %d\n", pptable->FanGainHotspot); pr_info("FanGainHotspot = %d\n", pptable->FanGainHotspot);
pr_info("FanGainLiquid = %d\n", pptable->FanGainLiquid); pr_info("FanGainLiquid = %d\n", pptable->FanGainLiquid);
pr_info("FanGainVrVddc = %d\n", pptable->FanGainVrVddc); pr_info("FanGainVrGfx = %d\n", pptable->FanGainVrGfx);
pr_info("FanGainVrMvdd = %d\n", pptable->FanGainVrMvdd); pr_info("FanGainVrSoc = %d\n", pptable->FanGainVrSoc);
pr_info("FanGainPlx = %d\n", pptable->FanGainPlx); pr_info("FanGainPlx = %d\n", pptable->FanGainPlx);
pr_info("FanGainHbm = %d\n", pptable->FanGainHbm); pr_info("FanGainHbm = %d\n", pptable->FanGainHbm);
pr_info("FanPwmMin = %d\n", pptable->FanPwmMin); pr_info("FanPwmMin = %d\n", pptable->FanPwmMin);
...@@ -533,23 +533,17 @@ static void dump_pptable(PPTable_t *pptable) ...@@ -533,23 +533,17 @@ static void dump_pptable(PPTable_t *pptable)
pr_info("MinVoltageUlvGfx = %d\n", pptable->MinVoltageUlvGfx); pr_info("MinVoltageUlvGfx = %d\n", pptable->MinVoltageUlvGfx);
pr_info("MinVoltageUlvSoc = %d\n", pptable->MinVoltageUlvSoc); pr_info("MinVoltageUlvSoc = %d\n", pptable->MinVoltageUlvSoc);
for (i = 0; i < 14; i++) pr_info("MGpuFanBoostLimitRpm = %d\n", pptable->MGpuFanBoostLimitRpm);
pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]); pr_info("padding16_Fan = %d\n", pptable->padding16_Fan);
pr_info("Liquid1_I2C_address = 0x%x\n", pptable->Liquid1_I2C_address); pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0);
pr_info("Liquid2_I2C_address = 0x%x\n", pptable->Liquid2_I2C_address); pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0);
pr_info("Vr_I2C_address = 0x%x\n", pptable->Vr_I2C_address);
pr_info("Plx_I2C_address = 0x%x\n", pptable->Plx_I2C_address);
pr_info("Liquid_I2C_LineSCL = 0x%x\n", pptable->Liquid_I2C_LineSCL); for (i = 0; i < 12; i++)
pr_info("Liquid_I2C_LineSDA = 0x%x\n", pptable->Liquid_I2C_LineSDA); pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]);
pr_info("Vr_I2C_LineSCL = 0x%x\n", pptable->Vr_I2C_LineSCL);
pr_info("Vr_I2C_LineSDA = 0x%x\n", pptable->Vr_I2C_LineSDA);
pr_info("Plx_I2C_LineSCL = 0x%x\n", pptable->Plx_I2C_LineSCL); for (i = 0; i < 3; i++)
pr_info("Plx_I2C_LineSDA = 0x%x\n", pptable->Plx_I2C_LineSDA); pr_info("Padding32[%d] = 0x%x\n", i, pptable->Padding32[i]);
pr_info("VrSensorPresent = 0x%x\n", pptable->VrSensorPresent);
pr_info("LiquidSensorPresent = 0x%x\n", pptable->LiquidSensorPresent);
pr_info("MaxVoltageStepGfx = 0x%x\n", pptable->MaxVoltageStepGfx); pr_info("MaxVoltageStepGfx = 0x%x\n", pptable->MaxVoltageStepGfx);
pr_info("MaxVoltageStepSoc = 0x%x\n", pptable->MaxVoltageStepSoc); pr_info("MaxVoltageStepSoc = 0x%x\n", pptable->MaxVoltageStepSoc);
...@@ -611,6 +605,24 @@ static void dump_pptable(PPTable_t *pptable) ...@@ -611,6 +605,24 @@ static void dump_pptable(PPTable_t *pptable)
pr_info("FllGfxclkSpreadPercent = %d\n", pptable->FllGfxclkSpreadPercent); pr_info("FllGfxclkSpreadPercent = %d\n", pptable->FllGfxclkSpreadPercent);
pr_info("FllGfxclkSpreadFreq = %d\n", pptable->FllGfxclkSpreadFreq); pr_info("FllGfxclkSpreadFreq = %d\n", pptable->FllGfxclkSpreadFreq);
for (i = 0; i < I2C_CONTROLLER_NAME_COUNT; i++) {
pr_info("I2cControllers[%d]:\n", i);
pr_info(" .Enabled = %d\n",
pptable->I2cControllers[i].Enabled);
pr_info(" .SlaveAddress = 0x%x\n",
pptable->I2cControllers[i].SlaveAddress);
pr_info(" .ControllerPort = %d\n",
pptable->I2cControllers[i].ControllerPort);
pr_info(" .ControllerName = %d\n",
pptable->I2cControllers[i].ControllerName);
pr_info(" .ThermalThrottler = %d\n",
pptable->I2cControllers[i].ThermalThrottler);
pr_info(" .I2cProtocol = %d\n",
pptable->I2cControllers[i].I2cProtocol);
pr_info(" .I2cSpeed = %d\n",
pptable->I2cControllers[i].I2cSpeed);
}
for (i = 0; i < 10; i++) for (i = 0; i < 10; i++)
pr_info("BoardReserved[%d] = 0x%x\n", i, pptable->BoardReserved[i]); pr_info("BoardReserved[%d] = 0x%x\n", i, pptable->BoardReserved[i]);
...@@ -693,29 +705,19 @@ static int copy_overdrive_feature_capabilities_array( ...@@ -693,29 +705,19 @@ static int copy_overdrive_feature_capabilities_array(
static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable) static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable)
{ {
struct atom_smc_dpm_info_v4_3 *smc_dpm_table; struct atom_smc_dpm_info_v4_4 *smc_dpm_table;
int index = GetIndexIntoMasterDataTable(smc_dpm_info); int index = GetIndexIntoMasterDataTable(smc_dpm_info);
int i;
PP_ASSERT_WITH_CODE( PP_ASSERT_WITH_CODE(
smc_dpm_table = smu_atom_get_data_table(hwmgr->adev, index, NULL, NULL, NULL), smc_dpm_table = smu_atom_get_data_table(hwmgr->adev, index, NULL, NULL, NULL),
"[appendVbiosPPTable] Failed to retrieve Smc Dpm Table from VBIOS!", "[appendVbiosPPTable] Failed to retrieve Smc Dpm Table from VBIOS!",
return -1); return -1);
ppsmc_pptable->Liquid1_I2C_address = smc_dpm_table->liquid1_i2c_address; memset(ppsmc_pptable->Padding32,
ppsmc_pptable->Liquid2_I2C_address = smc_dpm_table->liquid2_i2c_address; 0,
ppsmc_pptable->Vr_I2C_address = smc_dpm_table->vr_i2c_address; sizeof(struct atom_smc_dpm_info_v4_4) -
ppsmc_pptable->Plx_I2C_address = smc_dpm_table->plx_i2c_address; sizeof(struct atom_common_table_header));
ppsmc_pptable->Liquid_I2C_LineSCL = smc_dpm_table->liquid_i2c_linescl;
ppsmc_pptable->Liquid_I2C_LineSDA = smc_dpm_table->liquid_i2c_linesda;
ppsmc_pptable->Vr_I2C_LineSCL = smc_dpm_table->vr_i2c_linescl;
ppsmc_pptable->Vr_I2C_LineSDA = smc_dpm_table->vr_i2c_linesda;
ppsmc_pptable->Plx_I2C_LineSCL = smc_dpm_table->plx_i2c_linescl;
ppsmc_pptable->Plx_I2C_LineSDA = smc_dpm_table->plx_i2c_linesda;
ppsmc_pptable->VrSensorPresent = smc_dpm_table->vrsensorpresent;
ppsmc_pptable->LiquidSensorPresent = smc_dpm_table->liquidsensorpresent;
ppsmc_pptable->MaxVoltageStepGfx = smc_dpm_table->maxvoltagestepgfx; ppsmc_pptable->MaxVoltageStepGfx = smc_dpm_table->maxvoltagestepgfx;
ppsmc_pptable->MaxVoltageStepSoc = smc_dpm_table->maxvoltagestepsoc; ppsmc_pptable->MaxVoltageStepSoc = smc_dpm_table->maxvoltagestepsoc;
...@@ -774,6 +776,24 @@ static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable ...@@ -774,6 +776,24 @@ static int append_vbios_pptable(struct pp_hwmgr *hwmgr, PPTable_t *ppsmc_pptable
ppsmc_pptable->FllGfxclkSpreadPercent = smc_dpm_table->fllgfxclkspreadpercent; ppsmc_pptable->FllGfxclkSpreadPercent = smc_dpm_table->fllgfxclkspreadpercent;
ppsmc_pptable->FllGfxclkSpreadFreq = smc_dpm_table->fllgfxclkspreadfreq; ppsmc_pptable->FllGfxclkSpreadFreq = smc_dpm_table->fllgfxclkspreadfreq;
if ((smc_dpm_table->table_header.format_revision == 4) &&
(smc_dpm_table->table_header.content_revision == 4)) {
for (i = 0; i < I2C_CONTROLLER_NAME_COUNT; i++) {
ppsmc_pptable->I2cControllers[i].Enabled =
smc_dpm_table->i2ccontrollers[i].enabled;
ppsmc_pptable->I2cControllers[i].SlaveAddress =
smc_dpm_table->i2ccontrollers[i].slaveaddress;
ppsmc_pptable->I2cControllers[i].ControllerPort =
smc_dpm_table->i2ccontrollers[i].controllerport;
ppsmc_pptable->I2cControllers[i].ThermalThrottler =
smc_dpm_table->i2ccontrollers[i].thermalthrottler;
ppsmc_pptable->I2cControllers[i].I2cProtocol =
smc_dpm_table->i2ccontrollers[i].i2cprotocol;
ppsmc_pptable->I2cControllers[i].I2cSpeed =
smc_dpm_table->i2ccontrollers[i].i2cspeed;
}
}
return 0; return 0;
} }
...@@ -860,7 +880,15 @@ static int init_powerplay_table_information( ...@@ -860,7 +880,15 @@ static int init_powerplay_table_information(
if (pptable_information->smc_pptable == NULL) if (pptable_information->smc_pptable == NULL)
return -ENOMEM; return -ENOMEM;
memcpy(pptable_information->smc_pptable, &(powerplay_table->smcPPTable), sizeof(PPTable_t)); if (powerplay_table->smcPPTable.Version <= 2)
memcpy(pptable_information->smc_pptable,
&(powerplay_table->smcPPTable),
sizeof(PPTable_t) -
sizeof(I2cControllerConfig_t) * I2C_CONTROLLER_NAME_COUNT);
else
memcpy(pptable_information->smc_pptable,
&(powerplay_table->smcPPTable),
sizeof(PPTable_t));
result = append_vbios_pptable(hwmgr, (pptable_information->smc_pptable)); result = append_vbios_pptable(hwmgr, (pptable_information->smc_pptable));
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
// *** IMPORTANT *** // *** IMPORTANT ***
// SMU TEAM: Always increment the interface version if // SMU TEAM: Always increment the interface version if
// any structure is changed in this file // any structure is changed in this file
#define SMU11_DRIVER_IF_VERSION 0x11 #define SMU11_DRIVER_IF_VERSION 0x12
#define PPTABLE_V20_SMU_VERSION 2 #define PPTABLE_V20_SMU_VERSION 2
...@@ -186,6 +186,9 @@ ...@@ -186,6 +186,9 @@
#define DPM_OVERRIDE_ENABLE_GFXOFF_UCLK_SWITCH 0x00010000 #define DPM_OVERRIDE_ENABLE_GFXOFF_UCLK_SWITCH 0x00010000
#define DPM_OVERRIDE_ENABLE_GFXOFF_FCLK_SWITCH 0x00020000 #define DPM_OVERRIDE_ENABLE_GFXOFF_FCLK_SWITCH 0x00020000
#define I2C_CONTROLLER_ENABLED 1
#define I2C_CONTROLLER_DISABLED 0
#define VR_MAPPING_VR_SELECT_MASK 0x01 #define VR_MAPPING_VR_SELECT_MASK 0x01
#define VR_MAPPING_VR_SELECT_SHIFT 0x00 #define VR_MAPPING_VR_SELECT_SHIFT 0x00
...@@ -208,15 +211,17 @@ ...@@ -208,15 +211,17 @@
#define THROTTLER_STATUS_TEMP_HOTSPOT_BIT 2 #define THROTTLER_STATUS_TEMP_HOTSPOT_BIT 2
#define THROTTLER_STATUS_TEMP_HBM_BIT 3 #define THROTTLER_STATUS_TEMP_HBM_BIT 3
#define THROTTLER_STATUS_TEMP_VR_GFX_BIT 4 #define THROTTLER_STATUS_TEMP_VR_GFX_BIT 4
#define THROTTLER_STATUS_TEMP_VR_MEM_BIT 5 #define THROTTLER_STATUS_TEMP_VR_SOC_BIT 5
#define THROTTLER_STATUS_TEMP_LIQUID_BIT 6 #define THROTTLER_STATUS_TEMP_VR_MEM0_BIT 6
#define THROTTLER_STATUS_TEMP_PLX_BIT 7 #define THROTTLER_STATUS_TEMP_VR_MEM1_BIT 7
#define THROTTLER_STATUS_TEMP_SKIN_BIT 8 #define THROTTLER_STATUS_TEMP_LIQUID_BIT 8
#define THROTTLER_STATUS_TDC_GFX_BIT 9 #define THROTTLER_STATUS_TEMP_PLX_BIT 9
#define THROTTLER_STATUS_TDC_SOC_BIT 10 #define THROTTLER_STATUS_TEMP_SKIN_BIT 10
#define THROTTLER_STATUS_PPT_BIT 11 #define THROTTLER_STATUS_TDC_GFX_BIT 11
#define THROTTLER_STATUS_FIT_BIT 12 #define THROTTLER_STATUS_TDC_SOC_BIT 12
#define THROTTLER_STATUS_PPM_BIT 13 #define THROTTLER_STATUS_PPT_BIT 13
#define THROTTLER_STATUS_FIT_BIT 14
#define THROTTLER_STATUS_PPM_BIT 15
#define TABLE_TRANSFER_OK 0x0 #define TABLE_TRANSFER_OK 0x0
...@@ -236,6 +241,58 @@ ...@@ -236,6 +241,58 @@
#define XGMI_STATE_D0 1 #define XGMI_STATE_D0 1
#define XGMI_STATE_D3 0 #define XGMI_STATE_D3 0
typedef enum {
I2C_CONTROLLER_PORT_0 = 0,
I2C_CONTROLLER_PORT_1 = 1,
} I2cControllerPort_e;
typedef enum {
I2C_CONTROLLER_NAME_VR_GFX = 0,
I2C_CONTROLLER_NAME_VR_SOC,
I2C_CONTROLLER_NAME_VR_VDDCI,
I2C_CONTROLLER_NAME_VR_HBM,
I2C_CONTROLLER_NAME_LIQUID_0,
I2C_CONTROLLER_NAME_LIQUID_1,
I2C_CONTROLLER_NAME_PLX,
I2C_CONTROLLER_NAME_COUNT,
} I2cControllerName_e;
typedef enum {
I2C_CONTROLLER_THROTTLER_TYPE_NONE = 0,
I2C_CONTROLLER_THROTTLER_VR_GFX,
I2C_CONTROLLER_THROTTLER_VR_SOC,
I2C_CONTROLLER_THROTTLER_VR_VDDCI,
I2C_CONTROLLER_THROTTLER_VR_HBM,
I2C_CONTROLLER_THROTTLER_LIQUID_0,
I2C_CONTROLLER_THROTTLER_LIQUID_1,
I2C_CONTROLLER_THROTTLER_PLX,
} I2cControllerThrottler_e;
typedef enum {
I2C_CONTROLLER_PROTOCOL_VR_XPDE132G5,
I2C_CONTROLLER_PROTOCOL_VR_IR35217,
I2C_CONTROLLER_PROTOCOL_TMP_TMP102A,
I2C_CONTROLLER_PROTOCOL_SPARE_0,
I2C_CONTROLLER_PROTOCOL_SPARE_1,
I2C_CONTROLLER_PROTOCOL_SPARE_2,
} I2cControllerProtocol_e;
typedef enum {
I2C_CONTROLLER_SPEED_SLOW = 0,
I2C_CONTROLLER_SPEED_FAST = 1,
} I2cControllerSpeed_e;
typedef struct {
uint32_t Enabled;
uint32_t SlaveAddress;
uint32_t ControllerPort;
uint32_t ControllerName;
uint32_t ThermalThrottler;
uint32_t I2cProtocol;
uint32_t I2cSpeed;
} I2cControllerConfig_t;
typedef struct { typedef struct {
uint32_t a; uint32_t a;
uint32_t b; uint32_t b;
...@@ -406,8 +463,8 @@ typedef struct { ...@@ -406,8 +463,8 @@ typedef struct {
uint16_t FanGainEdge; uint16_t FanGainEdge;
uint16_t FanGainHotspot; uint16_t FanGainHotspot;
uint16_t FanGainLiquid; uint16_t FanGainLiquid;
uint16_t FanGainVrVddc; uint16_t FanGainVrGfx;
uint16_t FanGainVrMvdd; uint16_t FanGainVrSoc;
uint16_t FanGainPlx; uint16_t FanGainPlx;
uint16_t FanGainHbm; uint16_t FanGainHbm;
uint16_t FanPwmMin; uint16_t FanPwmMin;
...@@ -467,24 +524,11 @@ typedef struct { ...@@ -467,24 +524,11 @@ typedef struct {
uint16_t MGpuFanBoostLimitRpm; uint16_t MGpuFanBoostLimitRpm;
uint16_t padding16_Fan; uint16_t padding16_Fan;
uint32_t Reserved[13]; uint16_t FanGainVrMem0;
uint16_t FanGainVrMem1;
uint32_t Reserved[12];
uint32_t Padding32[3];
uint8_t Liquid1_I2C_address;
uint8_t Liquid2_I2C_address;
uint8_t Vr_I2C_address;
uint8_t Plx_I2C_address;
uint8_t Liquid_I2C_LineSCL;
uint8_t Liquid_I2C_LineSDA;
uint8_t Vr_I2C_LineSCL;
uint8_t Vr_I2C_LineSDA;
uint8_t Plx_I2C_LineSCL;
uint8_t Plx_I2C_LineSDA;
uint8_t VrSensorPresent;
uint8_t LiquidSensorPresent;
uint16_t MaxVoltageStepGfx; uint16_t MaxVoltageStepGfx;
uint16_t MaxVoltageStepSoc; uint16_t MaxVoltageStepSoc;
...@@ -551,6 +595,8 @@ typedef struct { ...@@ -551,6 +595,8 @@ typedef struct {
uint8_t FllGfxclkSpreadPercent; uint8_t FllGfxclkSpreadPercent;
uint16_t FllGfxclkSpreadFreq; uint16_t FllGfxclkSpreadFreq;
I2cControllerConfig_t I2cControllers[I2C_CONTROLLER_NAME_COUNT];
uint32_t BoardReserved[10]; uint32_t BoardReserved[10];
...@@ -607,7 +653,9 @@ typedef struct { ...@@ -607,7 +653,9 @@ typedef struct {
uint16_t TemperatureHotspot ; uint16_t TemperatureHotspot ;
uint16_t TemperatureHBM ; uint16_t TemperatureHBM ;
uint16_t TemperatureVrGfx ; uint16_t TemperatureVrGfx ;
uint16_t TemperatureVrMem ; uint16_t TemperatureVrSoc ;
uint16_t TemperatureVrMem0 ;
uint16_t TemperatureVrMem1 ;
uint16_t TemperatureLiquid ; uint16_t TemperatureLiquid ;
uint16_t TemperaturePlx ; uint16_t TemperaturePlx ;
uint32_t ThrottlerStatus ; uint32_t ThrottlerStatus ;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment