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