I've seen that before and have also studied it, but that didn't really help that much as it's mostly linux-specific config that I don't know how to read. However I seem to got it to work with this:
volatile uint64_t uAddr = m_pPcieReg->m_uMSIAddress + (((uint64_t)m_pPcieReg->m_uMSIAddressUpper) << 32);
volatile uint32_t* volatile pWrite = (uint32_t*)(0x4000000000 + uAddr);
// read configured MSI_Data and write it to MSI_Address (outgoing iATU)
*pWrite = m_pPcieReg->m_uMSIData;
I can't just use any address in a iATU, it must be the one for PCIe (0x40_0000_0000). However that is nowhere explained in the reference manual, it was rather a guess. And only then did I also see that u-boot already set up an outgoing iATU from this address to 0 (on the bus). Maybe a little explanation in the manual might be useful.
(That message got lost or was deleted)