static int syborg_virtio_net_init(SysBusDevice *dev) { VirtIODevice *vdev; SyborgVirtIOProxy *proxy = FROM_SYSBUS(SyborgVirtIOProxy, dev); vdev = virtio_net_init(&dev->qdev, &proxy->nic, &proxy->net); return syborg_virtio_init(proxy, vdev); }
static void syborg_virtio_net_init(SysBusDevice *dev) { VirtIODevice *vdev; SyborgVirtIOProxy *proxy = FROM_SYSBUS(SyborgVirtIOProxy, dev); vdev = virtio_net_init(&dev->qdev); syborg_virtio_init(proxy, vdev); }
static int virtio_ccw_net_init(VirtioCcwDevice *dev) { VirtIODevice *vdev; vdev = virtio_net_init((DeviceState *)dev, &dev->nic, &dev->net, dev->host_features[0]); if (!vdev) { return -1; } return virtio_ccw_device_init(dev, vdev); }
int virtio_mmio_detect(void *ptr, uint count, const uint irqs[]) { LTRACEF("ptr %p, count %u\n", ptr, count); DEBUG_ASSERT(ptr); DEBUG_ASSERT(irqs); DEBUG_ASSERT(!devices); /* allocate an array big enough to hold a list of devices */ devices = calloc(count, sizeof(struct virtio_device)); if (!devices) return ERR_NO_MEMORY; int found = 0; for (uint i = 0; i < count; i++) { volatile struct virtio_mmio_config *mmio = (struct virtio_mmio_config *)((uint8_t *)ptr + i * 0x200); struct virtio_device *dev = &devices[i]; dev->index = i; dev->irq = irqs[i]; mask_interrupt(irqs[i]); register_int_handler(irqs[i], &virtio_mmio_irq, (void *)dev); LTRACEF("looking at magic 0x%x version 0x%x did 0x%x vid 0x%x\n", mmio->magic, mmio->version, mmio->device_id, mmio->vendor_id); if (mmio->magic != VIRTIO_MMIO_MAGIC) { continue; } #if LOCAL_TRACE if (mmio->device_id != 0) { dump_mmio_config(mmio); } #endif #if WITH_DEV_VIRTIO_BLOCK if (mmio->device_id == 2) { // block device LTRACEF("found block device\n"); dev->mmio_config = mmio; dev->config_ptr = (void *)mmio->config; status_t err = virtio_block_init(dev, mmio->host_features); if (err >= 0) { // good device dev->valid = true; if (dev->irq_driver_callback) unmask_interrupt(dev->irq); // XXX quick test code, remove #if 0 uint8_t buf[512]; memset(buf, 0x99, sizeof(buf)); virtio_block_read_write(dev, buf, 0, sizeof(buf), false); hexdump8_ex(buf, sizeof(buf), 0); buf[0]++; virtio_block_read_write(dev, buf, 0, sizeof(buf), true); virtio_block_read_write(dev, buf, 0, sizeof(buf), false); hexdump8_ex(buf, sizeof(buf), 0); #endif } } #endif // WITH_DEV_VIRTIO_BLOCK #if WITH_DEV_VIRTIO_NET if (mmio->device_id == 1) { // network device LTRACEF("found net device\n"); dev->mmio_config = mmio; dev->config_ptr = (void *)mmio->config; status_t err = virtio_net_init(dev, mmio->host_features); if (err >= 0) { // good device dev->valid = true; if (dev->irq_driver_callback) unmask_interrupt(dev->irq); } } #endif // WITH_DEV_VIRTIO_NET #if WITH_DEV_VIRTIO_GPU if (mmio->device_id == 0x10) { // virtio-gpu LTRACEF("found gpu device\n"); dev->mmio_config = mmio; dev->config_ptr = (void *)mmio->config; status_t err = virtio_gpu_init(dev, mmio->host_features); if (err >= 0) { // good device dev->valid = true; if (dev->irq_driver_callback) unmask_interrupt(dev->irq); virtio_gpu_start(dev); } } #endif // WITH_DEV_VIRTIO_GPU if (dev->valid) found++; } return found; }