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