1#ifndef QEMU_MSIX_H 2#define QEMU_MSIX_H 3 4#include "hw/pci/pci.h" 5 6#define MSIX_CAP_LENGTH 12 7 8void msix_set_message(PCIDevice *dev, int vector, MSIMessage msg); 9MSIMessage msix_get_message(PCIDevice *dev, unsigned int vector); 10int msix_init(PCIDevice *dev, unsigned short nentries, 11 MemoryRegion *table_bar, uint8_t table_bar_nr, 12 unsigned table_offset, MemoryRegion *pba_bar, 13 uint8_t pba_bar_nr, unsigned pba_offset, uint8_t cap_pos, 14 Error **errp); 15int msix_init_exclusive_bar(PCIDevice *dev, unsigned short nentries, 16 uint8_t bar_nr, Error **errp); 17 18void msix_write_config(PCIDevice *dev, uint32_t address, uint32_t val, int len); 19 20void msix_uninit(PCIDevice *dev, MemoryRegion *table_bar, 21 MemoryRegion *pba_bar); 22void msix_uninit_exclusive_bar(PCIDevice *dev); 23 24unsigned int msix_nr_vectors_allocated(const PCIDevice *dev); 25 26void msix_save(PCIDevice *dev, QEMUFile *f); 27void msix_load(PCIDevice *dev, QEMUFile *f); 28 29int msix_enabled(PCIDevice *dev); 30int msix_present(PCIDevice *dev); 31 32bool msix_is_masked(PCIDevice *dev, unsigned vector); 33void msix_set_pending(PCIDevice *dev, unsigned vector); 34void msix_clr_pending(PCIDevice *dev, int vector); 35 36int msix_vector_use(PCIDevice *dev, unsigned vector); 37void msix_vector_unuse(PCIDevice *dev, unsigned vector); 38void msix_unuse_all_vectors(PCIDevice *dev); 39void msix_set_mask(PCIDevice *dev, int vector, bool mask, Error **errp); 40 41void msix_notify(PCIDevice *dev, unsigned vector); 42 43void msix_reset(PCIDevice *dev); 44 45int msix_set_vector_notifiers(PCIDevice *dev, 46 MSIVectorUseNotifier use_notifier, 47 MSIVectorReleaseNotifier release_notifier, 48 MSIVectorPollNotifier poll_notifier); 49void msix_unset_vector_notifiers(PCIDevice *dev); 50 51extern const VMStateDescription vmstate_msix; 52 53#define VMSTATE_MSIX_TEST(_field, _state, _test) { \ 54 .name = (stringify(_field)), \ 55 .size = sizeof(PCIDevice), \ 56 .vmsd = &vmstate_msix, \ 57 .flags = VMS_STRUCT, \ 58 .offset = vmstate_offset_value(_state, _field, PCIDevice), \ 59 .field_exists = (_test) \ 60} 61 62#define VMSTATE_MSIX(_f, _s) \ 63 VMSTATE_MSIX_TEST(_f, _s, NULL) 64 65#endif 66