--- /dev/null
+/** @file\r
+Prototypes and defines for the QNC SMM Dispatcher.\r
+\r
+Copyright (c) 2013-2015 Intel Corporation.\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef QNC_SMM_H\r
+#define QNC_SMM_H\r
+\r
+//\r
+// Include common header file for this module.\r
+//\r
+#include "CommonHeader.h"\r
+\r
+#include "QNCSmmRegisters.h"\r
+\r
+extern EFI_HANDLE mQNCSmmDispatcherImageHandle;\r
+\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// SUPPORTED PROTOCOLS\r
+//\r
+\r
+//\r
+// Define an enumeration for all the supported protocols\r
+//\r
+typedef enum {\r
+ // UsbType, DELETE:on QuarkNcSocId, there is no usb smi supported\r
+ SxType,\r
+ SwType,\r
+ GpiType,\r
+ QNCnType,\r
+ PowerButtonType,\r
+ PeriodicTimerType,\r
+ NUM_PROTOCOLS\r
+} QNC_SMM_PROTOCOL_TYPE;\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// SPECIFYING A REGISTER\r
+// We want a general way of referring to addresses. For this case, we'll only\r
+// need addresses in the ACPI table (and the TCO entries within the ACPI table).\r
+// However, it's interesting to consider what it would take to support other types\r
+// of addresses. To address Will's concern, I think it prudent to accommodate it\r
+// early on in the design.\r
+//\r
+// Addresses we need to consider:\r
+//\r
+// Type: Required:\r
+// I/O Yes\r
+// ACPI (special case of I/O) Only if we want to\r
+// TCO (special case of ACPI) Only if we want to\r
+// Memory (or Memory Mapped I/O) Only if we want to\r
+// PCI Yes, for BiosWp\r
+//\r
+typedef enum {\r
+ //\r
+ // IO_ADDR_TYPE, // unimplemented\r
+ //\r
+ ACPI_ADDR_TYPE,\r
+ GPE_ADDR_TYPE,\r
+ //\r
+ // MEMORY_ADDR_TYPE, // unimplemented\r
+ //\r
+ MEMORY_MAPPED_IO_ADDRESS_TYPE,\r
+ PCI_ADDR_TYPE,\r
+ NUM_ADDR_TYPES, // count of items in this enum\r
+ QNC_SMM_ADDR_TYPE_NULL = -1 // sentinel to indicate NULL or to signal end of arrays\r
+} ADDR_TYPE;\r
+\r
+//\r
+// Assumption: 32-bits -- enum's evaluate to integer\r
+// Assumption: This code will only run on IA-32. Justification: IA-64 doesn't have SMIs.\r
+// We don't have to worry about 64-bit addresses.\r
+// Typedef the size of addresses in case the numbers I'm using are wrong or in case\r
+// this changes. This is a good idea because PCI_ADDR will change, for example, when\r
+// we add support for PciExpress.\r
+//\r
+typedef UINT16 IO_ADDR;\r
+typedef IO_ADDR ACPI_ADDR; // can omit\r
+typedef IO_ADDR GPE_ADDR; // can omit\r
+typedef IO_ADDR TCO_ADDR; // can omit\r
+typedef VOID *MEM_ADDR;\r
+typedef MEM_ADDR MEMORY_MAPPED_IO_ADDRESS;\r
+typedef union {\r
+ UINT32 Raw;\r
+ struct {\r
+ UINT8 Reg;\r
+ UINT8 Fnc;\r
+ UINT8 Dev;\r
+ UINT8 Bus;\r
+ } Fields;\r
+} PCI_ADDR;\r
+\r
+typedef struct {\r
+ ADDR_TYPE Type;\r
+ union {\r
+ //\r
+ // used to initialize during declaration/definition\r
+ //\r
+ UINTN raw;\r
+\r
+ //\r
+ // used to access useful data\r
+ //\r
+ IO_ADDR io;\r
+ ACPI_ADDR acpi;\r
+ GPE_ADDR gpe;\r
+ TCO_ADDR tco;\r
+ MEM_ADDR mem;\r
+ MEMORY_MAPPED_IO_ADDRESS Mmio;\r
+ PCI_ADDR pci;\r
+\r
+ } Data;\r
+\r
+} QNC_SMM_ADDRESS;\r
+//\r
+// Assumption: total size is 64 bits (32 for type and 32 for data) or 8 bytes\r
+//\r
+#define EFI_PCI_ADDRESS_PORT 0xcf8\r
+#define EFI_PCI_DATA_PORT 0xcfc\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// SPECIFYING BITS WITHIN A REGISTER\r
+// Here's a struct that helps us specify a source or enable bit.\r
+//\r
+typedef struct {\r
+ QNC_SMM_ADDRESS Reg;\r
+ UINT8 SizeInBytes; // of the register\r
+ UINT8 Bit;\r
+} QNC_SMM_BIT_DESC;\r
+\r
+//\r
+// Sometimes, we'll have bit descriptions that are unused. It'd be great to have a\r
+// way to easily identify them:\r
+//\r
+#define IS_BIT_DESC_NULL(BitDesc) ((BitDesc).Reg.Type == QNC_SMM_ADDR_TYPE_NULL) // "returns" true when BitDesc is NULL\r
+#define NULL_THIS_BIT_DESC(BitDesc) ((BitDesc).Reg.Type = QNC_SMM_ADDR_TYPE_NULL) // will "return" an integer w/ value of 0\r
+#define NULL_BIT_DESC_INITIALIZER \\r
+ { \\r
+ { \\r
+ QNC_SMM_ADDR_TYPE_NULL, \\r
+ { \\r
+ 0 \\r
+ } \\r
+ }, \\r
+ 0, 0 \\r
+ }\r
+//\r
+// I'd like a type to specify the callback's Sts & En bits because they'll\r
+// be commonly used together:\r
+//\r
+#define NUM_EN_BITS 2\r
+#define NUM_STS_BITS 1\r
+\r
+//\r
+// Flags\r
+//\r
+typedef UINT8 QNC_SMM_SOURCE_FLAGS;\r
+\r
+//\r
+// Flags required today\r
+//\r
+#define QNC_SMM_NO_FLAGS 0\r
+#define QNC_SMM_SCI_EN_DEPENDENT (BIT0)\r
+#define QNC_SMM_CLEAR_WITH_ZERO (BIT6)\r
+\r
+//\r
+// Flags that might be required tomorrow\r
+// #define QNC_SMM_CLEAR_WITH_ONE 2 // may need to support bits that clear by writing 0\r
+// #define QNC_SMM_MULTIBIT_FIELD 3 // may need to support status/enable fields 2 bits wide\r
+//\r
+typedef struct {\r
+ QNC_SMM_SOURCE_FLAGS Flags;\r
+ QNC_SMM_BIT_DESC En[NUM_EN_BITS];\r
+ QNC_SMM_BIT_DESC Sts[NUM_STS_BITS];\r
+} QNC_SMM_SOURCE_DESC;\r
+//\r
+// 31 bytes, I think\r
+//\r
+#define NULL_SOURCE_DESC_INITIALIZER \\r
+ { \\r
+ QNC_SMM_NO_FLAGS, \\r
+ { \\r
+ NULL_BIT_DESC_INITIALIZER, NULL_BIT_DESC_INITIALIZER \\r
+ }, \\r
+ { \\r
+ NULL_BIT_DESC_INITIALIZER \\r
+ } \\r
+ }\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// CHILD CONTEXTS\r
+// To keep consistent w/ the architecture, we'll need to provide the context\r
+// to the child when we call its callback function. After talking with Will,\r
+// we agreed that we'll need functions to "dig" the context out of the hardware\r
+// in many cases (Sx, Trap, Gpi, etc), and we'll need a function to compare those\r
+// contexts to prevent unnecessary dispatches. I'd like a general type for these\r
+// "GetContext" functions, so I'll need a union of all the protocol contexts for\r
+// our internal use:\r
+//\r
+typedef union {\r
+ //\r
+ // (in no particular order)\r
+ //\r
+ EFI_SMM_ICHN_REGISTER_CONTEXT QNCn;\r
+ EFI_SMM_SX_REGISTER_CONTEXT Sx;\r
+ EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT PeriodicTimer;\r
+ EFI_SMM_SW_REGISTER_CONTEXT Sw;\r
+ EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT PowerButton;\r
+ // EFI_SMM_USB_REGISTER_CONTEXT Usb; DELETE:on QuarkNcSocId, there is no usb smi supported\r
+ EFI_SMM_GPI_REGISTER_CONTEXT Gpi;\r
+} QNC_SMM_CONTEXT;\r
+\r
+typedef union {\r
+ //\r
+ // (in no particular order)\r
+ //\r
+ EFI_SMM_SW_CONTEXT Sw;\r
+ EFI_SMM_PERIODIC_TIMER_CONTEXT PeriodicTimer;\r
+} QNC_SMM_BUFFER;\r
+\r
+//\r
+// Assumption: PeriodicTimer largest at 3x64-bits or 24 bytes\r
+//\r
+typedef struct _DATABASE_RECORD DATABASE_RECORD;\r
+\r
+typedef\r
+VOID\r
+(EFIAPI *GET_CONTEXT) (\r
+ IN DATABASE_RECORD * Record,\r
+ OUT QNC_SMM_CONTEXT * Context\r
+ );\r
+//\r
+// Assumption: the GET_CONTEXT function will be as small and simple as possible.\r
+// Assumption: We don't need to pass in an enumeration for the protocol because each\r
+// GET_CONTEXT function is written for only one protocol.\r
+// We also need a function to compare contexts to see if the child should be dispatched\r
+//\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *CMP_CONTEXT) (\r
+ IN QNC_SMM_CONTEXT * Context1,\r
+ IN QNC_SMM_CONTEXT * Context2\r
+ );\r
+\r
+/*\r
+ Returns: True when contexts are equivalent; False otherwise\r
+*/\r
+\r
+//\r
+// This function is used to get the content of CommBuffer that will be passed\r
+// to Callback function\r
+//\r
+typedef\r
+VOID\r
+(EFIAPI *GET_BUFFER) (\r
+ IN DATABASE_RECORD * Record\r
+ );\r
+\r
+//\r
+// Finally, every protocol will require a "Get Context", "Compare Context"\r
+// and "Get CommBuffer" call, so we may as well wrap that up in a table, too.\r
+//\r
+typedef struct {\r
+ GET_CONTEXT GetContext;\r
+ CMP_CONTEXT CmpContext;\r
+ GET_BUFFER GetBuffer;\r
+} CONTEXT_FUNCTIONS;\r
+\r
+extern CONTEXT_FUNCTIONS ContextFunctions[NUM_PROTOCOLS];\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// MAPPING CONTEXT TO BIT DESCRIPTIONS\r
+// I'd like to have a general approach to mapping contexts to bit descriptions.\r
+// Sometimes, we'll find that we can use table lookups or CONSTant assignments;\r
+// other times, we'll find that we'll need to use a function to perform the mapping.\r
+// If we define a macro to mask that process, we'll never have to change the code.\r
+// I don't know if this is desirable or not -- if it isn't, then we can get rid\r
+// of the macros and just use function calls or variable assignments. Doesn't matter\r
+// to me.\r
+// Mapping complex contexts requires a function\r
+//\r
+// DELETE:on QuarkNcSocId, there is no usb smi supported\r
+//EFI_STATUS\r
+//EFIAPI\r
+//MapUsbToSrcDesc (\r
+// IN QNC_SMM_CONTEXT *RegisterContext,\r
+// OUT QNC_SMM_SOURCE_DESC *SrcDesc\r
+// )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ RegisterContext - GC_TODO: add argument description\r
+ SrcDesc - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+MapPeriodicTimerToSrcDesc (\r
+ IN QNC_SMM_CONTEXT *RegisterContext,\r
+ OUT QNC_SMM_SOURCE_DESC *SrcDesc\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ RegisterContext - GC_TODO: add argument description\r
+ SrcDesc - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+//\r
+// Mapping simple contexts can be done by assignment or lookup table\r
+//\r
+extern CONST QNC_SMM_SOURCE_DESC SW_SOURCE_DESC;\r
+extern CONST QNC_SMM_SOURCE_DESC SX_SOURCE_DESC;\r
+\r
+//\r
+// With the changes we've made to the protocols, we can now use table\r
+// lookups for the following protocols:\r
+//\r
+extern CONST QNC_SMM_SOURCE_DESC GPI_SOURCE_DESC;\r
+\r
+extern QNC_SMM_SOURCE_DESC QNCN_SOURCE_DESCS[NUM_ICHN_TYPES];\r
+\r
+\r
+//\r
+// For QNCx, APMC is UINT8 port, so the MAX SWI Value is 0xFF.\r
+//\r
+#define MAXIMUM_SWI_VALUE 0xFF\r
+\r
+\r
+//\r
+// Open: Need to make sure this kind of type cast will actually work.\r
+// May need an intermediate form w/ two VOID* arguments. I'll figure\r
+// that out when I start compiling.\r
+\r
+///////////////////////////////////////////////////////////////////////////////\r
+//\r
+typedef\r
+VOID\r
+(EFIAPI *QNC_SMM_CLEAR_SOURCE) (\r
+ QNC_SMM_SOURCE_DESC * SrcDesc\r
+ );\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// "DATABASE" RECORD\r
+// Linked list data structures\r
+//\r
+#define DATABASE_RECORD_SIGNATURE SIGNATURE_32 ('D', 'B', 'R', 'C')\r
+\r
+struct _DATABASE_RECORD {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+\r
+ //\r
+ // Status and Enable bit description\r
+ //\r
+ QNC_SMM_SOURCE_DESC SrcDesc;\r
+\r
+ //\r
+ // Callback function\r
+ //\r
+ EFI_SMM_HANDLER_ENTRY_POINT2 Callback;\r
+ QNC_SMM_CONTEXT ChildContext;\r
+ QNC_SMM_BUFFER CommBuffer;\r
+ UINTN BufferSize;\r
+\r
+ //\r
+ // Special handling hooks -- init them to NULL if unused/unneeded\r
+ //\r
+ QNC_SMM_CLEAR_SOURCE ClearSource; // needed for SWSMI timer\r
+ // Functions required to make callback code general\r
+ //\r
+ CONTEXT_FUNCTIONS ContextFunctions;\r
+\r
+ //\r
+ // The protocol that this record dispatches\r
+ //\r
+ QNC_SMM_PROTOCOL_TYPE ProtocolType;\r
+\r
+};\r
+\r
+#define DATABASE_RECORD_FROM_LINK(_record) CR (_record, DATABASE_RECORD, Link, DATABASE_RECORD_SIGNATURE)\r
+#define DATABASE_RECORD_FROM_CONTEXT(_record) CR (_record, DATABASE_RECORD, ChildContext, DATABASE_RECORD_SIGNATURE)\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+// HOOKING INTO THE ARCHITECTURE\r
+//\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *QNC_SMM_GENERIC_REGISTER) (\r
+ IN VOID **This,\r
+ IN VOID *DispatchFunction,\r
+ IN VOID *RegisterContext,\r
+ OUT EFI_HANDLE * DispatchHandle\r
+ );\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *QNC_SMM_GENERIC_UNREGISTER) (\r
+ IN VOID **This,\r
+ IN EFI_HANDLE DispatchHandle\r
+ );\r
+\r
+//\r
+// Define a memory "stamp" equivalent in size and function to most of the protocols\r
+//\r
+typedef struct {\r
+ QNC_SMM_GENERIC_REGISTER Register;\r
+ QNC_SMM_GENERIC_UNREGISTER Unregister;\r
+ UINTN Extra1;\r
+ UINTN Extra2; // may not need this one\r
+} QNC_SMM_GENERIC_PROTOCOL;\r
+\r
+EFI_STATUS\r
+QNCSmmCoreRegister (\r
+ IN QNC_SMM_GENERIC_PROTOCOL *This,\r
+ IN EFI_SMM_HANDLER_ENTRY_POINT2 DispatchFunction,\r
+ IN QNC_SMM_CONTEXT *RegisterContext,\r
+ OUT EFI_HANDLE *DispatchHandle\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - GC_TODO: add argument description\r
+ DispatchFunction - GC_TODO: add argument description\r
+ RegisterContext - GC_TODO: add argument description\r
+ DispatchHandle - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+EFI_STATUS\r
+QNCSmmCoreUnRegister (\r
+ IN QNC_SMM_GENERIC_PROTOCOL *This,\r
+ IN EFI_HANDLE DispatchHandle\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - GC_TODO: add argument description\r
+ DispatchHandle - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+typedef union {\r
+ QNC_SMM_GENERIC_PROTOCOL Generic;\r
+\r
+ // EFI_SMM_USB_DISPATCH2_PROTOCOL Usb; DELETE:on QuarkNcSocId, there is no usb smi supported\r
+ EFI_SMM_SX_DISPATCH2_PROTOCOL Sx;\r
+ EFI_SMM_SW_DISPATCH2_PROTOCOL Sw;\r
+ EFI_SMM_GPI_DISPATCH2_PROTOCOL Gpi;\r
+ EFI_SMM_ICHN_DISPATCH2_PROTOCOL QNCn;\r
+ EFI_SMM_POWER_BUTTON_DISPATCH2_PROTOCOL PowerButton;\r
+ EFI_SMM_PERIODIC_TIMER_DISPATCH2_PROTOCOL PeriodicTimer;\r
+} QNC_SMM_PROTOCOL;\r
+\r
+//\r
+// Define a structure to help us identify the generic protocol\r
+//\r
+#define PROTOCOL_SIGNATURE SIGNATURE_32 ('P', 'R', 'O', 'T')\r
+\r
+typedef struct {\r
+ UINTN Signature;\r
+\r
+ QNC_SMM_PROTOCOL_TYPE Type;\r
+ EFI_GUID *Guid;\r
+ QNC_SMM_PROTOCOL Protocols;\r
+} QNC_SMM_QUALIFIED_PROTOCOL;\r
+\r
+#define QUALIFIED_PROTOCOL_FROM_GENERIC(_generic) \\r
+ CR (_generic, \\r
+ QNC_SMM_QUALIFIED_PROTOCOL, \\r
+ Protocols, \\r
+ PROTOCOL_SIGNATURE \\r
+ )\r
+\r
+//\r
+// Create private data for the protocols that we'll publish\r
+//\r
+typedef struct {\r
+ LIST_ENTRY CallbackDataBase;\r
+ EFI_HANDLE SmiHandle;\r
+ EFI_HANDLE InstallMultProtHandle;\r
+ QNC_SMM_QUALIFIED_PROTOCOL Protocols[NUM_PROTOCOLS];\r
+} PRIVATE_DATA;\r
+\r
+extern PRIVATE_DATA mPrivateData;\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+//\r
+VOID\r
+EFIAPI\r
+SwGetContext (\r
+ IN DATABASE_RECORD *Record,\r
+ OUT QNC_SMM_CONTEXT *Context\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Record - GC_TODO: add argument description\r
+ Context - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+BOOLEAN\r
+EFIAPI\r
+SwCmpContext (\r
+ IN QNC_SMM_CONTEXT *Context1,\r
+ IN QNC_SMM_CONTEXT *Context2\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Context1 - GC_TODO: add argument description\r
+ Context2 - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+SwGetBuffer (\r
+ IN DATABASE_RECORD * Record\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Record - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+EFIAPI\r
+SxGetContext (\r
+ IN DATABASE_RECORD *Record,\r
+ OUT QNC_SMM_CONTEXT *Context\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Record - GC_TODO: add argument description\r
+ Context - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+BOOLEAN\r
+EFIAPI\r
+SxCmpContext (\r
+ IN QNC_SMM_CONTEXT *Context1,\r
+ IN QNC_SMM_CONTEXT *Context2\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Context1 - GC_TODO: add argument description\r
+ Context2 - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+EFIAPI\r
+PeriodicTimerGetContext (\r
+ IN DATABASE_RECORD *Record,\r
+ OUT QNC_SMM_CONTEXT *Context\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Record - GC_TODO: add argument description\r
+ Context - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+BOOLEAN\r
+EFIAPI\r
+PeriodicTimerCmpContext (\r
+ IN QNC_SMM_CONTEXT *Context1,\r
+ IN QNC_SMM_CONTEXT *Context2\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Context1 - GC_TODO: add argument description\r
+ Context2 - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+PeriodicTimerGetBuffer (\r
+ IN DATABASE_RECORD * Record\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Record - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+EFIAPI\r
+PowerButtonGetContext (\r
+ IN DATABASE_RECORD *Record,\r
+ OUT QNC_SMM_CONTEXT *Context\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Record - GC_TODO: add argument description\r
+ Context - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+BOOLEAN\r
+EFIAPI\r
+PowerButtonCmpContext (\r
+ IN QNC_SMM_CONTEXT *Context1,\r
+ IN QNC_SMM_CONTEXT *Context2\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ Context1 - GC_TODO: add argument description\r
+ Context2 - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+//\r
+// /////////////////////////////////////////////////////////////////////////////\r
+//\r
+VOID\r
+EFIAPI\r
+QNCSmmPeriodicTimerClearSource (\r
+ QNC_SMM_SOURCE_DESC *SrcDesc\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ SrcDesc - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+EFI_STATUS\r
+QNCSmmPeriodicTimerDispatchGetNextShorterInterval (\r
+ IN CONST EFI_SMM_PERIODIC_TIMER_DISPATCH2_PROTOCOL *This,\r
+ IN OUT UINT64 **SmiTickInterval\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - GC_TODO: add argument description\r
+ SmiTickInterval - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+QNCSmmSxGoToSleep (\r
+ VOID\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ None\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+VOID\r
+EFIAPI\r
+QNCSmmQNCnClearSource (\r
+ QNC_SMM_SOURCE_DESC *SrcDesc\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ SrcDesc - GC_TODO: add argument description\r
+\r
+Returns:\r
+\r
+ GC_TODO: add return values\r
+\r
+--*/\r
+;\r
+\r
+#endif\r