aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.19.8/0530-drm-amd-powerplay-added-I2C-controller-configuration.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0530-drm-amd-powerplay-added-I2C-controller-configuration.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.19.8/0530-drm-amd-powerplay-added-I2C-controller-configuration.patch440
1 files changed, 440 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0530-drm-amd-powerplay-added-I2C-controller-configuration.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0530-drm-amd-powerplay-added-I2C-controller-configuration.patch
new file mode 100644
index 00000000..eed14881
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0530-drm-amd-powerplay-added-I2C-controller-configuration.patch
@@ -0,0 +1,440 @@
+From 166e98547791fd03cf41a0f4d316db39e830388c Mon Sep 17 00:00:00 2001
+From: Evan Quan <evan.quan@amd.com>
+Date: Fri, 28 Sep 2018 16:19:08 +0800
+Subject: [PATCH 0530/2940] 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.
+
+Change-Id: I079154b36e4bddba9fa40ce3abc6517ad9e9b5f1
+Signed-off-by: Evan Quan <evan.quan@amd.com>
+Reviewed-by: Feifei Xu <Feifei.Xu@amd.com>
+---
+ drivers/gpu/drm/amd/include/atomfirmware.h | 88 ++++++++++++++
+ .../powerplay/hwmgr/vega20_processpptables.c | 94 +++++++++------
+ .../drm/amd/powerplay/inc/smu11_driver_if.h | 108 +++++++++++++-----
+ 3 files changed, 227 insertions(+), 63 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/include/atomfirmware.h b/drivers/gpu/drm/amd/include/atomfirmware.h
+index 8ae7adb7329b..d2e7c0fa96c2 100644
+--- a/drivers/gpu/drm/amd/include/atomfirmware.h
++++ b/drivers/gpu/drm/amd/include/atomfirmware.h
+@@ -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
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c
+index 32fe38452094..e71740479bb8 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_processpptables.c
+@@ -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));
+
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h b/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h
+index a002021414ff..c72cfab83df9 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/smu11_driver_if.h
+@@ -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 ;
+--
+2.17.1
+