Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: dpm updates for KV

This updates dpm support for KV asics. Notably there
are some changes in acp handling and forcing performance
levels.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+88 -15
+88 -15
drivers/gpu/drm/radeon/kv_dpm.c
··· 40 40 static void kv_enable_new_levels(struct radeon_device *rdev); 41 41 static void kv_program_nbps_index_settings(struct radeon_device *rdev, 42 42 struct radeon_ps *new_rps); 43 + static int kv_set_enabled_level(struct radeon_device *rdev, u32 level); 43 44 static int kv_set_enabled_levels(struct radeon_device *rdev); 44 45 static int kv_force_dpm_highest(struct radeon_device *rdev); 45 46 static int kv_force_dpm_lowest(struct radeon_device *rdev); ··· 520 519 521 520 static void kv_program_vc(struct radeon_device *rdev) 522 521 { 523 - WREG32_SMC(CG_FTV_0, 0x3FFFC000); 522 + WREG32_SMC(CG_FTV_0, 0x3FFFC100); 524 523 } 525 524 526 525 static void kv_clear_vc(struct radeon_device *rdev) ··· 639 638 640 639 static int kv_unforce_levels(struct radeon_device *rdev) 641 640 { 642 - return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel); 641 + if (rdev->family == CHIP_KABINI) 642 + return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel); 643 + else 644 + return kv_set_enabled_levels(rdev); 643 645 } 644 646 645 647 static int kv_update_sclk_t(struct radeon_device *rdev) ··· 1080 1076 PPSMC_MSG_EnableULV : PPSMC_MSG_DisableULV); 1081 1077 } 1082 1078 1079 + static void kv_reset_acp_boot_level(struct radeon_device *rdev) 1080 + { 1081 + struct kv_power_info *pi = kv_get_pi(rdev); 1082 + 1083 + pi->acp_boot_level = 0xff; 1084 + } 1085 + 1083 1086 static void kv_update_current_ps(struct radeon_device *rdev, 1084 1087 struct radeon_ps *rps) 1085 1088 { ··· 1200 1189 DRM_ERROR("kv_enable_smc_cac failed\n"); 1201 1190 return ret; 1202 1191 } 1192 + 1193 + kv_reset_acp_boot_level(rdev); 1203 1194 1204 1195 if (rdev->irq.installed && 1205 1196 r600_is_internal_thermal_sensor(rdev->pm.int_thermal_type)) { ··· 1461 1448 return kv_enable_samu_dpm(rdev, !gate); 1462 1449 } 1463 1450 1451 + static u8 kv_get_acp_boot_level(struct radeon_device *rdev) 1452 + { 1453 + u8 i; 1454 + struct radeon_clock_voltage_dependency_table *table = 1455 + &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table; 1456 + 1457 + for (i = 0; i < table->count; i++) { 1458 + if (table->entries[i].clk >= 0) /* XXX */ 1459 + break; 1460 + } 1461 + 1462 + if (i >= table->count) 1463 + i = table->count - 1; 1464 + 1465 + return i; 1466 + } 1467 + 1468 + static void kv_update_acp_boot_level(struct radeon_device *rdev) 1469 + { 1470 + struct kv_power_info *pi = kv_get_pi(rdev); 1471 + u8 acp_boot_level; 1472 + 1473 + if (!pi->caps_stable_p_state) { 1474 + acp_boot_level = kv_get_acp_boot_level(rdev); 1475 + if (acp_boot_level != pi->acp_boot_level) { 1476 + pi->acp_boot_level = acp_boot_level; 1477 + kv_send_msg_to_smc_with_parameter(rdev, 1478 + PPSMC_MSG_ACPDPM_SetEnabledMask, 1479 + (1 << pi->acp_boot_level)); 1480 + } 1481 + } 1482 + } 1483 + 1464 1484 static int kv_update_acp_dpm(struct radeon_device *rdev, bool gate) 1465 1485 { 1466 1486 struct kv_power_info *pi = kv_get_pi(rdev); ··· 1505 1459 if (pi->caps_stable_p_state) 1506 1460 pi->acp_boot_level = table->count - 1; 1507 1461 else 1508 - pi->acp_boot_level = 0; 1462 + pi->acp_boot_level = kv_get_acp_boot_level(rdev); 1509 1463 1510 1464 ret = kv_copy_bytes_to_smc(rdev, 1511 1465 pi->dpm_table_start + ··· 1815 1769 return ret; 1816 1770 } 1817 1771 #endif 1772 + kv_update_acp_boot_level(rdev); 1818 1773 kv_update_sclk_t(rdev); 1819 1774 kv_enable_nb_dpm(rdev); 1820 1775 } ··· 1847 1800 1848 1801 void kv_dpm_reset_asic(struct radeon_device *rdev) 1849 1802 { 1850 - kv_force_lowest_valid(rdev); 1851 - kv_init_graphics_levels(rdev); 1852 - kv_program_bootup_state(rdev); 1853 - kv_upload_dpm_settings(rdev); 1854 - kv_force_lowest_valid(rdev); 1855 - kv_unforce_levels(rdev); 1803 + struct kv_power_info *pi = kv_get_pi(rdev); 1804 + 1805 + if (rdev->family == CHIP_KABINI) { 1806 + kv_force_lowest_valid(rdev); 1807 + kv_init_graphics_levels(rdev); 1808 + kv_program_bootup_state(rdev); 1809 + kv_upload_dpm_settings(rdev); 1810 + kv_force_lowest_valid(rdev); 1811 + kv_unforce_levels(rdev); 1812 + } else { 1813 + kv_init_graphics_levels(rdev); 1814 + kv_program_bootup_state(rdev); 1815 + kv_freeze_sclk_dpm(rdev, true); 1816 + kv_upload_dpm_settings(rdev); 1817 + kv_freeze_sclk_dpm(rdev, false); 1818 + kv_set_enabled_level(rdev, pi->graphics_boot_level); 1819 + } 1856 1820 } 1857 1821 1858 1822 //XXX use sumo_dpm_display_configuration_changed ··· 1928 1870 break; 1929 1871 } 1930 1872 1931 - return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); 1873 + if (rdev->family == CHIP_KABINI) 1874 + return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); 1875 + else 1876 + return kv_set_enabled_level(rdev, i); 1932 1877 } 1933 1878 1934 1879 static int kv_force_dpm_lowest(struct radeon_device *rdev) ··· 1948 1887 break; 1949 1888 } 1950 1889 1951 - return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); 1890 + if (rdev->family == CHIP_KABINI) 1891 + return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); 1892 + else 1893 + return kv_set_enabled_level(rdev, i); 1952 1894 } 1953 1895 1954 1896 static u8 kv_get_sleep_divider_id_from_clock(struct radeon_device *rdev, ··· 2097 2033 ps->dpmx_nb_ps_lo = 0x1; 2098 2034 ps->dpmx_nb_ps_hi = 0x0; 2099 2035 } else { 2100 - ps->dpm0_pg_nb_ps_lo = 0x1; 2036 + ps->dpm0_pg_nb_ps_lo = 0x3; 2101 2037 ps->dpm0_pg_nb_ps_hi = 0x0; 2102 - ps->dpmx_nb_ps_lo = 0x2; 2103 - ps->dpmx_nb_ps_hi = 0x1; 2038 + ps->dpmx_nb_ps_lo = 0x3; 2039 + ps->dpmx_nb_ps_hi = 0x0; 2104 2040 2105 - if (pi->sys_info.nb_dpm_enable && pi->battery_state) { 2041 + if (pi->sys_info.nb_dpm_enable) { 2106 2042 force_high = (mclk >= pi->sys_info.nbp_memory_clock[3]) || 2107 2043 pi->video_start || (rdev->pm.dpm.new_active_crtc_count >= 3) || 2108 2044 pi->disable_nb_ps3_in_battery; ··· 2266 2202 if (i >= pi->lowest_valid && i <= pi->highest_valid) 2267 2203 kv_dpm_power_level_enable(rdev, i, true); 2268 2204 } 2205 + } 2206 + 2207 + static int kv_set_enabled_level(struct radeon_device *rdev, u32 level) 2208 + { 2209 + u32 new_mask = (1 << level); 2210 + 2211 + return kv_send_msg_to_smc_with_parameter(rdev, 2212 + PPSMC_MSG_SCLKDPM_SetEnabledMask, 2213 + new_mask); 2269 2214 } 2270 2215 2271 2216 static int kv_set_enabled_levels(struct radeon_device *rdev)