// Copyright 2023 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 zbi;

// TODO(https://fxbug.dev/42062786): Figure out documentation convention.

const PARTITION_NAME_LEN uint64 = 32;
const PARTITION_GUID_LEN uint64 = 16;

alias PartitionGuid = array<uint8, PARTITION_GUID_LEN>;

type Partition = struct {
    /// GUID specifying the format and use of data stored in the partition.
    type_guid PartitionGuid;

    /// GUID unique to this partition.
    uniq_guid PartitionGuid;

    /// First and last block occupied by this partition.
    first_block uint64;
    last_block uint64;

    /// Reserved for future use.  Set to 0.
    flags uint64;

    name string_array<PARTITION_NAME_LEN>;
};

/// ZBI_TYPE_DRV_PARTITION_MAP payload. This header is immediately followed by
/// an array of the corresponding zbi_partition_t.
type PartitionMap = struct {
    /// Total blocks used on the device.
    block_count uint64;

    /// Size of each block in bytes.
    block_size uint64;

    /// Number of partitions in the map.
    partition_count uint32;

    /// Reserved for future use.
    reserved uint32;

    /// Device GUID.
    guid PartitionGuid;
};
