diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 62 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 23 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c | 79 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 39 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 2 |
7 files changed, 79 insertions, 140 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index fb8d6030a64d..9f0049563b71 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h | |||
| @@ -2343,6 +2343,11 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) | |||
| 2343 | #define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev)) | 2343 | #define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev)) |
| 2344 | #define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) | 2344 | #define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) |
| 2345 | 2345 | ||
| 2346 | #define amdgpu_dpm_read_sensor(adev, idx, value) \ | ||
| 2347 | ((adev)->pp_enabled ? \ | ||
| 2348 | (adev)->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, (idx), (value)) : \ | ||
| 2349 | -EINVAL) | ||
| 2350 | |||
| 2346 | #define amdgpu_dpm_get_temperature(adev) \ | 2351 | #define amdgpu_dpm_get_temperature(adev) \ |
| 2347 | ((adev)->pp_enabled ? \ | 2352 | ((adev)->pp_enabled ? \ |
| 2348 | (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ | 2353 | (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ |
| @@ -2394,11 +2399,6 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) | |||
| 2394 | (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ | 2399 | (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ |
| 2395 | (adev)->pm.funcs->powergate_vce((adev), (g))) | 2400 | (adev)->pm.funcs->powergate_vce((adev), (g))) |
| 2396 | 2401 | ||
| 2397 | #define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \ | ||
| 2398 | ((adev)->pp_enabled ? \ | ||
| 2399 | (adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \ | ||
| 2400 | (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m))) | ||
| 2401 | |||
| 2402 | #define amdgpu_dpm_get_current_power_state(adev) \ | 2402 | #define amdgpu_dpm_get_current_power_state(adev) \ |
| 2403 | (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) | 2403 | (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) |
| 2404 | 2404 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index d4ec3cb187a5..accc908bdc88 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
| @@ -1322,6 +1322,64 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev) | |||
| 1322 | */ | 1322 | */ |
| 1323 | #if defined(CONFIG_DEBUG_FS) | 1323 | #if defined(CONFIG_DEBUG_FS) |
| 1324 | 1324 | ||
| 1325 | static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *adev) | ||
| 1326 | { | ||
| 1327 | int32_t value; | ||
| 1328 | |||
| 1329 | /* sanity check PP is enabled */ | ||
| 1330 | if (!(adev->powerplay.pp_funcs && | ||
| 1331 | adev->powerplay.pp_funcs->read_sensor)) | ||
| 1332 | return -EINVAL; | ||
| 1333 | |||
| 1334 | /* GPU Clocks */ | ||
| 1335 | seq_printf(m, "GFX Clocks and Power:\n"); | ||
| 1336 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GFX_MCLK, &value)) | ||
| 1337 | seq_printf(m, "\t%u MHz (MCLK)\n", value/100); | ||
| 1338 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GFX_SCLK, &value)) | ||
| 1339 | seq_printf(m, "\t%u MHz (SCLK)\n", value/100); | ||
| 1340 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDGFX, &value)) | ||
| 1341 | seq_printf(m, "\t%u mV (VDDGFX)\n", value); | ||
| 1342 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VDDNB, &value)) | ||
| 1343 | seq_printf(m, "\t%u mV (VDDNB)\n", value); | ||
| 1344 | seq_printf(m, "\n"); | ||
| 1345 | |||
| 1346 | /* GPU Temp */ | ||
| 1347 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_TEMP, &value)) | ||
| 1348 | seq_printf(m, "GPU Temperature: %u C\n", value/1000); | ||
| 1349 | |||
| 1350 | /* GPU Load */ | ||
| 1351 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_LOAD, &value)) | ||
| 1352 | seq_printf(m, "GPU Load: %u %%\n", value); | ||
| 1353 | seq_printf(m, "\n"); | ||
| 1354 | |||
| 1355 | /* UVD clocks */ | ||
| 1356 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_POWER, &value)) { | ||
| 1357 | if (!value) { | ||
| 1358 | seq_printf(m, "UVD: Disabled\n"); | ||
| 1359 | } else { | ||
| 1360 | seq_printf(m, "UVD: Enabled\n"); | ||
| 1361 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_DCLK, &value)) | ||
| 1362 | seq_printf(m, "\t%u MHz (DCLK)\n", value/100); | ||
| 1363 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_UVD_VCLK, &value)) | ||
| 1364 | seq_printf(m, "\t%u MHz (VCLK)\n", value/100); | ||
| 1365 | } | ||
| 1366 | } | ||
| 1367 | seq_printf(m, "\n"); | ||
| 1368 | |||
| 1369 | /* VCE clocks */ | ||
| 1370 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VCE_POWER, &value)) { | ||
| 1371 | if (!value) { | ||
| 1372 | seq_printf(m, "VCE: Disabled\n"); | ||
| 1373 | } else { | ||
| 1374 | seq_printf(m, "VCE: Enabled\n"); | ||
| 1375 | if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_VCE_ECCLK, &value)) | ||
| 1376 | seq_printf(m, "\t%u MHz (ECCLK)\n", value/100); | ||
| 1377 | } | ||
| 1378 | } | ||
| 1379 | |||
| 1380 | return 0; | ||
| 1381 | } | ||
| 1382 | |||
| 1325 | static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data) | 1383 | static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data) |
| 1326 | { | 1384 | { |
| 1327 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 1385 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
| @@ -1337,11 +1395,11 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data) | |||
| 1337 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { | 1395 | (ddev->switch_power_state != DRM_SWITCH_POWER_ON)) { |
| 1338 | seq_printf(m, "PX asic powered off\n"); | 1396 | seq_printf(m, "PX asic powered off\n"); |
| 1339 | } else if (adev->pp_enabled) { | 1397 | } else if (adev->pp_enabled) { |
| 1340 | amdgpu_dpm_debugfs_print_current_performance_level(adev, m); | 1398 | return amdgpu_debugfs_pm_info_pp(m, adev); |
| 1341 | } else { | 1399 | } else { |
| 1342 | mutex_lock(&adev->pm.mutex); | 1400 | mutex_lock(&adev->pm.mutex); |
| 1343 | if (adev->pm.funcs->debugfs_print_current_performance_level) | 1401 | if (adev->pm.funcs->debugfs_print_current_performance_level) |
| 1344 | amdgpu_dpm_debugfs_print_current_performance_level(adev, m); | 1402 | adev->pm.funcs->debugfs_print_current_performance_level(adev, m); |
| 1345 | else | 1403 | else |
| 1346 | seq_printf(m, "Debugfs support not implemented for this asic\n"); | 1404 | seq_printf(m, "Debugfs support not implemented for this asic\n"); |
| 1347 | mutex_unlock(&adev->pm.mutex); | 1405 | mutex_unlock(&adev->pm.mutex); |
diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c index ee0368381e82..212ec2fd97ed 100644 --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c | |||
| @@ -576,28 +576,6 @@ enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle) | |||
| 576 | } | 576 | } |
| 577 | } | 577 | } |
| 578 | 578 | ||
| 579 | static void | ||
| 580 | pp_debugfs_print_current_performance_level(void *handle, | ||
| 581 | struct seq_file *m) | ||
| 582 | { | ||
| 583 | struct pp_hwmgr *hwmgr; | ||
| 584 | |||
| 585 | if (handle == NULL) | ||
| 586 | return; | ||
| 587 | |||
| 588 | hwmgr = ((struct pp_instance *)handle)->hwmgr; | ||
| 589 | |||
| 590 | if (hwmgr == NULL || hwmgr->hwmgr_func == NULL) | ||
| 591 | return; | ||
| 592 | |||
| 593 | if (hwmgr->hwmgr_func->print_current_perforce_level == NULL) { | ||
| 594 | printk(KERN_INFO "%s was not implemented.\n", __func__); | ||
| 595 | return; | ||
| 596 | } | ||
| 597 | |||
| 598 | hwmgr->hwmgr_func->print_current_perforce_level(hwmgr, m); | ||
| 599 | } | ||
| 600 | |||
| 601 | static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode) | 579 | static int pp_dpm_set_fan_control_mode(void *handle, uint32_t mode) |
| 602 | { | 580 | { |
| 603 | struct pp_hwmgr *hwmgr; | 581 | struct pp_hwmgr *hwmgr; |
| @@ -925,7 +903,6 @@ const struct amd_powerplay_funcs pp_dpm_funcs = { | |||
| 925 | .powergate_vce = pp_dpm_powergate_vce, | 903 | .powergate_vce = pp_dpm_powergate_vce, |
| 926 | .powergate_uvd = pp_dpm_powergate_uvd, | 904 | .powergate_uvd = pp_dpm_powergate_uvd, |
| 927 | .dispatch_tasks = pp_dpm_dispatch_tasks, | 905 | .dispatch_tasks = pp_dpm_dispatch_tasks, |
| 928 | .print_current_performance_level = pp_debugfs_print_current_performance_level, | ||
| 929 | .set_fan_control_mode = pp_dpm_set_fan_control_mode, | 906 | .set_fan_control_mode = pp_dpm_set_fan_control_mode, |
| 930 | .get_fan_control_mode = pp_dpm_get_fan_control_mode, | 907 | .get_fan_control_mode = pp_dpm_get_fan_control_mode, |
| 931 | .set_fan_speed_percent = pp_dpm_set_fan_speed_percent, | 908 | .set_fan_speed_percent = pp_dpm_set_fan_speed_percent, |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c index 9f3c5a8a903c..7e4fcbbbe086 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c | |||
| @@ -1538,78 +1538,6 @@ int cz_get_power_state_size(struct pp_hwmgr *hwmgr) | |||
| 1538 | return sizeof(struct cz_power_state); | 1538 | return sizeof(struct cz_power_state); |
| 1539 | } | 1539 | } |
| 1540 | 1540 | ||
| 1541 | static void | ||
| 1542 | cz_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m) | ||
| 1543 | { | ||
| 1544 | struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); | ||
| 1545 | |||
| 1546 | struct phm_clock_voltage_dependency_table *table = | ||
| 1547 | hwmgr->dyn_state.vddc_dependency_on_sclk; | ||
| 1548 | |||
| 1549 | struct phm_vce_clock_voltage_dependency_table *vce_table = | ||
| 1550 | hwmgr->dyn_state.vce_clock_voltage_dependency_table; | ||
| 1551 | |||
| 1552 | struct phm_uvd_clock_voltage_dependency_table *uvd_table = | ||
| 1553 | hwmgr->dyn_state.uvd_clock_voltage_dependency_table; | ||
| 1554 | |||
| 1555 | uint32_t sclk_index = PHM_GET_FIELD(cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixTARGET_AND_CURRENT_PROFILE_INDEX), | ||
| 1556 | TARGET_AND_CURRENT_PROFILE_INDEX, CURR_SCLK_INDEX); | ||
| 1557 | uint32_t uvd_index = PHM_GET_FIELD(cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixTARGET_AND_CURRENT_PROFILE_INDEX_2), | ||
| 1558 | TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_UVD_INDEX); | ||
| 1559 | uint32_t vce_index = PHM_GET_FIELD(cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixTARGET_AND_CURRENT_PROFILE_INDEX_2), | ||
| 1560 | TARGET_AND_CURRENT_PROFILE_INDEX_2, CURR_VCE_INDEX); | ||
| 1561 | |||
| 1562 | uint32_t sclk, vclk, dclk, ecclk, tmp, activity_percent; | ||
| 1563 | uint16_t vddnb, vddgfx; | ||
| 1564 | int result; | ||
| 1565 | |||
| 1566 | if (sclk_index >= NUM_SCLK_LEVELS) { | ||
| 1567 | seq_printf(m, "\n invalid sclk dpm profile %d\n", sclk_index); | ||
| 1568 | } else { | ||
| 1569 | sclk = table->entries[sclk_index].clk; | ||
| 1570 | seq_printf(m, "\n index: %u sclk: %u MHz\n", sclk_index, sclk/100); | ||
| 1571 | } | ||
| 1572 | |||
| 1573 | tmp = (cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixSMUSVI_NB_CURRENTVID) & | ||
| 1574 | CURRENT_NB_VID_MASK) >> CURRENT_NB_VID__SHIFT; | ||
| 1575 | vddnb = cz_convert_8Bit_index_to_voltage(hwmgr, tmp); | ||
| 1576 | tmp = (cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, ixSMUSVI_GFX_CURRENTVID) & | ||
| 1577 | CURRENT_GFX_VID_MASK) >> CURRENT_GFX_VID__SHIFT; | ||
| 1578 | vddgfx = cz_convert_8Bit_index_to_voltage(hwmgr, (u16)tmp); | ||
| 1579 | seq_printf(m, "\n vddnb: %u vddgfx: %u\n", vddnb, vddgfx); | ||
| 1580 | |||
| 1581 | seq_printf(m, "\n uvd %sabled\n", cz_hwmgr->uvd_power_gated ? "dis" : "en"); | ||
| 1582 | if (!cz_hwmgr->uvd_power_gated) { | ||
| 1583 | if (uvd_index >= CZ_MAX_HARDWARE_POWERLEVELS) { | ||
| 1584 | seq_printf(m, "\n invalid uvd dpm level %d\n", uvd_index); | ||
| 1585 | } else { | ||
| 1586 | vclk = uvd_table->entries[uvd_index].vclk; | ||
| 1587 | dclk = uvd_table->entries[uvd_index].dclk; | ||
| 1588 | seq_printf(m, "\n index: %u uvd vclk: %u MHz dclk: %u MHz\n", uvd_index, vclk/100, dclk/100); | ||
| 1589 | } | ||
| 1590 | } | ||
| 1591 | |||
| 1592 | seq_printf(m, "\n vce %sabled\n", cz_hwmgr->vce_power_gated ? "dis" : "en"); | ||
| 1593 | if (!cz_hwmgr->vce_power_gated) { | ||
| 1594 | if (vce_index >= CZ_MAX_HARDWARE_POWERLEVELS) { | ||
| 1595 | seq_printf(m, "\n invalid vce dpm level %d\n", vce_index); | ||
| 1596 | } else { | ||
| 1597 | ecclk = vce_table->entries[vce_index].ecclk; | ||
| 1598 | seq_printf(m, "\n index: %u vce ecclk: %u MHz\n", vce_index, ecclk/100); | ||
| 1599 | } | ||
| 1600 | } | ||
| 1601 | |||
| 1602 | result = smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_GetAverageGraphicsActivity); | ||
| 1603 | if (0 == result) { | ||
| 1604 | activity_percent = cgs_read_register(hwmgr->device, mmSMU_MP1_SRBM2P_ARG_0); | ||
| 1605 | activity_percent = activity_percent > 100 ? 100 : activity_percent; | ||
| 1606 | } else { | ||
| 1607 | activity_percent = 50; | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | seq_printf(m, "\n [GPU load]: %u %%\n\n", activity_percent); | ||
| 1611 | } | ||
| 1612 | |||
| 1613 | static void cz_hw_print_display_cfg( | 1541 | static void cz_hw_print_display_cfg( |
| 1614 | const struct cc6_settings *cc6_settings) | 1542 | const struct cc6_settings *cc6_settings) |
| 1615 | { | 1543 | { |
| @@ -1947,6 +1875,12 @@ static int cz_read_sensor(struct pp_hwmgr *hwmgr, int idx, int32_t *value) | |||
| 1947 | } | 1875 | } |
| 1948 | *value = activity_percent; | 1876 | *value = activity_percent; |
| 1949 | return 0; | 1877 | return 0; |
| 1878 | case AMDGPU_PP_SENSOR_UVD_POWER: | ||
| 1879 | *value = cz_hwmgr->uvd_power_gated ? 0 : 1; | ||
| 1880 | return 0; | ||
| 1881 | case AMDGPU_PP_SENSOR_VCE_POWER: | ||
| 1882 | *value = cz_hwmgr->vce_power_gated ? 0 : 1; | ||
| 1883 | return 0; | ||
| 1950 | default: | 1884 | default: |
| 1951 | return -EINVAL; | 1885 | return -EINVAL; |
| 1952 | } | 1886 | } |
| @@ -1967,7 +1901,6 @@ static const struct pp_hwmgr_func cz_hwmgr_funcs = { | |||
| 1967 | .patch_boot_state = cz_dpm_patch_boot_state, | 1901 | .patch_boot_state = cz_dpm_patch_boot_state, |
| 1968 | .get_pp_table_entry = cz_dpm_get_pp_table_entry, | 1902 | .get_pp_table_entry = cz_dpm_get_pp_table_entry, |
| 1969 | .get_num_of_pp_table_entries = cz_dpm_get_num_of_pp_table_entries, | 1903 | .get_num_of_pp_table_entries = cz_dpm_get_num_of_pp_table_entries, |
| 1970 | .print_current_perforce_level = cz_print_current_perforce_level, | ||
| 1971 | .set_cpu_power_state = cz_set_cpu_power_state, | 1904 | .set_cpu_power_state = cz_set_cpu_power_state, |
| 1972 | .store_cc6_data = cz_store_cc6_data, | 1905 | .store_cc6_data = cz_store_cc6_data, |
| 1973 | .force_clock_level = cz_force_clock_level, | 1906 | .force_clock_level = cz_force_clock_level, |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c index 07a7d046d6f6..a3832f2d893b 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | |||
| @@ -3112,38 +3112,6 @@ static int smu7_get_pp_table_entry(struct pp_hwmgr *hwmgr, | |||
| 3112 | return 0; | 3112 | return 0; |
| 3113 | } | 3113 | } |
| 3114 | 3114 | ||
| 3115 | static void | ||
| 3116 | smu7_print_current_perforce_level(struct pp_hwmgr *hwmgr, struct seq_file *m) | ||
| 3117 | { | ||
| 3118 | uint32_t sclk, mclk, activity_percent; | ||
| 3119 | uint32_t offset; | ||
| 3120 | struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); | ||
| 3121 | |||
| 3122 | smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetSclkFrequency); | ||
| 3123 | |||
| 3124 | sclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); | ||
| 3125 | |||
| 3126 | smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_API_GetMclkFrequency); | ||
| 3127 | |||
| 3128 | mclk = cgs_read_register(hwmgr->device, mmSMC_MSG_ARG_0); | ||
| 3129 | seq_printf(m, "\n [ mclk ]: %u MHz\n\n [ sclk ]: %u MHz\n", | ||
| 3130 | mclk / 100, sclk / 100); | ||
| 3131 | |||
| 3132 | offset = data->soft_regs_start + smum_get_offsetof(hwmgr->smumgr, | ||
| 3133 | SMU_SoftRegisters, | ||
| 3134 | AverageGraphicsActivity); | ||
| 3135 | |||
| 3136 | activity_percent = cgs_read_ind_register(hwmgr->device, CGS_IND_REG__SMC, offset); | ||
| 3137 | activity_percent += 0x80; | ||
| 3138 | activity_percent >>= 8; | ||
| 3139 | |||
| 3140 | seq_printf(m, "\n [GPU load]: %u%%\n\n", activity_percent > 100 ? 100 : activity_percent); | ||
| 3141 | |||
| 3142 | seq_printf(m, "uvd %sabled\n", data->uvd_power_gated ? "dis" : "en"); | ||
| 3143 | |||
| 3144 | seq_printf(m, "vce %sabled\n", data->vce_power_gated ? "dis" : "en"); | ||
| 3145 | } | ||
| 3146 | |||
| 3147 | static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx, int32_t *value) | 3115 | static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx, int32_t *value) |
| 3148 | { | 3116 | { |
| 3149 | uint32_t sclk, mclk, activity_percent; | 3117 | uint32_t sclk, mclk, activity_percent; |
| @@ -3174,6 +3142,12 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx, int32_t *value) | |||
| 3174 | case AMDGPU_PP_SENSOR_GPU_TEMP: | 3142 | case AMDGPU_PP_SENSOR_GPU_TEMP: |
| 3175 | *value = smu7_thermal_get_temperature(hwmgr); | 3143 | *value = smu7_thermal_get_temperature(hwmgr); |
| 3176 | return 0; | 3144 | return 0; |
| 3145 | case AMDGPU_PP_SENSOR_UVD_POWER: | ||
| 3146 | *value = data->uvd_power_gated ? 0 : 1; | ||
| 3147 | return 0; | ||
| 3148 | case AMDGPU_PP_SENSOR_VCE_POWER: | ||
| 3149 | *value = data->vce_power_gated ? 0 : 1; | ||
| 3150 | return 0; | ||
| 3177 | default: | 3151 | default: |
| 3178 | return -EINVAL; | 3152 | return -EINVAL; |
| 3179 | } | 3153 | } |
| @@ -4318,7 +4292,6 @@ static struct pp_hwmgr_func smu7_hwmgr_funcs = { | |||
| 4318 | .patch_boot_state = smu7_dpm_patch_boot_state, | 4292 | .patch_boot_state = smu7_dpm_patch_boot_state, |
| 4319 | .get_pp_table_entry = smu7_get_pp_table_entry, | 4293 | .get_pp_table_entry = smu7_get_pp_table_entry, |
| 4320 | .get_num_of_pp_table_entries = smu7_get_number_of_powerplay_table_entries, | 4294 | .get_num_of_pp_table_entries = smu7_get_number_of_powerplay_table_entries, |
| 4321 | .print_current_perforce_level = smu7_print_current_perforce_level, | ||
| 4322 | .powerdown_uvd = smu7_powerdown_uvd, | 4295 | .powerdown_uvd = smu7_powerdown_uvd, |
| 4323 | .powergate_uvd = smu7_powergate_uvd, | 4296 | .powergate_uvd = smu7_powergate_uvd, |
| 4324 | .powergate_vce = smu7_powergate_vce, | 4297 | .powergate_vce = smu7_powergate_vce, |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h b/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h index dfa0f38a5e76..3d74043c0e08 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h +++ b/drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h | |||
| @@ -39,6 +39,8 @@ enum amd_pp_sensors { | |||
| 39 | AMDGPU_PP_SENSOR_GPU_LOAD, | 39 | AMDGPU_PP_SENSOR_GPU_LOAD, |
| 40 | AMDGPU_PP_SENSOR_GFX_MCLK, | 40 | AMDGPU_PP_SENSOR_GFX_MCLK, |
| 41 | AMDGPU_PP_SENSOR_GPU_TEMP, | 41 | AMDGPU_PP_SENSOR_GPU_TEMP, |
| 42 | AMDGPU_PP_SENSOR_VCE_POWER, | ||
| 43 | AMDGPU_PP_SENSOR_UVD_POWER, | ||
| 42 | }; | 44 | }; |
| 43 | 45 | ||
| 44 | enum amd_pp_event { | 46 | enum amd_pp_event { |
| @@ -343,8 +345,6 @@ struct amd_powerplay_funcs { | |||
| 343 | int (*powergate_uvd)(void *handle, bool gate); | 345 | int (*powergate_uvd)(void *handle, bool gate); |
| 344 | int (*dispatch_tasks)(void *handle, enum amd_pp_event event_id, | 346 | int (*dispatch_tasks)(void *handle, enum amd_pp_event event_id, |
| 345 | void *input, void *output); | 347 | void *input, void *output); |
| 346 | void (*print_current_performance_level)(void *handle, | ||
| 347 | struct seq_file *m); | ||
| 348 | int (*set_fan_control_mode)(void *handle, uint32_t mode); | 348 | int (*set_fan_control_mode)(void *handle, uint32_t mode); |
| 349 | int (*get_fan_control_mode)(void *handle); | 349 | int (*get_fan_control_mode)(void *handle); |
| 350 | int (*set_fan_speed_percent)(void *handle, uint32_t percent); | 350 | int (*set_fan_speed_percent)(void *handle, uint32_t percent); |
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h index fcd45452380d..4f0fedd1e9d3 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | |||
| @@ -311,8 +311,6 @@ struct pp_hwmgr_func { | |||
| 311 | int (*get_sclk)(struct pp_hwmgr *hwmgr, bool low); | 311 | int (*get_sclk)(struct pp_hwmgr *hwmgr, bool low); |
| 312 | int (*power_state_set)(struct pp_hwmgr *hwmgr, | 312 | int (*power_state_set)(struct pp_hwmgr *hwmgr, |
| 313 | const void *state); | 313 | const void *state); |
| 314 | void (*print_current_perforce_level)(struct pp_hwmgr *hwmgr, | ||
| 315 | struct seq_file *m); | ||
| 316 | int (*enable_clock_power_gating)(struct pp_hwmgr *hwmgr); | 314 | int (*enable_clock_power_gating)(struct pp_hwmgr *hwmgr); |
| 317 | int (*notify_smc_display_config_after_ps_adjustment)(struct pp_hwmgr *hwmgr); | 315 | int (*notify_smc_display_config_after_ps_adjustment)(struct pp_hwmgr *hwmgr); |
| 318 | int (*display_config_changed)(struct pp_hwmgr *hwmgr); | 316 | int (*display_config_changed)(struct pp_hwmgr *hwmgr); |
