1 /** @file 2 Block Translation Table (BTT) metadata layout definition. 3 4 BTT is a layout and set of rules for doing block I/O that provide powerfail 5 write atomicity of a single block. 6 7 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> 8 SPDX-License-Identifier: BSD-2-Clause-Patent 9 10 @par Revision Reference: 11 This metadata layout definition was introduced in UEFI Specification 2.7. 12 13 **/ 14 15 #ifndef _BTT_H_ 16 #define _BTT_H_ 17 18 /// 19 /// The BTT layout and behavior is described by the GUID as below. 20 /// 21 #define EFI_BTT_ABSTRACTION_GUID \ 22 { \ 23 0x18633bfc, 0x1735, 0x4217, { 0x8a, 0xc9, 0x17, 0x23, 0x92, 0x82, 0xd3, 0xf8 } \ 24 } 25 26 // 27 // Alignment of all BTT structures 28 // 29 #define EFI_BTT_ALIGNMENT 4096 30 31 #define EFI_BTT_INFO_UNUSED_LEN 3968 32 33 #define EFI_BTT_INFO_BLOCK_SIG_LEN 16 34 35 /// 36 /// Indicate inconsistent metadata or lost metadata due to unrecoverable media errors. 37 /// 38 #define EFI_BTT_INFO_BLOCK_FLAGS_ERROR 0x00000001 39 40 #define EFI_BTT_INFO_BLOCK_MAJOR_VERSION 2 41 #define EFI_BTT_INFO_BLOCK_MINOR_VERSION 0 42 43 /// 44 /// Block Translation Table (BTT) Info Block 45 /// 46 typedef struct _EFI_BTT_INFO_BLOCK { 47 /// 48 /// Signature of the BTT Index Block data structure. 49 /// Shall be "BTT_ARENA_INFO\0\0". 50 /// 51 CHAR8 Sig[EFI_BTT_INFO_BLOCK_SIG_LEN]; 52 53 /// 54 /// UUID identifying this BTT instance. 55 /// 56 GUID Uuid; 57 58 /// 59 /// UUID of containing namespace. 60 /// 61 GUID ParentUuid; 62 63 /// 64 /// Attributes of this BTT Info Block. 65 /// 66 UINT32 Flags; 67 68 /// 69 /// Major version number. Currently at version 2. 70 /// 71 UINT16 Major; 72 73 /// 74 /// Minor version number. Currently at version 0. 75 /// 76 UINT16 Minor; 77 78 /// 79 /// Advertised LBA size in bytes. I/O requests shall be in this size chunk. 80 /// 81 UINT32 ExternalLbaSize; 82 83 /// 84 /// Advertised number of LBAs in this arena. 85 /// 86 UINT32 ExternalNLba; 87 88 /// 89 /// Internal LBA size shall be greater than or equal to ExternalLbaSize and shall not be smaller than 512 bytes. 90 /// 91 UINT32 InternalLbaSize; 92 93 /// 94 /// Number of internal blocks in the arena data area. 95 /// 96 UINT32 InternalNLba; 97 98 /// 99 /// Number of free blocks maintained for writes to this arena. 100 /// 101 UINT32 NFree; 102 103 /// 104 /// The size of this info block in bytes. 105 /// 106 UINT32 InfoSize; 107 108 /// 109 /// Offset of next arena, relative to the beginning of this arena. 110 /// 111 UINT64 NextOff; 112 113 /// 114 /// Offset of the data area for this arena, relative to the beginning of this arena. 115 /// 116 UINT64 DataOff; 117 118 /// 119 /// Offset of the map for this arena, relative to the beginning of this arena. 120 /// 121 UINT64 MapOff; 122 123 /// 124 /// Offset of the flog for this arena, relative to the beginning of this arena. 125 /// 126 UINT64 FlogOff; 127 128 /// 129 /// Offset of the backup copy of this arena's info block, relative to the beginning of this arena. 130 /// 131 UINT64 InfoOff; 132 133 /// 134 /// Shall be zero. 135 /// 136 CHAR8 Unused[EFI_BTT_INFO_UNUSED_LEN]; 137 138 /// 139 /// 64-bit Fletcher64 checksum of all fields. 140 /// 141 UINT64 Checksum; 142 } EFI_BTT_INFO_BLOCK; 143 144 /// 145 /// BTT Map entry maps an LBA that indexes into the arena, to its actual location. 146 /// 147 typedef struct _EFI_BTT_MAP_ENTRY { 148 /// 149 /// Post-map LBA number (block number in this arena's data area) 150 /// 151 UINT32 PostMapLba : 30; 152 153 /// 154 /// When set and Zero is not set, reads on this block return an error. 155 /// When set and Zero is set, indicate a map entry in its normal, non-error state. 156 /// 157 UINT32 Error : 1; 158 159 /// 160 /// When set and Error is not set, reads on this block return a full block of zeros. 161 /// When set and Error is set, indicate a map entry in its normal, non-error state. 162 /// 163 UINT32 Zero : 1; 164 } EFI_BTT_MAP_ENTRY; 165 166 /// 167 /// Alignment of each flog structure 168 /// 169 #define EFI_BTT_FLOG_ENTRY_ALIGNMENT 64 170 171 /// 172 /// The BTT Flog is both a free list and a log. 173 /// The Flog size is determined by the EFI_BTT_INFO_BLOCK.NFree which determines how many of these flog 174 /// entries there are. 175 /// The Flog location is the highest aligned address in the arena after space for the backup info block. 176 /// 177 typedef struct _EFI_BTT_FLOG { 178 /// 179 /// Last pre-map LBA written using this flog entry. 180 /// 181 UINT32 Lba0; 182 183 /// 184 /// Old post-map LBA. 185 /// 186 UINT32 OldMap0; 187 188 /// 189 /// New post-map LBA. 190 /// 191 UINT32 NewMap0; 192 193 /// 194 /// The Seq0 field in each flog entry is used to determine which set of fields is newer between the two sets 195 /// (Lba0, OldMap0, NewMpa0, Seq0 vs Lba1, Oldmap1, NewMap1, Seq1). 196 /// 197 UINT32 Seq0; 198 199 /// 200 /// Alternate lba entry. 201 /// 202 UINT32 Lba1; 203 204 /// 205 /// Alternate old entry. 206 /// 207 UINT32 OldMap1; 208 209 /// 210 /// Alternate new entry. 211 /// 212 UINT32 NewMap1; 213 214 /// 215 /// Alternate Seq entry. 216 /// 217 UINT32 Seq1; 218 } EFI_BTT_FLOG; 219 220 extern GUID gEfiBttAbstractionGuid; 221 222 #endif //_BTT_H_ 223