blob: 0d6ef6e2f19d2043909f2544f149034fe588dfa1 [file] [log] [blame]
#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);
}