blob: b53a85c400f9a400b141e38541ff84c947076426 [file] [log] [blame]
// Copyright 2016 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 <zircon/compiler.h>
#include <zircon/types.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
__BEGIN_CDECLS;
typedef struct {
zx_handle_t vmo_handle;
size_t size;
zx_off_t offset;
void* virt;
zx_paddr_t phys;
} io_buffer_t;
enum {
IO_BUFFER_RO = ZX_VM_FLAG_PERM_READ,
IO_BUFFER_RW = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE,
};
// Initializes a new io_buffer
zx_status_t io_buffer_init(io_buffer_t* buffer, size_t size, uint32_t flags);
zx_status_t io_buffer_init_aligned(io_buffer_t* buffer, size_t size, uint32_t alignment_log2, uint32_t flags);
// Initializes an io_buffer base on an existing VMO.
// duplicates the provided vmo_handle - does not take ownership
zx_status_t io_buffer_init_vmo(io_buffer_t* buffer, zx_handle_t vmo_handle,
zx_off_t offset, uint32_t flags);
// Initializes an io_buffer that maps a given physical address
zx_status_t io_buffer_init_physical(io_buffer_t* buffer, zx_paddr_t addr, size_t size,
zx_handle_t resource, uint32_t cache_policy);
zx_status_t io_buffer_cache_op(io_buffer_t* buffer, const uint32_t op,
const zx_off_t offset, const size_t size);
// Releases an io_buffer
void io_buffer_release(io_buffer_t* buffer);
static inline bool io_buffer_is_valid(io_buffer_t* buffer) {
return (buffer->vmo_handle != ZX_HANDLE_INVALID);
}
static inline void* io_buffer_virt(io_buffer_t* buffer) {
return (void*)(((uintptr_t)buffer->virt) + buffer->offset);
}
static inline zx_paddr_t io_buffer_phys(io_buffer_t* buffer) {
return buffer->phys + buffer->offset;
}
__END_CDECLS;