diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/kv_dpm.c | 117 |
1 files changed, 97 insertions, 20 deletions
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c index 6666370e58fa..3f6e817d97ee 100644 --- a/drivers/gpu/drm/radeon/kv_dpm.c +++ b/drivers/gpu/drm/radeon/kv_dpm.c | |||
| @@ -546,6 +546,52 @@ static int kv_set_divider_value(struct radeon_device *rdev, | |||
| 546 | return 0; | 546 | return 0; |
| 547 | } | 547 | } |
| 548 | 548 | ||
| 549 | static u32 kv_convert_vid2_to_vid7(struct radeon_device *rdev, | ||
| 550 | struct sumo_vid_mapping_table *vid_mapping_table, | ||
| 551 | u32 vid_2bit) | ||
| 552 | { | ||
| 553 | struct radeon_clock_voltage_dependency_table *vddc_sclk_table = | ||
| 554 | &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk; | ||
| 555 | u32 i; | ||
| 556 | |||
| 557 | if (vddc_sclk_table && vddc_sclk_table->count) { | ||
| 558 | if (vid_2bit < vddc_sclk_table->count) | ||
| 559 | return vddc_sclk_table->entries[vid_2bit].v; | ||
| 560 | else | ||
| 561 | return vddc_sclk_table->entries[vddc_sclk_table->count - 1].v; | ||
| 562 | } else { | ||
| 563 | for (i = 0; i < vid_mapping_table->num_entries; i++) { | ||
| 564 | if (vid_mapping_table->entries[i].vid_2bit == vid_2bit) | ||
| 565 | return vid_mapping_table->entries[i].vid_7bit; | ||
| 566 | } | ||
| 567 | return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_7bit; | ||
| 568 | } | ||
| 569 | } | ||
| 570 | |||
| 571 | static u32 kv_convert_vid7_to_vid2(struct radeon_device *rdev, | ||
| 572 | struct sumo_vid_mapping_table *vid_mapping_table, | ||
| 573 | u32 vid_7bit) | ||
| 574 | { | ||
| 575 | struct radeon_clock_voltage_dependency_table *vddc_sclk_table = | ||
| 576 | &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk; | ||
| 577 | u32 i; | ||
| 578 | |||
| 579 | if (vddc_sclk_table && vddc_sclk_table->count) { | ||
| 580 | for (i = 0; i < vddc_sclk_table->count; i++) { | ||
| 581 | if (vddc_sclk_table->entries[i].v == vid_7bit) | ||
| 582 | return i; | ||
| 583 | } | ||
| 584 | return vddc_sclk_table->count - 1; | ||
| 585 | } else { | ||
| 586 | for (i = 0; i < vid_mapping_table->num_entries; i++) { | ||
| 587 | if (vid_mapping_table->entries[i].vid_7bit == vid_7bit) | ||
| 588 | return vid_mapping_table->entries[i].vid_2bit; | ||
| 589 | } | ||
| 590 | |||
| 591 | return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_2bit; | ||
| 592 | } | ||
| 593 | } | ||
| 594 | |||
| 549 | static u16 kv_convert_8bit_index_to_voltage(struct radeon_device *rdev, | 595 | static u16 kv_convert_8bit_index_to_voltage(struct radeon_device *rdev, |
| 550 | u16 voltage) | 596 | u16 voltage) |
| 551 | { | 597 | { |
| @@ -556,9 +602,9 @@ static u16 kv_convert_2bit_index_to_voltage(struct radeon_device *rdev, | |||
| 556 | u32 vid_2bit) | 602 | u32 vid_2bit) |
| 557 | { | 603 | { |
| 558 | struct kv_power_info *pi = kv_get_pi(rdev); | 604 | struct kv_power_info *pi = kv_get_pi(rdev); |
| 559 | u32 vid_8bit = sumo_convert_vid2_to_vid7(rdev, | 605 | u32 vid_8bit = kv_convert_vid2_to_vid7(rdev, |
| 560 | &pi->sys_info.vid_mapping_table, | 606 | &pi->sys_info.vid_mapping_table, |
| 561 | vid_2bit); | 607 | vid_2bit); |
| 562 | 608 | ||
| 563 | return kv_convert_8bit_index_to_voltage(rdev, (u16)vid_8bit); | 609 | return kv_convert_8bit_index_to_voltage(rdev, (u16)vid_8bit); |
| 564 | } | 610 | } |
| @@ -1362,13 +1408,20 @@ static int kv_update_uvd_dpm(struct radeon_device *rdev, bool gate) | |||
| 1362 | struct radeon_uvd_clock_voltage_dependency_table *table = | 1408 | struct radeon_uvd_clock_voltage_dependency_table *table = |
| 1363 | &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table; | 1409 | &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table; |
| 1364 | int ret; | 1410 | int ret; |
| 1411 | u32 mask; | ||
| 1365 | 1412 | ||
| 1366 | if (!gate) { | 1413 | if (!gate) { |
| 1367 | if (!pi->caps_uvd_dpm || table->count || pi->caps_stable_p_state) | 1414 | if (table->count) |
| 1368 | pi->uvd_boot_level = table->count - 1; | 1415 | pi->uvd_boot_level = table->count - 1; |
| 1369 | else | 1416 | else |
| 1370 | pi->uvd_boot_level = 0; | 1417 | pi->uvd_boot_level = 0; |
| 1371 | 1418 | ||
| 1419 | if (!pi->caps_uvd_dpm || pi->caps_stable_p_state) { | ||
| 1420 | mask = 1 << pi->uvd_boot_level; | ||
| 1421 | } else { | ||
| 1422 | mask = 0x1f; | ||
| 1423 | } | ||
| 1424 | |||
| 1372 | ret = kv_copy_bytes_to_smc(rdev, | 1425 | ret = kv_copy_bytes_to_smc(rdev, |
| 1373 | pi->dpm_table_start + | 1426 | pi->dpm_table_start + |
| 1374 | offsetof(SMU7_Fusion_DpmTable, UvdBootLevel), | 1427 | offsetof(SMU7_Fusion_DpmTable, UvdBootLevel), |
| @@ -1377,11 +1430,9 @@ static int kv_update_uvd_dpm(struct radeon_device *rdev, bool gate) | |||
| 1377 | if (ret) | 1430 | if (ret) |
| 1378 | return ret; | 1431 | return ret; |
| 1379 | 1432 | ||
| 1380 | if (!pi->caps_uvd_dpm || | 1433 | kv_send_msg_to_smc_with_parameter(rdev, |
| 1381 | pi->caps_stable_p_state) | 1434 | PPSMC_MSG_UVDDPM_SetEnabledMask, |
| 1382 | kv_send_msg_to_smc_with_parameter(rdev, | 1435 | mask); |
| 1383 | PPSMC_MSG_UVDDPM_SetEnabledMask, | ||
| 1384 | (1 << pi->uvd_boot_level)); | ||
| 1385 | } | 1436 | } |
| 1386 | 1437 | ||
| 1387 | return kv_enable_uvd_dpm(rdev, !gate); | 1438 | return kv_enable_uvd_dpm(rdev, !gate); |
| @@ -1812,6 +1863,8 @@ int kv_dpm_set_power_state(struct radeon_device *rdev) | |||
| 1812 | return ret; | 1863 | return ret; |
| 1813 | } | 1864 | } |
| 1814 | kv_update_sclk_t(rdev); | 1865 | kv_update_sclk_t(rdev); |
| 1866 | if (rdev->family == CHIP_MULLINS) | ||
| 1867 | kv_enable_nb_dpm(rdev); | ||
| 1815 | } | 1868 | } |
| 1816 | } else { | 1869 | } else { |
| 1817 | if (pi->enable_dpm) { | 1870 | if (pi->enable_dpm) { |
| @@ -1901,14 +1954,41 @@ static void kv_construct_max_power_limits_table(struct radeon_device *rdev, | |||
| 1901 | static void kv_patch_voltage_values(struct radeon_device *rdev) | 1954 | static void kv_patch_voltage_values(struct radeon_device *rdev) |
| 1902 | { | 1955 | { |
| 1903 | int i; | 1956 | int i; |
| 1904 | struct radeon_uvd_clock_voltage_dependency_table *table = | 1957 | struct radeon_uvd_clock_voltage_dependency_table *uvd_table = |
| 1905 | &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table; | 1958 | &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table; |
| 1959 | struct radeon_vce_clock_voltage_dependency_table *vce_table = | ||
| 1960 | &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table; | ||
| 1961 | struct radeon_clock_voltage_dependency_table *samu_table = | ||
| 1962 | &rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table; | ||
| 1963 | struct radeon_clock_voltage_dependency_table *acp_table = | ||
| 1964 | &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table; | ||
| 1965 | |||
| 1966 | if (uvd_table->count) { | ||
| 1967 | for (i = 0; i < uvd_table->count; i++) | ||
| 1968 | uvd_table->entries[i].v = | ||
| 1969 | kv_convert_8bit_index_to_voltage(rdev, | ||
| 1970 | uvd_table->entries[i].v); | ||
| 1971 | } | ||
| 1972 | |||
| 1973 | if (vce_table->count) { | ||
| 1974 | for (i = 0; i < vce_table->count; i++) | ||
| 1975 | vce_table->entries[i].v = | ||
| 1976 | kv_convert_8bit_index_to_voltage(rdev, | ||
| 1977 | vce_table->entries[i].v); | ||
| 1978 | } | ||
| 1906 | 1979 | ||
| 1907 | if (table->count) { | 1980 | if (samu_table->count) { |
| 1908 | for (i = 0; i < table->count; i++) | 1981 | for (i = 0; i < samu_table->count; i++) |
| 1909 | table->entries[i].v = | 1982 | samu_table->entries[i].v = |
| 1910 | kv_convert_8bit_index_to_voltage(rdev, | 1983 | kv_convert_8bit_index_to_voltage(rdev, |
| 1911 | table->entries[i].v); | 1984 | samu_table->entries[i].v); |
| 1985 | } | ||
| 1986 | |||
| 1987 | if (acp_table->count) { | ||
| 1988 | for (i = 0; i < acp_table->count; i++) | ||
| 1989 | acp_table->entries[i].v = | ||
| 1990 | kv_convert_8bit_index_to_voltage(rdev, | ||
| 1991 | acp_table->entries[i].v); | ||
| 1912 | } | 1992 | } |
| 1913 | 1993 | ||
| 1914 | } | 1994 | } |
| @@ -2253,9 +2333,9 @@ static void kv_init_graphics_levels(struct radeon_device *rdev) | |||
| 2253 | break; | 2333 | break; |
| 2254 | 2334 | ||
| 2255 | kv_set_divider_value(rdev, i, table->entries[i].clk); | 2335 | kv_set_divider_value(rdev, i, table->entries[i].clk); |
| 2256 | vid_2bit = sumo_convert_vid7_to_vid2(rdev, | 2336 | vid_2bit = kv_convert_vid7_to_vid2(rdev, |
| 2257 | &pi->sys_info.vid_mapping_table, | 2337 | &pi->sys_info.vid_mapping_table, |
| 2258 | table->entries[i].v); | 2338 | table->entries[i].v); |
| 2259 | kv_set_vid(rdev, i, vid_2bit); | 2339 | kv_set_vid(rdev, i, vid_2bit); |
| 2260 | kv_set_at(rdev, i, pi->at[i]); | 2340 | kv_set_at(rdev, i, pi->at[i]); |
| 2261 | kv_dpm_power_level_enabled_for_throttle(rdev, i, true); | 2341 | kv_dpm_power_level_enabled_for_throttle(rdev, i, true); |
| @@ -2631,9 +2711,6 @@ int kv_dpm_init(struct radeon_device *rdev) | |||
| 2631 | 2711 | ||
| 2632 | pi->sram_end = SMC_RAM_END; | 2712 | pi->sram_end = SMC_RAM_END; |
| 2633 | 2713 | ||
| 2634 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) | ||
| 2635 | pi->high_voltage_t = 4001; | ||
| 2636 | |||
| 2637 | pi->enable_nb_dpm = true; | 2714 | pi->enable_nb_dpm = true; |
| 2638 | 2715 | ||
| 2639 | pi->caps_power_containment = true; | 2716 | pi->caps_power_containment = true; |
