| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVICES_SYSMEM_DRIVERS_SYSMEM_CONTIGUOUS_POOLED_MEMORY_ALLOCATOR_H_ |
| #define SRC_DEVICES_SYSMEM_DRIVERS_SYSMEM_CONTIGUOUS_POOLED_MEMORY_ALLOCATOR_H_ |
| |
| #include <lib/zx/bti.h> |
| #include <zircon/limits.h> |
| |
| #include <fbl/vector.h> |
| #include <region-alloc/region-alloc.h> |
| |
| #include "allocator.h" |
| |
| namespace sysmem_driver { |
| |
| class ContiguousPooledMemoryAllocator : public MemoryAllocator { |
| public: |
| ContiguousPooledMemoryAllocator(Owner* parent_device, const char* allocation_name, uint64_t size, |
| bool is_cpu_accessible, bool is_ready); |
| |
| // Default to page alignment. |
| zx_status_t Init(uint32_t alignment_log2 = ZX_PAGE_SHIFT); |
| |
| // TODO(MTWN-329): Use this for VDEC. |
| // |
| // This uses a physical VMO as the parent VMO. |
| zx_status_t InitPhysical(zx_paddr_t paddr); |
| |
| zx_status_t Allocate(uint64_t size, zx::vmo* parent_vmo) override; |
| zx_status_t SetupChildVmo(const zx::vmo& parent_vmo, const zx::vmo& child_vmo) override; |
| void Delete(zx::vmo parent_vmo) override; |
| |
| bool CoherencyDomainIsInaccessible() override { return !is_cpu_accessible_; } |
| |
| zx_status_t GetPhysicalMemoryInfo(uint64_t* base, uint64_t* size) override { |
| *base = start_; |
| *size = size_; |
| return ZX_OK; |
| } |
| |
| void set_ready() override; |
| bool is_ready() override; |
| |
| const zx::vmo& GetPoolVmoForTest() { return contiguous_vmo_; } |
| |
| private: |
| zx_status_t InitCommon(zx::vmo local_contiguous_vmo); |
| void DumpPoolStats(); |
| Owner* const parent_device_{}; |
| const char* const allocation_name_{}; |
| char child_name_[ZX_MAX_NAME_LEN] = {}; |
| zx::vmo contiguous_vmo_; |
| RegionAllocator region_allocator_; |
| // From parent_vmo handle to std::unique_ptr<> |
| std::map<zx_handle_t, RegionAllocator::Region::UPtr> regions_; |
| uint64_t start_{}; |
| uint64_t size_{}; |
| bool is_cpu_accessible_{}; |
| bool is_ready_{}; |
| }; |
| |
| } // namespace sysmem_driver |
| |
| #endif // SRC_DEVICES_SYSMEM_DRIVERS_SYSMEM_CONTIGUOUS_POOLED_MEMORY_ALLOCATOR_H_ |