blob: 36df8eaad145703a0b7d896b9566807eba7db5c6 [file] [log] [blame]
// 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 DDK_MMIO_BUFFER_H_
#define DDK_MMIO_BUFFER_H_
#include <zircon/types.h>
__BEGIN_CDECLS
typedef struct {
// |vaddr| points to the content starting at |offset| in |vmo|.
void* vaddr;
zx_off_t offset;
size_t size;
zx_handle_t vmo;
} mmio_buffer_t;
typedef struct {
const mmio_buffer_t* mmio;
zx_handle_t pmt;
// |paddr| points to the content starting at |mmio->offset| in |mmio->vmo|.
zx_paddr_t paddr;
} mmio_pinned_buffer_t;
// Takes raw mmio resources, and maps it into address space. |offset| is the
// offset from the beginning of |vmo| where the mmio region begins. |size|
// specifies the size of the mmio region. |offset| + |size| must be less than
// or equal to the size of |vmo|.
// Always consumes |vmo|, including in error cases.
zx_status_t mmio_buffer_init(mmio_buffer_t* buffer, zx_off_t offset, size_t size,
zx_handle_t vmo, uint32_t cache_policy);
// Takes a physical region, and maps it into address space. |base| and |size|
// must be page aligned.
// Callee retains ownership of |resource|.
zx_status_t mmio_buffer_init_physical(mmio_buffer_t* buffer, zx_paddr_t base, size_t size,
zx_handle_t resource, uint32_t cache_policy);
// Unmaps the mmio region.
void mmio_buffer_release(mmio_buffer_t* buffer);
// Returns a pinned buffer if successful. |buffer| must outlive |out|.
//
// Example usage: A device needs access to another device's MMIO space.
zx_status_t mmio_buffer_pin(mmio_buffer_t* buffer, zx_handle_t bti, mmio_pinned_buffer_t* out);
// Unpins the buffer.
void mmio_buffer_unpin(mmio_pinned_buffer_t* buffer);
__END_CDECLS
#endif // DDK_MMIO_BUFFER_H_