// 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 = 0xFF000001;

/// 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);
};
