Liming, Got it. Already send a mail which include edk2-platform. Will include edk2-platform/devel-MinPlatform if V2 version patch needs.
Thanks, Eric > -----Original Message----- > From: Gao, Liming > Sent: Tuesday, May 7, 2019 3:32 PM > To: devel@edk2.groups.io; Dong, Eric <eric.d...@intel.com> > Subject: RE: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos > related libraries. > > 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/PlatformCmos > Acc > >essLib.h > > create mode 100644 > >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA > cc > >essLib.c > > create mode 100644 > >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA > cc > >essLib.inf > > create mode 100644 > >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA > cc > >essLibInternal.h > > create mode 100644 > >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib > N > >ull/PlatformCmosAccessLibNull.c > > create mode 100644 > >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib > N > >ull/PlatformCmosAccessLibNull.inf > > > >diff --git > >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessL > ib > >.h > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccess > Lib > >.h > >new file mode 100644 > >index 0000000..5f5029c > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccess > Lib > >.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/PlatformCmo > s > >AccessLib.h > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCm > os > >AccessLib.h > >new file mode 100644 > >index 0000000..8c44ae2 > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCm > os > >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/Cmos > A > >ccessLib.c > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > sA > >ccessLib.c > >new file mode 100644 > >index 0000000..403d8ff > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > sA > >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/Cmos > A > >ccessLib.inf > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > sA > >ccessLib.inf > >new file mode 100644 > >index 0000000..9decaf4 > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > sA > >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/Cmos > A > >ccessLibInternal.h > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > sA > >ccessLibInternal.h > >new file mode 100644 > >index 0000000..9b6d086 > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > sA > >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/PlatformCmosAccess > Lib > >Null/PlatformCmosAccessLibNull.c > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess > Lib > >Null/PlatformCmosAccessLibNull.c > >new file mode 100644 > >index 0000000..b24a3f5 > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess > Lib > >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/PlatformCmosAccess > Lib > >Null/PlatformCmosAccessLibNull.inf > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess > Lib > >Null/PlatformCmosAccessLibNull.inf > >new file mode 100644 > >index 0000000..4816464 > >--- /dev/null > >+++ > >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess > Lib > >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 (#40087): https://edk2.groups.io/g/devel/message/40087 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] -=-=-=-=-=-=-=-=-=-=-=-