From: "Liming Gao" <liming.gao@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"Dong, Eric" <eric.dong@intel.com>
Cc: "Ni, Ray" <ray.ni@intel.com>,
"Kubacki, Michael A" <michael.a.kubacki@intel.com>,
"Desimone, Nathaniel L" <nathaniel.l.desimone@intel.com>
Subject: Re: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Date: Mon, 13 May 2019 12:36:37 +0000 [thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E448A14@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20190507073051.17072-1-eric.dong@intel.com>
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\Intel 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 <ray.ni@intel.com>; Kubacki, Michael A <michael.a.kubacki@intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone@intel.com>
> Subject: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
>
> https://bugzilla.tianocore.org/show_bug.cgi?id=1552
>
> 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 <ray.ni@intel.com>
> Cc: Michael Kubacki <michael.a.kubacki@intel.com>
> Cc: Nate Desimone <nathaniel.l.desimone@intel.com>
> Signed-off-by: Eric Dong <eric.dong@intel.com>
> ---
> .../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/CmosAccessLib/CmosAccessLib.c
> create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf
> create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h
> create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c
> create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/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/CmosAccessLib.h
> @@ -0,0 +1,112 @@
> +/** @file
> + CmosAccessLib header file.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef _CMOS_ACCESS_LIB_H_
> +#define _CMOS_ACCESS_LIB_H_
> +
> +/**
> + Read a byte value from a CMOS address.
> +
> + @param [in] Address Location to read from CMOS
> +
> + @return The byte value read from the CMOS address.
> +**/
> +UINT8
> +EFIAPI
> +CmosRead8 (
> + IN UINT8 Address
> + );
> +
> +/**
> + Write a byte value to a CMOS address.
> +
> + @param [in] Address Location to write to CMOS.
> + @param [in] Data The byte value write to the CMOS address.
> +**/
> +VOID
> +EFIAPI
> +CmosWrite8 (
> + IN UINT8 Address,
> + IN UINT8 Data
> + );
> +
> +/**
> + Read a word value from a CMOS address.
> +
> + @param [in] Address Location to read from CMOS
> +
> + @return The word value read from the CMOS address.
> +**/
> +UINT16
> +EFIAPI
> +CmosRead16 (
> + IN UINT8 Address
> + );
> +
> +/**
> + Write a word value to a CMOS address.
> +
> + @param [in] Address Location to write to CMOS.
> + @param [in] Data The word value write to the CMOS address.
> +**/
> +VOID
> +EFIAPI
> +CmosWrite16 (
> + IN UINT8 Address,
> + IN UINT16 Data
> + );
> +
> +/**
> + Read a dword value from a CMOS address.
> +
> + @param [in] Address Location to read from CMOS
> +
> + @return The dword value read from the CMOS address.
> +**/
> +UINT32
> +EFIAPI
> +CmosRead32 (
> + IN UINT8 Address
> + );
> +
> +/**
> + Write a dword value to a CMOS address.
> +
> + @param [in] Address Location to write to CMOS.
> + @param [in] Data The dword value write to the CMOS address.
> +**/
> +VOID
> +EFIAPI
> +CmosWrite32 (
> + IN UINT8 Address,
> + IN UINT32 Data
> + );
> +
> +/**
> + Initialize the CMOS.
> +
> + It initialize the CMOS area when Force is TRUE or the checksum is incorrect.
> +
> + @param[in] Force TRUE indicating initializing the CMOS area without checking the checksum.
> +
> + @retval TRUE The CMOS is initialized to default value.
> + @retval FALSE The CMOS isn't initialized to default value.
> +**/
> +BOOLEAN
> +EFIAPI
> +CmosInit (
> + IN BOOLEAN Force
> + );
> +
> +#endif // _CMOS_ACCESS_LIB_H_
> diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h
> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h
> new file mode 100644
> index 0000000..8c44ae2
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h
> @@ -0,0 +1,74 @@
> +/** @file
> + Platform CMOS Access Library Header File.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#ifndef _PLATFORM_CMOS_ACCESS_LIB_H_
> +#define _PLATFORM_CMOS_ACCESS_LIB_H_
> +
> +///
> +/// Flag indicating checksum calculation doesn't include this location.
> +/// NOTE: If a location isn't shown in platform CMOS entry table,
> +/// it means checksum calculation doesn't include the location.
> +///
> +#define CMOS_EXCLUDE_FROM_CHECKSUM BIT0
> +
> +///
> +/// Flag indicating initialization doesn't cover this location.
> +/// NOTE: If a location isn't shown in platform CMOS entry table,
> +/// it means the location is initialized with CMOS_DEFAULT_VALUE (0).
> +///
> +#define CMOS_EXCLUDE_FROM_INIT_DATA BIT1
> +
> +///
> +/// Flag indicating the location cannot be accessed.
> +/// NOTE: 0x0 ~ 0xD is implictly inaccessible.
> +///
> +#define CMOS_EXCLUDE_FROM_ACCESS (BIT3 | CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA)
> +
> +///
> +/// Flag indicating the checksum location
> +/// NOTE: At most two entries can have this flag set.
> +///
> +#define CMOS_CHECKSUM_LOCATION (BIT2 | CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA)
> +
> +#define CMOS_DEFAULT_VALUE 0x00
> +
> +typedef struct {
> + UINT8 Address;
> + UINT8 DefaultValue;
> + UINT8 Attributes;
> +} CMOS_ENTRY;
> +
> +/**
> + Return the platform CMOS entries.
> +
> + @param [out] EntryCount Return the count of platform CMOS entries.
> +
> + @return Platform CMOS entries.
> +**/
> +CMOS_ENTRY *
> +EFIAPI
> +PlatformCmosGetEntry (
> + OUT UINTN *EntryCount
> + );
> +
> +/**
> + Return the NMI enable status.
> +**/
> +BOOLEAN
> +EFIAPI
> +PlatformCmosGetNmiState (
> + VOID
> + );
> +
> +#endif // _PLATFORM_CMOS_ACCESS_LIB_H_
> diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c
> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c
> new file mode 100644
> index 0000000..403d8ff
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c
> @@ -0,0 +1,492 @@
> +/** @file
> + CmosAccessLib implementation.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +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 = PlatformCmosGetEntry (&Count);
> + for (Index = 0; Index < Count; Index++) {
> + if (Entries[Index].Address == 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 != NULL) {
> + ASSERT (Entry->Address == Address);
> + if ((Entry->Attributes & Attributes) == 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 <= 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 = 0;
> +
> + Entries = PlatformCmosGetEntry (&Count);
> + for (Index = 0; Index < Count; Index++) {
> + if ((Entries[Index].Attributes & CMOS_CHECKSUM_LOCATION) == CMOS_CHECKSUM_LOCATION) {
> + Location->Length++;
> + if (Location->Length == 1) {
> + Location->LowByteAddress = Entries[Index].Address;
> + } else if (Location->Length == 2) {
> + Location->HighByteAddress = Entries[Index].Address;
> + break;
> + }
> + }
> + }
> +
> + ASSERT (Location->Length <= 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 == 0) {
> + return 0;
> + }
> +
> + Sum = 0;
> + Entries = PlatformCmosGetEntry (&Count);
> + for (Index = 0; Index < Count; Index++) {
> + if (CmosAccessLibNeedChecksum (Entries[Index].Address, &Entries[Index])) {
> + Sum += CmosRead8 (Entries[Index].Address);
> + }
> + }
> +
> + if (Location->Length == 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 = 0;
> +
> + switch (Location->Length) {
> + case 2:
> + Checksum = (CmosRead8 (Location->HighByteAddress) << 8);
> + //
> + // Fall to case 1 to get the low byte value
> + //
> + case 1:
> + Checksum += 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 <= CMOS_BANK0_LIMIT) {
> + if (PlatformCmosGetNmiState ()) {
> + Address |= 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 <= CMOS_BANK0_LIMIT) {
> + if (PlatformCmosGetNmiState ()) {
> + Address |= 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 = CmosAccessLibLocateEntry (Address);
> +
> + if (!CmosAccessLibIsAccessible (Address, Entry)) {
> + return;
> + }
> +
> + OriginalData = CmosRead8 (Address);
> +
> + CmosAccessLibICmosWrite8 (Address, Data);
> +
> + if (CmosAccessLibNeedChecksum (Address, Entry)) {
> + //
> + // Sum of Data + Checksum = New Sum of Data + New Checksum = 0
> + // New Sum of Data - Sum of Data = Checksum - New Checksum
> + // New Checksum = Checksum - (New Sum of Data - Sum of Data)
> + //
> + CmosAccessLibGetChecksumLocation (&ChecksumLocation);
> + CmosAccessLibWriteChecksum (
> + &ChecksumLocation,
> + CmosAccessLibReadChecksum (&ChecksumLocation) - (Data - OriginalData)
> + );
> + }
> +}
> +
> +/**
> + Read a word value from a CMOS address.
> +
> + @param [in] Address Location to read from CMOS
> +
> + @return The word value read from the CMOS address.
> +**/
> +UINT16
> +EFIAPI
> +CmosRead16 (
> + IN UINT8 Address
> + )
> +{
> + return CmosRead8 (Address) + (CmosRead8 (Address + 1) << 8);
> +}
> +
> +/**
> + Write a word value to a CMOS address.
> +
> + @param [in] Address Location to write to CMOS.
> + @param [in] Data The word value write to the CMOS address.
> +**/
> +VOID
> +EFIAPI
> +CmosWrite16 (
> + IN UINT8 Address,
> + IN UINT16 Data
> + )
> +{
> + CmosWrite8 (Address, (UINT8) Data);
> + CmosWrite8 (Address + 1, (UINT8) (Data >> 8));
> +}
> +
> +/**
> + Read a dword value from a CMOS address.
> +
> + @param [in] Address Location to read from CMOS
> +
> + @return The dword value read from the CMOS address.
> +**/
> +UINT32
> +EFIAPI
> +CmosRead32 (
> + IN UINT8 Address
> + )
> +{
> + return CmosRead16 (Address) + (CmosRead16 (Address + 2) << 16);
> +}
> +
> +/**
> + Write a dword value to a CMOS address.
> +
> + @param [in] Address Location to write to CMOS.
> + @param [in] Data The dword value write to the CMOS address.
> +**/
> +VOID
> +EFIAPI
> +CmosWrite32 (
> + IN UINT8 Address,
> + IN UINT32 Data
> + )
> +{
> + CmosWrite16 (Address, (UINT16) Data);
> + CmosWrite16 (Address + 2, (UINT16) (Data >> 16));
> +}
> +
> +
> +/**
> + Initialize the CMOS.
> +
> + It initialize the CMOS area when Force is TRUE or the checksum is incorrect.
> +
> + @param[in] Force TRUE indicating initializing the CMOS area without checking the checksum.
> +
> + @retval TRUE The CMOS is initialized to default value.
> + @retval FALSE The CMOS isn't initialized to default value.
> +**/
> +BOOLEAN
> +EFIAPI
> +CmosInit (
> + IN BOOLEAN Force
> + )
> +{
> + UINTN Address;
> + CMOS_ENTRY *Entry;
> + CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation;
> + UINT16 Checksum;
> +
> + CmosAccessLibGetChecksumLocation (&ChecksumLocation);
> +
> + if (!Force) {
> + //
> + // Initialize the CMOS area when checksum is incorrect.
> + //
> + Checksum = CmosAccessLibCalculateSum (&ChecksumLocation) + CmosAccessLibReadChecksum (&ChecksumLocation);
> + if (ChecksumLocation.Length == 1) {
> + Checksum = (UINT8) Checksum;
> + }
> +
> + if (Checksum != 0) {
> + Force = TRUE;
> + }
> + }
> +
> + if (Force) {
> + //
> + // Traverse through entire CMOS location and fill it with zero
> + //
> + for (Address = 0; Address <= CMOS_BANK1_LIMIT; Address++) {
> + Entry = CmosAccessLibLocateEntry ((UINT8) Address);
> + if (CmosAccessLibNeedFillDefault ((UINT8) Address, Entry)) {
> + CmosAccessLibICmosWrite8 ((UINT8) Address, (Entry == 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/CmosAccessLib.inf
> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf
> new file mode 100644
> index 0000000..9decaf4
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf
> @@ -0,0 +1,34 @@
> +### @file
> +# Library producing CMOS access functionality.
> +#
> +# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +#
> +# 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 = 0x00010005
> + BASE_NAME = CmosAccessLib
> + FILE_GUID = FF6B645D-C001-4ACE-9CA1-199F97C2D601
> + VERSION_STRING = 1.0
> + MODULE_TYPE = BASE
> + LIBRARY_CLASS = 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/CmosAccessLibInternal.h
> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h
> new file mode 100644
> index 0000000..9b6d086
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h
> @@ -0,0 +1,41 @@
> +/** @file
> + CmosAccessLib internal header file.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +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 <Base.h>
> +#include <Uefi.h>
> +#include <Library/IoLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/CmosAccessLib.h>
> +#include <Library/PlatformCmosAccessLib.h>
> +
> +// 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/PlatformCmosAccessLibNull/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/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c
> @@ -0,0 +1,45 @@
> +/** @file
> + Platform CMOS Access Library.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +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 <Base.h>
> +#include <Library/PlatformCmosAccessLib.h>
> +
> +/**
> + 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 = 0;
> + return NULL;
> +}
> +
> +/**
> + Return the NMI enable status.
> +**/
> +BOOLEAN
> +EFIAPI
> +PlatformCmosGetNmiState (
> + VOID
> + )
> +{
> + return FALSE;
> +}
> diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf
> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf
> new file mode 100644
> index 0000000..4816464
> --- /dev/null
> +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf
> @@ -0,0 +1,30 @@
> +### @file
> +# Library producing CMOS access functionalities are relevant to platform.
> +#
> +# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +#
> +# 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 = 0x00010005
> + BASE_NAME = PlatformCmosAccessLib
> + FILE_GUID = C315A8B6-FF6C-41D1-A934-7330501F308C
> + VERSION_STRING = 1.0
> + MODULE_TYPE = BASE
> + LIBRARY_CLASS = PlatformCmosAccessLib
> +
> +
> +[Sources]
> + PlatformCmosAccessLibNull.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> \ No newline at end of file
> --
> 2.21.0.windows.1
>
>
>
next prev parent reply other threads:[~2019-05-13 12:37 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-07 7:30 [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries Dong, Eric
2019-05-13 12:36 ` Liming Gao [this message]
2019-05-13 18:53 ` [edk2-devel] " Kubacki, Michael A
2019-05-14 5:54 ` Liming Gao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4A89E2EF3DFEDB4C8BFDE51014F606A14E448A14@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox