aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRex Zhu <Rex.Zhu@amd.com>2018-10-10 08:41:32 -0400
committerAlex Deucher <alexander.deucher@amd.com>2018-10-10 15:49:21 -0400
commit7a3e0bb2a57428456948614d8fe94930832903b6 (patch)
treef8c37d3decb9fefff50cbf50d0b762aad832f11a
parent0a4f25205ec32d2918325d651cdaba9746764a24 (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.c61
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c11
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c8
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c20
-rw-r--r--drivers/gpu/drm/amd/powerplay/inc/hwmgr.h1
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c8
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c5
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
1573static 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
4176static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev) 4176static 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
441failed: 437failed:
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