diff --git a/drivers/nvme/nvme.asm b/drivers/nvme/nvme.asm index 1704e9b..2d56eda 100644 --- a/drivers/nvme/nvme.asm +++ b/drivers/nvme/nvme.asm @@ -444,8 +444,8 @@ proc get_log_page stdcall, pci:dword, dptr:dword, lid:byte endp -; See page 269-271 of the NVMe 1.4 specification for reference -proc nvme_write stdcall, pci:dword, qid:word, nsid:dword, dptr:dword, slba_lo:dword, slba_hi:dword, nlb:word +; See page 258-261 (read) and 269-271 (write) of the NVMe 1.4 specification for reference +proc nvme_io_rw stdcall, pci:dword, qid:word, nsid:dword, dptr:dword, slba_lo:dword, slba_hi:dword, nlb:word, opcode:dword ; TODO: Use IDENTC.NOIOB to construct read/write commands that don't ; cross the I/O boundary to achieve optimal performance @@ -454,7 +454,7 @@ proc nvme_write stdcall, pci:dword, qid:word, nsid:dword, dptr:dword, slba_lo:dw sub esp, sizeof.SQ_ENTRY stdcall memset, esp, 0, sizeof.SQ_ENTRY movzx ecx, [qid] - stdcall set_cdw0, [pci], ecx, NVM_CMD_WRITE + stdcall set_cdw0, [pci], ecx, [opcode] mov dword [esp + SQ_ENTRY.cdw0], eax ; CDW0 mov eax, [dptr] mov dword [esp + SQ_ENTRY.dptr], eax @@ -462,7 +462,7 @@ proc nvme_write stdcall, pci:dword, qid:word, nsid:dword, dptr:dword, slba_lo:dw mov dword [esp + SQ_ENTRY.nsid], eax mov eax, [slba_lo] mov dword [esp + SQ_ENTRY.cdw10], eax - mov eax, [slba_hi] ; SLBA + 32 (fix later) + mov eax, [slba_hi] mov dword [esp + SQ_ENTRY.cdw11], eax movzx eax, [nlb] mov word [esp + SQ_ENTRY.cdw12], ax @@ -473,7 +473,6 @@ proc nvme_write stdcall, pci:dword, qid:word, nsid:dword, dptr:dword, slba_lo:dw endp - proc detect_nvme invoke GetPCIList @@ -825,8 +824,11 @@ proc nvme_init stdcall, pci:dword invoke KernelAlloc, 0x1000 test eax, eax jz .exit_fail + mov edi, eax + ;stdcall memcpy, eax, test_string, 50 invoke GetPhysAddr - stdcall nvme_write, [pci], 1, [esi + pcidev.nsid], eax, 0, 0, 1 + stdcall nvme_io_rw, [pci], 1, [esi + pcidev.nsid], eax, 0, 0, 1, NVM_CMD_READ + DEBUGF DBG_INFO, "%s\n", edi DEBUGF DBG_INFO, "nvme%u: Successfully initialized driver\n", [esi + pcidev.num] xor eax, eax inc eax