diff options
author | Dave Airlie <airlied@redhat.com> | 2018-10-11 00:53:40 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2018-10-11 00:53:45 -0400 |
commit | ca4b869240d5810ebac6b1570ad7beffcfbac2f5 (patch) | |
tree | d7e36e551b058316ab35e28f1bb992ce06b2ce0c /drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |
parent | 46972c03ab667dc298cad0c9db517fb9b1521b5f (diff) | |
parent | df2fc43d09d3ee5ede82cab9299df5e78aa427b5 (diff) |
Merge branch 'drm-next-4.20' of git://people.freedesktop.org/~agd5f/linux into drm-next
Add a new list.h helper for doing bulk updates. Used by ttm.
- Fixes for display underflow on VI APUs at 4K with UVD running
- Endian fixes for powerplay on vega
- DC fixes for interlaced video
- Vega20 powerplay fixes
- RV/RV2/PCO powerplay fixes
- Fix for spurious ACPI events on HG laptops
- Fix a memory leak in DC on driver unload
- Fixes for manual fan control mode switching
- Suspend/resume robustness fixes
- Fix display handling on RV2
- VCN fixes for DPG on PCO
- Misc code cleanups and warning fixes
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181011014739.3117-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 187 |
1 files changed, 184 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 18d989e0e362..94055a485e01 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
@@ -1120,12 +1120,19 @@ static ssize_t amdgpu_hwmon_set_pwm1(struct device *dev, | |||
1120 | struct amdgpu_device *adev = dev_get_drvdata(dev); | 1120 | struct amdgpu_device *adev = dev_get_drvdata(dev); |
1121 | int err; | 1121 | int err; |
1122 | u32 value; | 1122 | u32 value; |
1123 | u32 pwm_mode; | ||
1123 | 1124 | ||
1124 | /* Can't adjust fan when the card is off */ | 1125 | /* Can't adjust fan when the card is off */ |
1125 | if ((adev->flags & AMD_IS_PX) && | 1126 | if ((adev->flags & AMD_IS_PX) && |
1126 | (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | 1127 | (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON)) |
1127 | return -EINVAL; | 1128 | return -EINVAL; |
1128 | 1129 | ||
1130 | pwm_mode = amdgpu_dpm_get_fan_control_mode(adev); | ||
1131 | if (pwm_mode != AMD_FAN_CTRL_MANUAL) { | ||
1132 | pr_info("manual fan speed control should be enabled first\n"); | ||
1133 | return -EINVAL; | ||
1134 | } | ||
1135 | |||
1129 | err = kstrtou32(buf, 10, &value); | 1136 | err = kstrtou32(buf, 10, &value); |
1130 | if (err) | 1137 | if (err) |
1131 | return err; | 1138 | return err; |
@@ -1187,6 +1194,148 @@ static ssize_t amdgpu_hwmon_get_fan1_input(struct device *dev, | |||
1187 | return sprintf(buf, "%i\n", speed); | 1194 | return sprintf(buf, "%i\n", speed); |
1188 | } | 1195 | } |
1189 | 1196 | ||
1197 | static ssize_t amdgpu_hwmon_get_fan1_min(struct device *dev, | ||
1198 | struct device_attribute *attr, | ||
1199 | char *buf) | ||
1200 | { | ||
1201 | struct amdgpu_device *adev = dev_get_drvdata(dev); | ||
1202 | u32 min_rpm = 0; | ||
1203 | u32 size = sizeof(min_rpm); | ||
1204 | int r; | ||
1205 | |||
1206 | if (!adev->powerplay.pp_funcs->read_sensor) | ||
1207 | return -EINVAL; | ||
1208 | |||
1209 | r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_MIN_FAN_RPM, | ||
1210 | (void *)&min_rpm, &size); | ||
1211 | if (r) | ||
1212 | return r; | ||
1213 | |||
1214 | return snprintf(buf, PAGE_SIZE, "%d\n", min_rpm); | ||
1215 | } | ||
1216 | |||
1217 | static ssize_t amdgpu_hwmon_get_fan1_max(struct device *dev, | ||
1218 | struct device_attribute *attr, | ||
1219 | char *buf) | ||
1220 | { | ||
1221 | struct amdgpu_device *adev = dev_get_drvdata(dev); | ||
1222 | u32 max_rpm = 0; | ||
1223 | u32 size = sizeof(max_rpm); | ||
1224 | int r; | ||
1225 | |||
1226 | if (!adev->powerplay.pp_funcs->read_sensor) | ||
1227 | return -EINVAL; | ||
1228 | |||
1229 | r = amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_MAX_FAN_RPM, | ||
1230 | (void *)&max_rpm, &size); | ||
1231 | if (r) | ||
1232 | return r; | ||
1233 | |||
1234 | return snprintf(buf, PAGE_SIZE, "%d\n", max_rpm); | ||
1235 | } | ||
1236 | |||
1237 | static ssize_t amdgpu_hwmon_get_fan1_target(struct device *dev, | ||
1238 | struct device_attribute *attr, | ||
1239 | char *buf) | ||
1240 | { | ||
1241 | struct amdgpu_device *adev = dev_get_drvdata(dev); | ||
1242 | int err; | ||
1243 | u32 rpm = 0; | ||
1244 | |||
1245 | /* Can't adjust fan when the card is off */ | ||
1246 | if ((adev->flags & AMD_IS_PX) && | ||
1247 | (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | ||
1248 | return -EINVAL; | ||
1249 | |||
1250 | if (adev->powerplay.pp_funcs->get_fan_speed_rpm) { | ||
1251 | err = amdgpu_dpm_get_fan_speed_rpm(adev, &rpm); | ||
1252 | if (err) | ||
1253 | return err; | ||
1254 | } | ||
1255 | |||
1256 | return sprintf(buf, "%i\n", rpm); | ||
1257 | } | ||
1258 | |||
1259 | static ssize_t amdgpu_hwmon_set_fan1_target(struct device *dev, | ||
1260 | struct device_attribute *attr, | ||
1261 | const char *buf, size_t count) | ||
1262 | { | ||
1263 | struct amdgpu_device *adev = dev_get_drvdata(dev); | ||
1264 | int err; | ||
1265 | u32 value; | ||
1266 | u32 pwm_mode; | ||
1267 | |||
1268 | pwm_mode = amdgpu_dpm_get_fan_control_mode(adev); | ||
1269 | if (pwm_mode != AMD_FAN_CTRL_MANUAL) | ||
1270 | return -ENODATA; | ||
1271 | |||
1272 | /* Can't adjust fan when the card is off */ | ||
1273 | if ((adev->flags & AMD_IS_PX) && | ||
1274 | (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | ||
1275 | return -EINVAL; | ||
1276 | |||
1277 | err = kstrtou32(buf, 10, &value); | ||
1278 | if (err) | ||
1279 | return err; | ||
1280 | |||
1281 | if (adev->powerplay.pp_funcs->set_fan_speed_rpm) { | ||
1282 | err = amdgpu_dpm_set_fan_speed_rpm(adev, value); | ||
1283 | if (err) | ||
1284 | return err; | ||
1285 | } | ||
1286 | |||
1287 | return count; | ||
1288 | } | ||
1289 | |||
1290 | static ssize_t amdgpu_hwmon_get_fan1_enable(struct device *dev, | ||
1291 | struct device_attribute *attr, | ||
1292 | char *buf) | ||
1293 | { | ||
1294 | struct amdgpu_device *adev = dev_get_drvdata(dev); | ||
1295 | u32 pwm_mode = 0; | ||
1296 | |||
1297 | if (!adev->powerplay.pp_funcs->get_fan_control_mode) | ||
1298 | return -EINVAL; | ||
1299 | |||
1300 | pwm_mode = amdgpu_dpm_get_fan_control_mode(adev); | ||
1301 | |||
1302 | return sprintf(buf, "%i\n", pwm_mode == AMD_FAN_CTRL_AUTO ? 0 : 1); | ||
1303 | } | ||
1304 | |||
1305 | static ssize_t amdgpu_hwmon_set_fan1_enable(struct device *dev, | ||
1306 | struct device_attribute *attr, | ||
1307 | const char *buf, | ||
1308 | size_t count) | ||
1309 | { | ||
1310 | struct amdgpu_device *adev = dev_get_drvdata(dev); | ||
1311 | int err; | ||
1312 | int value; | ||
1313 | u32 pwm_mode; | ||
1314 | |||
1315 | /* Can't adjust fan when the card is off */ | ||
1316 | if ((adev->flags & AMD_IS_PX) && | ||
1317 | (adev->ddev->switch_power_state != DRM_SWITCH_POWER_ON)) | ||
1318 | return -EINVAL; | ||
1319 | |||
1320 | if (!adev->powerplay.pp_funcs->set_fan_control_mode) | ||
1321 | return -EINVAL; | ||
1322 | |||
1323 | err = kstrtoint(buf, 10, &value); | ||
1324 | if (err) | ||
1325 | return err; | ||
1326 | |||
1327 | if (value == 0) | ||
1328 | pwm_mode = AMD_FAN_CTRL_AUTO; | ||
1329 | else if (value == 1) | ||
1330 | pwm_mode = AMD_FAN_CTRL_MANUAL; | ||
1331 | else | ||
1332 | return -EINVAL; | ||
1333 | |||
1334 | amdgpu_dpm_set_fan_control_mode(adev, pwm_mode); | ||
1335 | |||
1336 | return count; | ||
1337 | } | ||
1338 | |||
1190 | static ssize_t amdgpu_hwmon_show_vddgfx(struct device *dev, | 1339 | static ssize_t amdgpu_hwmon_show_vddgfx(struct device *dev, |
1191 | struct device_attribute *attr, | 1340 | struct device_attribute *attr, |
1192 | char *buf) | 1341 | char *buf) |
@@ -1406,8 +1555,16 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev, | |||
1406 | * | 1555 | * |
1407 | * - pwm1_max: pulse width modulation fan control maximum level (255) | 1556 | * - pwm1_max: pulse width modulation fan control maximum level (255) |
1408 | * | 1557 | * |
1558 | * - fan1_min: an minimum value Unit: revolution/min (RPM) | ||
1559 | * | ||
1560 | * - fan1_max: an maxmum value Unit: revolution/max (RPM) | ||
1561 | * | ||
1409 | * - fan1_input: fan speed in RPM | 1562 | * - fan1_input: fan speed in RPM |
1410 | * | 1563 | * |
1564 | * - fan[1-*]_target: Desired fan speed Unit: revolution/min (RPM) | ||
1565 | * | ||
1566 | * - fan[1-*]_enable: Enable or disable the sensors.1: Enable 0: Disable | ||
1567 | * | ||
1411 | * You can use hwmon tools like sensors to view this information on your system. | 1568 | * You can use hwmon tools like sensors to view this information on your system. |
1412 | * | 1569 | * |
1413 | */ | 1570 | */ |
@@ -1420,6 +1577,10 @@ static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR, amdgpu_hwmon_get_pwm1_ | |||
1420 | static SENSOR_DEVICE_ATTR(pwm1_min, S_IRUGO, amdgpu_hwmon_get_pwm1_min, NULL, 0); | 1577 | static SENSOR_DEVICE_ATTR(pwm1_min, S_IRUGO, amdgpu_hwmon_get_pwm1_min, NULL, 0); |
1421 | static SENSOR_DEVICE_ATTR(pwm1_max, S_IRUGO, amdgpu_hwmon_get_pwm1_max, NULL, 0); | 1578 | static SENSOR_DEVICE_ATTR(pwm1_max, S_IRUGO, amdgpu_hwmon_get_pwm1_max, NULL, 0); |
1422 | static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, amdgpu_hwmon_get_fan1_input, NULL, 0); | 1579 | static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, amdgpu_hwmon_get_fan1_input, NULL, 0); |
1580 | static SENSOR_DEVICE_ATTR(fan1_min, S_IRUGO, amdgpu_hwmon_get_fan1_min, NULL, 0); | ||
1581 | static SENSOR_DEVICE_ATTR(fan1_max, S_IRUGO, amdgpu_hwmon_get_fan1_max, NULL, 0); | ||
1582 | static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, amdgpu_hwmon_get_fan1_target, amdgpu_hwmon_set_fan1_target, 0); | ||
1583 | static SENSOR_DEVICE_ATTR(fan1_enable, S_IRUGO | S_IWUSR, amdgpu_hwmon_get_fan1_enable, amdgpu_hwmon_set_fan1_enable, 0); | ||
1423 | static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, amdgpu_hwmon_show_vddgfx, NULL, 0); | 1584 | static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, amdgpu_hwmon_show_vddgfx, NULL, 0); |
1424 | static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO, amdgpu_hwmon_show_vddgfx_label, NULL, 0); | 1585 | static SENSOR_DEVICE_ATTR(in0_label, S_IRUGO, amdgpu_hwmon_show_vddgfx_label, NULL, 0); |
1425 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, amdgpu_hwmon_show_vddnb, NULL, 0); | 1586 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, amdgpu_hwmon_show_vddnb, NULL, 0); |
@@ -1438,6 +1599,10 @@ static struct attribute *hwmon_attributes[] = { | |||
1438 | &sensor_dev_attr_pwm1_min.dev_attr.attr, | 1599 | &sensor_dev_attr_pwm1_min.dev_attr.attr, |
1439 | &sensor_dev_attr_pwm1_max.dev_attr.attr, | 1600 | &sensor_dev_attr_pwm1_max.dev_attr.attr, |
1440 | &sensor_dev_attr_fan1_input.dev_attr.attr, | 1601 | &sensor_dev_attr_fan1_input.dev_attr.attr, |
1602 | &sensor_dev_attr_fan1_min.dev_attr.attr, | ||
1603 | &sensor_dev_attr_fan1_max.dev_attr.attr, | ||
1604 | &sensor_dev_attr_fan1_target.dev_attr.attr, | ||
1605 | &sensor_dev_attr_fan1_enable.dev_attr.attr, | ||
1441 | &sensor_dev_attr_in0_input.dev_attr.attr, | 1606 | &sensor_dev_attr_in0_input.dev_attr.attr, |
1442 | &sensor_dev_attr_in0_label.dev_attr.attr, | 1607 | &sensor_dev_attr_in0_label.dev_attr.attr, |
1443 | &sensor_dev_attr_in1_input.dev_attr.attr, | 1608 | &sensor_dev_attr_in1_input.dev_attr.attr, |
@@ -1456,13 +1621,16 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, | |||
1456 | struct amdgpu_device *adev = dev_get_drvdata(dev); | 1621 | struct amdgpu_device *adev = dev_get_drvdata(dev); |
1457 | umode_t effective_mode = attr->mode; | 1622 | umode_t effective_mode = attr->mode; |
1458 | 1623 | ||
1459 | |||
1460 | /* Skip fan attributes if fan is not present */ | 1624 | /* Skip fan attributes if fan is not present */ |
1461 | if (adev->pm.no_fan && (attr == &sensor_dev_attr_pwm1.dev_attr.attr || | 1625 | if (adev->pm.no_fan && (attr == &sensor_dev_attr_pwm1.dev_attr.attr || |
1462 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr || | 1626 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr || |
1463 | attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || | 1627 | attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || |
1464 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr || | 1628 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr || |
1465 | attr == &sensor_dev_attr_fan1_input.dev_attr.attr)) | 1629 | attr == &sensor_dev_attr_fan1_input.dev_attr.attr || |
1630 | attr == &sensor_dev_attr_fan1_min.dev_attr.attr || | ||
1631 | attr == &sensor_dev_attr_fan1_max.dev_attr.attr || | ||
1632 | attr == &sensor_dev_attr_fan1_target.dev_attr.attr || | ||
1633 | attr == &sensor_dev_attr_fan1_enable.dev_attr.attr)) | ||
1466 | return 0; | 1634 | return 0; |
1467 | 1635 | ||
1468 | /* Skip limit attributes if DPM is not enabled */ | 1636 | /* Skip limit attributes if DPM is not enabled */ |
@@ -1472,7 +1640,12 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, | |||
1472 | attr == &sensor_dev_attr_pwm1.dev_attr.attr || | 1640 | attr == &sensor_dev_attr_pwm1.dev_attr.attr || |
1473 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr || | 1641 | attr == &sensor_dev_attr_pwm1_enable.dev_attr.attr || |
1474 | attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || | 1642 | attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || |
1475 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) | 1643 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr || |
1644 | attr == &sensor_dev_attr_fan1_input.dev_attr.attr || | ||
1645 | attr == &sensor_dev_attr_fan1_min.dev_attr.attr || | ||
1646 | attr == &sensor_dev_attr_fan1_max.dev_attr.attr || | ||
1647 | attr == &sensor_dev_attr_fan1_target.dev_attr.attr || | ||
1648 | attr == &sensor_dev_attr_fan1_enable.dev_attr.attr)) | ||
1476 | return 0; | 1649 | return 0; |
1477 | 1650 | ||
1478 | /* mask fan attributes if we have no bindings for this asic to expose */ | 1651 | /* mask fan attributes if we have no bindings for this asic to expose */ |
@@ -1497,10 +1670,18 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, | |||
1497 | /* hide max/min values if we can't both query and manage the fan */ | 1670 | /* hide max/min values if we can't both query and manage the fan */ |
1498 | if ((!adev->powerplay.pp_funcs->set_fan_speed_percent && | 1671 | if ((!adev->powerplay.pp_funcs->set_fan_speed_percent && |
1499 | !adev->powerplay.pp_funcs->get_fan_speed_percent) && | 1672 | !adev->powerplay.pp_funcs->get_fan_speed_percent) && |
1673 | (!adev->powerplay.pp_funcs->set_fan_speed_rpm && | ||
1674 | !adev->powerplay.pp_funcs->get_fan_speed_rpm) && | ||
1500 | (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || | 1675 | (attr == &sensor_dev_attr_pwm1_max.dev_attr.attr || |
1501 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) | 1676 | attr == &sensor_dev_attr_pwm1_min.dev_attr.attr)) |
1502 | return 0; | 1677 | return 0; |
1503 | 1678 | ||
1679 | if ((!adev->powerplay.pp_funcs->set_fan_speed_rpm && | ||
1680 | !adev->powerplay.pp_funcs->get_fan_speed_rpm) && | ||
1681 | (attr == &sensor_dev_attr_fan1_max.dev_attr.attr || | ||
1682 | attr == &sensor_dev_attr_fan1_min.dev_attr.attr)) | ||
1683 | return 0; | ||
1684 | |||
1504 | /* only APUs have vddnb */ | 1685 | /* only APUs have vddnb */ |
1505 | if (!(adev->flags & AMD_IS_APU) && | 1686 | if (!(adev->flags & AMD_IS_APU) && |
1506 | (attr == &sensor_dev_attr_in1_input.dev_attr.attr || | 1687 | (attr == &sensor_dev_attr_in1_input.dev_attr.attr || |