mirror of https://github.com/acidanthera/audk.git
362 lines
12 KiB
C
362 lines
12 KiB
C
/** @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.
|
|
/// If NLabel is 1 then setting this flag is optional and it is implied that the
|
|
/// EFI_NVDIMM_LABEL_FLAGS_LOCAL flag is set as the complete label set is local to a single NVDIMM Label Storage Area.
|
|
///
|
|
#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
|
|
|
|
///
|
|
/// When set, the SPALocationCookie in the namespace label is valid and should match the
|
|
/// current value in the NFIT SPA Range Structure.
|
|
///
|
|
#define EFI_NVDIMM_LABEL_FLAGS_SPACOOKIE_BOUND 0x00000010
|
|
|
|
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;
|
|
|
|
///
|
|
/// When creating the label, this value is set to the value from the NFIT SPA Range Structure if the
|
|
/// SPALocationCookie flag (bit 2) is set. If EFI_NVDIMM_LABEL_FLAGS_SPACOOKIE_BOUND is set, the SPALocationCookie
|
|
/// value stored in the namespace label should match the current value in the NFIT SPA Range Structure.
|
|
/// Otherwise, the data may not be read correctly.
|
|
///
|
|
UINT64 SPALocationCookie;
|
|
|
|
///
|
|
/// Shall be 0.
|
|
///
|
|
UINT8 Reserved1[80];
|
|
|
|
///
|
|
/// 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
|