]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNCSmm.h
QuarkSocPkg/QncSmmDispatcher: Fix context passed to SMI handlers
[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 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 //
391 // Status and Enable bit description
392 //
393 QNC_SMM_SOURCE_DESC SrcDesc;
394
395 //
396 // Callback function
397 //
398 EFI_SMM_HANDLER_ENTRY_POINT2 Callback;
399 QNC_SMM_CONTEXT ChildContext;
400 VOID *CallbackContext;
401 QNC_SMM_BUFFER CommBuffer;
402 UINTN BufferSize;
403
404 //
405 // Special handling hooks -- init them to NULL if unused/unneeded
406 //
407 QNC_SMM_CLEAR_SOURCE ClearSource; // needed for SWSMI timer
408 // Functions required to make callback code general
409 //
410 CONTEXT_FUNCTIONS ContextFunctions;
411
412 //
413 // The protocol that this record dispatches
414 //
415 QNC_SMM_PROTOCOL_TYPE ProtocolType;
416
417 };
418
419 #define DATABASE_RECORD_FROM_LINK(_record) CR (_record, DATABASE_RECORD, Link, DATABASE_RECORD_SIGNATURE)
420 #define DATABASE_RECORD_FROM_CONTEXT(_record) CR (_record, DATABASE_RECORD, ChildContext, DATABASE_RECORD_SIGNATURE)
421
422 //
423 // /////////////////////////////////////////////////////////////////////////////
424 // HOOKING INTO THE ARCHITECTURE
425 //
426 typedef
427 EFI_STATUS
428 (EFIAPI *QNC_SMM_GENERIC_REGISTER) (
429 IN VOID **This,
430 IN VOID *DispatchFunction,
431 IN VOID *RegisterContext,
432 OUT EFI_HANDLE * DispatchHandle
433 );
434 typedef
435 EFI_STATUS
436 (EFIAPI *QNC_SMM_GENERIC_UNREGISTER) (
437 IN VOID **This,
438 IN EFI_HANDLE DispatchHandle
439 );
440
441 //
442 // Define a memory "stamp" equivalent in size and function to most of the protocols
443 //
444 typedef struct {
445 QNC_SMM_GENERIC_REGISTER Register;
446 QNC_SMM_GENERIC_UNREGISTER Unregister;
447 UINTN Extra1;
448 UINTN Extra2; // may not need this one
449 } QNC_SMM_GENERIC_PROTOCOL;
450
451 EFI_STATUS
452 QNCSmmCoreRegister (
453 IN QNC_SMM_GENERIC_PROTOCOL *This,
454 IN EFI_SMM_HANDLER_ENTRY_POINT2 DispatchFunction,
455 IN QNC_SMM_CONTEXT *RegisterContext,
456 OUT EFI_HANDLE *DispatchHandle
457 )
458 /*++
459
460 Routine Description:
461
462 GC_TODO: Add function description
463
464 Arguments:
465
466 This - GC_TODO: add argument description
467 DispatchFunction - GC_TODO: add argument description
468 RegisterContext - GC_TODO: add argument description
469 DispatchHandle - GC_TODO: add argument description
470
471 Returns:
472
473 GC_TODO: add return values
474
475 --*/
476 ;
477 EFI_STATUS
478 QNCSmmCoreUnRegister (
479 IN QNC_SMM_GENERIC_PROTOCOL *This,
480 IN EFI_HANDLE DispatchHandle
481 )
482 /*++
483
484 Routine Description:
485
486 GC_TODO: Add function description
487
488 Arguments:
489
490 This - GC_TODO: add argument description
491 DispatchHandle - GC_TODO: add argument description
492
493 Returns:
494
495 GC_TODO: add return values
496
497 --*/
498 ;
499
500 typedef union {
501 QNC_SMM_GENERIC_PROTOCOL Generic;
502
503 // EFI_SMM_USB_DISPATCH2_PROTOCOL Usb; DELETE:on QuarkNcSocId, there is no usb smi supported
504 EFI_SMM_SX_DISPATCH2_PROTOCOL Sx;
505 EFI_SMM_SW_DISPATCH2_PROTOCOL Sw;
506 EFI_SMM_GPI_DISPATCH2_PROTOCOL Gpi;
507 EFI_SMM_ICHN_DISPATCH2_PROTOCOL QNCn;
508 EFI_SMM_POWER_BUTTON_DISPATCH2_PROTOCOL PowerButton;
509 EFI_SMM_PERIODIC_TIMER_DISPATCH2_PROTOCOL PeriodicTimer;
510 } QNC_SMM_PROTOCOL;
511
512 //
513 // Define a structure to help us identify the generic protocol
514 //
515 #define PROTOCOL_SIGNATURE SIGNATURE_32 ('P', 'R', 'O', 'T')
516
517 typedef struct {
518 UINTN Signature;
519
520 QNC_SMM_PROTOCOL_TYPE Type;
521 EFI_GUID *Guid;
522 QNC_SMM_PROTOCOL Protocols;
523 } QNC_SMM_QUALIFIED_PROTOCOL;
524
525 #define QUALIFIED_PROTOCOL_FROM_GENERIC(_generic) \
526 CR (_generic, \
527 QNC_SMM_QUALIFIED_PROTOCOL, \
528 Protocols, \
529 PROTOCOL_SIGNATURE \
530 )
531
532 //
533 // Create private data for the protocols that we'll publish
534 //
535 typedef struct {
536 LIST_ENTRY CallbackDataBase;
537 EFI_HANDLE SmiHandle;
538 EFI_HANDLE InstallMultProtHandle;
539 QNC_SMM_QUALIFIED_PROTOCOL Protocols[NUM_PROTOCOLS];
540 } PRIVATE_DATA;
541
542 extern PRIVATE_DATA mPrivateData;
543
544 //
545 // /////////////////////////////////////////////////////////////////////////////
546 //
547 VOID
548 EFIAPI
549 SwGetContext (
550 IN DATABASE_RECORD *Record,
551 OUT QNC_SMM_CONTEXT *Context
552 )
553 /*++
554
555 Routine Description:
556
557 GC_TODO: Add function description
558
559 Arguments:
560
561 Record - GC_TODO: add argument description
562 Context - GC_TODO: add argument description
563
564 Returns:
565
566 GC_TODO: add return values
567
568 --*/
569 ;
570
571 BOOLEAN
572 EFIAPI
573 SwCmpContext (
574 IN QNC_SMM_CONTEXT *Context1,
575 IN QNC_SMM_CONTEXT *Context2
576 )
577 /*++
578
579 Routine Description:
580
581 GC_TODO: Add function description
582
583 Arguments:
584
585 Context1 - GC_TODO: add argument description
586 Context2 - GC_TODO: add argument description
587
588 Returns:
589
590 GC_TODO: add return values
591
592 --*/
593 ;
594
595 VOID
596 SwGetBuffer (
597 IN DATABASE_RECORD * Record
598 )
599 /*++
600
601 Routine Description:
602
603 GC_TODO: Add function description
604
605 Arguments:
606
607 Record - GC_TODO: add argument description
608
609 Returns:
610
611 GC_TODO: add return values
612
613 --*/
614 ;
615
616 VOID
617 EFIAPI
618 SxGetContext (
619 IN DATABASE_RECORD *Record,
620 OUT QNC_SMM_CONTEXT *Context
621 )
622 /*++
623
624 Routine Description:
625
626 GC_TODO: Add function description
627
628 Arguments:
629
630 Record - GC_TODO: add argument description
631 Context - GC_TODO: add argument description
632
633 Returns:
634
635 GC_TODO: add return values
636
637 --*/
638 ;
639
640 BOOLEAN
641 EFIAPI
642 SxCmpContext (
643 IN QNC_SMM_CONTEXT *Context1,
644 IN QNC_SMM_CONTEXT *Context2
645 )
646 /*++
647
648 Routine Description:
649
650 GC_TODO: Add function description
651
652 Arguments:
653
654 Context1 - GC_TODO: add argument description
655 Context2 - GC_TODO: add argument description
656
657 Returns:
658
659 GC_TODO: add return values
660
661 --*/
662 ;
663
664 VOID
665 EFIAPI
666 PeriodicTimerGetContext (
667 IN DATABASE_RECORD *Record,
668 OUT QNC_SMM_CONTEXT *Context
669 )
670 /*++
671
672 Routine Description:
673
674 GC_TODO: Add function description
675
676 Arguments:
677
678 Record - GC_TODO: add argument description
679 Context - GC_TODO: add argument description
680
681 Returns:
682
683 GC_TODO: add return values
684
685 --*/
686 ;
687
688 BOOLEAN
689 EFIAPI
690 PeriodicTimerCmpContext (
691 IN QNC_SMM_CONTEXT *Context1,
692 IN QNC_SMM_CONTEXT *Context2
693 )
694 /*++
695
696 Routine Description:
697
698 GC_TODO: Add function description
699
700 Arguments:
701
702 Context1 - GC_TODO: add argument description
703 Context2 - GC_TODO: add argument description
704
705 Returns:
706
707 GC_TODO: add return values
708
709 --*/
710 ;
711
712 VOID
713 PeriodicTimerGetBuffer (
714 IN DATABASE_RECORD * Record
715 )
716 /*++
717
718 Routine Description:
719
720 GC_TODO: Add function description
721
722 Arguments:
723
724 Record - GC_TODO: add argument description
725
726 Returns:
727
728 GC_TODO: add return values
729
730 --*/
731 ;
732
733 VOID
734 EFIAPI
735 PowerButtonGetContext (
736 IN DATABASE_RECORD *Record,
737 OUT QNC_SMM_CONTEXT *Context
738 )
739 /*++
740
741 Routine Description:
742
743 GC_TODO: Add function description
744
745 Arguments:
746
747 Record - GC_TODO: add argument description
748 Context - GC_TODO: add argument description
749
750 Returns:
751
752 GC_TODO: add return values
753
754 --*/
755 ;
756
757 BOOLEAN
758 EFIAPI
759 PowerButtonCmpContext (
760 IN QNC_SMM_CONTEXT *Context1,
761 IN QNC_SMM_CONTEXT *Context2
762 )
763 /*++
764
765 Routine Description:
766
767 GC_TODO: Add function description
768
769 Arguments:
770
771 Context1 - GC_TODO: add argument description
772 Context2 - GC_TODO: add argument description
773
774 Returns:
775
776 GC_TODO: add return values
777
778 --*/
779 ;
780
781 //
782 // /////////////////////////////////////////////////////////////////////////////
783 //
784 VOID
785 EFIAPI
786 QNCSmmPeriodicTimerClearSource (
787 QNC_SMM_SOURCE_DESC *SrcDesc
788 )
789 /*++
790
791 Routine Description:
792
793 GC_TODO: Add function description
794
795 Arguments:
796
797 SrcDesc - GC_TODO: add argument description
798
799 Returns:
800
801 GC_TODO: add return values
802
803 --*/
804 ;
805
806 EFI_STATUS
807 QNCSmmPeriodicTimerDispatchGetNextShorterInterval (
808 IN CONST EFI_SMM_PERIODIC_TIMER_DISPATCH2_PROTOCOL *This,
809 IN OUT UINT64 **SmiTickInterval
810 )
811 /*++
812
813 Routine Description:
814
815 GC_TODO: Add function description
816
817 Arguments:
818
819 This - GC_TODO: add argument description
820 SmiTickInterval - GC_TODO: add argument description
821
822 Returns:
823
824 GC_TODO: add return values
825
826 --*/
827 ;
828
829 VOID
830 QNCSmmSxGoToSleep (
831 VOID
832 )
833 /*++
834
835 Routine Description:
836
837 GC_TODO: Add function description
838
839 Arguments:
840
841 None
842
843 Returns:
844
845 GC_TODO: add return values
846
847 --*/
848 ;
849
850 VOID
851 EFIAPI
852 QNCSmmQNCnClearSource (
853 QNC_SMM_SOURCE_DESC *SrcDesc
854 )
855 /*++
856
857 Routine Description:
858
859 GC_TODO: Add function description
860
861 Arguments:
862
863 SrcDesc - GC_TODO: add argument description
864
865 Returns:
866
867 GC_TODO: add return values
868
869 --*/
870 ;
871
872 #endif