From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 134.134.136.24, mailfrom: eric.dong@intel.com) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by groups.io with SMTP; Tue, 07 May 2019 00:37:03 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 May 2019 00:37:02 -0700 X-ExtLoop1: 1 Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga004.jf.intel.com with ESMTP; 07 May 2019 00:37:02 -0700 Received: from shsmsx153.ccr.corp.intel.com (10.239.6.53) 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:37:01 -0700 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.249]) by SHSMSX153.ccr.corp.intel.com ([169.254.12.150]) with mapi id 14.03.0415.000; Tue, 7 May 2019 15:36:59 +0800 From: "Dong, Eric" To: "Gao, Liming" , "devel@edk2.groups.io" Subject: Re: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Topic: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Index: AQHVBKZ1oi8TMMPqEEmszCcjEOpQEaZfRBTwgAAA9yA= Date: Tue, 7 May 2019 07:36:59 +0000 Message-ID: References: <20190507072757.15068-1-eric.dong@intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E443F9C@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E443F9C@SHSMSX104.ccr.corp.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: eric.dong@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Liming, Got it. Already send a mail which include edk2-platform. Will include edk= 2-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 > Subject: RE: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos > related libraries. >=20 > Eric: > The title should include edk2-platform/ devel-MinPlatform so that peopl= e > know this patch for edk2-platform devel-MinPlatform branch. >=20 > >-----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/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.
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.
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.
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 > 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 =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/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.
# # > >+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/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.
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/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.
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/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 platfo= rm. > >+# > >+# 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 > > > > > >