diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1818-drm-amd-powerplay-expose-current-hotspot-and-memory-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1818-drm-amd-powerplay-expose-current-hotspot-and-memory-.patch | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1818-drm-amd-powerplay-expose-current-hotspot-and-memory-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1818-drm-amd-powerplay-expose-current-hotspot-and-memory-.patch new file mode 100644 index 00000000..3de0d0db --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1818-drm-amd-powerplay-expose-current-hotspot-and-memory-.patch @@ -0,0 +1,232 @@ +From 5e96807422f066cb4ee2b332fde5939050285485 Mon Sep 17 00:00:00 2001 +From: Evan Quan <evan.quan@amd.com> +Date: Thu, 18 Apr 2019 13:51:53 +0800 +Subject: [PATCH 1818/2940] drm/amd/powerplay: expose current hotspot and + memory temperatures V2 + +Two new hwmon interfaces(temp2_input and temp3_input) are added. +They are supported on SOC15 dGPUs only. + +- V2: correct thermal sensor output + +Change-Id: I935c512bd38e080fb8b6e3164c5e5294baff4e91 +Signed-off-by: Evan Quan <evan.quan@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 45 +++++++++++++++---- + .../gpu/drm/amd/include/kgd_pp_interface.h | 3 ++ + .../drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 12 +++++ + .../drm/amd/powerplay/hwmgr/vega12_hwmgr.c | 19 ++++++++ + .../drm/amd/powerplay/hwmgr/vega20_hwmgr.c | 20 ++++++++- + 5 files changed, 90 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +index cfbfdf6311b5..7e364c05d0cf 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +@@ -1372,6 +1372,7 @@ static ssize_t amdgpu_hwmon_show_temp(struct device *dev, + { + struct amdgpu_device *adev = dev_get_drvdata(dev); + struct drm_device *ddev = adev->ddev; ++ int channel = to_sensor_dev_attr(attr)->index; + int r, temp, size = sizeof(temp); + + /* Can't get temperature when the card is off */ +@@ -1379,11 +1380,32 @@ static ssize_t amdgpu_hwmon_show_temp(struct device *dev, + (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) + return -EINVAL; + +- /* get the temperature */ +- r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_TEMP, +- (void *)&temp, &size); +- if (r) +- return r; ++ if (channel >= PP_TEMP_MAX) ++ return -EINVAL; ++ ++ switch (channel) { ++ case PP_TEMP_JUNCTION: ++ /* get current junction temperature */ ++ r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_HOTSPOT_TEMP, ++ (void *)&temp, &size); ++ if (r) ++ return r; ++ break; ++ case PP_TEMP_EDGE: ++ /* get current edge temperature */ ++ r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_EDGE_TEMP, ++ (void *)&temp, &size); ++ if (r) ++ return r; ++ break; ++ case PP_TEMP_MEM: ++ /* get current memory temperature */ ++ r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_MEM_TEMP, ++ (void *)&temp, &size); ++ if (r) ++ return r; ++ break; ++ } + + return snprintf(buf, PAGE_SIZE, "%d\n", temp); + } +@@ -2031,7 +2053,8 @@ static ssize_t amdgpu_hwmon_show_mclk_label(struct device *dev, + * + * hwmon interfaces for GPU temperature: + * +- * - temp1_input: the on die GPU temperature in millidegrees Celsius ++ * - temp[1-3]_input: the on die GPU temperature in millidegrees Celsius ++ * - temp2_input and temp3_input are supported on SOC15 dGPUs only + * + * - temp[1-3]_crit: temperature critical max value in millidegrees Celsius + * - temp2_crit and temp3_crit are supported on SOC15 dGPUs only +@@ -2088,13 +2111,15 @@ static ssize_t amdgpu_hwmon_show_mclk_label(struct device *dev, + * + */ + +-static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, amdgpu_hwmon_show_temp, NULL, 0); ++static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, amdgpu_hwmon_show_temp, NULL, PP_TEMP_EDGE); + static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, amdgpu_hwmon_show_temp_thresh, NULL, 0); + static SENSOR_DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, amdgpu_hwmon_show_temp_thresh, NULL, 1); + static SENSOR_DEVICE_ATTR(temp1_emergency, S_IRUGO, amdgpu_hwmon_show_temp_emergency, NULL, PP_TEMP_EDGE); ++static SENSOR_DEVICE_ATTR(temp2_input, S_IRUGO, amdgpu_hwmon_show_temp, NULL, PP_TEMP_JUNCTION); + static SENSOR_DEVICE_ATTR(temp2_crit, S_IRUGO, amdgpu_hwmon_show_hotspot_temp_thresh, NULL, 0); + static SENSOR_DEVICE_ATTR(temp2_crit_hyst, S_IRUGO, amdgpu_hwmon_show_hotspot_temp_thresh, NULL, 1); + static SENSOR_DEVICE_ATTR(temp2_emergency, S_IRUGO, amdgpu_hwmon_show_temp_emergency, NULL, PP_TEMP_JUNCTION); ++static SENSOR_DEVICE_ATTR(temp3_input, S_IRUGO, amdgpu_hwmon_show_temp, NULL, PP_TEMP_MEM); + static SENSOR_DEVICE_ATTR(temp3_crit, S_IRUGO, amdgpu_hwmon_show_mem_temp_thresh, NULL, 0); + static SENSOR_DEVICE_ATTR(temp3_crit_hyst, S_IRUGO, amdgpu_hwmon_show_mem_temp_thresh, NULL, 1); + static SENSOR_DEVICE_ATTR(temp3_emergency, S_IRUGO, amdgpu_hwmon_show_temp_emergency, NULL, PP_TEMP_MEM); +@@ -2124,8 +2149,10 @@ static struct attribute *hwmon_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_crit.dev_attr.attr, + &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr, ++ &sensor_dev_attr_temp2_input.dev_attr.attr, + &sensor_dev_attr_temp2_crit.dev_attr.attr, + &sensor_dev_attr_temp2_crit_hyst.dev_attr.attr, ++ &sensor_dev_attr_temp3_input.dev_attr.attr, + &sensor_dev_attr_temp3_crit.dev_attr.attr, + &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr, + &sensor_dev_attr_temp1_emergency.dev_attr.attr, +@@ -2262,7 +2289,9 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, + attr == &sensor_dev_attr_temp3_crit_hyst.dev_attr.attr || + attr == &sensor_dev_attr_temp1_emergency.dev_attr.attr || + attr == &sensor_dev_attr_temp2_emergency.dev_attr.attr || +- attr == &sensor_dev_attr_temp3_emergency.dev_attr.attr)) ++ attr == &sensor_dev_attr_temp3_emergency.dev_attr.attr || ++ attr == &sensor_dev_attr_temp2_input.dev_attr.attr || ++ attr == &sensor_dev_attr_temp3_input.dev_attr.attr)) + return 0; + + return effective_mode; +diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h +index 2b579ba9b685..a8bf8e90ceeb 100644 +--- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h +@@ -111,6 +111,9 @@ enum amd_pp_sensors { + AMDGPU_PP_SENSOR_GPU_LOAD, + AMDGPU_PP_SENSOR_GFX_MCLK, + AMDGPU_PP_SENSOR_GPU_TEMP, ++ AMDGPU_PP_SENSOR_EDGE_TEMP = AMDGPU_PP_SENSOR_GPU_TEMP, ++ AMDGPU_PP_SENSOR_HOTSPOT_TEMP, ++ AMDGPU_PP_SENSOR_MEM_TEMP, + AMDGPU_PP_SENSOR_VCE_POWER, + AMDGPU_PP_SENSOR_UVD_POWER, + AMDGPU_PP_SENSOR_GPU_POWER, +diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +index 3161d7c535bc..f9a1b66d88d7 100644 +--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c ++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c +@@ -3785,6 +3785,18 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx, + *((uint32_t *)value) = vega10_thermal_get_temperature(hwmgr); + *size = 4; + break; ++ case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: ++ smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetTemperatureHotspot); ++ *((uint32_t *)value) = smum_get_argument(hwmgr) * ++ PP_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ *size = 4; ++ break; ++ case AMDGPU_PP_SENSOR_MEM_TEMP: ++ smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetTemperatureHBM); ++ *((uint32_t *)value) = smum_get_argument(hwmgr) * ++ PP_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ *size = 4; ++ break; + case AMDGPU_PP_SENSOR_UVD_POWER: + *((uint32_t *)value) = data->uvd_power_gated ? 0 : 1; + *size = 4; +diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c +index aeeeaa79056c..8d2865b72c7b 100644 +--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c ++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega12_hwmgr.c +@@ -1338,6 +1338,7 @@ static int vega12_read_sensor(struct pp_hwmgr *hwmgr, int idx, + void *value, int *size) + { + struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend); ++ SmuMetrics_t metrics_table; + int ret = 0; + + switch (idx) { +@@ -1360,6 +1361,24 @@ static int vega12_read_sensor(struct pp_hwmgr *hwmgr, int idx, + *((uint32_t *)value) = vega12_thermal_get_temperature(hwmgr); + *size = 4; + break; ++ case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: ++ ret = vega12_get_metrics_table(hwmgr, &metrics_table); ++ if (ret) ++ return ret; ++ ++ *((uint32_t *)value) = metrics_table.TemperatureHotspot * ++ PP_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ *size = 4; ++ break; ++ case AMDGPU_PP_SENSOR_MEM_TEMP: ++ ret = vega12_get_metrics_table(hwmgr, &metrics_table); ++ if (ret) ++ return ret; ++ ++ *((uint32_t *)value) = metrics_table.TemperatureHBM * ++ PP_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ *size = 4; ++ break; + case AMDGPU_PP_SENSOR_UVD_POWER: + *((uint32_t *)value) = data->uvd_power_gated ? 0 : 1; + *size = 4; +diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +index 6fcdefcfa930..abd3df9a0211 100644 +--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c ++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_hwmgr.c +@@ -2138,10 +2138,28 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx, + if (!ret) + *size = 4; + break; +- case AMDGPU_PP_SENSOR_GPU_TEMP: ++ case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: + *((uint32_t *)value) = vega20_thermal_get_temperature(hwmgr); + *size = 4; + break; ++ case AMDGPU_PP_SENSOR_EDGE_TEMP: ++ ret = vega20_get_metrics_table(hwmgr, &metrics_table); ++ if (ret) ++ return ret; ++ ++ *((uint32_t *)value) = metrics_table.TemperatureEdge * ++ PP_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ *size = 4; ++ break; ++ case AMDGPU_PP_SENSOR_MEM_TEMP: ++ ret = vega20_get_metrics_table(hwmgr, &metrics_table); ++ if (ret) ++ return ret; ++ ++ *((uint32_t *)value) = metrics_table.TemperatureHBM * ++ PP_TEMPERATURE_UNITS_PER_CENTIGRADES; ++ *size = 4; ++ break; + case AMDGPU_PP_SENSOR_UVD_POWER: + *((uint32_t *)value) = data->uvd_power_gated ? 0 : 1; + *size = 4; +-- +2.17.1 + |