mirror of https://gitlab.com/qemu-project/qemu
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:
parent
287d55c676
commit
bc4caf49c7
19
hw/msix.c
19
hw/msix.c
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue