blob: c1a5b66c7964a8729c9f33427ae2ab3bdcf7b0d7 [file] [log] [blame]
// Copyright 2019 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 fuchsia.hardware.block;
using zx;
// All writes to the block device will fail.
const uint32 FLAG_READONLY = 0x00000001;
// The block device may be removed from the device during operation.
const uint32 FLAG_REMOVABLE = 0x00000002;
// The device has a bootdata partition map.
const uint32 FLAG_BOOTPART = 0x00000004;
// The maximum value for a transfer size, identifying that there
// effectively exists no maximum for a single operation.
const uint32 MAX_TRANSFER_UNBOUNDED = 0xFFFFFFFF;
// Describes metatadata about a block device.
struct BlockInfo {
// The number of blocks in this block device.
uint64 block_count;
// The size of a single block.
uint32 block_size;
// The maximum size, in bytes, of a transfer.
// Set to MAX_TRANSFER_UNBOUNDED if no such maximum exists.
uint32 max_transfer_size;
// Identifiers about the device; refer to the "FLAG_*" documentation above.
uint32 flags;
uint32 reserved;
};
// Describes statistics about the operations on the block device since boot.
struct BlockStats {
// The total number of operations which have been processed.
int64 ops;
// The total number of blocks which have been acted upon.
int64 blocks;
// The total number of requests to read from the device.
int64 reads;
// The total number of blocks which have been read from the device.
int64 blocks_read;
// The total number of requests to write to the device.
int64 writes;
// The total number of blocks which have been written to the device.
int64 blocks_written;
};
// A client-identifier to a VMO.
// This value may be utilized by clients to refer to a VMO which is being held
// by a block device server.
struct VmoID {
uint16 id;
};
// Dummy value reserved for "invalid" VmoID. Will never be allocated by the server,
// and may be utilized as a local value for an unallocated ID.
const uint16 VMOID_INVALID = 0;
// Defines access to a device which is accessible in block-granularity chunks
// for reading and writing.
[Layout = "Simple", FragileBase]
interface Block {
// Get information about the underlying block device.
GetInfo() -> (zx.status status, BlockInfo? info);
// Returns stats about the block device on the provided buffer and optionally
// clears the counters.
GetStats(bool clear) -> (zx.status status, BlockStats? stats);
// Sets up a FIFO-based server on the block device; acquire the handle to it.
GetFifo() -> (zx.status status, handle<fifo> fifo);
// Attaches a VMO to the currently running FIFO server.
AttachVmo(handle<vmo> vmo) -> (zx.status status, VmoID? vmoid);
// Shuts down the fifo server, waiting for it to be ready to be started again.
//
// When this method returns, a client may safely invoke GetFifo to acquire
// a new connection to the block server, without being told that a server
// is already serving requests on a different fifo.
//
// If, instead of invoking "CloseFifo", a client merely closes their fifo,
// the server automatically cleans up all resources anyway. In this case,
// however, the client will have no guarantee that the next invocation of
// "GetFifo" will return a connection successfully.
CloseFifo() -> (zx.status status);
// Rebinds the block device (if supported).
//
// WARNING: This is only added for parity with block device ioctls;
// this is going to move into the device FIDL API.
RebindDevice() -> (zx.status status);
};