cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ocxl.rst (5537B)


      1========================================================
      2OpenCAPI (Open Coherent Accelerator Processor Interface)
      3========================================================
      4
      5OpenCAPI is an interface between processors and accelerators. It aims
      6at being low-latency and high-bandwidth. The specification is
      7developed by the `OpenCAPI Consortium <http://opencapi.org/>`_.
      8
      9It allows an accelerator (which could be an FPGA, ASICs, ...) to access
     10the host memory coherently, using virtual addresses. An OpenCAPI
     11device can also host its own memory, that can be accessed from the
     12host.
     13
     14OpenCAPI is known in linux as 'ocxl', as the open, processor-agnostic
     15evolution of 'cxl' (the driver for the IBM CAPI interface for
     16powerpc), which was named that way to avoid confusion with the ISDN
     17CAPI subsystem.
     18
     19
     20High-level view
     21===============
     22
     23OpenCAPI defines a Data Link Layer (DL) and Transaction Layer (TL), to
     24be implemented on top of a physical link. Any processor or device
     25implementing the DL and TL can start sharing memory.
     26
     27::
     28
     29  +-----------+                         +-------------+
     30  |           |                         |             |
     31  |           |                         | Accelerated |
     32  | Processor |                         |  Function   |
     33  |           |  +--------+             |    Unit     |  +--------+
     34  |           |--| Memory |             |    (AFU)    |--| Memory |
     35  |           |  +--------+             |             |  +--------+
     36  +-----------+                         +-------------+
     37       |                                       |
     38  +-----------+                         +-------------+
     39  |    TL     |                         |    TLX      |
     40  +-----------+                         +-------------+
     41       |                                       |
     42  +-----------+                         +-------------+
     43  |    DL     |                         |    DLX      |
     44  +-----------+                         +-------------+
     45       |                                       |
     46       |                   PHY                 |
     47       +---------------------------------------+
     48
     49
     50
     51Device discovery
     52================
     53
     54OpenCAPI relies on a PCI-like configuration space, implemented on the
     55device. So the host can discover AFUs by querying the config space.
     56
     57OpenCAPI devices in Linux are treated like PCI devices (with a few
     58caveats). The firmware is expected to abstract the hardware as if it
     59was a PCI link. A lot of the existing PCI infrastructure is reused:
     60devices are scanned and BARs are assigned during the standard PCI
     61enumeration. Commands like 'lspci' can therefore be used to see what
     62devices are available.
     63
     64The configuration space defines the AFU(s) that can be found on the
     65physical adapter, such as its name, how many memory contexts it can
     66work with, the size of its MMIO areas, ...
     67
     68
     69
     70MMIO
     71====
     72
     73OpenCAPI defines two MMIO areas for each AFU:
     74
     75* the global MMIO area, with registers pertinent to the whole AFU.
     76* a per-process MMIO area, which has a fixed size for each context.
     77
     78
     79
     80AFU interrupts
     81==============
     82
     83OpenCAPI includes the possibility for an AFU to send an interrupt to a
     84host process. It is done through a 'intrp_req' defined in the
     85Transaction Layer, specifying a 64-bit object handle which defines the
     86interrupt.
     87
     88The driver allows a process to allocate an interrupt and obtain its
     8964-bit object handle, that can be passed to the AFU.
     90
     91
     92
     93char devices
     94============
     95
     96The driver creates one char device per AFU found on the physical
     97device. A physical device may have multiple functions and each
     98function can have multiple AFUs. At the time of this writing though,
     99it has only been tested with devices exporting only one AFU.
    100
    101Char devices can be found in /dev/ocxl/ and are named as:
    102/dev/ocxl/<AFU name>.<location>.<index>
    103
    104where <AFU name> is a max 20-character long name, as found in the
    105config space of the AFU.
    106<location> is added by the driver and can help distinguish devices
    107when a system has more than one instance of the same OpenCAPI device.
    108<index> is also to help distinguish AFUs in the unlikely case where a
    109device carries multiple copies of the same AFU.
    110
    111
    112
    113Sysfs class
    114===========
    115
    116An ocxl class is added for the devices representing the AFUs. See
    117/sys/class/ocxl. The layout is described in
    118Documentation/ABI/testing/sysfs-class-ocxl
    119
    120
    121
    122User API
    123========
    124
    125open
    126----
    127
    128Based on the AFU definition found in the config space, an AFU may
    129support working with more than one memory context, in which case the
    130associated char device may be opened multiple times by different
    131processes.
    132
    133
    134ioctl
    135-----
    136
    137OCXL_IOCTL_ATTACH:
    138
    139  Attach the memory context of the calling process to the AFU so that
    140  the AFU can access its memory.
    141
    142OCXL_IOCTL_IRQ_ALLOC:
    143
    144  Allocate an AFU interrupt and return an identifier.
    145
    146OCXL_IOCTL_IRQ_FREE:
    147
    148  Free a previously allocated AFU interrupt.
    149
    150OCXL_IOCTL_IRQ_SET_FD:
    151
    152  Associate an event fd to an AFU interrupt so that the user process
    153  can be notified when the AFU sends an interrupt.
    154
    155OCXL_IOCTL_GET_METADATA:
    156
    157  Obtains configuration information from the card, such at the size of
    158  MMIO areas, the AFU version, and the PASID for the current context.
    159
    160OCXL_IOCTL_ENABLE_P9_WAIT:
    161
    162  Allows the AFU to wake a userspace thread executing 'wait'. Returns
    163  information to userspace to allow it to configure the AFU. Note that
    164  this is only available on POWER9.
    165
    166OCXL_IOCTL_GET_FEATURES:
    167
    168  Reports on which CPU features that affect OpenCAPI are usable from
    169  userspace.
    170
    171
    172mmap
    173----
    174
    175A process can mmap the per-process MMIO area for interactions with the
    176AFU.