[edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.

Dong, Eric posted 1 patch 4 years, 10 months ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/edk2 tags/patchew/20190507072757.15068-1-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
[edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Posted by Dong, Eric 4 years, 10 months ago
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


-=-=-=-=-=-=-=-=-=-=-=-
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]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Posted by Liming Gao 4 years, 10 months ago
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
>
>
>


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#40086): https://edk2.groups.io/g/devel/message/40086
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]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Posted by Dong, Eric 4 years, 10 months ago
Liming,

Got it. Already send a mail which include edk2-platform.  Will include edk2-platform/devel-MinPlatform if V2 version patch needs.

Thanks,
Eric

> -----Original Message-----
> From: Gao, Liming
> Sent: Tuesday, May 7, 2019 3:32 PM
> To: devel@edk2.groups.io; Dong, Eric <eric.dong@intel.com>
> Subject: RE: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos
> related libraries.
> 
> 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/PlatformCmos
> Acc
> >essLib.h
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
> cc
> >essLib.c
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
> cc
> >essLib.inf
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
> cc
> >essLibInternal.h
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
> N
> >ull/PlatformCmosAccessLibNull.c
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
> N
> >ull/PlatformCmosAccessLibNull.inf
> >
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessL
> ib
> >.h
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccess
> Lib
> >.h
> >new file mode 100644
> >index 0000000..5f5029c
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccess
> Lib
> >.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/PlatformCmo
> s
> >AccessLib.h
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCm
> os
> >AccessLib.h
> >new file mode 100644
> >index 0000000..8c44ae2
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCm
> os
> >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/Cmos
> A
> >ccessLib.c
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLib.c
> >new file mode 100644
> >index 0000000..403d8ff
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >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/Cmos
> A
> >ccessLib.inf
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLib.inf
> >new file mode 100644
> >index 0000000..9decaf4
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >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/Cmos
> A
> >ccessLibInternal.h
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLibInternal.h
> >new file mode 100644
> >index 0000000..9b6d086
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >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/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.c
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.c
> >new file mode 100644
> >index 0000000..b24a3f5
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >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/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.inf
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.inf
> >new file mode 100644
> >index 0000000..4816464
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >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
> >
> >
> >


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#40087): https://edk2.groups.io/g/devel/message/40087
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]
-=-=-=-=-=-=-=-=-=-=-=-