Ryzen/AmiModulePkg/NVRAM/NVRAM.h

318 lines
10 KiB
C
Raw Normal View History

2022-12-22 23:14:44 -08:00
//***********************************************************************
//* *
//* Copyright (c) 1985-2021, American Megatrends International LLC. *
//* *
//* All rights reserved. Subject to AMI licensing agreement. *
//* *
//***********************************************************************
/** @file NVRAM.h
NVRAM Definitions
**/
//**********************************************************************
#ifndef __NVRAM__H__
#define __NVRAM__H__
#include <AmiLib.h>
#include <Flash.h>
#include <Hob.h>
#include <Ffs.h>
#include <Guid/AmiNvram.h>
#define FLASH_EMPTY_BYTE ((UINT8)FlashEmpty)
#define FLASH_EMPTY_FLAG FLASH_EMPTY_BYTE
#define FLASH_EMPTY_NEXT FlashEmptyNext
#define FLASH_EMPTY_SIGNATURE ((UINT32)FlashEmpty)
#define FLASH_EMPTY_SIZE ((VAR_SIZE_TYPE)FlashEmpty)
#define NVRAM_FLAG_VALID 0x80
#define NVRAM_FLAG_RUNTIME 1
#define NVRAM_FLAG_ASCII_NAME 2
#define NVRAM_FLAG_GUID 4
#define NVRAM_FLAG_DATA_ONLY 8
#define NVRAM_FLAG_EXT_HEDER 0x10
#define NVRAM_FLAG_AUTH_WRITE 0x40
#define NVRAM_FLAG_HARDWARE_ERROR_RECORD 0x20
#define UEFI21_SPECIFIC_NVRAM_FLAGS (NVRAM_FLAG_HARDWARE_ERROR_RECORD | NVRAM_FLAG_AUTH_WRITE)
#define UEFI23_1_AUTHENTICATED_VARIABLE_ATTRIBUTES \
(EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)
#define NVRAM_EXT_FLAG_CHECKSUM 1
#define NVRAM_eFLAG_AUTH_WRITE EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS //0x10
#define NVRAM_eFLAG_TIME_BASED_AUTH_WRITE EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS //0x20
#define NVAR_SIGNATURE ('N'+('V'<<8)+(('A'+('R'<<8))<<16))//NVAR
#define NVRAM_HOB_GUID \
{ 0xc0ec00fd, 0xc2f8, 0x4e47, { 0x90, 0xef, 0x9c, 0x81, 0x55, 0x28, 0x5b, 0xec } }
#define NVRAM_PEI_VAR_LIST_HOB_GUID \
{ 0x9f7d5e81, 0x252a, 0x40e3, { 0x91, 0x6, 0xd3, 0x45, 0x25, 0x50, 0x8, 0xbc } }
#define NVRAM_MODE_MANUFACTORING 1
#define NVRAM_MODE_RESET_CONFIGURATION 2
#define NVRAM_MODE_DEFAULT_CONFIGURATION 4
#define NVRAM_MODE_SIMULATION 8
#define NVRAM_STORE_FLAG_NON_VALATILE 1
#define NVRAM_STORE_FLAG_READ_ONLY 2
#define NVRAM_STORE_FLAG_DO_NOT_ENUMERATE 4
#define NVRAM_STORE_FLAG_DEF_FROM_BB 8
#define MAX_NVRAM_STORE_HEADER_SIZE 0x100
extern const UINTN FlashEmpty;
extern const UINT32 FlashEmptyNext;
extern const EFI_GUID AmiDefaultsVariableGuid;
extern const EFI_GUID AmiNvramHobGuid;
extern const CHAR16 MfgDefaults[];
extern const CHAR16 StdDefaults[];
typedef UINT16 VAR_SIZE_TYPE;
#define NEXT_OFFSET (EFI_FIELD_OFFSET(NVAR,size)+sizeof(VAR_SIZE_TYPE))
#define NEXT_SIZE 3
#define FLAG_SIZE 1
#define FLAG_OFFSET (NEXT_OFFSET + NEXT_SIZE)
#define MAX_NVRAM_VARIABLE_SIZE ((1<<(sizeof(VAR_SIZE_TYPE)<<3))-1)
#define NvSignature(Var) ReadUnaligned32(&(Var)->signature)
#define NvSize(Var) ReadUnaligned16(&(Var)->size)
#define NvExtSize(Var) ReadUnaligned16(NvGetExtSize(Var))
#define NvNextAddress(Var) ( (UINT32*)( (UINT8*)(Var)+sizeof(NVAR)-sizeof(UINT32) ) )
#define NvNext(Var) (ReadUnaligned32(NvNextAddress(Var)) & 0xFFFFFF)
#define SetNvSignature(Var) WriteUnaligned32(&(Var)->signature,NVAR_SIGNATURE)
#define SetNvSize(Var,Value) WriteUnaligned16(&(Var)->size,Value)
#define SetNvExtSize(Var,Value) WriteUnaligned16(NvGetExtSize(Var),Value)
#define SetNvNext(Var,Value) WriteUnaligned32(NvNextAddress(Var),(Value)|((Var)->flags<<24))
#define VALID_STATE_FLAGS (\
EFI_FILE_HEADER_CONSTRUCTION | EFI_FILE_HEADER_VALID |\
EFI_FILE_DATA_VALID | EFI_FILE_MARKED_FOR_UPDATE | EFI_FILE_DELETED)
// The corrupted store has been successfully repaired
#define NVRAM_WARN_STORE_REPAIRED EFI_WARN_WRITE_FAILURE
// The store is healthy, but it out of synch with the store memory buffer
#define NVRAM_WARN_MEDIA_CHANGED EFI_WARN_STALE_DATA
#pragma pack(push)
#pragma pack(1)
typedef struct{
UINT32 signature;
VAR_SIZE_TYPE size;
UINT32 next:24;
UINT32 flags:8;
// guid and name are there only if NVRAM_FLAG_DATA_ONLY is not set
// UINT8 guid; (or EFI_GUID guid; if NVRAM_FLAG_GUID is set)
// CHAR8 or CHAR16 name[...]; (if NVRAM_FLAG_ASCII_NAME is set, CHAR8; otherwise CHAR16)
// UINT8 data[...];
// if NVRAM_FLAG_EXT_HEDER is set
// UINT8 extflags;
// UINT8 extdata[extisze - sizeof(extsize) - sizeof(extflags)];
// VAR_SIZE_TYPE extsize;
// =====
// extdata format:
// UINT64 MonotonicCounter; // only if NVRAM_FLAG_AUTH_WRITE is set
// UINT8 KeyHash[32]; // only if NVRAM_FLAG_AUTH_WRITE is set
// UINT8 CheckSum; // only if NvramChecksumSupport is TRUE
}NVAR;
typedef struct {
UINT16 NameSize;
EFI_GUID Guid;
CHAR16 Name;
} NVRAM_PEI_VAR_LIST_ENTRY;
typedef struct {
UINT16 EntriesNumber;
NVRAM_PEI_VAR_LIST_ENTRY Entry;
} NVRAM_PEI_VAR_LIST;
typedef struct {
EFI_HOB_GUID_TYPE Header;
NVRAM_PEI_VAR_LIST_ENTRY Entry;
} NVRAM_PEI_VAR_HOB;
#pragma pack(pop)
typedef struct {
EFI_HOB_GUID_TYPE Header;
EFI_PHYSICAL_ADDRESS NvramAddress;
EFI_PHYSICAL_ADDRESS BackupAddress;
UINT32 NvramSize;
UINT32 HeaderLength;
UINT32 NvramMode;
} NVRAM_HOB;
typedef struct _NVRAM_STORE_INTERFACE NVRAM_STORE_INTERFACE;
typedef struct {
UINT8 *NvramAddress;
UINTN NvramSize;
EFI_GUID* NvramGuidsAddress;
UINT8 *pEndOfVars, *pFirstVar;
INT16 NextGuid;
VAR_SIZE_TYPE LastVarSize;
NVAR *pLastReturned;
UINT8 Flags;
UINT32 HeaderLength;
NVRAM_STORE_INTERFACE *Interface;
} NVRAM_STORE_INFO;
typedef BOOLEAN (*NVRAM_STORE_UPDATE_ROUTINE)(
IN NVRAM_STORE_INTERFACE *This, IN VOID *Address, UINTN Size
);
typedef BOOLEAN (*NVRAM_STORE_PROGRAM_ROUTINE)(
IN NVRAM_STORE_INTERFACE *This, IN VOID *Address, UINTN Size, VOID *Data
);
typedef EFI_STATUS (*NVRAM_STORE_BEGIN_GARBAGE_COLLECTION)(
IN NVRAM_STORE_INTERFACE *This, VOID* Address, UINTN Size
);
typedef EFI_STATUS (*NVRAM_STORE_END_GARBAGE_COLLECTION)(
IN NVRAM_STORE_INTERFACE *This, BOOLEAN ErrorsFound, VOID* Address
);
typedef EFI_STATUS (*NVRAM_STORE_VIRTUAL_FIXUP)(
IN NVRAM_STORE_INTERFACE *This, UINT8 *BufferAddress
);
typedef EFI_STATUS (*NVRAM_STORE_CHECK_STORE)(
IN NVRAM_STORE_INTERFACE *This, UINT8 *BufferAddress
);
typedef EFI_STATUS (*NVRAM_STORE_REINITIALIZE)(
IN NVRAM_STORE_INTERFACE *This, IN UINT8 *Buffer, IN UINTN Size, IN BOOLEAN ReadOnly, OUT UINT32 *HeaderLength
);
struct _NVRAM_STORE_INTERFACE {
NVRAM_STORE_UPDATE_ROUTINE EnableUpdate;
NVRAM_STORE_UPDATE_ROUTINE DisableUpdate;
NVRAM_STORE_UPDATE_ROUTINE EraseBytes;
NVRAM_STORE_PROGRAM_ROUTINE WriteBytes;
NVRAM_STORE_BEGIN_GARBAGE_COLLECTION BeginGarbageCollection;
NVRAM_STORE_END_GARBAGE_COLLECTION EndGarbageCollection;
NVRAM_STORE_VIRTUAL_FIXUP VirtualFixup;
NVRAM_STORE_CHECK_STORE CheckStore;
NVRAM_STORE_REINITIALIZE Reinitialize;
};
//Low level access routines
EFI_GUID* NvGetGuid(NVAR* pVar, NVRAM_STORE_INFO *pInfo);
VOID* NvGetName(NVAR* pVar);
NVAR* NvGetDataNvar(NVAR *pVar, NVRAM_STORE_INFO *pInfo);
VOID* NvGetData(NVAR* pVar, UINTN NameLength, UINTN* pDataSize, NVRAM_STORE_INFO *pInfo);
VAR_SIZE_TYPE* NvGetExtSize (NVAR* pVar);
UINT8* NvGetExtFlags (NVAR* pVar);
//Validation routines
BOOLEAN NvIsVariable(NVAR *pVar, NVRAM_STORE_INFO *pInfo);
BOOLEAN NvIsValid(NVAR* pVar);
//Iteration routines
NVAR* NvGetNextNvar(NVAR* pVar, NVRAM_STORE_INFO *pInfo);
NVAR* NvGetNextValid(NVAR* pVar, NVRAM_STORE_INFO *pInfo);
//Comparison routines
BOOLEAN NvAttribEq(NVAR* pNvar, UINT32 Attributes, NVRAM_STORE_INFO *pInfo);
BOOLEAN NvVarEq(NVAR* pNvar, CHAR16* sName, EFI_GUID* pGuid, UINTN* pNameSize, NVRAM_STORE_INFO *pInfo);
BOOLEAN NvarEqNvar(NVAR *Nvar1, NVRAM_STORE_INFO *Info1, NVAR *Nvar2, NVRAM_STORE_INFO *Info2);
//High level routines that work with a single NV store
VOID* NvFindVariable(CHAR16* sName, EFI_GUID* pGuid, UINTN* pNameSize, NVRAM_STORE_INFO *pInfo);
EFI_STATUS NvGetVariable(
IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize, OUT VOID *Data,
NVRAM_STORE_INFO *pInfo, OUT NVAR **Var OPTIONAL
);
EFI_STATUS NvGetNextVariableName(
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName, IN OUT EFI_GUID *VendorGuid,
NVRAM_STORE_INFO *pInfo, BOOLEAN Runtime
);
//High level routines that work with a multiple NV stores
EFI_STATUS NvGetVariable2(
IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize, OUT VOID *Data,
UINT32 InfoCount, NVRAM_STORE_INFO *pInfo
);
EFI_STATUS NvGetNextVariableName2(
IN OUT UINTN *VariableNameSize,
IN OUT CHAR16 *VariableName, IN OUT EFI_GUID *VendorGuid,
UINT32 InfoCount, NVRAM_STORE_INFO *pInfo, UINT32 *LastInfoIndex,
BOOLEAN Runtime
);
//Service routines
VOID NvInitInfoBuffer(
IN NVRAM_STORE_INFO *pInfo, UINT32 HeaderSize, UINT8 Flags,
NVRAM_STORE_INTERFACE *Interface
);
VOID NvResetInfoBuffer(IN NVRAM_STORE_INFO *pInfo);
NVRAM_STORE_INFO* NvGetDefaultsInfo(
IN const CHAR16* DefaultsVar,
IN NVRAM_STORE_INFO *pInInfo, OUT NVRAM_STORE_INFO *pOutInfo
);
EFI_STATUS NvGetAttributesFromNvar(
IN NVAR *pNvar, IN NVRAM_STORE_INFO *pInfo,
OUT UINT32 *Attributes
);
EFI_STATUS NvGetVariableFromNvar(
NVAR *pNvar, UINTN NameSize, OUT UINT32 *Attributes OPTIONAL,
IN OUT UINTN *DataSize, OUT VOID *Data,
IN NVRAM_STORE_INFO *pInfo, OUT UINT8 *Flags OPTIONAL
);
EFI_FFS_FILE_STATE* GetNvramFfsFileStatePtr(VOID *Address);
EFI_FFS_FILE_STATE GetNvramFfsFileState(VOID *Address);
BOOLEAN IsMainNvramStoreValid(
VOID *MainAddress, VOID *BackupAddress,
BOOLEAN *BackupStoreValid
);
BOOLEAN CheckNvramStoreState(
EFI_FFS_FILE_STATE MainState, EFI_FFS_FILE_STATE BackupState,
BOOLEAN *BackupStoreValidPtr
);
UINT32 GetFvHeaderSize(VOID *Address);
UINT32 GetNvStoreHeaderSize(VOID *Address);
UINT8 NvCalculateNvarChecksum(NVAR* pVar);
UINT8* NvGetExtFlags (NVAR* pVar);
// Shared with AuthVariable service
typedef struct {
UINT8 AuthFlags; // AuthWriteAccess = 0x10 and TimeWriteAccess = 0x20
UINT64 Mc;
UINT8 KeyHash[32]; // sha256
}EXT_SEC_FLAGS;
VOID
GetVarAuthExtFlags(
IN NVAR *Var,
IN NVRAM_STORE_INFO *pInfo,
OUT EXT_SEC_FLAGS *ExtFlags
);
EFI_STATUS UpdateNonNvVariableInPlace(
IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid,
IN UINTN DataSize, IN VOID *Data
);
EFI_STATUS FindVariable(
IN CHAR16 *VariableName, IN EFI_GUID *VendorGuid,
OUT UINT32 *Attributes ,
IN OUT UINTN *DataSize, OUT VOID **Data
);
EFI_STATUS CheckStore(
IN NVRAM_STORE_INFO *Info
);
BOOLEAN IsNvramRuntime();
#endif