root/drivers/staging/gasket/gasket_core.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. gasket_dev_read_64
  2. gasket_dev_write_64
  3. gasket_dev_write_32
  4. gasket_dev_read_32
  5. gasket_read_modify_write_64
  6. gasket_read_modify_write_32

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  * Gasket generic driver. Defines the set of data types and functions necessary
   4  * to define a driver using the Gasket generic driver framework.
   5  *
   6  * Copyright (C) 2018 Google, Inc.
   7  */
   8 #ifndef __GASKET_CORE_H__
   9 #define __GASKET_CORE_H__
  10 
  11 #include <linux/cdev.h>
  12 #include <linux/compiler.h>
  13 #include <linux/device.h>
  14 #include <linux/init.h>
  15 #include <linux/module.h>
  16 #include <linux/pci.h>
  17 #include <linux/sched.h>
  18 #include <linux/slab.h>
  19 
  20 #include "gasket_constants.h"
  21 
  22 /**
  23  * struct gasket_num_name - Map numbers to names.
  24  * @ein_num: Number.
  25  * @ein_name: Name associated with the number, a char pointer.
  26  *
  27  * This structure maps numbers to names. It is used to provide printable enum
  28  * names, e.g {0, "DEAD"} or {1, "ALIVE"}.
  29  */
  30 struct gasket_num_name {
  31         uint snn_num;
  32         const char *snn_name;
  33 };
  34 
  35 /*
  36  * Register location for packed interrupts.
  37  * Each value indicates the location of an interrupt field (in units of
  38  * gasket_driver_desc->interrupt_pack_width) within the containing register.
  39  * In other words, this indicates the shift to use when creating a mask to
  40  * extract/set bits within a register for a given interrupt.
  41  */
  42 enum gasket_interrupt_packing {
  43         PACK_0 = 0,
  44         PACK_1 = 1,
  45         PACK_2 = 2,
  46         PACK_3 = 3,
  47         UNPACKED = 4,
  48 };
  49 
  50 /* Type of the interrupt supported by the device. */
  51 enum gasket_interrupt_type {
  52         PCI_MSIX = 0,
  53 };
  54 
  55 /*
  56  * Used to describe a Gasket interrupt. Contains an interrupt index, a register,
  57  * and packing data for that interrupt. The register and packing data
  58  * fields are relevant only for PCI_MSIX interrupt type and can be
  59  * set to 0 for everything else.
  60  */
  61 struct gasket_interrupt_desc {
  62         /* Device-wide interrupt index/number. */
  63         int index;
  64         /* The register offset controlling this interrupt. */
  65         u64 reg;
  66         /* The location of this interrupt inside register reg, if packed. */
  67         int packing;
  68 };
  69 
  70 /*
  71  * This enum is used to identify memory regions being part of the physical
  72  * memory that belongs to a device.
  73  */
  74 enum mappable_area_type {
  75         PCI_BAR = 0, /* Default */
  76         BUS_REGION,  /* For SYSBUS devices, i.e. AXI etc... */
  77         COHERENT_MEMORY
  78 };
  79 
  80 /*
  81  * Metadata for each BAR mapping.
  82  * This struct is used so as to track PCI memory, I/O space, AXI and coherent
  83  * memory area... i.e. memory objects which can be referenced in the device's
  84  * mmap function.
  85  */
  86 struct gasket_bar_data {
  87         /* Virtual base address. */
  88         u8 __iomem *virt_base;
  89 
  90         /* Physical base address. */
  91         ulong phys_base;
  92 
  93         /* Length of the mapping. */
  94         ulong length_bytes;
  95 
  96         /* Type of mappable area */
  97         enum mappable_area_type type;
  98 };
  99 
 100 /* Maintains device open ownership data. */
 101 struct gasket_ownership {
 102         /* 1 if the device is owned, 0 otherwise. */
 103         int is_owned;
 104 
 105         /* TGID of the owner. */
 106         pid_t owner;
 107 
 108         /* Count of current device opens in write mode. */
 109         int write_open_count;
 110 };
 111 
 112 /* Page table modes of operation. */
 113 enum gasket_page_table_mode {
 114         /* The page table is partitionable as normal, all simple by default. */
 115         GASKET_PAGE_TABLE_MODE_NORMAL,
 116 
 117         /* All entries are always simple. */
 118         GASKET_PAGE_TABLE_MODE_SIMPLE,
 119 
 120         /* All entries are always extended. No extended bit is used. */
 121         GASKET_PAGE_TABLE_MODE_EXTENDED,
 122 };
 123 
 124 /* Page table configuration. One per table. */
 125 struct gasket_page_table_config {
 126         /* The identifier/index of this page table. */
 127         int id;
 128 
 129         /* The operation mode of this page table. */
 130         enum gasket_page_table_mode mode;
 131 
 132         /* Total (first-level) entries in this page table. */
 133         ulong total_entries;
 134 
 135         /* Base register for the page table. */
 136         int base_reg;
 137 
 138         /*
 139          * Register containing the extended page table. This value is unused in
 140          * GASKET_PAGE_TABLE_MODE_SIMPLE and GASKET_PAGE_TABLE_MODE_EXTENDED
 141          * modes.
 142          */
 143         int extended_reg;
 144 
 145         /* The bit index indicating whether a PT entry is extended. */
 146         int extended_bit;
 147 };
 148 
 149 /* Maintains information about a device node. */
 150 struct gasket_cdev_info {
 151         /* The internal name of this device. */
 152         char name[GASKET_NAME_MAX];
 153 
 154         /* Device number. */
 155         dev_t devt;
 156 
 157         /* Kernel-internal device structure. */
 158         struct device *device;
 159 
 160         /* Character device for real. */
 161         struct cdev cdev;
 162 
 163         /* Flag indicating if cdev_add has been called for the devices. */
 164         int cdev_added;
 165 
 166         /* Pointer to the overall gasket_dev struct for this device. */
 167         struct gasket_dev *gasket_dev_ptr;
 168 
 169         /* Ownership data for the device in question. */
 170         struct gasket_ownership ownership;
 171 };
 172 
 173 /* Describes the offset and length of mmapable device BAR regions. */
 174 struct gasket_mappable_region {
 175         u64 start;
 176         u64 length_bytes;
 177 };
 178 
 179 /* Describe the offset, size, and permissions for a device bar. */
 180 struct gasket_bar_desc {
 181         /*
 182          * The size of each PCI BAR range, in bytes. If a value is 0, that BAR
 183          * will not be mapped into kernel space at all.
 184          * For devices with 64 bit BARs, only elements 0, 2, and 4 should be
 185          * populated, and 1, 3, and 5 should be set to 0.
 186          * For example, for a device mapping 1M in each of the first two 64-bit
 187          * BARs, this field would be set as { 0x100000, 0, 0x100000, 0, 0, 0 }
 188          * (one number per bar_desc struct.)
 189          */
 190         u64 size;
 191         /* The permissions for this bar. (Should be VM_WRITE/VM_READ/VM_EXEC,
 192          * and can be or'd.) If set to GASKET_NOMAP, the bar will
 193          * not be used for mmapping.
 194          */
 195         ulong permissions;
 196         /* The memory address corresponding to the base of this bar, if used. */
 197         u64 base;
 198         /* The number of mappable regions in this bar. */
 199         int num_mappable_regions;
 200 
 201         /* The mappable subregions of this bar. */
 202         const struct gasket_mappable_region *mappable_regions;
 203 
 204         /* Type of mappable area */
 205         enum mappable_area_type type;
 206 };
 207 
 208 /* Describes the offset, size, and permissions for a coherent buffer. */
 209 struct gasket_coherent_buffer_desc {
 210         /* The size of the coherent buffer. */
 211         u64 size;
 212 
 213         /* The permissions for this bar. (Should be VM_WRITE/VM_READ/VM_EXEC,
 214          * and can be or'd.) If set to GASKET_NOMAP, the bar will
 215          * not be used for mmaping.
 216          */
 217         ulong permissions;
 218 
 219         /* device side address. */
 220         u64 base;
 221 };
 222 
 223 /* Coherent buffer structure. */
 224 struct gasket_coherent_buffer {
 225         /* Virtual base address. */
 226         u8 *virt_base;
 227 
 228         /* Physical base address. */
 229         ulong phys_base;
 230 
 231         /* Length of the mapping. */
 232         ulong length_bytes;
 233 };
 234 
 235 /* Description of Gasket-specific permissions in the mmap field. */
 236 enum gasket_mapping_options { GASKET_NOMAP = 0 };
 237 
 238 /* This struct represents an undefined bar that should never be mapped. */
 239 #define GASKET_UNUSED_BAR                                                      \
 240         {                                                                      \
 241                 0, GASKET_NOMAP, 0, 0, NULL, 0                                 \
 242         }
 243 
 244 /* Internal data for a Gasket device. See gasket_core.c for more information. */
 245 struct gasket_internal_desc;
 246 
 247 #define MAX_NUM_COHERENT_PAGES 16
 248 
 249 /*
 250  * Device data for Gasket device instances.
 251  *
 252  * This structure contains the data required to manage a Gasket device.
 253  */
 254 struct gasket_dev {
 255         /* Pointer to the internal driver description for this device. */
 256         struct gasket_internal_desc *internal_desc;
 257 
 258         /* Device info */
 259         struct device *dev;
 260 
 261         /* PCI subsystem metadata. */
 262         struct pci_dev *pci_dev;
 263 
 264         /* This device's index into internal_desc->devs. */
 265         int dev_idx;
 266 
 267         /* The name of this device, as reported by the kernel. */
 268         char kobj_name[GASKET_NAME_MAX];
 269 
 270         /* Virtual address of mapped BAR memory range. */
 271         struct gasket_bar_data bar_data[GASKET_NUM_BARS];
 272 
 273         /* Coherent buffer. */
 274         struct gasket_coherent_buffer coherent_buffer;
 275 
 276         /* Number of page tables for this device. */
 277         int num_page_tables;
 278 
 279         /* Address translations. Page tables have a private implementation. */
 280         struct gasket_page_table *page_table[GASKET_MAX_NUM_PAGE_TABLES];
 281 
 282         /* Interrupt data for this device. */
 283         struct gasket_interrupt_data *interrupt_data;
 284 
 285         /* Status for this device - GASKET_STATUS_ALIVE or _DEAD. */
 286         uint status;
 287 
 288         /* Number of times this device has been reset. */
 289         uint reset_count;
 290 
 291         /* Dev information for the cdev node. */
 292         struct gasket_cdev_info dev_info;
 293 
 294         /* Hardware revision value for this device. */
 295         int hardware_revision;
 296 
 297         /* Protects access to per-device data (i.e. this structure). */
 298         struct mutex mutex;
 299 
 300         /* cdev hash tracking/membership structure, Accel and legacy. */
 301         /* Unused until Accel is upstreamed. */
 302         struct hlist_node hlist_node;
 303         struct hlist_node legacy_hlist_node;
 304 };
 305 
 306 /* Type of the ioctl handler callback. */
 307 typedef long (*gasket_ioctl_handler_cb_t)(struct file *file, uint cmd,
 308                                           void __user *argp);
 309 /* Type of the ioctl permissions check callback. See below. */
 310 typedef int (*gasket_ioctl_permissions_cb_t)(struct file *filp, uint cmd,
 311                                              void __user *argp);
 312 
 313 /*
 314  * Device type descriptor.
 315  *
 316  * This structure contains device-specific data needed to identify and address a
 317  * type of device to be administered via the Gasket generic driver.
 318  *
 319  * Device IDs are per-driver. In other words, two drivers using the Gasket
 320  * framework will each have a distinct device 0 (for example).
 321  */
 322 struct gasket_driver_desc {
 323         /* The name of this device type. */
 324         const char *name;
 325 
 326         /* The name of this specific device model. */
 327         const char *chip_model;
 328 
 329         /* The version of the chip specified in chip_model. */
 330         const char *chip_version;
 331 
 332         /* The version of this driver: "1.0.0", "2.1.3", etc. */
 333         const char *driver_version;
 334 
 335         /*
 336          * Non-zero if we should create "legacy" (device and device-class-
 337          * specific) character devices and sysfs nodes.
 338          */
 339         /* Unused until Accel is upstreamed. */
 340         int legacy_support;
 341 
 342         /* Major and minor numbers identifying the device. */
 343         int major, minor;
 344 
 345         /* Module structure for this driver. */
 346         struct module *module;
 347 
 348         /* PCI ID table. */
 349         const struct pci_device_id *pci_id_table;
 350 
 351         /* The number of page tables handled by this driver. */
 352         int num_page_tables;
 353 
 354         /* The index of the bar containing the page tables. */
 355         int page_table_bar_index;
 356 
 357         /* Registers used to control each page table. */
 358         const struct gasket_page_table_config *page_table_configs;
 359 
 360         /* The bit index indicating whether a PT entry is extended. */
 361         int page_table_extended_bit;
 362 
 363         /*
 364          * Legacy mmap address adjusment for legacy devices only. Should be 0
 365          * for any new device.
 366          */
 367         ulong legacy_mmap_address_offset;
 368 
 369         /* Set of 6 bar descriptions that describe all PCIe bars.
 370          * Note that BUS/AXI devices (i.e. non PCI devices) use those.
 371          */
 372         struct gasket_bar_desc bar_descriptions[GASKET_NUM_BARS];
 373 
 374         /*
 375          * Coherent buffer description.
 376          */
 377         struct gasket_coherent_buffer_desc coherent_buffer_description;
 378 
 379         /* Interrupt type. (One of gasket_interrupt_type). */
 380         int interrupt_type;
 381 
 382         /* Index of the bar containing the interrupt registers to program. */
 383         int interrupt_bar_index;
 384 
 385         /* Number of interrupts in the gasket_interrupt_desc array */
 386         int num_interrupts;
 387 
 388         /* Description of the interrupts for this device. */
 389         const struct gasket_interrupt_desc *interrupts;
 390 
 391         /*
 392          * If this device packs multiple interrupt->MSI-X mappings into a
 393          * single register (i.e., "uses packed interrupts"), only a single bit
 394          * width is supported for each interrupt mapping (unpacked/"full-width"
 395          * interrupts are always supported). This value specifies that width. If
 396          * packed interrupts are not used, this value is ignored.
 397          */
 398         int interrupt_pack_width;
 399 
 400         /* Driver callback functions - all may be NULL */
 401         /*
 402          * device_open_cb: Callback for when a device node is opened in write
 403          * mode.
 404          * @dev: The gasket_dev struct for this driver instance.
 405          *
 406          * This callback should perform device-specific setup that needs to
 407          * occur only once when a device is first opened.
 408          */
 409         int (*device_open_cb)(struct gasket_dev *dev);
 410 
 411         /*
 412          * device_release_cb: Callback when a device is closed.
 413          * @gasket_dev: The gasket_dev struct for this driver instance.
 414          *
 415          * This callback is called whenever a device node fd is closed, as
 416          * opposed to device_close_cb, which is called when the _last_
 417          * descriptor for an open file is closed. This call is intended to
 418          * handle any per-user or per-fd cleanup.
 419          */
 420         int (*device_release_cb)(struct gasket_dev *gasket_dev,
 421                                  struct file *file);
 422 
 423         /*
 424          * device_close_cb: Callback for when a device node is closed for the
 425          * last time.
 426          * @dev: The gasket_dev struct for this driver instance.
 427          *
 428          * This callback should perform device-specific cleanup that only
 429          * needs to occur when the last reference to a device node is closed.
 430          *
 431          * This call is intended to handle and device-wide cleanup, as opposed
 432          * to per-fd cleanup (which should be handled by device_release_cb).
 433          */
 434         int (*device_close_cb)(struct gasket_dev *dev);
 435 
 436         /*
 437          * get_mappable_regions_cb: Get descriptors of mappable device memory.
 438          * @gasket_dev: Pointer to the struct gasket_dev for this device.
 439          * @bar_index: BAR for which to retrieve memory ranges.
 440          * @mappable_regions: Out-pointer to the list of mappable regions on the
 441          * device/BAR for this process.
 442          * @num_mappable_regions: Out-pointer for the size of mappable_regions.
 443          *
 444          * Called when handling mmap(), this callback is used to determine which
 445          * regions of device memory may be mapped by the current process. This
 446          * information is then compared to mmap request to determine which
 447          * regions to actually map.
 448          */
 449         int (*get_mappable_regions_cb)(struct gasket_dev *gasket_dev,
 450                                        int bar_index,
 451                                        struct gasket_mappable_region **mappable_regions,
 452                                        int *num_mappable_regions);
 453 
 454         /*
 455          * ioctl_permissions_cb: Check permissions for generic ioctls.
 456          * @filp: File structure pointer describing this node usage session.
 457          * @cmd: ioctl number to handle.
 458          * @arg: ioctl-specific data pointer.
 459          *
 460          * Returns 1 if the ioctl may be executed, 0 otherwise. If this callback
 461          * isn't specified a default routine will be used, that only allows the
 462          * original device opener (i.e, the "owner") to execute state-affecting
 463          * ioctls.
 464          */
 465         gasket_ioctl_permissions_cb_t ioctl_permissions_cb;
 466 
 467         /*
 468          * ioctl_handler_cb: Callback to handle device-specific ioctls.
 469          * @filp: File structure pointer describing this node usage session.
 470          * @cmd: ioctl number to handle.
 471          * @arg: ioctl-specific data pointer.
 472          *
 473          * Invoked whenever an ioctl is called that the generic Gasket
 474          * framework doesn't support. If no cb is registered, unknown ioctls
 475          * return -EINVAL. Should return an error status (either -EINVAL or
 476          * the error result of the ioctl being handled).
 477          */
 478         gasket_ioctl_handler_cb_t ioctl_handler_cb;
 479 
 480         /*
 481          * device_status_cb: Callback to determine device health.
 482          * @dev: Pointer to the gasket_dev struct for this device.
 483          *
 484          * Called to determine if the device is healthy or not. Should return
 485          * a member of the gasket_status_type enum.
 486          *
 487          */
 488         int (*device_status_cb)(struct gasket_dev *dev);
 489 
 490         /*
 491          * hardware_revision_cb: Get the device's hardware revision.
 492          * @dev: Pointer to the gasket_dev struct for this device.
 493          *
 494          * Called to determine the reported rev of the physical hardware.
 495          * Revision should be >0. A negative return value is an error.
 496          */
 497         int (*hardware_revision_cb)(struct gasket_dev *dev);
 498 
 499         /*
 500          * device_reset_cb: Reset the hardware in question.
 501          * @dev: Pointer to the gasket_dev structure for this device.
 502          *
 503          * Called by reset ioctls. This function should not
 504          * lock the gasket_dev mutex. It should return 0 on success
 505          * and an error on failure.
 506          */
 507         int (*device_reset_cb)(struct gasket_dev *dev);
 508 };
 509 
 510 /*
 511  * Register the specified device type with the framework.
 512  * @desc: Populated/initialized device type descriptor.
 513  *
 514  * This function does _not_ take ownership of desc; the underlying struct must
 515  * exist until the matching call to gasket_unregister_device.
 516  * This function should be called from your driver's module_init function.
 517  */
 518 int gasket_register_device(const struct gasket_driver_desc *desc);
 519 
 520 /*
 521  * Remove the specified device type from the framework.
 522  * @desc: Descriptor for the device type to unregister; it should have been
 523  *        passed to gasket_register_device in a previous call.
 524  *
 525  * This function should be called from your driver's module_exit function.
 526  */
 527 void gasket_unregister_device(const struct gasket_driver_desc *desc);
 528 
 529 /* Add a PCI gasket device. */
 530 int gasket_pci_add_device(struct pci_dev *pci_dev,
 531                           struct gasket_dev **gasket_devp);
 532 /* Remove a PCI gasket device. */
 533 void gasket_pci_remove_device(struct pci_dev *pci_dev);
 534 
 535 /* Enable a Gasket device. */
 536 int gasket_enable_device(struct gasket_dev *gasket_dev);
 537 
 538 /* Disable a Gasket device. */
 539 void gasket_disable_device(struct gasket_dev *gasket_dev);
 540 
 541 /*
 542  * Reset the Gasket device.
 543  * @gasket_dev: Gasket device struct.
 544  *
 545  * Calls device_reset_cb. Returns 0 on success and an error code othewrise.
 546  * gasket_reset_nolock will not lock the mutex, gasket_reset will.
 547  *
 548  */
 549 int gasket_reset(struct gasket_dev *gasket_dev);
 550 int gasket_reset_nolock(struct gasket_dev *gasket_dev);
 551 
 552 /*
 553  * Memory management functions. These will likely be spun off into their own
 554  * file in the future.
 555  */
 556 
 557 /* Unmaps the specified mappable region from a VMA. */
 558 int gasket_mm_unmap_region(const struct gasket_dev *gasket_dev,
 559                            struct vm_area_struct *vma,
 560                            const struct gasket_mappable_region *map_region);
 561 
 562 /*
 563  * Get the ioctl permissions callback.
 564  * @gasket_dev: Gasket device structure.
 565  */
 566 gasket_ioctl_permissions_cb_t
 567 gasket_get_ioctl_permissions_cb(struct gasket_dev *gasket_dev);
 568 
 569 /**
 570  * Lookup a name by number in a num_name table.
 571  * @num: Number to lookup.
 572  * @table: Array of num_name structures, the table for the lookup.
 573  *
 574  */
 575 const char *gasket_num_name_lookup(uint num,
 576                                    const struct gasket_num_name *table);
 577 
 578 /* Handy inlines */
 579 static inline ulong gasket_dev_read_64(struct gasket_dev *gasket_dev, int bar,
 580                                        ulong location)
 581 {
 582         return readq_relaxed(&gasket_dev->bar_data[bar].virt_base[location]);
 583 }
 584 
 585 static inline void gasket_dev_write_64(struct gasket_dev *dev, u64 value,
 586                                        int bar, ulong location)
 587 {
 588         writeq_relaxed(value, &dev->bar_data[bar].virt_base[location]);
 589 }
 590 
 591 static inline void gasket_dev_write_32(struct gasket_dev *dev, u32 value,
 592                                        int bar, ulong location)
 593 {
 594         writel_relaxed(value, &dev->bar_data[bar].virt_base[location]);
 595 }
 596 
 597 static inline u32 gasket_dev_read_32(struct gasket_dev *dev, int bar,
 598                                      ulong location)
 599 {
 600         return readl_relaxed(&dev->bar_data[bar].virt_base[location]);
 601 }
 602 
 603 static inline void gasket_read_modify_write_64(struct gasket_dev *dev, int bar,
 604                                                ulong location, u64 value,
 605                                                u64 mask_width, u64 mask_shift)
 606 {
 607         u64 mask, tmp;
 608 
 609         tmp = gasket_dev_read_64(dev, bar, location);
 610         mask = ((1ULL << mask_width) - 1) << mask_shift;
 611         tmp = (tmp & ~mask) | (value << mask_shift);
 612         gasket_dev_write_64(dev, tmp, bar, location);
 613 }
 614 
 615 static inline void gasket_read_modify_write_32(struct gasket_dev *dev, int bar,
 616                                                ulong location, u32 value,
 617                                                u32 mask_width, u32 mask_shift)
 618 {
 619         u32 mask, tmp;
 620 
 621         tmp = gasket_dev_read_32(dev, bar, location);
 622         mask = ((1 << mask_width) - 1) << mask_shift;
 623         tmp = (tmp & ~mask) | (value << mask_shift);
 624         gasket_dev_write_32(dev, tmp, bar, location);
 625 }
 626 
 627 /* Get the Gasket driver structure for a given device. */
 628 const struct gasket_driver_desc *gasket_get_driver_desc(struct gasket_dev *dev);
 629 
 630 /* Get the device structure for a given device. */
 631 struct device *gasket_get_device(struct gasket_dev *dev);
 632 
 633 /* Helper function, Asynchronous waits on a given set of bits. */
 634 int gasket_wait_with_reschedule(struct gasket_dev *gasket_dev, int bar,
 635                                 u64 offset, u64 mask, u64 val,
 636                                 uint max_retries, u64 delay_ms);
 637 
 638 #endif /* __GASKET_CORE_H__ */

/* [<][>][^][v][top][bottom][index][help] */