summaryrefslogtreecommitdiff
path: root/Core/EM/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Core/EM/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c')
-rw-r--r--Core/EM/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c386
1 files changed, 386 insertions, 0 deletions
diff --git a/Core/EM/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c b/Core/EM/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c
new file mode 100644
index 0000000..4bf72a1
--- /dev/null
+++ b/Core/EM/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c
@@ -0,0 +1,386 @@
+//**********************************************************************//
+//**********************************************************************//
+//** **//
+//** (C)Copyright 1985-2015, American Megatrends, Inc. **//
+//** **//
+//** All Rights Reserved. **//
+//** **//
+//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 **//
+//** **//
+//** Phone: (770)-246-8600 **//
+//** **//
+//**********************************************************************//
+//**********************************************************************//
+
+//**********************************************************************//
+// $Header: /Alaska/SOURCE/Modules/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c 11 2/17/15 1:16p Davidd $
+//
+// $Revision: 11 $
+//
+// $Date: 2/17/15 1:16p $
+//**********************************************************************//
+// Revision History
+// ----------------
+// $Log: /Alaska/SOURCE/Modules/SMBIOS/SmbiosDMIEditSupport/SmbiosNvramFunc.c $
+//
+// 11 2/17/15 1:16p Davidd
+// [TAG] EIP205509
+// [Category] Improvement
+// [Description] Merge Aptio V Smbios EIP193807, 193858, 196901 changes
+// into Aptio 4 Smbios
+// [Files] SmbiosDmiEdit.sdl
+// SmbiosDmiEdit.c
+// SmbiosNvramFunc.c
+// SmbiosGetFlashData.c
+//
+// 10 11/15/13 4:34p Davidd
+// [TAG] EIP143321
+// [Category] Improvement
+// [Description] Perform "CppCheck" on Smbios module for
+// '4.6.5.1_SMBIOS_36' release
+// [Files] SmbiosBoard.c
+// Smbios.c
+// SmbiosDMIEdit.c
+// SmbiosDMIEditFunc.c
+// SmbiosNvramFunc.c
+//
+// 9 9/04/12 11:05a Davidd
+// [TAG] EIP96286
+// [Category] Improvement
+// [Description] Please help to reserve DMI Data for AFUDOS with /r in
+// Capsule Mode
+// [Files] Smbios.sdl
+// SmbiosDMIEdit.mak
+// SmbiosNvramFunc.c
+//
+// 8 8/02/12 12:48p Davidd
+// [TAG] EIP96064
+// [Category] Bug Fix
+// [Severity] Minor
+// [Symptom] SMBIOS: DmiEdit support creates NVRAM variables with names
+// of incorrect length
+// [RootCause] Swprintf_s function creates 15 characters variable name
+// with NULL terminator in last byte.
+// [Solution] Use Swprintf function instead
+// [Files] Smbios.c
+// SmbiosDMIEditFunc.c
+// SmbiosNvramFunc.c
+//
+// 7 11/17/11 2:41p Davidd
+// [TAG] EIP74579
+// [Category] Improvement
+// [Description] Update SMBIOS moudule to let AMDELNX support SMBIOS
+// spec 2.7
+// (remove the 64 characters string limitation)
+// [Files] Smbios.h
+// SmbiosStaticData.sdl
+// Smbios.c
+// SMBios.dxs
+// SmbiosDMIEdit.sdl
+// SmbiosDMIEdit.h
+// SmbiosDMIEditFunc.c
+// SmbiosNvram.c
+// SmbiosFlashData.sdl
+//
+// 6 5/04/11 3:20p Davidd
+// [TAG] EIP57144
+// [Category] NEW FEATURE
+// [Description] Allow SMBIOS Type 39 to be modified using DMIEdit
+// [Files] SmbiosBoard.c
+// Smbios.h
+// SmbiosDynamicData.h
+// Smbios.c
+// SmbiosDmieditFunc.c
+// SmbiosNvramFunc.c
+//
+// 5 3/02/11 11:47a Davidd
+// [TAG] EIP54264
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] Data is assumed valid without checking after some
+// GetVariable calls
+// [RootCause] No error checking
+// [Solution] Problem has been fixed with code changes
+// [Files] SmbiosNvramFunc.c
+// SmbiosDMIEditFunc.c
+//
+// 4 1/14/11 3:57p Davidd
+// [TAG] EIP50564
+// [Category] Bug Fix
+// [Severity] Normal
+// [Symptom] BIOS can't keep DMI data after flash BIOS with /p /b /n /r
+// parameters
+// [RootCause] Side effect of previous changes (NVRAM variable name
+// format
+// has been changed)
+// [Solution] Problem has been fixed with code changes
+// [Files] SmbiosNvramFunc.c
+//
+// 3 10/21/10 11:36a Davidd
+// [TAG] EIP46394
+// [Category] BUG FIX
+// [Severity] Important
+// [Symptom] Incorrect variable size for GetVariable() usage in
+// Smbios module
+// [RootCause] GetVariable is called with incorrect "DataSize" type.
+// [Solution] Corrected "DataSize" type in all GetVariable calls.
+// [Files]
+// Smbios.c
+// SmbiosDMIEditFunc.c
+// SmbiosNvramFunc.c
+//
+// 2 12/04/09 3:28p Davidd
+// Corrected the DMIEdit data not updated after being updated 5-6 times
+// (when NVRAM is used to store DMIEdit data) - EIP 30837.
+//
+// 1 2/02/09 4:21p Davidd
+// Initial checkin
+//
+//**********************************************************************//
+
+#include <AmiDxeLib.h>
+#include <Token.h>
+#include "Protocol\Smbios.h"
+#include "SmbiosDMIEdit.h"
+
+#if SMBIOS_DMIEDIT_DATA_LOC == 2
+static BOOLEAN DmiEditVarPresent = FALSE;
+EFI_GUID gEfiSmbiosNvramGuid = EFI_SMBIOS_NVRAM_DATA_GUID;
+CHAR16 *DmiArrayVar = L"DmiArray";
+DMI_VAR DmiArray[DMI_ARRAY_COUNT] = {0};
+UINTN DmiArraySize = DMI_ARRAY_COUNT * sizeof(DMI_VAR);
+CHAR16 *S1 = L" ";
+UINT8 DmiData[0x1000];
+UINT8 *DmiDataPtr;
+UINT8 Buffer[0x400];
+UINTN BufferSize;
+UINTN DmiDataLength[DMI_ARRAY_COUNT];
+UINT8 gRecoveryKeepDMIFlag = FALSE;
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: PreserveDmiEditData
+//
+// Description: Preserve the DMIEdit data by loading its data into memory
+// prior to flashing
+//
+// Input: None
+//
+// Output: None
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+PreserveDmiEditData (VOID)
+{
+ EFI_STATUS Status;
+ UINT8 Count;
+ UINT8 Index;
+
+ //
+ // Get number of DMI data records in NVRAM
+ //
+ // Note: DMI data record actually starts with record #1,
+ // first record #0 holds total number of DMI data records
+ // instead of TABLE_INFO
+ // ===> DmiArray[0].Type = count
+ //
+ Status = pRS->GetVariable(
+ DmiArrayVar,
+ &gEfiSmbiosNvramGuid,
+ NULL,
+ &DmiArraySize,
+ &DmiArray[0]);
+
+ if (Status == EFI_SUCCESS) {
+ DmiDataPtr = DmiData;
+
+ Count = DmiArray[0].Type; // Note: DmiArray[0] has count #
+
+ // Get DMI data into memory. The data will be saved back into
+ // NVRAM later in RestoreDmiEditData
+ for (Index = 0; Index < Count; Index++) {
+ Swprintf(S1, L"DmiVar%02x%04x%02x%02x",
+ DmiArray[Index + 1].Type,
+ DmiArray[Index + 1].Handle,
+ DmiArray[Index + 1].Offset,
+ DmiArray[Index + 1].Flags);
+
+ BufferSize = sizeof(Buffer);
+ Status = pRS->GetVariable(
+ S1,
+ &gEfiSmbiosNvramGuid,
+ NULL,
+ &BufferSize,
+ &Buffer);
+
+ if (Status == EFI_SUCCESS) {
+ MemCpy(DmiDataPtr, Buffer, BufferSize);
+ DmiDataLength[Index] = BufferSize;
+ DmiDataPtr += BufferSize;
+ }
+ else {
+ DmiDataLength[Index] = 0;
+ }
+ }
+
+ DmiEditVarPresent = TRUE;
+ }
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: RestoreDmiEditData
+//
+// Description: Restore the DMIEdit data in NVRAM with data previously loaded
+// in memory by PreserveDmiEditData.
+//
+// Input: None
+//
+// Output: None
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+RestoreDmiEditData (VOID)
+{
+ UINT8 Count;
+ UINT8 Index;
+
+ // DMI data were read and saved in memory in PreserveDmiEditData.
+ // Now save DMI data back into NVRAM if present
+ if (DmiEditVarPresent) {
+ pRS->SetVariable(
+ DmiArrayVar,
+ &gEfiSmbiosNvramGuid,
+ EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ DmiArraySize,
+ &DmiArray[0]);
+
+ DmiDataPtr = DmiData;
+
+ Count = DmiArray[0].Type; // Note: DmiArray[0] has count # instead of Type/Offset
+
+ for (Index = 0; Index < Count; Index++) {
+ Swprintf(S1, L"DmiVar%02x%04x%02x%02x",
+ DmiArray[Index + 1].Type,
+ DmiArray[Index + 1].Handle,
+ DmiArray[Index + 1].Offset,
+ DmiArray[Index + 1].Flags);
+
+ pRS->SetVariable(
+ S1,
+ &gEfiSmbiosNvramGuid,
+ EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ DmiDataLength[Index],
+ DmiDataPtr);
+
+ DmiDataPtr += DmiDataLength[Index];
+ }
+ }
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: RecoveryPreserveDmiEditData
+//
+// Description: Preserve the DMIEdit data by loading its data into memory
+// prior to flashing (for capsule mode)
+//
+// Input: None
+//
+// Output: None
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+RecoveryPreserveDmiEditData (VOID)
+{
+ EFI_STATUS Status;
+ EFI_GUID gEfiSmbiosNvramGuid = {0x4b3082a3, 0x80c6, 0x4d7e, { 0x9c, 0xd0, 0x58, 0x39, 0x17, 0x26, 0x5d, 0xf1 }};
+ CHAR16 *PreserveSmbiosNvramVar = L"PreserveSmbiosNvramVar";
+ UINTN Size = sizeof (UINT8);
+ UINT32 PreserveSmbiosNvram;
+
+ gRecoveryKeepDMIFlag = FALSE;
+
+ Status = pRS->GetVariable (
+ PreserveSmbiosNvramVar,
+ &gEfiSmbiosNvramGuid,
+ NULL,
+ &Size,
+ &PreserveSmbiosNvram
+ );
+
+ if (!EFI_ERROR (Status)) {
+ gRecoveryKeepDMIFlag = TRUE;
+ PreserveDmiEditData ();
+ }
+
+ Status = pRS->SetVariable (
+ PreserveSmbiosNvramVar,
+ &gEfiSmbiosNvramGuid,
+ EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
+ 0,
+ NULL
+ );
+ ASSERT_EFI_ERROR(Status);
+}
+
+//<AMI_PHDR_START>
+//----------------------------------------------------------------------------
+// Procedure: RecoveryRestoreDmiEditData
+//
+// Description: Restore the DMIEdit data in NVRAM with data previously loaded
+// in memory by PreserveDmiEditData (for capsule mode)
+//
+// Input: None
+//
+// Output: None
+//
+// Modified:
+//
+// Referrals:
+//
+// Notes:
+//----------------------------------------------------------------------------
+//<AMI_PHDR_END>
+VOID
+RecoveryRestoreDmiEditData (VOID)
+{
+ if (gRecoveryKeepDMIFlag) {
+ RestoreDmiEditData ();
+ }
+
+ gRecoveryKeepDMIFlag = FALSE;
+}
+#endif
+
+//**********************************************************************//
+//**********************************************************************//
+//** **//
+//** (C)Copyright 1985-2015, American Megatrends, Inc. **//
+//** **//
+//** All Rights Reserved. **//
+//** **//
+//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 **//
+//** **//
+//** Phone: (770)-246-8600 **//
+//** **//
+//**********************************************************************//
+//**********************************************************************//