From: "Liming Gao" <liming.gao@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"Dong, Eric" <eric.dong@intel.com>
Subject: Re: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Date: Tue, 7 May 2019 07:31:32 +0000 [thread overview]
Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14E443F9C@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20190507072757.15068-1-eric.dong@intel.com>
Eric:
The title should include edk2-platform/ devel-MinPlatform so that people know this patch for edk2-platform devel-MinPlatform branch.
>-----Original Message-----
>From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
>Dong, Eric
>Sent: Tuesday, May 07, 2019 3:28 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] 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/PlatformCmosAcc
>essLib.h
> create mode 100644
>Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc
>essLib.c
> create mode 100644
>Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc
>essLib.inf
> create mode 100644
>Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc
>essLibInternal.h
> create mode 100644
>Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN
>ull/PlatformCmosAccessLibNull.c
> create mode 100644
>Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN
>ull/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/PlatformCmos
>AccessLib.h
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos
>AccessLib.h
>new file mode 100644
>index 0000000..8c44ae2
>--- /dev/null
>+++
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos
>AccessLib.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/CmosA
>ccessLib.c
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
>ccessLib.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.<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/CmosA
>ccessLib.inf
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
>ccessLib.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.<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/CmosA
>ccessLibInternal.h
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
>ccessLibInternal.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.<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/PlatformCmosAccessLib
>Null/PlatformCmosAccessLibNull.c
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
>Null/PlatformCmosAccessLibNull.c
>new file mode 100644
>index 0000000..b24a3f5
>--- /dev/null
>+++
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
>Null/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/PlatformCmosAccessLib
>Null/PlatformCmosAccessLibNull.inf
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
>Null/PlatformCmosAccessLibNull.inf
>new file mode 100644
>index 0000000..4816464
>--- /dev/null
>+++
>b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
>Null/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-07 7:31 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-07 7:27 [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries Dong, Eric
2019-05-07 7:31 ` Liming Gao [this message]
2019-05-07 7:36 ` [edk2-devel] " Dong, Eric
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=4A89E2EF3DFEDB4C8BFDE51014F606A14E443F9C@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