diff options
author | Rex Zhu <Rex.Zhu@amd.com> | 2018-10-10 08:41:32 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-10-10 15:49:21 -0400 |
commit | 7a3e0bb2a57428456948614d8fe94930832903b6 (patch) | |
tree | f8c37d3decb9fefff50cbf50d0b762aad832f11a | |
parent | 0a4f25205ec32d2918325d651cdaba9746764a24 (diff) |
drm/amdgpu: Load fw between hw_init/resume_phase1 and phase2
Extract the function of fw loading out of powerplay.
Do fw loading between hw_init/resuem_phase1 and phase2
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 61 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | 20 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c | 5 |
7 files changed, 62 insertions, 52 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 372574abc1c4..1e4dd09a5072 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1570,6 +1570,47 @@ static int amdgpu_device_ip_hw_init_phase2(struct amdgpu_device *adev) | |||
1570 | return 0; | 1570 | return 0; |
1571 | } | 1571 | } |
1572 | 1572 | ||
1573 | static int amdgpu_device_fw_loading(struct amdgpu_device *adev) | ||
1574 | { | ||
1575 | int r = 0; | ||
1576 | int i; | ||
1577 | |||
1578 | if (adev->asic_type >= CHIP_VEGA10) { | ||
1579 | for (i = 0; i < adev->num_ip_blocks; i++) { | ||
1580 | if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) { | ||
1581 | if (adev->in_gpu_reset || adev->in_suspend) { | ||
1582 | if (amdgpu_sriov_vf(adev) && adev->in_gpu_reset) | ||
1583 | break; /* sriov gpu reset, psp need to do hw_init before IH because of hw limit */ | ||
1584 | r = adev->ip_blocks[i].version->funcs->resume(adev); | ||
1585 | if (r) { | ||
1586 | DRM_ERROR("resume of IP block <%s> failed %d\n", | ||
1587 | adev->ip_blocks[i].version->funcs->name, r); | ||
1588 | return r; | ||
1589 | } | ||
1590 | } else { | ||
1591 | r = adev->ip_blocks[i].version->funcs->hw_init(adev); | ||
1592 | if (r) { | ||
1593 | DRM_ERROR("hw_init of IP block <%s> failed %d\n", | ||
1594 | adev->ip_blocks[i].version->funcs->name, r); | ||
1595 | return r; | ||
1596 | } | ||
1597 | } | ||
1598 | adev->ip_blocks[i].status.hw = true; | ||
1599 | } | ||
1600 | } | ||
1601 | } | ||
1602 | |||
1603 | if (adev->powerplay.pp_funcs->load_firmware) { | ||
1604 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
1605 | if (r) { | ||
1606 | pr_err("firmware loading failed\n"); | ||
1607 | return r; | ||
1608 | } | ||
1609 | } | ||
1610 | |||
1611 | return 0; | ||
1612 | } | ||
1613 | |||
1573 | /** | 1614 | /** |
1574 | * amdgpu_device_ip_init - run init for hardware IPs | 1615 | * amdgpu_device_ip_init - run init for hardware IPs |
1575 | * | 1616 | * |
@@ -1634,6 +1675,10 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) | |||
1634 | if (r) | 1675 | if (r) |
1635 | return r; | 1676 | return r; |
1636 | 1677 | ||
1678 | r = amdgpu_device_fw_loading(adev); | ||
1679 | if (r) | ||
1680 | return r; | ||
1681 | |||
1637 | r = amdgpu_device_ip_hw_init_phase2(adev); | 1682 | r = amdgpu_device_ip_hw_init_phase2(adev); |
1638 | if (r) | 1683 | if (r) |
1639 | return r; | 1684 | return r; |
@@ -2167,7 +2212,8 @@ static int amdgpu_device_ip_resume_phase2(struct amdgpu_device *adev) | |||
2167 | continue; | 2212 | continue; |
2168 | if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || | 2213 | if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON || |
2169 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || | 2214 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC || |
2170 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH) | 2215 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_IH || |
2216 | adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_PSP) | ||
2171 | continue; | 2217 | continue; |
2172 | r = adev->ip_blocks[i].version->funcs->resume(adev); | 2218 | r = adev->ip_blocks[i].version->funcs->resume(adev); |
2173 | if (r) { | 2219 | if (r) { |
@@ -2199,6 +2245,11 @@ static int amdgpu_device_ip_resume(struct amdgpu_device *adev) | |||
2199 | r = amdgpu_device_ip_resume_phase1(adev); | 2245 | r = amdgpu_device_ip_resume_phase1(adev); |
2200 | if (r) | 2246 | if (r) |
2201 | return r; | 2247 | return r; |
2248 | |||
2249 | r = amdgpu_device_fw_loading(adev); | ||
2250 | if (r) | ||
2251 | return r; | ||
2252 | |||
2202 | r = amdgpu_device_ip_resume_phase2(adev); | 2253 | r = amdgpu_device_ip_resume_phase2(adev); |
2203 | 2254 | ||
2204 | return r; | 2255 | return r; |
@@ -3149,6 +3200,10 @@ retry: | |||
3149 | if (r) | 3200 | if (r) |
3150 | goto out; | 3201 | goto out; |
3151 | 3202 | ||
3203 | r = amdgpu_device_fw_loading(adev); | ||
3204 | if (r) | ||
3205 | return r; | ||
3206 | |||
3152 | r = amdgpu_device_ip_resume_phase2(adev); | 3207 | r = amdgpu_device_ip_resume_phase2(adev); |
3153 | if (r) | 3208 | if (r) |
3154 | goto out; | 3209 | goto out; |
@@ -3205,6 +3260,10 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev, | |||
3205 | /* we need recover gart prior to run SMC/CP/SDMA resume */ | 3260 | /* we need recover gart prior to run SMC/CP/SDMA resume */ |
3206 | amdgpu_gtt_mgr_recover(&adev->mman.bdev.man[TTM_PL_TT]); | 3261 | amdgpu_gtt_mgr_recover(&adev->mman.bdev.man[TTM_PL_TT]); |
3207 | 3262 | ||
3263 | r = amdgpu_device_fw_loading(adev); | ||
3264 | if (r) | ||
3265 | return r; | ||
3266 | |||
3208 | /* now we are okay to resume SMC/CP/SDMA */ | 3267 | /* now we are okay to resume SMC/CP/SDMA */ |
3209 | r = amdgpu_device_ip_reinit_late_sriov(adev); | 3268 | r = amdgpu_device_ip_reinit_late_sriov(adev); |
3210 | if (r) | 3269 | if (r) |
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index 8439f9a6f281..3d0f277a6523 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | |||
@@ -4175,20 +4175,9 @@ static void gfx_v8_0_rlc_start(struct amdgpu_device *adev) | |||
4175 | 4175 | ||
4176 | static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) | 4176 | static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) |
4177 | { | 4177 | { |
4178 | int r; | ||
4179 | |||
4180 | gfx_v8_0_rlc_stop(adev); | 4178 | gfx_v8_0_rlc_stop(adev); |
4181 | gfx_v8_0_rlc_reset(adev); | 4179 | gfx_v8_0_rlc_reset(adev); |
4182 | gfx_v8_0_init_pg(adev); | 4180 | gfx_v8_0_init_pg(adev); |
4183 | |||
4184 | if (adev->powerplay.pp_funcs->load_firmware) { | ||
4185 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
4186 | if (r) { | ||
4187 | pr_err("firmware loading failed\n"); | ||
4188 | return r; | ||
4189 | } | ||
4190 | } | ||
4191 | |||
4192 | gfx_v8_0_rlc_start(adev); | 4181 | gfx_v8_0_rlc_start(adev); |
4193 | 4182 | ||
4194 | return 0; | 4183 | return 0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 0bdde7f84adf..6fb3edaba0ec 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c | |||
@@ -788,14 +788,6 @@ static int sdma_v3_0_start(struct amdgpu_device *adev) | |||
788 | { | 788 | { |
789 | int r; | 789 | int r; |
790 | 790 | ||
791 | if (adev->powerplay.pp_funcs->load_firmware) { | ||
792 | r = adev->powerplay.pp_funcs->load_firmware(adev->powerplay.pp_handle); | ||
793 | if (r) { | ||
794 | pr_err("firmware loading failed\n"); | ||
795 | return r; | ||
796 | } | ||
797 | } | ||
798 | |||
799 | /* disable sdma engine before programing it */ | 791 | /* disable sdma engine before programing it */ |
800 | sdma_v3_0_ctx_switch_enable(adev, false); | 792 | sdma_v3_0_ctx_switch_enable(adev, false); |
801 | sdma_v3_0_enable(adev, false); | 793 | sdma_v3_0_enable(adev, false); |
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c index d552af2e0eb4..47ac92369739 100644 --- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c | |||
@@ -89,7 +89,6 @@ int hwmgr_early_init(struct pp_hwmgr *hwmgr) | |||
89 | hwmgr_init_default_caps(hwmgr); | 89 | hwmgr_init_default_caps(hwmgr); |
90 | hwmgr_set_user_specify_caps(hwmgr); | 90 | hwmgr_set_user_specify_caps(hwmgr); |
91 | hwmgr->fan_ctrl_is_in_default_mode = true; | 91 | hwmgr->fan_ctrl_is_in_default_mode = true; |
92 | hwmgr->reload_fw = 1; | ||
93 | hwmgr_init_workload_prority(hwmgr); | 92 | hwmgr_init_workload_prority(hwmgr); |
94 | 93 | ||
95 | switch (hwmgr->chip_family) { | 94 | switch (hwmgr->chip_family) { |
@@ -209,17 +208,6 @@ int hwmgr_hw_init(struct pp_hwmgr *hwmgr) | |||
209 | { | 208 | { |
210 | int ret = 0; | 209 | int ret = 0; |
211 | 210 | ||
212 | if (!hwmgr || !hwmgr->smumgr_funcs) | ||
213 | return -EINVAL; | ||
214 | |||
215 | if (hwmgr->smumgr_funcs->start_smu) { | ||
216 | ret = hwmgr->smumgr_funcs->start_smu(hwmgr); | ||
217 | if (ret) { | ||
218 | pr_err("smc start failed\n"); | ||
219 | return -EINVAL; | ||
220 | } | ||
221 | } | ||
222 | |||
223 | if (!hwmgr->pm_en) | 211 | if (!hwmgr->pm_en) |
224 | return 0; | 212 | return 0; |
225 | 213 | ||
@@ -301,7 +289,6 @@ int hwmgr_suspend(struct pp_hwmgr *hwmgr) | |||
301 | if (!hwmgr || !hwmgr->pm_en) | 289 | if (!hwmgr || !hwmgr->pm_en) |
302 | return 0; | 290 | return 0; |
303 | 291 | ||
304 | hwmgr->reload_fw = true; | ||
305 | phm_disable_smc_firmware_ctf(hwmgr); | 292 | phm_disable_smc_firmware_ctf(hwmgr); |
306 | ret = psm_set_boot_states(hwmgr); | 293 | ret = psm_set_boot_states(hwmgr); |
307 | if (ret) | 294 | if (ret) |
@@ -321,13 +308,6 @@ int hwmgr_resume(struct pp_hwmgr *hwmgr) | |||
321 | if (!hwmgr) | 308 | if (!hwmgr) |
322 | return -EINVAL; | 309 | return -EINVAL; |
323 | 310 | ||
324 | if (hwmgr->smumgr_funcs && hwmgr->smumgr_funcs->start_smu) { | ||
325 | if (hwmgr->smumgr_funcs->start_smu(hwmgr)) { | ||
326 | pr_err("smc start failed\n"); | ||
327 | return -EINVAL; | ||
328 | } | ||
329 | } | ||
330 | |||
331 | if (!hwmgr->pm_en) | 311 | if (!hwmgr->pm_en) |
332 | return 0; | 312 | return 0; |
333 | 313 | ||
diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h index 35f227222cee..e5a60aa44b5d 100644 --- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h +++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | |||
@@ -734,7 +734,6 @@ struct pp_hwmgr { | |||
734 | void *smu_backend; | 734 | void *smu_backend; |
735 | const struct pp_smumgr_func *smumgr_funcs; | 735 | const struct pp_smumgr_func *smumgr_funcs; |
736 | bool is_kicker; | 736 | bool is_kicker; |
737 | bool reload_fw; | ||
738 | 737 | ||
739 | enum PP_DAL_POWERLEVEL dal_power_level; | 738 | enum PP_DAL_POWERLEVEL dal_power_level; |
740 | struct phm_dynamic_state_info dyn_state; | 739 | struct phm_dynamic_state_info dyn_state; |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c index 99b4e4f6a2eb..3f51d545e8ff 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c | |||
@@ -343,9 +343,6 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr) | |||
343 | uint32_t fw_to_load; | 343 | uint32_t fw_to_load; |
344 | int r = 0; | 344 | int r = 0; |
345 | 345 | ||
346 | if (!hwmgr->reload_fw) | ||
347 | return 0; | ||
348 | |||
349 | amdgpu_ucode_init_bo(hwmgr->adev); | 346 | amdgpu_ucode_init_bo(hwmgr->adev); |
350 | 347 | ||
351 | if (smu_data->soft_regs_start) | 348 | if (smu_data->soft_regs_start) |
@@ -432,10 +429,9 @@ int smu7_request_smu_load_fw(struct pp_hwmgr *hwmgr) | |||
432 | smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_LoadUcodes, fw_to_load); | 429 | smu7_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_LoadUcodes, fw_to_load); |
433 | 430 | ||
434 | r = smu7_check_fw_load_finish(hwmgr, fw_to_load); | 431 | r = smu7_check_fw_load_finish(hwmgr, fw_to_load); |
435 | if (!r) { | 432 | if (!r) |
436 | hwmgr->reload_fw = 0; | ||
437 | return 0; | 433 | return 0; |
438 | } | 434 | |
439 | pr_err("SMU load firmware failed\n"); | 435 | pr_err("SMU load firmware failed\n"); |
440 | 436 | ||
441 | failed: | 437 | failed: |
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c index abbf2f285aab..f836d30fdd44 100644 --- a/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c +++ b/drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c | |||
@@ -661,9 +661,6 @@ static int smu8_request_smu_load_fw(struct pp_hwmgr *hwmgr) | |||
661 | uint32_t fw_to_check = 0; | 661 | uint32_t fw_to_check = 0; |
662 | int ret; | 662 | int ret; |
663 | 663 | ||
664 | if (!hwmgr->reload_fw) | ||
665 | return 0; | ||
666 | |||
667 | amdgpu_ucode_init_bo(hwmgr->adev); | 664 | amdgpu_ucode_init_bo(hwmgr->adev); |
668 | 665 | ||
669 | smu8_smu_populate_firmware_entries(hwmgr); | 666 | smu8_smu_populate_firmware_entries(hwmgr); |
@@ -719,8 +716,6 @@ static int smu8_request_smu_load_fw(struct pp_hwmgr *hwmgr) | |||
719 | return ret; | 716 | return ret; |
720 | } | 717 | } |
721 | 718 | ||
722 | hwmgr->reload_fw = 0; | ||
723 | |||
724 | return 0; | 719 | return 0; |
725 | } | 720 | } |
726 | 721 | ||