public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Dong, Eric" <eric.dong@intel.com>
To: devel@edk2.groups.io
Cc: Ray Ni <ray.ni@intel.com>,
	Michael Kubacki <michael.a.kubacki@intel.com>,
	Nate Desimone <nathaniel.l.desimone@intel.com>
Subject: [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Date: Tue,  7 May 2019 15:27:57 +0800	[thread overview]
Message-ID: <20190507072757.15068-1-eric.dong@intel.com> (raw)

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


             reply	other threads:[~2019-05-07  7:28 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-07  7:27 Dong, Eric [this message]
2019-05-07  7:31 ` [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries Liming Gao
2019-05-07  7:36   ` 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=20190507072757.15068-1-eric.dong@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