| /** @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.<BR> |
| 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_ |