MSI-X Memory Writes

In endpoint mode, the client can request interrupt service by initiating MSI-X. MSI-X uses memory write requests (using the memory write request format) to represent interrupt messages. The client generates the the memory write. The typical procedure for initiating an MSI-X request is:

  1. Client sets up the location of the MSI-X table and MSI-X pending bit array in the endpoint function's memory space:
    1. Program the MSI-X table location in the MSI-X Table Offset Register.
    2. Program the MSI-X pending bit array in the MSI-X Pending Interrupt Register.
  2. Host initializes the function's MSI-X capabilities in the endpoint:
    1. Host reads the MSI-X table location from the MSI-X Table Offset Register.
    2. Host reads the MSI-X pending bit array location from the MSI-X Pending Interrupt Register.
    3. Host initializes the MSI-X vectors by writing to each of the MSI-X table locations.
    4. Host enables MSI-X in each function by configuring the MSI-X Control Register.
  3. Check whether MSI-X is enabled by sampling MSIX_ENABLE.
  4. When a function's MSIX_ENABLE is 1, the function can generate an MSI-X with the following steps:
    1. Read the MSI-X table entry for each vector to get the MSI-X address, data, and mask settings for that MSI-X vector.
    2. Check whether the MSI-X vector is not masked.
    3. If masked, set the corresponding bit in the MSI-X pending bit array by writing the corresponding bit in the pending bit array memory location.
    4. If not masked:
      1. Allocate an MSI-X region on the AXI interface by programming the AXI Region Base Address Registers.
      2. Program the AXI to PCIe address translation registers for the allocated MSI-X region with the MSI-X address.
      3. Program the PCIe descriptor registers for the allocated MSI-X region with required values mentioned in the Memory Write column of the PCIe descriptor registers table.
      4. Generate an outbound write to the MSI-X region. The AXI write data is the MSI-X vector data.