Lines Matching +full:0 +full:- +full:dev
7 * See the COPYING file in the top-level directory.
11 #include "standard-headers/linux/pci_regs.h"
12 #include "standard-headers/linux/virtio_pci.h"
13 #include "standard-headers/linux/virtio_config.h"
14 #include "virtio-pci-modern.h"
18 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in config_readb() local
19 return qpci_io_readb(dev->pdev, dev->bar, dev->device_cfg_offset + addr); in config_readb()
24 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in config_readw() local
25 return qpci_io_readw(dev->pdev, dev->bar, dev->device_cfg_offset + addr); in config_readw()
30 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in config_readl() local
31 return qpci_io_readl(dev->pdev, dev->bar, dev->device_cfg_offset + addr); in config_readl()
36 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in config_readq() local
37 return qpci_io_readq(dev->pdev, dev->bar, dev->device_cfg_offset + addr); in config_readq()
42 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in get_features() local
45 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in get_features()
48 0); in get_features()
49 lo = qpci_io_readl(dev->pdev, dev->bar, dev->common_cfg_offset + in get_features()
52 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in get_features()
56 hi = qpci_io_readl(dev->pdev, dev->bar, dev->common_cfg_offset + in get_features()
64 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in set_features() local
67 g_assert_cmphex(features & (1ull << VIRTIO_F_VERSION_1), !=, 0); in set_features()
69 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_features()
72 0); in set_features()
73 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_features()
77 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_features()
81 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_features()
89 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in get_guest_features() local
92 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in get_guest_features()
95 0); in get_guest_features()
96 lo = qpci_io_readl(dev->pdev, dev->bar, dev->common_cfg_offset + in get_guest_features()
99 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in get_guest_features()
103 hi = qpci_io_readl(dev->pdev, dev->bar, dev->common_cfg_offset + in get_guest_features()
111 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in get_status() local
113 return qpci_io_readb(dev->pdev, dev->bar, dev->common_cfg_offset + in get_status()
120 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in set_status() local
122 return qpci_io_writeb(dev->pdev, dev->bar, dev->common_cfg_offset + in set_status()
128 static bool get_msix_status(QVirtioPCIDevice *dev, uint32_t msix_entry, in get_msix_status() argument
133 g_assert_cmpint(msix_entry, !=, -1); in get_msix_status()
134 if (qpci_msix_masked(dev->pdev, msix_entry)) { in get_msix_status()
136 return qpci_msix_pending(dev->pdev, msix_entry); in get_msix_status()
139 data = qtest_readl(dev->pdev->bus->qts, msix_addr); in get_msix_status()
141 qtest_writel(dev->pdev->bus->qts, msix_addr, 0); in get_msix_status()
150 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in get_queue_isr_status() local
152 if (dev->pdev->msix_enabled) { in get_queue_isr_status()
155 return get_msix_status(dev, vqpci->msix_entry, vqpci->msix_addr, in get_queue_isr_status()
156 vqpci->msix_data); in get_queue_isr_status()
159 return qpci_io_readb(dev->pdev, dev->bar, dev->isr_cfg_offset) & 1; in get_queue_isr_status()
164 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in get_config_isr_status() local
166 if (dev->pdev->msix_enabled) { in get_config_isr_status()
167 return get_msix_status(dev, dev->config_msix_entry, in get_config_isr_status()
168 dev->config_msix_addr, dev->config_msix_data); in get_config_isr_status()
171 return qpci_io_readb(dev->pdev, dev->bar, dev->isr_cfg_offset) & 2; in get_config_isr_status()
179 g_assert(g_get_monotonic_time() - start_time <= timeout_us); in wait_config_isr_status()
185 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in queue_select() local
187 qpci_io_writew(dev->pdev, dev->bar, dev->common_cfg_offset + in queue_select()
194 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in get_queue_size() local
196 return qpci_io_readw(dev->pdev, dev->bar, dev->common_cfg_offset + in get_queue_size()
202 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in set_queue_address() local
204 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_queue_address()
206 vq->desc); in set_queue_address()
207 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_queue_address()
209 vq->desc >> 32); in set_queue_address()
211 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_queue_address()
213 vq->avail); in set_queue_address()
214 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_queue_address()
216 vq->avail >> 32); in set_queue_address()
218 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_queue_address()
220 vq->used); in set_queue_address()
221 qpci_io_writel(dev->pdev, dev->bar, dev->common_cfg_offset + in set_queue_address()
223 vq->used >> 32); in set_queue_address()
229 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in virtqueue_setup() local
237 notify_off = qpci_io_readw(dev->pdev, dev->bar, dev->common_cfg_offset + in virtqueue_setup()
241 vqpci->notify_offset = dev->notify_cfg_offset + in virtqueue_setup()
242 notify_off * dev->notify_off_multiplier; in virtqueue_setup()
244 qpci_io_writew(dev->pdev, dev->bar, dev->common_cfg_offset + in virtqueue_setup()
252 QVirtioPCIDevice *dev = container_of(d, QVirtioPCIDevice, vdev); in virtqueue_kick() local
255 qpci_io_writew(dev->pdev, dev->bar, vqpci->notify_offset, vq->index); in virtqueue_kick()
282 qpci_io_writew(d->pdev, d->bar, d->common_cfg_offset + in set_config_vector()
284 vector = qpci_io_readw(d->pdev, d->bar, d->common_cfg_offset + in set_config_vector()
295 queue_select(&d->vdev, vq_idx); in set_queue_vector()
296 qpci_io_writew(d->pdev, d->bar, d->common_cfg_offset + in set_queue_vector()
299 vector = qpci_io_readw(d->pdev, d->bar, d->common_cfg_offset + in set_queue_vector()
310 static bool probe_device_type(QVirtioPCIDevice *dev) in probe_device_type() argument
315 /* "Drivers MUST match devices with the PCI Vendor ID 0x1AF4" */ in probe_device_type()
316 vendor_id = qpci_config_readw(dev->pdev, PCI_VENDOR_ID); in probe_device_type()
317 if (vendor_id != 0x1af4) { in probe_device_type()
322 * "Any PCI device with ... PCI Device ID 0x1000 through 0x107F inclusive in probe_device_type()
325 device_id = qpci_config_readw(dev->pdev, PCI_DEVICE_ID); in probe_device_type()
326 if (device_id < 0x1000 || device_id > 0x107f) { in probe_device_type()
331 * "Devices MAY utilize a Transitional PCI Device ID range, 0x1000 to in probe_device_type()
332 * 0x103F depending on the device type" in probe_device_type()
334 if (device_id < 0x1040) { in probe_device_type()
339 dev->vdev.device_type = qpci_config_readw(dev->pdev, PCI_SUBSYSTEM_ID); in probe_device_type()
342 * "The PCI Device ID is calculated by adding 0x1040 to the Virtio in probe_device_type()
345 dev->vdev.device_type = device_id - 0x1040; in probe_device_type()
352 static bool find_structure(QVirtioPCIDevice *dev, uint8_t cfg_type, in find_structure() argument
356 uint8_t addr = 0; in find_structure()
358 while ((addr = qpci_find_capability(dev->pdev, PCI_CAP_ID_VNDR, in find_structure()
359 addr)) != 0) { in find_structure()
362 type = qpci_config_readb(dev->pdev, in find_structure()
368 *bar = qpci_config_readb(dev->pdev, in find_structure()
370 *offset = qpci_config_readl(dev->pdev, in find_structure()
372 *length = qpci_config_readl(dev->pdev, in find_structure()
384 static bool probe_device_layout(QVirtioPCIDevice *dev) in probe_device_layout() argument
395 if (!find_structure(dev, VIRTIO_PCI_CAP_COMMON_CFG, &bar, in probe_device_layout()
396 &dev->common_cfg_offset, &length, NULL)) { in probe_device_layout()
399 dev->bar_idx = bar; in probe_device_layout()
401 if (!find_structure(dev, VIRTIO_PCI_CAP_NOTIFY_CFG, &bar, in probe_device_layout()
402 &dev->notify_cfg_offset, &length, &cfg_addr)) { in probe_device_layout()
405 g_assert_cmphex(bar, ==, dev->bar_idx); in probe_device_layout()
407 dev->notify_off_multiplier = qpci_config_readl(dev->pdev, in probe_device_layout()
411 if (!find_structure(dev, VIRTIO_PCI_CAP_ISR_CFG, &bar, in probe_device_layout()
412 &dev->isr_cfg_offset, &length, NULL)) { in probe_device_layout()
415 g_assert_cmphex(bar, ==, dev->bar_idx); in probe_device_layout()
417 if (!find_structure(dev, VIRTIO_PCI_CAP_DEVICE_CFG, &bar, in probe_device_layout()
418 &dev->device_cfg_offset, &length, NULL)) { in probe_device_layout()
421 g_assert_cmphex(bar, ==, dev->bar_idx); in probe_device_layout()
427 bool qvirtio_pci_init_virtio_1(QVirtioPCIDevice *dev) in qvirtio_pci_init_virtio_1() argument
429 if (!probe_device_type(dev)) { in qvirtio_pci_init_virtio_1()
433 if (!probe_device_layout(dev)) { in qvirtio_pci_init_virtio_1()
437 dev->vdev.bus = &qvirtio_pci_virtio_1; in qvirtio_pci_init_virtio_1()
438 dev->msix_ops = &qvirtio_pci_msix_ops_virtio_1; in qvirtio_pci_init_virtio_1()
439 dev->vdev.big_endian = false; in qvirtio_pci_init_virtio_1()