msix: Factor out msix_get_message

This helper will also be used by the upcoming config notifier.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Jan Kiszka 2012-05-17 10:32:29 -03:00 committed by Avi Kivity
parent 287d55c676
commit bc4caf49c7
1 changed files with 13 additions and 6 deletions

View File

@ -35,6 +35,15 @@
#define MSIX_PAGE_PENDING (MSIX_PAGE_SIZE / 2) #define MSIX_PAGE_PENDING (MSIX_PAGE_SIZE / 2)
#define MSIX_MAX_ENTRIES 32 #define MSIX_MAX_ENTRIES 32
static MSIMessage msix_get_message(PCIDevice *dev, unsigned vector)
{
uint8_t *table_entry = dev->msix_table_page + vector * PCI_MSIX_ENTRY_SIZE;
MSIMessage msg;
msg.address = pci_get_quad(table_entry + PCI_MSIX_ENTRY_LOWER_ADDR);
msg.data = pci_get_long(table_entry + PCI_MSIX_ENTRY_DATA);
return msg;
}
/* Add MSI-X capability to the config space for the device. */ /* Add MSI-X capability to the config space for the device. */
/* Given a bar and its size, add MSI-X table on top of it /* Given a bar and its size, add MSI-X table on top of it
@ -352,9 +361,7 @@ uint32_t msix_bar_size(PCIDevice *dev)
/* Send an MSI-X message */ /* Send an MSI-X message */
void msix_notify(PCIDevice *dev, unsigned vector) void msix_notify(PCIDevice *dev, unsigned vector)
{ {
uint8_t *table_entry = dev->msix_table_page + vector * PCI_MSIX_ENTRY_SIZE; MSIMessage msg;
uint64_t address;
uint32_t data;
if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector]) if (vector >= dev->msix_entries_nr || !dev->msix_entry_used[vector])
return; return;
@ -363,9 +370,9 @@ void msix_notify(PCIDevice *dev, unsigned vector)
return; return;
} }
address = pci_get_quad(table_entry + PCI_MSIX_ENTRY_LOWER_ADDR); msg = msix_get_message(dev, vector);
data = pci_get_long(table_entry + PCI_MSIX_ENTRY_DATA);
stl_le_phys(address, data); stl_le_phys(msg.address, msg.data);
} }
void msix_reset(PCIDevice *dev) void msix_reset(PCIDevice *dev)