blob: 76f1afedce228bdf3b2ce8695459890b0abb41ce [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.
library ddk.protocol.block;
using zircon.device.block;
using zx;
/// `BLOCK_OP_READ`, `BLOCK_OP_WRITE`
struct BlockReadWrite {
/// Command and flags.
uint32 command;
/// Available for temporary use.
uint32 extra;
/// VMO of data to read or write.
handle<vmo> vmo;
/// Transfer length in blocks (0 is invalid).
uint32 length;
/// Device offset in blocks.
uint64 offset_dev;
/// VMO offset in blocks.
uint64 offset_vmo;
};
/// `BLOCK_OP_TRIM`
struct BlockTrim {
/// Command and flags.
uint32 command;
/// Transfer length in blocks (0 is invalid).
uint32 length;
/// Device offset in blocks.
uint64 offset_dev;
};
union BlockOp {
/// All Commands
uint32 command;
/// Read and Write ops use rw for parameters.
BlockReadWrite rw;
BlockTrim trim;
};
/// Performs a regular data read or write from the device. The operation may
/// be cached internally.
const uint32 BLOCK_OP_READ = 0x00000001;
const uint32 BLOCK_OP_WRITE = 0x00000002;
/// Write any controller or device cached data to nonvolatile storage.
/// This operation always implies BARRIER_BEFORE and BARRIER_AFTER,
/// meaning that previous operations will complete before it starts
/// and later operations will not start until it is done.
const uint32 BLOCK_OP_FLUSH = 0x00000003;
/// Instructs the device to invalidate a number of blocks, making them usable
/// for storing something else. This is basically a "delete" optimization,
/// where the device is in charge of discarding the old content without
/// clients having to write a given pattern. The operation may be cached
/// internally.
const uint32 BLOCK_OP_TRIM = 0x00000004;
const uint32 BLOCK_OP_MASK = 0x000000FF;
/// Mark this operation as "Force Unit Access" (FUA), indicating that
/// it should not complete until the data is written to the non-volatile
/// medium (write), and that reads should bypass any on-device caches.
const uint32 BLOCK_FL_FORCE_ACCESS = 0x00001000;
/// Require that this operation will not begin until all previous
/// operations have completed.
///
/// Prevents earlier operations from being reordered after this one.
const uint32 BLOCK_FL_BARRIER_BEFORE = 0x00000100;
/// Require that this operation complete before any subsequent
/// operations are started.
///
/// Prevents later operations from being reordered before this one.
const uint32 BLOCK_FL_BARRIER_AFTER = 0x00000200;
[Layout = "ddk-protocol"]
protocol BlockImpl {
/// Obtains the parameters of the block device (block_info_t) and
/// the required size of block_txn_t. The block_txn_t's submitted
/// via queue() must have block_op_size_out - sizeof(block_op_t) bytes
/// available at the end of the structure for the use of the driver.
Query() -> (zircon.device.block.BlockInfo info, usize block_op_size);
/// Submits an IO request for processing. Ownership of |op| is transferred to
/// callee until |completion_cb| is invoked|. Success or failure will
/// be reported via the |completion_cb|. This / callback may be called
/// before the queue() method returns.
[Async]
Queue(BlockOp? txn) -> (zx.status status, BlockOp? op);
};
[Layout = "ddk-protocol"]
protocol Block {
/// Obtains the parameters of the block device (block_info_t) and
/// the required size of block_txn_t. The block_txn_t's submitted
/// via queue() must have block_op_size_out - sizeof(block_op_t) bytes
/// available at the end of the structure for the use of the driver.
Query() -> (zircon.device.block.BlockInfo info, usize block_op_size);
/// Submits an IO request for processing. Ownership of |op| is transferred to
/// callee until |completion_cb| is invoked|. Success or failure will
/// be reported via the |completion_cb|. This / callback may be called
/// before the queue() method returns.
[Async]
Queue(BlockOp? txn) -> (zx.status status, BlockOp? op);
};