| #include "config.h" // CONFIG_DEBUG_LEVEL |
| #include "malloc.h" // free |
| #include "output.h" // dprintf |
| #include "stacks.h" // run_thread |
| #include "string.h" // memset |
| #include "virtio-pci.h" |
| #include "virtio-ring.h" |
| #include "virtio-mmio.h" |
| |
| void virtio_mmio_setup_one(u64 addr) |
| { |
| u32 magic, version, devid; |
| void *mmio; |
| |
| if (addr >= 0x100000000) { |
| dprintf(1, "virtio-mmio: %llx: above 4G\n", addr); |
| return; |
| } |
| |
| mmio = (void*)(u32)(addr); |
| magic = readl(mmio); |
| if (magic != 0x74726976) { |
| dprintf(1, "virtio-mmio: %llx: magic mismatch\n", addr); |
| return; |
| } |
| version = readl(mmio+4); |
| if (version != 1 /* legacy */ && |
| version != 2 /* 1.0 */) { |
| dprintf(1, "virtio-mmio: %llx: unknown version %d\n", addr, version); |
| return; |
| } |
| devid = readl(mmio+8); |
| dprintf(1, "virtio-mmio: %llx: device id %x%s\n", |
| addr, devid, version == 1 ? " (legacy)" : ""); |
| switch (devid) { |
| case 2: /* blk */ |
| /* TODO */ |
| break; |
| case 8: /* scsi */ |
| /* TODO */ |
| break; |
| default: |
| break; |
| } |
| } |
| |
| void vp_init_mmio(struct vp_device *vp, void *mmio) |
| { |
| memset(vp, 0, sizeof(*vp)); |
| vp->use_mmio = 1; |
| vp->common.mode = VP_ACCESS_MMIO; |
| vp->common.memaddr = mmio; |
| vp->device.mode = VP_ACCESS_MMIO; |
| vp->device.memaddr = mmio + 0x100; |
| vp_reset(vp); |
| vp_set_status(vp, VIRTIO_CONFIG_S_ACKNOWLEDGE | |
| VIRTIO_CONFIG_S_DRIVER); |
| } |