aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c4
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_module.c15
-rw-r--r--drivers/gpu/drm/amd/include/kgd_kfd_interface.h2
-rw-r--r--drivers/gpu/drm/radeon/radeon_kfd.c4
4 files changed, 17 insertions, 8 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 84d68d658f8a..44ba8bed1b29 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -70,7 +70,7 @@ bool amdgpu_amdkfd_load_interface(struct amdgpu_device *rdev)
70 return false; 70 return false;
71 } 71 }
72 72
73 if (!kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) { 73 if (kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
74 symbol_put(kgd2kfd_init); 74 symbol_put(kgd2kfd_init);
75 kfd2kgd = NULL; 75 kfd2kgd = NULL;
76 kgd2kfd = NULL; 76 kgd2kfd = NULL;
@@ -80,7 +80,7 @@ bool amdgpu_amdkfd_load_interface(struct amdgpu_device *rdev)
80 80
81 return true; 81 return true;
82#elif defined(CONFIG_HSA_AMD) 82#elif defined(CONFIG_HSA_AMD)
83 if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) { 83 if (kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
84 kfd2kgd = NULL; 84 kfd2kgd = NULL;
85 kgd2kfd = NULL; 85 kgd2kfd = NULL;
86 return false; 86 return false;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
index ca8410e8683d..850a5623661f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
@@ -59,18 +59,23 @@ module_param(send_sigterm, int, 0444);
59MODULE_PARM_DESC(send_sigterm, 59MODULE_PARM_DESC(send_sigterm,
60 "Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)"); 60 "Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)");
61 61
62bool kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f) 62static int amdkfd_init_completed;
63
64int kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f)
63{ 65{
66 if (!amdkfd_init_completed)
67 return -EPROBE_DEFER;
68
64 /* 69 /*
65 * Only one interface version is supported, 70 * Only one interface version is supported,
66 * no kfd/kgd version skew allowed. 71 * no kfd/kgd version skew allowed.
67 */ 72 */
68 if (interface_version != KFD_INTERFACE_VERSION) 73 if (interface_version != KFD_INTERFACE_VERSION)
69 return false; 74 return -EINVAL;
70 75
71 *g2f = &kgd2kfd; 76 *g2f = &kgd2kfd;
72 77
73 return true; 78 return 0;
74} 79}
75EXPORT_SYMBOL(kgd2kfd_init); 80EXPORT_SYMBOL(kgd2kfd_init);
76 81
@@ -111,6 +116,8 @@ static int __init kfd_module_init(void)
111 116
112 kfd_process_create_wq(); 117 kfd_process_create_wq();
113 118
119 amdkfd_init_completed = 1;
120
114 dev_info(kfd_device, "Initialized module\n"); 121 dev_info(kfd_device, "Initialized module\n");
115 122
116 return 0; 123 return 0;
@@ -125,6 +132,8 @@ err_pasid:
125 132
126static void __exit kfd_module_exit(void) 133static void __exit kfd_module_exit(void)
127{ 134{
135 amdkfd_init_completed = 0;
136
128 kfd_process_destroy_wq(); 137 kfd_process_destroy_wq();
129 kfd_topology_shutdown(); 138 kfd_topology_shutdown();
130 kfd_chardev_exit(); 139 kfd_chardev_exit();
diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
index 888250b33ea8..a09d9f352871 100644
--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
+++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
@@ -221,7 +221,7 @@ struct kgd2kfd_calls {
221 int (*resume)(struct kfd_dev *kfd); 221 int (*resume)(struct kfd_dev *kfd);
222}; 222};
223 223
224bool kgd2kfd_init(unsigned interface_version, 224int kgd2kfd_init(unsigned interface_version,
225 const struct kgd2kfd_calls **g2f); 225 const struct kgd2kfd_calls **g2f);
226 226
227#endif /* KGD_KFD_INTERFACE_H_INCLUDED */ 227#endif /* KGD_KFD_INTERFACE_H_INCLUDED */
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c
index 9a4d69e59401..83c2704a7291 100644
--- a/drivers/gpu/drm/radeon/radeon_kfd.c
+++ b/drivers/gpu/drm/radeon/radeon_kfd.c
@@ -142,7 +142,7 @@ bool radeon_kfd_init(void)
142 if (kgd2kfd_init_p == NULL) 142 if (kgd2kfd_init_p == NULL)
143 return false; 143 return false;
144 144
145 if (!kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) { 145 if (kgd2kfd_init_p(KFD_INTERFACE_VERSION, &kgd2kfd)) {
146 symbol_put(kgd2kfd_init); 146 symbol_put(kgd2kfd_init);
147 kgd2kfd = NULL; 147 kgd2kfd = NULL;
148 148
@@ -151,7 +151,7 @@ bool radeon_kfd_init(void)
151 151
152 return true; 152 return true;
153#elif defined(CONFIG_HSA_AMD) 153#elif defined(CONFIG_HSA_AMD)
154 if (!kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) { 154 if (kgd2kfd_init(KFD_INTERFACE_VERSION, &kgd2kfd)) {
155 kgd2kfd = NULL; 155 kgd2kfd = NULL;
156 156
157 return false; 157 return false;