msi_init() is a supporting function in PCI device initialization, in order to convert .init() to .realize(), it should be modified first.
Bonus: add more comment. Signed-off-by: Cao jin <caoj.f...@cn.fujitsu.com> --- hw/pci/msi.c | 17 +++++++++++++---- include/hw/pci/msi.h | 4 ++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/hw/pci/msi.c b/hw/pci/msi.c index c1dd531..1f5d9e8 100644 --- a/hw/pci/msi.c +++ b/hw/pci/msi.c @@ -150,15 +150,23 @@ bool msi_enabled(const PCIDevice *dev) PCI_MSI_FLAGS_ENABLE); } -int msi_init(struct PCIDevice *dev, uint8_t offset, - unsigned int nr_vectors, bool msi64bit, bool msi_per_vector_mask) +/* + * @nr_vectors: Multiple Message Capable field of Message Control register + * @msi64bit: support 64-bit message address or not + * @msi_per_vector_mask: support per-vector masking or not + * + * return: MSI capability offset in config space + */ +int msi_init(struct PCIDevice *dev, uint8_t offset, unsigned int nr_vectors, + bool msi64bit, bool msi_per_vector_mask, Error **errp) { unsigned int vectors_order; - uint16_t flags; + uint16_t flags; /* Message Control register value */ uint8_t cap_size; int config_offset; if (!msi_supported) { + error_setg(errp, "MSI/MSI-X is not supported by interrupt controller"); return -ENOTSUP; } @@ -182,7 +190,7 @@ int msi_init(struct PCIDevice *dev, uint8_t offset, } cap_size = msi_cap_sizeof(flags); - config_offset = pci_add_capability(dev, PCI_CAP_ID_MSI, offset, cap_size); + config_offset = pci_add_capability2(dev, PCI_CAP_ID_MSI, offset, cap_size, errp); if (config_offset < 0) { return config_offset; } @@ -205,6 +213,7 @@ int msi_init(struct PCIDevice *dev, uint8_t offset, pci_set_long(dev->wmask + msi_mask_off(dev, msi64bit), 0xffffffff >> (PCI_MSI_VECTORS_MAX - nr_vectors)); } + return config_offset; } diff --git a/include/hw/pci/msi.h b/include/hw/pci/msi.h index 50e452b..da1dc1a 100644 --- a/include/hw/pci/msi.h +++ b/include/hw/pci/msi.h @@ -34,8 +34,8 @@ extern bool msi_supported; void msi_set_message(PCIDevice *dev, MSIMessage msg); MSIMessage msi_get_message(PCIDevice *dev, unsigned int vector); bool msi_enabled(const PCIDevice *dev); -int msi_init(struct PCIDevice *dev, uint8_t offset, - unsigned int nr_vectors, bool msi64bit, bool msi_per_vector_mask); +int msi_init(struct PCIDevice *dev, uint8_t offset, unsigned int nr_vectors, + bool msi64bit, bool msi_per_vector_mask, Error **errp); void msi_uninit(struct PCIDevice *dev); void msi_reset(PCIDevice *dev); void msi_notify(PCIDevice *dev, unsigned int vector); -- 2.1.0