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