Lines Matching +full:virtio +full:- +full:pci
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Virtio PCI driver - modern (virtio 1.0) device support
5 * This module allows virtio devices to be used over a virtual PCI device.
26 return vp_modern_get_features(&vp_dev->mdev); in vp_get_features()
32 struct pci_dev *pci_dev = vp_dev->pci_dev; in vp_transport_features()
39 /* virtio config->finalize_features() implementation */
43 u64 features = vdev->features; in vp_finalize_features()
52 dev_err(&vdev->dev, "virtio: device uses modern interface " in vp_finalize_features()
54 return -EINVAL; in vp_finalize_features()
57 vp_modern_set_features(&vp_dev->mdev, vdev->features); in vp_finalize_features()
62 /* virtio config->get() implementation */
67 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in vp_get()
68 void __iomem *device = mdev->device; in vp_get()
73 BUG_ON(offset + len > mdev->device_len); in vp_get()
99 /* the config->set() implementation. it's symmetric to the config->get()
105 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in vp_set()
106 void __iomem *device = mdev->device; in vp_set()
111 BUG_ON(offset + len > mdev->device_len); in vp_set()
141 return vp_modern_generation(&vp_dev->mdev); in vp_generation()
144 /* config->{get,set}_status() implementations */
149 return vp_modern_get_status(&vp_dev->mdev); in vp_get_status()
158 vp_modern_set_status(&vp_dev->mdev, status); in vp_set_status()
164 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in vp_reset()
171 * including MSI-X interrupts, if any. in vp_reset()
181 return vp_modern_config_vector(&vp_dev->mdev, vector); in vp_config_vector()
193 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in setup_vq()
199 return ERR_PTR(-ENOENT); in setup_vq()
204 return ERR_PTR(-ENOENT); in setup_vq()
206 if (num & (num - 1)) { in setup_vq()
207 dev_warn(&vp_dev->pci_dev->dev, "bad queue size %u", num); in setup_vq()
208 return ERR_PTR(-EINVAL); in setup_vq()
211 info->msix_vector = msix_vec; in setup_vq()
215 SMP_CACHE_BYTES, &vp_dev->vdev, in setup_vq()
219 return ERR_PTR(-ENOMEM); in setup_vq()
227 vq->priv = (void __force *)vp_modern_map_vq_notify(mdev, index, NULL); in setup_vq()
228 if (!vq->priv) { in setup_vq()
229 err = -ENOMEM; in setup_vq()
236 err = -EBUSY; in setup_vq()
244 if (!mdev->notify_base) in setup_vq()
245 pci_iounmap(mdev->pci_dev, (void __iomem __force *)vq->priv); in setup_vq()
267 list_for_each_entry(vq, &vdev->vqs, list) in vp_modern_find_vqs()
268 vp_modern_set_queue_enable(&vp_dev->mdev, vq->index, true); in vp_modern_find_vqs()
275 struct virtqueue *vq = info->vq; in del_vq()
276 struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev); in del_vq()
277 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in del_vq()
279 if (vp_dev->msix_enabled) in del_vq()
280 vp_modern_queue_vector(mdev, vq->index, in del_vq()
283 if (!mdev->notify_base) in del_vq()
284 pci_iounmap(mdev->pci_dev, (void __force __iomem *)vq->priv); in del_vq()
308 dev_err(&dev->dev, "%s: shm cap with bad size offset:" in virtio_pci_find_shm_cap()
352 struct pci_dev *pci_dev = vp_dev->pci_dev; in vp_get_shm_region()
365 dev_err(&pci_dev->dev, "%s: cap offset+len overflow detected\n", in vp_get_shm_region()
371 dev_err(&pci_dev->dev, "%s: bar shorter than cap offset+len\n", in vp_get_shm_region()
376 region->len = len; in vp_get_shm_region()
377 region->addr = (u64) phys_addr + offset; in vp_get_shm_region()
416 /* the PCI probing function */
419 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in virtio_pci_modern_probe()
420 struct pci_dev *pci_dev = vp_dev->pci_dev; in virtio_pci_modern_probe()
423 mdev->pci_dev = pci_dev; in virtio_pci_modern_probe()
429 if (mdev->device) in virtio_pci_modern_probe()
430 vp_dev->vdev.config = &virtio_pci_config_ops; in virtio_pci_modern_probe()
432 vp_dev->vdev.config = &virtio_pci_config_nodev_ops; in virtio_pci_modern_probe()
434 vp_dev->config_vector = vp_config_vector; in virtio_pci_modern_probe()
435 vp_dev->setup_vq = setup_vq; in virtio_pci_modern_probe()
436 vp_dev->del_vq = del_vq; in virtio_pci_modern_probe()
437 vp_dev->isr = mdev->isr; in virtio_pci_modern_probe()
438 vp_dev->vdev.id = mdev->id; in virtio_pci_modern_probe()
445 struct virtio_pci_modern_device *mdev = &vp_dev->mdev; in virtio_pci_modern_remove()