mm/vma: introduce VM_ACCESS_FLAGS
[linux-block.git] / drivers / staging / gasket / gasket_core.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Gasket generic driver framework. This file contains the implementation
4  * for the Gasket generic driver framework - the functionality that is common
5  * across Gasket devices.
6  *
7  * Copyright (C) 2018 Google, Inc.
8  */
9
10 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12 #include "gasket_core.h"
13
14 #include "gasket_interrupt.h"
15 #include "gasket_ioctl.h"
16 #include "gasket_page_table.h"
17 #include "gasket_sysfs.h"
18
19 #include <linux/capability.h>
20 #include <linux/compiler.h>
21 #include <linux/delay.h>
22 #include <linux/device.h>
23 #include <linux/fs.h>
24 #include <linux/init.h>
25 #include <linux/of.h>
26 #include <linux/pid_namespace.h>
27 #include <linux/printk.h>
28 #include <linux/sched.h>
29
30 #ifdef GASKET_KERNEL_TRACE_SUPPORT
31 #define CREATE_TRACE_POINTS
32 #include <trace/events/gasket_mmap.h>
33 #else
34 #define trace_gasket_mmap_exit(x)
35 #define trace_gasket_mmap_entry(x, ...)
36 #endif
37
38 /*
39  * "Private" members of gasket_driver_desc.
40  *
41  * Contains internal per-device type tracking data, i.e., data not appropriate
42  * as part of the public interface for the generic framework.
43  */
44 struct gasket_internal_desc {
45         /* Device-specific-driver-provided configuration information. */
46         const struct gasket_driver_desc *driver_desc;
47
48         /* Protects access to per-driver data (i.e. this structure). */
49         struct mutex mutex;
50
51         /* Kernel-internal device class. */
52         struct class *class;
53
54         /* Instantiated / present devices of this type. */
55         struct gasket_dev *devs[GASKET_DEV_MAX];
56 };
57
58 /* do_map_region() needs be able to return more than just true/false. */
59 enum do_map_region_status {
60         /* The region was successfully mapped. */
61         DO_MAP_REGION_SUCCESS,
62
63         /* Attempted to map region and failed. */
64         DO_MAP_REGION_FAILURE,
65
66         /* The requested region to map was not part of a mappable region. */
67         DO_MAP_REGION_INVALID,
68 };
69
70 /* Global data definitions. */
71 /* Mutex - only for framework-wide data. Other data should be protected by
72  * finer-grained locks.
73  */
74 static DEFINE_MUTEX(g_mutex);
75
76 /* List of all registered device descriptions & their supporting data. */
77 static struct gasket_internal_desc g_descs[GASKET_FRAMEWORK_DESC_MAX];
78
79 /* Mapping of statuses to human-readable strings. Must end with {0,NULL}. */
80 static const struct gasket_num_name gasket_status_name_table[] = {
81         { GASKET_STATUS_DEAD, "DEAD" },
82         { GASKET_STATUS_ALIVE, "ALIVE" },
83         { GASKET_STATUS_LAMED, "LAMED" },
84         { GASKET_STATUS_DRIVER_EXIT, "DRIVER_EXITING" },
85         { 0, NULL },
86 };
87
88 /* Enumeration of the automatic Gasket framework sysfs nodes. */
89 enum gasket_sysfs_attribute_type {
90         ATTR_BAR_OFFSETS,
91         ATTR_BAR_SIZES,
92         ATTR_DRIVER_VERSION,
93         ATTR_FRAMEWORK_VERSION,
94         ATTR_DEVICE_TYPE,
95         ATTR_HARDWARE_REVISION,
96         ATTR_PCI_ADDRESS,
97         ATTR_STATUS,
98         ATTR_IS_DEVICE_OWNED,
99         ATTR_DEVICE_OWNER,
100         ATTR_WRITE_OPEN_COUNT,
101         ATTR_RESET_COUNT,
102         ATTR_USER_MEM_RANGES
103 };
104
105 /* Perform a standard Gasket callback. */
106 static inline int
107 check_and_invoke_callback(struct gasket_dev *gasket_dev,
108                           int (*cb_function)(struct gasket_dev *))
109 {
110         int ret = 0;
111
112         if (cb_function) {
113                 mutex_lock(&gasket_dev->mutex);
114                 ret = cb_function(gasket_dev);
115                 mutex_unlock(&gasket_dev->mutex);
116         }
117         return ret;
118 }
119
120 /* Perform a standard Gasket callback without grabbing gasket_dev->mutex. */
121 static inline int
122 gasket_check_and_invoke_callback_nolock(struct gasket_dev *gasket_dev,
123                                         int (*cb_function)(struct gasket_dev *))
124 {
125         int ret = 0;
126
127         if (cb_function)
128                 ret = cb_function(gasket_dev);
129         return ret;
130 }
131
132 /*
133  * Return nonzero if the gasket_cdev_info is owned by the current thread group
134  * ID.
135  */
136 static int gasket_owned_by_current_tgid(struct gasket_cdev_info *info)
137 {
138         return (info->ownership.is_owned &&
139                 (info->ownership.owner == current->tgid));
140 }
141
142 /*
143  * Find the next free gasket_internal_dev slot.
144  *
145  * Returns the located slot number on success or a negative number on failure.
146  */
147 static int gasket_find_dev_slot(struct gasket_internal_desc *internal_desc,
148                                 const char *kobj_name)
149 {
150         int i;
151
152         mutex_lock(&internal_desc->mutex);
153
154         /* Search for a previous instance of this device. */
155         for (i = 0; i < GASKET_DEV_MAX; i++) {
156                 if (internal_desc->devs[i] &&
157                     strcmp(internal_desc->devs[i]->kobj_name, kobj_name) == 0) {
158                         pr_err("Duplicate device %s\n", kobj_name);
159                         mutex_unlock(&internal_desc->mutex);
160                         return -EBUSY;
161                 }
162         }
163
164         /* Find a free device slot. */
165         for (i = 0; i < GASKET_DEV_MAX; i++) {
166                 if (!internal_desc->devs[i])
167                         break;
168         }
169
170         if (i == GASKET_DEV_MAX) {
171                 pr_err("Too many registered devices; max %d\n", GASKET_DEV_MAX);
172                 mutex_unlock(&internal_desc->mutex);
173                 return -EBUSY;
174         }
175
176         mutex_unlock(&internal_desc->mutex);
177         return i;
178 }
179
180 /*
181  * Allocate and initialize a Gasket device structure, add the device to the
182  * device list.
183  *
184  * Returns 0 if successful, a negative error code otherwise.
185  */
186 static int gasket_alloc_dev(struct gasket_internal_desc *internal_desc,
187                             struct device *parent, struct gasket_dev **pdev)
188 {
189         int dev_idx;
190         const struct gasket_driver_desc *driver_desc =
191                 internal_desc->driver_desc;
192         struct gasket_dev *gasket_dev;
193         struct gasket_cdev_info *dev_info;
194         const char *parent_name = dev_name(parent);
195
196         pr_debug("Allocating a Gasket device, parent %s.\n", parent_name);
197
198         *pdev = NULL;
199
200         dev_idx = gasket_find_dev_slot(internal_desc, parent_name);
201         if (dev_idx < 0)
202                 return dev_idx;
203
204         gasket_dev = *pdev = kzalloc(sizeof(*gasket_dev), GFP_KERNEL);
205         if (!gasket_dev) {
206                 pr_err("no memory for device, parent %s\n", parent_name);
207                 return -ENOMEM;
208         }
209         internal_desc->devs[dev_idx] = gasket_dev;
210
211         mutex_init(&gasket_dev->mutex);
212
213         gasket_dev->internal_desc = internal_desc;
214         gasket_dev->dev_idx = dev_idx;
215         snprintf(gasket_dev->kobj_name, GASKET_NAME_MAX, "%s", parent_name);
216         gasket_dev->dev = get_device(parent);
217         /* gasket_bar_data is uninitialized. */
218         gasket_dev->num_page_tables = driver_desc->num_page_tables;
219         /* max_page_table_size and *page table are uninit'ed */
220         /* interrupt_data is not initialized. */
221         /* status is 0, or GASKET_STATUS_DEAD */
222
223         dev_info = &gasket_dev->dev_info;
224         snprintf(dev_info->name, GASKET_NAME_MAX, "%s_%u", driver_desc->name,
225                  gasket_dev->dev_idx);
226         dev_info->devt =
227                 MKDEV(driver_desc->major, driver_desc->minor +
228                       gasket_dev->dev_idx);
229         dev_info->device =
230                 device_create(internal_desc->class, parent, dev_info->devt,
231                               gasket_dev, dev_info->name);
232
233         /* cdev has not yet been added; cdev_added is 0 */
234         dev_info->gasket_dev_ptr = gasket_dev;
235         /* ownership is all 0, indicating no owner or opens. */
236
237         return 0;
238 }
239
240 /* Free a Gasket device. */
241 static void gasket_free_dev(struct gasket_dev *gasket_dev)
242 {
243         struct gasket_internal_desc *internal_desc = gasket_dev->internal_desc;
244
245         mutex_lock(&internal_desc->mutex);
246         internal_desc->devs[gasket_dev->dev_idx] = NULL;
247         mutex_unlock(&internal_desc->mutex);
248         put_device(gasket_dev->dev);
249         kfree(gasket_dev);
250 }
251
252 /*
253  * Maps the specified bar into kernel space.
254  *
255  * Returns 0 on success, a negative error code otherwise.
256  * A zero-sized BAR will not be mapped, but is not an error.
257  */
258 static int gasket_map_pci_bar(struct gasket_dev *gasket_dev, int bar_num)
259 {
260         struct gasket_internal_desc *internal_desc = gasket_dev->internal_desc;
261         const struct gasket_driver_desc *driver_desc =
262                 internal_desc->driver_desc;
263         ulong desc_bytes = driver_desc->bar_descriptions[bar_num].size;
264         int ret;
265
266         if (desc_bytes == 0)
267                 return 0;
268
269         if (driver_desc->bar_descriptions[bar_num].type != PCI_BAR) {
270                 /* not PCI: skip this entry */
271                 return 0;
272         }
273         /*
274          * pci_resource_start and pci_resource_len return a "resource_size_t",
275          * which is safely castable to ulong (which itself is the arg to
276          * request_mem_region).
277          */
278         gasket_dev->bar_data[bar_num].phys_base =
279                 (ulong)pci_resource_start(gasket_dev->pci_dev, bar_num);
280         if (!gasket_dev->bar_data[bar_num].phys_base) {
281                 dev_err(gasket_dev->dev, "Cannot get BAR%u base address\n",
282                         bar_num);
283                 return -EINVAL;
284         }
285
286         gasket_dev->bar_data[bar_num].length_bytes =
287                 (ulong)pci_resource_len(gasket_dev->pci_dev, bar_num);
288         if (gasket_dev->bar_data[bar_num].length_bytes < desc_bytes) {
289                 dev_err(gasket_dev->dev,
290                         "PCI BAR %u space is too small: %lu; expected >= %lu\n",
291                         bar_num, gasket_dev->bar_data[bar_num].length_bytes,
292                         desc_bytes);
293                 return -ENOMEM;
294         }
295
296         if (!request_mem_region(gasket_dev->bar_data[bar_num].phys_base,
297                                 gasket_dev->bar_data[bar_num].length_bytes,
298                                 gasket_dev->dev_info.name)) {
299                 dev_err(gasket_dev->dev,
300                         "Cannot get BAR %d memory region %p\n",
301                         bar_num, &gasket_dev->pci_dev->resource[bar_num]);
302                 return -EINVAL;
303         }
304
305         gasket_dev->bar_data[bar_num].virt_base =
306                 ioremap(gasket_dev->bar_data[bar_num].phys_base,
307                                 gasket_dev->bar_data[bar_num].length_bytes);
308         if (!gasket_dev->bar_data[bar_num].virt_base) {
309                 dev_err(gasket_dev->dev,
310                         "Cannot remap BAR %d memory region %p\n",
311                         bar_num, &gasket_dev->pci_dev->resource[bar_num]);
312                 ret = -ENOMEM;
313                 goto fail;
314         }
315
316         dma_set_mask(&gasket_dev->pci_dev->dev, DMA_BIT_MASK(64));
317         dma_set_coherent_mask(&gasket_dev->pci_dev->dev, DMA_BIT_MASK(64));
318
319         return 0;
320
321 fail:
322         iounmap(gasket_dev->bar_data[bar_num].virt_base);
323         release_mem_region(gasket_dev->bar_data[bar_num].phys_base,
324                            gasket_dev->bar_data[bar_num].length_bytes);
325         return ret;
326 }
327
328 /*
329  * Releases PCI BAR mapping.
330  *
331  * A zero-sized or not-mapped BAR will not be unmapped, but is not an error.
332  */
333 static void gasket_unmap_pci_bar(struct gasket_dev *dev, int bar_num)
334 {
335         ulong base, bytes;
336         struct gasket_internal_desc *internal_desc = dev->internal_desc;
337         const struct gasket_driver_desc *driver_desc =
338                 internal_desc->driver_desc;
339
340         if (driver_desc->bar_descriptions[bar_num].size == 0 ||
341             !dev->bar_data[bar_num].virt_base)
342                 return;
343
344         if (driver_desc->bar_descriptions[bar_num].type != PCI_BAR)
345                 return;
346
347         iounmap(dev->bar_data[bar_num].virt_base);
348         dev->bar_data[bar_num].virt_base = NULL;
349
350         base = pci_resource_start(dev->pci_dev, bar_num);
351         if (!base) {
352                 dev_err(dev->dev, "cannot get PCI BAR%u base address\n",
353                         bar_num);
354                 return;
355         }
356
357         bytes = pci_resource_len(dev->pci_dev, bar_num);
358         release_mem_region(base, bytes);
359 }
360
361 /*
362  * Setup PCI memory mapping for the specified device.
363  *
364  * Reads the BAR registers and sets up pointers to the device's memory mapped
365  * IO space.
366  *
367  * Returns 0 on success and a negative value otherwise.
368  */
369 static int gasket_setup_pci(struct pci_dev *pci_dev,
370                             struct gasket_dev *gasket_dev)
371 {
372         int i, mapped_bars, ret;
373
374         for (i = 0; i < PCI_STD_NUM_BARS; i++) {
375                 ret = gasket_map_pci_bar(gasket_dev, i);
376                 if (ret) {
377                         mapped_bars = i;
378                         goto fail;
379                 }
380         }
381
382         return 0;
383
384 fail:
385         for (i = 0; i < mapped_bars; i++)
386                 gasket_unmap_pci_bar(gasket_dev, i);
387
388         return -ENOMEM;
389 }
390
391 /* Unmaps memory for the specified device. */
392 static void gasket_cleanup_pci(struct gasket_dev *gasket_dev)
393 {
394         int i;
395
396         for (i = 0; i < PCI_STD_NUM_BARS; i++)
397                 gasket_unmap_pci_bar(gasket_dev, i);
398 }
399
400 /* Determine the health of the Gasket device. */
401 static int gasket_get_hw_status(struct gasket_dev *gasket_dev)
402 {
403         int status;
404         int i;
405         const struct gasket_driver_desc *driver_desc =
406                 gasket_dev->internal_desc->driver_desc;
407
408         status = gasket_check_and_invoke_callback_nolock(gasket_dev,
409                                                          driver_desc->device_status_cb);
410         if (status != GASKET_STATUS_ALIVE) {
411                 dev_dbg(gasket_dev->dev, "Hardware reported status %d.\n",
412                         status);
413                 return status;
414         }
415
416         status = gasket_interrupt_system_status(gasket_dev);
417         if (status != GASKET_STATUS_ALIVE) {
418                 dev_dbg(gasket_dev->dev,
419                         "Interrupt system reported status %d.\n", status);
420                 return status;
421         }
422
423         for (i = 0; i < driver_desc->num_page_tables; ++i) {
424                 status = gasket_page_table_system_status(gasket_dev->page_table[i]);
425                 if (status != GASKET_STATUS_ALIVE) {
426                         dev_dbg(gasket_dev->dev,
427                                 "Page table %d reported status %d.\n",
428                                 i, status);
429                         return status;
430                 }
431         }
432
433         return GASKET_STATUS_ALIVE;
434 }
435
436 static ssize_t
437 gasket_write_mappable_regions(char *buf,
438                               const struct gasket_driver_desc *driver_desc,
439                               int bar_index)
440 {
441         int i;
442         ssize_t written;
443         ssize_t total_written = 0;
444         ulong min_addr, max_addr;
445         struct gasket_bar_desc bar_desc =
446                 driver_desc->bar_descriptions[bar_index];
447
448         if (bar_desc.permissions == GASKET_NOMAP)
449                 return 0;
450         for (i = 0;
451              i < bar_desc.num_mappable_regions && total_written < PAGE_SIZE;
452              i++) {
453                 min_addr = bar_desc.mappable_regions[i].start -
454                            driver_desc->legacy_mmap_address_offset;
455                 max_addr = bar_desc.mappable_regions[i].start -
456                            driver_desc->legacy_mmap_address_offset +
457                            bar_desc.mappable_regions[i].length_bytes;
458                 written = scnprintf(buf, PAGE_SIZE - total_written,
459                                     "0x%08lx-0x%08lx\n", min_addr, max_addr);
460                 total_written += written;
461                 buf += written;
462         }
463         return total_written;
464 }
465
466 static ssize_t gasket_sysfs_data_show(struct device *device,
467                                       struct device_attribute *attr, char *buf)
468 {
469         int i, ret = 0;
470         ssize_t current_written = 0;
471         const struct gasket_driver_desc *driver_desc;
472         struct gasket_dev *gasket_dev;
473         struct gasket_sysfs_attribute *gasket_attr;
474         const struct gasket_bar_desc *bar_desc;
475         enum gasket_sysfs_attribute_type sysfs_type;
476
477         gasket_dev = gasket_sysfs_get_device_data(device);
478         if (!gasket_dev) {
479                 dev_err(device, "No sysfs mapping found for device\n");
480                 return 0;
481         }
482
483         gasket_attr = gasket_sysfs_get_attr(device, attr);
484         if (!gasket_attr) {
485                 dev_err(device, "No sysfs attr found for device\n");
486                 gasket_sysfs_put_device_data(device, gasket_dev);
487                 return 0;
488         }
489
490         driver_desc = gasket_dev->internal_desc->driver_desc;
491
492         sysfs_type =
493                 (enum gasket_sysfs_attribute_type)gasket_attr->data.attr_type;
494         switch (sysfs_type) {
495         case ATTR_BAR_OFFSETS:
496                 for (i = 0; i < PCI_STD_NUM_BARS; i++) {
497                         bar_desc = &driver_desc->bar_descriptions[i];
498                         if (bar_desc->size == 0)
499                                 continue;
500                         current_written =
501                                 snprintf(buf, PAGE_SIZE - ret, "%d: 0x%lx\n", i,
502                                          (ulong)bar_desc->base);
503                         buf += current_written;
504                         ret += current_written;
505                 }
506                 break;
507         case ATTR_BAR_SIZES:
508                 for (i = 0; i < PCI_STD_NUM_BARS; i++) {
509                         bar_desc = &driver_desc->bar_descriptions[i];
510                         if (bar_desc->size == 0)
511                                 continue;
512                         current_written =
513                                 snprintf(buf, PAGE_SIZE - ret, "%d: 0x%lx\n", i,
514                                          (ulong)bar_desc->size);
515                         buf += current_written;
516                         ret += current_written;
517                 }
518                 break;
519         case ATTR_DRIVER_VERSION:
520                 ret = snprintf(buf, PAGE_SIZE, "%s\n",
521                                gasket_dev->internal_desc->driver_desc->driver_version);
522                 break;
523         case ATTR_FRAMEWORK_VERSION:
524                 ret = snprintf(buf, PAGE_SIZE, "%s\n",
525                                GASKET_FRAMEWORK_VERSION);
526                 break;
527         case ATTR_DEVICE_TYPE:
528                 ret = snprintf(buf, PAGE_SIZE, "%s\n",
529                                gasket_dev->internal_desc->driver_desc->name);
530                 break;
531         case ATTR_HARDWARE_REVISION:
532                 ret = snprintf(buf, PAGE_SIZE, "%d\n",
533                                gasket_dev->hardware_revision);
534                 break;
535         case ATTR_PCI_ADDRESS:
536                 ret = snprintf(buf, PAGE_SIZE, "%s\n", gasket_dev->kobj_name);
537                 break;
538         case ATTR_STATUS:
539                 ret = snprintf(buf, PAGE_SIZE, "%s\n",
540                                gasket_num_name_lookup(gasket_dev->status,
541                                                       gasket_status_name_table));
542                 break;
543         case ATTR_IS_DEVICE_OWNED:
544                 ret = snprintf(buf, PAGE_SIZE, "%d\n",
545                                gasket_dev->dev_info.ownership.is_owned);
546                 break;
547         case ATTR_DEVICE_OWNER:
548                 ret = snprintf(buf, PAGE_SIZE, "%d\n",
549                                gasket_dev->dev_info.ownership.owner);
550                 break;
551         case ATTR_WRITE_OPEN_COUNT:
552                 ret = snprintf(buf, PAGE_SIZE, "%d\n",
553                                gasket_dev->dev_info.ownership.write_open_count);
554                 break;
555         case ATTR_RESET_COUNT:
556                 ret = snprintf(buf, PAGE_SIZE, "%d\n", gasket_dev->reset_count);
557                 break;
558         case ATTR_USER_MEM_RANGES:
559                 for (i = 0; i < PCI_STD_NUM_BARS; ++i) {
560                         current_written =
561                                 gasket_write_mappable_regions(buf, driver_desc,
562                                                               i);
563                         buf += current_written;
564                         ret += current_written;
565                 }
566                 break;
567         default:
568                 dev_dbg(gasket_dev->dev, "Unknown attribute: %s\n",
569                         attr->attr.name);
570                 ret = 0;
571                 break;
572         }
573
574         gasket_sysfs_put_attr(device, gasket_attr);
575         gasket_sysfs_put_device_data(device, gasket_dev);
576         return ret;
577 }
578
579 /* These attributes apply to all Gasket driver instances. */
580 static const struct gasket_sysfs_attribute gasket_sysfs_generic_attrs[] = {
581         GASKET_SYSFS_RO(bar_offsets, gasket_sysfs_data_show, ATTR_BAR_OFFSETS),
582         GASKET_SYSFS_RO(bar_sizes, gasket_sysfs_data_show, ATTR_BAR_SIZES),
583         GASKET_SYSFS_RO(driver_version, gasket_sysfs_data_show,
584                         ATTR_DRIVER_VERSION),
585         GASKET_SYSFS_RO(framework_version, gasket_sysfs_data_show,
586                         ATTR_FRAMEWORK_VERSION),
587         GASKET_SYSFS_RO(device_type, gasket_sysfs_data_show, ATTR_DEVICE_TYPE),
588         GASKET_SYSFS_RO(revision, gasket_sysfs_data_show,
589                         ATTR_HARDWARE_REVISION),
590         GASKET_SYSFS_RO(pci_address, gasket_sysfs_data_show, ATTR_PCI_ADDRESS),
591         GASKET_SYSFS_RO(status, gasket_sysfs_data_show, ATTR_STATUS),
592         GASKET_SYSFS_RO(is_device_owned, gasket_sysfs_data_show,
593                         ATTR_IS_DEVICE_OWNED),
594         GASKET_SYSFS_RO(device_owner, gasket_sysfs_data_show,
595                         ATTR_DEVICE_OWNER),
596         GASKET_SYSFS_RO(write_open_count, gasket_sysfs_data_show,
597                         ATTR_WRITE_OPEN_COUNT),
598         GASKET_SYSFS_RO(reset_count, gasket_sysfs_data_show, ATTR_RESET_COUNT),
599         GASKET_SYSFS_RO(user_mem_ranges, gasket_sysfs_data_show,
600                         ATTR_USER_MEM_RANGES),
601         GASKET_END_OF_ATTR_ARRAY
602 };
603
604 /* Add a char device and related info. */
605 static int gasket_add_cdev(struct gasket_cdev_info *dev_info,
606                            const struct file_operations *file_ops,
607                            struct module *owner)
608 {
609         int ret;
610
611         cdev_init(&dev_info->cdev, file_ops);
612         dev_info->cdev.owner = owner;
613         ret = cdev_add(&dev_info->cdev, dev_info->devt, 1);
614         if (ret) {
615                 dev_err(dev_info->gasket_dev_ptr->dev,
616                         "cannot add char device [ret=%d]\n", ret);
617                 return ret;
618         }
619         dev_info->cdev_added = 1;
620
621         return 0;
622 }
623
624 /* Disable device operations. */
625 void gasket_disable_device(struct gasket_dev *gasket_dev)
626 {
627         const struct gasket_driver_desc *driver_desc =
628                 gasket_dev->internal_desc->driver_desc;
629         int i;
630
631         /* Only delete the device if it has been successfully added. */
632         if (gasket_dev->dev_info.cdev_added)
633                 cdev_del(&gasket_dev->dev_info.cdev);
634
635         gasket_dev->status = GASKET_STATUS_DEAD;
636
637         gasket_interrupt_cleanup(gasket_dev);
638
639         for (i = 0; i < driver_desc->num_page_tables; ++i) {
640                 if (gasket_dev->page_table[i]) {
641                         gasket_page_table_reset(gasket_dev->page_table[i]);
642                         gasket_page_table_cleanup(gasket_dev->page_table[i]);
643                 }
644         }
645 }
646 EXPORT_SYMBOL(gasket_disable_device);
647
648 /*
649  * Registered driver descriptor lookup for PCI devices.
650  *
651  * Precondition: Called with g_mutex held (to avoid a race on return).
652  * Returns NULL if no matching device was found.
653  */
654 static struct gasket_internal_desc *
655 lookup_pci_internal_desc(struct pci_dev *pci_dev)
656 {
657         int i;
658
659         __must_hold(&g_mutex);
660         for (i = 0; i < GASKET_FRAMEWORK_DESC_MAX; i++) {
661                 if (g_descs[i].driver_desc &&
662                     g_descs[i].driver_desc->pci_id_table &&
663                     pci_match_id(g_descs[i].driver_desc->pci_id_table, pci_dev))
664                         return &g_descs[i];
665         }
666
667         return NULL;
668 }
669
670 /*
671  * Verifies that the user has permissions to perform the requested mapping and
672  * that the provided descriptor/range is of adequate size to hold the range to
673  * be mapped.
674  */
675 static bool gasket_mmap_has_permissions(struct gasket_dev *gasket_dev,
676                                         struct vm_area_struct *vma,
677                                         int bar_permissions)
678 {
679         int requested_permissions;
680         /* Always allow sysadmin to access. */
681         if (capable(CAP_SYS_ADMIN))
682                 return true;
683
684         /* Never allow non-sysadmins to access to a dead device. */
685         if (gasket_dev->status != GASKET_STATUS_ALIVE) {
686                 dev_dbg(gasket_dev->dev, "Device is dead.\n");
687                 return false;
688         }
689
690         /* Make sure that no wrong flags are set. */
691         requested_permissions =
692                 (vma->vm_flags & VM_ACCESS_FLAGS);
693         if (requested_permissions & ~(bar_permissions)) {
694                 dev_dbg(gasket_dev->dev,
695                         "Attempting to map a region with requested permissions 0x%x, but region has permissions 0x%x.\n",
696                         requested_permissions, bar_permissions);
697                 return false;
698         }
699
700         /* Do not allow a non-owner to write. */
701         if ((vma->vm_flags & VM_WRITE) &&
702             !gasket_owned_by_current_tgid(&gasket_dev->dev_info)) {
703                 dev_dbg(gasket_dev->dev,
704                         "Attempting to mmap a region for write without owning device.\n");
705                 return false;
706         }
707
708         return true;
709 }
710
711 /*
712  * Verifies that the input address is within the region allocated to coherent
713  * buffer.
714  */
715 static bool
716 gasket_is_coherent_region(const struct gasket_driver_desc *driver_desc,
717                           ulong address)
718 {
719         struct gasket_coherent_buffer_desc coh_buff_desc =
720                 driver_desc->coherent_buffer_description;
721
722         if (coh_buff_desc.permissions != GASKET_NOMAP) {
723                 if ((address >= coh_buff_desc.base) &&
724                     (address < coh_buff_desc.base + coh_buff_desc.size)) {
725                         return true;
726                 }
727         }
728         return false;
729 }
730
731 static int gasket_get_bar_index(const struct gasket_dev *gasket_dev,
732                                 ulong phys_addr)
733 {
734         int i;
735         const struct gasket_driver_desc *driver_desc;
736
737         driver_desc = gasket_dev->internal_desc->driver_desc;
738         for (i = 0; i < PCI_STD_NUM_BARS; ++i) {
739                 struct gasket_bar_desc bar_desc =
740                         driver_desc->bar_descriptions[i];
741
742                 if (bar_desc.permissions != GASKET_NOMAP) {
743                         if (phys_addr >= bar_desc.base &&
744                             phys_addr < (bar_desc.base + bar_desc.size)) {
745                                 return i;
746                         }
747                 }
748         }
749         /* If we haven't found the address by now, it is invalid. */
750         return -EINVAL;
751 }
752
753 /*
754  * Sets the actual bounds to map, given the device's mappable region.
755  *
756  * Given the device's mappable region, along with the user-requested mapping
757  * start offset and length of the user region, determine how much of this
758  * mappable region can be mapped into the user's region (start/end offsets),
759  * and the physical offset (phys_offset) into the BAR where the mapping should
760  * begin (either the VMA's or region lower bound).
761  *
762  * In other words, this calculates the overlap between the VMA
763  * (bar_offset, requested_length) and the given gasket_mappable_region.
764  *
765  * Returns true if there's anything to map, and false otherwise.
766  */
767 static bool
768 gasket_mm_get_mapping_addrs(const struct gasket_mappable_region *region,
769                             ulong bar_offset, ulong requested_length,
770                             struct gasket_mappable_region *mappable_region,
771                             ulong *virt_offset)
772 {
773         ulong range_start = region->start;
774         ulong range_length = region->length_bytes;
775         ulong range_end = range_start + range_length;
776
777         *virt_offset = 0;
778         if (bar_offset + requested_length < range_start) {
779                 /*
780                  * If the requested region is completely below the range,
781                  * there is nothing to map.
782                  */
783                 return false;
784         } else if (bar_offset <= range_start) {
785                 /* If the bar offset is below this range's start
786                  * but the requested length continues into it:
787                  * 1) Only map starting from the beginning of this
788                  *      range's phys. offset, so we don't map unmappable
789                  *      memory.
790                  * 2) The length of the virtual memory to not map is the
791                  *      delta between the bar offset and the
792                  *      mappable start (and since the mappable start is
793                  *      bigger, start - req.)
794                  * 3) The map length is the minimum of the mappable
795                  *      requested length (requested_length - virt_offset)
796                  *      and the actual mappable length of the range.
797                  */
798                 mappable_region->start = range_start;
799                 *virt_offset = range_start - bar_offset;
800                 mappable_region->length_bytes =
801                         min(requested_length - *virt_offset, range_length);
802                 return true;
803         } else if (bar_offset > range_start &&
804                    bar_offset < range_end) {
805                 /*
806                  * If the bar offset is within this range:
807                  * 1) Map starting from the bar offset.
808                  * 2) Because there is no forbidden memory between the
809                  *      bar offset and the range start,
810                  *      virt_offset is 0.
811                  * 3) The map length is the minimum of the requested
812                  *      length and the remaining length in the buffer
813                  *      (range_end - bar_offset)
814                  */
815                 mappable_region->start = bar_offset;
816                 *virt_offset = 0;
817                 mappable_region->length_bytes =
818                         min(requested_length, range_end - bar_offset);
819                 return true;
820         }
821
822         /*
823          * If the requested [start] offset is above range_end,
824          * there's nothing to map.
825          */
826         return false;
827 }
828
829 /*
830  * Calculates the offset where the VMA range begins in its containing BAR.
831  * The offset is written into bar_offset on success.
832  * Returns zero on success, anything else on error.
833  */
834 static int gasket_mm_vma_bar_offset(const struct gasket_dev *gasket_dev,
835                                     const struct vm_area_struct *vma,
836                                     ulong *bar_offset)
837 {
838         ulong raw_offset;
839         int bar_index;
840         const struct gasket_driver_desc *driver_desc =
841                 gasket_dev->internal_desc->driver_desc;
842
843         raw_offset = (vma->vm_pgoff << PAGE_SHIFT) +
844                 driver_desc->legacy_mmap_address_offset;
845         bar_index = gasket_get_bar_index(gasket_dev, raw_offset);
846         if (bar_index < 0) {
847                 dev_err(gasket_dev->dev,
848                         "Unable to find matching bar for address 0x%lx\n",
849                         raw_offset);
850                 trace_gasket_mmap_exit(bar_index);
851                 return bar_index;
852         }
853         *bar_offset =
854                 raw_offset - driver_desc->bar_descriptions[bar_index].base;
855
856         return 0;
857 }
858
859 int gasket_mm_unmap_region(const struct gasket_dev *gasket_dev,
860                            struct vm_area_struct *vma,
861                            const struct gasket_mappable_region *map_region)
862 {
863         ulong bar_offset;
864         ulong virt_offset;
865         struct gasket_mappable_region mappable_region;
866         int ret;
867
868         if (map_region->length_bytes == 0)
869                 return 0;
870
871         ret = gasket_mm_vma_bar_offset(gasket_dev, vma, &bar_offset);
872         if (ret)
873                 return ret;
874
875         if (!gasket_mm_get_mapping_addrs(map_region, bar_offset,
876                                          vma->vm_end - vma->vm_start,
877                                          &mappable_region, &virt_offset))
878                 return 1;
879
880         /*
881          * The length passed to zap_vma_ptes MUST BE A MULTIPLE OF
882          * PAGE_SIZE! Trust me. I have the scars.
883          *
884          * Next multiple of y: ceil_div(x, y) * y
885          */
886         zap_vma_ptes(vma, vma->vm_start + virt_offset,
887                      DIV_ROUND_UP(mappable_region.length_bytes, PAGE_SIZE) *
888                      PAGE_SIZE);
889         return 0;
890 }
891 EXPORT_SYMBOL(gasket_mm_unmap_region);
892
893 /* Maps a virtual address + range to a physical offset of a BAR. */
894 static enum do_map_region_status
895 do_map_region(const struct gasket_dev *gasket_dev, struct vm_area_struct *vma,
896               struct gasket_mappable_region *mappable_region)
897 {
898         /* Maximum size of a single call to io_remap_pfn_range. */
899         /* I pulled this number out of thin air. */
900         const ulong max_chunk_size = 64 * 1024 * 1024;
901         ulong chunk_size, mapped_bytes = 0;
902
903         const struct gasket_driver_desc *driver_desc =
904                 gasket_dev->internal_desc->driver_desc;
905
906         ulong bar_offset, virt_offset;
907         struct gasket_mappable_region region_to_map;
908         ulong phys_offset, map_length;
909         ulong virt_base, phys_base;
910         int bar_index, ret;
911
912         ret = gasket_mm_vma_bar_offset(gasket_dev, vma, &bar_offset);
913         if (ret)
914                 return DO_MAP_REGION_INVALID;
915
916         if (!gasket_mm_get_mapping_addrs(mappable_region, bar_offset,
917                                          vma->vm_end - vma->vm_start,
918                                          &region_to_map, &virt_offset))
919                 return DO_MAP_REGION_INVALID;
920         phys_offset = region_to_map.start;
921         map_length = region_to_map.length_bytes;
922
923         virt_base = vma->vm_start + virt_offset;
924         bar_index =
925                 gasket_get_bar_index(gasket_dev,
926                                      (vma->vm_pgoff << PAGE_SHIFT) +
927                                      driver_desc->legacy_mmap_address_offset);
928         phys_base = gasket_dev->bar_data[bar_index].phys_base + phys_offset;
929         while (mapped_bytes < map_length) {
930                 /*
931                  * io_remap_pfn_range can take a while, so we chunk its
932                  * calls and call cond_resched between each.
933                  */
934                 chunk_size = min(max_chunk_size, map_length - mapped_bytes);
935
936                 cond_resched();
937                 ret = io_remap_pfn_range(vma, virt_base + mapped_bytes,
938                                          (phys_base + mapped_bytes) >>
939                                          PAGE_SHIFT, chunk_size,
940                                          vma->vm_page_prot);
941                 if (ret) {
942                         dev_err(gasket_dev->dev,
943                                 "Error remapping PFN range.\n");
944                         goto fail;
945                 }
946                 mapped_bytes += chunk_size;
947         }
948
949         return DO_MAP_REGION_SUCCESS;
950
951 fail:
952         /* Unmap the partial chunk we mapped. */
953         mappable_region->length_bytes = mapped_bytes;
954         if (gasket_mm_unmap_region(gasket_dev, vma, mappable_region))
955                 dev_err(gasket_dev->dev,
956                         "Error unmapping partial region 0x%lx (0x%lx bytes)\n",
957                         (ulong)virt_offset,
958                         (ulong)mapped_bytes);
959
960         return DO_MAP_REGION_FAILURE;
961 }
962
963 /* Map a region of coherent memory. */
964 static int gasket_mmap_coherent(struct gasket_dev *gasket_dev,
965                                 struct vm_area_struct *vma)
966 {
967         const struct gasket_driver_desc *driver_desc =
968                 gasket_dev->internal_desc->driver_desc;
969         const ulong requested_length = vma->vm_end - vma->vm_start;
970         int ret;
971         ulong permissions;
972
973         if (requested_length == 0 || requested_length >
974             gasket_dev->coherent_buffer.length_bytes) {
975                 trace_gasket_mmap_exit(-EINVAL);
976                 return -EINVAL;
977         }
978
979         permissions = driver_desc->coherent_buffer_description.permissions;
980         if (!gasket_mmap_has_permissions(gasket_dev, vma, permissions)) {
981                 dev_err(gasket_dev->dev, "Permission checking failed.\n");
982                 trace_gasket_mmap_exit(-EPERM);
983                 return -EPERM;
984         }
985
986         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
987
988         ret = remap_pfn_range(vma, vma->vm_start,
989                               (gasket_dev->coherent_buffer.phys_base) >>
990                               PAGE_SHIFT, requested_length, vma->vm_page_prot);
991         if (ret) {
992                 dev_err(gasket_dev->dev, "Error remapping PFN range err=%d.\n",
993                         ret);
994                 trace_gasket_mmap_exit(ret);
995                 return ret;
996         }
997
998         /* Record the user virtual to dma_address mapping that was
999          * created by the kernel.
1000          */
1001         gasket_set_user_virt(gasket_dev, requested_length,
1002                              gasket_dev->coherent_buffer.phys_base,
1003                              vma->vm_start);
1004         return 0;
1005 }
1006
1007 /* Map a device's BARs into user space. */
1008 static int gasket_mmap(struct file *filp, struct vm_area_struct *vma)
1009 {
1010         int i, ret;
1011         int bar_index;
1012         int has_mapped_anything = 0;
1013         ulong permissions;
1014         ulong raw_offset, vma_size;
1015         bool is_coherent_region;
1016         const struct gasket_driver_desc *driver_desc;
1017         struct gasket_dev *gasket_dev = (struct gasket_dev *)filp->private_data;
1018         const struct gasket_bar_desc *bar_desc;
1019         struct gasket_mappable_region *map_regions = NULL;
1020         int num_map_regions = 0;
1021         enum do_map_region_status map_status;
1022
1023         driver_desc = gasket_dev->internal_desc->driver_desc;
1024
1025         if (vma->vm_start & ~PAGE_MASK) {
1026                 dev_err(gasket_dev->dev,
1027                         "Base address not page-aligned: 0x%lx\n",
1028                         vma->vm_start);
1029                 trace_gasket_mmap_exit(-EINVAL);
1030                 return -EINVAL;
1031         }
1032
1033         /* Calculate the offset of this range into physical mem. */
1034         raw_offset = (vma->vm_pgoff << PAGE_SHIFT) +
1035                 driver_desc->legacy_mmap_address_offset;
1036         vma_size = vma->vm_end - vma->vm_start;
1037         trace_gasket_mmap_entry(gasket_dev->dev_info.name, raw_offset,
1038                                 vma_size);
1039
1040         /*
1041          * Check if the raw offset is within a bar region. If not, check if it
1042          * is a coherent region.
1043          */
1044         bar_index = gasket_get_bar_index(gasket_dev, raw_offset);
1045         is_coherent_region = gasket_is_coherent_region(driver_desc, raw_offset);
1046         if (bar_index < 0 && !is_coherent_region) {
1047                 dev_err(gasket_dev->dev,
1048                         "Unable to find matching bar for address 0x%lx\n",
1049                         raw_offset);
1050                 trace_gasket_mmap_exit(bar_index);
1051                 return bar_index;
1052         }
1053         if (bar_index > 0 && is_coherent_region) {
1054                 dev_err(gasket_dev->dev,
1055                         "double matching bar and coherent buffers for address 0x%lx\n",
1056                         raw_offset);
1057                 trace_gasket_mmap_exit(bar_index);
1058                 return -EINVAL;
1059         }
1060
1061         vma->vm_private_data = gasket_dev;
1062
1063         if (is_coherent_region)
1064                 return gasket_mmap_coherent(gasket_dev, vma);
1065
1066         /* Everything in the rest of this function is for normal BAR mapping. */
1067
1068         /*
1069          * Subtract the base of the bar from the raw offset to get the
1070          * memory location within the bar to map.
1071          */
1072         bar_desc = &driver_desc->bar_descriptions[bar_index];
1073         permissions = bar_desc->permissions;
1074         if (!gasket_mmap_has_permissions(gasket_dev, vma, permissions)) {
1075                 dev_err(gasket_dev->dev, "Permission checking failed.\n");
1076                 trace_gasket_mmap_exit(-EPERM);
1077                 return -EPERM;
1078         }
1079
1080         if (driver_desc->get_mappable_regions_cb) {
1081                 ret = driver_desc->get_mappable_regions_cb(gasket_dev,
1082                                                            bar_index,
1083                                                            &map_regions,
1084                                                            &num_map_regions);
1085                 if (ret)
1086                         return ret;
1087         } else {
1088                 if (!gasket_mmap_has_permissions(gasket_dev, vma,
1089                                                  bar_desc->permissions)) {
1090                         dev_err(gasket_dev->dev,
1091                                 "Permission checking failed.\n");
1092                         trace_gasket_mmap_exit(-EPERM);
1093                         return -EPERM;
1094                 }
1095                 num_map_regions = bar_desc->num_mappable_regions;
1096                 map_regions = kcalloc(num_map_regions,
1097                                       sizeof(*bar_desc->mappable_regions),
1098                                       GFP_KERNEL);
1099                 if (map_regions) {
1100                         memcpy(map_regions, bar_desc->mappable_regions,
1101                                num_map_regions *
1102                                         sizeof(*bar_desc->mappable_regions));
1103                 }
1104         }
1105
1106         if (!map_regions || num_map_regions == 0) {
1107                 dev_err(gasket_dev->dev, "No mappable regions returned!\n");
1108                 return -EINVAL;
1109         }
1110
1111         /* Marks the VMA's pages as uncacheable. */
1112         vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
1113         for (i = 0; i < num_map_regions; i++) {
1114                 map_status = do_map_region(gasket_dev, vma, &map_regions[i]);
1115                 /* Try the next region if this one was not mappable. */
1116                 if (map_status == DO_MAP_REGION_INVALID)
1117                         continue;
1118                 if (map_status == DO_MAP_REGION_FAILURE) {
1119                         ret = -ENOMEM;
1120                         goto fail;
1121                 }
1122
1123                 has_mapped_anything = 1;
1124         }
1125
1126         kfree(map_regions);
1127
1128         /* If we could not map any memory, the request was invalid. */
1129         if (!has_mapped_anything) {
1130                 dev_err(gasket_dev->dev,
1131                         "Map request did not contain a valid region.\n");
1132                 trace_gasket_mmap_exit(-EINVAL);
1133                 return -EINVAL;
1134         }
1135
1136         trace_gasket_mmap_exit(0);
1137         return 0;
1138
1139 fail:
1140         /* Need to unmap any mapped ranges. */
1141         num_map_regions = i;
1142         for (i = 0; i < num_map_regions; i++)
1143                 if (gasket_mm_unmap_region(gasket_dev, vma,
1144                                            &bar_desc->mappable_regions[i]))
1145                         dev_err(gasket_dev->dev, "Error unmapping range %d.\n",
1146                                 i);
1147         kfree(map_regions);
1148
1149         return ret;
1150 }
1151
1152 /*
1153  * Open the char device file.
1154  *
1155  * If the open is for writing, and the device is not owned, this process becomes
1156  * the owner.  If the open is for writing and the device is already owned by
1157  * some other process, it is an error.  If this process is the owner, increment
1158  * the open count.
1159  *
1160  * Returns 0 if successful, a negative error number otherwise.
1161  */
1162 static int gasket_open(struct inode *inode, struct file *filp)
1163 {
1164         int ret;
1165         struct gasket_dev *gasket_dev;
1166         const struct gasket_driver_desc *driver_desc;
1167         struct gasket_ownership *ownership;
1168         char task_name[TASK_COMM_LEN];
1169         struct gasket_cdev_info *dev_info =
1170             container_of(inode->i_cdev, struct gasket_cdev_info, cdev);
1171         struct pid_namespace *pid_ns = task_active_pid_ns(current);
1172         bool is_root = ns_capable(pid_ns->user_ns, CAP_SYS_ADMIN);
1173
1174         gasket_dev = dev_info->gasket_dev_ptr;
1175         driver_desc = gasket_dev->internal_desc->driver_desc;
1176         ownership = &dev_info->ownership;
1177         get_task_comm(task_name, current);
1178         filp->private_data = gasket_dev;
1179         inode->i_size = 0;
1180
1181         dev_dbg(gasket_dev->dev,
1182                 "Attempting to open with tgid %u (%s) (f_mode: 0%03o, fmode_write: %d is_root: %u)\n",
1183                 current->tgid, task_name, filp->f_mode,
1184                 (filp->f_mode & FMODE_WRITE), is_root);
1185
1186         /* Always allow non-writing accesses. */
1187         if (!(filp->f_mode & FMODE_WRITE)) {
1188                 dev_dbg(gasket_dev->dev, "Allowing read-only opening.\n");
1189                 return 0;
1190         }
1191
1192         mutex_lock(&gasket_dev->mutex);
1193
1194         dev_dbg(gasket_dev->dev,
1195                 "Current owner open count (owning tgid %u): %d.\n",
1196                 ownership->owner, ownership->write_open_count);
1197
1198         /* Opening a node owned by another TGID is an error (unless root) */
1199         if (ownership->is_owned && ownership->owner != current->tgid &&
1200             !is_root) {
1201                 dev_err(gasket_dev->dev,
1202                         "Process %u is opening a node held by %u.\n",
1203                         current->tgid, ownership->owner);
1204                 mutex_unlock(&gasket_dev->mutex);
1205                 return -EPERM;
1206         }
1207
1208         /* If the node is not owned, assign it to the current TGID. */
1209         if (!ownership->is_owned) {
1210                 ret = gasket_check_and_invoke_callback_nolock(gasket_dev,
1211                                                               driver_desc->device_open_cb);
1212                 if (ret) {
1213                         dev_err(gasket_dev->dev,
1214                                 "Error in device open cb: %d\n", ret);
1215                         mutex_unlock(&gasket_dev->mutex);
1216                         return ret;
1217                 }
1218                 ownership->is_owned = 1;
1219                 ownership->owner = current->tgid;
1220                 dev_dbg(gasket_dev->dev, "Device owner is now tgid %u\n",
1221                         ownership->owner);
1222         }
1223
1224         ownership->write_open_count++;
1225
1226         dev_dbg(gasket_dev->dev, "New open count (owning tgid %u): %d\n",
1227                 ownership->owner, ownership->write_open_count);
1228
1229         mutex_unlock(&gasket_dev->mutex);
1230         return 0;
1231 }
1232
1233 /*
1234  * Called on a close of the device file.  If this process is the owner,
1235  * decrement the open count.  On last close by the owner, free up buffers and
1236  * eventfd contexts, and release ownership.
1237  *
1238  * Returns 0 if successful, a negative error number otherwise.
1239  */
1240 static int gasket_release(struct inode *inode, struct file *file)
1241 {
1242         int i;
1243         struct gasket_dev *gasket_dev;
1244         struct gasket_ownership *ownership;
1245         const struct gasket_driver_desc *driver_desc;
1246         char task_name[TASK_COMM_LEN];
1247         struct gasket_cdev_info *dev_info =
1248                 container_of(inode->i_cdev, struct gasket_cdev_info, cdev);
1249         struct pid_namespace *pid_ns = task_active_pid_ns(current);
1250         bool is_root = ns_capable(pid_ns->user_ns, CAP_SYS_ADMIN);
1251
1252         gasket_dev = dev_info->gasket_dev_ptr;
1253         driver_desc = gasket_dev->internal_desc->driver_desc;
1254         ownership = &dev_info->ownership;
1255         get_task_comm(task_name, current);
1256         mutex_lock(&gasket_dev->mutex);
1257
1258         dev_dbg(gasket_dev->dev,
1259                 "Releasing device node. Call origin: tgid %u (%s) (f_mode: 0%03o, fmode_write: %d, is_root: %u)\n",
1260                 current->tgid, task_name, file->f_mode,
1261                 (file->f_mode & FMODE_WRITE), is_root);
1262         dev_dbg(gasket_dev->dev, "Current open count (owning tgid %u): %d\n",
1263                 ownership->owner, ownership->write_open_count);
1264
1265         if (file->f_mode & FMODE_WRITE) {
1266                 ownership->write_open_count--;
1267                 if (ownership->write_open_count == 0) {
1268                         dev_dbg(gasket_dev->dev, "Device is now free\n");
1269                         ownership->is_owned = 0;
1270                         ownership->owner = 0;
1271
1272                         /* Forces chip reset before we unmap the page tables. */
1273                         driver_desc->device_reset_cb(gasket_dev);
1274
1275                         for (i = 0; i < driver_desc->num_page_tables; ++i) {
1276                                 gasket_page_table_unmap_all(gasket_dev->page_table[i]);
1277                                 gasket_page_table_garbage_collect(gasket_dev->page_table[i]);
1278                                 gasket_free_coherent_memory_all(gasket_dev, i);
1279                         }
1280
1281                         /* Closes device, enters power save. */
1282                         gasket_check_and_invoke_callback_nolock(gasket_dev,
1283                                                                 driver_desc->device_close_cb);
1284                 }
1285         }
1286
1287         dev_dbg(gasket_dev->dev, "New open count (owning tgid %u): %d\n",
1288                 ownership->owner, ownership->write_open_count);
1289         mutex_unlock(&gasket_dev->mutex);
1290         return 0;
1291 }
1292
1293 /*
1294  * Gasket ioctl dispatch function.
1295  *
1296  * Check if the ioctl is a generic ioctl. If not, pass the ioctl to the
1297  * ioctl_handler_cb registered in the driver description.
1298  * If the ioctl is a generic ioctl, pass it to gasket_ioctl_handler.
1299  */
1300 static long gasket_ioctl(struct file *filp, uint cmd, ulong arg)
1301 {
1302         struct gasket_dev *gasket_dev;
1303         const struct gasket_driver_desc *driver_desc;
1304         void __user *argp = (void __user *)arg;
1305         char path[256];
1306
1307         gasket_dev = (struct gasket_dev *)filp->private_data;
1308         driver_desc = gasket_dev->internal_desc->driver_desc;
1309         if (!driver_desc) {
1310                 dev_dbg(gasket_dev->dev,
1311                         "Unable to find device descriptor for file %s\n",
1312                         d_path(&filp->f_path, path, 256));
1313                 return -ENODEV;
1314         }
1315
1316         if (!gasket_is_supported_ioctl(cmd)) {
1317                 /*
1318                  * The ioctl handler is not a standard Gasket callback, since
1319                  * it requires different arguments. This means we can't use
1320                  * check_and_invoke_callback.
1321                  */
1322                 if (driver_desc->ioctl_handler_cb)
1323                         return driver_desc->ioctl_handler_cb(filp, cmd, argp);
1324
1325                 dev_dbg(gasket_dev->dev, "Received unknown ioctl 0x%x\n", cmd);
1326                 return -EINVAL;
1327         }
1328
1329         return gasket_handle_ioctl(filp, cmd, argp);
1330 }
1331
1332 /* File operations for all Gasket devices. */
1333 static const struct file_operations gasket_file_ops = {
1334         .owner = THIS_MODULE,
1335         .llseek = no_llseek,
1336         .mmap = gasket_mmap,
1337         .open = gasket_open,
1338         .release = gasket_release,
1339         .unlocked_ioctl = gasket_ioctl,
1340 };
1341
1342 /* Perform final init and marks the device as active. */
1343 int gasket_enable_device(struct gasket_dev *gasket_dev)
1344 {
1345         int tbl_idx;
1346         int ret;
1347         const struct gasket_driver_desc *driver_desc =
1348                 gasket_dev->internal_desc->driver_desc;
1349
1350         ret = gasket_interrupt_init(gasket_dev);
1351         if (ret) {
1352                 dev_err(gasket_dev->dev,
1353                         "Critical failure to allocate interrupts: %d\n", ret);
1354                 gasket_interrupt_cleanup(gasket_dev);
1355                 return ret;
1356         }
1357
1358         for (tbl_idx = 0; tbl_idx < driver_desc->num_page_tables; tbl_idx++) {
1359                 dev_dbg(gasket_dev->dev, "Initializing page table %d.\n",
1360                         tbl_idx);
1361                 ret = gasket_page_table_init(&gasket_dev->page_table[tbl_idx],
1362                                              &gasket_dev->bar_data[driver_desc->page_table_bar_index],
1363                                              &driver_desc->page_table_configs[tbl_idx],
1364                                              gasket_dev->dev,
1365                                              gasket_dev->pci_dev);
1366                 if (ret) {
1367                         dev_err(gasket_dev->dev,
1368                                 "Couldn't init page table %d: %d\n",
1369                                 tbl_idx, ret);
1370                         return ret;
1371                 }
1372                 /*
1373                  * Make sure that the page table is clear and set to simple
1374                  * addresses.
1375                  */
1376                 gasket_page_table_reset(gasket_dev->page_table[tbl_idx]);
1377         }
1378
1379         /*
1380          * hardware_revision_cb returns a positive integer (the rev) if
1381          * successful.)
1382          */
1383         ret = check_and_invoke_callback(gasket_dev,
1384                                         driver_desc->hardware_revision_cb);
1385         if (ret < 0) {
1386                 dev_err(gasket_dev->dev,
1387                         "Error getting hardware revision: %d\n", ret);
1388                 return ret;
1389         }
1390         gasket_dev->hardware_revision = ret;
1391
1392         /* device_status_cb returns a device status, not an error code. */
1393         gasket_dev->status = gasket_get_hw_status(gasket_dev);
1394         if (gasket_dev->status == GASKET_STATUS_DEAD)
1395                 dev_err(gasket_dev->dev, "Device reported as unhealthy.\n");
1396
1397         ret = gasket_add_cdev(&gasket_dev->dev_info, &gasket_file_ops,
1398                               driver_desc->module);
1399         if (ret)
1400                 return ret;
1401
1402         return 0;
1403 }
1404 EXPORT_SYMBOL(gasket_enable_device);
1405
1406 static int __gasket_add_device(struct device *parent_dev,
1407                                struct gasket_internal_desc *internal_desc,
1408                                struct gasket_dev **gasket_devp)
1409 {
1410         int ret;
1411         struct gasket_dev *gasket_dev;
1412         const struct gasket_driver_desc *driver_desc =
1413             internal_desc->driver_desc;
1414
1415         ret = gasket_alloc_dev(internal_desc, parent_dev, &gasket_dev);
1416         if (ret)
1417                 return ret;
1418         if (IS_ERR(gasket_dev->dev_info.device)) {
1419                 dev_err(parent_dev, "Cannot create %s device %s [ret = %ld]\n",
1420                         driver_desc->name, gasket_dev->dev_info.name,
1421                         PTR_ERR(gasket_dev->dev_info.device));
1422                 ret = -ENODEV;
1423                 goto free_gasket_dev;
1424         }
1425
1426         ret = gasket_sysfs_create_mapping(gasket_dev->dev_info.device,
1427                                           gasket_dev);
1428         if (ret)
1429                 goto remove_device;
1430
1431         ret = gasket_sysfs_create_entries(gasket_dev->dev_info.device,
1432                                           gasket_sysfs_generic_attrs);
1433         if (ret)
1434                 goto remove_sysfs_mapping;
1435
1436         *gasket_devp = gasket_dev;
1437         return 0;
1438
1439 remove_sysfs_mapping:
1440         gasket_sysfs_remove_mapping(gasket_dev->dev_info.device);
1441 remove_device:
1442         device_destroy(internal_desc->class, gasket_dev->dev_info.devt);
1443 free_gasket_dev:
1444         gasket_free_dev(gasket_dev);
1445         return ret;
1446 }
1447
1448 static void __gasket_remove_device(struct gasket_internal_desc *internal_desc,
1449                                    struct gasket_dev *gasket_dev)
1450 {
1451         gasket_sysfs_remove_mapping(gasket_dev->dev_info.device);
1452         device_destroy(internal_desc->class, gasket_dev->dev_info.devt);
1453         gasket_free_dev(gasket_dev);
1454 }
1455
1456 /*
1457  * Add PCI gasket device.
1458  *
1459  * Called by Gasket device probe function.
1460  * Allocates device metadata and maps device memory.  The device driver must
1461  * call gasket_enable_device after driver init is complete to place the device
1462  * in active use.
1463  */
1464 int gasket_pci_add_device(struct pci_dev *pci_dev,
1465                           struct gasket_dev **gasket_devp)
1466 {
1467         int ret;
1468         struct gasket_internal_desc *internal_desc;
1469         struct gasket_dev *gasket_dev;
1470         struct device *parent;
1471
1472         dev_dbg(&pci_dev->dev, "add PCI gasket device\n");
1473
1474         mutex_lock(&g_mutex);
1475         internal_desc = lookup_pci_internal_desc(pci_dev);
1476         mutex_unlock(&g_mutex);
1477         if (!internal_desc) {
1478                 dev_err(&pci_dev->dev,
1479                         "PCI add device called for unknown driver type\n");
1480                 return -ENODEV;
1481         }
1482
1483         parent = &pci_dev->dev;
1484         ret = __gasket_add_device(parent, internal_desc, &gasket_dev);
1485         if (ret)
1486                 return ret;
1487
1488         gasket_dev->pci_dev = pci_dev;
1489         ret = gasket_setup_pci(pci_dev, gasket_dev);
1490         if (ret)
1491                 goto cleanup_pci;
1492
1493         /*
1494          * Once we've created the mapping structures successfully, attempt to
1495          * create a symlink to the pci directory of this object.
1496          */
1497         ret = sysfs_create_link(&gasket_dev->dev_info.device->kobj,
1498                                 &pci_dev->dev.kobj, dev_name(&pci_dev->dev));
1499         if (ret) {
1500                 dev_err(gasket_dev->dev,
1501                         "Cannot create sysfs pci link: %d\n", ret);
1502                 goto cleanup_pci;
1503         }
1504
1505         *gasket_devp = gasket_dev;
1506         return 0;
1507
1508 cleanup_pci:
1509         gasket_cleanup_pci(gasket_dev);
1510         __gasket_remove_device(internal_desc, gasket_dev);
1511         return ret;
1512 }
1513 EXPORT_SYMBOL(gasket_pci_add_device);
1514
1515 /* Remove a PCI gasket device. */
1516 void gasket_pci_remove_device(struct pci_dev *pci_dev)
1517 {
1518         int i;
1519         struct gasket_internal_desc *internal_desc;
1520         struct gasket_dev *gasket_dev = NULL;
1521         /* Find the device desc. */
1522         mutex_lock(&g_mutex);
1523         internal_desc = lookup_pci_internal_desc(pci_dev);
1524         if (!internal_desc) {
1525                 mutex_unlock(&g_mutex);
1526                 return;
1527         }
1528         mutex_unlock(&g_mutex);
1529
1530         /* Now find the specific device */
1531         mutex_lock(&internal_desc->mutex);
1532         for (i = 0; i < GASKET_DEV_MAX; i++) {
1533                 if (internal_desc->devs[i] &&
1534                     internal_desc->devs[i]->pci_dev == pci_dev) {
1535                         gasket_dev = internal_desc->devs[i];
1536                         break;
1537                 }
1538         }
1539         mutex_unlock(&internal_desc->mutex);
1540
1541         if (!gasket_dev)
1542                 return;
1543
1544         dev_dbg(gasket_dev->dev, "remove %s PCI gasket device\n",
1545                 internal_desc->driver_desc->name);
1546
1547         gasket_cleanup_pci(gasket_dev);
1548         __gasket_remove_device(internal_desc, gasket_dev);
1549 }
1550 EXPORT_SYMBOL(gasket_pci_remove_device);
1551
1552 /**
1553  * Lookup a name by number in a num_name table.
1554  * @num: Number to lookup.
1555  * @table: Array of num_name structures, the table for the lookup.
1556  *
1557  * Description: Searches for num in the table.  If found, the
1558  *              corresponding name is returned; otherwise NULL
1559  *              is returned.
1560  *
1561  *              The table must have a NULL name pointer at the end.
1562  */
1563 const char *gasket_num_name_lookup(uint num,
1564                                    const struct gasket_num_name *table)
1565 {
1566         uint i = 0;
1567
1568         while (table[i].snn_name) {
1569                 if (num == table[i].snn_num)
1570                         break;
1571                 ++i;
1572         }
1573
1574         return table[i].snn_name;
1575 }
1576 EXPORT_SYMBOL(gasket_num_name_lookup);
1577
1578 int gasket_reset(struct gasket_dev *gasket_dev)
1579 {
1580         int ret;
1581
1582         mutex_lock(&gasket_dev->mutex);
1583         ret = gasket_reset_nolock(gasket_dev);
1584         mutex_unlock(&gasket_dev->mutex);
1585         return ret;
1586 }
1587 EXPORT_SYMBOL(gasket_reset);
1588
1589 int gasket_reset_nolock(struct gasket_dev *gasket_dev)
1590 {
1591         int ret;
1592         int i;
1593         const struct gasket_driver_desc *driver_desc;
1594
1595         driver_desc = gasket_dev->internal_desc->driver_desc;
1596         if (!driver_desc->device_reset_cb)
1597                 return 0;
1598
1599         ret = driver_desc->device_reset_cb(gasket_dev);
1600         if (ret) {
1601                 dev_dbg(gasket_dev->dev, "Device reset cb returned %d.\n",
1602                         ret);
1603                 return ret;
1604         }
1605
1606         /* Reinitialize the page tables and interrupt framework. */
1607         for (i = 0; i < driver_desc->num_page_tables; ++i)
1608                 gasket_page_table_reset(gasket_dev->page_table[i]);
1609
1610         ret = gasket_interrupt_reinit(gasket_dev);
1611         if (ret) {
1612                 dev_dbg(gasket_dev->dev, "Unable to reinit interrupts: %d.\n",
1613                         ret);
1614                 return ret;
1615         }
1616
1617         /* Get current device health. */
1618         gasket_dev->status = gasket_get_hw_status(gasket_dev);
1619         if (gasket_dev->status == GASKET_STATUS_DEAD) {
1620                 dev_dbg(gasket_dev->dev, "Device reported as dead.\n");
1621                 return -EINVAL;
1622         }
1623
1624         return 0;
1625 }
1626 EXPORT_SYMBOL(gasket_reset_nolock);
1627
1628 gasket_ioctl_permissions_cb_t
1629 gasket_get_ioctl_permissions_cb(struct gasket_dev *gasket_dev)
1630 {
1631         return gasket_dev->internal_desc->driver_desc->ioctl_permissions_cb;
1632 }
1633 EXPORT_SYMBOL(gasket_get_ioctl_permissions_cb);
1634
1635 /* Get the driver structure for a given gasket_dev.
1636  * @dev: pointer to gasket_dev, implementing the requested driver.
1637  */
1638 const struct gasket_driver_desc *gasket_get_driver_desc(struct gasket_dev *dev)
1639 {
1640         return dev->internal_desc->driver_desc;
1641 }
1642
1643 /* Get the device structure for a given gasket_dev.
1644  * @dev: pointer to gasket_dev, implementing the requested driver.
1645  */
1646 struct device *gasket_get_device(struct gasket_dev *dev)
1647 {
1648         return dev->dev;
1649 }
1650
1651 /**
1652  * Asynchronously waits on device.
1653  * @gasket_dev: Device struct.
1654  * @bar: Bar
1655  * @offset: Register offset
1656  * @mask: Register mask
1657  * @val: Expected value
1658  * @max_retries: number of sleep periods
1659  * @delay_ms: Timeout in milliseconds
1660  *
1661  * Description: Busy waits for a specific combination of bits to be set on a
1662  * Gasket register.
1663  **/
1664 int gasket_wait_with_reschedule(struct gasket_dev *gasket_dev, int bar,
1665                                 u64 offset, u64 mask, u64 val,
1666                                 uint max_retries, u64 delay_ms)
1667 {
1668         uint retries = 0;
1669         u64 tmp;
1670
1671         while (retries < max_retries) {
1672                 tmp = gasket_dev_read_64(gasket_dev, bar, offset);
1673                 if ((tmp & mask) == val)
1674                         return 0;
1675                 msleep(delay_ms);
1676                 retries++;
1677         }
1678         dev_dbg(gasket_dev->dev, "%s timeout: reg %llx timeout (%llu ms)\n",
1679                 __func__, offset, max_retries * delay_ms);
1680         return -ETIMEDOUT;
1681 }
1682 EXPORT_SYMBOL(gasket_wait_with_reschedule);
1683
1684 /* See gasket_core.h for description. */
1685 int gasket_register_device(const struct gasket_driver_desc *driver_desc)
1686 {
1687         int i, ret;
1688         int desc_idx = -1;
1689         struct gasket_internal_desc *internal;
1690
1691         pr_debug("Loading %s driver version %s\n", driver_desc->name,
1692                  driver_desc->driver_version);
1693         /* Check for duplicates and find a free slot. */
1694         mutex_lock(&g_mutex);
1695
1696         for (i = 0; i < GASKET_FRAMEWORK_DESC_MAX; i++) {
1697                 if (g_descs[i].driver_desc == driver_desc) {
1698                         pr_err("%s driver already loaded/registered\n",
1699                                driver_desc->name);
1700                         mutex_unlock(&g_mutex);
1701                         return -EBUSY;
1702                 }
1703         }
1704
1705         /* This and the above loop could be combined, but this reads easier. */
1706         for (i = 0; i < GASKET_FRAMEWORK_DESC_MAX; i++) {
1707                 if (!g_descs[i].driver_desc) {
1708                         g_descs[i].driver_desc = driver_desc;
1709                         desc_idx = i;
1710                         break;
1711                 }
1712         }
1713         mutex_unlock(&g_mutex);
1714
1715         if (desc_idx == -1) {
1716                 pr_err("too many drivers loaded, max %d\n",
1717                        GASKET_FRAMEWORK_DESC_MAX);
1718                 return -EBUSY;
1719         }
1720
1721         internal = &g_descs[desc_idx];
1722         mutex_init(&internal->mutex);
1723         memset(internal->devs, 0, sizeof(struct gasket_dev *) * GASKET_DEV_MAX);
1724         internal->class =
1725                 class_create(driver_desc->module, driver_desc->name);
1726
1727         if (IS_ERR(internal->class)) {
1728                 pr_err("Cannot register %s class [ret=%ld]\n",
1729                        driver_desc->name, PTR_ERR(internal->class));
1730                 ret = PTR_ERR(internal->class);
1731                 goto unregister_gasket_driver;
1732         }
1733
1734         ret = register_chrdev_region(MKDEV(driver_desc->major,
1735                                            driver_desc->minor), GASKET_DEV_MAX,
1736                                      driver_desc->name);
1737         if (ret) {
1738                 pr_err("cannot register %s char driver [ret=%d]\n",
1739                        driver_desc->name, ret);
1740                 goto destroy_class;
1741         }
1742
1743         return 0;
1744
1745 destroy_class:
1746         class_destroy(internal->class);
1747
1748 unregister_gasket_driver:
1749         mutex_lock(&g_mutex);
1750         g_descs[desc_idx].driver_desc = NULL;
1751         mutex_unlock(&g_mutex);
1752         return ret;
1753 }
1754 EXPORT_SYMBOL(gasket_register_device);
1755
1756 /* See gasket_core.h for description. */
1757 void gasket_unregister_device(const struct gasket_driver_desc *driver_desc)
1758 {
1759         int i, desc_idx;
1760         struct gasket_internal_desc *internal_desc = NULL;
1761
1762         mutex_lock(&g_mutex);
1763         for (i = 0; i < GASKET_FRAMEWORK_DESC_MAX; i++) {
1764                 if (g_descs[i].driver_desc == driver_desc) {
1765                         internal_desc = &g_descs[i];
1766                         desc_idx = i;
1767                         break;
1768                 }
1769         }
1770
1771         if (!internal_desc) {
1772                 mutex_unlock(&g_mutex);
1773                 pr_err("request to unregister unknown desc: %s, %d:%d\n",
1774                        driver_desc->name, driver_desc->major,
1775                        driver_desc->minor);
1776                 return;
1777         }
1778
1779         unregister_chrdev_region(MKDEV(driver_desc->major, driver_desc->minor),
1780                                  GASKET_DEV_MAX);
1781
1782         class_destroy(internal_desc->class);
1783
1784         /* Finally, effectively "remove" the driver. */
1785         g_descs[desc_idx].driver_desc = NULL;
1786         mutex_unlock(&g_mutex);
1787
1788         pr_debug("removed %s driver\n", driver_desc->name);
1789 }
1790 EXPORT_SYMBOL(gasket_unregister_device);
1791
1792 static int __init gasket_init(void)
1793 {
1794         int i;
1795
1796         mutex_lock(&g_mutex);
1797         for (i = 0; i < GASKET_FRAMEWORK_DESC_MAX; i++) {
1798                 g_descs[i].driver_desc = NULL;
1799                 mutex_init(&g_descs[i].mutex);
1800         }
1801
1802         gasket_sysfs_init();
1803
1804         mutex_unlock(&g_mutex);
1805         return 0;
1806 }
1807
1808 MODULE_DESCRIPTION("Google Gasket driver framework");
1809 MODULE_VERSION(GASKET_FRAMEWORK_VERSION);
1810 MODULE_LICENSE("GPL v2");
1811 MODULE_AUTHOR("Rob Springer <rspringer@google.com>");
1812 module_init(gasket_init);