ScatterGatherList.cpp 1.1 KB

123456789101112131415161718192021222324252627
  1. /*
  2. * Copyright (c) 2021, the SerenityOS developers.
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Kernel/Memory/ScatterGatherList.h>
  7. namespace Kernel::Memory {
  8. RefPtr<ScatterGatherList> ScatterGatherList::try_create(AsyncBlockDeviceRequest& request, Span<NonnullRefPtr<PhysicalPage>> allocated_pages, size_t device_block_size)
  9. {
  10. auto maybe_vm_object = AnonymousVMObject::try_create_with_physical_pages(allocated_pages);
  11. if (maybe_vm_object.is_error()) {
  12. // FIXME: Would be nice to be able to return a KResultOr here.
  13. return {};
  14. }
  15. return adopt_ref_if_nonnull(new (nothrow) ScatterGatherList(maybe_vm_object.release_value(), request, device_block_size));
  16. }
  17. ScatterGatherList::ScatterGatherList(NonnullRefPtr<AnonymousVMObject> vm_object, AsyncBlockDeviceRequest& request, size_t device_block_size)
  18. : m_vm_object(move(vm_object))
  19. {
  20. m_dma_region = MM.allocate_kernel_region_with_vmobject(m_vm_object, page_round_up((request.block_count() * device_block_size)), "AHCI Scattered DMA", Region::Access::Read | Region::Access::Write, Region::Cacheable::Yes);
  21. }
  22. }