Home | History | Annotate | Download | only in QncSmmDispatcher
      1 /** @file
      2 Prototypes and defines for the QNC SMM Dispatcher.
      3 
      4 Copyright (c) 2013-2016 Intel Corporation.
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef QNC_SMM_H
     17 #define QNC_SMM_H
     18 
     19 //
     20 // Include common header file for this module.
     21 //
     22 #include "CommonHeader.h"
     23 
     24 #include "QNCSmmRegisters.h"
     25 
     26 extern EFI_HANDLE  mQNCSmmDispatcherImageHandle;
     27 
     28 
     29 //
     30 // /////////////////////////////////////////////////////////////////////////////
     31 // SUPPORTED PROTOCOLS
     32 //
     33 
     34 //
     35 // Define an enumeration for all the supported protocols
     36 //
     37 typedef enum {
     38   // UsbType,    DELETE:on QuarkNcSocId, there is no usb smi supported
     39   SxType,
     40   SwType,
     41   GpiType,
     42   QNCnType,
     43   PowerButtonType,
     44   PeriodicTimerType,
     45   NUM_PROTOCOLS
     46 } QNC_SMM_PROTOCOL_TYPE;
     47 
     48 //
     49 // /////////////////////////////////////////////////////////////////////////////
     50 // SPECIFYING A REGISTER
     51 // We want a general way of referring to addresses.  For this case, we'll only
     52 // need addresses in the ACPI table (and the TCO entries within the ACPI table).
     53 // However, it's interesting to consider what it would take to support other types
     54 // of addresses.  To address Will's concern, I think it prudent to accommodate it
     55 // early on in the design.
     56 //
     57 // Addresses we need to consider:
     58 //
     59 //  Type:                           Required:
     60 //  I/O                             Yes
     61 //    ACPI (special case of I/O)    Only if we want to
     62 //    TCO  (special case of ACPI)   Only if we want to
     63 //  Memory (or Memory Mapped I/O)   Only if we want to
     64 //  PCI                             Yes, for BiosWp
     65 //
     66 typedef enum {
     67   //
     68   //  IO_ADDR_TYPE, // unimplemented
     69   //
     70   ACPI_ADDR_TYPE,
     71   GPE_ADDR_TYPE,
     72   //
     73   //  MEMORY_ADDR_TYPE, // unimplemented
     74   //
     75   MEMORY_MAPPED_IO_ADDRESS_TYPE,
     76   PCI_ADDR_TYPE,
     77   NUM_ADDR_TYPES,                     // count of items in this enum
     78   QNC_SMM_ADDR_TYPE_NULL        = -1  // sentinel to indicate NULL or to signal end of arrays
     79 } ADDR_TYPE;
     80 
     81 //
     82 // Assumption: 32-bits -- enum's evaluate to integer
     83 // Assumption: This code will only run on IA-32.  Justification: IA-64 doesn't have SMIs.
     84 // We don't have to worry about 64-bit addresses.
     85 // Typedef the size of addresses in case the numbers I'm using are wrong or in case
     86 // this changes.  This is a good idea because PCI_ADDR will change, for example, when
     87 // we add support for PciExpress.
     88 //
     89 typedef UINT16 IO_ADDR;
     90 typedef IO_ADDR ACPI_ADDR;  // can omit
     91 typedef IO_ADDR GPE_ADDR;  // can omit
     92 typedef IO_ADDR TCO_ADDR;   // can omit
     93 typedef VOID *MEM_ADDR;
     94 typedef MEM_ADDR MEMORY_MAPPED_IO_ADDRESS;
     95 typedef union {
     96   UINT32  Raw;
     97   struct {
     98     UINT8 Reg;
     99     UINT8 Fnc;
    100     UINT8 Dev;
    101     UINT8 Bus;
    102   } Fields;
    103 } PCI_ADDR;
    104 
    105 typedef struct {
    106   ADDR_TYPE Type;
    107   union {
    108     //
    109     // used to initialize during declaration/definition
    110     //
    111     UINTN                     raw;
    112 
    113     //
    114     // used to access useful data
    115     //
    116     IO_ADDR                   io;
    117     ACPI_ADDR                 acpi;
    118     GPE_ADDR                  gpe;
    119     TCO_ADDR                  tco;
    120     MEM_ADDR                  mem;
    121     MEMORY_MAPPED_IO_ADDRESS  Mmio;
    122     PCI_ADDR                  pci;
    123 
    124   } Data;
    125 
    126 } QNC_SMM_ADDRESS;
    127 //
    128 // Assumption: total size is 64 bits (32 for type and 32 for data) or 8 bytes
    129 //
    130 #define EFI_PCI_ADDRESS_PORT  0xcf8
    131 #define EFI_PCI_DATA_PORT     0xcfc
    132 
    133 //
    134 // /////////////////////////////////////////////////////////////////////////////
    135 // SPECIFYING BITS WITHIN A REGISTER
    136 // Here's a struct that helps us specify a source or enable bit.
    137 //
    138 typedef struct {
    139   QNC_SMM_ADDRESS Reg;
    140   UINT8           SizeInBytes;  // of the register
    141   UINT8           Bit;
    142 } QNC_SMM_BIT_DESC;
    143 
    144 //
    145 // Sometimes, we'll have bit descriptions that are unused.  It'd be great to have a
    146 // way to easily identify them:
    147 //
    148 #define IS_BIT_DESC_NULL(BitDesc)   ((BitDesc).Reg.Type == QNC_SMM_ADDR_TYPE_NULL)  // "returns" true when BitDesc is NULL
    149 #define NULL_THIS_BIT_DESC(BitDesc) ((BitDesc).Reg.Type = QNC_SMM_ADDR_TYPE_NULL)   // will "return" an integer w/ value of 0
    150 #define NULL_BIT_DESC_INITIALIZER \
    151   { \
    152     { \
    153       QNC_SMM_ADDR_TYPE_NULL, \
    154       { \
    155         0 \
    156       } \
    157     }, \
    158     0, 0 \
    159   }
    160 //
    161 // I'd like a type to specify the callback's Sts & En bits because they'll
    162 // be commonly used together:
    163 //
    164 #define NUM_EN_BITS   2
    165 #define NUM_STS_BITS  1
    166 
    167 //
    168 // Flags
    169 //
    170 typedef UINT8 QNC_SMM_SOURCE_FLAGS;
    171 
    172 //
    173 // Flags required today
    174 //
    175 #define QNC_SMM_NO_FLAGS               0
    176 #define QNC_SMM_SCI_EN_DEPENDENT      (BIT0)
    177 #define QNC_SMM_CLEAR_WITH_ZERO       (BIT6)
    178 
    179 //
    180 // Flags that might be required tomorrow
    181 // #define QNC_SMM_CLEAR_WITH_ONE 2 // may need to support bits that clear by writing 0
    182 // #define QNC_SMM_MULTIBIT_FIELD 3 // may need to support status/enable fields 2 bits wide
    183 //
    184 typedef struct {
    185   QNC_SMM_SOURCE_FLAGS  Flags;
    186   QNC_SMM_BIT_DESC      En[NUM_EN_BITS];
    187   QNC_SMM_BIT_DESC      Sts[NUM_STS_BITS];
    188 } QNC_SMM_SOURCE_DESC;
    189 //
    190 // 31 bytes, I think
    191 //
    192 #define NULL_SOURCE_DESC_INITIALIZER \
    193   { \
    194     QNC_SMM_NO_FLAGS, \
    195     { \
    196       NULL_BIT_DESC_INITIALIZER, NULL_BIT_DESC_INITIALIZER \
    197     }, \
    198     { \
    199       NULL_BIT_DESC_INITIALIZER \
    200     } \
    201   }
    202 
    203 //
    204 // /////////////////////////////////////////////////////////////////////////////
    205 // CHILD CONTEXTS
    206 // To keep consistent w/ the architecture, we'll need to provide the context
    207 // to the child when we call its callback function.  After talking with Will,
    208 // we agreed that we'll need functions to "dig" the context out of the hardware
    209 // in many cases (Sx, Trap, Gpi, etc), and we'll need a function to compare those
    210 // contexts to prevent unnecessary dispatches.  I'd like a general type for these
    211 // "GetContext" functions, so I'll need a union of all the protocol contexts for
    212 // our internal use:
    213 //
    214 typedef union {
    215   //
    216   // (in no particular order)
    217   //
    218   EFI_SMM_ICHN_REGISTER_CONTEXT           QNCn;
    219   EFI_SMM_SX_REGISTER_CONTEXT             Sx;
    220   EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT PeriodicTimer;
    221   EFI_SMM_SW_REGISTER_CONTEXT             Sw;
    222   EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT   PowerButton;
    223   // EFI_SMM_USB_REGISTER_CONTEXT            Usb; DELETE:on QuarkNcSocId, there is no usb smi supported
    224   EFI_SMM_GPI_REGISTER_CONTEXT            Gpi;
    225 } QNC_SMM_CONTEXT;
    226 
    227 typedef union {
    228   //
    229   // (in no particular order)
    230   //
    231   EFI_SMM_SW_CONTEXT                      Sw;
    232   EFI_SMM_PERIODIC_TIMER_CONTEXT          PeriodicTimer;
    233 } QNC_SMM_BUFFER;
    234 
    235 //
    236 // Assumption: PeriodicTimer largest at 3x64-bits or 24 bytes
    237 //
    238 typedef struct _DATABASE_RECORD DATABASE_RECORD;
    239 
    240 typedef
    241 VOID
    242 (EFIAPI *GET_CONTEXT) (
    243   IN  DATABASE_RECORD    * Record,
    244   OUT QNC_SMM_CONTEXT    * Context
    245   );
    246 //
    247 // Assumption: the GET_CONTEXT function will be as small and simple as possible.
    248 // Assumption: We don't need to pass in an enumeration for the protocol because each
    249 //    GET_CONTEXT function is written for only one protocol.
    250 // We also need a function to compare contexts to see if the child should be dispatched
    251 //
    252 typedef
    253 BOOLEAN
    254 (EFIAPI *CMP_CONTEXT) (
    255   IN QNC_SMM_CONTEXT     * Context1,
    256   IN QNC_SMM_CONTEXT     * Context2
    257   );
    258 
    259 /*
    260     Returns: True when contexts are equivalent; False otherwise
    261 */
    262 
    263 //
    264 // This function is used to get the content of CommBuffer that will be passed
    265 // to Callback function
    266 //
    267 typedef
    268 VOID
    269 (EFIAPI *GET_BUFFER) (
    270   IN  DATABASE_RECORD     * Record
    271   );
    272 
    273 //
    274 // Finally, every protocol will require a "Get Context", "Compare Context"
    275 // and "Get CommBuffer" call, so we may as well wrap that up in a table, too.
    276 //
    277 typedef struct {
    278   GET_CONTEXT GetContext;
    279   CMP_CONTEXT CmpContext;
    280   GET_BUFFER  GetBuffer;
    281 } CONTEXT_FUNCTIONS;
    282 
    283 extern CONTEXT_FUNCTIONS          ContextFunctions[NUM_PROTOCOLS];
    284 
    285 //
    286 // /////////////////////////////////////////////////////////////////////////////
    287 // MAPPING CONTEXT TO BIT DESCRIPTIONS
    288 // I'd like to have a general approach to mapping contexts to bit descriptions.
    289 // Sometimes, we'll find that we can use table lookups or CONSTant assignments;
    290 // other times, we'll find that we'll need to use a function to perform the mapping.
    291 // If we define a macro to mask that process, we'll never have to change the code.
    292 // I don't know if this is desirable or not -- if it isn't, then we can get rid
    293 // of the macros and just use function calls or variable assignments.  Doesn't matter
    294 // to me.
    295 // Mapping complex contexts requires a function
    296 //
    297 // DELETE:on QuarkNcSocId, there is no usb smi supported
    298 //EFI_STATUS
    299 //EFIAPI
    300 //MapUsbToSrcDesc (
    301 //  IN  QNC_SMM_CONTEXT                                          *RegisterContext,
    302 //  OUT QNC_SMM_SOURCE_DESC                                      *SrcDesc
    303 //  )
    304 /*++
    305 
    306 Routine Description:
    307 
    308   GC_TODO: Add function description
    309 
    310 Arguments:
    311 
    312   RegisterContext - GC_TODO: add argument description
    313   SrcDesc         - GC_TODO: add argument description
    314 
    315 Returns:
    316 
    317   GC_TODO: add return values
    318 
    319 --*/
    320 ;
    321 
    322 EFI_STATUS
    323 MapPeriodicTimerToSrcDesc (
    324   IN  QNC_SMM_CONTEXT                                          *RegisterContext,
    325   OUT QNC_SMM_SOURCE_DESC                                     *SrcDesc
    326   )
    327 /*++
    328 
    329 Routine Description:
    330 
    331   GC_TODO: Add function description
    332 
    333 Arguments:
    334 
    335   RegisterContext - GC_TODO: add argument description
    336   SrcDesc         - GC_TODO: add argument description
    337 
    338 Returns:
    339 
    340   GC_TODO: add return values
    341 
    342 --*/
    343 ;
    344 
    345 //
    346 // Mapping simple contexts can be done by assignment or lookup table
    347 //
    348 extern CONST QNC_SMM_SOURCE_DESC  SW_SOURCE_DESC;
    349 extern CONST QNC_SMM_SOURCE_DESC  SX_SOURCE_DESC;
    350 
    351 //
    352 // With the changes we've made to the protocols, we can now use table
    353 // lookups for the following protocols:
    354 //
    355 extern CONST QNC_SMM_SOURCE_DESC  GPI_SOURCE_DESC;
    356 
    357 extern QNC_SMM_SOURCE_DESC        QNCN_SOURCE_DESCS[NUM_ICHN_TYPES];
    358 
    359 
    360 //
    361 // For QNCx, APMC is UINT8 port, so the MAX SWI Value is 0xFF.
    362 //
    363 #define MAXIMUM_SWI_VALUE   0xFF
    364 
    365 
    366 //
    367 // Open: Need to make sure this kind of type cast will actually work.
    368 //   May need an intermediate form w/ two VOID* arguments.  I'll figure
    369 //   that out when I start compiling.
    370 
    371 ///////////////////////////////////////////////////////////////////////////////
    372 //
    373 typedef
    374 VOID
    375 (EFIAPI *QNC_SMM_CLEAR_SOURCE) (
    376   QNC_SMM_SOURCE_DESC * SrcDesc
    377   );
    378 
    379 //
    380 // /////////////////////////////////////////////////////////////////////////////
    381 // "DATABASE" RECORD
    382 // Linked list data structures
    383 //
    384 #define DATABASE_RECORD_SIGNATURE SIGNATURE_32 ('D', 'B', 'R', 'C')
    385 
    386 struct _DATABASE_RECORD {
    387   UINT32                Signature;
    388   LIST_ENTRY            Link;
    389 
    390   BOOLEAN               Processed;
    391 
    392   //
    393   // Status and Enable bit description
    394   //
    395   QNC_SMM_SOURCE_DESC   SrcDesc;
    396 
    397   //
    398   // Callback function
    399   //
    400   EFI_SMM_HANDLER_ENTRY_POINT2      Callback;
    401   QNC_SMM_CONTEXT                   ChildContext;
    402   VOID                              *CallbackContext;
    403   QNC_SMM_BUFFER                    CommBuffer;
    404   UINTN                             BufferSize;
    405 
    406   //
    407   // Special handling hooks -- init them to NULL if unused/unneeded
    408   //
    409   QNC_SMM_CLEAR_SOURCE  ClearSource;  // needed for SWSMI timer
    410   // Functions required to make callback code general
    411   //
    412   CONTEXT_FUNCTIONS     ContextFunctions;
    413 
    414   //
    415   // The protocol that this record dispatches
    416   //
    417   QNC_SMM_PROTOCOL_TYPE ProtocolType;
    418 
    419 };
    420 
    421 #define DATABASE_RECORD_FROM_LINK(_record)  CR (_record, DATABASE_RECORD, Link, DATABASE_RECORD_SIGNATURE)
    422 #define DATABASE_RECORD_FROM_CONTEXT(_record)  CR (_record, DATABASE_RECORD, ChildContext, DATABASE_RECORD_SIGNATURE)
    423 
    424 //
    425 // /////////////////////////////////////////////////////////////////////////////
    426 // HOOKING INTO THE ARCHITECTURE
    427 //
    428 typedef
    429 EFI_STATUS
    430 (EFIAPI *QNC_SMM_GENERIC_REGISTER) (
    431   IN  VOID                                    **This,
    432   IN  VOID                                    *DispatchFunction,
    433   IN  VOID                                    *RegisterContext,
    434   OUT EFI_HANDLE                              * DispatchHandle
    435   );
    436 typedef
    437 EFI_STATUS
    438 (EFIAPI *QNC_SMM_GENERIC_UNREGISTER) (
    439   IN  VOID                                    **This,
    440   IN  EFI_HANDLE                              DispatchHandle
    441   );
    442 
    443 //
    444 // Define a memory "stamp" equivalent in size and function to most of the protocols
    445 //
    446 typedef struct {
    447   QNC_SMM_GENERIC_REGISTER    Register;
    448   QNC_SMM_GENERIC_UNREGISTER  Unregister;
    449   UINTN                       Extra1;
    450   UINTN                       Extra2; // may not need this one
    451 } QNC_SMM_GENERIC_PROTOCOL;
    452 
    453 EFI_STATUS
    454 QNCSmmCoreRegister (
    455   IN  QNC_SMM_GENERIC_PROTOCOL                          *This,
    456   IN  EFI_SMM_HANDLER_ENTRY_POINT2                      DispatchFunction,
    457   IN  QNC_SMM_CONTEXT                                    *RegisterContext,
    458   OUT EFI_HANDLE                                        *DispatchHandle
    459   )
    460 /*++
    461 
    462 Routine Description:
    463 
    464   GC_TODO: Add function description
    465 
    466 Arguments:
    467 
    468   This              - GC_TODO: add argument description
    469   DispatchFunction  - GC_TODO: add argument description
    470   RegisterContext   - GC_TODO: add argument description
    471   DispatchHandle    - GC_TODO: add argument description
    472 
    473 Returns:
    474 
    475   GC_TODO: add return values
    476 
    477 --*/
    478 ;
    479 EFI_STATUS
    480 QNCSmmCoreUnRegister (
    481   IN  QNC_SMM_GENERIC_PROTOCOL                         *This,
    482   IN EFI_HANDLE                                        DispatchHandle
    483   )
    484 /*++
    485 
    486 Routine Description:
    487 
    488   GC_TODO: Add function description
    489 
    490 Arguments:
    491 
    492   This            - GC_TODO: add argument description
    493   DispatchHandle  - GC_TODO: add argument description
    494 
    495 Returns:
    496 
    497   GC_TODO: add return values
    498 
    499 --*/
    500 ;
    501 
    502 typedef union {
    503   QNC_SMM_GENERIC_PROTOCOL                  Generic;
    504 
    505   // EFI_SMM_USB_DISPATCH2_PROTOCOL             Usb;  DELETE:on QuarkNcSocId, there is no usb smi supported
    506   EFI_SMM_SX_DISPATCH2_PROTOCOL              Sx;
    507   EFI_SMM_SW_DISPATCH2_PROTOCOL              Sw;
    508   EFI_SMM_GPI_DISPATCH2_PROTOCOL             Gpi;
    509   EFI_SMM_ICHN_DISPATCH2_PROTOCOL            QNCn;
    510   EFI_SMM_POWER_BUTTON_DISPATCH2_PROTOCOL    PowerButton;
    511   EFI_SMM_PERIODIC_TIMER_DISPATCH2_PROTOCOL  PeriodicTimer;
    512 } QNC_SMM_PROTOCOL;
    513 
    514 //
    515 // Define a structure to help us identify the generic protocol
    516 //
    517 #define PROTOCOL_SIGNATURE  SIGNATURE_32 ('P', 'R', 'O', 'T')
    518 
    519 typedef struct {
    520   UINTN                 Signature;
    521 
    522   QNC_SMM_PROTOCOL_TYPE Type;
    523   EFI_GUID              *Guid;
    524   QNC_SMM_PROTOCOL      Protocols;
    525 } QNC_SMM_QUALIFIED_PROTOCOL;
    526 
    527 #define QUALIFIED_PROTOCOL_FROM_GENERIC(_generic) \
    528   CR (_generic, \
    529       QNC_SMM_QUALIFIED_PROTOCOL, \
    530       Protocols, \
    531       PROTOCOL_SIGNATURE \
    532       )
    533 
    534 //
    535 // Create private data for the protocols that we'll publish
    536 //
    537 typedef struct {
    538   LIST_ENTRY                  CallbackDataBase;
    539   EFI_HANDLE                  SmiHandle;
    540   EFI_HANDLE                  InstallMultProtHandle;
    541   QNC_SMM_QUALIFIED_PROTOCOL  Protocols[NUM_PROTOCOLS];
    542 } PRIVATE_DATA;
    543 
    544 extern PRIVATE_DATA           mPrivateData;
    545 
    546 //
    547 // /////////////////////////////////////////////////////////////////////////////
    548 //
    549 VOID
    550 EFIAPI
    551 SwGetContext (
    552   IN  DATABASE_RECORD    *Record,
    553   OUT QNC_SMM_CONTEXT    *Context
    554   )
    555 /*++
    556 
    557 Routine Description:
    558 
    559   GC_TODO: Add function description
    560 
    561 Arguments:
    562 
    563   Record  - GC_TODO: add argument description
    564   Context - GC_TODO: add argument description
    565 
    566 Returns:
    567 
    568   GC_TODO: add return values
    569 
    570 --*/
    571 ;
    572 
    573 BOOLEAN
    574 EFIAPI
    575 SwCmpContext (
    576   IN QNC_SMM_CONTEXT     *Context1,
    577   IN QNC_SMM_CONTEXT     *Context2
    578   )
    579 /*++
    580 
    581 Routine Description:
    582 
    583   GC_TODO: Add function description
    584 
    585 Arguments:
    586 
    587   Context1  - GC_TODO: add argument description
    588   Context2  - GC_TODO: add argument description
    589 
    590 Returns:
    591 
    592   GC_TODO: add return values
    593 
    594 --*/
    595 ;
    596 
    597 VOID
    598 SwGetBuffer (
    599   IN  DATABASE_RECORD     * Record
    600   )
    601 /*++
    602 
    603 Routine Description:
    604 
    605   GC_TODO: Add function description
    606 
    607 Arguments:
    608 
    609   Record  - GC_TODO: add argument description
    610 
    611 Returns:
    612 
    613   GC_TODO: add return values
    614 
    615 --*/
    616 ;
    617 
    618 VOID
    619 EFIAPI
    620 SxGetContext (
    621   IN  DATABASE_RECORD    *Record,
    622   OUT QNC_SMM_CONTEXT    *Context
    623   )
    624 /*++
    625 
    626 Routine Description:
    627 
    628   GC_TODO: Add function description
    629 
    630 Arguments:
    631 
    632   Record  - GC_TODO: add argument description
    633   Context - GC_TODO: add argument description
    634 
    635 Returns:
    636 
    637   GC_TODO: add return values
    638 
    639 --*/
    640 ;
    641 
    642 BOOLEAN
    643 EFIAPI
    644 SxCmpContext (
    645   IN QNC_SMM_CONTEXT     *Context1,
    646   IN QNC_SMM_CONTEXT     *Context2
    647   )
    648 /*++
    649 
    650 Routine Description:
    651 
    652   GC_TODO: Add function description
    653 
    654 Arguments:
    655 
    656   Context1  - GC_TODO: add argument description
    657   Context2  - GC_TODO: add argument description
    658 
    659 Returns:
    660 
    661   GC_TODO: add return values
    662 
    663 --*/
    664 ;
    665 
    666 VOID
    667 EFIAPI
    668 PeriodicTimerGetContext (
    669   IN  DATABASE_RECORD    *Record,
    670   OUT QNC_SMM_CONTEXT    *Context
    671   )
    672 /*++
    673 
    674 Routine Description:
    675 
    676   GC_TODO: Add function description
    677 
    678 Arguments:
    679 
    680   Record  - GC_TODO: add argument description
    681   Context - GC_TODO: add argument description
    682 
    683 Returns:
    684 
    685   GC_TODO: add return values
    686 
    687 --*/
    688 ;
    689 
    690 BOOLEAN
    691 EFIAPI
    692 PeriodicTimerCmpContext (
    693   IN QNC_SMM_CONTEXT     *Context1,
    694   IN QNC_SMM_CONTEXT     *Context2
    695   )
    696 /*++
    697 
    698 Routine Description:
    699 
    700   GC_TODO: Add function description
    701 
    702 Arguments:
    703 
    704   Context1  - GC_TODO: add argument description
    705   Context2  - GC_TODO: add argument description
    706 
    707 Returns:
    708 
    709   GC_TODO: add return values
    710 
    711 --*/
    712 ;
    713 
    714 VOID
    715 PeriodicTimerGetBuffer (
    716   IN  DATABASE_RECORD     * Record
    717   )
    718 /*++
    719 
    720 Routine Description:
    721 
    722   GC_TODO: Add function description
    723 
    724 Arguments:
    725 
    726   Record  - GC_TODO: add argument description
    727 
    728 Returns:
    729 
    730   GC_TODO: add return values
    731 
    732 --*/
    733 ;
    734 
    735 VOID
    736 EFIAPI
    737 PowerButtonGetContext (
    738   IN  DATABASE_RECORD    *Record,
    739   OUT QNC_SMM_CONTEXT     *Context
    740   )
    741 /*++
    742 
    743 Routine Description:
    744 
    745   GC_TODO: Add function description
    746 
    747 Arguments:
    748 
    749   Record  - GC_TODO: add argument description
    750   Context - GC_TODO: add argument description
    751 
    752 Returns:
    753 
    754   GC_TODO: add return values
    755 
    756 --*/
    757 ;
    758 
    759 BOOLEAN
    760 EFIAPI
    761 PowerButtonCmpContext (
    762   IN QNC_SMM_CONTEXT     *Context1,
    763   IN QNC_SMM_CONTEXT     *Context2
    764   )
    765 /*++
    766 
    767 Routine Description:
    768 
    769   GC_TODO: Add function description
    770 
    771 Arguments:
    772 
    773   Context1  - GC_TODO: add argument description
    774   Context2  - GC_TODO: add argument description
    775 
    776 Returns:
    777 
    778   GC_TODO: add return values
    779 
    780 --*/
    781 ;
    782 
    783 //
    784 // /////////////////////////////////////////////////////////////////////////////
    785 //
    786 VOID
    787 EFIAPI
    788 QNCSmmPeriodicTimerClearSource (
    789   QNC_SMM_SOURCE_DESC *SrcDesc
    790   )
    791 /*++
    792 
    793 Routine Description:
    794 
    795   GC_TODO: Add function description
    796 
    797 Arguments:
    798 
    799   SrcDesc - GC_TODO: add argument description
    800 
    801 Returns:
    802 
    803   GC_TODO: add return values
    804 
    805 --*/
    806 ;
    807 
    808 EFI_STATUS
    809 QNCSmmPeriodicTimerDispatchGetNextShorterInterval (
    810   IN CONST EFI_SMM_PERIODIC_TIMER_DISPATCH2_PROTOCOL    *This,
    811   IN OUT UINT64                                         **SmiTickInterval
    812   )
    813 /*++
    814 
    815 Routine Description:
    816 
    817   GC_TODO: Add function description
    818 
    819 Arguments:
    820 
    821   This            - GC_TODO: add argument description
    822   SmiTickInterval - GC_TODO: add argument description
    823 
    824 Returns:
    825 
    826   GC_TODO: add return values
    827 
    828 --*/
    829 ;
    830 
    831 VOID
    832 QNCSmmSxGoToSleep (
    833   VOID
    834   )
    835 /*++
    836 
    837 Routine Description:
    838 
    839   GC_TODO: Add function description
    840 
    841 Arguments:
    842 
    843   None
    844 
    845 Returns:
    846 
    847   GC_TODO: add return values
    848 
    849 --*/
    850 ;
    851 
    852 VOID
    853 EFIAPI
    854 QNCSmmQNCnClearSource (
    855   QNC_SMM_SOURCE_DESC *SrcDesc
    856   )
    857 /*++
    858 
    859 Routine Description:
    860 
    861   GC_TODO: Add function description
    862 
    863 Arguments:
    864 
    865   SrcDesc - GC_TODO: add argument description
    866 
    867 Returns:
    868 
    869   GC_TODO: add return values
    870 
    871 --*/
    872 ;
    873 
    874 #endif
    875