// 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 fuchsia.nand;
using fuchsia.hardware.nand;
using zx;

// Defines a Read/Write/Erase request to be sent to the nand driver.
[ForDeprecatedCBindings]
resource struct BrokerRequest {
    zx.handle:VMO? vmo; // Only used for read and write.
    uint32 length; // In pages (read / write) or blocks (erase).
    uint32 offset_nand; // In pages (read / write) or blocks (erase).
    uint64 offset_data_vmo; // In pages.
    uint64 offset_oob_vmo; // In pages.
    bool data_vmo; // True to read or write data.
    bool oob_vmo; // True to read or write OOB data.
};

/// The Broker allows for serialized entry to the raw nand, which ensures only a single client is
/// ever talking to the nand device, and all higher level clients have disconnected. In addition,
/// access to raw nand is restricted from the system during production where nand-broker is not
/// present.
[ForDeprecatedCBindings]
protocol Broker {
    // Retrieves the nand info from the underlying device.
    GetInfo() -> (zx.status status, fuchsia.hardware.nand.Info? info);

    // Reads from the nand device.
    Read(BrokerRequest request) -> (zx.status status, uint32 corrected_bit_flips);

    // Writes to the nand device.
    Write(BrokerRequest request) -> (zx.status status);

    // Erases part of the nand device.
    Erase(BrokerRequest request) -> (zx.status status);
};
