blob: e90312b4eed5147da61f4789144e9cf8eed6f98f [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 <zircon/device/block.h>
__BEGIN_CDECLS;
typedef struct block_callbacks {
void (*complete)(void* cookie, zx_status_t status);
} block_callbacks_t;
typedef struct block_protocol_ops {
void (*set_callbacks)(void* ctx, block_callbacks_t* cb);
void (*get_info)(void* ctx, block_info_t* info);
void (*read)(void* ctx, zx_handle_t vmo, uint64_t length, uint64_t vmo_offset,
uint64_t dev_offset, void* cookie);
void (*write)(void* ctx, zx_handle_t vmo, uint64_t length, uint64_t vmo_offset,
uint64_t dev_offset, void* cookie);
} block_protocol_ops_t;
typedef struct {
block_protocol_ops_t* ops;
void* ctx;
} block_protocol_t;
// Identify how the block device can propagate certain information, such as
// "operation completed".
static inline void block_set_callbacks(block_protocol_t* block, block_callbacks_t* cb) {
block->ops->set_callbacks(block->ctx, cb);
}
// Get information about the underlying block device
static inline void block_get_info(block_protocol_t* block, block_info_t* info) {
block->ops->get_info(block->ctx, info);
}
// Read to the VMO from the block device
static inline void block_read(block_protocol_t* block, zx_handle_t vmo, uint64_t length,
uint64_t vmo_offset, uint64_t dev_offset, void* cookie) {
block->ops->read(block->ctx, vmo, length, vmo_offset, dev_offset, cookie);
}
// Write from the VMO to the block device
static inline void block_write(block_protocol_t* block, zx_handle_t vmo, uint64_t length,
uint64_t vmo_offset, uint64_t dev_offset, void* cookie) {
block->ops->write(block->ctx, vmo, length, vmo_offset, dev_offset, cookie);
}
__END_CDECLS;