blob: ba828c623d278077cb86a92a2543a648c0e867dc [file] [log] [blame]
// 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;
});
};