From nobody Sun Apr 28 10:45:01 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+40084+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+40084+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1557214083; cv=none; d=zoho.com; s=zohoarc; b=ggt8BuqjgvxsU2tIZk7kGjf+CzNnnUWijjxLvND6QVUB7bBXnCM3qjbdBv/omrzkxSdLjtJxrA2r9cTzFQRf+zBiEZoeYUONAhmGeaLQW8UblA/YwqzH8F9xXTtjphM7j50Lnbnb5LdpPAxkgI/8WJtFH1kNyCC+qPzp1/FyxmU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557214083; h=Content-Transfer-Encoding:Cc:Date:From:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To:ARC-Authentication-Results; bh=O06KqXQFRTlYvGGH4JAg9fcd6DF7Hnnqg/haPmf4588=; b=MpmRWLJ7wlvdHRlnHJrBcfZBX9LEbxTBg1gpdg2HQm0GHyTN0yoYOpFfT3wSWZfquc7R+OVuZREcRwP6hFgl+bLcD71DPcqUr8L/LFYFFMYKmm/K24KS9qaqu/1ZCoRGN1bXuUOV2vTKIzygk7kTKO7aa/z2pQOiKb9hcOReXyc= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=pass; spf=pass (zoho.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+40084+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) header.from= Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1557214083689887.4027944134801; Tue, 7 May 2019 00:28:03 -0700 (PDT) Return-Path: X-Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by groups.io with SMTP; Tue, 07 May 2019 00:28:02 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 May 2019 00:28:01 -0700 X-ExtLoop1: 1 X-Received: from ydong10-win10.ccr.corp.intel.com ([10.239.158.133]) by FMSMGA003.fm.intel.com with ESMTP; 07 May 2019 00:28:00 -0700 From: "Dong, Eric" To: devel@edk2.groups.io Cc: Ray Ni , Michael Kubacki , Nate Desimone Subject: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. Date: Tue, 7 May 2019 15:27:57 +0800 Message-Id: <20190507072757.15068-1-eric.dong@intel.com> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,eric.dong@intel.com Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1557214083; bh=iklyGGwiMTF+KXDY0zPMy6Ir2QQE26lSZyxwQzFu8E4=; h=Cc:Date:From:Reply-To:Subject:To; b=WwENjQ4DAvcG8MXkMuE+Jg/Fd5ownEzI7b0f3E5eSc/yUezJtceEKPRFgmf8L5qRg1e Qj/EWLTa0DvMnAmkoEE3Pivgw/sIwO8PVCNCFoPFUI3caMy6Uv2odtMvytS4pCsVx03Ms h+yqHj1VqcKJWlh5qn32vQP6tPQewGPCDRg= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" 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/= PlatformCmosAccessLib.h create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAcce= ssLib/CmosAccessLib.c create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAcce= ssLib/CmosAccessLib.inf create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAcce= ssLib/CmosAccessLibInternal.h create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/Platform= CmosAccessLibNull/PlatformCmosAccessLibNull.c create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/Platform= CmosAccessLibNull/PlatformCmosAccessLibNull.inf diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAcc= essLib.h b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAcces= sLib.h new file mode 100644 index 0000000..5f5029c --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h @@ -0,0 +1,112 @@ +/** @file + CmosAccessLib header file. + +Copyright (c) 2019, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + +**/ + +#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 incorr= ect. + + @param[in] Force TRUE indicating initializing the CMOS area without ch= ecking 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/Platfor= mCmosAccessLib.h b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/P= latformCmosAccessLib.h new file mode 100644 index 0000000..8c44ae2 --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAc= cessLib.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 availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + +**/ + +#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/C= mosAccessLib.c b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessL= ib/CmosAccessLib.c new file mode 100644 index 0000000..403d8ff --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcce= ssLib.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 availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + +**/ + +#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, F= ALSE, 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_C= HECKSUM_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 (Addre= ss))) { + 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 incorr= ect. + + @param[in] Force TRUE indicating initializing the CMOS area without ch= ecking 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) + CmosAcces= sLibReadChecksum (&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) ? C= MOS_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/C= mosAccessLib.inf b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAcces= sLib/CmosAccessLib.inf new file mode 100644 index 0000000..9decaf4 --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcce= ssLib.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 availa= ble under +# the terms and conditions of the BSD License which 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 IMP= LIED. +# +### +[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/C= mosAccessLibInternal.h b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/Cmo= sAccessLib/CmosAccessLibInternal.h new file mode 100644 index 0000000..9b6d086 --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcce= ssLibInternal.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 availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + +**/ + +#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/PlatformCmosAcc= essLibNull/PlatformCmosAccessLibNull.c b/Platform/Intel/AdvancedFeaturePkg/= Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c new file mode 100644 index 0000000..b24a3f5 --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN= ull/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 availabl= e under +the terms and conditions of the BSD License that accompanies this distribu= tion. +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 IMPLI= ED. + +**/ + +#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/PlatformCmosAcc= essLibNull/PlatformCmosAccessLibNull.inf b/Platform/Intel/AdvancedFeaturePk= g/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf new file mode 100644 index 0000000..4816464 --- /dev/null +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN= ull/PlatformCmosAccessLibNull.inf @@ -0,0 +1,30 @@ +### @file +# Library producing CMOS access functionalities are relevant to platform. +# +# Copyright (c) 2019, Intel Corporation. All rights reserved.
+# +# This program and the accompanying materials are licensed and made availa= ble under +# the terms and conditions of the BSD License which 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 IMP= LIED. +# +### + +[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 --=20 2.21.0.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#40084): https://edk2.groups.io/g/devel/message/40084 Mute This Topic: https://groups.io/mt/31529598/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-