| // 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. |
| |
| #pragma once |
| |
| #include <ddk/debug.h> |
| #include <fbl/ref_ptr.h> |
| #include <fbl/unique_ptr.h> |
| #include <lib/fzl/vmo-mapper.h> |
| #include <lib/zx/bti.h> |
| #include <lib/zx/pmt.h> |
| #include <lib/zx/vmo.h> |
| #include <zircon/compiler.h> |
| |
| #include <zircon/types.h> |
| |
| class PinnedBuffer : public fbl::RefCounted<PinnedBuffer> { |
| |
| public: |
| static fbl::RefPtr<PinnedBuffer> Create(size_t size, const zx::bti& bti, |
| uint32_t cache_policy); |
| zx_status_t LookupPhys(zx_off_t offset, zx_paddr_t* out); |
| |
| void* GetBaseAddress() { return vmo_mapper_.start(); } |
| size_t GetSize() { return vmo_mapper_.size(); } |
| zx_status_t UnPin(); |
| |
| private: |
| PinnedBuffer() = default; |
| //Note - not using zx:bti since this bti may be used for multiple |
| |
| fzl::VmoMapper vmo_mapper_; |
| zx::vmo vmo_; |
| zx::pmt pmt_; |
| |
| fbl::unique_ptr<zx_paddr_t[]> paddrs_; |
| }; |