| // Copyright 2018 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 ADDRESS_SPACE_BASE_H_ |
| #define ADDRESS_SPACE_BASE_H_ |
| |
| #include "gpu_mapping.h" |
| #include <map> |
| #include <unordered_map> |
| |
| class AddressSpaceBase { |
| public: |
| using gpu_addr_t = uint32_t; |
| static_assert(sizeof(GpuMapping::gpu_addr_t) == sizeof(gpu_addr_t), "size mismatch"); |
| |
| virtual ~AddressSpaceBase() {} |
| |
| virtual bool Insert(gpu_addr_t addr, magma::PlatformBusMapper::BusMapping* bus_mapping, |
| uint64_t page_count) = 0; |
| virtual bool Clear(gpu_addr_t addr, uint64_t page_count) = 0; |
| |
| bool AddMapping(std::unique_ptr<GpuMapping> gpu_mapping); |
| bool RemoveMapping(magma::PlatformBuffer* buffer, gpu_addr_t gpu_addr); |
| |
| void ReleaseBuffer(magma::PlatformBuffer* buffer, uint32_t* released_count_out); |
| |
| private: |
| using map_container_t = std::map<gpu_addr_t, std::shared_ptr<GpuMapping>>; |
| // Container of gpu mappings by address |
| map_container_t mappings_; |
| // Container of references to entries in mappings_ by buffer; |
| // useful for cleaning up mappings when connections go away, and when |
| // buffers are released. |
| std::unordered_multimap<magma::PlatformBuffer*, map_container_t::iterator> mappings_by_buffer_; |
| |
| friend class TestAddressSpaceBase; |
| }; |
| |
| #endif // ADDRESS_SPACE_BASE_H_ |