Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        /// <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);
        }