The PCIe User Guide (SPRUGS6C) on page 87 describes the MSI_IRQ register: 'This register is written to by the remote device (value = 0-FFFFFFFFh). Writes initiated by an EP over PCIe link that target BAR0 of the RC land to this register if the offset matches. To generate MSI Interrupt 0, the EP should write 0x0000_0000 to this register. It will result in a pulse on bit zero triggering the MSI interrupt from PCIESS to the external processor.'
Is the actual meaning of the value written to this register documented anywhere?
How would I generate MSI Interrupt 1, for example?
Is there an error in the document and the written value should be (1<<n) to generate MSI int n?
In section 2.14.2.2, the same document gives a procedure for generating an MSI interrupt (which surprisingly does not mention the MSI_IRQ register at all), step 5 states 'Depending upon the number of MSI interrupts allocated, issue a memory write transaction with the address the same as MSI Address Register and the data the same as the MSI Data Register. In the data, the LSBs can be modified to reflect the appropriate MSI event that needs to be notified to root complex'
What does 'Depending on the number of MSI interrupts allocated mean'? Surely the number of interrupts allocated (handled?) determines the interrupts you wish to generate, not how you generate them.
How exactly are the LSBs modified to reflect (select? determine? choose?) the MSI event? I assume that the MSI Address register references the target's MSI_IRQ register (32 bits) but only 16 bits of the data register are valid. How do these two match?