summaryrefslogtreecommitdiffstats
path: root/hw/msi.c
diff options
context:
space:
mode:
authorMichael S. Tsirkin2012-07-29 16:03:19 +0200
committerMichael S. Tsirkin2012-07-29 16:05:35 +0200
commit5e59b024351f827f903f98ae522687ea53dc4f23 (patch)
tree4996f31e1d7d9e08c04d8bbf018752a71c6cd4c3 /hw/msi.c
parentx86: Fixed incorrect segment base address addition in 64-bits mode (diff)
parentmsi/msix: added API to set MSI message address and data (diff)
downloadqemu-5e59b024351f827f903f98ae522687ea53dc4f23.tar.gz
qemu-5e59b024351f827f903f98ae522687ea53dc4f23.tar.xz
qemu-5e59b024351f827f903f98ae522687ea53dc4f23.zip
Merge branch pci into master
Merge master and pci branch, resolve build breakage in hw/esp.c introduced by f90c2bcd. Conflicts: hw/esp.c
Diffstat (limited to 'hw/msi.c')
-rw-r--r--hw/msi.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/hw/msi.c b/hw/msi.c
index 52332041e7..e2273a09ae 100644
--- a/hw/msi.c
+++ b/hw/msi.c
@@ -105,6 +105,23 @@ static inline uint8_t msi_pending_off(const PCIDevice* dev, bool msi64bit)
return dev->msi_cap + (msi64bit ? PCI_MSI_PENDING_64 : PCI_MSI_PENDING_32);
}
+/*
+ * Special API for POWER to configure the vectors through
+ * a side channel. Should never be used by devices.
+ */
+void msi_set_message(PCIDevice *dev, MSIMessage msg)
+{
+ uint16_t flags = pci_get_word(dev->config + msi_flags_off(dev));
+ bool msi64bit = flags & PCI_MSI_FLAGS_64BIT;
+
+ if (msi64bit) {
+ pci_set_quad(dev->config + msi_address_lo_off(dev), msg.address);
+ } else {
+ pci_set_long(dev->config + msi_address_lo_off(dev), msg.address);
+ }
+ pci_set_word(dev->config + msi_data_off(dev, msi64bit), msg.data);
+}
+
bool msi_enabled(const PCIDevice *dev)
{
return msi_present(dev) &&