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