Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Grazvydas Ignotas and committed by
Alex Deucher
8a2eef1d 8cb619d8

+5
+1
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 1943 1943 bool valid; 1944 1944 bool sw; 1945 1945 bool hw; 1946 + bool late_initialized; 1946 1947 bool hang; 1947 1948 }; 1948 1949
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 1424 1424 DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1425 1425 return r; 1426 1426 } 1427 + adev->ip_block_status[i].late_initialized = true; 1427 1428 } 1428 1429 } 1429 1430 ··· 1470 1469 } 1471 1470 1472 1471 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1472 + if (!adev->ip_block_status[i].late_initialized) 1473 + continue; 1473 1474 if (adev->ip_blocks[i].funcs->late_fini) 1474 1475 adev->ip_blocks[i].funcs->late_fini((void *)adev); 1476 + adev->ip_block_status[i].late_initialized = false; 1475 1477 } 1476 1478 1477 1479 return 0;