Lines Matching +full:virtio +full:- +full:pci

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Virtio PCI driver - legacy device support
5 * This module allows virtio devices to be used over a virtual PCI device.
20 /* virtio config->get_features() implementation */
27 return vp_legacy_get_features(&vp_dev->ldev); in vp_get_features()
30 /* virtio config->finalize_features() implementation */
39 BUG_ON((u32)vdev->features != vdev->features); in vp_finalize_features()
42 vp_legacy_set_features(&vp_dev->ldev, vdev->features); in vp_finalize_features()
47 /* virtio config->get() implementation */
52 void __iomem *ioaddr = vp_dev->ldev.ioaddr + in vp_get()
53 VIRTIO_PCI_CONFIG_OFF(vp_dev->msix_enabled) + in vp_get()
62 /* the config->set() implementation. it's symmetric to the config->get()
68 void __iomem *ioaddr = vp_dev->ldev.ioaddr + in vp_set()
69 VIRTIO_PCI_CONFIG_OFF(vp_dev->msix_enabled) + in vp_set()
78 /* config->{get,set}_status() implementations */
82 return vp_legacy_get_status(&vp_dev->ldev); in vp_get_status()
90 vp_legacy_set_status(&vp_dev->ldev, status); in vp_set_status()
97 vp_legacy_set_status(&vp_dev->ldev, 0); in vp_reset()
99 * including MSi-X interrupts, if any. */ in vp_reset()
100 vp_legacy_get_status(&vp_dev->ldev); in vp_reset()
107 return vp_legacy_config_vector(&vp_dev->ldev, vector); in vp_config_vector()
124 num = vp_legacy_get_queue_size(&vp_dev->ldev, index); in setup_vq()
125 if (!num || vp_legacy_get_queue_enable(&vp_dev->ldev, index)) in setup_vq()
126 return ERR_PTR(-ENOENT); in setup_vq()
128 info->msix_vector = msix_vec; in setup_vq()
132 VIRTIO_PCI_VRING_ALIGN, &vp_dev->vdev, in setup_vq()
136 return ERR_PTR(-ENOMEM); in setup_vq()
138 vq->num_max = num; in setup_vq()
142 dev_err(&vp_dev->pci_dev->dev, in setup_vq()
143 "platform bug: legacy virtio-pci must not be used with RAM above 0x%llxGB\n", in setup_vq()
144 0x1ULL << (32 + PAGE_SHIFT - 30)); in setup_vq()
145 err = -E2BIG; in setup_vq()
150 vp_legacy_set_queue_address(&vp_dev->ldev, index, q_pfn); in setup_vq()
152 vq->priv = (void __force *)vp_dev->ldev.ioaddr + VIRTIO_PCI_QUEUE_NOTIFY; in setup_vq()
155 msix_vec = vp_legacy_queue_vector(&vp_dev->ldev, index, msix_vec); in setup_vq()
157 err = -EBUSY; in setup_vq()
165 vp_legacy_set_queue_address(&vp_dev->ldev, index, 0); in setup_vq()
173 struct virtqueue *vq = info->vq; in del_vq()
174 struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev); in del_vq()
176 if (vp_dev->msix_enabled) { in del_vq()
177 vp_legacy_queue_vector(&vp_dev->ldev, vq->index, in del_vq()
180 ioread8(vp_dev->ldev.ioaddr + VIRTIO_PCI_ISR); in del_vq()
184 vp_legacy_set_queue_address(&vp_dev->ldev, vq->index, 0); in del_vq()
205 /* the PCI probing function */
208 struct virtio_pci_legacy_device *ldev = &vp_dev->ldev; in virtio_pci_legacy_probe()
209 struct pci_dev *pci_dev = vp_dev->pci_dev; in virtio_pci_legacy_probe()
212 ldev->pci_dev = pci_dev; in virtio_pci_legacy_probe()
218 vp_dev->isr = ldev->isr; in virtio_pci_legacy_probe()
219 vp_dev->vdev.id = ldev->id; in virtio_pci_legacy_probe()
221 vp_dev->vdev.config = &virtio_pci_config_ops; in virtio_pci_legacy_probe()
223 vp_dev->config_vector = vp_config_vector; in virtio_pci_legacy_probe()
224 vp_dev->setup_vq = setup_vq; in virtio_pci_legacy_probe()
225 vp_dev->del_vq = del_vq; in virtio_pci_legacy_probe()
226 vp_dev->is_legacy = true; in virtio_pci_legacy_probe()
233 struct virtio_pci_legacy_device *ldev = &vp_dev->ldev; in virtio_pci_legacy_remove()