Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+88 −0
Original line number Diff line number Diff line
@@ -1532,6 +1532,94 @@ struct atom_smc_dpm_info_v4_3
  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
+61 −33
Original line number Diff line number Diff line
@@ -417,8 +417,8 @@ static void dump_pptable(PPTable_t *pptable)
	pr_info("FanGainEdge = %d\n", pptable->FanGainEdge);
	pr_info("FanGainHotspot = %d\n", pptable->FanGainHotspot);
	pr_info("FanGainLiquid = %d\n", pptable->FanGainLiquid);
	pr_info("FanGainVrVddc = %d\n", pptable->FanGainVrVddc);
	pr_info("FanGainVrMvdd = %d\n", pptable->FanGainVrMvdd);
	pr_info("FanGainVrGfx = %d\n", pptable->FanGainVrGfx);
	pr_info("FanGainVrSoc = %d\n", pptable->FanGainVrSoc);
	pr_info("FanGainPlx = %d\n", pptable->FanGainPlx);
	pr_info("FanGainHbm = %d\n", pptable->FanGainHbm);
	pr_info("FanPwmMin = %d\n", pptable->FanPwmMin);
@@ -533,23 +533,17 @@ static void dump_pptable(PPTable_t *pptable)
	pr_info("MinVoltageUlvGfx = %d\n", pptable->MinVoltageUlvGfx);
	pr_info("MinVoltageUlvSoc = %d\n", pptable->MinVoltageUlvSoc);

	for (i = 0; i < 14; i++)
		pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]);
	pr_info("MGpuFanBoostLimitRpm = %d\n", pptable->MGpuFanBoostLimitRpm);
	pr_info("padding16_Fan = %d\n", pptable->padding16_Fan);

	pr_info("Liquid1_I2C_address = 0x%x\n", pptable->Liquid1_I2C_address);
	pr_info("Liquid2_I2C_address = 0x%x\n", pptable->Liquid2_I2C_address);
	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("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0);
	pr_info("FanGainVrMem0 = %d\n", pptable->FanGainVrMem0);

	pr_info("Liquid_I2C_LineSCL = 0x%x\n", pptable->Liquid_I2C_LineSCL);
	pr_info("Liquid_I2C_LineSDA = 0x%x\n", pptable->Liquid_I2C_LineSDA);
	pr_info("Vr_I2C_LineSCL = 0x%x\n", pptable->Vr_I2C_LineSCL);
	pr_info("Vr_I2C_LineSDA = 0x%x\n", pptable->Vr_I2C_LineSDA);
	for (i = 0; i < 12; i++)
		pr_info("Reserved[%d] = 0x%x\n", i, pptable->Reserved[i]);

	pr_info("Plx_I2C_LineSCL = 0x%x\n", pptable->Plx_I2C_LineSCL);
	pr_info("Plx_I2C_LineSDA = 0x%x\n", pptable->Plx_I2C_LineSDA);
	pr_info("VrSensorPresent = 0x%x\n", pptable->VrSensorPresent);
	pr_info("LiquidSensorPresent = 0x%x\n", pptable->LiquidSensorPresent);
	for (i = 0; i < 3; i++)
		pr_info("Padding32[%d] = 0x%x\n", i, pptable->Padding32[i]);

	pr_info("MaxVoltageStepGfx = 0x%x\n", pptable->MaxVoltageStepGfx);
	pr_info("MaxVoltageStepSoc = 0x%x\n", pptable->MaxVoltageStepSoc);
@@ -611,6 +605,24 @@ static void dump_pptable(PPTable_t *pptable)
	pr_info("FllGfxclkSpreadPercent = %d\n", pptable->FllGfxclkSpreadPercent);
	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++)
		pr_info("BoardReserved[%d] = 0x%x\n", i, pptable->BoardReserved[i]);

@@ -693,29 +705,19 @@ static int copy_overdrive_feature_capabilities_array(

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 i;

	PP_ASSERT_WITH_CODE(
		smc_dpm_table = smu_atom_get_data_table(hwmgr->adev, index, NULL, NULL, NULL),
		"[appendVbiosPPTable] Failed to retrieve Smc Dpm Table from VBIOS!",
		return -1);

	ppsmc_pptable->Liquid1_I2C_address = smc_dpm_table->liquid1_i2c_address;
	ppsmc_pptable->Liquid2_I2C_address = smc_dpm_table->liquid2_i2c_address;
	ppsmc_pptable->Vr_I2C_address = smc_dpm_table->vr_i2c_address;
	ppsmc_pptable->Plx_I2C_address = smc_dpm_table->plx_i2c_address;

	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;

	memset(ppsmc_pptable->Padding32,
			0,
			sizeof(struct atom_smc_dpm_info_v4_4) -
			sizeof(struct atom_common_table_header));
	ppsmc_pptable->MaxVoltageStepGfx = smc_dpm_table->maxvoltagestepgfx;
	ppsmc_pptable->MaxVoltageStepSoc = smc_dpm_table->maxvoltagestepsoc;

@@ -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->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;
}

@@ -860,7 +880,15 @@ static int init_powerplay_table_information(
	if (pptable_information->smc_pptable == NULL)
		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));

+78 −30
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@
// *** IMPORTANT ***
// SMU TEAM: Always increment the interface version if
// 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

@@ -186,6 +186,9 @@
#define DPM_OVERRIDE_ENABLE_GFXOFF_UCLK_SWITCH      0x00010000
#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_SHIFT 0x00

@@ -208,15 +211,17 @@
#define THROTTLER_STATUS_TEMP_HOTSPOT_BIT 2
#define THROTTLER_STATUS_TEMP_HBM_BIT     3
#define THROTTLER_STATUS_TEMP_VR_GFX_BIT  4
#define THROTTLER_STATUS_TEMP_VR_MEM_BIT  5
#define THROTTLER_STATUS_TEMP_LIQUID_BIT  6
#define THROTTLER_STATUS_TEMP_PLX_BIT     7
#define THROTTLER_STATUS_TEMP_SKIN_BIT    8
#define THROTTLER_STATUS_TDC_GFX_BIT      9
#define THROTTLER_STATUS_TDC_SOC_BIT      10
#define THROTTLER_STATUS_PPT_BIT          11
#define THROTTLER_STATUS_FIT_BIT          12
#define THROTTLER_STATUS_PPM_BIT          13
#define THROTTLER_STATUS_TEMP_VR_SOC_BIT  5
#define THROTTLER_STATUS_TEMP_VR_MEM0_BIT 6
#define THROTTLER_STATUS_TEMP_VR_MEM1_BIT 7
#define THROTTLER_STATUS_TEMP_LIQUID_BIT  8
#define THROTTLER_STATUS_TEMP_PLX_BIT     9
#define THROTTLER_STATUS_TEMP_SKIN_BIT    10
#define THROTTLER_STATUS_TDC_GFX_BIT      11
#define THROTTLER_STATUS_TDC_SOC_BIT      12
#define THROTTLER_STATUS_PPT_BIT          13
#define THROTTLER_STATUS_FIT_BIT          14
#define THROTTLER_STATUS_PPM_BIT          15


#define TABLE_TRANSFER_OK         0x0
@@ -236,6 +241,58 @@
#define XGMI_STATE_D0 1
#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 {
  uint32_t a;
  uint32_t b;
@@ -406,8 +463,8 @@ typedef struct {
  uint16_t     FanGainEdge;
  uint16_t     FanGainHotspot;
  uint16_t     FanGainLiquid;
  uint16_t     FanGainVrVddc;
  uint16_t     FanGainVrMvdd;
  uint16_t     FanGainVrGfx;
  uint16_t     FanGainVrSoc;
  uint16_t     FanGainPlx;
  uint16_t     FanGainHbm;
  uint16_t     FanPwmMin;
@@ -467,24 +524,11 @@ typedef struct {
  uint16_t     MGpuFanBoostLimitRpm;
  uint16_t     padding16_Fan;

  uint32_t     Reserved[13];

  uint16_t     FanGainVrMem0;
  uint16_t     FanGainVrMem1;
  uint32_t     Reserved[12];


  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;
  uint32_t     Padding32[3];

  uint16_t     MaxVoltageStepGfx;
  uint16_t     MaxVoltageStepSoc;
@@ -551,6 +595,8 @@ typedef struct {
  uint8_t      FllGfxclkSpreadPercent;
  uint16_t     FllGfxclkSpreadFreq;

  I2cControllerConfig_t I2cControllers[I2C_CONTROLLER_NAME_COUNT];

  uint32_t     BoardReserved[10];


@@ -607,7 +653,9 @@ typedef struct {
  uint16_t TemperatureHotspot    ;
  uint16_t TemperatureHBM        ;
  uint16_t TemperatureVrGfx      ;
  uint16_t TemperatureVrMem      ;
  uint16_t TemperatureVrSoc      ;
  uint16_t TemperatureVrMem0     ;
  uint16_t TemperatureVrMem1     ;
  uint16_t TemperatureLiquid     ;
  uint16_t TemperaturePlx        ;
  uint32_t ThrottlerStatus       ;