[PATCH RFC 4/4] hw/pci/msi: extract msi_message_address_register
Jim MacArthur <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu,gmane.comp.emulators.qemu.block |
|---|---|
| Message-ID | <[email protected]> |
From: Pierrick Bouvier <[email protected]> We need to access this address from smmu, to know if we are translating an MSI. Signed-off-by: Pierrick Bouvier <[email protected]> Signed-off-by: Jim MacArthur <[email protected]> --- hw/pci/msi.c | 19 +++++++++++++------ include/hw/pci/msi.h | 1 + 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/hw/pci/msi.c b/hw/pci/msi.c index b9f5b45920..7361776ace 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -137,6 +137,18 @@ void msi_set_message(PCIDevice *dev, MSIMessage msg) pci_set_word(dev->config + msi_data_off(dev, msi64bit), msg.data); } +uint64_t msi_message_address_register(PCIDevice *dev) +{ + uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev)); + bool msi64bit = flags & PCI_MSI_FLAGS_64BIT; + + if (msi64bit) { + return pci_get_quad(dev->config + msi_address_lo_off(dev)); + } else { + return pci_get_long(dev->config + msi_address_lo_off(dev)); + } +} + static MSIMessage msi_prepare_message(PCIDevice *dev, unsigned int vector) { uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev)); @@ -146,12 +158,7 @@ static MSIMessage msi_prepare_message(PCIDevice *dev, unsigned int vector) assert(vector < nr_vectors); - if (msi64bit) { - msg.address = pci_get_quad(dev->config + msi_address_lo_off(dev)); - } else { - msg.address = pci_get_long(dev->config + msi_address_lo_off(dev)); - } - + msg.address = msi_message_address_register(dev); /* upper bit 31:16 is zero */ msg.data = pci_get_word(dev->config + msi_data_off(dev, msi64bit)); if (nr_vectors > 1) { diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h index abcfd13925..6f0e02c0fb 100644 --- a/include/hw/pci/msi.h +++ b/include/hw/pci/msi.h @@ -32,6 +32,7 @@ extern bool msi_nonbroken; void msi_set_message(PCIDevice *dev, MSIMessage msg); MSIMessage msi_get_message(PCIDevice *dev, unsigned int vector); +uint64_t msi_message_address_register(PCIDevice *dev); bool msi_enabled(const PCIDevice *dev); void msi_set_enabled(PCIDevice *dev); int msi_init(struct PCIDevice *dev, uint8_t offset, -- 2.43.0