/** @file Block Translation Table (BTT) metadata layout definition. BTT is a layout and set of rules for doing block I/O that provide powerfail write atomicity of a single block. Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @par Revision Reference: This metadata layout definition was introduced in UEFI Specification 2.7. **/ #ifndef _BTT_H_ #define _BTT_H_ /// /// The BTT layout and behavior is described by the GUID as below. /// #define EFI_BTT_ABSTRACTION_GUID \ { \ 0x18633bfc, 0x1735, 0x4217, { 0x8a, 0xc9, 0x17, 0x23, 0x92, 0x82, 0xd3, 0xf8 } \ } // // Alignment of all BTT structures // #define EFI_BTT_ALIGNMENT 4096 #define EFI_BTT_INFO_UNUSED_LEN 3968 #define EFI_BTT_INFO_BLOCK_SIG_LEN 16 /// /// Indicate inconsistent metadata or lost metadata due to unrecoverable media errors. /// #define EFI_BTT_INFO_BLOCK_FLAGS_ERROR 0x00000001 #define EFI_BTT_INFO_BLOCK_MAJOR_VERSION 2 #define EFI_BTT_INFO_BLOCK_MINOR_VERSION 0 /// /// Block Translation Table (BTT) Info Block /// typedef struct _EFI_BTT_INFO_BLOCK { /// /// Signature of the BTT Index Block data structure. /// Shall be "BTT_ARENA_INFO\0\0". /// CHAR8 Sig[EFI_BTT_INFO_BLOCK_SIG_LEN]; /// /// UUID identifying this BTT instance. /// GUID Uuid; /// /// UUID of containing namespace. /// GUID ParentUuid; /// /// Attributes of this BTT Info Block. /// UINT32 Flags; /// /// Major version number. Currently at version 2. /// UINT16 Major; /// /// Minor version number. Currently at version 0. /// UINT16 Minor; /// /// Advertised LBA size in bytes. I/O requests shall be in this size chunk. /// UINT32 ExternalLbaSize; /// /// Advertised number of LBAs in this arena. /// UINT32 ExternalNLba; /// /// Internal LBA size shall be greater than or equal to ExternalLbaSize and shall not be smaller than 512 bytes. /// UINT32 InternalLbaSize; /// /// Number of internal blocks in the arena data area. /// UINT32 InternalNLba; /// /// Number of free blocks maintained for writes to this arena. /// UINT32 NFree; /// /// The size of this info block in bytes. /// UINT32 InfoSize; /// /// Offset of next arena, relative to the beginning of this arena. /// UINT64 NextOff; /// /// Offset of the data area for this arena, relative to the beginning of this arena. /// UINT64 DataOff; /// /// Offset of the map for this arena, relative to the beginning of this arena. /// UINT64 MapOff; /// /// Offset of the flog for this arena, relative to the beginning of this arena. /// UINT64 FlogOff; /// /// Offset of the backup copy of this arena's info block, relative to the beginning of this arena. /// UINT64 InfoOff; /// /// Shall be zero. /// CHAR8 Unused[EFI_BTT_INFO_UNUSED_LEN]; /// /// 64-bit Fletcher64 checksum of all fields. /// UINT64 Checksum; } EFI_BTT_INFO_BLOCK; /// /// BTT Map entry maps an LBA that indexes into the arena, to its actual location. /// typedef struct _EFI_BTT_MAP_ENTRY { /// /// Post-map LBA number (block number in this arena's data area) /// UINT32 PostMapLba : 30; /// /// When set and Zero is not set, reads on this block return an error. /// When set and Zero is set, indicate a map entry in its normal, non-error state. /// UINT32 Error : 1; /// /// When set and Error is not set, reads on this block return a full block of zeros. /// When set and Error is set, indicate a map entry in its normal, non-error state. /// UINT32 Zero : 1; } EFI_BTT_MAP_ENTRY; /// /// Alignment of each flog structure /// #define EFI_BTT_FLOG_ENTRY_ALIGNMENT 64 /// /// The BTT Flog is both a free list and a log. /// The Flog size is determined by the EFI_BTT_INFO_BLOCK.NFree which determines how many of these flog /// entries there are. /// The Flog location is the highest aligned address in the arena after space for the backup info block. /// typedef struct _EFI_BTT_FLOG { /// /// Last pre-map LBA written using this flog entry. /// UINT32 Lba0; /// /// Old post-map LBA. /// UINT32 OldMap0; /// /// New post-map LBA. /// UINT32 NewMap0; /// /// The Seq0 field in each flog entry is used to determine which set of fields is newer between the two sets /// (Lba0, OldMap0, NewMpa0, Seq0 vs Lba1, Oldmap1, NewMap1, Seq1). /// UINT32 Seq0; /// /// Alternate lba entry. /// UINT32 Lba1; /// /// Alternate old entry. /// UINT32 OldMap1; /// /// Alternate new entry. /// UINT32 NewMap1; /// /// Alternate Seq entry. /// UINT32 Seq1; } EFI_BTT_FLOG; extern GUID gEfiBttAbstractionGuid; #endif //_BTT_H_