.../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
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]
-=-=-=-=-=-=-=-=-=-=-=-
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] -=-=-=-=-=-=-=-=-=-=-=-
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] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2024 Red Hat, Inc.