// Copyright 2021 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.flashmap;
using fuchsia.mem;
using fuchsia.nand;
using zx;

const MAX_NAME_LEN uint32 = 32;
const MAX_NUM_AREAS uint32 = 255;

/// Flags for an area.
/// https://doc.coreboot.org/lib/flashmap.html#area-flags
type AreaFlags = flexible bits : uint16 {
    /// Not really used.
    STATIC = 0x1;
    /// Not really used.
    COMPRESSED = 0x2;
    /// Not really used.
    RO = 0x4;
    /// Indicates that the contents of this area should be preserved when the
    /// firmware is being rewritten.
    PRESERVE = 0x8;
};

/// A single area of the flash.
type Area = struct {
    /// Start address of this area on the flash, in bytes.
    offset uint32;
    /// Size of this area, in bytes.
    size uint32;
    /// Name of the area, used to identify it.
    name string:MAX_NAME_LEN;
    /// Bitfield of flags for this area.
    flags AreaFlags;
};

/// A protocol that allows clients to read, write, and erase areas of a NAND
/// flash device whose layout is defined by a coreboot flashmap.
/// https://doc.coreboot.org/lib/flashmap.html
protocol Flashmap {
    /// Get all the areas in the flashmap.
    GetAreas() -> (struct {
        areas vector<Area>:MAX_NUM_AREAS;
    });

    /// Get the smallest unit of flash that can be erased, in bytes.
    GetEraseBlockSize() -> (struct {
        erase_block_size uint32;
    });

    /// Read |size| bytes from |offset| in area |name| and return it in |range|.
    /// Returns:
    /// * ZX_ERR_NOT_FOUND - if the area |name| was not found.
    /// * ZX_ERR_OUT_OF_RANGE - if the requested range of data lies outside the
    ///   bounds of the area.
    /// * ZX_ERR_INTERNAL - if an internal error occurred, e.g. failure to send
    ///   FIDL requests to the underlying flash device.
    /// * Any errors that are returned by the underlying NAND implementation.
    Read(struct {
        name string:MAX_NAME_LEN;
        offset uint32;
        size uint32;
    }) -> (resource struct {
        range fuchsia.mem.Range;
    }) error zx.status;

    /// Write |data| into area |name| at |offset| (within the area).
    /// This function will read back the written data, and fail if it was not
    /// written correctly.
    /// * ZX_ERR_NOT_FOUND - if the area |name| was not found.
    /// * ZX_ERR_OUT_OF_RANGE - if the requested range of data lies outside the
    ///   bounds of the area.
    /// * ZX_ERR_INTERNAL - if an internal error occurred, e.g. failure to send
    ///   FIDL requests to the underlying flash device.
    /// * ZX_ERR_IO_DATA_INTEGRITY - if data read back after writing did not
    ///   match what was written.
    /// * Any errors that are returned by the underlying NAND implementation.
    Write(resource struct {
        name string:MAX_NAME_LEN;
        offset uint32;
        data fuchsia.mem.Buffer;
    }) -> (struct {}) error zx.status;

    /// Erase the given region of flash. If |offset| or |size| are not erase-block-aligned, then
    /// the erase will fail.
    /// * ZX_ERR_NOT_FOUND - if the area |name| was not found.
    /// * ZX_ERR_OUT_OF_RANGE - if the requested range of data lies outside the
    ///   bounds of the area.
    /// * ZX_ERR_INTERNAL - if an internal error occurred, e.g. failure to send
    ///   FIDL requests to the underlying flash device.
    /// * ZX_ERR_INVALID_ARGS - if |offset| or |range| were not
    ///   erase-block-aligned.
    /// * Any errors that are returned by the underlying NAND implementation.
    Erase(struct {
        name string:MAX_NAME_LEN;
        offset uint32;
        range uint32;
    }) -> (struct {}) error zx.status;
};

@discoverable
protocol Manager {
    /// Find and parse the flashmap on NAND device |device| and start serving a |Flashmap| on
    /// |server|.
    Start(resource struct {
        device client_end:fuchsia.nand.Broker;
        server server_end:Flashmap;
    });
};
