]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/pm: Add board voltage node to hwmon
authorAsad Kamal <asad.kamal@amd.com>
Thu, 20 Mar 2025 10:21:57 +0000 (18:21 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 30 Apr 2025 22:13:40 +0000 (18:13 -0400)
Add and expose board voltage node as vddboard to hwmon for smu_v13_0_6

v2: Replace ip check with supported sensor attribute(Lijo)

Signed-off-by: Asad Kamal <asad.kamal@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/include/kgd_pp_interface.h
drivers/gpu/drm/amd/pm/amdgpu_pm.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c

index 21dc956b5f35d41d6f796e511a3dc2e684eff8ac..0f7542d7074ba155cb9faafab2a3a34cefcc13af 100644 (file)
@@ -128,6 +128,7 @@ enum amd_pp_sensors {
        AMDGPU_PP_SENSOR_CPU_CLK,
        AMDGPU_PP_SENSOR_VDDNB,
        AMDGPU_PP_SENSOR_VDDGFX,
+       AMDGPU_PP_SENSOR_VDDBOARD,
        AMDGPU_PP_SENSOR_UVD_VCLK,
        AMDGPU_PP_SENSOR_UVD_DCLK,
        AMDGPU_PP_SENSOR_VCE_ECCLK,
index 922def51685b0af8dd177b0a94fe8531f6a3b246..5537dcf23b5c0f2ddc0fe9d4aa9d5b2225ee32cc 100644 (file)
@@ -2944,6 +2944,23 @@ static ssize_t amdgpu_hwmon_show_vddgfx(struct device *dev,
        return sysfs_emit(buf, "%d\n", vddgfx);
 }
 
+static ssize_t amdgpu_hwmon_show_vddboard(struct device *dev,
+                                         struct device_attribute *attr,
+                                         char *buf)
+{
+       struct amdgpu_device *adev = dev_get_drvdata(dev);
+       u32 vddboard;
+       int r;
+
+       /* get the voltage */
+       r = amdgpu_hwmon_get_sensor_generic(adev, AMDGPU_PP_SENSOR_VDDBOARD,
+                                           (void *)&vddboard);
+       if (r)
+               return r;
+
+       return sysfs_emit(buf, "%d\n", vddboard);
+}
+
 static ssize_t amdgpu_hwmon_show_vddgfx_label(struct device *dev,
                                              struct device_attribute *attr,
                                              char *buf)
@@ -2951,6 +2968,12 @@ static ssize_t amdgpu_hwmon_show_vddgfx_label(struct device *dev,
        return sysfs_emit(buf, "vddgfx\n");
 }
 
+static ssize_t amdgpu_hwmon_show_vddboard_label(struct device *dev,
+                                               struct device_attribute *attr,
+                                               char *buf)
+{
+       return sysfs_emit(buf, "vddboard\n");
+}
 static ssize_t amdgpu_hwmon_show_vddnb(struct device *dev,
                                       struct device_attribute *attr,
                                       char *buf)
@@ -3294,6 +3317,8 @@ static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, amdgpu_hwmon_show_vddgfx, NULL, 0)
 static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO, amdgpu_hwmon_show_vddgfx_label, NULL, 0);
 static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, amdgpu_hwmon_show_vddnb, NULL, 0);
 static SENSOR_DEVICE_ATTR(in1_label, S_IRUGO, amdgpu_hwmon_show_vddnb_label, NULL, 0);
+static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, amdgpu_hwmon_show_vddboard, NULL, 0);
+static SENSOR_DEVICE_ATTR(in2_label, S_IRUGO, amdgpu_hwmon_show_vddboard_label, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_average, S_IRUGO, amdgpu_hwmon_show_power_avg, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_input, S_IRUGO, amdgpu_hwmon_show_power_input, NULL, 0);
 static SENSOR_DEVICE_ATTR(power1_cap_max, S_IRUGO, amdgpu_hwmon_show_power_cap_max, NULL, 0);
@@ -3341,6 +3366,8 @@ static struct attribute *hwmon_attributes[] = {
        &sensor_dev_attr_in0_label.dev_attr.attr,
        &sensor_dev_attr_in1_input.dev_attr.attr,
        &sensor_dev_attr_in1_label.dev_attr.attr,
+       &sensor_dev_attr_in2_input.dev_attr.attr,
+       &sensor_dev_attr_in2_label.dev_attr.attr,
        &sensor_dev_attr_power1_average.dev_attr.attr,
        &sensor_dev_attr_power1_input.dev_attr.attr,
        &sensor_dev_attr_power1_cap_max.dev_attr.attr,
@@ -3492,6 +3519,13 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
             attr == &sensor_dev_attr_in1_label.dev_attr.attr))
                return 0;
 
+       /* only few boards support vddboard */
+       if ((attr == &sensor_dev_attr_in2_input.dev_attr.attr ||
+            attr == &sensor_dev_attr_in2_label.dev_attr.attr) &&
+            amdgpu_hwmon_get_sensor_generic(adev, AMDGPU_PP_SENSOR_VDDBOARD,
+                                            (void *)&tmp) == -EOPNOTSUPP)
+               return 0;
+
        /* no mclk on APUs other than gc 9,4,3*/
        if (((adev->flags & AMD_IS_APU) && (gc_ver != IP_VERSION(9, 4, 3))) &&
            (attr == &sensor_dev_attr_freq2_input.dev_attr.attr ||
index f8e06913cd722b6c9184349ae3920ad647a6e584..b6e5da7b06efa1f52239e150b040607ab1446634 100644 (file)
@@ -1652,6 +1652,7 @@ static int smu_v13_0_6_read_sensor(struct smu_context *smu,
                                   enum amd_pp_sensors sensor, void *data,
                                   uint32_t *size)
 {
+       struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
        int ret = 0;
 
        if (amdgpu_ras_intr_triggered())
@@ -1696,6 +1697,15 @@ static int smu_v13_0_6_read_sensor(struct smu_context *smu,
                ret = smu_v13_0_get_gfx_vdd(smu, (uint32_t *)data);
                *size = 4;
                break;
+       case AMDGPU_PP_SENSOR_VDDBOARD:
+               if (smu_v13_0_6_cap_supported(smu, SMU_CAP(BOARD_VOLTAGE))) {
+                       *(uint32_t *)data = dpm_context->board_volt;
+                       *size = 4;
+                       break;
+               } else {
+                       ret = -EOPNOTSUPP;
+                       break;
+               }
        case AMDGPU_PP_SENSOR_GPU_AVG_POWER:
        default:
                ret = -EOPNOTSUPP;