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