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.88, mailfrom: michael.a.kubacki@intel.com) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by groups.io with SMTP; Mon, 13 May 2019 11:53:19 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 May 2019 11:53:18 -0700 X-ExtLoop1: 1 Received: from orsmsx103.amr.corp.intel.com ([10.22.225.130]) by orsmga007.jf.intel.com with ESMTP; 13 May 2019 11:53:18 -0700 Received: from orsmsx125.amr.corp.intel.com (10.22.240.125) by ORSMSX103.amr.corp.intel.com (10.22.225.130) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 13 May 2019 11:53:18 -0700 Received: from orsmsx121.amr.corp.intel.com ([169.254.10.70]) by ORSMSX125.amr.corp.intel.com ([169.254.3.172]) with mapi id 14.03.0415.000; Mon, 13 May 2019 11:53:17 -0700 From: "Kubacki, Michael A" 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. Thread-Topic: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Index: AQHVBKbb/VCeLiAEEEiplIIhLZh7wKZpfQ6A///yvyA= Date: Mon, 13 May 2019 18:53:17 +0000 Message-ID: <49AB4ACB9627B8468F29D589A27B74558893A238@ORSMSX121.amr.corp.intel.com> References: <20190507073051.17072-1-eric.dong@intel.com> <4A89E2EF3DFEDB4C8BFDE51014F606A14E448A14@SHSMSX104.ccr.corp.intel.com> In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E448A14@SHSMSX104.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZjM0ZjVmMGMtZmQ3NS00ZmU4LWI0MzYtYmUwNTEwZjhhMzNjIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiWDFVRms5QUNXZDBPeWFIWjVub3NQYmtmR2l2Sld2M3Rjd0hTZU40NlZJN3Vkck9JVzc0Njc0VUtTYnhRaU9HSCJ9 x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.22.254.139] MIME-Version: 1.0 Return-Path: michael.a.kubacki@intel.com Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Agree, this is not a feature but code that may be reused to support multipl= e features. We do need a new location to hold such reusable code. Liming, would you li= ke to=20 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. >=20 > Eric: > Now, edk2-platform devel-MinPlatform branch has merged into edk2- > platform master branch. >=20 > For this change, I propose to add new GenericBoardPkg in Platform\Inte= l > directory for the common board features. >=20 > 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 witho= ut > 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 locatio= n. > > +/// 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_VALU= E (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; 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 witho= ut > 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 > 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 platf= orm. > > +# > > +# 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