diff --git a/Kernel/Devices/Storage/NVMe/NVMeController.cpp b/Kernel/Devices/Storage/NVMe/NVMeController.cpp index 0511c1f79a3..32c0c6f08d7 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeController.cpp +++ b/Kernel/Devices/Storage/NVMe/NVMeController.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -41,13 +42,13 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::initialize(bool is_queue_polled) PCI::enable_memory_space(device_identifier()); PCI::enable_bus_mastering(device_identifier()); - m_bar = PCI::get_BAR0(device_identifier()) & PCI::bar_address_mask; + m_bar = TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR0)); static_assert(sizeof(ControllerRegister) == REG_SQ0TDBL_START); static_assert(sizeof(NVMeSubmission) == (1 << SQ_WIDTH)); // Map only until doorbell register for the controller // Queues will individually map the doorbell register respectively - m_controller_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar))); + m_controller_regs = TRY(Memory::map_typed_writable(m_bar)); auto caps = m_controller_regs->cap; m_ready_timeout = Duration::from_milliseconds((CAP_TO(caps) + 1) * 500); // CAP.TO is in 500ms units @@ -340,7 +341,7 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::create_admin_queue(QueueType queu auto buffer = TRY(MM.allocate_dma_buffer_pages(sq_size, "Admin SQ queue"sv, Memory::Region::Access::ReadWrite, sq_dma_pages)); sq_dma_region = move(buffer); } - auto doorbell_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar + REG_SQ0TDBL_START))); + auto doorbell_regs = TRY(Memory::map_typed_writable(m_bar.offset(REG_SQ0TDBL_START))); Doorbell doorbell = { .mmio_reg = move(doorbell_regs), .dbbuf_shadow = {}, @@ -415,7 +416,7 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::create_io_queue(u8 qid, QueueType } auto queue_doorbell_offset = (2 * qid) * (4 << m_dbl_stride); - auto doorbell_regs = TRY(Memory::map_typed_writable(PhysicalAddress(m_bar + REG_SQ0TDBL_START + queue_doorbell_offset))); + auto doorbell_regs = TRY(Memory::map_typed_writable(m_bar.offset(REG_SQ0TDBL_START + queue_doorbell_offset))); Memory::TypedMapping shadow_doorbell_regs {}; Memory::TypedMapping eventidx_doorbell_regs {}; diff --git a/Kernel/Devices/Storage/NVMe/NVMeController.h b/Kernel/Devices/Storage/NVMe/NVMeController.h index 5c209e22cf3..f3c2f96c251 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeController.h +++ b/Kernel/Devices/Storage/NVMe/NVMeController.h @@ -78,7 +78,7 @@ private: bool m_admin_queue_ready { false }; size_t m_device_count { 0 }; AK::Duration m_ready_timeout; - u32 m_bar { 0 }; + PhysicalAddress m_bar { 0 }; u8 m_dbl_stride { 0 }; PCI::InterruptType m_irq_type; QueueType m_queue_type { QueueType::IRQ };