Guest may enable or disable ATS for the device. Add logic for handling these events.
Signed-off-by: Viktor Prutyanov <vik...@daynix.com> --- hw/virtio/virtio-pci.c | 12 ++++++++++++ include/hw/virtio/virtio.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c index 247325c193..70f63a4986 100644 --- a/hw/virtio/virtio-pci.c +++ b/hw/virtio/virtio-pci.c @@ -1731,6 +1731,17 @@ static void virtio_pci_device_write(void *opaque, hwaddr addr, } } +static void virtio_pci_ats_ctrl_trigger(PCIDevice *pci_dev, bool enable) +{ + VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev); + VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); + + vdev->ats_enabled = enable; + + if (vdev->ats_ctrl_trigger) + vdev->ats_ctrl_trigger(enable, vdev); +} + static void virtio_pci_modern_regions_init(VirtIOPCIProxy *proxy, const char *vdev_name) { @@ -2166,6 +2177,7 @@ static void virtio_pci_realize(PCIDevice *pci_dev, Error **errp) if (proxy->flags & VIRTIO_PCI_FLAG_ATS) { pcie_ats_init(pci_dev, last_pcie_cap_offset, proxy->flags & VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED); + pci_dev->ats_ctrl_trigger = virtio_pci_ats_ctrl_trigger; last_pcie_cap_offset += PCI_EXT_CAP_ATS_SIZEOF; } diff --git a/include/hw/virtio/virtio.h b/include/hw/virtio/virtio.h index 77c6c55929..2812561aae 100644 --- a/include/hw/virtio/virtio.h +++ b/include/hw/virtio/virtio.h @@ -155,6 +155,8 @@ struct VirtIODevice QLIST_HEAD(, VirtQueue) *vector_queues; QTAILQ_ENTRY(VirtIODevice) next; EventNotifier config_notifier; + void (*ats_ctrl_trigger)(bool enable, VirtIODevice *vdev); + bool ats_enabled; }; struct VirtioDeviceClass { -- 2.21.0