Lines Matching +full:virtio +full:- +full:pci
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/pci.h>
38 (virtvdev->core_device.irq_type == VFIO_PCI_MSIX_IRQ_INDEX); in virtiovf_issue_legacy_rw_cmd()
39 struct pci_dev *pdev = virtvdev->core_device.pdev; in virtiovf_issue_legacy_rw_cmd()
40 u8 *bar0_buf = virtvdev->bar0_virtual_buf; in virtiovf_issue_legacy_rw_cmd()
47 offset = common ? pos : pos - VIRTIO_PCI_CONFIG_OFF(msix_enabled); in virtiovf_issue_legacy_rw_cmd()
48 mutex_lock(&virtvdev->bar_mutex); in virtiovf_issue_legacy_rw_cmd()
59 ret = -EFAULT; in virtiovf_issue_legacy_rw_cmd()
62 ret = -EFAULT; in virtiovf_issue_legacy_rw_cmd()
74 mutex_unlock(&virtvdev->bar_mutex); in virtiovf_issue_legacy_rw_cmd()
83 struct vfio_pci_core_device *core_device = &virtvdev->core_device; in virtiovf_pci_bar0_rw()
84 struct pci_dev *pdev = core_device->pdev; in virtiovf_pci_bar0_rw()
88 if (!(le16_to_cpu(virtvdev->pci_cmd) & PCI_COMMAND_IO)) in virtiovf_pci_bar0_rw()
89 return -EIO; in virtiovf_pci_bar0_rw()
91 if (pos + count > virtvdev->bar0_virtual_buf_size) in virtiovf_pci_bar0_rw()
92 return -EINVAL; in virtiovf_pci_bar0_rw()
94 ret = pm_runtime_resume_and_get(&pdev->dev); in virtiovf_pci_bar0_rw()
97 return -EIO; in virtiovf_pci_bar0_rw()
103 ret = -EINVAL; in virtiovf_pci_bar0_rw()
108 virtvdev->notify_addr); in virtiovf_pci_bar0_rw()
113 ret = -EFAULT; in virtiovf_pci_bar0_rw()
118 ret = -EFAULT; in virtiovf_pci_bar0_rw()
122 virtvdev->notify_addr); in virtiovf_pci_bar0_rw()
131 pm_runtime_put(&pdev->dev); in virtiovf_pci_bar0_rw()
143 *start_offset = range2_start - range1_start; in range_intersect_range()
145 range1_start + count1 - range2_start); in range_intersect_range()
154 range2_start + count2 - range1_start); in range_intersect_range()
155 *register_offset = range1_start - range2_start; in range_intersect_range()
185 return -EFAULT; in virtiovf_pci_read_config()
188 if ((le16_to_cpu(virtvdev->pci_cmd) & PCI_COMMAND_IO) && in virtiovf_pci_read_config()
193 return -EFAULT; in virtiovf_pci_read_config()
197 return -EFAULT; in virtiovf_pci_read_config()
205 return -EFAULT; in virtiovf_pci_read_config()
210 u32 bar_mask = ~(virtvdev->bar0_virtual_buf_size - 1); in virtiovf_pci_read_config()
211 u32 pci_base_addr_0 = le32_to_cpu(virtvdev->pci_base_addr_0); in virtiovf_pci_read_config()
215 return -EFAULT; in virtiovf_pci_read_config()
221 * Transitional devices use the PCI subsystem device id as in virtiovf_pci_read_config()
222 * virtio device id, same as legacy driver always did. in virtiovf_pci_read_config()
227 return -EFAULT; in virtiovf_pci_read_config()
235 return -EFAULT; in virtiovf_pci_read_config()
273 if (range_intersect_range(pos, count, PCI_COMMAND, sizeof(virtvdev->pci_cmd), in virtiovf_pci_write_config()
276 if (copy_from_user((void *)&virtvdev->pci_cmd + register_offset, in virtiovf_pci_write_config()
279 return -EFAULT; in virtiovf_pci_write_config()
283 sizeof(virtvdev->pci_base_addr_0), in virtiovf_pci_write_config()
286 if (copy_from_user((void *)&virtvdev->pci_base_addr_0 + register_offset, in virtiovf_pci_write_config()
289 return -EFAULT; in virtiovf_pci_write_config()
327 return -EFAULT; in virtiovf_pci_ioctl_get_region_info()
330 return -EINVAL; in virtiovf_pci_ioctl_get_region_info()
335 info.size = virtvdev->bar0_virtual_buf_size; in virtiovf_pci_ioctl_get_region_info()
338 return copy_to_user(uarg, &info, minsz) ? -EFAULT : 0; in virtiovf_pci_ioctl_get_region_info()
359 struct vfio_pci_core_device *core_device = &virtvdev->core_device; in virtiovf_set_notify_addr()
367 virtvdev->notify_bar); in virtiovf_set_notify_addr()
371 virtvdev->notify_addr = core_device->barmap[virtvdev->notify_bar] + in virtiovf_set_notify_addr()
372 virtvdev->notify_offset; in virtiovf_set_notify_addr()
380 struct vfio_pci_core_device *vdev = &virtvdev->core_device; in virtiovf_pci_open_device()
387 if (virtvdev->bar0_virtual_buf) { in virtiovf_pci_open_device()
416 ret = virtio_pci_admin_legacy_io_notify_info(virtvdev->core_device.pdev, in virtiovf_read_notify_info()
422 virtvdev->notify_bar = bar; in virtiovf_read_notify_info()
423 virtvdev->notify_offset = offset; in virtiovf_read_notify_info()
438 pdev = virtvdev->core_device.pdev; in virtiovf_pci_init_device()
443 virtvdev->bar0_virtual_buf_size = VIRTIO_PCI_CONFIG_OFF(true) + in virtiovf_pci_init_device()
444 virtiovf_get_device_config_size(pdev->device); in virtiovf_pci_init_device()
445 BUILD_BUG_ON(!is_power_of_2(virtvdev->bar0_virtual_buf_size)); in virtiovf_pci_init_device()
446 virtvdev->bar0_virtual_buf = kzalloc(virtvdev->bar0_virtual_buf_size, in virtiovf_pci_init_device()
448 if (!virtvdev->bar0_virtual_buf) in virtiovf_pci_init_device()
449 return -ENOMEM; in virtiovf_pci_init_device()
450 mutex_init(&virtvdev->bar_mutex); in virtiovf_pci_init_device()
459 kfree(virtvdev->bar0_virtual_buf); in virtiovf_pci_core_release_dev()
464 .name = "virtio-vfio-pci-trans",
483 .name = "virtio-vfio-pci",
503 struct resource *res = pdev->resource; in virtiovf_bar0_exists()
505 return res->flags; in virtiovf_bar0_exists()
515 if (pdev->is_virtfn && virtio_pci_admin_has_legacy_io(pdev) && in virtiovf_pci_probe()
520 &pdev->dev, ops); in virtiovf_pci_probe()
524 dev_set_drvdata(&pdev->dev, &virtvdev->core_device); in virtiovf_pci_probe()
525 ret = vfio_pci_core_register_device(&virtvdev->core_device); in virtiovf_pci_probe()
530 vfio_put_device(&virtvdev->core_device.vdev); in virtiovf_pci_probe()
536 struct virtiovf_pci_core_device *virtvdev = dev_get_drvdata(&pdev->dev); in virtiovf_pci_remove()
538 vfio_pci_core_unregister_device(&virtvdev->core_device); in virtiovf_pci_remove()
539 vfio_put_device(&virtvdev->core_device.vdev); in virtiovf_pci_remove()
543 /* Only virtio-net is supported/tested so far */
548 MODULE_DEVICE_TABLE(pci, virtiovf_pci_table);
552 struct virtiovf_pci_core_device *virtvdev = dev_get_drvdata(&pdev->dev); in virtiovf_pci_aer_reset_done()
554 virtvdev->pci_cmd = 0; in virtiovf_pci_aer_reset_done()
576 "VIRTIO VFIO PCI - User Level meta-driver for VIRTIO NET devices");