64c73bae960d7445589c08fbef16411f0cd2f230
[linux-2.6-block.git] / drivers / gpu / drm / amd / amdkfd / kfd_chardev.c
1 /*
2  * Copyright 2014 Advanced Micro Devices, Inc.
3  *
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:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
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.
21  */
22
23 #include <linux/device.h>
24 #include <linux/export.h>
25 #include <linux/err.h>
26 #include <linux/fs.h>
27 #include <linux/sched.h>
28 #include <linux/slab.h>
29 #include <linux/uaccess.h>
30 #include <linux/compat.h>
31 #include <uapi/linux/kfd_ioctl.h>
32 #include <linux/time.h>
33 #include <linux/mm.h>
34 #include <linux/uaccess.h>
35 #include <uapi/asm-generic/mman-common.h>
36 #include <asm/processor.h>
37 #include "kfd_priv.h"
38 #include "kfd_device_queue_manager.h"
39
40 static long kfd_ioctl(struct file *, unsigned int, unsigned long);
41 static int kfd_open(struct inode *, struct file *);
42 static int kfd_mmap(struct file *, struct vm_area_struct *);
43
44 static const char kfd_dev_name[] = "kfd";
45
46 static const struct file_operations kfd_fops = {
47         .owner = THIS_MODULE,
48         .unlocked_ioctl = kfd_ioctl,
49         .compat_ioctl = kfd_ioctl,
50         .open = kfd_open,
51         .mmap = kfd_mmap,
52 };
53
54 static int kfd_char_dev_major = -1;
55 static struct class *kfd_class;
56 struct device *kfd_device;
57
58 int kfd_chardev_init(void)
59 {
60         int err = 0;
61
62         kfd_char_dev_major = register_chrdev(0, kfd_dev_name, &kfd_fops);
63         err = kfd_char_dev_major;
64         if (err < 0)
65                 goto err_register_chrdev;
66
67         kfd_class = class_create(THIS_MODULE, kfd_dev_name);
68         err = PTR_ERR(kfd_class);
69         if (IS_ERR(kfd_class))
70                 goto err_class_create;
71
72         kfd_device = device_create(kfd_class, NULL,
73                                         MKDEV(kfd_char_dev_major, 0),
74                                         NULL, kfd_dev_name);
75         err = PTR_ERR(kfd_device);
76         if (IS_ERR(kfd_device))
77                 goto err_device_create;
78
79         return 0;
80
81 err_device_create:
82         class_destroy(kfd_class);
83 err_class_create:
84         unregister_chrdev(kfd_char_dev_major, kfd_dev_name);
85 err_register_chrdev:
86         return err;
87 }
88
89 void kfd_chardev_exit(void)
90 {
91         device_destroy(kfd_class, MKDEV(kfd_char_dev_major, 0));
92         class_destroy(kfd_class);
93         unregister_chrdev(kfd_char_dev_major, kfd_dev_name);
94 }
95
96 struct device *kfd_chardev(void)
97 {
98         return kfd_device;
99 }
100
101
102 static int kfd_open(struct inode *inode, struct file *filep)
103 {
104         struct kfd_process *process;
105
106         if (iminor(inode) != 0)
107                 return -ENODEV;
108
109         process = kfd_create_process(current);
110         if (IS_ERR(process))
111                 return PTR_ERR(process);
112
113         process->is_32bit_user_mode = is_compat_task();
114
115         dev_dbg(kfd_device, "process %d opened, compat mode (32 bit) - %d\n",
116                 process->pasid, process->is_32bit_user_mode);
117
118         kfd_init_apertures(process);
119
120         return 0;
121 }
122
123 static long kfd_ioctl_get_version(struct file *filep, struct kfd_process *p,
124                                         void __user *arg)
125 {
126         struct kfd_ioctl_get_version_args args;
127         int err = 0;
128
129         args.major_version = KFD_IOCTL_MAJOR_VERSION;
130         args.minor_version = KFD_IOCTL_MINOR_VERSION;
131
132         if (copy_to_user(arg, &args, sizeof(args)))
133                 err = -EFAULT;
134
135         return err;
136 }
137
138 static int set_queue_properties_from_user(struct queue_properties *q_properties,
139                                 struct kfd_ioctl_create_queue_args *args)
140 {
141         if (args->queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) {
142                 pr_err("kfd: queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n");
143                 return -EINVAL;
144         }
145
146         if (args->queue_priority > KFD_MAX_QUEUE_PRIORITY) {
147                 pr_err("kfd: queue priority must be between 0 to KFD_MAX_QUEUE_PRIORITY\n");
148                 return -EINVAL;
149         }
150
151         if ((args->ring_base_address) &&
152                 (!access_ok(VERIFY_WRITE, args->ring_base_address, sizeof(uint64_t)))) {
153                 pr_err("kfd: can't access ring base address\n");
154                 return -EFAULT;
155         }
156
157         if (!is_power_of_2(args->ring_size) && (args->ring_size != 0)) {
158                 pr_err("kfd: ring size must be a power of 2 or 0\n");
159                 return -EINVAL;
160         }
161
162         if (!access_ok(VERIFY_WRITE, args->read_pointer_address, sizeof(uint32_t))) {
163                 pr_err("kfd: can't access read pointer\n");
164                 return -EFAULT;
165         }
166
167         if (!access_ok(VERIFY_WRITE, args->write_pointer_address, sizeof(uint32_t))) {
168                 pr_err("kfd: can't access write pointer\n");
169                 return -EFAULT;
170         }
171
172         q_properties->is_interop = false;
173         q_properties->queue_percent = args->queue_percentage;
174         q_properties->priority = args->queue_priority;
175         q_properties->queue_address = args->ring_base_address;
176         q_properties->queue_size = args->ring_size;
177         q_properties->read_ptr = (uint32_t *) args->read_pointer_address;
178         q_properties->write_ptr = (uint32_t *) args->write_pointer_address;
179         if (args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE ||
180                 args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE_AQL)
181                 q_properties->type = KFD_QUEUE_TYPE_COMPUTE;
182         else
183                 return -ENOTSUPP;
184
185         if (args->queue_type == KFD_IOC_QUEUE_TYPE_COMPUTE_AQL)
186                 q_properties->format = KFD_QUEUE_FORMAT_AQL;
187         else
188                 q_properties->format = KFD_QUEUE_FORMAT_PM4;
189
190         pr_debug("Queue Percentage (%d, %d)\n",
191                         q_properties->queue_percent, args->queue_percentage);
192
193         pr_debug("Queue Priority (%d, %d)\n",
194                         q_properties->priority, args->queue_priority);
195
196         pr_debug("Queue Address (0x%llX, 0x%llX)\n",
197                         q_properties->queue_address, args->ring_base_address);
198
199         pr_debug("Queue Size (0x%llX, %u)\n",
200                         q_properties->queue_size, args->ring_size);
201
202         pr_debug("Queue r/w Pointers (0x%llX, 0x%llX)\n",
203                         (uint64_t) q_properties->read_ptr,
204                         (uint64_t) q_properties->write_ptr);
205
206         pr_debug("Queue Format (%d)\n", q_properties->format);
207
208         return 0;
209 }
210
211 static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
212                                         void __user *arg)
213 {
214         struct kfd_ioctl_create_queue_args args;
215         struct kfd_dev *dev;
216         int err = 0;
217         unsigned int queue_id;
218         struct kfd_process_device *pdd;
219         struct queue_properties q_properties;
220
221         memset(&q_properties, 0, sizeof(struct queue_properties));
222
223         if (copy_from_user(&args, arg, sizeof(args)))
224                 return -EFAULT;
225
226         pr_debug("kfd: creating queue ioctl\n");
227
228         err = set_queue_properties_from_user(&q_properties, &args);
229         if (err)
230                 return err;
231
232         dev = kfd_device_by_id(args.gpu_id);
233         if (dev == NULL)
234                 return -EINVAL;
235
236         mutex_lock(&p->mutex);
237
238         pdd = kfd_bind_process_to_device(dev, p);
239         if (IS_ERR(pdd) < 0) {
240                 err = PTR_ERR(pdd);
241                 goto err_bind_process;
242         }
243
244         pr_debug("kfd: creating queue for PASID %d on GPU 0x%x\n",
245                         p->pasid,
246                         dev->id);
247
248         err = pqm_create_queue(&p->pqm, dev, filep, &q_properties, 0,
249                                 KFD_QUEUE_TYPE_COMPUTE, &queue_id);
250         if (err != 0)
251                 goto err_create_queue;
252
253         args.queue_id = queue_id;
254
255         /* Return gpu_id as doorbell offset for mmap usage */
256         args.doorbell_offset = args.gpu_id << PAGE_SHIFT;
257
258         if (copy_to_user(arg, &args, sizeof(args))) {
259                 err = -EFAULT;
260                 goto err_copy_args_out;
261         }
262
263         mutex_unlock(&p->mutex);
264
265         pr_debug("kfd: queue id %d was created successfully\n", args.queue_id);
266
267         pr_debug("ring buffer address == 0x%016llX\n",
268                         args.ring_base_address);
269
270         pr_debug("read ptr address    == 0x%016llX\n",
271                         args.read_pointer_address);
272
273         pr_debug("write ptr address   == 0x%016llX\n",
274                         args.write_pointer_address);
275
276         return 0;
277
278 err_copy_args_out:
279         pqm_destroy_queue(&p->pqm, queue_id);
280 err_create_queue:
281 err_bind_process:
282         mutex_unlock(&p->mutex);
283         return err;
284 }
285
286 static int kfd_ioctl_destroy_queue(struct file *filp, struct kfd_process *p,
287                                         void __user *arg)
288 {
289         int retval;
290         struct kfd_ioctl_destroy_queue_args args;
291
292         if (copy_from_user(&args, arg, sizeof(args)))
293                 return -EFAULT;
294
295         pr_debug("kfd: destroying queue id %d for PASID %d\n",
296                                 args.queue_id,
297                                 p->pasid);
298
299         mutex_lock(&p->mutex);
300
301         retval = pqm_destroy_queue(&p->pqm, args.queue_id);
302
303         mutex_unlock(&p->mutex);
304         return retval;
305 }
306
307 static int kfd_ioctl_update_queue(struct file *filp, struct kfd_process *p,
308                                         void __user *arg)
309 {
310         int retval;
311         struct kfd_ioctl_update_queue_args args;
312         struct queue_properties properties;
313
314         if (copy_from_user(&args, arg, sizeof(args)))
315                 return -EFAULT;
316
317         if (args.queue_percentage > KFD_MAX_QUEUE_PERCENTAGE) {
318                 pr_err("kfd: queue percentage must be between 0 to KFD_MAX_QUEUE_PERCENTAGE\n");
319                 return -EINVAL;
320         }
321
322         if (args.queue_priority > KFD_MAX_QUEUE_PRIORITY) {
323                 pr_err("kfd: queue priority must be between 0 to KFD_MAX_QUEUE_PRIORITY\n");
324                 return -EINVAL;
325         }
326
327         if ((args.ring_base_address) &&
328                 (!access_ok(VERIFY_WRITE, args.ring_base_address, sizeof(uint64_t)))) {
329                 pr_err("kfd: can't access ring base address\n");
330                 return -EFAULT;
331         }
332
333         if (!is_power_of_2(args.ring_size) && (args.ring_size != 0)) {
334                 pr_err("kfd: ring size must be a power of 2 or 0\n");
335                 return -EINVAL;
336         }
337
338         properties.queue_address = args.ring_base_address;
339         properties.queue_size = args.ring_size;
340         properties.queue_percent = args.queue_percentage;
341         properties.priority = args.queue_priority;
342
343         pr_debug("kfd: updating queue id %d for PASID %d\n",
344                         args.queue_id, p->pasid);
345
346         mutex_lock(&p->mutex);
347
348         retval = pqm_update_queue(&p->pqm, args.queue_id, &properties);
349
350         mutex_unlock(&p->mutex);
351
352         return retval;
353 }
354
355 static long kfd_ioctl_set_memory_policy(struct file *filep,
356                                 struct kfd_process *p, void __user *arg)
357 {
358         struct kfd_ioctl_set_memory_policy_args args;
359         struct kfd_dev *dev;
360         int err = 0;
361         struct kfd_process_device *pdd;
362         enum cache_policy default_policy, alternate_policy;
363
364         if (copy_from_user(&args, arg, sizeof(args)))
365                 return -EFAULT;
366
367         if (args.default_policy != KFD_IOC_CACHE_POLICY_COHERENT
368             && args.default_policy != KFD_IOC_CACHE_POLICY_NONCOHERENT) {
369                 return -EINVAL;
370         }
371
372         if (args.alternate_policy != KFD_IOC_CACHE_POLICY_COHERENT
373             && args.alternate_policy != KFD_IOC_CACHE_POLICY_NONCOHERENT) {
374                 return -EINVAL;
375         }
376
377         dev = kfd_device_by_id(args.gpu_id);
378         if (dev == NULL)
379                 return -EINVAL;
380
381         mutex_lock(&p->mutex);
382
383         pdd = kfd_bind_process_to_device(dev, p);
384         if (IS_ERR(pdd) < 0) {
385                 err = PTR_ERR(pdd);
386                 goto out;
387         }
388
389         default_policy = (args.default_policy == KFD_IOC_CACHE_POLICY_COHERENT)
390                          ? cache_policy_coherent : cache_policy_noncoherent;
391
392         alternate_policy =
393                 (args.alternate_policy == KFD_IOC_CACHE_POLICY_COHERENT)
394                    ? cache_policy_coherent : cache_policy_noncoherent;
395
396         if (!dev->dqm->set_cache_memory_policy(dev->dqm,
397                                 &pdd->qpd,
398                                 default_policy,
399                                 alternate_policy,
400                                 (void __user *)args.alternate_aperture_base,
401                                 args.alternate_aperture_size))
402                 err = -EINVAL;
403
404 out:
405         mutex_unlock(&p->mutex);
406
407         return err;
408 }
409
410 static long kfd_ioctl_get_clock_counters(struct file *filep,
411                                 struct kfd_process *p, void __user *arg)
412 {
413         struct kfd_ioctl_get_clock_counters_args args;
414         struct kfd_dev *dev;
415         struct timespec time;
416
417         if (copy_from_user(&args, arg, sizeof(args)))
418                 return -EFAULT;
419
420         dev = kfd_device_by_id(args.gpu_id);
421         if (dev == NULL)
422                 return -EINVAL;
423
424         /* Reading GPU clock counter from KGD */
425         args.gpu_clock_counter = kfd2kgd->get_gpu_clock_counter(dev->kgd);
426
427         /* No access to rdtsc. Using raw monotonic time */
428         getrawmonotonic(&time);
429         args.cpu_clock_counter = (uint64_t)timespec_to_ns(&time);
430
431         get_monotonic_boottime(&time);
432         args.system_clock_counter = (uint64_t)timespec_to_ns(&time);
433
434         /* Since the counter is in nano-seconds we use 1GHz frequency */
435         args.system_clock_freq = 1000000000;
436
437         if (copy_to_user(arg, &args, sizeof(args)))
438                 return -EFAULT;
439
440         return 0;
441 }
442
443
444 static int kfd_ioctl_get_process_apertures(struct file *filp,
445                                 struct kfd_process *p, void __user *arg)
446 {
447         struct kfd_ioctl_get_process_apertures_args args;
448         struct kfd_process_device_apertures *pAperture;
449         struct kfd_process_device *pdd;
450
451         dev_dbg(kfd_device, "get apertures for PASID %d", p->pasid);
452
453         if (copy_from_user(&args, arg, sizeof(args)))
454                 return -EFAULT;
455
456         args.num_of_nodes = 0;
457
458         mutex_lock(&p->mutex);
459
460         /*if the process-device list isn't empty*/
461         if (kfd_has_process_device_data(p)) {
462                 /* Run over all pdd of the process */
463                 pdd = kfd_get_first_process_device_data(p);
464                 do {
465                         pAperture = &args.process_apertures[args.num_of_nodes];
466                         pAperture->gpu_id = pdd->dev->id;
467                         pAperture->lds_base = pdd->lds_base;
468                         pAperture->lds_limit = pdd->lds_limit;
469                         pAperture->gpuvm_base = pdd->gpuvm_base;
470                         pAperture->gpuvm_limit = pdd->gpuvm_limit;
471                         pAperture->scratch_base = pdd->scratch_base;
472                         pAperture->scratch_limit = pdd->scratch_limit;
473
474                         dev_dbg(kfd_device,
475                                 "node id %u\n", args.num_of_nodes);
476                         dev_dbg(kfd_device,
477                                 "gpu id %u\n", pdd->dev->id);
478                         dev_dbg(kfd_device,
479                                 "lds_base %llX\n", pdd->lds_base);
480                         dev_dbg(kfd_device,
481                                 "lds_limit %llX\n", pdd->lds_limit);
482                         dev_dbg(kfd_device,
483                                 "gpuvm_base %llX\n", pdd->gpuvm_base);
484                         dev_dbg(kfd_device,
485                                 "gpuvm_limit %llX\n", pdd->gpuvm_limit);
486                         dev_dbg(kfd_device,
487                                 "scratch_base %llX\n", pdd->scratch_base);
488                         dev_dbg(kfd_device,
489                                 "scratch_limit %llX\n", pdd->scratch_limit);
490
491                         args.num_of_nodes++;
492                 } while ((pdd = kfd_get_next_process_device_data(p, pdd)) != NULL &&
493                                 (args.num_of_nodes < NUM_OF_SUPPORTED_GPUS));
494         }
495
496         mutex_unlock(&p->mutex);
497
498         if (copy_to_user(arg, &args, sizeof(args)))
499                 return -EFAULT;
500
501         return 0;
502 }
503
504 static long kfd_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
505 {
506         struct kfd_process *process;
507         long err = -EINVAL;
508
509         dev_dbg(kfd_device,
510                 "ioctl cmd 0x%x (#%d), arg 0x%lx\n",
511                 cmd, _IOC_NR(cmd), arg);
512
513         process = kfd_get_process(current);
514         if (IS_ERR(process))
515                 return PTR_ERR(process);
516
517         switch (cmd) {
518         case KFD_IOC_GET_VERSION:
519                 err = kfd_ioctl_get_version(filep, process, (void __user *)arg);
520                 break;
521         case KFD_IOC_CREATE_QUEUE:
522                 err = kfd_ioctl_create_queue(filep, process,
523                                                 (void __user *)arg);
524                 break;
525
526         case KFD_IOC_DESTROY_QUEUE:
527                 err = kfd_ioctl_destroy_queue(filep, process,
528                                                 (void __user *)arg);
529                 break;
530
531         case KFD_IOC_SET_MEMORY_POLICY:
532                 err = kfd_ioctl_set_memory_policy(filep, process,
533                                                 (void __user *)arg);
534                 break;
535
536         case KFD_IOC_GET_CLOCK_COUNTERS:
537                 err = kfd_ioctl_get_clock_counters(filep, process,
538                                                 (void __user *)arg);
539                 break;
540
541         case KFD_IOC_GET_PROCESS_APERTURES:
542                 err = kfd_ioctl_get_process_apertures(filep, process,
543                                                 (void __user *)arg);
544                 break;
545
546         case KFD_IOC_UPDATE_QUEUE:
547                 err = kfd_ioctl_update_queue(filep, process,
548                                                 (void __user *)arg);
549                 break;
550
551         default:
552                 dev_err(kfd_device,
553                         "unknown ioctl cmd 0x%x, arg 0x%lx)\n",
554                         cmd, arg);
555                 err = -EINVAL;
556                 break;
557         }
558
559         if (err < 0)
560                 dev_err(kfd_device,
561                         "ioctl error %ld for ioctl cmd 0x%x (#%d)\n",
562                         err, cmd, _IOC_NR(cmd));
563
564         return err;
565 }
566
567 static int kfd_mmap(struct file *filp, struct vm_area_struct *vma)
568 {
569         struct kfd_process *process;
570
571         process = kfd_get_process(current);
572         if (IS_ERR(process))
573                 return PTR_ERR(process);
574
575         return kfd_doorbell_mmap(process, vma);
576 }