// Copyright 2017 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. #pragma once #include #include #include #include #include #include #include namespace i915 { class Controller; class Gtt; class GttRegion { public: explicit GttRegion(Gtt* gtt); ~GttRegion(); void SetRotation(uint32_t rotation, const image_t& image); zx_status_t PopulateRegion(zx_handle_t vmo, uint64_t page_offset, uint64_t length, bool writable = false); void ClearRegion(bool close_vmo); uint64_t base() const { return region_->base; } uint64_t size() const { return region_->size; } private: fbl::unique_ptr region_; Gtt* gtt_; fbl::Vector pmts_; uint32_t mapped_end_ = 0; // The region's current vmo. The region does not own the vmo handle; it // is up to the owner of the region to determine when the vmo should be // closed. zx_handle_t vmo_ = ZX_HANDLE_INVALID; bool is_rotated_; friend class Gtt; }; class Gtt { public: Gtt(); ~Gtt(); zx_status_t Init(Controller* controller); zx_status_t AllocRegion(uint32_t length, uint32_t align_pow2, fbl::unique_ptr* region_out); void SetupForMexec(uintptr_t stolen_fb, uint32_t length); uint64_t size() const { return gfx_mem_size_; } private: Controller* controller_; uint64_t gfx_mem_size_; RegionAllocator region_allocator_; zx::vmo scratch_buffer_; zx::bti bti_; zx::pmt scratch_buffer_pmt_; zx_paddr_t scratch_buffer_paddr_ = 0; uint64_t min_contiguity_; friend class GttRegion; DISALLOW_COPY_ASSIGN_AND_MOVE(Gtt); }; } // namespace i915