Eric: The title should include edk2-platform/ devel-MinPlatform so that people know this patch for edk2-platform devel-MinPlatform branch.
>-----Original Message----- >From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of >Dong, Eric >Sent: Tuesday, May 07, 2019 3:28 PM >To: devel@edk2.groups.io >Cc: Ni, Ray <ray...@intel.com>; Kubacki, Michael A ><michael.a.kuba...@intel.com>; Desimone, Nathaniel L ><nathaniel.l.desim...@intel.com> >Subject: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related >libraries. > >https://bugzilla.tianocore.org/show_bug.cgi?id=1552 > >Add two libraries used to provide CMOS related operation. > >CmosAccessLib exports below APIs: > CmosWrite32 > CmosWrite16 > CmosWrite8 > CmosRead32 > CmosRead16 > CmosRead8 > CmosInit > >PlatformCmosAccessLib export below APIs: > PlatformCmosGetEntry > PlatformCmosGetNmiState > >PlatformCmosAccessLib will be consumed by CmosAccessLib. > >Cc: Ray Ni <ray...@intel.com> >Cc: Michael Kubacki <michael.a.kuba...@intel.com> >Cc: Nate Desimone <nathaniel.l.desim...@intel.com> >Signed-off-by: Eric Dong <eric.d...@intel.com> >--- > .../Cmos/Include/Library/CmosAccessLib.h | 112 ++++ > .../Include/Library/PlatformCmosAccessLib.h | 74 +++ > .../Library/CmosAccessLib/CmosAccessLib.c | 492 ++++++++++++++++++ > .../Library/CmosAccessLib/CmosAccessLib.inf | 34 ++ > .../CmosAccessLib/CmosAccessLibInternal.h | 41 ++ > .../PlatformCmosAccessLibNull.c | 45 ++ > .../PlatformCmosAccessLibNull.inf | 30 ++ > 7 files changed, 828 insertions(+) > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAcc >essLib.h > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >essLib.c > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >essLib.inf > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >essLibInternal.h > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN >ull/PlatformCmosAccessLibNull.c > create mode 100644 >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN >ull/PlatformCmosAccessLibNull.inf > >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib >.h >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib >.h >new file mode 100644 >index 0000000..5f5029c >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib >.h >@@ -0,0 +1,112 @@ >+/** @file >+ CmosAccessLib header file. >+ >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+This program and the accompanying materials are licensed and made >available under >+the terms and conditions of the BSD License that accompanies this >distribution. >+The full text of the license may be found at >+http://opensource.org/licenses/bsd-license.php. >+ >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+ >+**/ >+ >+#ifndef _CMOS_ACCESS_LIB_H_ >+#define _CMOS_ACCESS_LIB_H_ >+ >+/** >+ Read a byte value from a CMOS address. >+ >+ @param [in] Address Location to read from CMOS >+ >+ @return The byte value read from the CMOS address. >+**/ >+UINT8 >+EFIAPI >+CmosRead8 ( >+ IN UINT8 Address >+ ); >+ >+/** >+ Write a byte value to a CMOS address. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The byte value write to the CMOS address. >+**/ >+VOID >+EFIAPI >+CmosWrite8 ( >+ IN UINT8 Address, >+ IN UINT8 Data >+ ); >+ >+/** >+ Read a word value from a CMOS address. >+ >+ @param [in] Address Location to read from CMOS >+ >+ @return The word value read from the CMOS address. >+**/ >+UINT16 >+EFIAPI >+CmosRead16 ( >+ IN UINT8 Address >+ ); >+ >+/** >+ Write a word value to a CMOS address. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The word value write to the CMOS address. >+**/ >+VOID >+EFIAPI >+CmosWrite16 ( >+ IN UINT8 Address, >+ IN UINT16 Data >+ ); >+ >+/** >+ Read a dword value from a CMOS address. >+ >+ @param [in] Address Location to read from CMOS >+ >+ @return The dword value read from the CMOS address. >+**/ >+UINT32 >+EFIAPI >+CmosRead32 ( >+ IN UINT8 Address >+ ); >+ >+/** >+ Write a dword value to a CMOS address. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The dword value write to the CMOS address. >+**/ >+VOID >+EFIAPI >+CmosWrite32 ( >+ IN UINT8 Address, >+ IN UINT32 Data >+ ); >+ >+/** >+ Initialize the CMOS. >+ >+ It initialize the CMOS area when Force is TRUE or the checksum is incorrect. >+ >+ @param[in] Force TRUE indicating initializing the CMOS area without >checking the checksum. >+ >+ @retval TRUE The CMOS is initialized to default value. >+ @retval FALSE The CMOS isn't initialized to default value. >+**/ >+BOOLEAN >+EFIAPI >+CmosInit ( >+ IN BOOLEAN Force >+ ); >+ >+#endif // _CMOS_ACCESS_LIB_H_ >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos >AccessLib.h >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos >AccessLib.h >new file mode 100644 >index 0000000..8c44ae2 >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos >AccessLib.h >@@ -0,0 +1,74 @@ >+/** @file >+ Platform CMOS Access Library Header File. >+ >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+This program and the accompanying materials are licensed and made >available under >+the terms and conditions of the BSD License that accompanies this >distribution. >+The full text of the license may be found at >+http://opensource.org/licenses/bsd-license.php. >+ >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+ >+**/ >+ >+#ifndef _PLATFORM_CMOS_ACCESS_LIB_H_ >+#define _PLATFORM_CMOS_ACCESS_LIB_H_ >+ >+/// >+/// Flag indicating checksum calculation doesn't include this location. >+/// NOTE: If a location isn't shown in platform CMOS entry table, >+/// it means checksum calculation doesn't include the location. >+/// >+#define CMOS_EXCLUDE_FROM_CHECKSUM BIT0 >+ >+/// >+/// Flag indicating initialization doesn't cover this location. >+/// NOTE: If a location isn't shown in platform CMOS entry table, >+/// it means the location is initialized with CMOS_DEFAULT_VALUE (0). >+/// >+#define CMOS_EXCLUDE_FROM_INIT_DATA BIT1 >+ >+/// >+/// Flag indicating the location cannot be accessed. >+/// NOTE: 0x0 ~ 0xD is implictly inaccessible. >+/// >+#define CMOS_EXCLUDE_FROM_ACCESS (BIT3 | >CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA) >+ >+/// >+/// Flag indicating the checksum location >+/// NOTE: At most two entries can have this flag set. >+/// >+#define CMOS_CHECKSUM_LOCATION (BIT2 | >CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA) >+ >+#define CMOS_DEFAULT_VALUE 0x00 >+ >+typedef struct { >+ UINT8 Address; >+ UINT8 DefaultValue; >+ UINT8 Attributes; >+} CMOS_ENTRY; >+ >+/** >+ Return the platform CMOS entries. >+ >+ @param [out] EntryCount Return the count of platform CMOS entries. >+ >+ @return Platform CMOS entries. >+**/ >+CMOS_ENTRY * >+EFIAPI >+PlatformCmosGetEntry ( >+ OUT UINTN *EntryCount >+ ); >+ >+/** >+ Return the NMI enable status. >+**/ >+BOOLEAN >+EFIAPI >+PlatformCmosGetNmiState ( >+ VOID >+ ); >+ >+#endif // _PLATFORM_CMOS_ACCESS_LIB_H_ >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLib.c >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLib.c >new file mode 100644 >index 0000000..403d8ff >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLib.c >@@ -0,0 +1,492 @@ >+/** @file >+ CmosAccessLib implementation. >+ >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+This program and the accompanying materials are licensed and made >available under >+the terms and conditions of the BSD License that accompanies this >distribution. >+The full text of the license may be found at >+http://opensource.org/licenses/bsd-license.php. >+ >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+ >+**/ >+ >+#include "CmosAccessLibInternal.h" >+ >+/** >+ Return the entry for the specified address in entries returned >+ from platform. >+ >+ @param [in] Address The CMOS address to find. >+ >+ @return A pointer to CMOS_ENTRY for the specified address, >+ or NULL if not found. >+**/ >+CMOS_ENTRY * >+CmosAccessLibLocateEntry ( >+ IN UINT8 Address >+ ) >+{ >+ UINTN Index; >+ UINTN Count; >+ CMOS_ENTRY *Entries; >+ >+ Entries = PlatformCmosGetEntry (&Count); >+ for (Index = 0; Index < Count; Index++) { >+ if (Entries[Index].Address == Address) { >+ return &Entries[Index]; >+ } >+ } >+ >+ return NULL; >+} >+ >+/** >+ Test the attributes of the Entry and return ValueIfSet if test passes >+ or !ValueIfSet if test fails. It returns DefaultValue if the Entry is >+ NULL. >+ >+ @param [in] Address The CMOS address. >+ @param [in] Attributes The attributes to test. >+ @param [in] ValueIfSet The value to return if test passes. >+ @param [in] DefaultValue The value to return if Entry is NULL. >+ @param [in] Entry Pointer to entry. >+ >+ @retval ValueIfSet If test passes. >+ @retval !ValueIfSet If test fails. >+ @retval DefaultValue If the Entry is NULL. >+**/ >+BOOLEAN >+CmosAccessLibCheckAttribute ( >+ IN UINT8 Address, >+ IN UINT8 Attributes, >+ IN BOOLEAN ValueIfSet, >+ IN BOOLEAN DefaultValue, >+ IN CMOS_ENTRY *Entry OPTIONAL >+ ) >+{ >+ if (Entry != NULL) { >+ ASSERT (Entry->Address == Address); >+ if ((Entry->Attributes & Attributes) == Attributes) { >+ return ValueIfSet; >+ } else { >+ return !ValueIfSet; >+ } >+ } >+ >+ return DefaultValue; >+} >+ >+/** >+ Check if the CMOS address needs Checksum calculation. >+ >+ @param [in] Address CMOS address to be checked >+ @param [in] Entry Pointer to entry. >+ >+ @retval TRUE CMOS address needs Checksum calculation. >+ @retval FALSE CMOS address doesn't need Checksum calculation. >+**/ >+BOOLEAN >+CmosAccessLibNeedChecksum ( >+ IN UINT8 Address, >+ IN CMOS_ENTRY *Entry OPTIONAL >+ ) >+{ >+ return CmosAccessLibCheckAttribute (Address, >CMOS_EXCLUDE_FROM_CHECKSUM, FALSE, FALSE, Entry); >+} >+ >+ >+/** >+ Check if the CMOS address needs to fill default data. >+ >+ @param [in] Address CMOS address to be checked >+ @param [in] Entry Pointer to entry. >+ >+ @retval TRUE CMOS address need to fill default data. >+ @retval FALSE CMOS address doesn't need to fill default data. >+**/ >+BOOLEAN >+CmosAccessLibNeedFillDefault ( >+ IN UINT8 Address, >+ IN CMOS_ENTRY *Entry OPTIONAL >+ ) >+{ >+ return CmosAccessLibCheckAttribute (Address, >CMOS_EXCLUDE_FROM_INIT_DATA, FALSE, TRUE, Entry); >+} >+ >+/** >+ Check if the CMOS address is accessible. >+ >+ @param [in] Address CMOS address to be checked. >+ @param [in] Entry Pointer to entry. >+ >+ @retval TRUE CMOS address is accessible. >+ @retval FALSE CMOS address isn't accessible. >+**/ >+BOOLEAN >+CmosAccessLibIsAccessible ( >+ IN UINT8 Address, >+ IN CMOS_ENTRY *Entry OPTIONAL >+ ) >+{ >+ // >+ // CMOS 0-9, A, B, C, D are for RTC. >+ // >+ if (Address <= 0xD) { >+ return FALSE; >+ } >+ return CmosAccessLibCheckAttribute (Address, >CMOS_EXCLUDE_FROM_ACCESS, FALSE, TRUE, Entry); >+} >+ >+/** >+ Return the CMOS location to store checksum. >+ >+ @param [out] Location Return the CMOS location to store the checksum. >+**/ >+VOID >+CmosAccessLibGetChecksumLocation ( >+ OUT CMOS_CHECKSUM_LOCATION_INFO *Location >+ ) >+{ >+ UINTN Index; >+ UINTN Count; >+ CMOS_ENTRY *Entries; >+ >+ Location->Length = 0; >+ >+ Entries = PlatformCmosGetEntry (&Count); >+ for (Index = 0; Index < Count; Index++) { >+ if ((Entries[Index].Attributes & CMOS_CHECKSUM_LOCATION) == >CMOS_CHECKSUM_LOCATION) { >+ Location->Length++; >+ if (Location->Length == 1) { >+ Location->LowByteAddress = Entries[Index].Address; >+ } else if (Location->Length == 2) { >+ Location->HighByteAddress = Entries[Index].Address; >+ break; >+ } >+ } >+ } >+ >+ ASSERT (Location->Length <= 2); >+} >+ >+/** >+ Calculate the sum of CMOS values who need checksum calculation. >+ >+ @param [in] Location The CMOS location to store the checksum. >+ >+ @return The sum. >+**/ >+UINT16 >+CmosAccessLibCalculateSum ( >+ IN CMOS_CHECKSUM_LOCATION_INFO *Location >+ ) >+{ >+ UINT16 Sum; >+ UINTN Index; >+ UINTN Count; >+ CMOS_ENTRY *Entries; >+ >+ if (Location->Length == 0) { >+ return 0; >+ } >+ >+ Sum = 0; >+ Entries = PlatformCmosGetEntry (&Count); >+ for (Index = 0; Index < Count; Index++) { >+ if (CmosAccessLibNeedChecksum (Entries[Index].Address, >&Entries[Index])) { >+ Sum += CmosRead8 (Entries[Index].Address); >+ } >+ } >+ >+ if (Location->Length == 1) { >+ return (UINT8) Sum; >+ } else { >+ return Sum; >+ } >+} >+ >+/** >+ Return the checksum value stored in CMOS. >+ >+ @param [in] Location The CMOS location to store the checksum. >+ >+ @return The checksum value. >+**/ >+UINT16 >+CmosAccessLibReadChecksum ( >+ IN CMOS_CHECKSUM_LOCATION_INFO *Location >+ ) >+{ >+ UINT16 Checksum; >+ >+ Checksum = 0; >+ >+ switch (Location->Length) { >+ case 2: >+ Checksum = (CmosRead8 (Location->HighByteAddress) << 8); >+ // >+ // Fall to case 1 to get the low byte value >+ // >+ case 1: >+ Checksum += CmosRead8 (Location->LowByteAddress); >+ break; >+ >+ default: >+ break; >+ } >+ return Checksum; >+} >+ >+ >+/** >+ Write the Checksum to appropriate address. >+ >+ @param [in] Location The CMOS location to store the checksum. >+ @param [in] Checksum The checksum value. >+**/ >+VOID >+CmosAccessLibWriteChecksum ( >+ CMOS_CHECKSUM_LOCATION_INFO *Location, >+ IN UINT16 Checksum >+ ) >+{ >+ >+ switch (Location->Length) { >+ case 0: >+ break; >+ case 2: >+ CmosWrite8 (Location->HighByteAddress, Checksum >> 8); >+ // >+ // Fall to case 1 to update low byte value >+ // >+ case 1: >+ CmosWrite8 (Location->LowByteAddress, (UINT8) Checksum); >+ break; >+ } >+} >+ >+/** >+ Read a byte value from a CMOS address. >+ >+ @param [in] Address Location to read from CMOS >+ >+ @return The byte value read from the CMOS address. >+**/ >+UINT8 >+EFIAPI >+CmosRead8 ( >+ IN UINT8 Address >+ ) >+{ >+ if (!CmosAccessLibIsAccessible (Address, CmosAccessLibLocateEntry >(Address))) { >+ return 0xFF; >+ } >+ >+ if (Address <= CMOS_BANK0_LIMIT) { >+ if (PlatformCmosGetNmiState ()) { >+ Address |= BIT7; >+ } >+ IoWrite8 (PORT_70, Address); >+ return IoRead8 (PORT_71); >+ } else { >+ IoWrite8 (PORT_72, Address); >+ return IoRead8 (PORT_73); >+ } >+} >+ >+/** >+ Write a byte value to a CMOS address. >+ >+ It's an internal function that doesn't update the checksum. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The byte value write to the CMOS address. >+**/ >+VOID >+CmosAccessLibICmosWrite8 ( >+ IN UINT8 Address, >+ IN UINT8 Data >+ ) >+{ >+ if (Address <= CMOS_BANK0_LIMIT) { >+ if (PlatformCmosGetNmiState ()) { >+ Address |= BIT7; >+ } >+ IoWrite8 (PORT_70, Address); >+ IoWrite8 (PORT_71, Data); >+ } else { >+ IoWrite8 (PORT_72, Address); >+ IoWrite8 (PORT_73, Data); >+ } >+} >+ >+/** >+ Write a byte value to a CMOS address. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The byte value write to the CMOS address. >+**/ >+VOID >+EFIAPI >+CmosWrite8 ( >+ IN UINT8 Address, >+ IN UINT8 Data >+ ) >+{ >+ UINT8 OriginalData; >+ CMOS_ENTRY *Entry; >+ CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation; >+ >+ Entry = CmosAccessLibLocateEntry (Address); >+ >+ if (!CmosAccessLibIsAccessible (Address, Entry)) { >+ return; >+ } >+ >+ OriginalData = CmosRead8 (Address); >+ >+ CmosAccessLibICmosWrite8 (Address, Data); >+ >+ if (CmosAccessLibNeedChecksum (Address, Entry)) { >+ // >+ // Sum of Data + Checksum = New Sum of Data + New Checksum = 0 >+ // New Sum of Data - Sum of Data = Checksum - New Checksum >+ // New Checksum = Checksum - (New Sum of Data - Sum of Data) >+ // >+ CmosAccessLibGetChecksumLocation (&ChecksumLocation); >+ CmosAccessLibWriteChecksum ( >+ &ChecksumLocation, >+ CmosAccessLibReadChecksum (&ChecksumLocation) - (Data - >OriginalData) >+ ); >+ } >+} >+ >+/** >+ Read a word value from a CMOS address. >+ >+ @param [in] Address Location to read from CMOS >+ >+ @return The word value read from the CMOS address. >+**/ >+UINT16 >+EFIAPI >+CmosRead16 ( >+ IN UINT8 Address >+ ) >+{ >+ return CmosRead8 (Address) + (CmosRead8 (Address + 1) << 8); >+} >+ >+/** >+ Write a word value to a CMOS address. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The word value write to the CMOS address. >+**/ >+VOID >+EFIAPI >+CmosWrite16 ( >+ IN UINT8 Address, >+ IN UINT16 Data >+ ) >+{ >+ CmosWrite8 (Address, (UINT8) Data); >+ CmosWrite8 (Address + 1, (UINT8) (Data >> 8)); >+} >+ >+/** >+ Read a dword value from a CMOS address. >+ >+ @param [in] Address Location to read from CMOS >+ >+ @return The dword value read from the CMOS address. >+**/ >+UINT32 >+EFIAPI >+CmosRead32 ( >+ IN UINT8 Address >+ ) >+{ >+ return CmosRead16 (Address) + (CmosRead16 (Address + 2) << 16); >+} >+ >+/** >+ Write a dword value to a CMOS address. >+ >+ @param [in] Address Location to write to CMOS. >+ @param [in] Data The dword value write to the CMOS address. >+**/ >+VOID >+EFIAPI >+CmosWrite32 ( >+ IN UINT8 Address, >+ IN UINT32 Data >+ ) >+{ >+ CmosWrite16 (Address, (UINT16) Data); >+ CmosWrite16 (Address + 2, (UINT16) (Data >> 16)); >+} >+ >+ >+/** >+ Initialize the CMOS. >+ >+ It initialize the CMOS area when Force is TRUE or the checksum is incorrect. >+ >+ @param[in] Force TRUE indicating initializing the CMOS area without >checking the checksum. >+ >+ @retval TRUE The CMOS is initialized to default value. >+ @retval FALSE The CMOS isn't initialized to default value. >+**/ >+BOOLEAN >+EFIAPI >+CmosInit ( >+ IN BOOLEAN Force >+ ) >+{ >+ UINTN Address; >+ CMOS_ENTRY *Entry; >+ CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation; >+ UINT16 Checksum; >+ >+ CmosAccessLibGetChecksumLocation (&ChecksumLocation); >+ >+ if (!Force) { >+ // >+ // Initialize the CMOS area when checksum is incorrect. >+ // >+ Checksum = CmosAccessLibCalculateSum (&ChecksumLocation) + >CmosAccessLibReadChecksum (&ChecksumLocation); >+ if (ChecksumLocation.Length == 1) { >+ Checksum = (UINT8) Checksum; >+ } >+ >+ if (Checksum != 0) { >+ Force = TRUE; >+ } >+ } >+ >+ if (Force) { >+ // >+ // Traverse through entire CMOS location and fill it with zero >+ // >+ for (Address = 0; Address <= CMOS_BANK1_LIMIT; Address++) { >+ Entry = CmosAccessLibLocateEntry ((UINT8) Address); >+ if (CmosAccessLibNeedFillDefault ((UINT8) Address, Entry)) { >+ CmosAccessLibICmosWrite8 ((UINT8) Address, (Entry == NULL) ? >CMOS_DEFAULT_VALUE : Entry->DefaultValue); >+ } >+ } >+ >+ // >+ // Write the New checksum to the Checksum field >+ // >+ CmosAccessLibWriteChecksum ( >+ &ChecksumLocation, >+ (UINT16) (0x10000 - CmosAccessLibCalculateSum (&ChecksumLocation)) >+ ); >+ return TRUE; >+ } >+ >+ return FALSE; >+} >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLib.inf >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLib.inf >new file mode 100644 >index 0000000..9decaf4 >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLib.inf >@@ -0,0 +1,34 @@ >+### @file >+# Library producing CMOS access functionality. >+# >+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+# >+# This program and the accompanying materials are licensed and made >available under >+# the terms and conditions of the BSD License which accompanies this >distribution. >+# The full text of the license may be found at >+# http://opensource.org/licenses/bsd-license.php >+# >+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+# >+### >+[Defines] >+ INF_VERSION = 0x00010005 >+ BASE_NAME = CmosAccessLib >+ FILE_GUID = FF6B645D-C001-4ACE-9CA1-199F97C2D601 >+ VERSION_STRING = 1.0 >+ MODULE_TYPE = BASE >+ LIBRARY_CLASS = CmosAccessLib >+ >+[Sources] >+ CmosAccessLib.c >+ CmosAccessLibInternal.h >+ >+[LibraryClasses] >+ IoLib >+ DebugLib >+ PlatformCmosAccessLib >+ >+[Packages] >+ MdePkg/MdePkg.dec >+ AdvancedFeaturePkg/AdvancedFeaturePkg.dec >\ No newline at end of file >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLibInternal.h >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLibInternal.h >new file mode 100644 >index 0000000..9b6d086 >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >ccessLibInternal.h >@@ -0,0 +1,41 @@ >+/** @file >+ CmosAccessLib internal header file. >+ >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+This program and the accompanying materials are licensed and made >available under >+the terms and conditions of the BSD License that accompanies this >distribution. >+The full text of the license may be found at >+http://opensource.org/licenses/bsd-license.php. >+ >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+ >+**/ >+ >+#ifndef _CMOS_ACCESS_LIB_INTERNALS_ >+#define _CMOS_ACCESS_LIB_INTERNALS_ >+ >+#include <Base.h> >+#include <Uefi.h> >+#include <Library/IoLib.h> >+#include <Library/DebugLib.h> >+#include <Library/CmosAccessLib.h> >+#include <Library/PlatformCmosAccessLib.h> >+ >+// CMOS access Port address >+ >+#define PORT_70 0x70 >+#define PORT_71 0x71 >+#define PORT_72 0x72 >+#define PORT_73 0x73 >+ >+#define CMOS_BANK0_LIMIT 0x7F >+#define CMOS_BANK1_LIMIT 0xFF >+ >+typedef struct { >+ UINT8 Length; >+ UINT8 LowByteAddress; >+ UINT8 HighByteAddress; >+} CMOS_CHECKSUM_LOCATION_INFO; >+ >+#endif // _CMOS_ACCESS_LIB_INTERNALS_ >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib >Null/PlatformCmosAccessLibNull.c >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib >Null/PlatformCmosAccessLibNull.c >new file mode 100644 >index 0000000..b24a3f5 >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib >Null/PlatformCmosAccessLibNull.c >@@ -0,0 +1,45 @@ >+/** @file >+ Platform CMOS Access Library. >+ >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+This program and the accompanying materials are licensed and made >available under >+the terms and conditions of the BSD License that accompanies this >distribution. >+The full text of the license may be found at >+http://opensource.org/licenses/bsd-license.php. >+ >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+ >+**/ >+ >+#include <Base.h> >+#include <Library/PlatformCmosAccessLib.h> >+ >+/** >+ Return the platform CMOS entries. >+ >+ @param [out] EntryCount Return the count of platform CMOS entries. >+ >+ @return Platform CMOS entries. >+**/ >+CMOS_ENTRY * >+EFIAPI >+PlatformCmosGetEntry ( >+ OUT UINTN *EntryCount >+ ) >+{ >+ *EntryCount = 0; >+ return NULL; >+} >+ >+/** >+ Return the NMI enable status. >+**/ >+BOOLEAN >+EFIAPI >+PlatformCmosGetNmiState ( >+ VOID >+ ) >+{ >+ return FALSE; >+} >diff --git >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib >Null/PlatformCmosAccessLibNull.inf >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib >Null/PlatformCmosAccessLibNull.inf >new file mode 100644 >index 0000000..4816464 >--- /dev/null >+++ >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib >Null/PlatformCmosAccessLibNull.inf >@@ -0,0 +1,30 @@ >+### @file >+# Library producing CMOS access functionalities are relevant to platform. >+# >+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> >+# >+# This program and the accompanying materials are licensed and made >available under >+# the terms and conditions of the BSD License which accompanies this >distribution. >+# The full text of the license may be found at >+# http://opensource.org/licenses/bsd-license.php >+# >+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" >BASIS, >+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER >EXPRESS OR IMPLIED. >+# >+### >+ >+[Defines] >+ INF_VERSION = 0x00010005 >+ BASE_NAME = PlatformCmosAccessLib >+ FILE_GUID = C315A8B6-FF6C-41D1-A934-7330501F308C >+ VERSION_STRING = 1.0 >+ MODULE_TYPE = BASE >+ LIBRARY_CLASS = PlatformCmosAccessLib >+ >+ >+[Sources] >+ PlatformCmosAccessLibNull.c >+ >+[Packages] >+ MdePkg/MdePkg.dec >+ AdvancedFeaturePkg/AdvancedFeaturePkg.dec >\ No newline at end of file >-- >2.21.0.windows.1 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#40086): https://edk2.groups.io/g/devel/message/40086 Mute This Topic: https://groups.io/mt/31529598/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-