Lines Matching refs:d
260 #define bad_driver(d, fmt, ...) \ argument
261 errx(1, "%s: bad driver: " fmt, (d)->name, ## __VA_ARGS__)
278 static void iov_consume(struct device *d, in iov_consume() argument
297 bad_driver(d, "iovec too short!"); in iov_consume()
633 static void *_check_pointer(struct device *d, in _check_pointer() argument
642 bad_driver(d, "%s:%i: Invalid address %#lx", in _check_pointer()
651 #define check_pointer(d,addr,size) _check_pointer(d, addr, size, __LINE__) argument
658 static unsigned next_desc(struct device *d, struct vring_desc *desc, in next_desc() argument
673 bad_driver(d, "Desc next is %u", next); in next_desc()
1191 struct device *d = devices.pci[i]; in cleanup_devices() local
1192 if (!d) in cleanup_devices()
1194 reset_device(d); in cleanup_devices()
1293 static bool valid_bar_access(struct device *d, in valid_bar_access() argument
1301 if (cfg_access->cap.offset >= d->mmio_size in valid_bar_access()
1302 || cfg_access->cap.offset + cfg_access->cap.length > d->mmio_size) in valid_bar_access()
1355 static void emulate_mmio_write(struct device *d, u32 off, u32 val, u32 mask);
1360 struct device *d = dev_and_reg(®); in pci_data_iowrite() local
1363 if (!d) in pci_data_iowrite()
1373 if (&d->config_words[reg] == &d->config.bar[0]) { in pci_data_iowrite()
1376 iowrite(portoff, val, mask, &d->config.bar[0]); in pci_data_iowrite()
1377 for (i = 0; (1 << i) < d->mmio_size; i++) in pci_data_iowrite()
1378 d->config.bar[0] &= ~(1 << i); in pci_data_iowrite()
1380 } else if ((&d->config_words[reg] > &d->config.bar[0] in pci_data_iowrite()
1381 && &d->config_words[reg] <= &d->config.bar[6]) in pci_data_iowrite()
1382 || &d->config_words[reg] == &d->config.expansion_rom_addr) { in pci_data_iowrite()
1384 iowrite(portoff, val, mask, &d->config_words[reg]); in pci_data_iowrite()
1387 } else if (&d->config_words[reg] == (void *)&d->config.cacheline_size) { in pci_data_iowrite()
1391 iowrite(portoff, val, mask, &d->config_words[reg]); in pci_data_iowrite()
1393 } else if (&d->config_words[reg] == (void *)&d->config.command in pci_data_iowrite()
1397 } else if (&d->config_words[reg] in pci_data_iowrite()
1398 == (void *)&d->config.cfg_access.cap.bar in pci_data_iowrite()
1399 || &d->config_words[reg] in pci_data_iowrite()
1400 == &d->config.cfg_access.cap.length in pci_data_iowrite()
1401 || &d->config_words[reg] in pci_data_iowrite()
1402 == &d->config.cfg_access.cap.offset) { in pci_data_iowrite()
1410 iowrite(portoff, val, mask, &d->config_words[reg]); in pci_data_iowrite()
1412 } else if (&d->config_words[reg] == &d->config.cfg_access.pci_cfg_data) { in pci_data_iowrite()
1425 if (!valid_bar_access(d, &d->config.cfg_access)) in pci_data_iowrite()
1428 iowrite(portoff, val, mask, &d->config.cfg_access.pci_cfg_data); in pci_data_iowrite()
1434 write_mask = (1ULL<<(8*d->config.cfg_access.cap.length)) - 1; in pci_data_iowrite()
1436 d->config.cfg_access.pci_cfg_data, write_mask, in pci_data_iowrite()
1437 d->config.cfg_access.cap.bar, in pci_data_iowrite()
1438 d->config.cfg_access.cap.offset, in pci_data_iowrite()
1439 d->config.cfg_access.cap.length); in pci_data_iowrite()
1441 emulate_mmio_write(d, d->config.cfg_access.cap.offset, in pci_data_iowrite()
1442 d->config.cfg_access.pci_cfg_data, in pci_data_iowrite()
1457 static u32 emulate_mmio_read(struct device *d, u32 off, u32 mask);
1462 struct device *d = dev_and_reg(®); in pci_data_ioread() local
1464 if (!d) in pci_data_ioread()
1468 if (&d->config_words[reg] == &d->config.cfg_access.pci_cfg_data) { in pci_data_ioread()
1480 if (!valid_bar_access(d, &d->config.cfg_access)) in pci_data_ioread()
1481 bad_driver(d, in pci_data_ioread()
1483 d->config.cfg_access.cap.bar, in pci_data_ioread()
1484 d->config.cfg_access.cap.offset, in pci_data_ioread()
1485 d->config.cfg_access.cap.length); in pci_data_ioread()
1491 read_mask = (1ULL<<(8*d->config.cfg_access.cap.length))-1; in pci_data_ioread()
1492 d->config.cfg_access.pci_cfg_data in pci_data_ioread()
1493 = emulate_mmio_read(d, in pci_data_ioread()
1494 d->config.cfg_access.cap.offset, in pci_data_ioread()
1497 d->config.cfg_access.pci_cfg_data, read_mask, in pci_data_ioread()
1498 d->config.cfg_access.cap.bar, in pci_data_ioread()
1499 d->config.cfg_access.cap.offset, in pci_data_ioread()
1500 d->config.cfg_access.cap.length); in pci_data_ioread()
1502 ioread(port - PCI_CONFIG_DATA, d->config_words[reg], mask, val); in pci_data_ioread()
1746 struct device *d = devices.pci[i]; in find_mmio_region() local
1748 if (!d) in find_mmio_region()
1750 if (paddr < d->mmio_addr) in find_mmio_region()
1752 if (paddr >= d->mmio_addr + d->mmio_size) in find_mmio_region()
1754 *off = paddr - d->mmio_addr; in find_mmio_region()
1755 return d; in find_mmio_region()
1761 static struct virtqueue *vq_by_num(struct device *d, u32 num) in vq_by_num() argument
1763 struct virtqueue *vq = d->vq; in vq_by_num()
1795 static void check_virtqueue(struct device *d, struct virtqueue *vq) in check_virtqueue() argument
1864 static void start_virtqueues(struct device *d) in start_virtqueues() argument
1868 for (vq = d->vq; vq; vq = vq->next) { in start_virtqueues()
1874 static void emulate_mmio_write(struct device *d, u32 off, u32 val, u32 mask) in emulate_mmio_write() argument
1888 d->mmio->cfg.device_feature = d->features; in emulate_mmio_write()
1890 d->mmio->cfg.device_feature = (d->features >> 32); in emulate_mmio_write()
1892 d->mmio->cfg.device_feature = 0; in emulate_mmio_write()
1896 bad_driver(d, "Unexpected driver select %u", val); in emulate_mmio_write()
1899 if (d->mmio->cfg.guest_feature_select == 0) { in emulate_mmio_write()
1900 d->features_accepted &= ~((u64)0xFFFFFFFF); in emulate_mmio_write()
1901 d->features_accepted |= val; in emulate_mmio_write()
1903 assert(d->mmio->cfg.guest_feature_select == 1); in emulate_mmio_write()
1904 d->features_accepted &= 0xFFFFFFFF; in emulate_mmio_write()
1905 d->features_accepted |= ((u64)val) << 32; in emulate_mmio_write()
1913 if (d->features_accepted & ~d->features) in emulate_mmio_write()
1914 bad_driver(d, "over-accepted features %#llx of %#llx", in emulate_mmio_write()
1915 d->features_accepted, d->features); in emulate_mmio_write()
1920 verbose("%s: device status -> %#x\n", d->name, val); in emulate_mmio_write()
1928 reset_device(d); in emulate_mmio_write()
1933 if (d->mmio->cfg.device_status & ~val) in emulate_mmio_write()
1934 bad_driver(d, "unset of device status bit %#x -> %#x", in emulate_mmio_write()
1935 d->mmio->cfg.device_status, val); in emulate_mmio_write()
1944 && !(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER_OK)) in emulate_mmio_write()
1945 start_virtqueues(d); in emulate_mmio_write()
1978 switch (val & ~d->mmio->cfg.device_status) { in emulate_mmio_write()
1988 bad_driver(d, "unknown device status bit %#x -> %#x", in emulate_mmio_write()
1989 d->mmio->cfg.device_status, val); in emulate_mmio_write()
1991 if (d->mmio->cfg.device_status != prev) in emulate_mmio_write()
1992 bad_driver(d, "unexpected status transition %#x -> %#x", in emulate_mmio_write()
1993 d->mmio->cfg.device_status, val); in emulate_mmio_write()
1996 switch (val & ~d->mmio->cfg.device_status) { in emulate_mmio_write()
1998 d->wrote_features_ok = true; in emulate_mmio_write()
2001 if (d->wrote_features_ok) in emulate_mmio_write()
2002 bad_driver(d, "did not re-read FEATURES_OK"); in emulate_mmio_write()
2008 vq = vq_by_num(d, val); in emulate_mmio_write()
2016 d->mmio->cfg.queue_size = 0; in emulate_mmio_write()
2020 if (d->mmio->cfg.queue_size) in emulate_mmio_write()
2021 save_vq_config(&d->mmio->cfg, in emulate_mmio_write()
2022 vq_by_num(d, d->mmio->cfg.queue_select)); in emulate_mmio_write()
2024 restore_vq_config(&d->mmio->cfg, vq); in emulate_mmio_write()
2034 bad_driver(d, "invalid queue size %u", val); in emulate_mmio_write()
2035 if (d->mmio->cfg.queue_enable) in emulate_mmio_write()
2036 bad_driver(d, "changing queue size on live device"); in emulate_mmio_write()
2039 bad_driver(d, "attempt to set MSIX vector to %u", val); in emulate_mmio_write()
2041 struct virtqueue *vq = vq_by_num(d, d->mmio->cfg.queue_select); in emulate_mmio_write()
2049 bad_driver(d, "setting queue_enable to %u", val); in emulate_mmio_write()
2063 if (d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER_OK) in emulate_mmio_write()
2064 bad_driver(d, "enabling vq after DRIVER_OK"); in emulate_mmio_write()
2066 d->mmio->cfg.queue_enable = val; in emulate_mmio_write()
2067 save_vq_config(&d->mmio->cfg, vq); in emulate_mmio_write()
2068 check_virtqueue(d, vq); in emulate_mmio_write()
2072 bad_driver(d, "attempt to write to queue_notify_off"); in emulate_mmio_write()
2085 if (d->mmio->cfg.queue_enable) in emulate_mmio_write()
2086 bad_driver(d, "changing queue on live device"); in emulate_mmio_write()
2096 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_FEATURES_OK)) in emulate_mmio_write()
2097 bad_driver(d, "setting up vq before FEATURES_OK"); in emulate_mmio_write()
2103 if (d->wrote_features_ok) in emulate_mmio_write()
2104 bad_driver(d, "didn't re-read FEATURES_OK before setup"); in emulate_mmio_write()
2108 vq = vq_by_num(d, val); in emulate_mmio_write()
2110 bad_driver(d, "Invalid vq notification on %u", val); in emulate_mmio_write()
2115 bad_driver(d, "Unexpected write to isr"); in emulate_mmio_write()
2119 if (strcmp(d->name, "console") == 0) { in emulate_mmio_write()
2132 bad_driver(d, "Unexpected write to offset %u", off); in emulate_mmio_write()
2150 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER)) in emulate_mmio_write()
2151 bad_driver(d, "feature write before VIRTIO_CONFIG_S_DRIVER"); in emulate_mmio_write()
2152 if (d->mmio->cfg.device_status & VIRTIO_CONFIG_S_FEATURES_OK) in emulate_mmio_write()
2153 bad_driver(d, "feature write after VIRTIO_CONFIG_S_FEATURES_OK"); in emulate_mmio_write()
2164 bad_driver(d, "non-32-bit write to offset %u (%#x)", in emulate_mmio_write()
2168 memcpy((char *)d->mmio + off, &val, 4); in emulate_mmio_write()
2173 bad_driver(d, "non-16-bit write to offset %u (%#x)", in emulate_mmio_write()
2175 memcpy((char *)d->mmio + off, &val, 2); in emulate_mmio_write()
2180 bad_driver(d, "non-8-bit write to offset %u (%#x)", in emulate_mmio_write()
2182 memcpy((char *)d->mmio + off, &val, 1); in emulate_mmio_write()
2186 static u32 emulate_mmio_read(struct device *d, u32 off, u32 mask) in emulate_mmio_read() argument
2207 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER)) in emulate_mmio_read()
2208 bad_driver(d, in emulate_mmio_read()
2212 bad_driver(d, "read of msix_config"); in emulate_mmio_read()
2217 d->wrote_features_ok = false; in emulate_mmio_read()
2239 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER_OK)) in emulate_mmio_read()
2240 bad_driver(d, "notify before VIRTIO_CONFIG_S_DRIVER_OK"); in emulate_mmio_read()
2244 bad_driver(d, "non-8-bit read from offset %u (%#x)", in emulate_mmio_read()
2246 isr = d->mmio->isr; in emulate_mmio_read()
2252 d->mmio->isr = 0; in emulate_mmio_read()
2255 bad_driver(d, "read from padding (%#x)", getreg(eip)); in emulate_mmio_read()
2258 if (off > d->mmio_size - 4) in emulate_mmio_read()
2259 bad_driver(d, "read past end (%#x)", getreg(eip)); in emulate_mmio_read()
2273 if (!(d->mmio->cfg.device_status & VIRTIO_CONFIG_S_DRIVER)) in emulate_mmio_read()
2274 bad_driver(d, in emulate_mmio_read()
2294 bad_driver(d, "non-32-bit read to offset %u (%#x)", in emulate_mmio_read()
2296 memcpy(&val, (char *)d->mmio + off, 4); in emulate_mmio_read()
2301 bad_driver(d, "non-16-bit read to offset %u (%#x)", in emulate_mmio_read()
2303 memcpy(&val, (char *)d->mmio + off, 2); in emulate_mmio_read()
2308 bad_driver(d, "non-8-bit read to offset %u (%#x)", in emulate_mmio_read()
2310 memcpy(&val, (char *)d->mmio + off, 1); in emulate_mmio_read()
2317 struct device *d = find_mmio_region(paddr, &off); in emulate_mmio() local
2320 if (!d) { in emulate_mmio()
2335 emulate_mmio_write(d, off, val, mask); in emulate_mmio()
2339 val = emulate_mmio_read(d, off, mask); in emulate_mmio()
2346 emulate_mmio_write(d, off, val, mask); in emulate_mmio()
2350 val = emulate_mmio_read(d, off, mask); in emulate_mmio()