diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 71 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/kv_dpm.c | 135 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_family.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ucode.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_uvd.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_vce.c | 1 | ||||
| -rw-r--r-- | include/drm/drm_pciids.h | 16 |
11 files changed, 203 insertions, 31 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index b7983aaee445..c31c12b4e666 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1736,8 +1736,9 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc) | |||
| 1736 | } | 1736 | } |
| 1737 | /* otherwise, pick one of the plls */ | 1737 | /* otherwise, pick one of the plls */ |
| 1738 | if ((rdev->family == CHIP_KAVERI) || | 1738 | if ((rdev->family == CHIP_KAVERI) || |
| 1739 | (rdev->family == CHIP_KABINI)) { | 1739 | (rdev->family == CHIP_KABINI) || |
| 1740 | /* KB/KV has PPLL1 and PPLL2 */ | 1740 | (rdev->family == CHIP_MULLINS)) { |
| 1741 | /* KB/KV/ML has PPLL1 and PPLL2 */ | ||
| 1741 | pll_in_use = radeon_get_pll_use_mask(crtc); | 1742 | pll_in_use = radeon_get_pll_use_mask(crtc); |
| 1742 | if (!(pll_in_use & (1 << ATOM_PPLL2))) | 1743 | if (!(pll_in_use & (1 << ATOM_PPLL2))) |
| 1743 | return ATOM_PPLL2; | 1744 | return ATOM_PPLL2; |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 5143e0bf2172..d2fd98968085 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
| @@ -63,6 +63,12 @@ MODULE_FIRMWARE("radeon/KABINI_ce.bin"); | |||
| 63 | MODULE_FIRMWARE("radeon/KABINI_mec.bin"); | 63 | MODULE_FIRMWARE("radeon/KABINI_mec.bin"); |
| 64 | MODULE_FIRMWARE("radeon/KABINI_rlc.bin"); | 64 | MODULE_FIRMWARE("radeon/KABINI_rlc.bin"); |
| 65 | MODULE_FIRMWARE("radeon/KABINI_sdma.bin"); | 65 | MODULE_FIRMWARE("radeon/KABINI_sdma.bin"); |
| 66 | MODULE_FIRMWARE("radeon/MULLINS_pfp.bin"); | ||
| 67 | MODULE_FIRMWARE("radeon/MULLINS_me.bin"); | ||
| 68 | MODULE_FIRMWARE("radeon/MULLINS_ce.bin"); | ||
| 69 | MODULE_FIRMWARE("radeon/MULLINS_mec.bin"); | ||
| 70 | MODULE_FIRMWARE("radeon/MULLINS_rlc.bin"); | ||
| 71 | MODULE_FIRMWARE("radeon/MULLINS_sdma.bin"); | ||
| 66 | 72 | ||
| 67 | extern int r600_ih_ring_alloc(struct radeon_device *rdev); | 73 | extern int r600_ih_ring_alloc(struct radeon_device *rdev); |
| 68 | extern void r600_ih_ring_fini(struct radeon_device *rdev); | 74 | extern void r600_ih_ring_fini(struct radeon_device *rdev); |
| @@ -1473,6 +1479,43 @@ static const u32 hawaii_mgcg_cgcg_init[] = | |||
| 1473 | 0xd80c, 0xff000ff0, 0x00000100 | 1479 | 0xd80c, 0xff000ff0, 0x00000100 |
| 1474 | }; | 1480 | }; |
| 1475 | 1481 | ||
| 1482 | static const u32 godavari_golden_registers[] = | ||
| 1483 | { | ||
| 1484 | 0x55e4, 0xff607fff, 0xfc000100, | ||
| 1485 | 0x6ed8, 0x00010101, 0x00010000, | ||
| 1486 | 0x9830, 0xffffffff, 0x00000000, | ||
| 1487 | 0x98302, 0xf00fffff, 0x00000400, | ||
| 1488 | 0x6130, 0xffffffff, 0x00010000, | ||
| 1489 | 0x5bb0, 0x000000f0, 0x00000070, | ||
| 1490 | 0x5bc0, 0xf0311fff, 0x80300000, | ||
| 1491 | 0x98f8, 0x73773777, 0x12010001, | ||
| 1492 | 0x98fc, 0xffffffff, 0x00000010, | ||
| 1493 | 0x8030, 0x00001f0f, 0x0000100a, | ||
| 1494 | 0x2f48, 0x73773777, 0x12010001, | ||
| 1495 | 0x2408, 0x000fffff, 0x000c007f, | ||
| 1496 | 0x8a14, 0xf000003f, 0x00000007, | ||
| 1497 | 0x8b24, 0xffffffff, 0x00ff0fff, | ||
| 1498 | 0x30a04, 0x0000ff0f, 0x00000000, | ||
| 1499 | 0x28a4c, 0x07ffffff, 0x06000000, | ||
| 1500 | 0x4d8, 0x00000fff, 0x00000100, | ||
| 1501 | 0xd014, 0x00010000, 0x00810001, | ||
| 1502 | 0xd814, 0x00010000, 0x00810001, | ||
| 1503 | 0x3e78, 0x00000001, 0x00000002, | ||
| 1504 | 0xc768, 0x00000008, 0x00000008, | ||
| 1505 | 0xc770, 0x00000f00, 0x00000800, | ||
| 1506 | 0xc774, 0x00000f00, 0x00000800, | ||
| 1507 | 0xc798, 0x00ffffff, 0x00ff7fbf, | ||
| 1508 | 0xc79c, 0x00ffffff, 0x00ff7faf, | ||
| 1509 | 0x8c00, 0x000000ff, 0x00000001, | ||
| 1510 | 0x214f8, 0x01ff01ff, 0x00000002, | ||
| 1511 | 0x21498, 0x007ff800, 0x00200000, | ||
| 1512 | 0x2015c, 0xffffffff, 0x00000f40, | ||
| 1513 | 0x88c4, 0x001f3ae3, 0x00000082, | ||
| 1514 | 0x88d4, 0x0000001f, 0x00000010, | ||
| 1515 | 0x30934, 0xffffffff, 0x00000000 | ||
| 1516 | }; | ||
| 1517 | |||
| 1518 | |||
| 1476 | static void cik_init_golden_registers(struct radeon_device *rdev) | 1519 | static void cik_init_golden_registers(struct radeon_device *rdev) |
| 1477 | { | 1520 | { |
| 1478 | switch (rdev->family) { | 1521 | switch (rdev->family) { |
| @@ -1504,6 +1547,20 @@ static void cik_init_golden_registers(struct radeon_device *rdev) | |||
| 1504 | kalindi_golden_spm_registers, | 1547 | kalindi_golden_spm_registers, |
| 1505 | (const u32)ARRAY_SIZE(kalindi_golden_spm_registers)); | 1548 | (const u32)ARRAY_SIZE(kalindi_golden_spm_registers)); |
| 1506 | break; | 1549 | break; |
| 1550 | case CHIP_MULLINS: | ||
| 1551 | radeon_program_register_sequence(rdev, | ||
| 1552 | kalindi_mgcg_cgcg_init, | ||
| 1553 | (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init)); | ||
| 1554 | radeon_program_register_sequence(rdev, | ||
| 1555 | godavari_golden_registers, | ||
| 1556 | (const u32)ARRAY_SIZE(godavari_golden_registers)); | ||
| 1557 | radeon_program_register_sequence(rdev, | ||
| 1558 | kalindi_golden_common_registers, | ||
| 1559 | (const u32)ARRAY_SIZE(kalindi_golden_common_registers)); | ||
| 1560 | radeon_program_register_sequence(rdev, | ||
| 1561 | kalindi_golden_spm_registers, | ||
| 1562 | (const u32)ARRAY_SIZE(kalindi_golden_spm_registers)); | ||
| 1563 | break; | ||
| 1507 | case CHIP_KAVERI: | 1564 | case CHIP_KAVERI: |
| 1508 | radeon_program_register_sequence(rdev, | 1565 | radeon_program_register_sequence(rdev, |
| 1509 | spectre_mgcg_cgcg_init, | 1566 | spectre_mgcg_cgcg_init, |
| @@ -1834,6 +1891,15 @@ static int cik_init_microcode(struct radeon_device *rdev) | |||
| 1834 | rlc_req_size = KB_RLC_UCODE_SIZE * 4; | 1891 | rlc_req_size = KB_RLC_UCODE_SIZE * 4; |
| 1835 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | 1892 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
| 1836 | break; | 1893 | break; |
| 1894 | case CHIP_MULLINS: | ||
| 1895 | chip_name = "MULLINS"; | ||
| 1896 | pfp_req_size = CIK_PFP_UCODE_SIZE * 4; | ||
| 1897 | me_req_size = CIK_ME_UCODE_SIZE * 4; | ||
| 1898 | ce_req_size = CIK_CE_UCODE_SIZE * 4; | ||
| 1899 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; | ||
| 1900 | rlc_req_size = ML_RLC_UCODE_SIZE * 4; | ||
| 1901 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; | ||
| 1902 | break; | ||
| 1837 | default: BUG(); | 1903 | default: BUG(); |
| 1838 | } | 1904 | } |
| 1839 | 1905 | ||
| @@ -3272,6 +3338,7 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
| 3272 | gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; | 3338 | gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN; |
| 3273 | break; | 3339 | break; |
| 3274 | case CHIP_KABINI: | 3340 | case CHIP_KABINI: |
| 3341 | case CHIP_MULLINS: | ||
| 3275 | default: | 3342 | default: |
| 3276 | rdev->config.cik.max_shader_engines = 1; | 3343 | rdev->config.cik.max_shader_engines = 1; |
| 3277 | rdev->config.cik.max_tile_pipes = 2; | 3344 | rdev->config.cik.max_tile_pipes = 2; |
| @@ -5801,6 +5868,9 @@ static int cik_rlc_resume(struct radeon_device *rdev) | |||
| 5801 | case CHIP_KABINI: | 5868 | case CHIP_KABINI: |
| 5802 | size = KB_RLC_UCODE_SIZE; | 5869 | size = KB_RLC_UCODE_SIZE; |
| 5803 | break; | 5870 | break; |
| 5871 | case CHIP_MULLINS: | ||
| 5872 | size = ML_RLC_UCODE_SIZE; | ||
| 5873 | break; | ||
| 5804 | } | 5874 | } |
| 5805 | 5875 | ||
| 5806 | cik_rlc_stop(rdev); | 5876 | cik_rlc_stop(rdev); |
| @@ -6549,6 +6619,7 @@ void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer) | |||
| 6549 | buffer[count++] = cpu_to_le32(0x00000000); | 6619 | buffer[count++] = cpu_to_le32(0x00000000); |
| 6550 | break; | 6620 | break; |
| 6551 | case CHIP_KABINI: | 6621 | case CHIP_KABINI: |
| 6622 | case CHIP_MULLINS: | ||
| 6552 | buffer[count++] = cpu_to_le32(0x00000000); /* XXX */ | 6623 | buffer[count++] = cpu_to_le32(0x00000000); /* XXX */ |
| 6553 | buffer[count++] = cpu_to_le32(0x00000000); | 6624 | buffer[count++] = cpu_to_le32(0x00000000); |
| 6554 | break; | 6625 | break; |
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c index 16ec9d56a234..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 | } |
| @@ -639,7 +685,7 @@ static int kv_force_lowest_valid(struct radeon_device *rdev) | |||
| 639 | 685 | ||
| 640 | static int kv_unforce_levels(struct radeon_device *rdev) | 686 | static int kv_unforce_levels(struct radeon_device *rdev) |
| 641 | { | 687 | { |
| 642 | if (rdev->family == CHIP_KABINI) | 688 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) |
| 643 | return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel); | 689 | return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel); |
| 644 | else | 690 | else |
| 645 | return kv_set_enabled_levels(rdev); | 691 | return kv_set_enabled_levels(rdev); |
| @@ -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); |
| @@ -1617,7 +1668,7 @@ static void kv_dpm_powergate_acp(struct radeon_device *rdev, bool gate) | |||
| 1617 | if (pi->acp_power_gated == gate) | 1668 | if (pi->acp_power_gated == gate) |
| 1618 | return; | 1669 | return; |
| 1619 | 1670 | ||
| 1620 | if (rdev->family == CHIP_KABINI) | 1671 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) |
| 1621 | return; | 1672 | return; |
| 1622 | 1673 | ||
| 1623 | pi->acp_power_gated = gate; | 1674 | pi->acp_power_gated = gate; |
| @@ -1786,7 +1837,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev) | |||
| 1786 | } | 1837 | } |
| 1787 | } | 1838 | } |
| 1788 | 1839 | ||
| 1789 | if (rdev->family == CHIP_KABINI) { | 1840 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) { |
| 1790 | if (pi->enable_dpm) { | 1841 | if (pi->enable_dpm) { |
| 1791 | kv_set_valid_clock_range(rdev, new_ps); | 1842 | kv_set_valid_clock_range(rdev, new_ps); |
| 1792 | kv_update_dfs_bypass_settings(rdev, new_ps); | 1843 | kv_update_dfs_bypass_settings(rdev, new_ps); |
| @@ -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) { |
| @@ -1862,7 +1915,7 @@ void kv_dpm_reset_asic(struct radeon_device *rdev) | |||
| 1862 | { | 1915 | { |
| 1863 | struct kv_power_info *pi = kv_get_pi(rdev); | 1916 | struct kv_power_info *pi = kv_get_pi(rdev); |
| 1864 | 1917 | ||
| 1865 | if (rdev->family == CHIP_KABINI) { | 1918 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) { |
| 1866 | kv_force_lowest_valid(rdev); | 1919 | kv_force_lowest_valid(rdev); |
| 1867 | kv_init_graphics_levels(rdev); | 1920 | kv_init_graphics_levels(rdev); |
| 1868 | kv_program_bootup_state(rdev); | 1921 | kv_program_bootup_state(rdev); |
| @@ -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; | ||
| 1906 | 1965 | ||
| 1907 | if (table->count) { | 1966 | if (uvd_table->count) { |
| 1908 | for (i = 0; i < table->count; i++) | 1967 | for (i = 0; i < uvd_table->count; i++) |
| 1909 | table->entries[i].v = | 1968 | uvd_table->entries[i].v = |
| 1910 | kv_convert_8bit_index_to_voltage(rdev, | 1969 | kv_convert_8bit_index_to_voltage(rdev, |
| 1911 | table->entries[i].v); | 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 | } | ||
| 1979 | |||
| 1980 | if (samu_table->count) { | ||
| 1981 | for (i = 0; i < samu_table->count; i++) | ||
| 1982 | samu_table->entries[i].v = | ||
| 1983 | kv_convert_8bit_index_to_voltage(rdev, | ||
| 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 | } |
| @@ -1941,7 +2021,7 @@ static int kv_force_dpm_highest(struct radeon_device *rdev) | |||
| 1941 | break; | 2021 | break; |
| 1942 | } | 2022 | } |
| 1943 | 2023 | ||
| 1944 | if (rdev->family == CHIP_KABINI) | 2024 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) |
| 1945 | return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); | 2025 | return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); |
| 1946 | else | 2026 | else |
| 1947 | return kv_set_enabled_level(rdev, i); | 2027 | return kv_set_enabled_level(rdev, i); |
| @@ -1961,7 +2041,7 @@ static int kv_force_dpm_lowest(struct radeon_device *rdev) | |||
| 1961 | break; | 2041 | break; |
| 1962 | } | 2042 | } |
| 1963 | 2043 | ||
| 1964 | if (rdev->family == CHIP_KABINI) | 2044 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) |
| 1965 | return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); | 2045 | return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i); |
| 1966 | else | 2046 | else |
| 1967 | return kv_set_enabled_level(rdev, i); | 2047 | return kv_set_enabled_level(rdev, i); |
| @@ -2118,7 +2198,7 @@ static void kv_apply_state_adjust_rules(struct radeon_device *rdev, | |||
| 2118 | else | 2198 | else |
| 2119 | pi->battery_state = false; | 2199 | pi->battery_state = false; |
| 2120 | 2200 | ||
| 2121 | if (rdev->family == CHIP_KABINI) { | 2201 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) { |
| 2122 | ps->dpm0_pg_nb_ps_lo = 0x1; | 2202 | ps->dpm0_pg_nb_ps_lo = 0x1; |
| 2123 | ps->dpm0_pg_nb_ps_hi = 0x0; | 2203 | ps->dpm0_pg_nb_ps_hi = 0x0; |
| 2124 | ps->dpmx_nb_ps_lo = 0x1; | 2204 | ps->dpmx_nb_ps_lo = 0x1; |
| @@ -2179,7 +2259,7 @@ static int kv_calculate_nbps_level_settings(struct radeon_device *rdev) | |||
| 2179 | if (pi->lowest_valid > pi->highest_valid) | 2259 | if (pi->lowest_valid > pi->highest_valid) |
| 2180 | return -EINVAL; | 2260 | return -EINVAL; |
| 2181 | 2261 | ||
| 2182 | if (rdev->family == CHIP_KABINI) { | 2262 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) { |
| 2183 | for (i = pi->lowest_valid; i <= pi->highest_valid; i++) { | 2263 | for (i = pi->lowest_valid; i <= pi->highest_valid; i++) { |
| 2184 | pi->graphics_level[i].GnbSlow = 1; | 2264 | pi->graphics_level[i].GnbSlow = 1; |
| 2185 | pi->graphics_level[i].ForceNbPs1 = 0; | 2265 | pi->graphics_level[i].ForceNbPs1 = 0; |
| @@ -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); |
| @@ -2324,7 +2404,7 @@ static void kv_program_nbps_index_settings(struct radeon_device *rdev, | |||
| 2324 | struct kv_power_info *pi = kv_get_pi(rdev); | 2404 | struct kv_power_info *pi = kv_get_pi(rdev); |
| 2325 | u32 nbdpmconfig1; | 2405 | u32 nbdpmconfig1; |
| 2326 | 2406 | ||
| 2327 | if (rdev->family == CHIP_KABINI) | 2407 | if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) |
| 2328 | return; | 2408 | return; |
| 2329 | 2409 | ||
| 2330 | if (pi->sys_info.nb_dpm_enable) { | 2410 | if (pi->sys_info.nb_dpm_enable) { |
| @@ -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) | ||
| 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; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index b8a24a75d4ff..be20e62dac83 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -2516,6 +2516,7 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
| 2516 | break; | 2516 | break; |
| 2517 | case CHIP_KAVERI: | 2517 | case CHIP_KAVERI: |
| 2518 | case CHIP_KABINI: | 2518 | case CHIP_KABINI: |
| 2519 | case CHIP_MULLINS: | ||
| 2519 | rdev->asic = &kv_asic; | 2520 | rdev->asic = &kv_asic; |
| 2520 | /* set num crtcs */ | 2521 | /* set num crtcs */ |
| 2521 | if (rdev->family == CHIP_KAVERI) { | 2522 | if (rdev->family == CHIP_KAVERI) { |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 511fe26198e4..0e770bbf7e29 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -99,6 +99,7 @@ static const char radeon_family_name[][16] = { | |||
| 99 | "KAVERI", | 99 | "KAVERI", |
| 100 | "KABINI", | 100 | "KABINI", |
| 101 | "HAWAII", | 101 | "HAWAII", |
| 102 | "MULLINS", | ||
| 102 | "LAST", | 103 | "LAST", |
| 103 | }; | 104 | }; |
| 104 | 105 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_family.h b/drivers/gpu/drm/radeon/radeon_family.h index 9da5da4ffd17..4b7b87f71a63 100644 --- a/drivers/gpu/drm/radeon/radeon_family.h +++ b/drivers/gpu/drm/radeon/radeon_family.h | |||
| @@ -97,6 +97,7 @@ enum radeon_family { | |||
| 97 | CHIP_KAVERI, | 97 | CHIP_KAVERI, |
| 98 | CHIP_KABINI, | 98 | CHIP_KABINI, |
| 99 | CHIP_HAWAII, | 99 | CHIP_HAWAII, |
| 100 | CHIP_MULLINS, | ||
| 100 | CHIP_LAST, | 101 | CHIP_LAST, |
| 101 | }; | 102 | }; |
| 102 | 103 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 6fac8efe8340..f30b8426eee2 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -1300,6 +1300,7 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
| 1300 | case CHIP_KABINI: | 1300 | case CHIP_KABINI: |
| 1301 | case CHIP_KAVERI: | 1301 | case CHIP_KAVERI: |
| 1302 | case CHIP_HAWAII: | 1302 | case CHIP_HAWAII: |
| 1303 | case CHIP_MULLINS: | ||
| 1303 | /* DPM requires the RLC, RV770+ dGPU requires SMC */ | 1304 | /* DPM requires the RLC, RV770+ dGPU requires SMC */ |
| 1304 | if (!rdev->rlc_fw) | 1305 | if (!rdev->rlc_fw) |
| 1305 | rdev->pm.pm_method = PM_METHOD_PROFILE; | 1306 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h index 58d12938c0b8..4e7c3269b183 100644 --- a/drivers/gpu/drm/radeon/radeon_ucode.h +++ b/drivers/gpu/drm/radeon/radeon_ucode.h | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | #define BONAIRE_RLC_UCODE_SIZE 2048 | 52 | #define BONAIRE_RLC_UCODE_SIZE 2048 |
| 53 | #define KB_RLC_UCODE_SIZE 2560 | 53 | #define KB_RLC_UCODE_SIZE 2560 |
| 54 | #define KV_RLC_UCODE_SIZE 2560 | 54 | #define KV_RLC_UCODE_SIZE 2560 |
| 55 | #define ML_RLC_UCODE_SIZE 2560 | ||
| 55 | 56 | ||
| 56 | /* MC */ | 57 | /* MC */ |
| 57 | #define BTC_MC_UCODE_SIZE 6024 | 58 | #define BTC_MC_UCODE_SIZE 6024 |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index 0f96c471c6d8..1b65ae2433cd 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
| @@ -99,6 +99,7 @@ int radeon_uvd_init(struct radeon_device *rdev) | |||
| 99 | case CHIP_KABINI: | 99 | case CHIP_KABINI: |
| 100 | case CHIP_KAVERI: | 100 | case CHIP_KAVERI: |
| 101 | case CHIP_HAWAII: | 101 | case CHIP_HAWAII: |
| 102 | case CHIP_MULLINS: | ||
| 102 | fw_name = FIRMWARE_BONAIRE; | 103 | fw_name = FIRMWARE_BONAIRE; |
| 103 | break; | 104 | break; |
| 104 | 105 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c index ced53dd03e7c..f73324c81491 100644 --- a/drivers/gpu/drm/radeon/radeon_vce.c +++ b/drivers/gpu/drm/radeon/radeon_vce.c | |||
| @@ -66,6 +66,7 @@ int radeon_vce_init(struct radeon_device *rdev) | |||
| 66 | case CHIP_BONAIRE: | 66 | case CHIP_BONAIRE: |
| 67 | case CHIP_KAVERI: | 67 | case CHIP_KAVERI: |
| 68 | case CHIP_KABINI: | 68 | case CHIP_KABINI: |
| 69 | case CHIP_MULLINS: | ||
| 69 | fw_name = FIRMWARE_BONAIRE; | 70 | fw_name = FIRMWARE_BONAIRE; |
| 70 | break; | 71 | break; |
| 71 | 72 | ||
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 49376aec2fbb..6dfd64b3a604 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -637,6 +637,22 @@ | |||
| 637 | {0x1002, 0x983d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 637 | {0x1002, 0x983d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 638 | {0x1002, 0x983e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 638 | {0x1002, 0x983e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 639 | {0x1002, 0x983f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 639 | {0x1002, 0x983f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 640 | {0x1002, 0x9850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 641 | {0x1002, 0x9851, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 642 | {0x1002, 0x9852, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 643 | {0x1002, 0x9853, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 644 | {0x1002, 0x9854, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 645 | {0x1002, 0x9855, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 646 | {0x1002, 0x9856, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 647 | {0x1002, 0x9857, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 648 | {0x1002, 0x9858, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 649 | {0x1002, 0x9859, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 650 | {0x1002, 0x985A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 651 | {0x1002, 0x985B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 652 | {0x1002, 0x985C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 653 | {0x1002, 0x985D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 654 | {0x1002, 0x985E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 655 | {0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | ||
| 640 | {0x1002, 0x9900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 656 | {0x1002, 0x9900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 641 | {0x1002, 0x9901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 657 | {0x1002, 0x9901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
| 642 | {0x1002, 0x9903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ | 658 | {0x1002, 0x9903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \ |
