1 /* 2 * Copyright 2021, Haiku, Inc. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #ifndef _VIRTIO_H_ 8 #define _VIRTIO_H_ 9 10 11 #include <virtio_defs.h> 12 #include <util/DoublyLinkedList.h> 13 14 15 struct VirtioResources { 16 VirtioRegs* volatile regs; 17 size_t regsSize; 18 int32_t irq; 19 }; 20 21 enum IOState { 22 ioStateInactive, 23 ioStatePending, 24 ioStateDone, 25 ioStateFailed, 26 }; 27 28 enum IOOperation { 29 ioOpRead, 30 ioOpWrite, 31 }; 32 33 struct IORequest { 34 IOState state; 35 IOOperation op; 36 void* buf; 37 size_t len; 38 IORequest* next; 39 40 IORequest(IOOperation op, void* buf, size_t len): state(ioStateInactive), 41 op(op), buf(buf), len(len), next(NULL) {} 42 }; 43 44 class VirtioDevice : public DoublyLinkedListLinkImpl<VirtioDevice> { 45 private: 46 VirtioRegs* volatile fRegs; 47 size_t fQueueLen; 48 VirtioDesc* volatile fDescs; 49 VirtioAvail* volatile fAvail; 50 VirtioUsed* volatile fUsed; 51 uint32_t* fFreeDescs; 52 uint32_t fLastUsed; 53 IORequest** fReqs; 54 55 int32_t AllocDesc(); 56 void FreeDesc(int32_t idx); 57 58 public: 59 VirtioDevice(const VirtioResources& devRes); 60 ~VirtioDevice(); 61 inline VirtioRegs* volatile Regs() {return fRegs;} 62 void ScheduleIO(IORequest** reqs, uint32 cnt); 63 void ScheduleIO(IORequest* req); 64 IORequest* ConsumeIO(); 65 IORequest* WaitIO(); 66 }; 67 68 69 void virtio_init(); 70 void virtio_fini(); 71 void virtio_register(addr_t base, size_t len, uint32 irq); 72 73 VirtioResources* ThisVirtioDev(uint32 deviceId, int n); 74 75 int virtio_input_get_key(); 76 int virtio_input_wait_for_key(); 77 78 #endif // _VIRTIO_H_ 79