From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: liming.gao@intel.com) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by groups.io with SMTP; Tue, 07 May 2019 00:31:50 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 May 2019 00:31:50 -0700 X-ExtLoop1: 1 Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga007.fm.intel.com with ESMTP; 07 May 2019 00:31:50 -0700 Received: from fmsmsx101.amr.corp.intel.com (10.18.124.199) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 7 May 2019 00:31:50 -0700 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by fmsmsx101.amr.corp.intel.com (10.18.124.199) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 7 May 2019 00:31:34 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.33]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.216]) with mapi id 14.03.0415.000; Tue, 7 May 2019 15:31:32 +0800 From: "Liming Gao" To: "devel@edk2.groups.io" , "Dong, Eric" Subject: Re: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Topic: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Index: AQHVBKZ1RPH5viGUN0u9EF1V4ZwRe6ZfRBTw Date: Tue, 7 May 2019 07:31:32 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E443F9C@SHSMSX104.ccr.corp.intel.com> References: <20190507072757.15068-1-eric.dong@intel.com> In-Reply-To: <20190507072757.15068-1-eric.dong@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Return-Path: liming.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable 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 ; Kubacki, Michael A >; Desimone, Nathaniel L > >Subject: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related >libraries. > >https://bugzilla.tianocore.org/show_bug.cgi?id=3D1552 > >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 >Cc: Michael Kubacki >Cc: Nate Desimone >Signed-off-by: Eric Dong >--- > .../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.
>+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 inco= rrect. >+ >+ @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.
>+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.
>+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 =3D PlatformCmosGetEntry (&Count); >+ for (Index =3D 0; Index < Count; Index++) { >+ if (Entries[Index].Address =3D=3D 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 !=3D NULL) { >+ ASSERT (Entry->Address =3D=3D Address); >+ if ((Entry->Attributes & Attributes) =3D=3D 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 <=3D 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 =3D 0; >+ >+ Entries =3D PlatformCmosGetEntry (&Count); >+ for (Index =3D 0; Index < Count; Index++) { >+ if ((Entries[Index].Attributes & CMOS_CHECKSUM_LOCATION) =3D=3D >CMOS_CHECKSUM_LOCATION) { >+ Location->Length++; >+ if (Location->Length =3D=3D 1) { >+ Location->LowByteAddress =3D Entries[Index].Address; >+ } else if (Location->Length =3D=3D 2) { >+ Location->HighByteAddress =3D Entries[Index].Address; >+ break; >+ } >+ } >+ } >+ >+ ASSERT (Location->Length <=3D 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 =3D=3D 0) { >+ return 0; >+ } >+ >+ Sum =3D 0; >+ Entries =3D PlatformCmosGetEntry (&Count); >+ for (Index =3D 0; Index < Count; Index++) { >+ if (CmosAccessLibNeedChecksum (Entries[Index].Address, >&Entries[Index])) { >+ Sum +=3D CmosRead8 (Entries[Index].Address); >+ } >+ } >+ >+ if (Location->Length =3D=3D 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 =3D 0; >+ >+ switch (Location->Length) { >+ case 2: >+ Checksum =3D (CmosRead8 (Location->HighByteAddress) << 8); >+ // >+ // Fall to case 1 to get the low byte value >+ // >+ case 1: >+ Checksum +=3D 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 <=3D CMOS_BANK0_LIMIT) { >+ if (PlatformCmosGetNmiState ()) { >+ Address |=3D 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 <=3D CMOS_BANK0_LIMIT) { >+ if (PlatformCmosGetNmiState ()) { >+ Address |=3D 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 =3D CmosAccessLibLocateEntry (Address); >+ >+ if (!CmosAccessLibIsAccessible (Address, Entry)) { >+ return; >+ } >+ >+ OriginalData =3D CmosRead8 (Address); >+ >+ CmosAccessLibICmosWrite8 (Address, Data); >+ >+ if (CmosAccessLibNeedChecksum (Address, Entry)) { >+ // >+ // Sum of Data + Checksum =3D New Sum of Data + New Checksum =3D 0 >+ // New Sum of Data - Sum of Data =3D Checksum - New Checksum >+ // New Checksum =3D 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 inco= rrect. >+ >+ @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 =3D CmosAccessLibCalculateSum (&ChecksumLocation) + >CmosAccessLibReadChecksum (&ChecksumLocation); >+ if (ChecksumLocation.Length =3D=3D 1) { >+ Checksum =3D (UINT8) Checksum; >+ } >+ >+ if (Checksum !=3D 0) { >+ Force =3D TRUE; >+ } >+ } >+ >+ if (Force) { >+ // >+ // Traverse through entire CMOS location and fill it with zero >+ // >+ for (Address =3D 0; Address <=3D CMOS_BANK1_LIMIT; Address++) { >+ Entry =3D CmosAccessLibLocateEntry ((UINT8) Address); >+ if (CmosAccessLibNeedFillDefault ((UINT8) Address, Entry)) { >+ CmosAccessLibICmosWrite8 ((UINT8) Address, (Entry =3D=3D 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.
>+# >+# 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 =3D 0x00010005 >+ BASE_NAME =3D CmosAccessLib >+ FILE_GUID =3D FF6B645D-C001-4ACE-9CA1-199F97C2D601 >+ VERSION_STRING =3D 1.0 >+ MODULE_TYPE =3D BASE >+ LIBRARY_CLASS =3D 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.
>+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 >+#include >+#include >+#include >+#include >+#include >+ >+// 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.
>+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 >+#include >+ >+/** >+ 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 =3D 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.
>+# >+# 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 =3D 0x00010005 >+ BASE_NAME =3D PlatformCmosAccessLib >+ FILE_GUID =3D C315A8B6-FF6C-41D1-A934-7330501F308C >+ VERSION_STRING =3D 1.0 >+ MODULE_TYPE =3D BASE >+ LIBRARY_CLASS =3D PlatformCmosAccessLib >+ >+ >+[Sources] >+ PlatformCmosAccessLibNull.c >+ >+[Packages] >+ MdePkg/MdePkg.dec >+ AdvancedFeaturePkg/AdvancedFeaturePkg.dec >\ No newline at end of file >-- >2.21.0.windows.1 > > >