19b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/** @file
29b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
39b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCopyright (c) 2013-2015 Intel Corporation.
49b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
59b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyThis program and the accompanying materials
69b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyare licensed and made available under the terms and conditions of the BSD License
79b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneywhich accompanies this distribution.  The full text of the license may be found at
89b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinneyhttp://opensource.org/licenses/bsd-license.php
99b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney**/
159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// Include common header file for this module.
189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include "CommonHeader.h"
209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include "QNCSmm.h"
229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney#include "QNCSmmHelpers.h"
239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// #define BIT_ZERO 0x00000001
269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCONST UINT32  BIT_ZERO = 0x00000001;
289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// /////////////////////////////////////////////////////////////////////////////
319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// SUPPORT / HELPER FUNCTIONS (QNC version-independent)
329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney//
339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyBOOLEAN
349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCompareEnables (
359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src1,
369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src2
379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src1  - GC_TODO: add argument description
479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src2  - GC_TODO: add argument description
489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN IsEqual;
569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN   loopvar;
579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IsEqual = TRUE;
599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {
609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // It's okay to compare a NULL bit description to a non-NULL bit description.
629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // They are unequal and these tests will generate the correct result.
639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (Src1->En[loopvar].Bit != Src2->En[loopvar].Bit ||
659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        Src1->En[loopvar].Reg.Type != Src2->En[loopvar].Reg.Type ||
669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        Src1->En[loopvar].Reg.Data.raw != Src2->En[loopvar].Reg.Data.raw
679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        ) {
689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      IsEqual = FALSE;
699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      break;
709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      // out of for loop
729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return IsEqual;
779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyBOOLEAN
809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCompareStatuses (
819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src1,
829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src2
839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src1  - GC_TODO: add argument description
939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src2  - GC_TODO: add argument description
949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
1009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN IsEqual;
1029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN   loopvar;
1039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IsEqual = TRUE;
1059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {
1079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
1089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // It's okay to compare a NULL bit description to a non-NULL bit description.
1099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // They are unequal and these tests will generate the correct result.
1109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
1119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (Src1->Sts[loopvar].Bit != Src2->Sts[loopvar].Bit ||
1129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        Src1->Sts[loopvar].Reg.Type != Src2->Sts[loopvar].Reg.Type ||
1139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        Src1->Sts[loopvar].Reg.Data.raw != Src2->Sts[loopvar].Reg.Data.raw
1149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        ) {
1159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      IsEqual = FALSE;
1169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      break;
1179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
1189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      // out of for loop
1199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
1209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
1219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
1229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return IsEqual;
1249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
1259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyBOOLEAN
1279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyCompareSources (
1289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src1,
1299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src2
1309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
1319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
1329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
1349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
1369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
1389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src1  - GC_TODO: add argument description
1409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src2  - GC_TODO: add argument description
1419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
1439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
1459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
1479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return (BOOLEAN) (CompareEnables (Src1, Src2) && CompareStatuses (Src1, Src2));
1499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
1509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyBOOLEAN
1529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneySourceIsActive (
1539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST IN QNC_SMM_SOURCE_DESC *Src
1549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
1559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
1569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
1589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
1609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
1629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Src - GC_TODO: add argument description
1649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
1669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
1689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
1709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
1719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN IsActive;
1729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN   loopvar;
1739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN SciEn;
1759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  IsActive  = TRUE;
1779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SciEn     = QNCSmmGetSciEn ();
1799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  if ((Src->Flags & QNC_SMM_SCI_EN_DEPENDENT) && (SciEn)) {
1819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
1829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // This source is dependent on SciEn, and SciEn == 1.  An ACPI OS is present,
1839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // so we shouldn't do anything w/ this source until SciEn == 0.
1849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
1859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    IsActive = FALSE;
1869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  } else {
1889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
1899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    // Read each bit desc from hardware and make sure it's a one
1909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    //
1919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {
1929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      if (!IS_BIT_DESC_NULL (Src->En[loopvar])) {
1949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
1959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        if (ReadBitDesc (&Src->En[loopvar]) == 0) {
1969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          IsActive = FALSE;
1979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          break;
1989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          //
1999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          // out of for loop
2009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          //
2019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        }
2029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      }
2049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
2059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (IsActive) {
2079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
2089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      // Read each bit desc from hardware and make sure it's a one
2099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
2109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {
2119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        if (!IS_BIT_DESC_NULL (Src->Sts[loopvar])) {
2139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          if (ReadBitDesc (&Src->Sts[loopvar]) == 0) {
2159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney            IsActive = FALSE;
2169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney            break;
2179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney            //
2189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney            // out of for loop
2199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney            //
2209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney          }
2219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        }
2239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      }
2249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
2259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
2269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  return IsActive;
2289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyQNCSmmEnableSource (
2329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST QNC_SMM_SOURCE_DESC *SrcDesc
2339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
2359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
2379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
2399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
2419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SrcDesc - GC_TODO: add argument description
2439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
2459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
2479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
2499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN loopvar;
2519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
2539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  // Set enables to 1 by writing a 1
2549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  //
2559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {
2569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (!IS_BIT_DESC_NULL (SrcDesc->En[loopvar])) {
2579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      WriteBitDesc (&SrcDesc->En[loopvar], 1);
2589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
2599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
2609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  QNCSmmClearSource (SrcDesc);
2629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyQNCSmmDisableSource (
2679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST QNC_SMM_SOURCE_DESC *SrcDesc
2689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
2709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
2729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
2749b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2759b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
2769b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2779b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SrcDesc - GC_TODO: add argument description
2789b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2799b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
2809b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2819b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
2829b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2839b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
2849b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
2859b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN loopvar;
2869b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2879b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  for (loopvar = 0; loopvar < NUM_EN_BITS; loopvar++) {
2889b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (!IS_BIT_DESC_NULL (SrcDesc->En[loopvar])) {
2899b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      WriteBitDesc (&SrcDesc->En[loopvar], 0);
2909b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
2919b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
2929b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
2939b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
2949b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
2959b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyQNCSmmClearSource (
2969b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST QNC_SMM_SOURCE_DESC *SrcDesc
2979b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
2989b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*++
2999b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3009b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyRoutine Description:
3019b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3029b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: Add function description
3039b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3049b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyArguments:
3059b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3069b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  SrcDesc - GC_TODO: add argument description
3079b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3089b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyReturns:
3099b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3109b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  GC_TODO: add return values
3119b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3129b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney--*/
3139b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
3149b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN loopvar;
3159b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN ValueToWrite;
3169b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3179b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  ValueToWrite =
3189b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    ((SrcDesc->Flags & QNC_SMM_CLEAR_WITH_ZERO) == 0) ? TRUE : FALSE;
3199b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3209b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {
3219b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (!IS_BIT_DESC_NULL (SrcDesc->Sts[loopvar])) {
3229b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      WriteBitDesc (&SrcDesc->Sts[loopvar], ValueToWrite);
3239b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
3249b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
3259b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
3269b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3279b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyVOID
3289b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael KinneyQNCSmmClearSourceAndBlock (
3299b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  CONST QNC_SMM_SOURCE_DESC *SrcDesc
3309b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  )
3319b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// GC_TODO: function comment should start with '/*++'
3329b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney/*
3339b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Sets the source to a 1 or 0 and then waits for it to clear.
3349b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  Be very careful when calling this function -- it will not
3359b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  ASSERT.  An acceptable case to call the function is when
3369b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  waiting for the NEWCENTURY_STS bit to clear (which takes
3379b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  3 RTCCLKs).
3389b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney*/
3399b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// GC_TODO: function comment should end with '--*/'
3409b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// GC_TODO: function comment is missing 'Routine Description:'
3419b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// GC_TODO: function comment is missing 'Arguments:'
3429b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// GC_TODO: function comment is missing 'Returns:'
3439b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney// GC_TODO:    SrcDesc - add argument and description to function comment
3449b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney{
3459b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  UINTN   loopvar;
3469b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN IsSet;
3479b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  BOOLEAN ValueToWrite;
3489b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3499b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  ValueToWrite =
3509b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    ((SrcDesc->Flags & QNC_SMM_CLEAR_WITH_ZERO) == 0) ? TRUE : FALSE;
3519b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3529b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  for (loopvar = 0; loopvar < NUM_STS_BITS; loopvar++) {
3539b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3549b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    if (!IS_BIT_DESC_NULL (SrcDesc->Sts[loopvar])) {
3559b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
3569b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      // Write the bit
3579b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
3589b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      WriteBitDesc (&SrcDesc->Sts[loopvar], ValueToWrite);
3599b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney
3609b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
3619b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      // Don't return until the bit actually clears.
3629b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      //
3639b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      IsSet = TRUE;
3649b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      while (IsSet) {
3659b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        IsSet = ReadBitDesc (&SrcDesc->Sts[loopvar]);
3669b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        //
3679b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        // IsSet will eventually clear -- or else we'll have
3689b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        // an infinite loop.
3699b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney        //
3709b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney      }
3719b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney    }
3729b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney  }
3739b6bbcdbfdf5e54c6d1ed538ea8076d0858fb164Michael Kinney}
374