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