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