/* * Copyright 2021, Haiku, Inc. * Distributed under the terms of the MIT License. */ #ifndef _VIRTIO_DEFS_H_ #define _VIRTIO_DEFS_H_ #include enum { kVirtioRegsSize = 0x1000, kVirtioSignature = 0x74726976, kVirtioVendorId = 0x554d4551, }; enum { kVirtioDevNet = 1, kVirtioDevBlock = 2, kVirtioDevConsole = 3, kVirtioDev9p = 9, kVirtioDevInput = 18, }; enum { kVirtioConfigSAcknowledge = 1 << 0, kVirtioConfigSDriver = 1 << 1, kVirtioConfigSDriverOk = 1 << 2, kVirtioConfigSFeaturesOk = 1 << 3, }; // VirtioRegs.interruptStatus, interruptAck enum { kVirtioIntQueue = 1 << 0, kVirtioIntConfig = 1 << 1, }; enum { kVringDescFlagsNext = 1 << 0, kVringDescFlagsWrite = 1 << 1, kVringDescFlagsIndirect = 1 << 2, }; struct VirtioRegs { uint32 signature; uint32 version; uint32 deviceId; uint32 vendorId; uint32 deviceFeatures; uint32 unknown1[3]; uint32 driverFeatures; uint32 unknown2[1]; uint32 guestPageSize; /* version 1 only */ uint32 unknown3[1]; uint32 queueSel; uint32 queueNumMax; uint32 queueNum; uint32 queueAlign; /* version 1 only */ uint32 queuePfn; /* version 1 only */ uint32 queueReady; uint32 unknown4[2]; uint32 queueNotify; uint32 unknown5[3]; uint32 interruptStatus; uint32 interruptAck; uint32 unknown6[2]; uint32 status; uint32 unknown7[3]; uint32 queueDescLow; uint32 queueDescHi; uint32 unknown8[2]; uint32 queueAvailLow; uint32 queueAvailHi; uint32 unknown9[2]; uint32 queueUsedLow; uint32 queueUsedHi; uint32 unknown10[21]; uint32 configGeneration; uint8 config[3840]; }; struct VirtioDesc { uint64 addr; uint32 len; uint16 flags; uint16 next; }; // filled by driver struct VirtioAvail { uint16 flags; uint16 idx; uint16 ring[0]; }; struct VirtioUsedItem { uint32 id; uint32 len; }; // filled by device struct VirtioUsed { uint16 flags; uint16 idx; VirtioUsedItem ring[0]; }; // Input // VirtioInputConfig::select enum { kVirtioInputCfgUnset = 0x00, kVirtioInputCfgIdName = 0x01, kVirtioInputCfgIdSerial = 0x02, kVirtioInputCfgIdDevids = 0x03, kVirtioInputCfgPropBits = 0x10, kVirtioInputCfgEvBits = 0x11, // subsel: kVirtioInputEv* kVirtioInputCfgAbsInfo = 0x12, // subsel: kVirtioInputAbs* }; enum { kVirtioInputEvSyn = 0, kVirtioInputEvKey = 1, kVirtioInputEvRel = 2, kVirtioInputEvAbs = 3, kVirtioInputEvRep = 4, }; enum { kVirtioInputBtnLeft = 0x110, kVirtioInputBtnRight = 0x111, kVirtioInputBtnMiddle = 0x112, kVirtioInputBtnGearDown = 0x150, kVirtioInputBtnGearUp = 0x151, }; enum { kVirtioInputRelX = 0, kVirtioInputRelY = 1, kVirtioInputRelZ = 2, kVirtioInputRelWheel = 8, }; enum { kVirtioInputAbsX = 0, kVirtioInputAbsY = 1, kVirtioInputAbsZ = 2, }; struct VirtioInputAbsinfo { int32 min; int32 max; int32 fuzz; int32 flat; int32 res; }; struct VirtioInputDevids { uint16 bustype; uint16 vendor; uint16 product; uint16 version; }; struct VirtioInputConfig { uint8 select; // in uint8 subsel; // in uint8 size; // out, size of reply uint8 reserved[5]; union { char string[128]; uint8 bitmap[128]; VirtioInputAbsinfo abs; VirtioInputDevids ids; }; }; struct VirtioInputPacket { uint16 type; uint16 code; int32 value; }; // Block enum { kVirtioBlockTypeIn = 0, kVirtioBlockTypeOut = 1, kVirtioBlockTypeFlush = 4, kVirtioBlockTypeFlushOut = 5, }; enum { kVirtioBlockStatusOk = 0, kVirtioBlockStatusIoError = 1, kVirtioBlockStatusUnsupported = 2, }; enum { kVirtioBlockSectorSize = 512, }; struct VirtioBlockRequest { uint32 type; uint32 ioprio; uint64 sectorNum; }; #endif // _VIRTIO_DEFS_H_