1/* 2 * Copyright 2021, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 */ 5 6#ifndef _VIRTIO_DEFS_H_ 7#define _VIRTIO_DEFS_H_ 8 9 10#include <SupportDefs.h> 11 12 13enum { 14 kVirtioRegsSize = 0x1000, 15 kVirtioSignature = 0x74726976, 16 kVirtioVendorId = 0x554d4551, 17}; 18 19enum { 20 kVirtioDevNet = 1, 21 kVirtioDevBlock = 2, 22 kVirtioDevConsole = 3, 23 kVirtioDev9p = 9, 24 kVirtioDevInput = 18, 25}; 26 27enum { 28 kVirtioConfigSAcknowledge = 1 << 0, 29 kVirtioConfigSDriver = 1 << 1, 30 kVirtioConfigSDriverOk = 1 << 2, 31 kVirtioConfigSFeaturesOk = 1 << 3, 32}; 33 34// VirtioRegs.interruptStatus, interruptAck 35enum { 36 kVirtioIntQueue = 1 << 0, 37 kVirtioIntConfig = 1 << 1, 38}; 39 40enum { 41 kVringDescFlagsNext = 1 << 0, 42 kVringDescFlagsWrite = 1 << 1, 43 kVringDescFlagsIndirect = 1 << 2, 44}; 45 46struct VirtioRegs { 47 uint32 signature; 48 uint32 version; 49 uint32 deviceId; 50 uint32 vendorId; 51 uint32 deviceFeatures; 52 uint32 unknown1[3]; 53 uint32 driverFeatures; 54 uint32 unknown2[1]; 55 uint32 guestPageSize; /* version 1 only */ 56 uint32 unknown3[1]; 57 uint32 queueSel; 58 uint32 queueNumMax; 59 uint32 queueNum; 60 uint32 queueAlign; /* version 1 only */ 61 uint32 queuePfn; /* version 1 only */ 62 uint32 queueReady; 63 uint32 unknown4[2]; 64 uint32 queueNotify; 65 uint32 unknown5[3]; 66 uint32 interruptStatus; 67 uint32 interruptAck; 68 uint32 unknown6[2]; 69 uint32 status; 70 uint32 unknown7[3]; 71 uint32 queueDescLow; 72 uint32 queueDescHi; 73 uint32 unknown8[2]; 74 uint32 queueAvailLow; 75 uint32 queueAvailHi; 76 uint32 unknown9[2]; 77 uint32 queueUsedLow; 78 uint32 queueUsedHi; 79 uint32 unknown10[21]; 80 uint32 configGeneration; 81 uint8 config[3840]; 82}; 83 84struct VirtioDesc { 85 uint64 addr; 86 uint32 len; 87 uint16 flags; 88 uint16 next; 89}; 90 91// filled by driver 92struct VirtioAvail { 93 uint16 flags; 94 uint16 idx; 95 uint16 ring[0]; 96}; 97 98struct VirtioUsedItem 99{ 100 uint32 id; 101 uint32 len; 102}; 103 104// filled by device 105struct VirtioUsed { 106 uint16 flags; 107 uint16 idx; 108 VirtioUsedItem ring[0]; 109}; 110 111 112// Input 113 114// VirtioInputConfig::select 115enum { 116 kVirtioInputCfgUnset = 0x00, 117 kVirtioInputCfgIdName = 0x01, 118 kVirtioInputCfgIdSerial = 0x02, 119 kVirtioInputCfgIdDevids = 0x03, 120 kVirtioInputCfgPropBits = 0x10, 121 kVirtioInputCfgEvBits = 0x11, // subsel: kVirtioInputEv* 122 kVirtioInputCfgAbsInfo = 0x12, // subsel: kVirtioInputAbs* 123}; 124 125enum { 126 kVirtioInputEvSyn = 0, 127 kVirtioInputEvKey = 1, 128 kVirtioInputEvRel = 2, 129 kVirtioInputEvAbs = 3, 130 kVirtioInputEvRep = 4, 131}; 132 133enum { 134 kVirtioInputBtnLeft = 0x110, 135 kVirtioInputBtnRight = 0x111, 136 kVirtioInputBtnMiddle = 0x112, 137 kVirtioInputBtnGearDown = 0x150, 138 kVirtioInputBtnGearUp = 0x151, 139}; 140 141enum { 142 kVirtioInputRelX = 0, 143 kVirtioInputRelY = 1, 144 kVirtioInputRelZ = 2, 145 kVirtioInputRelWheel = 8, 146}; 147 148enum { 149 kVirtioInputAbsX = 0, 150 kVirtioInputAbsY = 1, 151 kVirtioInputAbsZ = 2, 152}; 153 154 155struct VirtioInputAbsinfo { 156 int32 min; 157 int32 max; 158 int32 fuzz; 159 int32 flat; 160 int32 res; 161}; 162 163struct VirtioInputDevids { 164 uint16 bustype; 165 uint16 vendor; 166 uint16 product; 167 uint16 version; 168}; 169 170struct VirtioInputConfig { 171 uint8 select; // in 172 uint8 subsel; // in 173 uint8 size; // out, size of reply 174 uint8 reserved[5]; 175 union { 176 char string[128]; 177 uint8 bitmap[128]; 178 VirtioInputAbsinfo abs; 179 VirtioInputDevids ids; 180 }; 181}; 182 183struct VirtioInputPacket { 184 uint16 type; 185 uint16 code; 186 int32 value; 187}; 188 189 190// Block 191 192enum { 193 kVirtioBlockTypeIn = 0, 194 kVirtioBlockTypeOut = 1, 195 kVirtioBlockTypeFlush = 4, 196 kVirtioBlockTypeFlushOut = 5, 197}; 198 199enum { 200 kVirtioBlockStatusOk = 0, 201 kVirtioBlockStatusIoError = 1, 202 kVirtioBlockStatusUnsupported = 2, 203}; 204 205enum { 206 kVirtioBlockSectorSize = 512, 207}; 208 209struct VirtioBlockRequest { 210 uint32 type; 211 uint32 ioprio; 212 uint64 sectorNum; 213}; 214 215 216#endif // _VIRTIO_DEFS_H_ 217