Lines Matching full:proxy

73     VirtIOPCIProxy *proxy = to_virtio_pci_proxy_fast(d);  in virtio_pci_notify()  local
75 if (msix_enabled(&proxy->pci_dev)) { in virtio_pci_notify()
77 msix_notify(&proxy->pci_dev, vector); in virtio_pci_notify()
80 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_notify()
81 pci_set_irq(&proxy->pci_dev, qatomic_read(&vdev->isr) & 1); in virtio_pci_notify()
87 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_save_config() local
88 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_save_config()
90 pci_device_save(&proxy->pci_dev, f); in virtio_pci_save_config()
91 msix_save(&proxy->pci_dev, f); in virtio_pci_save_config()
92 if (msix_present(&proxy->pci_dev)) in virtio_pci_save_config()
113 VirtIOPCIProxy *proxy = opaque; in virtio_pci_modern_state_needed() local
115 return virtio_pci_modern(proxy); in virtio_pci_modern_state_needed()
149 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_has_extra_state() local
151 return proxy->flags & VIRTIO_PCI_FLAG_MIGRATE_EXTRA; in virtio_pci_has_extra_state()
156 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_save_extra_state() local
158 vmstate_save_state(f, &vmstate_virtio_pci, proxy, NULL); in virtio_pci_save_extra_state()
163 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_load_extra_state() local
165 return vmstate_load_state(f, &vmstate_virtio_pci, proxy, 1); in virtio_pci_load_extra_state()
170 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_save_queue() local
171 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_save_queue()
173 if (msix_present(&proxy->pci_dev)) in virtio_pci_save_queue()
179 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_load_config() local
180 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_load_config()
184 ret = pci_device_load(&proxy->pci_dev, f); in virtio_pci_load_config()
188 msix_unuse_all_vectors(&proxy->pci_dev); in virtio_pci_load_config()
189 msix_load(&proxy->pci_dev, f); in virtio_pci_load_config()
190 if (msix_present(&proxy->pci_dev)) { in virtio_pci_load_config()
193 if (vector != VIRTIO_NO_VECTOR && vector >= proxy->nvectors) { in virtio_pci_load_config()
201 msix_vector_use(&proxy->pci_dev, vector); in virtio_pci_load_config()
208 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_load_queue() local
209 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_load_queue()
212 if (msix_present(&proxy->pci_dev)) { in virtio_pci_load_queue()
214 if (vector != VIRTIO_NO_VECTOR && vector >= proxy->nvectors) { in virtio_pci_load_queue()
222 msix_vector_use(&proxy->pci_dev, vector); in virtio_pci_load_queue()
314 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_ioeventfd_enabled() local
316 return (proxy->flags & VIRTIO_PCI_FLAG_USE_IOEVENTFD) != 0; in virtio_pci_ioeventfd_enabled()
321 static inline int virtio_pci_queue_mem_mult(struct VirtIOPCIProxy *proxy) in virtio_pci_queue_mem_mult() argument
323 return (proxy->flags & VIRTIO_PCI_FLAG_PAGE_PER_VQ) ? in virtio_pci_queue_mem_mult()
330 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_ioeventfd_assign() local
331 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_ioeventfd_assign()
333 bool legacy = virtio_pci_legacy(proxy); in virtio_pci_ioeventfd_assign()
334 bool modern = virtio_pci_modern(proxy); in virtio_pci_ioeventfd_assign()
335 bool modern_pio = proxy->flags & VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY; in virtio_pci_ioeventfd_assign()
336 MemoryRegion *modern_mr = &proxy->notify.mr; in virtio_pci_ioeventfd_assign()
337 MemoryRegion *modern_notify_mr = &proxy->notify_pio.mr; in virtio_pci_ioeventfd_assign()
338 MemoryRegion *legacy_mr = &proxy->bar; in virtio_pci_ioeventfd_assign()
339 hwaddr modern_addr = virtio_pci_queue_mem_mult(proxy) * in virtio_pci_ioeventfd_assign()
373 static void virtio_pci_start_ioeventfd(VirtIOPCIProxy *proxy) in virtio_pci_start_ioeventfd() argument
375 virtio_bus_start_ioeventfd(&proxy->bus); in virtio_pci_start_ioeventfd()
378 static void virtio_pci_stop_ioeventfd(VirtIOPCIProxy *proxy) in virtio_pci_stop_ioeventfd() argument
380 virtio_bus_stop_ioeventfd(&proxy->bus); in virtio_pci_stop_ioeventfd()
385 VirtIOPCIProxy *proxy = opaque; in virtio_ioport_write() local
386 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_ioport_write()
394 val = virtio_bus_get_vdev_bad_features(&proxy->bus); in virtio_ioport_write()
401 virtio_pci_reset(DEVICE(proxy)); in virtio_ioport_write()
423 virtio_pci_stop_ioeventfd(proxy); in virtio_ioport_write()
429 virtio_pci_start_ioeventfd(proxy); in virtio_ioport_write()
433 virtio_pci_reset(DEVICE(proxy)); in virtio_ioport_write()
441 pci_default_write_config(&proxy->pci_dev, PCI_COMMAND, in virtio_ioport_write()
442 proxy->pci_dev.config[PCI_COMMAND] | in virtio_ioport_write()
448 msix_vector_unuse(&proxy->pci_dev, vdev->config_vector); in virtio_ioport_write()
451 if (val < proxy->nvectors) { in virtio_ioport_write()
452 msix_vector_use(&proxy->pci_dev, val); in virtio_ioport_write()
461 msix_vector_unuse(&proxy->pci_dev, vector); in virtio_ioport_write()
464 if (val < proxy->nvectors) { in virtio_ioport_write()
465 msix_vector_use(&proxy->pci_dev, val); in virtio_ioport_write()
479 static uint32_t virtio_ioport_read(VirtIOPCIProxy *proxy, uint32_t addr) in virtio_ioport_read() argument
481 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_ioport_read()
507 pci_irq_deassert(&proxy->pci_dev); in virtio_ioport_read()
525 VirtIOPCIProxy *proxy = opaque; in virtio_pci_config_read() local
526 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_config_read()
527 uint32_t config = VIRTIO_PCI_CONFIG_SIZE(&proxy->pci_dev); in virtio_pci_config_read()
535 return virtio_ioport_read(proxy, addr); in virtio_pci_config_read()
562 VirtIOPCIProxy *proxy = opaque; in virtio_pci_config_write() local
563 uint32_t config = VIRTIO_PCI_CONFIG_SIZE(&proxy->pci_dev); in virtio_pci_config_write()
564 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_config_write()
571 virtio_ioport_write(proxy, addr, val); in virtio_pci_config_write()
608 static MemoryRegion *virtio_address_space_lookup(VirtIOPCIProxy *proxy, in virtio_address_space_lookup() argument
614 for (i = 0; i < ARRAY_SIZE(proxy->regs); ++i) { in virtio_address_space_lookup()
615 reg = &proxy->regs[i]; in virtio_address_space_lookup()
643 void virtio_address_space_write(VirtIOPCIProxy *proxy, hwaddr addr, in virtio_address_space_write() argument
654 mr = virtio_address_space_lookup(proxy, &addr, len); in virtio_address_space_write()
681 virtio_address_space_read(VirtIOPCIProxy *proxy, hwaddr addr, in virtio_address_space_read() argument
692 mr = virtio_address_space_lookup(proxy, &addr, len); in virtio_address_space_read()
720 VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev); in virtio_pci_ats_ctrl_trigger() local
721 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_ats_ctrl_trigger()
753 VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev); in virtio_write_config() local
754 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_write_config()
759 if (proxy->flags & VIRTIO_PCI_FLAG_INIT_FLR) { in virtio_write_config()
763 if (proxy->flags & VIRTIO_PCI_FLAG_ATS) { in virtio_write_config()
770 virtio_pci_stop_ioeventfd(proxy); in virtio_write_config()
777 if (proxy->config_cap && in virtio_write_config()
778 ranges_overlap(address, len, proxy->config_cap + offsetof(struct virtio_pci_cfg_cap, in virtio_write_config()
784 cfg = (void *)(proxy->pci_dev.config + proxy->config_cap); in virtio_write_config()
790 virtio_address_space_write(proxy, off, cfg->pci_cfg_data, caplen); in virtio_write_config()
798 VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev); in virtio_read_config() local
801 if (proxy->config_cap && in virtio_read_config()
802 ranges_overlap(address, len, proxy->config_cap + offsetof(struct virtio_pci_cfg_cap, in virtio_read_config()
808 cfg = (void *)(proxy->pci_dev.config + proxy->config_cap); in virtio_read_config()
814 virtio_address_space_read(proxy, off, cfg->pci_cfg_data, caplen); in virtio_read_config()
821 static int kvm_virtio_pci_vq_vector_use(VirtIOPCIProxy *proxy, in kvm_virtio_pci_vq_vector_use() argument
824 VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector]; in kvm_virtio_pci_vq_vector_use()
829 ret = kvm_irqchip_add_msi_route(&c, vector, &proxy->pci_dev); in kvm_virtio_pci_vq_vector_use()
840 static void kvm_virtio_pci_vq_vector_release(VirtIOPCIProxy *proxy, in kvm_virtio_pci_vq_vector_release() argument
843 VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector]; in kvm_virtio_pci_vq_vector_release()
849 static int kvm_virtio_pci_irqfd_use(VirtIOPCIProxy *proxy, in kvm_virtio_pci_irqfd_use() argument
853 VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector]; in kvm_virtio_pci_irqfd_use()
857 static void kvm_virtio_pci_irqfd_release(VirtIOPCIProxy *proxy, in kvm_virtio_pci_irqfd_release() argument
861 VirtIOIRQFD *irqfd = &proxy->vector_irqfd[vector]; in kvm_virtio_pci_irqfd_release()
867 static int virtio_pci_get_notifier(VirtIOPCIProxy *proxy, int queue_no, in virtio_pci_get_notifier() argument
870 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_get_notifier()
873 if (!proxy->vector_irqfd && vdev->status & VIRTIO_CONFIG_S_DRIVER_OK) in virtio_pci_get_notifier()
890 static int kvm_virtio_pci_vector_use_one(VirtIOPCIProxy *proxy, int queue_no) in kvm_virtio_pci_vector_use_one() argument
895 PCIDevice *dev = &proxy->pci_dev; in kvm_virtio_pci_vector_use_one()
896 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in kvm_virtio_pci_vector_use_one()
899 ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); in kvm_virtio_pci_vector_use_one()
906 ret = kvm_virtio_pci_vq_vector_use(proxy, vector); in kvm_virtio_pci_vector_use_one()
915 ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); in kvm_virtio_pci_vector_use_one()
917 kvm_virtio_pci_vq_vector_release(proxy, vector); in kvm_virtio_pci_vector_use_one()
924 static int kvm_virtio_pci_vector_vq_use(VirtIOPCIProxy *proxy, int nvqs) in kvm_virtio_pci_vector_vq_use() argument
928 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in kvm_virtio_pci_vector_vq_use()
934 ret = kvm_virtio_pci_vector_use_one(proxy, queue_no); in kvm_virtio_pci_vector_vq_use()
939 static int kvm_virtio_pci_vector_config_use(VirtIOPCIProxy *proxy) in kvm_virtio_pci_vector_config_use() argument
941 return kvm_virtio_pci_vector_use_one(proxy, VIRTIO_CONFIG_IRQ_IDX); in kvm_virtio_pci_vector_config_use()
944 static void kvm_virtio_pci_vector_release_one(VirtIOPCIProxy *proxy, in kvm_virtio_pci_vector_release_one() argument
947 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in kvm_virtio_pci_vector_release_one()
952 PCIDevice *dev = &proxy->pci_dev; in kvm_virtio_pci_vector_release_one()
954 ret = virtio_pci_get_notifier(proxy, queue_no, &n, &vector); in kvm_virtio_pci_vector_release_one()
962 kvm_virtio_pci_irqfd_release(proxy, n, vector); in kvm_virtio_pci_vector_release_one()
964 kvm_virtio_pci_vq_vector_release(proxy, vector); in kvm_virtio_pci_vector_release_one()
967 static void kvm_virtio_pci_vector_vq_release(VirtIOPCIProxy *proxy, int nvqs) in kvm_virtio_pci_vector_vq_release() argument
970 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in kvm_virtio_pci_vector_vq_release()
976 kvm_virtio_pci_vector_release_one(proxy, queue_no); in kvm_virtio_pci_vector_vq_release()
980 static void kvm_virtio_pci_vector_config_release(VirtIOPCIProxy *proxy) in kvm_virtio_pci_vector_config_release() argument
982 kvm_virtio_pci_vector_release_one(proxy, VIRTIO_CONFIG_IRQ_IDX); in kvm_virtio_pci_vector_config_release()
985 static int virtio_pci_one_vector_unmask(VirtIOPCIProxy *proxy, in virtio_pci_one_vector_unmask() argument
991 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_one_vector_unmask()
996 if (proxy->vector_irqfd) { in virtio_pci_one_vector_unmask()
997 irqfd = &proxy->vector_irqfd[vector]; in virtio_pci_one_vector_unmask()
1000 &proxy->pci_dev); in virtio_pci_one_vector_unmask()
1019 ret = kvm_virtio_pci_irqfd_use(proxy, n, vector); in virtio_pci_one_vector_unmask()
1024 static void virtio_pci_one_vector_mask(VirtIOPCIProxy *proxy, in virtio_pci_one_vector_mask() argument
1029 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_one_vector_mask()
1038 kvm_virtio_pci_irqfd_release(proxy, n, vector); in virtio_pci_one_vector_mask()
1045 VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev); in virtio_pci_vector_unmask() local
1046 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_vector_unmask()
1056 if (index < proxy->nvqs_with_notifiers) { in virtio_pci_vector_unmask()
1058 ret = virtio_pci_one_vector_unmask(proxy, index, vector, msg, n); in virtio_pci_vector_unmask()
1069 ret = virtio_pci_one_vector_unmask(proxy, VIRTIO_CONFIG_IRQ_IDX, vector, in virtio_pci_vector_unmask()
1078 virtio_pci_one_vector_mask(proxy, VIRTIO_CONFIG_IRQ_IDX, vector, n); in virtio_pci_vector_unmask()
1083 if (index < proxy->nvqs_with_notifiers) { in virtio_pci_vector_unmask()
1085 virtio_pci_one_vector_mask(proxy, index, vector, n); in virtio_pci_vector_unmask()
1095 VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev); in virtio_pci_vector_mask() local
1096 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_vector_mask()
1107 if (index < proxy->nvqs_with_notifiers) { in virtio_pci_vector_mask()
1108 virtio_pci_one_vector_mask(proxy, index, vector, n); in virtio_pci_vector_mask()
1115 virtio_pci_one_vector_mask(proxy, VIRTIO_CONFIG_IRQ_IDX, vector, n); in virtio_pci_vector_mask()
1123 VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev); in virtio_pci_vector_poll() local
1124 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_vector_poll()
1131 for (queue_no = 0; queue_no < proxy->nvqs_with_notifiers; queue_no++) { in virtio_pci_vector_poll()
1132 ret = virtio_pci_get_notifier(proxy, queue_no, &notifier, &vector); in virtio_pci_vector_poll()
1149 ret = virtio_pci_get_notifier(proxy, VIRTIO_CONFIG_IRQ_IDX, &notifier, in virtio_pci_vector_poll()
1181 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_set_guest_notifier() local
1182 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_set_guest_notifier()
1206 if (!msix_enabled(&proxy->pci_dev) && in virtio_pci_set_guest_notifier()
1217 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_query_guest_notifiers() local
1218 return msix_enabled(&proxy->pci_dev); in virtio_pci_query_guest_notifiers()
1223 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_set_guest_notifiers() local
1224 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_set_guest_notifiers()
1227 bool with_irqfd = msix_enabled(&proxy->pci_dev) && in virtio_pci_set_guest_notifiers()
1237 if (!assign && !proxy->nvqs_with_notifiers) { in virtio_pci_set_guest_notifiers()
1240 assert(assign || nvqs == proxy->nvqs_with_notifiers); in virtio_pci_set_guest_notifiers()
1242 proxy->nvqs_with_notifiers = nvqs; in virtio_pci_set_guest_notifiers()
1245 if ((proxy->vector_irqfd || in virtio_pci_set_guest_notifiers()
1248 msix_unset_vector_notifiers(&proxy->pci_dev); in virtio_pci_set_guest_notifiers()
1249 if (proxy->vector_irqfd) { in virtio_pci_set_guest_notifiers()
1250 kvm_virtio_pci_vector_vq_release(proxy, nvqs); in virtio_pci_set_guest_notifiers()
1251 kvm_virtio_pci_vector_config_release(proxy); in virtio_pci_set_guest_notifiers()
1252 g_free(proxy->vector_irqfd); in virtio_pci_set_guest_notifiers()
1253 proxy->vector_irqfd = NULL; in virtio_pci_set_guest_notifiers()
1277 proxy->vector_irqfd = in virtio_pci_set_guest_notifiers()
1278 g_malloc0(sizeof(*proxy->vector_irqfd) * in virtio_pci_set_guest_notifiers()
1279 msix_nr_vectors_allocated(&proxy->pci_dev)); in virtio_pci_set_guest_notifiers()
1280 r = kvm_virtio_pci_vector_vq_use(proxy, nvqs); in virtio_pci_set_guest_notifiers()
1284 r = kvm_virtio_pci_vector_config_use(proxy); in virtio_pci_set_guest_notifiers()
1290 r = msix_set_vector_notifiers(&proxy->pci_dev, virtio_pci_vector_unmask, in virtio_pci_set_guest_notifiers()
1303 kvm_virtio_pci_vector_vq_release(proxy, nvqs); in virtio_pci_set_guest_notifiers()
1307 kvm_virtio_pci_vector_config_release(proxy); in virtio_pci_set_guest_notifiers()
1318 g_free(proxy->vector_irqfd); in virtio_pci_set_guest_notifiers()
1319 proxy->vector_irqfd = NULL; in virtio_pci_set_guest_notifiers()
1326 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_set_host_notifier_mr() local
1329 if (n >= VIRTIO_QUEUE_MAX || !virtio_pci_modern(proxy) || in virtio_pci_set_host_notifier_mr()
1330 virtio_pci_queue_mem_mult(proxy) != memory_region_size(mr)) { in virtio_pci_set_host_notifier_mr()
1335 offset = virtio_pci_queue_mem_mult(proxy) * n; in virtio_pci_set_host_notifier_mr()
1336 memory_region_add_subregion_overlap(&proxy->notify.mr, offset, mr, 1); in virtio_pci_set_host_notifier_mr()
1338 memory_region_del_subregion(&proxy->notify.mr, mr); in virtio_pci_set_host_notifier_mr()
1346 VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d); in virtio_pci_vmstate_change() local
1347 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_vmstate_change()
1353 if ((proxy->flags & VIRTIO_PCI_FLAG_BUS_MASTER_BUG_MIGRATION) && in virtio_pci_vmstate_change()
1355 !(proxy->pci_dev.config[PCI_COMMAND] & PCI_COMMAND_MASTER)) { in virtio_pci_vmstate_change()
1356 pci_default_write_config(&proxy->pci_dev, PCI_COMMAND, in virtio_pci_vmstate_change()
1357 proxy->pci_dev.config[PCI_COMMAND] | in virtio_pci_vmstate_change()
1360 virtio_pci_start_ioeventfd(proxy); in virtio_pci_vmstate_change()
1362 virtio_pci_stop_ioeventfd(proxy); in virtio_pci_vmstate_change()
1372 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_query_nvectors() local
1374 return proxy->nvectors; in virtio_pci_query_nvectors()
1379 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_get_dma_as() local
1380 PCIDevice *dev = &proxy->pci_dev; in virtio_pci_get_dma_as()
1387 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_iommu_enabled() local
1388 PCIDevice *dev = &proxy->pci_dev; in virtio_pci_iommu_enabled()
1400 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_queue_enabled() local
1401 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_queue_enabled()
1404 return proxy->vqs[n].enabled; in virtio_pci_queue_enabled()
1410 static int virtio_pci_add_mem_cap(VirtIOPCIProxy *proxy, in virtio_pci_add_mem_cap() argument
1413 PCIDevice *dev = &proxy->pci_dev; in virtio_pci_add_mem_cap()
1427 VirtIOPCIProxy *proxy, in virtio_pci_set_vector() argument
1432 msix_enabled(&proxy->pci_dev) && kvm_msi_via_irqfd_enabled(); in virtio_pci_set_vector()
1444 kvm_virtio_pci_vector_release_one(proxy, queue_no); in virtio_pci_set_vector()
1454 kvm_virtio_pci_vector_use_one(proxy, queue_no); in virtio_pci_set_vector()
1458 int virtio_pci_add_shm_cap(VirtIOPCIProxy *proxy, in virtio_pci_add_shm_cap() argument
1473 return virtio_pci_add_mem_cap(proxy, &cap.cap); in virtio_pci_add_shm_cap()
1479 VirtIOPCIProxy *proxy = opaque; in virtio_pci_common_read() local
1480 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_common_read()
1490 val = proxy->dfselect; in virtio_pci_common_read()
1493 if (proxy->dfselect <= 1) { in virtio_pci_common_read()
1497 (32 * proxy->dfselect); in virtio_pci_common_read()
1501 val = proxy->gfselect; in virtio_pci_common_read()
1504 if (proxy->gfselect < ARRAY_SIZE(proxy->guest_features)) { in virtio_pci_common_read()
1505 val = proxy->guest_features[proxy->gfselect]; in virtio_pci_common_read()
1534 val = proxy->vqs[vdev->queue_sel].enabled; in virtio_pci_common_read()
1541 val = proxy->vqs[vdev->queue_sel].desc[0]; in virtio_pci_common_read()
1544 val = proxy->vqs[vdev->queue_sel].desc[1]; in virtio_pci_common_read()
1547 val = proxy->vqs[vdev->queue_sel].avail[0]; in virtio_pci_common_read()
1550 val = proxy->vqs[vdev->queue_sel].avail[1]; in virtio_pci_common_read()
1553 val = proxy->vqs[vdev->queue_sel].used[0]; in virtio_pci_common_read()
1556 val = proxy->vqs[vdev->queue_sel].used[1]; in virtio_pci_common_read()
1559 val = proxy->vqs[vdev->queue_sel].reset; in virtio_pci_common_read()
1571 VirtIOPCIProxy *proxy = opaque; in virtio_pci_common_write() local
1572 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_common_write()
1581 proxy->dfselect = val; in virtio_pci_common_write()
1584 proxy->gfselect = val; in virtio_pci_common_write()
1587 if (proxy->gfselect < ARRAY_SIZE(proxy->guest_features)) { in virtio_pci_common_write()
1588 proxy->guest_features[proxy->gfselect] = val; in virtio_pci_common_write()
1590 (((uint64_t)proxy->guest_features[1]) << 32) | in virtio_pci_common_write()
1591 proxy->guest_features[0]); in virtio_pci_common_write()
1596 msix_vector_unuse(&proxy->pci_dev, vdev->config_vector); in virtio_pci_common_write()
1599 if (val < proxy->nvectors) { in virtio_pci_common_write()
1600 msix_vector_use(&proxy->pci_dev, val); in virtio_pci_common_write()
1604 virtio_pci_set_vector(vdev, proxy, VIRTIO_CONFIG_IRQ_IDX, in virtio_pci_common_write()
1609 virtio_pci_stop_ioeventfd(proxy); in virtio_pci_common_write()
1615 virtio_pci_start_ioeventfd(proxy); in virtio_pci_common_write()
1619 virtio_pci_reset(DEVICE(proxy)); in virtio_pci_common_write()
1629 proxy->vqs[vdev->queue_sel].num = val; in virtio_pci_common_write()
1631 proxy->vqs[vdev->queue_sel].num); in virtio_pci_common_write()
1637 msix_vector_unuse(&proxy->pci_dev, vector); in virtio_pci_common_write()
1640 if (val < proxy->nvectors) { in virtio_pci_common_write()
1641 msix_vector_use(&proxy->pci_dev, val); in virtio_pci_common_write()
1645 virtio_pci_set_vector(vdev, proxy, vdev->queue_sel, vector, val); in virtio_pci_common_write()
1650 proxy->vqs[vdev->queue_sel].num); in virtio_pci_common_write()
1652 ((uint64_t)proxy->vqs[vdev->queue_sel].desc[1]) << 32 | in virtio_pci_common_write()
1653 proxy->vqs[vdev->queue_sel].desc[0], in virtio_pci_common_write()
1654 ((uint64_t)proxy->vqs[vdev->queue_sel].avail[1]) << 32 | in virtio_pci_common_write()
1655 proxy->vqs[vdev->queue_sel].avail[0], in virtio_pci_common_write()
1656 ((uint64_t)proxy->vqs[vdev->queue_sel].used[1]) << 32 | in virtio_pci_common_write()
1657 proxy->vqs[vdev->queue_sel].used[0]); in virtio_pci_common_write()
1658 proxy->vqs[vdev->queue_sel].enabled = 1; in virtio_pci_common_write()
1659 proxy->vqs[vdev->queue_sel].reset = 0; in virtio_pci_common_write()
1666 proxy->vqs[vdev->queue_sel].desc[0] = val; in virtio_pci_common_write()
1669 proxy->vqs[vdev->queue_sel].desc[1] = val; in virtio_pci_common_write()
1672 proxy->vqs[vdev->queue_sel].avail[0] = val; in virtio_pci_common_write()
1675 proxy->vqs[vdev->queue_sel].avail[1] = val; in virtio_pci_common_write()
1678 proxy->vqs[vdev->queue_sel].used[0] = val; in virtio_pci_common_write()
1681 proxy->vqs[vdev->queue_sel].used[1] = val; in virtio_pci_common_write()
1685 proxy->vqs[vdev->queue_sel].reset = 1; in virtio_pci_common_write()
1689 proxy->vqs[vdev->queue_sel].reset = 0; in virtio_pci_common_write()
1690 proxy->vqs[vdev->queue_sel].enabled = 0; in virtio_pci_common_write()
1702 VirtIOPCIProxy *proxy = opaque; in virtio_pci_notify_read() local
1703 if (virtio_bus_get_device(&proxy->bus) == NULL) { in virtio_pci_notify_read()
1713 VirtIOPCIProxy *proxy = opaque; in virtio_pci_notify_write() local
1714 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_notify_write()
1716 unsigned queue = addr / virtio_pci_queue_mem_mult(proxy); in virtio_pci_notify_write()
1727 VirtIOPCIProxy *proxy = opaque; in virtio_pci_notify_write_pio() local
1728 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_notify_write_pio()
1741 VirtIOPCIProxy *proxy = opaque; in virtio_pci_isr_read() local
1742 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_isr_read()
1750 pci_irq_deassert(&proxy->pci_dev); in virtio_pci_isr_read()
1762 VirtIOPCIProxy *proxy = opaque; in virtio_pci_device_read() local
1763 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_device_read()
1790 VirtIOPCIProxy *proxy = opaque; in virtio_pci_device_write() local
1791 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_device_write()
1810 static void virtio_pci_modern_regions_init(VirtIOPCIProxy *proxy, in virtio_pci_modern_regions_init() argument
1861 memory_region_init_io(&proxy->common.mr, OBJECT(proxy), in virtio_pci_modern_regions_init()
1863 proxy, in virtio_pci_modern_regions_init()
1865 proxy->common.size); in virtio_pci_modern_regions_init()
1868 memory_region_init_io(&proxy->isr.mr, OBJECT(proxy), in virtio_pci_modern_regions_init()
1870 proxy, in virtio_pci_modern_regions_init()
1872 proxy->isr.size); in virtio_pci_modern_regions_init()
1875 memory_region_init_io(&proxy->device.mr, OBJECT(proxy), in virtio_pci_modern_regions_init()
1877 proxy, in virtio_pci_modern_regions_init()
1879 proxy->device.size); in virtio_pci_modern_regions_init()
1882 memory_region_init_io(&proxy->notify.mr, OBJECT(proxy), in virtio_pci_modern_regions_init()
1884 proxy, in virtio_pci_modern_regions_init()
1886 proxy->notify.size); in virtio_pci_modern_regions_init()
1889 memory_region_init_io(&proxy->notify_pio.mr, OBJECT(proxy), in virtio_pci_modern_regions_init()
1891 proxy, in virtio_pci_modern_regions_init()
1893 proxy->notify_pio.size); in virtio_pci_modern_regions_init()
1896 static void virtio_pci_modern_region_map(VirtIOPCIProxy *proxy, in virtio_pci_modern_region_map() argument
1908 virtio_pci_add_mem_cap(proxy, cap); in virtio_pci_modern_region_map()
1912 static void virtio_pci_modern_mem_region_map(VirtIOPCIProxy *proxy, in virtio_pci_modern_mem_region_map() argument
1916 virtio_pci_modern_region_map(proxy, region, cap, in virtio_pci_modern_mem_region_map()
1917 &proxy->modern_bar, proxy->modern_mem_bar_idx); in virtio_pci_modern_mem_region_map()
1920 static void virtio_pci_modern_io_region_map(VirtIOPCIProxy *proxy, in virtio_pci_modern_io_region_map() argument
1924 virtio_pci_modern_region_map(proxy, region, cap, in virtio_pci_modern_io_region_map()
1925 &proxy->io_bar, proxy->modern_io_bar_idx); in virtio_pci_modern_io_region_map()
1928 static void virtio_pci_modern_mem_region_unmap(VirtIOPCIProxy *proxy, in virtio_pci_modern_mem_region_unmap() argument
1931 memory_region_del_subregion(&proxy->modern_bar, in virtio_pci_modern_mem_region_unmap()
1935 static void virtio_pci_modern_io_region_unmap(VirtIOPCIProxy *proxy, in virtio_pci_modern_io_region_unmap() argument
1938 memory_region_del_subregion(&proxy->io_bar, in virtio_pci_modern_io_region_unmap()
1944 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_pre_plugged() local
1945 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_pre_plugged()
1947 if (virtio_pci_modern(proxy)) { in virtio_pci_pre_plugged()
1957 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_device_plugged() local
1958 VirtioBusState *bus = &proxy->bus; in virtio_pci_device_plugged()
1959 bool legacy = virtio_pci_legacy(proxy); in virtio_pci_device_plugged()
1961 bool modern_pio = proxy->flags & VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY; in virtio_pci_device_plugged()
1970 if (!proxy->ignore_backend_features && in virtio_pci_device_plugged()
1972 virtio_pci_disable_modern(proxy); in virtio_pci_device_plugged()
1983 modern = virtio_pci_modern(proxy); in virtio_pci_device_plugged()
1985 config = proxy->pci_dev.config; in virtio_pci_device_plugged()
1986 if (proxy->class_code) { in virtio_pci_device_plugged()
1987 pci_config_set_class(config, proxy->class_code); in virtio_pci_device_plugged()
2016 if (proxy->trans_devid) { in virtio_pci_device_plugged()
2017 pci_config_set_device_id(config, proxy->trans_devid); in virtio_pci_device_plugged()
2037 cpu_to_le32(virtio_pci_queue_mem_mult(proxy)), in virtio_pci_device_plugged()
2050 virtio_pci_modern_regions_init(proxy, vdev->name); in virtio_pci_device_plugged()
2052 virtio_pci_modern_mem_region_map(proxy, &proxy->common, &cap); in virtio_pci_device_plugged()
2053 virtio_pci_modern_mem_region_map(proxy, &proxy->isr, &cap); in virtio_pci_device_plugged()
2054 virtio_pci_modern_mem_region_map(proxy, &proxy->device, &cap); in virtio_pci_device_plugged()
2055 virtio_pci_modern_mem_region_map(proxy, &proxy->notify, &notify.cap); in virtio_pci_device_plugged()
2058 memory_region_init(&proxy->io_bar, OBJECT(proxy), in virtio_pci_device_plugged()
2060 address_space_init(&proxy->modern_cfg_io_as, &proxy->io_bar, in virtio_pci_device_plugged()
2063 pci_register_bar(&proxy->pci_dev, proxy->modern_io_bar_idx, in virtio_pci_device_plugged()
2064 PCI_BASE_ADDRESS_SPACE_IO, &proxy->io_bar); in virtio_pci_device_plugged()
2066 virtio_pci_modern_io_region_map(proxy, &proxy->notify_pio, in virtio_pci_device_plugged()
2070 pci_register_bar(&proxy->pci_dev, proxy->modern_mem_bar_idx, in virtio_pci_device_plugged()
2074 &proxy->modern_bar); in virtio_pci_device_plugged()
2076 proxy->config_cap = virtio_pci_add_mem_cap(proxy, &cfg.cap); in virtio_pci_device_plugged()
2077 cfg_mask = (void *)(proxy->pci_dev.wmask + proxy->config_cap); in virtio_pci_device_plugged()
2084 if (proxy->nvectors) { in virtio_pci_device_plugged()
2085 int err = msix_init_exclusive_bar(&proxy->pci_dev, proxy->nvectors, in virtio_pci_device_plugged()
2086 proxy->msix_bar_idx, NULL); in virtio_pci_device_plugged()
2091 proxy->nvectors); in virtio_pci_device_plugged()
2093 proxy->nvectors = 0; in virtio_pci_device_plugged()
2097 proxy->pci_dev.config_write = virtio_write_config; in virtio_pci_device_plugged()
2098 proxy->pci_dev.config_read = virtio_read_config; in virtio_pci_device_plugged()
2101 size = VIRTIO_PCI_REGION_SIZE(&proxy->pci_dev) in virtio_pci_device_plugged()
2105 memory_region_init_io(&proxy->bar, OBJECT(proxy), in virtio_pci_device_plugged()
2107 proxy, "virtio-pci", size); in virtio_pci_device_plugged()
2109 pci_register_bar(&proxy->pci_dev, proxy->legacy_io_bar_idx, in virtio_pci_device_plugged()
2110 PCI_BASE_ADDRESS_SPACE_IO, &proxy->bar); in virtio_pci_device_plugged()
2116 VirtIOPCIProxy *proxy = VIRTIO_PCI(d); in virtio_pci_device_unplugged() local
2117 bool modern = virtio_pci_modern(proxy); in virtio_pci_device_unplugged()
2118 bool modern_pio = proxy->flags & VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY; in virtio_pci_device_unplugged()
2120 virtio_pci_stop_ioeventfd(proxy); in virtio_pci_device_unplugged()
2123 virtio_pci_modern_mem_region_unmap(proxy, &proxy->common); in virtio_pci_device_unplugged()
2124 virtio_pci_modern_mem_region_unmap(proxy, &proxy->isr); in virtio_pci_device_unplugged()
2125 virtio_pci_modern_mem_region_unmap(proxy, &proxy->device); in virtio_pci_device_unplugged()
2126 virtio_pci_modern_mem_region_unmap(proxy, &proxy->notify); in virtio_pci_device_unplugged()
2128 virtio_pci_modern_io_region_unmap(proxy, &proxy->notify_pio); in virtio_pci_device_unplugged()
2135 VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev); in virtio_pci_realize() local
2142 proxy->flags &= ~VIRTIO_PCI_FLAG_USE_IOEVENTFD; in virtio_pci_realize()
2155 proxy->legacy_io_bar_idx = 0; in virtio_pci_realize()
2156 proxy->msix_bar_idx = 1; in virtio_pci_realize()
2157 proxy->modern_io_bar_idx = 2; in virtio_pci_realize()
2158 proxy->modern_mem_bar_idx = 4; in virtio_pci_realize()
2160 proxy->common.offset = 0x0; in virtio_pci_realize()
2161 proxy->common.size = 0x1000; in virtio_pci_realize()
2162 proxy->common.type = VIRTIO_PCI_CAP_COMMON_CFG; in virtio_pci_realize()
2164 proxy->isr.offset = 0x1000; in virtio_pci_realize()
2165 proxy->isr.size = 0x1000; in virtio_pci_realize()
2166 proxy->isr.type = VIRTIO_PCI_CAP_ISR_CFG; in virtio_pci_realize()
2168 proxy->device.offset = 0x2000; in virtio_pci_realize()
2169 proxy->device.size = 0x1000; in virtio_pci_realize()
2170 proxy->device.type = VIRTIO_PCI_CAP_DEVICE_CFG; in virtio_pci_realize()
2172 proxy->notify.offset = 0x3000; in virtio_pci_realize()
2173 proxy->notify.size = virtio_pci_queue_mem_mult(proxy) * VIRTIO_QUEUE_MAX; in virtio_pci_realize()
2174 proxy->notify.type = VIRTIO_PCI_CAP_NOTIFY_CFG; in virtio_pci_realize()
2176 proxy->notify_pio.offset = 0x0; in virtio_pci_realize()
2177 proxy->notify_pio.size = 0x4; in virtio_pci_realize()
2178 proxy->notify_pio.type = VIRTIO_PCI_CAP_NOTIFY_CFG; in virtio_pci_realize()
2181 memory_region_init(&proxy->modern_bar, OBJECT(proxy), "virtio-pci", in virtio_pci_realize()
2183 pow2ceil(proxy->notify.offset + proxy->notify.size)); in virtio_pci_realize()
2185 address_space_init(&proxy->modern_cfg_mem_as, &proxy->modern_bar, in virtio_pci_realize()
2188 if (proxy->disable_legacy == ON_OFF_AUTO_AUTO) { in virtio_pci_realize()
2189 proxy->disable_legacy = pcie_port ? ON_OFF_AUTO_ON : ON_OFF_AUTO_OFF; in virtio_pci_realize()
2192 if (!virtio_pci_modern(proxy) && !virtio_pci_legacy(proxy)) { in virtio_pci_realize()
2221 if (proxy->flags & VIRTIO_PCI_FLAG_AER) { in virtio_pci_realize()
2227 if (proxy->flags & VIRTIO_PCI_FLAG_INIT_DEVERR) { in virtio_pci_realize()
2232 if (proxy->flags & VIRTIO_PCI_FLAG_INIT_LNKCTL) { in virtio_pci_realize()
2237 if (proxy->flags & VIRTIO_PCI_FLAG_PM_NO_SOFT_RESET) { in virtio_pci_realize()
2242 if (proxy->flags & VIRTIO_PCI_FLAG_INIT_PM) { in virtio_pci_realize()
2248 if (proxy->flags & VIRTIO_PCI_FLAG_ATS) { in virtio_pci_realize()
2250 proxy->flags & VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED); in virtio_pci_realize()
2254 if (proxy->flags & VIRTIO_PCI_FLAG_INIT_FLR) { in virtio_pci_realize()
2266 virtio_pci_bus_new(&proxy->bus, sizeof(proxy->bus), proxy); in virtio_pci_realize()
2268 k->realize(proxy, errp); in virtio_pci_realize()
2274 VirtIOPCIProxy *proxy = VIRTIO_PCI(pci_dev); in virtio_pci_exit() local
2277 bool modern_pio = proxy->flags & VIRTIO_PCI_FLAG_MODERN_PIO_NOTIFY; in virtio_pci_exit()
2280 if (proxy->flags & VIRTIO_PCI_FLAG_AER && pcie_port && in virtio_pci_exit()
2284 address_space_destroy(&proxy->modern_cfg_mem_as); in virtio_pci_exit()
2286 address_space_destroy(&proxy->modern_cfg_io_as); in virtio_pci_exit()
2292 VirtIOPCIProxy *proxy = VIRTIO_PCI(qdev); in virtio_pci_reset() local
2293 VirtioBusState *bus = VIRTIO_BUS(&proxy->bus); in virtio_pci_reset()
2297 msix_unuse_all_vectors(&proxy->pci_dev); in virtio_pci_reset()
2300 proxy->vqs[i].enabled = 0; in virtio_pci_reset()
2301 proxy->vqs[i].reset = 0; in virtio_pci_reset()
2302 proxy->vqs[i].num = 0; in virtio_pci_reset()
2303 proxy->vqs[i].desc[0] = proxy->vqs[i].desc[1] = 0; in virtio_pci_reset()
2304 proxy->vqs[i].avail[0] = proxy->vqs[i].avail[1] = 0; in virtio_pci_reset()
2305 proxy->vqs[i].used[0] = proxy->vqs[i].used[1] = 0; in virtio_pci_reset()
2339 VirtIOPCIProxy *proxy = VIRTIO_PCI(dev); in virtio_pci_bus_reset_hold() local
2344 if (proxy->flags & VIRTIO_PCI_FLAG_INIT_PM) { in virtio_pci_bus_reset_hold()
2387 VirtIOPCIProxy *proxy = VIRTIO_PCI(qdev); in virtio_pci_dc_realize() local
2388 PCIDevice *pci_dev = &proxy->pci_dev; in virtio_pci_dc_realize()
2390 if (!(proxy->flags & VIRTIO_PCI_FLAG_DISABLE_PCIE) && in virtio_pci_dc_realize()
2391 virtio_pci_modern(proxy)) { in virtio_pci_dc_realize()
2400 VirtIOPCIProxy *proxy = VIRTIO_PCI(dev); in virtio_pci_sync_config() local
2401 VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); in virtio_pci_sync_config()
2458 VirtIOPCIProxy *proxy = VIRTIO_PCI(obj); in virtio_pci_transitional_instance_init() local
2460 proxy->disable_legacy = ON_OFF_AUTO_OFF; in virtio_pci_transitional_instance_init()
2461 proxy->disable_modern = false; in virtio_pci_transitional_instance_init()
2466 VirtIOPCIProxy *proxy = VIRTIO_PCI(obj); in virtio_pci_non_transitional_instance_init() local
2468 proxy->disable_legacy = ON_OFF_AUTO_ON; in virtio_pci_non_transitional_instance_init()
2469 proxy->disable_modern = false; in virtio_pci_non_transitional_instance_init()