diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3106-drm-amd-powerplay-add-callback-function-of-get_therm.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3106-drm-amd-powerplay-add-callback-function-of-get_therm.patch | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3106-drm-amd-powerplay-add-callback-function-of-get_therm.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3106-drm-amd-powerplay-add-callback-function-of-get_therm.patch new file mode 100644 index 00000000..3fa6acc2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3106-drm-amd-powerplay-add-callback-function-of-get_therm.patch @@ -0,0 +1,189 @@ +From 3dac7803ad99655bee5c4b321cbc97cc9e8727ee Mon Sep 17 00:00:00 2001 +From: Kevin Wang <kevin1.wang@amd.com> +Date: Mon, 3 Jun 2019 15:58:31 +0800 +Subject: [PATCH 3106/4256] drm/amd/powerplay: add callback function of + get_thermal_temperature_range + +1. the thermal temperature is asic related data, move the code logic to +xxx_ppt.c. +2. replace data structure PP_TemperatureRange with +smu_temperature_range. +3. change temperature uint from temp*1000 to temp (temperature uint). + +Signed-off-by: Kevin Wang <kevin1.wang@amd.com> +Signed-off-by: Kenneth Feng <kenneth.feng@amd.com> +Acked-by: Huang Rui <ray.huang@amd.com> +--- + .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 1 - + drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 17 ++++++++++ + drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 18 ++++++---- + drivers/gpu/drm/amd/powerplay/vega20_ppt.c | 34 ++++++------------- + 4 files changed, 40 insertions(+), 30 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +index b702c9ee975f..33d2d75ba903 100644 +--- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h ++++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h +@@ -439,7 +439,6 @@ struct smu_table_context + struct smu_table *tables; + uint32_t table_count; + struct smu_table memory_pool; +- uint16_t software_shutdown_temp; + uint8_t thermal_controller_type; + uint16_t TDPODLimit; + +diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +index c8ce9bbae276..c873228bf05f 100644 +--- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c +@@ -1639,6 +1639,22 @@ static int navi10_set_performance_level(struct smu_context *smu, enum amd_dpm_fo + return ret; + } + ++static int navi10_get_thermal_temperature_range(struct smu_context *smu, ++ struct smu_temperature_range *range) ++{ ++ struct smu_table_context *table_context = &smu->smu_table; ++ struct smu_11_0_powerplay_table *powerplay_table = table_context->power_play_table; ++ ++ if (!range || !powerplay_table) ++ return -EINVAL; ++ ++ /* The unit is temperature */ ++ range->min = 0; ++ range->max = powerplay_table->software_shutdown_temp; ++ ++ return 0; ++} ++ + static const struct pptable_funcs navi10_ppt_funcs = { + .tables_init = navi10_tables_init, + .alloc_dpm_context = navi10_allocate_dpm_context, +@@ -1676,6 +1692,7 @@ static const struct pptable_funcs navi10_ppt_funcs = { + .get_ppfeature_status = navi10_get_ppfeature_status, + .set_ppfeature_status = navi10_set_ppfeature_status, + .set_performance_level = navi10_set_performance_level, ++ .get_thermal_temperature_range = navi10_get_thermal_temperature_range, + }; + + void navi10_set_ppt_funcs(struct smu_context *smu) +diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +index e3a178403546..745b35a1600d 100644 +--- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c ++++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c +@@ -1147,10 +1147,8 @@ static int smu_v11_0_set_thermal_range(struct smu_context *smu, + struct smu_temperature_range *range) + { + struct amdgpu_device *adev = smu->adev; +- int low = SMU_THERMAL_MINIMUM_ALERT_TEMP * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +- int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ int low = SMU_THERMAL_MINIMUM_ALERT_TEMP; ++ int high = SMU_THERMAL_MAXIMUM_ALERT_TEMP; + uint32_t val; + + if (!range) +@@ -1161,6 +1159,9 @@ static int smu_v11_0_set_thermal_range(struct smu_context *smu, + if (high > range->max) + high = range->max; + ++ low = max(SMU_THERMAL_MINIMUM_ALERT_TEMP, range->min); ++ high = min(SMU_THERMAL_MAXIMUM_ALERT_TEMP, range->max); ++ + if (low > high) + return -EINVAL; + +@@ -1169,8 +1170,8 @@ static int smu_v11_0_set_thermal_range(struct smu_context *smu, + val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_IH_HW_ENA, 1); + val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTH_MASK, 0); + val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, THERM_INTL_MASK, 0); +- val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, (high / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES)); +- val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, (low / SMU_TEMPERATURE_UNITS_PER_CENTIGRADES)); ++ val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTH, (high & 0xff)); ++ val = REG_SET_FIELD(val, THM_THERMAL_INT_CTRL, DIG_THERM_INTL, (low & 0xff)); + val = val & (~THM_THERMAL_INT_CTRL__THERM_TRIGGER_MASK_MASK); + + WREG32_SOC15(THM, 0, mmTHM_THERMAL_INT_CTRL, val); +@@ -1209,7 +1210,10 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) + + if (!smu->pm_enabled) + return ret; ++ + ret = smu_get_thermal_temperature_range(smu, &range); ++ if (ret) ++ return ret; + + if (smu->smu_table.thermal_controller_type) { + ret = smu_v11_0_set_thermal_range(smu, &range); +@@ -1234,6 +1238,8 @@ static int smu_v11_0_start_thermal_control(struct smu_context *smu) + adev->pm.dpm.thermal.min_mem_temp = range.mem_min; + adev->pm.dpm.thermal.max_mem_crit_temp = range.mem_crit_max; + adev->pm.dpm.thermal.max_mem_emergency_temp = range.mem_emergency_max; ++ adev->pm.dpm.thermal.min_temp = range.min * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ adev->pm.dpm.thermal.max_temp = range.max * SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; + + return ret; + } +diff --git a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +index 9ead36192787..c06a9472c3b2 100644 +--- a/drivers/gpu/drm/amd/powerplay/vega20_ppt.c ++++ b/drivers/gpu/drm/amd/powerplay/vega20_ppt.c +@@ -463,7 +463,6 @@ static int vega20_store_powerplay_table(struct smu_context *smu) + memcpy(table_context->driver_pptable, &powerplay_table->smcPPTable, + sizeof(PPTable_t)); + +- table_context->software_shutdown_temp = powerplay_table->usSoftwareShutdownTemp; + table_context->thermal_controller_type = powerplay_table->ucThermalControllerType; + table_context->TDPODLimit = le32_to_cpu(powerplay_table->OverDrive8Table.ODSettingsMax[ATOM_VEGA20_ODSETTING_POWERPERCENTAGE]); + +@@ -3252,35 +3251,24 @@ static int vega20_set_watermarks_table(struct smu_context *smu, + return 0; + } + +-static const struct smu_temperature_range vega20_thermal_policy[] = +-{ +- {-273150, 99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000}, +- { 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000}, +-}; +- + static int vega20_get_thermal_temperature_range(struct smu_context *smu, + struct smu_temperature_range*range) + { +- ++ struct smu_table_context *table_context = &smu->smu_table; ++ ATOM_Vega20_POWERPLAYTABLE *powerplay_table = table_context->power_play_table; + PPTable_t *pptable = smu->smu_table.driver_pptable; + +- if (!range) ++ if (!range || !powerplay_table) + return -EINVAL; + +- memcpy(range, &vega20_thermal_policy[0], sizeof(struct smu_temperature_range)); +- +- range->max = pptable->TedgeLimit * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +- range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE) * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +- range->hotspot_crit_max = pptable->ThotspotLimit * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +- range->hotspot_emergency_max = (pptable->ThotspotLimit + CTF_OFFSET_HOTSPOT) * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +- range->mem_crit_max = pptable->ThbmLimit * +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; +- range->mem_emergency_max = (pptable->ThbmLimit + CTF_OFFSET_HBM)* +- SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ /* The unit is temperature */ ++ range->min = 0; ++ range->max = powerplay_table->usSoftwareShutdownTemp; ++ range->edge_emergency_max = (pptable->TedgeLimit + CTF_OFFSET_EDGE); ++ range->hotspot_crit_max = pptable->ThotspotLimit; ++ range->hotspot_emergency_max = (pptable->ThotspotLimit + CTF_OFFSET_HOTSPOT); ++ range->mem_crit_max = pptable->ThbmLimit; ++ range->mem_emergency_max = (pptable->ThbmLimit + CTF_OFFSET_HBM); + + + return 0; +-- +2.17.1 + |