diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 12 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 12 |
4 files changed, 30 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index cc8ad3831982..f4ac632a87b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
| @@ -1589,6 +1589,7 @@ static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | |||
| 1589 | { | 1589 | { |
| 1590 | int r = 0; | 1590 | int r = 0; |
| 1591 | int i; | 1591 | int i; |
| 1592 | uint32_t smu_version; | ||
| 1592 | 1593 | ||
| 1593 | if (adev->asic_type >= CHIP_VEGA10) { | 1594 | if (adev->asic_type >= CHIP_VEGA10) { |
| 1594 | for (i = 0; i < adev->num_ip_blocks; i++) { | 1595 | for (i = 0; i < adev->num_ip_blocks; i++) { |
| @@ -1614,16 +1615,9 @@ static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | |||
| 1614 | } | 1615 | } |
| 1615 | } | 1616 | } |
| 1616 | } | 1617 | } |
| 1618 | r = amdgpu_pm_load_smu_firmware(adev, &smu_version); | ||
| 1617 | 1619 | ||
| 1618 | if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->load_firmware) { | 1620 | return r; |
| 1619 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
| 1620 | if (r) { | ||
| 1621 | pr_err("firmware loading failed\n"); | ||
| 1622 | return r; | ||
| 1623 | } | ||
| 1624 | } | ||
| 1625 | |||
| 1626 | return 0; | ||
| 1627 | } | 1621 | } |
| 1628 | 1622 | ||
| 1629 | /** | 1623 | /** |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 34471dbaa872..039cfa2ec89d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | |||
| @@ -2490,6 +2490,21 @@ void amdgpu_pm_print_power_states(struct amdgpu_device *adev) | |||
| 2490 | 2490 | ||
| 2491 | } | 2491 | } |
| 2492 | 2492 | ||
| 2493 | int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version) | ||
| 2494 | { | ||
| 2495 | int r = -EINVAL; | ||
| 2496 | |||
| 2497 | if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->load_firmware) { | ||
| 2498 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
| 2499 | if (r) { | ||
| 2500 | pr_err("smu firmware loading failed\n"); | ||
| 2501 | return r; | ||
| 2502 | } | ||
| 2503 | *smu_version = adev->pm.fw_version; | ||
| 2504 | } | ||
| 2505 | return r; | ||
| 2506 | } | ||
| 2507 | |||
| 2493 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) | 2508 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) |
| 2494 | { | 2509 | { |
| 2495 | struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; | 2510 | struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; |
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h index f21a7716b90e..7ff0e7621fff 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h | |||
| @@ -34,6 +34,7 @@ void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev); | |||
| 34 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev); | 34 | int amdgpu_pm_sysfs_init(struct amdgpu_device *adev); |
| 35 | void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); | 35 | void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); |
| 36 | void amdgpu_pm_print_power_states(struct amdgpu_device *adev); | 36 | void amdgpu_pm_print_power_states(struct amdgpu_device *adev); |
| 37 | int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version); | ||
| 37 | void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); | 38 | void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); |
| 38 | void amdgpu_dpm_thermal_work_handler(struct work_struct *work); | 39 | void amdgpu_dpm_thermal_work_handler(struct work_struct *work); |
| 39 | void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable); | 40 | void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable); |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index ba67d1023264..b610e3b30d95 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include "soc15.h" | 28 | #include "soc15.h" |
| 29 | #include "soc15d.h" | 29 | #include "soc15d.h" |
| 30 | #include "amdgpu_atomfirmware.h" | 30 | #include "amdgpu_atomfirmware.h" |
| 31 | #include "amdgpu_pm.h" | ||
| 31 | 32 | ||
| 32 | #include "gc/gc_9_0_offset.h" | 33 | #include "gc/gc_9_0_offset.h" |
| 33 | #include "gc/gc_9_0_sh_mask.h" | 34 | #include "gc/gc_9_0_sh_mask.h" |
| @@ -96,6 +97,7 @@ MODULE_FIRMWARE("amdgpu/raven2_me.bin"); | |||
| 96 | MODULE_FIRMWARE("amdgpu/raven2_mec.bin"); | 97 | MODULE_FIRMWARE("amdgpu/raven2_mec.bin"); |
| 97 | MODULE_FIRMWARE("amdgpu/raven2_mec2.bin"); | 98 | MODULE_FIRMWARE("amdgpu/raven2_mec2.bin"); |
| 98 | MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); | 99 | MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); |
| 100 | MODULE_FIRMWARE("amdgpu/raven_kicker_rlc.bin"); | ||
| 99 | 101 | ||
| 100 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = | 102 | static const struct soc15_reg_golden golden_settings_gc_9_0[] = |
| 101 | { | 103 | { |
| @@ -588,7 +590,8 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev) | |||
| 588 | case CHIP_RAVEN: | 590 | case CHIP_RAVEN: |
| 589 | if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) | 591 | if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) |
| 590 | break; | 592 | break; |
| 591 | if ((adev->gfx.rlc_fw_version < 531) || | 593 | if ((adev->gfx.rlc_fw_version != 106 && |
| 594 | adev->gfx.rlc_fw_version < 531) || | ||
| 592 | (adev->gfx.rlc_fw_version == 53815) || | 595 | (adev->gfx.rlc_fw_version == 53815) || |
| 593 | (adev->gfx.rlc_feature_version < 1) || | 596 | (adev->gfx.rlc_feature_version < 1) || |
| 594 | !adev->gfx.rlc.is_rlc_v2_1) | 597 | !adev->gfx.rlc.is_rlc_v2_1) |
| @@ -612,6 +615,7 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) | |||
| 612 | unsigned int i = 0; | 615 | unsigned int i = 0; |
| 613 | uint16_t version_major; | 616 | uint16_t version_major; |
| 614 | uint16_t version_minor; | 617 | uint16_t version_minor; |
| 618 | uint32_t smu_version; | ||
| 615 | 619 | ||
| 616 | DRM_DEBUG("\n"); | 620 | DRM_DEBUG("\n"); |
| 617 | 621 | ||
| @@ -682,6 +686,12 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev) | |||
| 682 | (((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) || | 686 | (((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) || |
| 683 | ((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF)))) | 687 | ((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF)))) |
| 684 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc_am4.bin", chip_name); | 688 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc_am4.bin", chip_name); |
| 689 | else if (!strcmp(chip_name, "raven") && (amdgpu_pm_load_smu_firmware(adev, &smu_version) == 0) && | ||
| 690 | (smu_version >= 0x41e2b)) | ||
| 691 | /** | ||
| 692 | *SMC is loaded by SBIOS on APU and it's able to get the SMU version directly. | ||
| 693 | */ | ||
| 694 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_kicker_rlc.bin", chip_name); | ||
| 685 | else | 695 | else |
| 686 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); | 696 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); |
| 687 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); | 697 | err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev); |
