.../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 (#40085): https://edk2.groups.io/g/devel/message/40085
Mute This Topic: https://groups.io/mt/31529605/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-
Eric: Now, edk2-platform devel-MinPlatform branch has merged into edk2-platform master branch. For this change, I propose to add new GenericBoardPkg in Platform\Intel directory for the common board features. Thanks Liming > -----Original Message----- > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of Dong, Eric > Sent: Tuesday, May 7, 2019 3:31 PM > To: devel@edk2.groups.io > Cc: Ni, Ray <ray.ni@intel.com>; Kubacki, Michael A <michael.a.kubacki@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desimone@intel.com> > Subject: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: Add Cmos related libraries. > > https://bugzilla.tianocore.org/show_bug.cgi?id=1552 > > Add two libraries used to provide CMOS related operation. > > CmosAccessLib exports below APIs: > CmosWrite32 > CmosWrite16 > CmosWrite8 > CmosRead32 > CmosRead16 > CmosRead8 > CmosInit > > PlatformCmosAccessLib export below APIs: > PlatformCmosGetEntry > PlatformCmosGetNmiState > > PlatformCmosAccessLib will be consumed by CmosAccessLib. > > Cc: Ray Ni <ray.ni@intel.com> > Cc: Michael Kubacki <michael.a.kubacki@intel.com> > Cc: Nate Desimone <nathaniel.l.desimone@intel.com> > Signed-off-by: Eric Dong <eric.dong@intel.com> > --- > .../Cmos/Include/Library/CmosAccessLib.h | 112 ++++ > .../Include/Library/PlatformCmosAccessLib.h | 74 +++ > .../Library/CmosAccessLib/CmosAccessLib.c | 492 ++++++++++++++++++ > .../Library/CmosAccessLib/CmosAccessLib.inf | 34 ++ > .../CmosAccessLib/CmosAccessLibInternal.h | 41 ++ > .../PlatformCmosAccessLibNull.c | 45 ++ > .../PlatformCmosAccessLibNull.inf | 30 ++ > 7 files changed, 828 insertions(+) > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c > create mode 100644 Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf > > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h > new file mode 100644 > index 0000000..5f5029c > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h > @@ -0,0 +1,112 @@ > +/** @file > + CmosAccessLib header file. > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +This program and the accompanying materials are licensed and made available under > +the terms and conditions of the BSD License that accompanies this distribution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#ifndef _CMOS_ACCESS_LIB_H_ > +#define _CMOS_ACCESS_LIB_H_ > + > +/** > + Read a byte value from a CMOS address. > + > + @param [in] Address Location to read from CMOS > + > + @return The byte value read from the CMOS address. > +**/ > +UINT8 > +EFIAPI > +CmosRead8 ( > + IN UINT8 Address > + ); > + > +/** > + Write a byte value to a CMOS address. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The byte value write to the CMOS address. > +**/ > +VOID > +EFIAPI > +CmosWrite8 ( > + IN UINT8 Address, > + IN UINT8 Data > + ); > + > +/** > + Read a word value from a CMOS address. > + > + @param [in] Address Location to read from CMOS > + > + @return The word value read from the CMOS address. > +**/ > +UINT16 > +EFIAPI > +CmosRead16 ( > + IN UINT8 Address > + ); > + > +/** > + Write a word value to a CMOS address. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The word value write to the CMOS address. > +**/ > +VOID > +EFIAPI > +CmosWrite16 ( > + IN UINT8 Address, > + IN UINT16 Data > + ); > + > +/** > + Read a dword value from a CMOS address. > + > + @param [in] Address Location to read from CMOS > + > + @return The dword value read from the CMOS address. > +**/ > +UINT32 > +EFIAPI > +CmosRead32 ( > + IN UINT8 Address > + ); > + > +/** > + Write a dword value to a CMOS address. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The dword value write to the CMOS address. > +**/ > +VOID > +EFIAPI > +CmosWrite32 ( > + IN UINT8 Address, > + IN UINT32 Data > + ); > + > +/** > + Initialize the CMOS. > + > + It initialize the CMOS area when Force is TRUE or the checksum is incorrect. > + > + @param[in] Force TRUE indicating initializing the CMOS area without checking the checksum. > + > + @retval TRUE The CMOS is initialized to default value. > + @retval FALSE The CMOS isn't initialized to default value. > +**/ > +BOOLEAN > +EFIAPI > +CmosInit ( > + IN BOOLEAN Force > + ); > + > +#endif // _CMOS_ACCESS_LIB_H_ > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h > new file mode 100644 > index 0000000..8c44ae2 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAccessLib.h > @@ -0,0 +1,74 @@ > +/** @file > + Platform CMOS Access Library Header File. > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +This program and the accompanying materials are licensed and made available under > +the terms and conditions of the BSD License that accompanies this distribution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#ifndef _PLATFORM_CMOS_ACCESS_LIB_H_ > +#define _PLATFORM_CMOS_ACCESS_LIB_H_ > + > +/// > +/// Flag indicating checksum calculation doesn't include this location. > +/// NOTE: If a location isn't shown in platform CMOS entry table, > +/// it means checksum calculation doesn't include the location. > +/// > +#define CMOS_EXCLUDE_FROM_CHECKSUM BIT0 > + > +/// > +/// Flag indicating initialization doesn't cover this location. > +/// NOTE: If a location isn't shown in platform CMOS entry table, > +/// it means the location is initialized with CMOS_DEFAULT_VALUE (0). > +/// > +#define CMOS_EXCLUDE_FROM_INIT_DATA BIT1 > + > +/// > +/// Flag indicating the location cannot be accessed. > +/// NOTE: 0x0 ~ 0xD is implictly inaccessible. > +/// > +#define CMOS_EXCLUDE_FROM_ACCESS (BIT3 | CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA) > + > +/// > +/// Flag indicating the checksum location > +/// NOTE: At most two entries can have this flag set. > +/// > +#define CMOS_CHECKSUM_LOCATION (BIT2 | CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA) > + > +#define CMOS_DEFAULT_VALUE 0x00 > + > +typedef struct { > + UINT8 Address; > + UINT8 DefaultValue; > + UINT8 Attributes; > +} CMOS_ENTRY; > + > +/** > + Return the platform CMOS entries. > + > + @param [out] EntryCount Return the count of platform CMOS entries. > + > + @return Platform CMOS entries. > +**/ > +CMOS_ENTRY * > +EFIAPI > +PlatformCmosGetEntry ( > + OUT UINTN *EntryCount > + ); > + > +/** > + Return the NMI enable status. > +**/ > +BOOLEAN > +EFIAPI > +PlatformCmosGetNmiState ( > + VOID > + ); > + > +#endif // _PLATFORM_CMOS_ACCESS_LIB_H_ > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c > new file mode 100644 > index 0000000..403d8ff > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.c > @@ -0,0 +1,492 @@ > +/** @file > + CmosAccessLib implementation. > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +This program and the accompanying materials are licensed and made available under > +the terms and conditions of the BSD License that accompanies this distribution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#include "CmosAccessLibInternal.h" > + > +/** > + Return the entry for the specified address in entries returned > + from platform. > + > + @param [in] Address The CMOS address to find. > + > + @return A pointer to CMOS_ENTRY for the specified address, > + or NULL if not found. > +**/ > +CMOS_ENTRY * > +CmosAccessLibLocateEntry ( > + IN UINT8 Address > + ) > +{ > + UINTN Index; > + UINTN Count; > + CMOS_ENTRY *Entries; > + > + Entries = PlatformCmosGetEntry (&Count); > + for (Index = 0; Index < Count; Index++) { > + if (Entries[Index].Address == Address) { > + return &Entries[Index]; > + } > + } > + > + return NULL; > +} > + > +/** > + Test the attributes of the Entry and return ValueIfSet if test passes > + or !ValueIfSet if test fails. It returns DefaultValue if the Entry is > + NULL. > + > + @param [in] Address The CMOS address. > + @param [in] Attributes The attributes to test. > + @param [in] ValueIfSet The value to return if test passes. > + @param [in] DefaultValue The value to return if Entry is NULL. > + @param [in] Entry Pointer to entry. > + > + @retval ValueIfSet If test passes. > + @retval !ValueIfSet If test fails. > + @retval DefaultValue If the Entry is NULL. > +**/ > +BOOLEAN > +CmosAccessLibCheckAttribute ( > + IN UINT8 Address, > + IN UINT8 Attributes, > + IN BOOLEAN ValueIfSet, > + IN BOOLEAN DefaultValue, > + IN CMOS_ENTRY *Entry OPTIONAL > + ) > +{ > + if (Entry != NULL) { > + ASSERT (Entry->Address == Address); > + if ((Entry->Attributes & Attributes) == Attributes) { > + return ValueIfSet; > + } else { > + return !ValueIfSet; > + } > + } > + > + return DefaultValue; > +} > + > +/** > + Check if the CMOS address needs Checksum calculation. > + > + @param [in] Address CMOS address to be checked > + @param [in] Entry Pointer to entry. > + > + @retval TRUE CMOS address needs Checksum calculation. > + @retval FALSE CMOS address doesn't need Checksum calculation. > +**/ > +BOOLEAN > +CmosAccessLibNeedChecksum ( > + IN UINT8 Address, > + IN CMOS_ENTRY *Entry OPTIONAL > + ) > +{ > + return CmosAccessLibCheckAttribute (Address, CMOS_EXCLUDE_FROM_CHECKSUM, FALSE, FALSE, Entry); > +} > + > + > +/** > + Check if the CMOS address needs to fill default data. > + > + @param [in] Address CMOS address to be checked > + @param [in] Entry Pointer to entry. > + > + @retval TRUE CMOS address need to fill default data. > + @retval FALSE CMOS address doesn't need to fill default data. > +**/ > +BOOLEAN > +CmosAccessLibNeedFillDefault ( > + IN UINT8 Address, > + IN CMOS_ENTRY *Entry OPTIONAL > + ) > +{ > + return CmosAccessLibCheckAttribute (Address, CMOS_EXCLUDE_FROM_INIT_DATA, FALSE, TRUE, Entry); > +} > + > +/** > + Check if the CMOS address is accessible. > + > + @param [in] Address CMOS address to be checked. > + @param [in] Entry Pointer to entry. > + > + @retval TRUE CMOS address is accessible. > + @retval FALSE CMOS address isn't accessible. > +**/ > +BOOLEAN > +CmosAccessLibIsAccessible ( > + IN UINT8 Address, > + IN CMOS_ENTRY *Entry OPTIONAL > + ) > +{ > + // > + // CMOS 0-9, A, B, C, D are for RTC. > + // > + if (Address <= 0xD) { > + return FALSE; > + } > + return CmosAccessLibCheckAttribute (Address, CMOS_EXCLUDE_FROM_ACCESS, FALSE, TRUE, Entry); > +} > + > +/** > + Return the CMOS location to store checksum. > + > + @param [out] Location Return the CMOS location to store the checksum. > +**/ > +VOID > +CmosAccessLibGetChecksumLocation ( > + OUT CMOS_CHECKSUM_LOCATION_INFO *Location > + ) > +{ > + UINTN Index; > + UINTN Count; > + CMOS_ENTRY *Entries; > + > + Location->Length = 0; > + > + Entries = PlatformCmosGetEntry (&Count); > + for (Index = 0; Index < Count; Index++) { > + if ((Entries[Index].Attributes & CMOS_CHECKSUM_LOCATION) == CMOS_CHECKSUM_LOCATION) { > + Location->Length++; > + if (Location->Length == 1) { > + Location->LowByteAddress = Entries[Index].Address; > + } else if (Location->Length == 2) { > + Location->HighByteAddress = Entries[Index].Address; > + break; > + } > + } > + } > + > + ASSERT (Location->Length <= 2); > +} > + > +/** > + Calculate the sum of CMOS values who need checksum calculation. > + > + @param [in] Location The CMOS location to store the checksum. > + > + @return The sum. > +**/ > +UINT16 > +CmosAccessLibCalculateSum ( > + IN CMOS_CHECKSUM_LOCATION_INFO *Location > + ) > +{ > + UINT16 Sum; > + UINTN Index; > + UINTN Count; > + CMOS_ENTRY *Entries; > + > + if (Location->Length == 0) { > + return 0; > + } > + > + Sum = 0; > + Entries = PlatformCmosGetEntry (&Count); > + for (Index = 0; Index < Count; Index++) { > + if (CmosAccessLibNeedChecksum (Entries[Index].Address, &Entries[Index])) { > + Sum += CmosRead8 (Entries[Index].Address); > + } > + } > + > + if (Location->Length == 1) { > + return (UINT8) Sum; > + } else { > + return Sum; > + } > +} > + > +/** > + Return the checksum value stored in CMOS. > + > + @param [in] Location The CMOS location to store the checksum. > + > + @return The checksum value. > +**/ > +UINT16 > +CmosAccessLibReadChecksum ( > + IN CMOS_CHECKSUM_LOCATION_INFO *Location > + ) > +{ > + UINT16 Checksum; > + > + Checksum = 0; > + > + switch (Location->Length) { > + case 2: > + Checksum = (CmosRead8 (Location->HighByteAddress) << 8); > + // > + // Fall to case 1 to get the low byte value > + // > + case 1: > + Checksum += CmosRead8 (Location->LowByteAddress); > + break; > + > + default: > + break; > + } > + return Checksum; > +} > + > + > +/** > + Write the Checksum to appropriate address. > + > + @param [in] Location The CMOS location to store the checksum. > + @param [in] Checksum The checksum value. > +**/ > +VOID > +CmosAccessLibWriteChecksum ( > + CMOS_CHECKSUM_LOCATION_INFO *Location, > + IN UINT16 Checksum > + ) > +{ > + > + switch (Location->Length) { > + case 0: > + break; > + case 2: > + CmosWrite8 (Location->HighByteAddress, Checksum >> 8); > + // > + // Fall to case 1 to update low byte value > + // > + case 1: > + CmosWrite8 (Location->LowByteAddress, (UINT8) Checksum); > + break; > + } > +} > + > +/** > + Read a byte value from a CMOS address. > + > + @param [in] Address Location to read from CMOS > + > + @return The byte value read from the CMOS address. > +**/ > +UINT8 > +EFIAPI > +CmosRead8 ( > + IN UINT8 Address > + ) > +{ > + if (!CmosAccessLibIsAccessible (Address, CmosAccessLibLocateEntry (Address))) { > + return 0xFF; > + } > + > + if (Address <= CMOS_BANK0_LIMIT) { > + if (PlatformCmosGetNmiState ()) { > + Address |= BIT7; > + } > + IoWrite8 (PORT_70, Address); > + return IoRead8 (PORT_71); > + } else { > + IoWrite8 (PORT_72, Address); > + return IoRead8 (PORT_73); > + } > +} > + > +/** > + Write a byte value to a CMOS address. > + > + It's an internal function that doesn't update the checksum. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The byte value write to the CMOS address. > +**/ > +VOID > +CmosAccessLibICmosWrite8 ( > + IN UINT8 Address, > + IN UINT8 Data > + ) > +{ > + if (Address <= CMOS_BANK0_LIMIT) { > + if (PlatformCmosGetNmiState ()) { > + Address |= BIT7; > + } > + IoWrite8 (PORT_70, Address); > + IoWrite8 (PORT_71, Data); > + } else { > + IoWrite8 (PORT_72, Address); > + IoWrite8 (PORT_73, Data); > + } > +} > + > +/** > + Write a byte value to a CMOS address. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The byte value write to the CMOS address. > +**/ > +VOID > +EFIAPI > +CmosWrite8 ( > + IN UINT8 Address, > + IN UINT8 Data > + ) > +{ > + UINT8 OriginalData; > + CMOS_ENTRY *Entry; > + CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation; > + > + Entry = CmosAccessLibLocateEntry (Address); > + > + if (!CmosAccessLibIsAccessible (Address, Entry)) { > + return; > + } > + > + OriginalData = CmosRead8 (Address); > + > + CmosAccessLibICmosWrite8 (Address, Data); > + > + if (CmosAccessLibNeedChecksum (Address, Entry)) { > + // > + // Sum of Data + Checksum = New Sum of Data + New Checksum = 0 > + // New Sum of Data - Sum of Data = Checksum - New Checksum > + // New Checksum = Checksum - (New Sum of Data - Sum of Data) > + // > + CmosAccessLibGetChecksumLocation (&ChecksumLocation); > + CmosAccessLibWriteChecksum ( > + &ChecksumLocation, > + CmosAccessLibReadChecksum (&ChecksumLocation) - (Data - OriginalData) > + ); > + } > +} > + > +/** > + Read a word value from a CMOS address. > + > + @param [in] Address Location to read from CMOS > + > + @return The word value read from the CMOS address. > +**/ > +UINT16 > +EFIAPI > +CmosRead16 ( > + IN UINT8 Address > + ) > +{ > + return CmosRead8 (Address) + (CmosRead8 (Address + 1) << 8); > +} > + > +/** > + Write a word value to a CMOS address. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The word value write to the CMOS address. > +**/ > +VOID > +EFIAPI > +CmosWrite16 ( > + IN UINT8 Address, > + IN UINT16 Data > + ) > +{ > + CmosWrite8 (Address, (UINT8) Data); > + CmosWrite8 (Address + 1, (UINT8) (Data >> 8)); > +} > + > +/** > + Read a dword value from a CMOS address. > + > + @param [in] Address Location to read from CMOS > + > + @return The dword value read from the CMOS address. > +**/ > +UINT32 > +EFIAPI > +CmosRead32 ( > + IN UINT8 Address > + ) > +{ > + return CmosRead16 (Address) + (CmosRead16 (Address + 2) << 16); > +} > + > +/** > + Write a dword value to a CMOS address. > + > + @param [in] Address Location to write to CMOS. > + @param [in] Data The dword value write to the CMOS address. > +**/ > +VOID > +EFIAPI > +CmosWrite32 ( > + IN UINT8 Address, > + IN UINT32 Data > + ) > +{ > + CmosWrite16 (Address, (UINT16) Data); > + CmosWrite16 (Address + 2, (UINT16) (Data >> 16)); > +} > + > + > +/** > + Initialize the CMOS. > + > + It initialize the CMOS area when Force is TRUE or the checksum is incorrect. > + > + @param[in] Force TRUE indicating initializing the CMOS area without checking the checksum. > + > + @retval TRUE The CMOS is initialized to default value. > + @retval FALSE The CMOS isn't initialized to default value. > +**/ > +BOOLEAN > +EFIAPI > +CmosInit ( > + IN BOOLEAN Force > + ) > +{ > + UINTN Address; > + CMOS_ENTRY *Entry; > + CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation; > + UINT16 Checksum; > + > + CmosAccessLibGetChecksumLocation (&ChecksumLocation); > + > + if (!Force) { > + // > + // Initialize the CMOS area when checksum is incorrect. > + // > + Checksum = CmosAccessLibCalculateSum (&ChecksumLocation) + CmosAccessLibReadChecksum (&ChecksumLocation); > + if (ChecksumLocation.Length == 1) { > + Checksum = (UINT8) Checksum; > + } > + > + if (Checksum != 0) { > + Force = TRUE; > + } > + } > + > + if (Force) { > + // > + // Traverse through entire CMOS location and fill it with zero > + // > + for (Address = 0; Address <= CMOS_BANK1_LIMIT; Address++) { > + Entry = CmosAccessLibLocateEntry ((UINT8) Address); > + if (CmosAccessLibNeedFillDefault ((UINT8) Address, Entry)) { > + CmosAccessLibICmosWrite8 ((UINT8) Address, (Entry == NULL) ? CMOS_DEFAULT_VALUE : Entry->DefaultValue); > + } > + } > + > + // > + // Write the New checksum to the Checksum field > + // > + CmosAccessLibWriteChecksum ( > + &ChecksumLocation, > + (UINT16) (0x10000 - CmosAccessLibCalculateSum (&ChecksumLocation)) > + ); > + return TRUE; > + } > + > + return FALSE; > +} > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf > new file mode 100644 > index 0000000..9decaf4 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLib.inf > @@ -0,0 +1,34 @@ > +### @file > +# Library producing CMOS access functionality. > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +# > +# This program and the accompanying materials are licensed and made available under > +# the terms and conditions of the BSD License which accompanies this distribution. > +# The full text of the license may be found at > +# http://opensource.org/licenses/bsd-license.php > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +# > +### > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = CmosAccessLib > + FILE_GUID = FF6B645D-C001-4ACE-9CA1-199F97C2D601 > + VERSION_STRING = 1.0 > + MODULE_TYPE = BASE > + LIBRARY_CLASS = CmosAccessLib > + > +[Sources] > + CmosAccessLib.c > + CmosAccessLibInternal.h > + > +[LibraryClasses] > + IoLib > + DebugLib > + PlatformCmosAccessLib > + > +[Packages] > + MdePkg/MdePkg.dec > + AdvancedFeaturePkg/AdvancedFeaturePkg.dec > \ No newline at end of file > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h > new file mode 100644 > index 0000000..9b6d086 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAccessLibInternal.h > @@ -0,0 +1,41 @@ > +/** @file > + CmosAccessLib internal header file. > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +This program and the accompanying materials are licensed and made available under > +the terms and conditions of the BSD License that accompanies this distribution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#ifndef _CMOS_ACCESS_LIB_INTERNALS_ > +#define _CMOS_ACCESS_LIB_INTERNALS_ > + > +#include <Base.h> > +#include <Uefi.h> > +#include <Library/IoLib.h> > +#include <Library/DebugLib.h> > +#include <Library/CmosAccessLib.h> > +#include <Library/PlatformCmosAccessLib.h> > + > +// CMOS access Port address > + > +#define PORT_70 0x70 > +#define PORT_71 0x71 > +#define PORT_72 0x72 > +#define PORT_73 0x73 > + > +#define CMOS_BANK0_LIMIT 0x7F > +#define CMOS_BANK1_LIMIT 0xFF > + > +typedef struct { > + UINT8 Length; > + UINT8 LowByteAddress; > + UINT8 HighByteAddress; > +} CMOS_CHECKSUM_LOCATION_INFO; > + > +#endif // _CMOS_ACCESS_LIB_INTERNALS_ > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c > new file mode 100644 > index 0000000..b24a3f5 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.c > @@ -0,0 +1,45 @@ > +/** @file > + Platform CMOS Access Library. > + > +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +This program and the accompanying materials are licensed and made available under > +the terms and conditions of the BSD License that accompanies this distribution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > +#include <Base.h> > +#include <Library/PlatformCmosAccessLib.h> > + > +/** > + Return the platform CMOS entries. > + > + @param [out] EntryCount Return the count of platform CMOS entries. > + > + @return Platform CMOS entries. > +**/ > +CMOS_ENTRY * > +EFIAPI > +PlatformCmosGetEntry ( > + OUT UINTN *EntryCount > + ) > +{ > + *EntryCount = 0; > + return NULL; > +} > + > +/** > + Return the NMI enable status. > +**/ > +BOOLEAN > +EFIAPI > +PlatformCmosGetNmiState ( > + VOID > + ) > +{ > + return FALSE; > +} > diff --git a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf > new file mode 100644 > index 0000000..4816464 > --- /dev/null > +++ b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibNull/PlatformCmosAccessLibNull.inf > @@ -0,0 +1,30 @@ > +### @file > +# Library producing CMOS access functionalities are relevant to platform. > +# > +# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> > +# > +# This program and the accompanying materials are licensed and made available under > +# the terms and conditions of the BSD License which accompanies this distribution. > +# The full text of the license may be found at > +# http://opensource.org/licenses/bsd-license.php > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +# > +### > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = PlatformCmosAccessLib > + FILE_GUID = C315A8B6-FF6C-41D1-A934-7330501F308C > + VERSION_STRING = 1.0 > + MODULE_TYPE = BASE > + LIBRARY_CLASS = PlatformCmosAccessLib > + > + > +[Sources] > + PlatformCmosAccessLibNull.c > + > +[Packages] > + MdePkg/MdePkg.dec > + AdvancedFeaturePkg/AdvancedFeaturePkg.dec > \ No newline at end of file > -- > 2.21.0.windows.1 > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#40498): https://edk2.groups.io/g/devel/message/40498 Mute This Topic: https://groups.io/mt/31529605/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
Agree, this is not a feature but code that may be reused to support multiple features. We do need a new location to hold such reusable code. Liming, would you like to send the RFC to request this new package? Thanks, Michael > -----Original Message----- > From: Gao, Liming > Sent: Monday, May 13, 2019 5:37 AM > To: devel@edk2.groups.io; Dong, Eric <eric.dong@intel.com> > Cc: Ni, Ray <ray.ni@intel.com>; Kubacki, Michael A > <michael.a.kubacki@intel.com>; Desimone, Nathaniel L > <nathaniel.l.desimone@intel.com> > Subject: RE: [edk2-devel] [Patch] [edk2-platforms] > AdvancedFeaturePkg/Cmos: Add Cmos related libraries. > > Eric: > Now, edk2-platform devel-MinPlatform branch has merged into edk2- > platform master branch. > > For this change, I propose to add new GenericBoardPkg in Platform\Intel > directory for the common board features. > > Thanks > Liming > > -----Original Message----- > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of > > Dong, Eric > > Sent: Tuesday, May 7, 2019 3:31 PM > > To: devel@edk2.groups.io > > Cc: Ni, Ray <ray.ni@intel.com>; Kubacki, Michael A > > <michael.a.kubacki@intel.com>; Desimone, Nathaniel L > > <nathaniel.l.desimone@intel.com> > > Subject: [edk2-devel] [Patch] [edk2-platforms] AdvancedFeaturePkg/Cmos: > Add Cmos related libraries. > > > > https://bugzilla.tianocore.org/show_bug.cgi?id=1552 > > > > Add two libraries used to provide CMOS related operation. > > > > CmosAccessLib exports below APIs: > > CmosWrite32 > > CmosWrite16 > > CmosWrite8 > > CmosRead32 > > CmosRead16 > > CmosRead8 > > CmosInit > > > > PlatformCmosAccessLib export below APIs: > > PlatformCmosGetEntry > > PlatformCmosGetNmiState > > > > PlatformCmosAccessLib will be consumed by CmosAccessLib. > > > > Cc: Ray Ni <ray.ni@intel.com> > > Cc: Michael Kubacki <michael.a.kubacki@intel.com> > > Cc: Nate Desimone <nathaniel.l.desimone@intel.com> > > Signed-off-by: Eric Dong <eric.dong@intel.com> > > --- > > .../Cmos/Include/Library/CmosAccessLib.h | 112 ++++ > > .../Include/Library/PlatformCmosAccessLib.h | 74 +++ > > .../Library/CmosAccessLib/CmosAccessLib.c | 492 ++++++++++++++++++ > > .../Library/CmosAccessLib/CmosAccessLib.inf | 34 ++ > > .../CmosAccessLib/CmosAccessLibInternal.h | 41 ++ > > .../PlatformCmosAccessLibNull.c | 45 ++ > > .../PlatformCmosAccessLibNull.inf | 30 ++ > > 7 files changed, 828 insertions(+) > > create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h > > create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAc > c > > essLib.h create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc > es > > sLib.c create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc > es > > sLib.inf create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc > es > > sLibInternal.h create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN > u > > ll/PlatformCmosAccessLibNull.c create mode 100644 > > > Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN > u > > ll/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/CmosAcces > > +++ sLib.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 > A > > ccessLib.h > > > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos > A > > ccessLib.h > > new file mode 100644 > > index 0000000..8c44ae2 > > --- /dev/null > > +++ > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformC > > +++ mosAccessLib.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 > cc > > essLib.c > > > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA > cc > > essLib.c > > new file mode 100644 > > index 0000000..403d8ff > > --- /dev/null > > +++ > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > > +++ sAccessLib.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 > cc > > essLib.inf > > > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA > cc > > essLib.inf > > new file mode 100644 > > index 0000000..9decaf4 > > --- /dev/null > > +++ > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > > +++ sAccessLib.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 > cc > > essLibInternal.h > > > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA > cc > > essLibInternal.h > > new file mode 100644 > > index 0000000..9b6d086 > > --- /dev/null > > +++ > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo > > +++ sAccessLibInternal.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/PlatformCmosAccessLi > b > > Null/PlatformCmosAccessLibNull.c > > > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLi > b > > Null/PlatformCmosAccessLibNull.c > > new file mode 100644 > > index 0000000..b24a3f5 > > --- /dev/null > > +++ > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAcces > > +++ sLibNull/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/PlatformCmosAccessLi > b > > Null/PlatformCmosAccessLibNull.inf > > > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLi > b > > Null/PlatformCmosAccessLibNull.inf > > new file mode 100644 > > index 0000000..4816464 > > --- /dev/null > > +++ > b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAcces > > +++ sLibNull/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 (#40528): https://edk2.groups.io/g/devel/message/40528 Mute This Topic: https://groups.io/mt/31529605/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
Sure. I will send RFC for new Package. >-----Original Message----- >From: Kubacki, Michael A >Sent: Tuesday, May 14, 2019 2:53 AM >To: Gao, Liming <liming.gao@intel.com>; devel@edk2.groups.io; Dong, Eric ><eric.dong@intel.com> >Cc: Ni, Ray <ray.ni@intel.com>; Desimone, Nathaniel L ><nathaniel.l.desimone@intel.com> >Subject: RE: [edk2-devel] [Patch] [edk2-platforms] >AdvancedFeaturePkg/Cmos: Add Cmos related libraries. > >Agree, this is not a feature but code that may be reused to support multiple >features. > >We do need a new location to hold such reusable code. Liming, would you like >to >send the RFC to request this new package? > >Thanks, >Michael > >> -----Original Message----- >> From: Gao, Liming >> Sent: Monday, May 13, 2019 5:37 AM >> To: devel@edk2.groups.io; Dong, Eric <eric.dong@intel.com> >> Cc: Ni, Ray <ray.ni@intel.com>; Kubacki, Michael A >> <michael.a.kubacki@intel.com>; Desimone, Nathaniel L >> <nathaniel.l.desimone@intel.com> >> Subject: RE: [edk2-devel] [Patch] [edk2-platforms] >> AdvancedFeaturePkg/Cmos: Add Cmos related libraries. >> >> Eric: >> Now, edk2-platform devel-MinPlatform branch has merged into edk2- >> platform master branch. >> >> For this change, I propose to add new GenericBoardPkg in Platform\Intel >> directory for the common board features. >> >> Thanks >> Liming >> > -----Original Message----- >> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of >> > Dong, Eric >> > Sent: Tuesday, May 7, 2019 3:31 PM >> > To: devel@edk2.groups.io >> > Cc: Ni, Ray <ray.ni@intel.com>; Kubacki, Michael A >> > <michael.a.kubacki@intel.com>; Desimone, Nathaniel L >> > <nathaniel.l.desimone@intel.com> >> > Subject: [edk2-devel] [Patch] [edk2-platforms] >AdvancedFeaturePkg/Cmos: >> Add Cmos related libraries. >> > >> > https://bugzilla.tianocore.org/show_bug.cgi?id=1552 >> > >> > Add two libraries used to provide CMOS related operation. >> > >> > CmosAccessLib exports below APIs: >> > CmosWrite32 >> > CmosWrite16 >> > CmosWrite8 >> > CmosRead32 >> > CmosRead16 >> > CmosRead8 >> > CmosInit >> > >> > PlatformCmosAccessLib export below APIs: >> > PlatformCmosGetEntry >> > PlatformCmosGetNmiState >> > >> > PlatformCmosAccessLib will be consumed by CmosAccessLib. >> > >> > Cc: Ray Ni <ray.ni@intel.com> >> > Cc: Michael Kubacki <michael.a.kubacki@intel.com> >> > Cc: Nate Desimone <nathaniel.l.desimone@intel.com> >> > Signed-off-by: Eric Dong <eric.dong@intel.com> >> > --- >> > .../Cmos/Include/Library/CmosAccessLib.h | 112 ++++ >> > .../Include/Library/PlatformCmosAccessLib.h | 74 +++ >> > .../Library/CmosAccessLib/CmosAccessLib.c | 492 >++++++++++++++++++ >> > .../Library/CmosAccessLib/CmosAccessLib.inf | 34 ++ >> > .../CmosAccessLib/CmosAccessLibInternal.h | 41 ++ >> > .../PlatformCmosAccessLibNull.c | 45 ++ >> > .../PlatformCmosAccessLibNull.inf | 30 ++ >> > 7 files changed, 828 insertions(+) >> > create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib.h >> > create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmosAc >> c >> > essLib.h create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >> es >> > sLib.c create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >> es >> > sLib.inf create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosAcc >> es >> > sLibInternal.h create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN >> u >> > ll/PlatformCmosAccessLibNull.c create mode 100644 >> > >> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLibN >> u >> > ll/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/CmosAcces >> > +++ sLib.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 >> A >> > ccessLib.h >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos >> A >> > ccessLib.h >> > new file mode 100644 >> > index 0000000..8c44ae2 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformC >> > +++ mosAccessLib.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 >> cc >> > essLib.c >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >> cc >> > essLib.c >> > new file mode 100644 >> > index 0000000..403d8ff >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo >> > +++ sAccessLib.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 >> cc >> > essLib.inf >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >> cc >> > essLib.inf >> > new file mode 100644 >> > index 0000000..9decaf4 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo >> > +++ sAccessLib.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 >> cc >> > essLibInternal.h >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA >> cc >> > essLibInternal.h >> > new file mode 100644 >> > index 0000000..9b6d086 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo >> > +++ sAccessLibInternal.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/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.c >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.c >> > new file mode 100644 >> > index 0000000..b24a3f5 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAcces >> > +++ sLibNull/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/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.inf >> > >> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLi >> b >> > Null/PlatformCmosAccessLibNull.inf >> > new file mode 100644 >> > index 0000000..4816464 >> > --- /dev/null >> > +++ >> b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAcces >> > +++ sLibNull/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 (#40574): https://edk2.groups.io/g/devel/message/40574 Mute This Topic: https://groups.io/mt/31529605/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
© 2016 - 2024 Red Hat, Inc.