Commit c7651b73 authored by Felix Kuehling's avatar Felix Kuehling Committed by Alex Deucher

drm/amdgpu: Fix handling of KFD initialization failures

Remember KFD module initializaton status in a global variable. Skip KFD
device probing when the module was not initialized. Other amdgpu_amdkfd
calls are then protected by the adev->kfd.dev check.

Also print a clear error message when KFD disables itself. Amdgpu
continues its initialization even when KFD failed.
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarKent Russell <kent.russell@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 911d5bd5
...@@ -36,6 +36,8 @@ ...@@ -36,6 +36,8 @@
*/ */
uint64_t amdgpu_amdkfd_total_mem_size; uint64_t amdgpu_amdkfd_total_mem_size;
bool kfd_initialized;
int amdgpu_amdkfd_init(void) int amdgpu_amdkfd_init(void)
{ {
struct sysinfo si; struct sysinfo si;
...@@ -51,19 +53,26 @@ int amdgpu_amdkfd_init(void) ...@@ -51,19 +53,26 @@ int amdgpu_amdkfd_init(void)
#else #else
ret = -ENOENT; ret = -ENOENT;
#endif #endif
kfd_initialized = !ret;
return ret; return ret;
} }
void amdgpu_amdkfd_fini(void) void amdgpu_amdkfd_fini(void)
{ {
if (kfd_initialized) {
kgd2kfd_exit(); kgd2kfd_exit();
kfd_initialized = false;
}
} }
void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev) void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev)
{ {
bool vf = amdgpu_sriov_vf(adev); bool vf = amdgpu_sriov_vf(adev);
if (!kfd_initialized)
return;
adev->kfd.dev = kgd2kfd_probe((struct kgd_dev *)adev, adev->kfd.dev = kgd2kfd_probe((struct kgd_dev *)adev,
adev->pdev, adev->asic_type, vf); adev->pdev, adev->asic_type, vf);
......
...@@ -97,6 +97,7 @@ void kfd_chardev_exit(void) ...@@ -97,6 +97,7 @@ void kfd_chardev_exit(void)
device_destroy(kfd_class, MKDEV(kfd_char_dev_major, 0)); device_destroy(kfd_class, MKDEV(kfd_char_dev_major, 0));
class_destroy(kfd_class); class_destroy(kfd_class);
unregister_chrdev(kfd_char_dev_major, kfd_dev_name); unregister_chrdev(kfd_char_dev_major, kfd_dev_name);
kfd_device = NULL;
} }
struct device *kfd_chardev(void) struct device *kfd_chardev(void)
......
...@@ -70,6 +70,7 @@ static int kfd_init(void) ...@@ -70,6 +70,7 @@ static int kfd_init(void)
err_topology: err_topology:
kfd_chardev_exit(); kfd_chardev_exit();
err_ioctl: err_ioctl:
pr_err("KFD is disabled due to module initialization failure\n");
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment