aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
diff options
context:
space:
mode:
authorGrazvydas Ignotas <notasas@gmail.com>2016-10-02 17:06:44 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-10-06 12:39:02 -0400
commit8a2eef1dbc85273c57d6f2cf73e5d7c97b1a25f4 (patch)
treec813f3f53744b313125d45b07e7a82716b88020f /drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
parent8cb619d82ef9668cb820311904391bc493872b67 (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.c4
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;