https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			223 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			223 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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_
 |