diff options
author | Grazvydas Ignotas <notasas@gmail.com> | 2016-10-02 17:06:44 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-10-06 12:39:02 -0400 |
commit | 8a2eef1dbc85273c57d6f2cf73e5d7c97b1a25f4 (patch) | |
tree | c813f3f53744b313125d45b07e7a82716b88020f /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |
parent | 8cb619d82ef9668cb820311904391bc493872b67 (diff) |
drm/amdgpu: also track late init state
Successful sw_init() and hw_init() states are tracked, but not
late_init(). Various error paths may result in amdgpu_fini() being
called before .late init is done, so late_init needs to be tracked
to avoid unexpected or multiple .late_fini() calls.
Signed-off-by: Grazvydas Ignotas <notasas@gmail.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 | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 99a15cad6789..a58513f271e3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | |||
@@ -1424,6 +1424,7 @@ static int amdgpu_late_init(struct amdgpu_device *adev) | |||
1424 | DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); | 1424 | DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); |
1425 | return r; | 1425 | return r; |
1426 | } | 1426 | } |
1427 | adev->ip_block_status[i].late_initialized = true; | ||
1427 | } | 1428 | } |
1428 | } | 1429 | } |
1429 | 1430 | ||
@@ -1469,8 +1470,11 @@ static int amdgpu_fini(struct amdgpu_device *adev) | |||
1469 | } | 1470 | } |
1470 | 1471 | ||
1471 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { | 1472 | for (i = adev->num_ip_blocks - 1; i >= 0; i--) { |
1473 | if (!adev->ip_block_status[i].late_initialized) | ||
1474 | continue; | ||
1472 | if (adev->ip_blocks[i].funcs->late_fini) | 1475 | if (adev->ip_blocks[i].funcs->late_fini) |
1473 | adev->ip_blocks[i].funcs->late_fini((void *)adev); | 1476 | adev->ip_blocks[i].funcs->late_fini((void *)adev); |
1477 | adev->ip_block_status[i].late_initialized = false; | ||
1474 | } | 1478 | } |
1475 | 1479 | ||
1476 | return 0; | 1480 | return 0; |