blob: 9f241204993749548a4b2c677c39e096d552caf6 [file] [log] [blame]
Ronak Kanabar1ae366f2023-06-07 01:21:56 +05301/** @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
7Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
8SPDX-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///
46typedef 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///
147typedef 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///
177typedef 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
220extern GUID gEfiBttAbstractionGuid;
221
222#endif //_BTT_H_