| /** @file |
| EFI NVDIMM Label Protocol Definition |
| |
| The EFI NVDIMM Label Protocol is used to Provides services that allow management |
| of labels contained in a Label Storage Area that are associated with a specific |
| NVDIMM Device Path. |
| |
| Copyright (c) 2017, Intel Corporation. All rights reserved.<BR> |
| SPDX-License-Identifier: BSD-2-Clause-Patent |
| |
| @par Revision Reference: |
| This Protocol was introduced in UEFI Specification 2.7. |
| |
| **/ |
| |
| #ifndef __EFI_NVDIMM_LABEL_PROTOCOL_H__ |
| #define __EFI_NVDIMM_LABEL_PROTOCOL_H__ |
| |
| #define EFI_NVDIMM_LABEL_PROTOCOL_GUID \ |
| { \ |
| 0xd40b6b80, 0x97d5, 0x4282, {0xbb, 0x1d, 0x22, 0x3a, 0x16, 0x91, 0x80, 0x58 } \ |
| } |
| |
| typedef struct _EFI_NVDIMM_LABEL_PROTOCOL EFI_NVDIMM_LABEL_PROTOCOL; |
| |
| #define EFI_NVDIMM_LABEL_INDEX_SIG_LEN 16 |
| #define EFI_NVDIMM_LABEL_INDEX_ALIGN 256 |
| typedef struct { |
| /// |
| /// Signature of the Index Block data structure. Must be "NAMESPACE_INDEX\0". |
| /// |
| CHAR8 Sig[EFI_NVDIMM_LABEL_INDEX_SIG_LEN]; |
| |
| /// |
| /// Attributes of this Label Storage Area. |
| /// |
| UINT8 Flags[3]; |
| |
| /// |
| /// Size of each label in bytes, 128 bytes << LabelSize. |
| /// 1 means 256 bytes, 2 means 512 bytes, etc. Shall be 1 or greater. |
| /// |
| UINT8 LabelSize; |
| |
| /// |
| /// Sequence number used to identify which of the two Index Blocks is current. |
| /// |
| UINT32 Seq; |
| |
| /// |
| /// The offset of this Index Block in the Label Storage Area. |
| /// |
| UINT64 MyOff; |
| |
| /// |
| /// The size of this Index Block in bytes. |
| /// This field must be a multiple of the EFI_NVDIMM_LABEL_INDEX_ALIGN. |
| /// |
| UINT64 MySize; |
| |
| /// |
| /// The offset of the other Index Block paired with this one. |
| /// |
| UINT64 OtherOff; |
| |
| /// |
| /// The offset of the first slot where labels are stored in this Label Storage Area. |
| /// |
| UINT64 LabelOff; |
| |
| /// |
| /// The total number of slots for storing labels in this Label Storage Area. |
| /// |
| UINT32 NSlot; |
| |
| /// |
| /// Major version number. Value shall be 1. |
| /// |
| UINT16 Major; |
| |
| /// |
| /// Minor version number. Value shall be 2. |
| /// |
| UINT16 Minor; |
| |
| /// |
| /// 64-bit Fletcher64 checksum of all fields in this Index Block. |
| /// |
| UINT64 Checksum; |
| |
| /// |
| /// Array of unsigned bytes implementing a bitmask that tracks which label slots are free. |
| /// A bit value of 0 indicates in use, 1 indicates free. |
| /// The size of this field is the number of bytes required to hold the bitmask with NSlot bits, |
| /// padded with additional zero bytes to make the Index Block size a multiple of EFI_NVDIMM_LABEL_INDEX_ALIGN. |
| /// Any bits allocated beyond NSlot bits must be zero. |
| /// |
| UINT8 Free[]; |
| } EFI_NVDIMM_LABEL_INDEX_BLOCK; |
| |
| #define EFI_NVDIMM_LABEL_NAME_LEN 64 |
| |
| /// |
| /// The label is read-only. |
| /// |
| #define EFI_NVDIMM_LABEL_FLAGS_ROLABEL 0x00000001 |
| |
| /// |
| /// When set, the complete label set is local to a single NVDIMM Label Storage Area. |
| /// When clear, the complete label set is contained on multiple NVDIMM Label Storage Areas. |
| /// |
| #define EFI_NVDIMM_LABEL_FLAGS_LOCAL 0x00000002 |
| |
| /// |
| /// This reserved flag is utilized on older implementations and has been deprecated. |
| /// Do not use. |
| // |
| #define EFI_NVDIMM_LABEL_FLAGS_RESERVED 0x00000004 |
| |
| /// |
| /// When set, the label set is being updated. |
| /// |
| #define EFI_NVDIMM_LABEL_FLAGS_UPDATING 0x00000008 |
| |
| typedef struct { |
| /// |
| /// Unique Label Identifier UUID per RFC 4122. |
| /// |
| EFI_GUID Uuid; |
| |
| /// |
| /// NULL-terminated string using UTF-8 character formatting. |
| /// |
| CHAR8 Name[EFI_NVDIMM_LABEL_NAME_LEN]; |
| |
| /// |
| /// Attributes of this namespace. |
| /// |
| UINT32 Flags; |
| |
| /// |
| /// Total number of labels describing this namespace. |
| /// |
| UINT16 NLabel; |
| |
| /// |
| /// Position of this label in list of labels for this namespace. |
| /// |
| UINT16 Position; |
| |
| /// |
| /// The SetCookie is utilized by SW to perform consistency checks on the Interleave Set to verify the current |
| /// physical device configuration matches the original physical configuration when the labels were created |
| /// for the set.The label is considered invalid if the actual label set cookie doesn't match the cookie stored here. |
| /// |
| UINT64 SetCookie; |
| |
| /// |
| /// This is the default logical block size in bytes and may be superseded by a block size that is specified |
| /// in the AbstractionGuid. |
| /// |
| UINT64 LbaSize; |
| |
| /// |
| /// The DPA is the DIMM Physical address where the NVM contributing to this namespace begins on this NVDIMM. |
| /// |
| UINT64 Dpa; |
| |
| /// |
| /// The extent of the DPA contributed by this label. |
| /// |
| UINT64 RawSize; |
| |
| /// |
| /// Current slot in the Label Storage Area where this label is stored. |
| /// |
| UINT32 Slot; |
| |
| /// |
| /// Alignment hint used to advertise the preferred alignment of the data from within the namespace defined by this label. |
| /// |
| UINT8 Alignment; |
| |
| /// |
| /// Shall be 0. |
| /// |
| UINT8 Reserved[3]; |
| |
| /// |
| /// Range Type GUID that describes the access mechanism for the specified DPA range. |
| /// |
| EFI_GUID TypeGuid; |
| |
| /// |
| /// Identifies the address abstraction mechanism for this namespace. A value of 0 indicates no mechanism used. |
| /// |
| EFI_GUID AddressAbstractionGuid; |
| |
| /// |
| /// Shall be 0. |
| /// |
| UINT8 Reserved1[88]; |
| |
| /// |
| /// 64-bit Fletcher64 checksum of all fields in this Label. |
| /// This field is considered zero when the checksum is computed. |
| /// |
| UINT64 Checksum; |
| } EFI_NVDIMM_LABEL; |
| |
| typedef struct { |
| /// |
| /// The Region Offset field from the ACPI NFIT NVDIMM Region Mapping Structure for a given entry. |
| /// |
| UINT64 RegionOffset; |
| |
| /// |
| /// The serial number of the NVDIMM, assigned by the module vendor. |
| /// |
| UINT32 SerialNumber; |
| |
| /// |
| /// The identifier indicating the vendor of the NVDIMM. |
| /// |
| UINT16 VendorId; |
| |
| /// |
| /// The manufacturing date of the NVDIMM, assigned by the module vendor. |
| /// |
| UINT16 ManufacturingDate; |
| |
| /// |
| /// The manufacturing location from for the NVDIMM, assigned by the module vendor. |
| /// |
| UINT8 ManufacturingLocation; |
| |
| /// |
| /// Shall be 0. |
| /// |
| UINT8 Reserved[31]; |
| } EFI_NVDIMM_LABEL_SET_COOKIE_MAP; |
| |
| typedef struct { |
| /// |
| /// Array size is 1 if EFI_NVDIMM_LABEL_FLAGS_LOCAL is set indicating a Local Namespaces. |
| /// |
| EFI_NVDIMM_LABEL_SET_COOKIE_MAP Mapping[0]; |
| } EFI_NVDIMM_LABEL_SET_COOKIE_INFO; |
| |
| /** |
| Retrieves the Label Storage Area size and the maximum transfer size for the LabelStorageRead and |
| LabelStorageWrite methods. |
| |
| @param This A pointer to the EFI_NVDIMM_LABEL_PROTOCOL instance. |
| @param SizeOfLabelStorageArea The size of the Label Storage Area for the NVDIMM in bytes. |
| @param MaxTransferLength The maximum number of bytes that can be transferred in a single call to |
| LabelStorageRead or LabelStorageWrite. |
| |
| @retval EFI_SUCCESS The size of theLabel Storage Area and maximum transfer size returned are valid. |
| @retval EFI_ACCESS_DENIED The Label Storage Area for the NVDIMM device is not currently accessible. |
| @retval EFI_DEVICE_ERROR A physical device error occurred and the data transfer failed to complete. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *EFI_NVDIMM_LABEL_STORAGE_INFORMATION) ( |
| IN EFI_NVDIMM_LABEL_PROTOCOL *This, |
| OUT UINT32 *SizeOfLabelStorageArea, |
| OUT UINT32 *MaxTransferLength |
| ); |
| |
| /** |
| Retrieves the label data for the requested offset and length from within the Label Storage Area for |
| the NVDIMM. |
| |
| @param This A pointer to the EFI_NVDIMM_LABEL_PROTOCOL instance. |
| @param Offset The byte offset within the Label Storage Area to read from. |
| @param TransferLength Number of bytes to read from the Label Storage Area beginning at the byte |
| Offset specified. A TransferLength of 0 reads no data. |
| @param LabelData The return label data read at the requested offset and length from within |
| the Label Storage Area. |
| |
| @retval EFI_SUCCESS The label data from the Label Storage Area for the NVDIMM was read successfully |
| at the specified Offset and TransferLength and LabelData contains valid data. |
| @retval EFI_INVALID_PARAMETER Any of the following are true: |
| - Offset > SizeOfLabelStorageArea reported in the LabelStorageInformation return data. |
| - Offset + TransferLength is > SizeOfLabelStorageArea reported in the |
| LabelStorageInformation return data. |
| - TransferLength is > MaxTransferLength reported in the LabelStorageInformation return |
| data. |
| @retval EFI_ACCESS_DENIED The Label Storage Area for the NVDIMM device is not currently accessible and labels |
| cannot be read at this time. |
| @retval EFI_DEVICE_ERROR A physical device error occurred and the data transfer failed to complete. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *EFI_NVDIMM_LABEL_STORAGE_READ) ( |
| IN CONST EFI_NVDIMM_LABEL_PROTOCOL *This, |
| IN UINT32 Offset, |
| IN UINT32 TransferLength, |
| OUT UINT8 *LabelData |
| ); |
| |
| /** |
| Writes the label data for the requested offset and length in to the Label Storage Area for the NVDIMM. |
| |
| @param This A pointer to the EFI_NVDIMM_LABEL_PROTOCOL instance. |
| @param Offset The byte offset within the Label Storage Area to write to. |
| @param TransferLength Number of bytes to write to the Label Storage Area beginning at the byte |
| Offset specified. A TransferLength of 0 writes no data. |
| @param LabelData The return label data write at the requested offset and length from within |
| the Label Storage Area. |
| |
| @retval EFI_SUCCESS The label data from the Label Storage Area for the NVDIMM written read successfully |
| at the specified Offset and TransferLength. |
| @retval EFI_INVALID_PARAMETER Any of the following are true: |
| - Offset > SizeOfLabelStorageArea reported in the LabelStorageInformation return data. |
| - Offset + TransferLength is > SizeOfLabelStorageArea reported in the |
| LabelStorageInformation return data. |
| - TransferLength is > MaxTransferLength reported in the LabelStorageInformation return |
| data. |
| @retval EFI_ACCESS_DENIED The Label Storage Area for the NVDIMM device is not currently accessible and labels |
| cannot be written at this time. |
| @retval EFI_DEVICE_ERROR A physical device error occurred and the data transfer failed to complete. |
| **/ |
| typedef |
| EFI_STATUS |
| (EFIAPI *EFI_NVDIMM_LABEL_STORAGE_WRITE) ( |
| IN CONST EFI_NVDIMM_LABEL_PROTOCOL *This, |
| IN UINT32 Offset, |
| IN UINT32 TransferLength, |
| IN UINT8 *LabelData |
| ); |
| |
| /// |
| /// Provides services that allow management of labels contained in a Label Storage Area. |
| /// |
| struct _EFI_NVDIMM_LABEL_PROTOCOL { |
| EFI_NVDIMM_LABEL_STORAGE_INFORMATION LabelStorageInformation; |
| EFI_NVDIMM_LABEL_STORAGE_READ LabelStorageRead; |
| EFI_NVDIMM_LABEL_STORAGE_WRITE LabelStorageWrite; |
| }; |
| |
| extern EFI_GUID gEfiNvdimmLabelProtocolGuid; |
| |
| #endif |