2 * Copyright 2014 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
23 #include <linux/module.h>
24 #include <linux/sched.h>
25 #include <linux/moduleparam.h>
26 #include <linux/device.h>
27 #include <linux/printk.h>
30 #define KFD_DRIVER_AUTHOR "AMD Inc. and others"
32 #define KFD_DRIVER_DESC "Standalone HSA driver for AMD's GPUs"
33 #define KFD_DRIVER_DATE "20150421"
34 #define KFD_DRIVER_MAJOR 0
35 #define KFD_DRIVER_MINOR 7
36 #define KFD_DRIVER_PATCHLEVEL 2
38 static const struct kgd2kfd_calls kgd2kfd
= {
40 .probe
= kgd2kfd_probe
,
41 .device_init
= kgd2kfd_device_init
,
42 .device_exit
= kgd2kfd_device_exit
,
43 .interrupt
= kgd2kfd_interrupt
,
44 .suspend
= kgd2kfd_suspend
,
45 .resume
= kgd2kfd_resume
,
46 .quiesce_mm
= kgd2kfd_quiesce_mm
,
47 .resume_mm
= kgd2kfd_resume_mm
,
48 .schedule_evict_and_restore_process
=
49 kgd2kfd_schedule_evict_and_restore_process
,
50 .pre_reset
= kgd2kfd_pre_reset
,
51 .post_reset
= kgd2kfd_post_reset
,
54 int sched_policy
= KFD_SCHED_POLICY_HWS
;
55 module_param(sched_policy
, int, 0444);
56 MODULE_PARM_DESC(sched_policy
,
57 "Scheduling policy (0 = HWS (Default), 1 = HWS without over-subscription, 2 = Non-HWS (Used for debugging only)");
59 int hws_max_conc_proc
= 8;
60 module_param(hws_max_conc_proc
, int, 0444);
61 MODULE_PARM_DESC(hws_max_conc_proc
,
62 "Max # processes HWS can execute concurrently when sched_policy=0 (0 = no concurrency, #VMIDs for KFD = Maximum(default))");
65 module_param(cwsr_enable
, int, 0444);
66 MODULE_PARM_DESC(cwsr_enable
, "CWSR enable (0 = off, 1 = on (default))");
68 int max_num_of_queues_per_device
= KFD_MAX_NUM_OF_QUEUES_PER_DEVICE_DEFAULT
;
69 module_param(max_num_of_queues_per_device
, int, 0444);
70 MODULE_PARM_DESC(max_num_of_queues_per_device
,
71 "Maximum number of supported queues per device (1 = Minimum, 4096 = default)");
74 module_param(send_sigterm
, int, 0444);
75 MODULE_PARM_DESC(send_sigterm
,
76 "Send sigterm to HSA process on unhandled exception (0 = disable, 1 = enable)");
79 module_param(debug_largebar
, int, 0444);
80 MODULE_PARM_DESC(debug_largebar
,
81 "Debug large-bar flag used to simulate large-bar capability on non-large bar machine (0 = disable, 1 = enable)");
84 module_param(ignore_crat
, int, 0444);
85 MODULE_PARM_DESC(ignore_crat
,
86 "Ignore CRAT table during KFD initialization (0 = use CRAT (default), 1 = ignore CRAT)");
89 module_param(noretry
, int, 0644);
90 MODULE_PARM_DESC(noretry
,
91 "Set sh_mem_config.retry_disable on GFXv9+ dGPUs (0 = retry enabled (default), 1 = retry disabled)");
94 module_param(halt_if_hws_hang
, int, 0644);
95 MODULE_PARM_DESC(halt_if_hws_hang
, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
98 static int amdkfd_init_completed
;
101 int kgd2kfd_init(unsigned int interface_version
,
102 const struct kgd2kfd_calls
**g2f
)
104 if (!amdkfd_init_completed
)
105 return -EPROBE_DEFER
;
108 * Only one interface version is supported,
109 * no kfd/kgd version skew allowed.
111 if (interface_version
!= KFD_INTERFACE_VERSION
)
118 EXPORT_SYMBOL(kgd2kfd_init
);
120 void kgd2kfd_exit(void)
124 static int __init
kfd_module_init(void)
128 /* Verify module parameters */
129 if ((sched_policy
< KFD_SCHED_POLICY_HWS
) ||
130 (sched_policy
> KFD_SCHED_POLICY_NO_HWS
)) {
131 pr_err("sched_policy has invalid value\n");
135 /* Verify module parameters */
136 if ((max_num_of_queues_per_device
< 1) ||
137 (max_num_of_queues_per_device
>
138 KFD_MAX_NUM_OF_QUEUES_PER_DEVICE
)) {
139 pr_err("max_num_of_queues_per_device must be between 1 to KFD_MAX_NUM_OF_QUEUES_PER_DEVICE\n");
143 err
= kfd_chardev_init();
147 err
= kfd_topology_init();
151 err
= kfd_process_create_wq();
157 amdkfd_init_completed
= 1;
159 dev_info(kfd_device
, "Initialized module\n");
164 kfd_topology_shutdown();
171 static void __exit
kfd_module_exit(void)
173 amdkfd_init_completed
= 0;
176 kfd_process_destroy_wq();
177 kfd_topology_shutdown();
179 pr_info("amdkfd: Removed module\n");
182 module_init(kfd_module_init
);
183 module_exit(kfd_module_exit
);
185 MODULE_AUTHOR(KFD_DRIVER_AUTHOR
);
186 MODULE_DESCRIPTION(KFD_DRIVER_DESC
);
187 MODULE_LICENSE("GPL and additional rights");
188 MODULE_VERSION(__stringify(KFD_DRIVER_MAJOR
) "."
189 __stringify(KFD_DRIVER_MINOR
) "."
190 __stringify(KFD_DRIVER_PATCHLEVEL
));