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