diff options
author | Emily Deng <Emily.Deng@amd.com> | 2019-01-03 21:24:02 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-01-14 15:04:50 -0500 |
commit | 72d3f59205ffae6827b4af525a7963f181322e35 (patch) | |
tree | cee99d0080bf599260b6086f2c8c443b4b9251d9 /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
parent | 66f92bcff0f90405150f685e4ef78fd548275f10 (diff) |
drm/amdgpu/sriov: For finishing routine send rel event after init failed
When init fail, send rel init, req_fini and rel_fini to host for the
finishing routine.
Signed-off-by: Emily Deng <Emily.Deng@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@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 | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 03b73c562bc8..39d5d058b2c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1645,7 +1645,7 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) | |||
1645 | if (r) { | 1645 | if (r) { |
1646 | DRM_ERROR("sw_init of IP block <%s> failed %d\n", | 1646 | DRM_ERROR("sw_init of IP block <%s> failed %d\n", |
1647 | adev->ip_blocks[i].version->funcs->name, r); | 1647 | adev->ip_blocks[i].version->funcs->name, r); |
1648 | return r; | 1648 | goto init_failed; |
1649 | } | 1649 | } |
1650 | adev->ip_blocks[i].status.sw = true; | 1650 | adev->ip_blocks[i].status.sw = true; |
1651 | 1651 | ||
@@ -1654,17 +1654,17 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) | |||
1654 | r = amdgpu_device_vram_scratch_init(adev); | 1654 | r = amdgpu_device_vram_scratch_init(adev); |
1655 | if (r) { | 1655 | if (r) { |
1656 | DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r); | 1656 | DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r); |
1657 | return r; | 1657 | goto init_failed; |
1658 | } | 1658 | } |
1659 | r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev); | 1659 | r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev); |
1660 | if (r) { | 1660 | if (r) { |
1661 | DRM_ERROR("hw_init %d failed %d\n", i, r); | 1661 | DRM_ERROR("hw_init %d failed %d\n", i, r); |
1662 | return r; | 1662 | goto init_failed; |
1663 | } | 1663 | } |
1664 | r = amdgpu_device_wb_init(adev); | 1664 | r = amdgpu_device_wb_init(adev); |
1665 | if (r) { | 1665 | if (r) { |
1666 | DRM_ERROR("amdgpu_device_wb_init failed %d\n", r); | 1666 | DRM_ERROR("amdgpu_device_wb_init failed %d\n", r); |
1667 | return r; | 1667 | goto init_failed; |
1668 | } | 1668 | } |
1669 | adev->ip_blocks[i].status.hw = true; | 1669 | adev->ip_blocks[i].status.hw = true; |
1670 | 1670 | ||
@@ -1675,7 +1675,7 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) | |||
1675 | AMDGPU_CSA_SIZE); | 1675 | AMDGPU_CSA_SIZE); |
1676 | if (r) { | 1676 | if (r) { |
1677 | DRM_ERROR("allocate CSA failed %d\n", r); | 1677 | DRM_ERROR("allocate CSA failed %d\n", r); |
1678 | return r; | 1678 | goto init_failed; |
1679 | } | 1679 | } |
1680 | } | 1680 | } |
1681 | } | 1681 | } |
@@ -1683,30 +1683,32 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) | |||
1683 | 1683 | ||
1684 | r = amdgpu_ucode_create_bo(adev); /* create ucode bo when sw_init complete*/ | 1684 | r = amdgpu_ucode_create_bo(adev); /* create ucode bo when sw_init complete*/ |
1685 | if (r) | 1685 | if (r) |
1686 | return r; | 1686 | goto init_failed; |
1687 | 1687 | ||
1688 | r = amdgpu_device_ip_hw_init_phase1(adev); | 1688 | r = amdgpu_device_ip_hw_init_phase1(adev); |
1689 | if (r) | 1689 | if (r) |
1690 | return r; | 1690 | goto init_failed; |
1691 | 1691 | ||
1692 | r = amdgpu_device_fw_loading(adev); | 1692 | r = amdgpu_device_fw_loading(adev); |
1693 | if (r) | 1693 | if (r) |
1694 | return r; | 1694 | goto init_failed; |
1695 | 1695 | ||
1696 | r = amdgpu_device_ip_hw_init_phase2(adev); | 1696 | r = amdgpu_device_ip_hw_init_phase2(adev); |
1697 | if (r) | 1697 | if (r) |
1698 | return r; | 1698 | goto init_failed; |
1699 | 1699 | ||
1700 | if (adev->gmc.xgmi.num_physical_nodes > 1) | 1700 | if (adev->gmc.xgmi.num_physical_nodes > 1) |
1701 | amdgpu_xgmi_add_device(adev); | 1701 | amdgpu_xgmi_add_device(adev); |
1702 | amdgpu_amdkfd_device_init(adev); | 1702 | amdgpu_amdkfd_device_init(adev); |
1703 | 1703 | ||
1704 | init_failed: | ||
1704 | if (amdgpu_sriov_vf(adev)) { | 1705 | if (amdgpu_sriov_vf(adev)) { |
1705 | amdgpu_virt_init_data_exchange(adev); | 1706 | if (!r) |
1707 | amdgpu_virt_init_data_exchange(adev); | ||
1706 | amdgpu_virt_release_full_gpu(adev, true); | 1708 | amdgpu_virt_release_full_gpu(adev, true); |
1707 | } | 1709 | } |
1708 | 1710 | ||
1709 | return 0; | 1711 | return r; |
1710 | } | 1712 | } |
1711 | 1713 | ||
1712 | /** | 1714 | /** |
@@ -2612,6 +2614,8 @@ fence_driver_init: | |||
2612 | } | 2614 | } |
2613 | dev_err(adev->dev, "amdgpu_device_ip_init failed\n"); | 2615 | dev_err(adev->dev, "amdgpu_device_ip_init failed\n"); |
2614 | amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0); | 2616 | amdgpu_vf_error_put(adev, AMDGIM_ERROR_VF_AMDGPU_INIT_FAIL, 0, 0); |
2617 | if (amdgpu_virt_request_full_gpu(adev, false)) | ||
2618 | amdgpu_virt_release_full_gpu(adev, false); | ||
2615 | goto failed; | 2619 | goto failed; |
2616 | } | 2620 | } |
2617 | 2621 | ||