// 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 RAMDISK_FLAG_RESUME_ON_WAKE uint32 = 0x00000001;

// If set, blocks written after the last flush are filled with an
// indeterminate value when waking after sleeping.
const RAMDISK_FLAG_DISCARD_NOT_FLUSHED_ON_WAKE uint32 = 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 RAMDISK_FLAG_DISCARD_RANDOM uint32 = 0x00000004;

/// Counters for the number of write requests since the last call to either
/// "SleepAfter" or "Wake". All units are in individual blocks.
@for_deprecated_c_bindings
type BlockWriteCounts = struct {
    received uint64;
    successful uint64;
    failed uint64;
};

/// The protocol for interacting with a instance of a ramdisk.
@for_deprecated_c_bindings
protocol Ramdisk {
    /// Sets any of the `RAMDISK_FLAG_*` flags.
    SetFlags(struct {
        flags uint32;
    }) -> (struct {
        s zx.status;
    });

    /// Wakes a ramdisk, if it was sleeping.
    ///
    /// Resets the block counts being stored by the ramdisk.
    Wake() -> (struct {
        s zx.status;
    });

    /// 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(struct {
        count uint64;
    }) -> (struct {
        s zx.status;
    });

    /// Returns the number of write requests since the last call to either
    /// "SleepAfter" or "Wake".
    GetBlockCounts() -> (struct {
        s zx.status;
        counts box<BlockWriteCounts>;
    });

    /// 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(struct {
        new_size uint64;
    }) -> (struct {
        s zx.status;
    });
};

// TODO(smklein): Deduplicate GUID declarations with other FIDL interfaces.

/// Matches the value of ZBI_PARTITION_GUID_LEN.
const GUID_LEN uint32 = 16;

/// An array of bytes interpreted as a GUID. Wrapped in a struct to
/// allow optional GUIDs.
@for_deprecated_c_bindings
type GUID = struct {
    value array<uint8, GUID_LEN>;
};

const MAX_NAME_LENGTH uint32 = 32;

@for_deprecated_c_bindings
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(struct {
        block_size uint64;
        block_count uint64;
        type_guid box<GUID>;
    }) -> (struct {
        s zx.status;
        name string:<MAX_NAME_LENGTH, optional>;
    });

    /// 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(resource struct {
        vmo zx.handle:VMO;
    }) -> (struct {
        s zx.status;
        name string:<MAX_NAME_LENGTH, optional>;
    });

    // Same as previous, but with the given block size.
    CreateFromVmoWithBlockSize(resource struct {
        vmo zx.handle:VMO;
        block_size uint64;
    }) -> (struct {
        s zx.status;
        name string:<MAX_NAME_LENGTH, optional>;
    });
};
