Based on the discussions over the last couple of weeks
I have updated the device fd file layout proposal and
tried to specify it a bit more formally.

===============================================================

1.  Overview

  This specification describes the layout of device files
  used in the context of vfio, which gives user space
  direct access to I/O devices that have been bound to
  vfio.

  When a device fd is opened and read, offset 0x0 contains
  a fixed sized header followed by a number of variable length
  records that describe different characteristics
  of the device-- addressable regions, interrupts, etc.

  0x0  +-------------+-------------+
       |         magic             | u32  // identifies this as a vfio
device file
       +---------------------------+         and identifies the type of bus
       |         version           | u32  // specifies the version of this
       +---------------------------+
       |         flags             | u32  // encodes any flags
       +---------------------------+
       |  dev info record 0        |
       |    type                   | u32   // type of record
       |    rec_len                | u32   // length in bytes of record
       |                           |          (including record header)
       |    flags                  | u32   // type specific flags
       |    ...content...          |       // record content, which could
       +---------------------------+       // include sub-records
       |  dev info record 1        |
       +---------------------------+
       |  dev info record N        |
       +---------------------------+

  The device info records following the file header may have
  the following record types each with content encoded in
  a record specific way:

  ------------+-------+------------------------------------------------------
              |  type |
   Region     |  num  | Description
  ---------------------------------------------------------------------------
  REGION           1    describes an addressable address range for the device
  DTPATH           2    describes the device tree path for the device
  DTINDEX          3    describes the index into the related device tree
                          property (reg,ranges,interrupts,interrupt-map)
  INTERRUPT        4    describes an interrupt for the device
  PCI_CONFIG_SPACE 5    property identifying a region as PCI config space
  PCI_BAR_INDEX    6    describes the BAR index for a PCI region
  PHYS_ADDR        7    describes the physical address of the region
  ---------------------------------------------------------------------------

2. Header

The header is located at offset 0x0 in the device fd
and has the following format:

    struct devfd_header {
        __u32 magic;
        __u32 version;
        __u32 flags;
    };

    The 'magic' field contains a magic value that will
    identify the type bus the device is on.  Valid values
    are:

        0x70636900   // "pci" - PCI device
        0x64740000   // "dt" - device tree (system bus)

3. Region

  A REGION record an addressable address region for the device.

    struct devfd_region {
        __u32 type;   // must be 0x1
        __u32 record_len;
        __u32 flags;
        __u64 offset; // seek offset to region from beginning
                      // of file
        __u64 len   ; // length of the region
    };

  The 'flags' field supports one flag:

      IS_MMAPABLE

4. Device Tree Path (DTPATH)

  A DTPATH record is a sub-record of a REGION and describes
  the path to a device tree node for the region

    struct devfd_dtpath {
        __u32 type;   // must be 0x2
        __u32 record_len;
        __u64 char[]   ; // length of the region
    };

5. Device Tree Index (DTINDEX)

  A DTINDEX record is a sub-record of a REGION and specifies
  the index into the resource list encoded in the associated
  device tree property-- "reg", "ranges", "interrupts", or
  "interrupt-map".

    struct devfd_dtindex {
        __u32 type;   // must be 0x3
        __u32 record_len;
        __u32 prop_type;
        __u32 prop_index;  // index into the resource list
    };

    prop_type must have one of the follow values:
       1   // "reg" property
       2   // "ranges" property
       3   // "interrupts" property
       4   // "interrupts" property

    Note: prop_index is not the byte offset into the property,
    but the logical index.

6. Interrupts (INTERRUPT)

  An INTERRUPT record describes one of a device's interrupts.
  The handle field is an argument to VFIO_DEVICE_GET_IRQ_FD
  which user space can use to receive device interrupts.

    struct devfd_interrupts {
        __u32 type;   // must be 0x4
        __u32 record_len;
        __u32 flags;
        __u32 handle;  // parameter to VFIO_DEVICE_GET_IRQ_FD
    };

7.  PCI Config Space (PCI_CONFIG_SPACE)

    A PCI_CONFIG_SPACE record is a sub-record of a REGION record
    and identifies the region as PCI configuration space.

    struct devfd_cfgspace {
        __u32 type;   // must be 0x5
        __u32 record_len;
        __u32 flags;
    }

8.  PCI Bar Index (PCI_BAR_INDEX)

    A PCI_BAR_INDEX record is a sub-record of a REGION record
    and identifies the PCI BAR index for the region.

    struct devfd_barindex {
        __u32 type;   // must be 0x6
        __u32 record_len;
        __u32 flags;
        __u32 bar_index;
    }

9.  Physical Address (PHYS_ADDR)

    A PHYS_ADDR record is a sub-record of a REGION record
    and specifies the physical address of the region.

    struct devfd_physaddr {
        __u32 type;   // must be 0x7
        __u32 record_len;
        __u32 flags;
        __u64 phys_addr;
    }

Regards,
Stuart

Reply via email to