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

Merge branch 'drm-fixes-5.2' of git://people.freedesktop.org/~agd5f/linux into drm-fixes

- A fix to make VCE resume more reliable
- Updates for new raven variants

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexdeucher@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190605182332.4073-1-alexander.deucher@amd.com

+63 -14
+3 -9
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 1589 1589 { 1590 1590 int r = 0; 1591 1591 int i; 1592 + uint32_t smu_version; 1592 1593 1593 1594 if (adev->asic_type >= CHIP_VEGA10) { 1594 1595 for (i = 0; i < adev->num_ip_blocks; i++) { ··· 1615 1614 } 1616 1615 } 1617 1616 } 1617 + r = amdgpu_pm_load_smu_firmware(adev, &smu_version); 1618 1618 1619 - if (adev->powerplay.pp_funcs && adev->powerplay.pp_funcs->load_firmware) { 1620 - r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); 1621 - if (r) { 1622 - pr_err("firmware loading failed\n"); 1623 - return r; 1624 - } 1625 - } 1626 - 1627 - return 0; 1619 + return r; 1628 1620 } 1629 1621 1630 1622 /**
+15
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 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 2508 int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) 2494 2509 { 2495 2510 struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h
··· 34 34 int amdgpu_pm_sysfs_init(struct amdgpu_device *adev); 35 35 void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); 36 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 38 void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); 38 39 void amdgpu_dpm_thermal_work_handler(struct work_struct *work); 39 40 void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable);
+3 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 1072 1072 int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring) 1073 1073 { 1074 1074 struct amdgpu_device *adev = ring->adev; 1075 - uint32_t rptr = amdgpu_ring_get_rptr(ring); 1075 + uint32_t rptr; 1076 1076 unsigned i; 1077 1077 int r, timeout = adev->usec_timeout; 1078 1078 ··· 1083 1083 r = amdgpu_ring_alloc(ring, 16); 1084 1084 if (r) 1085 1085 return r; 1086 + 1087 + rptr = amdgpu_ring_get_rptr(ring); 1086 1088 1087 1089 amdgpu_ring_write(ring, VCE_CMD_END); 1088 1090 amdgpu_ring_commit(ring);
+11 -1
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 28 28 #include "soc15.h" 29 29 #include "soc15d.h" 30 30 #include "amdgpu_atomfirmware.h" 31 + #include "amdgpu_pm.h" 31 32 32 33 #include "gc/gc_9_0_offset.h" 33 34 #include "gc/gc_9_0_sh_mask.h" ··· 97 96 MODULE_FIRMWARE("amdgpu/raven2_mec.bin"); 98 97 MODULE_FIRMWARE("amdgpu/raven2_mec2.bin"); 99 98 MODULE_FIRMWARE("amdgpu/raven2_rlc.bin"); 99 + MODULE_FIRMWARE("amdgpu/raven_kicker_rlc.bin"); 100 100 101 101 static const struct soc15_reg_golden golden_settings_gc_9_0[] = 102 102 { ··· 590 588 case CHIP_RAVEN: 591 589 if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) 592 590 break; 593 - if ((adev->gfx.rlc_fw_version < 531) || 591 + if ((adev->gfx.rlc_fw_version != 106 && 592 + adev->gfx.rlc_fw_version < 531) || 594 593 (adev->gfx.rlc_fw_version == 53815) || 595 594 (adev->gfx.rlc_feature_version < 1) || 596 595 !adev->gfx.rlc.is_rlc_v2_1) ··· 615 612 unsigned int i = 0; 616 613 uint16_t version_major; 617 614 uint16_t version_minor; 615 + uint32_t smu_version; 618 616 619 617 DRM_DEBUG("\n"); 620 618 ··· 686 682 (((adev->pdev->revision >= 0xC8) && (adev->pdev->revision <= 0xCF)) || 687 683 ((adev->pdev->revision >= 0xD8) && (adev->pdev->revision <= 0xDF)))) 688 684 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc_am4.bin", chip_name); 685 + else if (!strcmp(chip_name, "raven") && (amdgpu_pm_load_smu_firmware(adev, &smu_version) == 0) && 686 + (smu_version >= 0x41e2b)) 687 + /** 688 + *SMC is loaded by SBIOS on APU and it's able to get the SMU version directly. 689 + */ 690 + snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_kicker_rlc.bin", chip_name); 689 691 else 690 692 snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_rlc.bin", chip_name); 691 693 err = request_firmware(&adev->gfx.rlc_fw, fw_name, adev->dev);
+1
drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
··· 92 92 hwmgr_set_user_specify_caps(hwmgr); 93 93 hwmgr->fan_ctrl_is_in_default_mode = true; 94 94 hwmgr_init_workload_prority(hwmgr); 95 + hwmgr->gfxoff_state_changed_by_workload = false; 95 96 96 97 switch (hwmgr->chip_family) { 97 98 case AMDGPU_FAMILY_CI:
+28 -3
drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c
··· 1258 1258 return size; 1259 1259 } 1260 1260 1261 + static bool smu10_is_raven1_refresh(struct pp_hwmgr *hwmgr) 1262 + { 1263 + struct amdgpu_device *adev = hwmgr->adev; 1264 + if ((adev->asic_type == CHIP_RAVEN) && 1265 + (adev->rev_id != 0x15d8) && 1266 + (hwmgr->smu_version >= 0x41e2b)) 1267 + return true; 1268 + else 1269 + return false; 1270 + } 1271 + 1261 1272 static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size) 1262 1273 { 1263 1274 int workload_type = 0; 1275 + int result = 0; 1264 1276 1265 1277 if (input[size] > PP_SMC_POWER_PROFILE_COMPUTE) { 1266 1278 pr_err("Invalid power profile mode %ld\n", input[size]); 1267 1279 return -EINVAL; 1268 1280 } 1269 - hwmgr->power_profile_mode = input[size]; 1281 + if (hwmgr->power_profile_mode == input[size]) 1282 + return 0; 1270 1283 1271 1284 /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ 1272 1285 workload_type = 1273 - conv_power_profile_to_pplib_workload(hwmgr->power_profile_mode); 1274 - smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify, 1286 + conv_power_profile_to_pplib_workload(input[size]); 1287 + if (workload_type && 1288 + smu10_is_raven1_refresh(hwmgr) && 1289 + !hwmgr->gfxoff_state_changed_by_workload) { 1290 + smu10_gfx_off_control(hwmgr, false); 1291 + hwmgr->gfxoff_state_changed_by_workload = true; 1292 + } 1293 + result = smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_ActiveProcessNotify, 1275 1294 1 << workload_type); 1295 + if (!result) 1296 + hwmgr->power_profile_mode = input[size]; 1297 + if (workload_type && hwmgr->gfxoff_state_changed_by_workload) { 1298 + smu10_gfx_off_control(hwmgr, true); 1299 + hwmgr->gfxoff_state_changed_by_workload = false; 1300 + } 1276 1301 1277 1302 return 0; 1278 1303 }
+1
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
··· 782 782 uint32_t workload_mask; 783 783 uint32_t workload_prority[Workload_Policy_Max]; 784 784 uint32_t workload_setting[Workload_Policy_Max]; 785 + bool gfxoff_state_changed_by_workload; 785 786 }; 786 787 787 788 int hwmgr_early_init(struct pp_hwmgr *hwmgr);