linux/drivers/staging/gasket/gasket_core.h
<<
>>
Prefs
   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 */
  30struct 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 */
  42enum 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. */
  51enum 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 */
  61struct 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 */
  74enum 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 */
  86struct 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. */
 101struct 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. */
 113enum 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. */
 125struct 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. */
 150struct 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. */
 174struct gasket_mappable_region {
 175        u64 start;
 176        u64 length_bytes;
 177};
 178
 179/* Describe the offset, size, and permissions for a device bar. */
 180struct 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. */
 209struct 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. */
 224struct 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. */
 236enum 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. */
 245struct 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 */
 254struct 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. */
 307typedef 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. */
 310typedef 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 */
 322struct 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 */
 518int 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 */
 527void gasket_unregister_device(const struct gasket_driver_desc *desc);
 528
 529/* Add a PCI gasket device. */
 530int gasket_pci_add_device(struct pci_dev *pci_dev,
 531                          struct gasket_dev **gasket_devp);
 532/* Remove a PCI gasket device. */
 533void gasket_pci_remove_device(struct pci_dev *pci_dev);
 534
 535/* Enable a Gasket device. */
 536int gasket_enable_device(struct gasket_dev *gasket_dev);
 537
 538/* Disable a Gasket device. */
 539void 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 */
 549int gasket_reset(struct gasket_dev *gasket_dev);
 550int 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. */
 558int 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 */
 566gasket_ioctl_permissions_cb_t
 567gasket_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 */
 575const char *gasket_num_name_lookup(uint num,
 576                                   const struct gasket_num_name *table);
 577
 578/* Handy inlines */
 579static 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
 585static 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
 591static 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
 597static 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
 603static 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
 615static 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. */
 628const struct gasket_driver_desc *gasket_get_driver_desc(struct gasket_dev *dev);
 629
 630/* Get the device structure for a given device. */
 631struct device *gasket_get_device(struct gasket_dev *dev);
 632
 633/* Helper function, Asynchronous waits on a given set of bits. */
 634int 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__ */
 639