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 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
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>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_device.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 61 |
1 files changed, 60 insertions, 1 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) |