diff --git a/drivers/nvme/nvme.asm b/drivers/nvme/nvme.asm index 2491a77..ef05e7e 100644 --- a/drivers/nvme/nvme.asm +++ b/drivers/nvme/nvme.asm @@ -196,12 +196,14 @@ endp proc device_is_compat stdcall, pci:dword - push esi + push esi edx ecx mov esi, [pci] invoke PciRead32, dword [esi + pcidev.bus], dword [esi + pcidev.devfn], PCI_header00.base_addr_0 and eax, 0xfffffff0 test eax, eax jz .failure + mov edx, eax + push edx invoke MapIoMem, eax, sizeof.NVME_MMIO, PG_SW+PG_NOCACHE test eax, eax @@ -214,21 +216,32 @@ proc device_is_compat stdcall, pci:dword ; Stride is (2 ^ (2 + DSTRD)) bytes add eax, 2 stdcall pow2, eax + mov ecx, eax mov dword [esi + pcidev.dstrd], eax - ; TODO: Remap I/O with new size + ; 1003h + ((2y + 1) * (4 << CAP.DSTRD)) + mov eax, 4 + shl ax, cl + mov ecx, NVM_ASQS + shl ecx, 1 + inc ecx + imul ecx, eax + add ecx, 0x1003 - mov esi, dword [esi + pcidev.mmio_ptr] - mov eax, dword [esi + NVME_MMIO.VS] + ;invoke FreePage, dword [esi + pcidev.mmio_ptr] + pop edx + invoke MapIoMem, edx, ecx, PG_SW+PG_NOCACHE + mov dword [esi + pcidev.mmio_ptr], eax + mov eax, dword [eax + NVME_MMIO.VS] DEBUGF DBG_INFO, "(NVMe) Controller version: 0x%x\n", eax - pop esi + pop ecx edx esi xor eax, eax inc eax ret .failure: PDEBUGF DBG_INFO, "PCI(%u.%u.%u): something went wrong checking NVMe device compatibility\n", byte [esi + pcidev.bus], byte [esi + pcidev.devfn] - pop esi + pop ecx edx esi xor eax, eax ret @@ -384,18 +397,19 @@ proc cq0thbl_write stdcall, dstrd:dword endp ; Calculates 2^x -proc pow2 stdcall, x:dword +proc pow2 stdcall, x:byte push ecx - mov ecx, [x] + mov cl, [x] xor eax, eax inc eax - test ecx, ecx + test cl, cl jnz @f + pop ecx ret @@: - shl eax, ecx + shl eax, cl pop ecx ret