| // 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.ramdisk; |
| |
| using zx; |
| |
| /// Identifies if requests which are sent ot the ramdisk while it is |
| /// considered "asleep" should be processed when the ramdisk wakes up. |
| /// If this flag is not set, those requests are failed immediately. |
| const uint32 RAMDISK_FLAG_RESUME_ON_WAKE = 0x00000001; |
| |
| // If set, blocks written after the last flush are filled with an |
| // indeterminate value when waking after sleeping. |
| const uint32 RAMDISK_FLAG_DISCARD_NOT_FLUSHED_ON_WAKE = 0x00000002; |
| |
| // If set, blocks written after the last flush are filled at random |
| // rather than all blocks. This can be used to simulate out-of-order |
| // writes. |
| const uint32 RAMDISK_FLAG_DISCARD_RANDOM = 0x00000004; |
| |
| /// Counters for the number of write requests since the last call to either |
| /// "SleepAfter" or "Wake". All units are in individual blocks. |
| [ForDeprecatedCBindings] |
| struct BlockWriteCounts { |
| uint64 received; |
| uint64 successful; |
| uint64 failed; |
| }; |
| |
| /// The protocol for interacting with a instance of a ramdisk. |
| [ForDeprecatedCBindings] |
| protocol Ramdisk { |
| /// Sets any of the `RAMDISK_FLAG_*` flags. |
| SetFlags(uint32 flags) -> (zx.status s); |
| |
| /// Wakes a ramdisk, if it was sleeping. |
| /// |
| /// Resets the block counts being stored by the ramdisk. |
| Wake() -> (zx.status s); |
| |
| /// Causes the ramdisk to sleep after `count` blocks are written successfully. |
| /// After `count` blocks are written, requests either wait for the ramdisk to |
| /// be awoken (if RESUME_ON_WAKE has been set), or begin failing immediately. |
| /// |
| /// Resets the block counts being stored by the ramdisk. |
| SleepAfter(uint64 count) -> (zx.status s); |
| |
| /// Returns the number of write requests since the last call to either |
| /// "SleepAfter" or "Wake". |
| GetBlockCounts() -> (zx.status s, BlockWriteCounts? counts); |
| |
| /// Causes the ramdisk size to grow to `required_size` in bytes. |
| /// If `required_size` is smaller than the current size an error will be |
| /// returned. `required_size` must be a multiple of `block_size`. |
| Grow(uint64 new_size) -> (zx.status s); |
| }; |
| |
| // TODO(smklein): Deduplicate GUID declarations with other FIDL interfaces. |
| |
| /// Matches the value of ZBI_PARTITION_GUID_LEN. |
| const uint32 GUID_LEN = 16; |
| |
| /// An array of bytes interpreted as a GUID. Wrapped in a struct to |
| /// allow optional GUIDs. |
| [ForDeprecatedCBindings] |
| struct GUID { |
| array<uint8>:GUID_LEN value; |
| }; |
| |
| const uint32 MAX_NAME_LENGTH = 32; |
| |
| [ForDeprecatedCBindings] |
| protocol RamdiskController { |
| /// Initializes a new Ramdisk instance with the provided block size and block count. |
| /// Takes an optional `type_guid`, which may be queried from the ramdisk instance. |
| Create(uint64 block_size, uint64 block_count, GUID? type_guid) -> (zx.status s, string:MAX_NAME_LENGTH? name); |
| |
| /// Initializes a new Ramdisk instance from a VMO. Uses a block size of `PAGE_SIZE`, |
| /// and derives the block count from the size of the VMO. |
| CreateFromVmo(zx.handle:VMO vmo) -> (zx.status s, string:MAX_NAME_LENGTH? name); |
| |
| // Same as previous, but with the given block size. |
| CreateFromVmoWithBlockSize(zx.handle:VMO vmo, uint64 block_size) -> (zx.status s, string:MAX_NAME_LENGTH? name); |
| }; |