]> git.proxmox.com Git - mirror_edk2.git/blobdiff - QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h
QuarkSocPkg: Add new package for Quark SoC X1000
[mirror_edk2.git] / QuarkSocPkg / QuarkNorthCluster / Smm / DxeSmm / QncSmmDispatcher / QNCSmm.h
diff --git a/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h b/QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h
new file mode 100644 (file)
index 0000000..892294f
--- /dev/null
@@ -0,0 +1,871 @@
+/** @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