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.120, mailfrom: liming.gao@intel.com) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by groups.io with SMTP; Mon, 13 May 2019 05:37:33 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 May 2019 05:37:33 -0700 X-ExtLoop1: 1 Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by orsmga006.jf.intel.com with ESMTP; 13 May 2019 05:37:32 -0700 Received: from fmsmsx115.amr.corp.intel.com (10.18.116.19) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 13 May 2019 05:36:40 -0700 Received: from shsmsx108.ccr.corp.intel.com (10.239.4.97) by fmsmsx115.amr.corp.intel.com (10.18.116.19) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 13 May 2019 05:36:40 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.33]) by SHSMSX108.ccr.corp.intel.com ([169.254.8.126]) with mapi id 14.03.0415.000; Mon, 13 May 2019 20:36:38 +0800 From: "Liming Gao" 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. Thread-Topic: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Thread-Index: AQHVBKbhYsBw+2ML00mS1MovBEz5iKZpBFJQ Date: Mon, 13 May 2019 12:36:37 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E448A14@SHSMSX104.ccr.corp.intel.com> References: <20190507073051.17072-1-eric.dong@intel.com> In-Reply-To: <20190507073051.17072-1-eric.dong@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZjM0ZjVmMGMtZmQ3NS00ZmU4LWI0MzYtYmUwNTEwZjhhMzNjIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiWDFVRms5QUNXZDBPeWFIWjVub3NQYmtmR2l2Sld2M3Rjd0hTZU40NlZJN3Vkck9JVzc0Njc0VUtTYnhRaU9HSCJ9 dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action 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: Now, edk2-platform devel-MinPlatform branch has merged into edk2-platfor= m master branch. For this change, I propose to add new GenericBoardPkg in Platform\Intel = directory for the common board features.=20 Thanks Liming > -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Do= ng, 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. >=20 > https://bugzilla.tianocore.org/show_bug.cgi?id=3D1552 >=20 > Add two libraries used to provide CMOS related operation. >=20 > CmosAccessLib exports below APIs: > CmosWrite32 > CmosWrite16 > CmosWrite8 > CmosRead32 > CmosRead16 > CmosRead8 > CmosInit >=20 > PlatformCmosAccessLib export below APIs: > PlatformCmosGetEntry > PlatformCmosGetNmiState >=20 > PlatformCmosAccessLib will be consumed by CmosAccessLib. >=20 > 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/Libra= ry/CmosAccessLib.h > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Libra= ry/PlatformCmosAccessLib.h > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosA= ccessLib/CmosAccessLib.c > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosA= ccessLib/CmosAccessLib.inf > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosA= ccessLib/CmosAccessLibInternal.h > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/Platf= ormCmosAccessLibNull/PlatformCmosAccessLibNull.c > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/Platf= ormCmosAccessLibNull/PlatformCmosAccessLibNull.inf >=20 > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/Cmos= AccessLib.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/CmosAccessL= ib.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 avail= able under > +the terms and conditions of the BSD License that accompanies this distr= ibution. > +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 IM= PLIED. > + > +**/ > + > +#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 inc= orrect. > + > + @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/Plat= formCmosAccessLib.h > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAcc= essLib.h > new file mode 100644 > index 0000000..8c44ae2 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmo= sAccessLib.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 avail= able under > +the terms and conditions of the BSD License that accompanies this distr= ibution. > +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 IM= PLIED. > + > +**/ > + > +#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_CHECKSU= M | 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_CHECKSU= M | 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/CmosAccessLi= b/CmosAccessLib.c > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcces= sLib.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 avail= able under > +the terms and conditions of the BSD License that accompanies this distr= ibution. > +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 IM= PLIED. > + > +**/ > + > +#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_CHECKS= UM, 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_D= ATA, 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 CMO= S_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[Ind= ex])) { > + 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 (Ad= dress))) { > + 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 - OriginalD= ata) > + ); > + } > +} > + > +/** > + 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 inc= orrect. > + > + @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) + CmosAc= cessLibReadChecksum (&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/CmosAccessLi= b/CmosAccessLib.inf > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcces= sLib.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 ava= ilable under > +# the terms and conditions of the BSD License which accompanies this di= stribution. > +# 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/CmosAccessLi= b/CmosAccessLibInternal.h > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcces= sLibInternal.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 avail= able under > +the terms and conditions of the BSD License that accompanies this distr= ibution. > +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 IM= PLIED. > + > +**/ > + > +#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/PlatformCmos= AccessLibNull/PlatformCmosAccessLibNull.c > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNu= ll/PlatformCmosAccessLibNull.c > new file mode 100644 > index 0000000..b24a3f5 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessL= ibNull/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 avail= able under > +the terms and conditions of the BSD License that accompanies this distr= ibution. > +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 IM= PLIED. > + > +**/ > + > +#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/PlatformCmos= AccessLibNull/PlatformCmosAccessLibNull.inf > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNu= ll/PlatformCmosAccessLibNull.inf > new file mode 100644 > index 0000000..4816464 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessL= ibNull/PlatformCmosAccessLibNull.inf > @@ -0,0 +1,30 @@ > +### @file > +# Library producing CMOS access functionalities are relevant to platfor= m. > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.
> +# > +# This program and the accompanying materials are licensed and made ava= ilable under > +# the terms and conditions of the BSD License which accompanies this di= stribution. > +# 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 >=20 >=20