private unsafe int Identify(int nsID, int cns, void *adr) { NVMe_Identify_Cmd *item = (NVMe_Identify_Cmd *)Heap.Alloc(sizeof(NVMe_Identify_Cmd)); Memory.Memclear(item, sizeof(NVMe_Identify_Cmd)); item->Opcode = ADMIN_OPCODE_IDENTIFY; item->NSID = (uint)nsID; item->PRP1 = (ulong)Paging.GetPhysicalFromVirtual(adr); item->CNS = (uint)cns; int cid = SubmitCMD(mAdminQueue, (NVMe_Submission_Item *)item); Heap.Free(item); NVMe_Completion_Item *compItem = PollAndWait(mAdminQueue, cid); return(compItem->Status); }
private int CreateCompletionQueue(NVMe_Queue queue) { NVMe_Create_Cq_Cmd *item = (NVMe_Create_Cq_Cmd *)Heap.Alloc(sizeof(NVMe_Create_Cq_Cmd)); Memory.Memclear(item, sizeof(NVMe_Create_Cq_Cmd)); item->Opcode = ADMIN_OPCODE_CREATE_CQ; item->PRP1 = (uint)Paging.GetPhysicalFromVirtual(queue.CompletionQueue); item->CqID = (ushort)queue.SQID; item->CqSize = (ushort)(mQueueSize - 1); item->CqFlags = (ushort)(QUEUE_PHYS_CONFIG | SQ_PRIO_MEDIUM); int cid = SubmitCMD(mAdminQueue, (NVMe_Submission_Item *)item); Heap.Free(item); NVMe_Completion_Item *compItem = PollAndWait(mAdminQueue, cid); return(compItem->Status); }
/// <summary> /// Read write operation /// </summary> /// <param name="op"></param> /// <param name="buffer"></param> /// <param name="size"></param> /// <returns></returns> public int RWOperation(NVMe_RW_OP op, byte *buffer, uint lba, uint blocks) { void *adr = Heap.Alloc(0x1000); NVMe_Rw_Cmd *item = (NVMe_Rw_Cmd *)Heap.Alloc(sizeof(NVMe_Rw_Cmd)); Memory.Memclear(item, sizeof(NVMe_Rw_Cmd)); item->Opcode = (op == NVMe_RW_OP.WRITE) ? IO_OPCODE_WRITE: IO_OPCODE_READ; item->NSId = 1; item->Slba = lba; item->Nlb = (ushort)(blocks - 1); item->Prp1 = (uint)Paging.GetPhysicalFromVirtual(adr); int cid = SubmitCMD(mIOQueue, (NVMe_Submission_Item *)item); NVMe_Completion_Item *compItem = PollAndWait(mIOQueue, cid); int statusCode = (compItem->Status >> COMP_STATUS_SC_SHIFT) & COMP_STATUS_SC_MASK; if (statusCode != COMP_STATUS_SC_SUC) { Heap.Free(adr); return(0); } Memory.Memcpy(buffer, adr, (int)blocks * 512); Heap.Free(item); Heap.Free(adr); return((int)blocks * 512); }