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