diff options
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_module.c | 15 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_kfd.c | 4 |
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); | |||
59 | MODULE_PARM_DESC(send_sigterm, | 59 | MODULE_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 | ||
62 | bool kgd2kfd_init(unsigned interface_version, const struct kgd2kfd_calls **g2f) | 62 | static int amdkfd_init_completed; |
63 | |||
64 | int 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 | } |
75 | EXPORT_SYMBOL(kgd2kfd_init); | 80 | EXPORT_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 | ||
126 | static void __exit kfd_module_exit(void) | 133 | static 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 | ||
224 | bool kgd2kfd_init(unsigned interface_version, | 224 | int 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; |