From: "Dong, Eric" <eric.dong@intel.com>
To: "Gao, Liming" <liming.gao@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Subject: Re: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries.
Date: Tue, 7 May 2019 07:36:59 +0000 [thread overview]
Message-ID: <ED077930C258884BBCB450DB737E662259E248F4@shsmsx102.ccr.corp.intel.com> (raw)
In-Reply-To: <4A89E2EF3DFEDB4C8BFDE51014F606A14E443F9C@SHSMSX104.ccr.corp.intel.com>
Liming,
Got it. Already send a mail which include edk2-platform. Will include edk2-platform/devel-MinPlatform if V2 version patch needs.
Thanks,
Eric
> -----Original Message-----
> From: Gao, Liming
> Sent: Tuesday, May 7, 2019 3:32 PM
> To: devel@edk2.groups.io; Dong, Eric <eric.dong@intel.com>
> Subject: RE: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos
> related libraries.
>
> Eric:
> The title should include edk2-platform/ devel-MinPlatform so that people
> know this patch for edk2-platform devel-MinPlatform branch.
>
> >-----Original Message-----
> >From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> >Dong, Eric
> >Sent: Tuesday, May 07, 2019 3:28 PM
> >To: devel@edk2.groups.io
> >Cc: Ni, Ray <ray.ni@intel.com>; Kubacki, Michael A
> ><michael.a.kubacki@intel.com>; Desimone, Nathaniel L
> ><nathaniel.l.desimone@intel.com>
> >Subject: [edk2-devel] [Patch] AdvancedFeaturePkg/Cmos: Add Cmos
> related
> >libraries.
> >
> >https://bugzilla.tianocore.org/show_bug.cgi?id=1552
> >
> >Add two libraries used to provide CMOS related operation.
> >
> >CmosAccessLib exports below APIs:
> > CmosWrite32
> > CmosWrite16
> > CmosWrite8
> > CmosRead32
> > CmosRead16
> > CmosRead8
> > CmosInit
> >
> >PlatformCmosAccessLib export below APIs:
> > PlatformCmosGetEntry
> > PlatformCmosGetNmiState
> >
> >PlatformCmosAccessLib will be consumed by CmosAccessLib.
> >
> >Cc: Ray Ni <ray.ni@intel.com>
> >Cc: Michael Kubacki <michael.a.kubacki@intel.com>
> >Cc: Nate Desimone <nathaniel.l.desimone@intel.com>
> >Signed-off-by: Eric Dong <eric.dong@intel.com>
> >---
> > .../Cmos/Include/Library/CmosAccessLib.h | 112 ++++
> > .../Include/Library/PlatformCmosAccessLib.h | 74 +++
> > .../Library/CmosAccessLib/CmosAccessLib.c | 492 ++++++++++++++++++
> > .../Library/CmosAccessLib/CmosAccessLib.inf | 34 ++
> > .../CmosAccessLib/CmosAccessLibInternal.h | 41 ++
> > .../PlatformCmosAccessLibNull.c | 45 ++
> > .../PlatformCmosAccessLibNull.inf | 30 ++
> > 7 files changed, 828 insertions(+)
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessLib
> .h
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmos
> Acc
> >essLib.h
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
> cc
> >essLib.c
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
> cc
> >essLib.inf
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/CmosA
> cc
> >essLibInternal.h
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
> N
> >ull/PlatformCmosAccessLibNull.c
> > create mode 100644
> >Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccessLib
> N
> >ull/PlatformCmosAccessLibNull.inf
> >
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccessL
> ib
> >.h
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccess
> Lib
> >.h
> >new file mode 100644
> >index 0000000..5f5029c
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/CmosAccess
> Lib
> >.h
> >@@ -0,0 +1,112 @@
> >+/** @file
> >+ CmosAccessLib header file.
> >+
> >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> This
> >+program and the accompanying materials are licensed and made
> >available under
> >+the terms and conditions of the BSD License that accompanies this
> >distribution.
> >+The full text of the license may be found at
> >+http://opensource.org/licenses/bsd-license.php.
> >+
> >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+
> >+**/
> >+
> >+#ifndef _CMOS_ACCESS_LIB_H_
> >+#define _CMOS_ACCESS_LIB_H_
> >+
> >+/**
> >+ Read a byte value from a CMOS address.
> >+
> >+ @param [in] Address Location to read from CMOS
> >+
> >+ @return The byte value read from the CMOS address.
> >+**/
> >+UINT8
> >+EFIAPI
> >+CmosRead8 (
> >+ IN UINT8 Address
> >+ );
> >+
> >+/**
> >+ Write a byte value to a CMOS address.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The byte value write to the CMOS address.
> >+**/
> >+VOID
> >+EFIAPI
> >+CmosWrite8 (
> >+ IN UINT8 Address,
> >+ IN UINT8 Data
> >+ );
> >+
> >+/**
> >+ Read a word value from a CMOS address.
> >+
> >+ @param [in] Address Location to read from CMOS
> >+
> >+ @return The word value read from the CMOS address.
> >+**/
> >+UINT16
> >+EFIAPI
> >+CmosRead16 (
> >+ IN UINT8 Address
> >+ );
> >+
> >+/**
> >+ Write a word value to a CMOS address.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The word value write to the CMOS address.
> >+**/
> >+VOID
> >+EFIAPI
> >+CmosWrite16 (
> >+ IN UINT8 Address,
> >+ IN UINT16 Data
> >+ );
> >+
> >+/**
> >+ Read a dword value from a CMOS address.
> >+
> >+ @param [in] Address Location to read from CMOS
> >+
> >+ @return The dword value read from the CMOS address.
> >+**/
> >+UINT32
> >+EFIAPI
> >+CmosRead32 (
> >+ IN UINT8 Address
> >+ );
> >+
> >+/**
> >+ Write a dword value to a CMOS address.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The dword value write to the CMOS address.
> >+**/
> >+VOID
> >+EFIAPI
> >+CmosWrite32 (
> >+ IN UINT8 Address,
> >+ IN UINT32 Data
> >+ );
> >+
> >+/**
> >+ Initialize the CMOS.
> >+
> >+ It initialize the CMOS area when Force is TRUE or the checksum is
> incorrect.
> >+
> >+ @param[in] Force TRUE indicating initializing the CMOS area
> >+ without
> >checking the checksum.
> >+
> >+ @retval TRUE The CMOS is initialized to default value.
> >+ @retval FALSE The CMOS isn't initialized to default value.
> >+**/
> >+BOOLEAN
> >+EFIAPI
> >+CmosInit (
> >+ IN BOOLEAN Force
> >+ );
> >+
> >+#endif // _CMOS_ACCESS_LIB_H_
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCmo
> s
> >AccessLib.h
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCm
> os
> >AccessLib.h
> >new file mode 100644
> >index 0000000..8c44ae2
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Include/Library/PlatformCm
> os
> >AccessLib.h
> >@@ -0,0 +1,74 @@
> >+/** @file
> >+ Platform CMOS Access Library Header File.
> >+
> >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> This
> >+program and the accompanying materials are licensed and made
> >available under
> >+the terms and conditions of the BSD License that accompanies this
> >distribution.
> >+The full text of the license may be found at
> >+http://opensource.org/licenses/bsd-license.php.
> >+
> >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+
> >+**/
> >+
> >+#ifndef _PLATFORM_CMOS_ACCESS_LIB_H_
> >+#define _PLATFORM_CMOS_ACCESS_LIB_H_
> >+
> >+///
> >+/// Flag indicating checksum calculation doesn't include this location.
> >+/// NOTE: If a location isn't shown in platform CMOS entry table,
> >+/// it means checksum calculation doesn't include the location.
> >+///
> >+#define CMOS_EXCLUDE_FROM_CHECKSUM BIT0
> >+
> >+///
> >+/// Flag indicating initialization doesn't cover this location.
> >+/// NOTE: If a location isn't shown in platform CMOS entry table,
> >+/// it means the location is initialized with CMOS_DEFAULT_VALUE (0).
> >+///
> >+#define CMOS_EXCLUDE_FROM_INIT_DATA BIT1
> >+
> >+///
> >+/// Flag indicating the location cannot be accessed.
> >+/// NOTE: 0x0 ~ 0xD is implictly inaccessible.
> >+///
> >+#define CMOS_EXCLUDE_FROM_ACCESS (BIT3 |
> >CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA)
> >+
> >+///
> >+/// Flag indicating the checksum location /// NOTE: At most two
> >+entries can have this flag set.
> >+///
> >+#define CMOS_CHECKSUM_LOCATION (BIT2 |
> >CMOS_EXCLUDE_FROM_CHECKSUM | CMOS_EXCLUDE_FROM_INIT_DATA)
> >+
> >+#define CMOS_DEFAULT_VALUE 0x00
> >+
> >+typedef struct {
> >+ UINT8 Address;
> >+ UINT8 DefaultValue;
> >+ UINT8 Attributes;
> >+} CMOS_ENTRY;
> >+
> >+/**
> >+ Return the platform CMOS entries.
> >+
> >+ @param [out] EntryCount Return the count of platform CMOS entries.
> >+
> >+ @return Platform CMOS entries.
> >+**/
> >+CMOS_ENTRY *
> >+EFIAPI
> >+PlatformCmosGetEntry (
> >+ OUT UINTN *EntryCount
> >+ );
> >+
> >+/**
> >+ Return the NMI enable status.
> >+**/
> >+BOOLEAN
> >+EFIAPI
> >+PlatformCmosGetNmiState (
> >+ VOID
> >+ );
> >+
> >+#endif // _PLATFORM_CMOS_ACCESS_LIB_H_
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmos
> A
> >ccessLib.c
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLib.c
> >new file mode 100644
> >index 0000000..403d8ff
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLib.c
> >@@ -0,0 +1,492 @@
> >+/** @file
> >+ CmosAccessLib implementation.
> >+
> >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> This
> >+program and the accompanying materials are licensed and made
> >available under
> >+the terms and conditions of the BSD License that accompanies this
> >distribution.
> >+The full text of the license may be found at
> >+http://opensource.org/licenses/bsd-license.php.
> >+
> >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+
> >+**/
> >+
> >+#include "CmosAccessLibInternal.h"
> >+
> >+/**
> >+ Return the entry for the specified address in entries returned
> >+ from platform.
> >+
> >+ @param [in] Address The CMOS address to find.
> >+
> >+ @return A pointer to CMOS_ENTRY for the specified address,
> >+ or NULL if not found.
> >+**/
> >+CMOS_ENTRY *
> >+CmosAccessLibLocateEntry (
> >+ IN UINT8 Address
> >+ )
> >+{
> >+ UINTN Index;
> >+ UINTN Count;
> >+ CMOS_ENTRY *Entries;
> >+
> >+ Entries = PlatformCmosGetEntry (&Count); for (Index = 0; Index <
> >+ Count; Index++) {
> >+ if (Entries[Index].Address == Address) {
> >+ return &Entries[Index];
> >+ }
> >+ }
> >+
> >+ return NULL;
> >+}
> >+
> >+/**
> >+ Test the attributes of the Entry and return ValueIfSet if test
> >+passes
> >+ or !ValueIfSet if test fails. It returns DefaultValue if the Entry
> >+is
> >+ NULL.
> >+
> >+ @param [in] Address The CMOS address.
> >+ @param [in] Attributes The attributes to test.
> >+ @param [in] ValueIfSet The value to return if test passes.
> >+ @param [in] DefaultValue The value to return if Entry is NULL.
> >+ @param [in] Entry Pointer to entry.
> >+
> >+ @retval ValueIfSet If test passes.
> >+ @retval !ValueIfSet If test fails.
> >+ @retval DefaultValue If the Entry is NULL.
> >+**/
> >+BOOLEAN
> >+CmosAccessLibCheckAttribute (
> >+ IN UINT8 Address,
> >+ IN UINT8 Attributes,
> >+ IN BOOLEAN ValueIfSet,
> >+ IN BOOLEAN DefaultValue,
> >+ IN CMOS_ENTRY *Entry OPTIONAL
> >+ )
> >+{
> >+ if (Entry != NULL) {
> >+ ASSERT (Entry->Address == Address);
> >+ if ((Entry->Attributes & Attributes) == Attributes) {
> >+ return ValueIfSet;
> >+ } else {
> >+ return !ValueIfSet;
> >+ }
> >+ }
> >+
> >+ return DefaultValue;
> >+}
> >+
> >+/**
> >+ Check if the CMOS address needs Checksum calculation.
> >+
> >+ @param [in] Address CMOS address to be checked
> >+ @param [in] Entry Pointer to entry.
> >+
> >+ @retval TRUE CMOS address needs Checksum calculation.
> >+ @retval FALSE CMOS address doesn't need Checksum calculation.
> >+**/
> >+BOOLEAN
> >+CmosAccessLibNeedChecksum (
> >+ IN UINT8 Address,
> >+ IN CMOS_ENTRY *Entry OPTIONAL
> >+ )
> >+{
> >+ return CmosAccessLibCheckAttribute (Address,
> >CMOS_EXCLUDE_FROM_CHECKSUM, FALSE, FALSE, Entry);
> >+}
> >+
> >+
> >+/**
> >+ Check if the CMOS address needs to fill default data.
> >+
> >+ @param [in] Address CMOS address to be checked
> >+ @param [in] Entry Pointer to entry.
> >+
> >+ @retval TRUE CMOS address need to fill default data.
> >+ @retval FALSE CMOS address doesn't need to fill default data.
> >+**/
> >+BOOLEAN
> >+CmosAccessLibNeedFillDefault (
> >+ IN UINT8 Address,
> >+ IN CMOS_ENTRY *Entry OPTIONAL
> >+ )
> >+{
> >+ return CmosAccessLibCheckAttribute (Address,
> >CMOS_EXCLUDE_FROM_INIT_DATA, FALSE, TRUE, Entry);
> >+}
> >+
> >+/**
> >+ Check if the CMOS address is accessible.
> >+
> >+ @param [in] Address CMOS address to be checked.
> >+ @param [in] Entry Pointer to entry.
> >+
> >+ @retval TRUE CMOS address is accessible.
> >+ @retval FALSE CMOS address isn't accessible.
> >+**/
> >+BOOLEAN
> >+CmosAccessLibIsAccessible (
> >+ IN UINT8 Address,
> >+ IN CMOS_ENTRY *Entry OPTIONAL
> >+ )
> >+{
> >+ //
> >+ // CMOS 0-9, A, B, C, D are for RTC.
> >+ //
> >+ if (Address <= 0xD) {
> >+ return FALSE;
> >+ }
> >+ return CmosAccessLibCheckAttribute (Address,
> >CMOS_EXCLUDE_FROM_ACCESS, FALSE, TRUE, Entry);
> >+}
> >+
> >+/**
> >+ Return the CMOS location to store checksum.
> >+
> >+ @param [out] Location Return the CMOS location to store the checksum.
> >+**/
> >+VOID
> >+CmosAccessLibGetChecksumLocation (
> >+ OUT CMOS_CHECKSUM_LOCATION_INFO *Location
> >+ )
> >+{
> >+ UINTN Index;
> >+ UINTN Count;
> >+ CMOS_ENTRY *Entries;
> >+
> >+ Location->Length = 0;
> >+
> >+ Entries = PlatformCmosGetEntry (&Count); for (Index = 0; Index <
> >+ Count; Index++) {
> >+ if ((Entries[Index].Attributes & CMOS_CHECKSUM_LOCATION) ==
> >CMOS_CHECKSUM_LOCATION) {
> >+ Location->Length++;
> >+ if (Location->Length == 1) {
> >+ Location->LowByteAddress = Entries[Index].Address;
> >+ } else if (Location->Length == 2) {
> >+ Location->HighByteAddress = Entries[Index].Address;
> >+ break;
> >+ }
> >+ }
> >+ }
> >+
> >+ ASSERT (Location->Length <= 2);
> >+}
> >+
> >+/**
> >+ Calculate the sum of CMOS values who need checksum calculation.
> >+
> >+ @param [in] Location The CMOS location to store the checksum.
> >+
> >+ @return The sum.
> >+**/
> >+UINT16
> >+CmosAccessLibCalculateSum (
> >+ IN CMOS_CHECKSUM_LOCATION_INFO *Location
> >+ )
> >+{
> >+ UINT16 Sum;
> >+ UINTN Index;
> >+ UINTN Count;
> >+ CMOS_ENTRY *Entries;
> >+
> >+ if (Location->Length == 0) {
> >+ return 0;
> >+ }
> >+
> >+ Sum = 0;
> >+ Entries = PlatformCmosGetEntry (&Count); for (Index = 0; Index <
> >+ Count; Index++) {
> >+ if (CmosAccessLibNeedChecksum (Entries[Index].Address,
> >&Entries[Index])) {
> >+ Sum += CmosRead8 (Entries[Index].Address);
> >+ }
> >+ }
> >+
> >+ if (Location->Length == 1) {
> >+ return (UINT8) Sum;
> >+ } else {
> >+ return Sum;
> >+ }
> >+}
> >+
> >+/**
> >+ Return the checksum value stored in CMOS.
> >+
> >+ @param [in] Location The CMOS location to store the checksum.
> >+
> >+ @return The checksum value.
> >+**/
> >+UINT16
> >+CmosAccessLibReadChecksum (
> >+ IN CMOS_CHECKSUM_LOCATION_INFO *Location
> >+ )
> >+{
> >+ UINT16 Checksum;
> >+
> >+ Checksum = 0;
> >+
> >+ switch (Location->Length) {
> >+ case 2:
> >+ Checksum = (CmosRead8 (Location->HighByteAddress) << 8);
> >+ //
> >+ // Fall to case 1 to get the low byte value
> >+ //
> >+ case 1:
> >+ Checksum += CmosRead8 (Location->LowByteAddress);
> >+ break;
> >+
> >+ default:
> >+ break;
> >+ }
> >+ return Checksum;
> >+}
> >+
> >+
> >+/**
> >+ Write the Checksum to appropriate address.
> >+
> >+ @param [in] Location The CMOS location to store the checksum.
> >+ @param [in] Checksum The checksum value.
> >+**/
> >+VOID
> >+CmosAccessLibWriteChecksum (
> >+ CMOS_CHECKSUM_LOCATION_INFO *Location,
> >+ IN UINT16 Checksum
> >+ )
> >+{
> >+
> >+ switch (Location->Length) {
> >+ case 0:
> >+ break;
> >+ case 2:
> >+ CmosWrite8 (Location->HighByteAddress, Checksum >> 8);
> >+ //
> >+ // Fall to case 1 to update low byte value
> >+ //
> >+ case 1:
> >+ CmosWrite8 (Location->LowByteAddress, (UINT8) Checksum);
> >+ break;
> >+ }
> >+}
> >+
> >+/**
> >+ Read a byte value from a CMOS address.
> >+
> >+ @param [in] Address Location to read from CMOS
> >+
> >+ @return The byte value read from the CMOS address.
> >+**/
> >+UINT8
> >+EFIAPI
> >+CmosRead8 (
> >+ IN UINT8 Address
> >+ )
> >+{
> >+ if (!CmosAccessLibIsAccessible (Address, CmosAccessLibLocateEntry
> >(Address))) {
> >+ return 0xFF;
> >+ }
> >+
> >+ if (Address <= CMOS_BANK0_LIMIT) {
> >+ if (PlatformCmosGetNmiState ()) {
> >+ Address |= BIT7;
> >+ }
> >+ IoWrite8 (PORT_70, Address);
> >+ return IoRead8 (PORT_71);
> >+ } else {
> >+ IoWrite8 (PORT_72, Address);
> >+ return IoRead8 (PORT_73);
> >+ }
> >+}
> >+
> >+/**
> >+ Write a byte value to a CMOS address.
> >+
> >+ It's an internal function that doesn't update the checksum.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The byte value write to the CMOS address.
> >+**/
> >+VOID
> >+CmosAccessLibICmosWrite8 (
> >+ IN UINT8 Address,
> >+ IN UINT8 Data
> >+ )
> >+{
> >+ if (Address <= CMOS_BANK0_LIMIT) {
> >+ if (PlatformCmosGetNmiState ()) {
> >+ Address |= BIT7;
> >+ }
> >+ IoWrite8 (PORT_70, Address);
> >+ IoWrite8 (PORT_71, Data);
> >+ } else {
> >+ IoWrite8 (PORT_72, Address);
> >+ IoWrite8 (PORT_73, Data);
> >+ }
> >+}
> >+
> >+/**
> >+ Write a byte value to a CMOS address.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The byte value write to the CMOS address.
> >+**/
> >+VOID
> >+EFIAPI
> >+CmosWrite8 (
> >+ IN UINT8 Address,
> >+ IN UINT8 Data
> >+ )
> >+{
> >+ UINT8 OriginalData;
> >+ CMOS_ENTRY *Entry;
> >+ CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation;
> >+
> >+ Entry = CmosAccessLibLocateEntry (Address);
> >+
> >+ if (!CmosAccessLibIsAccessible (Address, Entry)) {
> >+ return;
> >+ }
> >+
> >+ OriginalData = CmosRead8 (Address);
> >+
> >+ CmosAccessLibICmosWrite8 (Address, Data);
> >+
> >+ if (CmosAccessLibNeedChecksum (Address, Entry)) {
> >+ //
> >+ // Sum of Data + Checksum = New Sum of Data + New Checksum = 0
> >+ // New Sum of Data - Sum of Data = Checksum - New Checksum
> >+ // New Checksum = Checksum - (New Sum of Data - Sum of Data)
> >+ //
> >+ CmosAccessLibGetChecksumLocation (&ChecksumLocation);
> >+ CmosAccessLibWriteChecksum (
> >+ &ChecksumLocation,
> >+ CmosAccessLibReadChecksum (&ChecksumLocation) - (Data -
> >OriginalData)
> >+ );
> >+ }
> >+}
> >+
> >+/**
> >+ Read a word value from a CMOS address.
> >+
> >+ @param [in] Address Location to read from CMOS
> >+
> >+ @return The word value read from the CMOS address.
> >+**/
> >+UINT16
> >+EFIAPI
> >+CmosRead16 (
> >+ IN UINT8 Address
> >+ )
> >+{
> >+ return CmosRead8 (Address) + (CmosRead8 (Address + 1) << 8); }
> >+
> >+/**
> >+ Write a word value to a CMOS address.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The word value write to the CMOS address.
> >+**/
> >+VOID
> >+EFIAPI
> >+CmosWrite16 (
> >+ IN UINT8 Address,
> >+ IN UINT16 Data
> >+ )
> >+{
> >+ CmosWrite8 (Address, (UINT8) Data);
> >+ CmosWrite8 (Address + 1, (UINT8) (Data >> 8)); }
> >+
> >+/**
> >+ Read a dword value from a CMOS address.
> >+
> >+ @param [in] Address Location to read from CMOS
> >+
> >+ @return The dword value read from the CMOS address.
> >+**/
> >+UINT32
> >+EFIAPI
> >+CmosRead32 (
> >+ IN UINT8 Address
> >+ )
> >+{
> >+ return CmosRead16 (Address) + (CmosRead16 (Address + 2) << 16); }
> >+
> >+/**
> >+ Write a dword value to a CMOS address.
> >+
> >+ @param [in] Address Location to write to CMOS.
> >+ @param [in] Data The dword value write to the CMOS address.
> >+**/
> >+VOID
> >+EFIAPI
> >+CmosWrite32 (
> >+ IN UINT8 Address,
> >+ IN UINT32 Data
> >+ )
> >+{
> >+ CmosWrite16 (Address, (UINT16) Data);
> >+ CmosWrite16 (Address + 2, (UINT16) (Data >> 16)); }
> >+
> >+
> >+/**
> >+ Initialize the CMOS.
> >+
> >+ It initialize the CMOS area when Force is TRUE or the checksum is
> incorrect.
> >+
> >+ @param[in] Force TRUE indicating initializing the CMOS area
> >+ without
> >checking the checksum.
> >+
> >+ @retval TRUE The CMOS is initialized to default value.
> >+ @retval FALSE The CMOS isn't initialized to default value.
> >+**/
> >+BOOLEAN
> >+EFIAPI
> >+CmosInit (
> >+ IN BOOLEAN Force
> >+ )
> >+{
> >+ UINTN Address;
> >+ CMOS_ENTRY *Entry;
> >+ CMOS_CHECKSUM_LOCATION_INFO ChecksumLocation;
> >+ UINT16 Checksum;
> >+
> >+ CmosAccessLibGetChecksumLocation (&ChecksumLocation);
> >+
> >+ if (!Force) {
> >+ //
> >+ // Initialize the CMOS area when checksum is incorrect.
> >+ //
> >+ Checksum = CmosAccessLibCalculateSum (&ChecksumLocation) +
> >CmosAccessLibReadChecksum (&ChecksumLocation);
> >+ if (ChecksumLocation.Length == 1) {
> >+ Checksum = (UINT8) Checksum;
> >+ }
> >+
> >+ if (Checksum != 0) {
> >+ Force = TRUE;
> >+ }
> >+ }
> >+
> >+ if (Force) {
> >+ //
> >+ // Traverse through entire CMOS location and fill it with zero
> >+ //
> >+ for (Address = 0; Address <= CMOS_BANK1_LIMIT; Address++) {
> >+ Entry = CmosAccessLibLocateEntry ((UINT8) Address);
> >+ if (CmosAccessLibNeedFillDefault ((UINT8) Address, Entry)) {
> >+ CmosAccessLibICmosWrite8 ((UINT8) Address, (Entry == NULL) ?
> >CMOS_DEFAULT_VALUE : Entry->DefaultValue);
> >+ }
> >+ }
> >+
> >+ //
> >+ // Write the New checksum to the Checksum field
> >+ //
> >+ CmosAccessLibWriteChecksum (
> >+ &ChecksumLocation,
> >+ (UINT16) (0x10000 - CmosAccessLibCalculateSum (&ChecksumLocation))
> >+ );
> >+ return TRUE;
> >+ }
> >+
> >+ return FALSE;
> >+}
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmos
> A
> >ccessLib.inf
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLib.inf
> >new file mode 100644
> >index 0000000..9decaf4
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLib.inf
> >@@ -0,0 +1,34 @@
> >+### @file
> >+# Library producing CMOS access functionality.
> >+#
> >+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> # #
> >+This program and the accompanying materials are licensed and made
> >available under
> >+# the terms and conditions of the BSD License which accompanies this
> >distribution.
> >+# The full text of the license may be found at #
> >+http://opensource.org/licenses/bsd-license.php
> >+#
> >+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+#
> >+###
> >+[Defines]
> >+ INF_VERSION = 0x00010005
> >+ BASE_NAME = CmosAccessLib
> >+ FILE_GUID = FF6B645D-C001-4ACE-9CA1-199F97C2D601
> >+ VERSION_STRING = 1.0
> >+ MODULE_TYPE = BASE
> >+ LIBRARY_CLASS = CmosAccessLib
> >+
> >+[Sources]
> >+ CmosAccessLib.c
> >+ CmosAccessLibInternal.h
> >+
> >+[LibraryClasses]
> >+ IoLib
> >+ DebugLib
> >+ PlatformCmosAccessLib
> >+
> >+[Packages]
> >+ MdePkg/MdePkg.dec
> >+ AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> >\ No newline at end of file
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmos
> A
> >ccessLibInternal.h
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLibInternal.h
> >new file mode 100644
> >index 0000000..9b6d086
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/CmosAccessLib/Cmo
> sA
> >ccessLibInternal.h
> >@@ -0,0 +1,41 @@
> >+/** @file
> >+ CmosAccessLib internal header file.
> >+
> >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> This
> >+program and the accompanying materials are licensed and made
> >available under
> >+the terms and conditions of the BSD License that accompanies this
> >distribution.
> >+The full text of the license may be found at
> >+http://opensource.org/licenses/bsd-license.php.
> >+
> >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+
> >+**/
> >+
> >+#ifndef _CMOS_ACCESS_LIB_INTERNALS_
> >+#define _CMOS_ACCESS_LIB_INTERNALS_
> >+
> >+#include <Base.h>
> >+#include <Uefi.h>
> >+#include <Library/IoLib.h>
> >+#include <Library/DebugLib.h>
> >+#include <Library/CmosAccessLib.h>
> >+#include <Library/PlatformCmosAccessLib.h>
> >+
> >+// CMOS access Port address
> >+
> >+#define PORT_70 0x70
> >+#define PORT_71 0x71
> >+#define PORT_72 0x72
> >+#define PORT_73 0x73
> >+
> >+#define CMOS_BANK0_LIMIT 0x7F
> >+#define CMOS_BANK1_LIMIT 0xFF
> >+
> >+typedef struct {
> >+ UINT8 Length;
> >+ UINT8 LowByteAddress;
> >+ UINT8 HighByteAddress;
> >+} CMOS_CHECKSUM_LOCATION_INFO;
> >+
> >+#endif // _CMOS_ACCESS_LIB_INTERNALS_
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.c
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.c
> >new file mode 100644
> >index 0000000..b24a3f5
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.c
> >@@ -0,0 +1,45 @@
> >+/** @file
> >+ Platform CMOS Access Library.
> >+
> >+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> This
> >+program and the accompanying materials are licensed and made
> >available under
> >+the terms and conditions of the BSD License that accompanies this
> >distribution.
> >+The full text of the license may be found at
> >+http://opensource.org/licenses/bsd-license.php.
> >+
> >+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+
> >+**/
> >+
> >+#include <Base.h>
> >+#include <Library/PlatformCmosAccessLib.h>
> >+
> >+/**
> >+ Return the platform CMOS entries.
> >+
> >+ @param [out] EntryCount Return the count of platform CMOS entries.
> >+
> >+ @return Platform CMOS entries.
> >+**/
> >+CMOS_ENTRY *
> >+EFIAPI
> >+PlatformCmosGetEntry (
> >+ OUT UINTN *EntryCount
> >+ )
> >+{
> >+ *EntryCount = 0;
> >+ return NULL;
> >+}
> >+
> >+/**
> >+ Return the NMI enable status.
> >+**/
> >+BOOLEAN
> >+EFIAPI
> >+PlatformCmosGetNmiState (
> >+ VOID
> >+ )
> >+{
> >+ return FALSE;
> >+}
> >diff --git
> >a/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.inf
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.inf
> >new file mode 100644
> >index 0000000..4816464
> >--- /dev/null
> >+++
> >b/Platform/Intel/AdvancedFeaturePkg/Cmos/Library/PlatformCmosAccess
> Lib
> >Null/PlatformCmosAccessLibNull.inf
> >@@ -0,0 +1,30 @@
> >+### @file
> >+# Library producing CMOS access functionalities are relevant to platform.
> >+#
> >+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> # #
> >+This program and the accompanying materials are licensed and made
> >available under
> >+# the terms and conditions of the BSD License which accompanies this
> >distribution.
> >+# The full text of the license may be found at #
> >+http://opensource.org/licenses/bsd-license.php
> >+#
> >+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >BASIS,
> >+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >EXPRESS OR IMPLIED.
> >+#
> >+###
> >+
> >+[Defines]
> >+ INF_VERSION = 0x00010005
> >+ BASE_NAME = PlatformCmosAccessLib
> >+ FILE_GUID = C315A8B6-FF6C-41D1-A934-7330501F308C
> >+ VERSION_STRING = 1.0
> >+ MODULE_TYPE = BASE
> >+ LIBRARY_CLASS = PlatformCmosAccessLib
> >+
> >+
> >+[Sources]
> >+ PlatformCmosAccessLibNull.c
> >+
> >+[Packages]
> >+ MdePkg/MdePkg.dec
> >+ AdvancedFeaturePkg/AdvancedFeaturePkg.dec
> >\ No newline at end of file
> >--
> >2.21.0.windows.1
> >
> >
> >
prev parent reply other threads:[~2019-05-07 7:37 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-07 7:27 [Patch] AdvancedFeaturePkg/Cmos: Add Cmos related libraries Dong, Eric
2019-05-07 7:31 ` [edk2-devel] " Liming Gao
2019-05-07 7:36 ` Dong, Eric [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ED077930C258884BBCB450DB737E662259E248F4@shsmsx102.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox