Serenity Operating System
at master 30 lines 1.3 kB view raw
1/* 2 * Copyright (c) 2021, the SerenityOS developers. 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <Kernel/Memory/ScatterGatherList.h> 8 9namespace Kernel::Memory { 10 11LockRefPtr<ScatterGatherList> ScatterGatherList::try_create(AsyncBlockDeviceRequest& request, Span<NonnullRefPtr<PhysicalPage>> allocated_pages, size_t device_block_size) 12{ 13 auto maybe_vm_object = AnonymousVMObject::try_create_with_physical_pages(allocated_pages); 14 if (maybe_vm_object.is_error()) { 15 // FIXME: Would be nice to be able to return a ErrorOr here. 16 return {}; 17 } 18 return adopt_lock_ref_if_nonnull(new (nothrow) ScatterGatherList(maybe_vm_object.release_value(), request, device_block_size)); 19} 20 21ScatterGatherList::ScatterGatherList(NonnullLockRefPtr<AnonymousVMObject> vm_object, AsyncBlockDeviceRequest& request, size_t device_block_size) 22 : m_vm_object(move(vm_object)) 23{ 24 auto region_or_error = MM.allocate_kernel_region_with_vmobject(m_vm_object, page_round_up((request.block_count() * device_block_size)).release_value_but_fixme_should_propagate_errors(), "AHCI Scattered DMA"sv, Region::Access::Read | Region::Access::Write, Region::Cacheable::Yes); 25 if (region_or_error.is_error()) 26 TODO(); 27 m_dma_region = region_or_error.release_value(); 28} 29 30}