Serenity Operating System
at master 42 lines 1.9 kB view raw
1/* 2 * Copyright (c) 2021, Pankaj R <pankydev8@gmail.com> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <AK/NonnullOwnPtr.h> 8#include <Kernel/Devices/DeviceManagement.h> 9#include <Kernel/Storage/NVMe/NVMeController.h> 10#include <Kernel/Storage/NVMe/NVMeNameSpace.h> 11#include <Kernel/Storage/StorageManagement.h> 12 13namespace Kernel { 14 15UNMAP_AFTER_INIT ErrorOr<NonnullLockRefPtr<NVMeNameSpace>> NVMeNameSpace::try_create(NVMeController const& controller, Vector<NonnullLockRefPtr<NVMeQueue>> queues, u16 nsid, size_t storage_size, size_t lba_size) 16{ 17 auto device = TRY(DeviceManagement::try_create_device<NVMeNameSpace>(StorageDevice::LUNAddress { controller.controller_id(), nsid, 0 }, controller.hardware_relative_controller_id(), move(queues), storage_size, lba_size, nsid)); 18 return device; 19} 20 21UNMAP_AFTER_INIT NVMeNameSpace::NVMeNameSpace(LUNAddress logical_unit_number_address, u32 hardware_relative_controller_id, Vector<NonnullLockRefPtr<NVMeQueue>> queues, size_t max_addresable_block, size_t lba_size, u16 nsid) 22 : StorageDevice(logical_unit_number_address, hardware_relative_controller_id, lba_size, max_addresable_block) 23 , m_nsid(nsid) 24 , m_queues(move(queues)) 25{ 26} 27 28void NVMeNameSpace::start_request(AsyncBlockDeviceRequest& request) 29{ 30 auto index = Processor::current_id(); 31 auto& queue = m_queues.at(index); 32 // TODO: For now we support only IO transfers of size PAGE_SIZE (Going along with the current constraint in the block layer) 33 // Eventually remove this constraint by using the PRP2 field in the submission struct and remove block layer constraint for NVMe driver. 34 VERIFY(request.block_count() <= (PAGE_SIZE / block_size())); 35 36 if (request.request_type() == AsyncBlockDeviceRequest::Read) { 37 queue->read(request, m_nsid, request.block_index(), request.block_count()); 38 } else { 39 queue->write(request, m_nsid, request.block_index(), request.block_count()); 40 } 41} 42}