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.20, mailfrom: liming.gao@intel.com) Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by groups.io with SMTP; Mon, 13 May 2019 22:54:33 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 May 2019 22:54:32 -0700 X-ExtLoop1: 1 Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga006.fm.intel.com with ESMTP; 13 May 2019 22:54:32 -0700 Received: from shsmsx107.ccr.corp.intel.com (10.239.4.96) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 13 May 2019 22:54:32 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.33]) by SHSMSX107.ccr.corp.intel.com ([169.254.9.7]) with mapi id 14.03.0415.000; Tue, 14 May 2019 13:54:30 +0800 From: "Liming Gao" To: "Kubacki, Michael A" , "devel@edk2.groups.io" , "Dong, Eric" CC: "Ni, Ray" , "Desimone, Nathaniel L" Subject: Re: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Topic: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Index: AQHVBKbhYsBw+2ML00mS1MovBEz5iKZpBFJQ///mhICAAT7IoA== Date: Tue, 14 May 2019 05:54:30 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E4491EF@SHSMSX104.ccr.corp.intel.com> References: <20190507073051.17072-1-eric.dong@intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E448A14@SHSMSX104.ccr.corp.intel.com> <49AB4ACB9627B8468F29D589A27B74558893A238@ORSMSX121.amr.corp.intel.com> In-Reply-To: <49AB4ACB9627B8468F29D589A27B74558893A238@ORSMSX121.amr.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: liming.gao@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Sure. I will send RFC for new Package.=20 >-----Original Message----- >From: Kubacki, Michael A >Sent: Tuesday, May 14, 2019 2:53 AM >To: Gao, Liming ; devel@edk2.groups.io; Dong, Eric > >Cc: Ni, Ray ; Desimone, Nathaniel L > >Subject: RE: [edk2-devel] [Patch] [edk2-platforms] >AdvancedFeaturePkg/Cmos: Add Cmos related libraries. > >Agree, this is not a feature but code that may be reused to support multi= ple >features. > >We do need a new location to hold such reusable code. Liming, would you l= ike >to >send the RFC to request this new package? > >Thanks, >Michael > >> -----Original Message----- >> From: Gao, Liming >> Sent: Monday, May 13, 2019 5:37 AM >> To: devel@edk2.groups.io; Dong, Eric >> Cc: Ni, Ray ; Kubacki, Michael A >> ; Desimone, Nathaniel L >> >> Subject: RE: [edk2-devel] [Patch] [edk2-platforms] >> AdvancedFeaturePkg/Cmos: Add Cmos related libraries. >> >> Eric: >> Now, edk2-platform devel-MinPlatform branch has merged into edk2- >> platform master branch. >> >> For this change, I propose to add new GenericBoardPkg in Platform\Int= el >> directory for the common board features. >> >> Thanks >> Liming >> > -----Original Message----- >> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of >> > Dong, Eric >> > Sent: Tuesday, May 7, 2019 3:31 PM >> > To: devel@edk2.groups.io >> > Cc: Ni, Ray ; Kubacki, Michael A >> > ; Desimone, Nathaniel L >> > >> > Subject: [edk2-devel] [Patch] [edk2-platforms] >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/PlatformCmosAc >> c >> > essLib.h create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >> es >> > sLib.c create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >> es >> > sLib.inf create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >> es >> > sLibInternal.h create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN >> u >> > ll/PlatformCmosAccessLibNull.c create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN >> u >> > ll/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/CmosAcces >> > +++ sLib.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 with= out >> 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 >> A >> > ccessLib.h >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos >> A >> > ccessLib.h >> > new file mode 100644 >> > index 0000000..8c44ae2 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformC >> > +++ mosAccessLib.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 locati= on. >> > +/// 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_VAL= UE (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 >> cc >> > essLib.c >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >> cc >> > essLib.c >> > new file mode 100644 >> > index 0000000..403d8ff >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo >> > +++ sAccessLib.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; Inde= x < >> > + 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; Inde= x < >> > + 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; Inde= x < >> > + 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 with= out >> 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 NUL= L) ? >> 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 >> cc >> > essLib.inf >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >> cc >> > essLib.inf >> > new file mode 100644 >> > index 0000000..9decaf4 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo >> > +++ sAccessLib.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 >> cc >> > essLibInternal.h >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >> cc >> > essLibInternal.h >> > new file mode 100644 >> > index 0000000..9b6d086 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo >> > +++ sAccessLibInternal.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/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.c >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.c >> > new file mode 100644 >> > index 0000000..b24a3f5 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAcces >> > +++ sLibNull/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/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.inf >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.inf >> > new file mode 100644 >> > index 0000000..4816464 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAcces >> > +++ sLibNull/PlatformCmosAccessLibNull.inf >> > @@ -0,0 +1,30 @@ >> > +### @file >> > +# Library producing CMOS access functionalities are relevant to plat= form. >> > +# >> > +# 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 >> > >> > >> >=20