| 149 | static_assert(sizeof(NVMeCompletion) == 16); |
| 150 | |
| 151 | class NVMeQueue{ |
| 152 | uint16_t queueID; |
| 153 | |
| 154 | uintptr_t completionBase; |
| 155 | uintptr_t submissionBase; |
| 156 | |
| 157 | NVMeCompletion* completionQueue; |
| 158 | NVMeCommand* submissionQueue; |
| 159 | |
| 160 | uint32_t* completionDB; |
| 161 | uint32_t* submissionDB; |
| 162 | |
| 163 | uint16_t cQueueSize = 0; // Queue sizes in bytes |
| 164 | uint16_t sQueueSize = 0; // Queue sizes in bytes |
| 165 | |
| 166 | uint16_t cqCount = 0; // Amount of elements in CQ |
| 167 | uint16_t sqCount = 0; // Amount of elements in SQ |
| 168 | |
| 169 | lock_t queueLock = 0; |
| 170 | |
| 171 | uint16_t nextCommandID = 0; |
| 172 | public: |
| 173 | bool completionCycleState = true; |
| 174 | uint16_t cqHead = 0; |
| 175 | uint16_t sqTail = 0; |
| 176 | |
| 177 | /////////////////////////////// |
| 178 | /// \name NVMeQueue |
| 179 | /// |
| 180 | /// \param cid Completion Queue ID |
| 181 | /// \param sid Submission Queue ID |
| 182 | /// \param cqBase Completion Queue physical base |
| 183 | /// \param sqBase Submission Queue physical base |
| 184 | /// \param cq Completion Queue virtual base |
| 185 | /// \param sq Submission Queue virtual base |
| 186 | /// \param sz Queue size in bytes |
| 187 | /////////////////////////////// |
| 188 | NVMeQueue(uint16_t qid, uintptr_t cqBase, uintptr_t sqBase, void* cq, void* sq, uint32_t* cqDB, uint32_t* sqDB, uint16_t csz, uint16_t ssz); |
| 189 | NVMeQueue() = default; |
| 190 | |
| 191 | long Consume(NVMeCommand& cmd); |
| 192 | |
| 193 | void Submit(NVMeCommand& cmd); |
| 194 | void SubmitWait(NVMeCommand& cmd, NVMeCompletion& complet); |
| 195 | |
| 196 | __attribute__((always_inline)) uint16_t CQSize() { return cqCount; } |
| 197 | __attribute__((always_inline)) uint16_t SQSize() { return sqCount; } |
| 198 | __attribute__((always_inline)) uintptr_t CQBase() { return completionBase; } |
| 199 | __attribute__((always_inline)) uintptr_t SQBase() { return submissionBase; } |
| 200 | }; |
| 201 | |
| 202 | class Controller{ |
| 203 | public: |