]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/SmmControl2OnSmmControlThunk/SmmControl2OnSmmControlThunk.c
1. Correct File header to ## @file
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / SmmControl2OnSmmControlThunk / SmmControl2OnSmmControlThunk.c
CommitLineData
9e620719 1/** @file\r
2 SMM Control2 Protocol on SMM Control Protocol Thunk driver.\r
3\r
4 Copyright (c) 2009 Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "SmmControl2OnSmmControlThunk.h"\r
16\r
17EFI_SMM_CONTROL2_PROTOCOL gSmmControl2 = {\r
18 SmmControl2Trigger,\r
19 SmmControl2Clear,\r
20 0\r
21};\r
22\r
23EFI_SMM_CONTROL_PROTOCOL *mSmmControl;\r
24UINT8 mDataPort;\r
25\r
26/**\r
27 Invokes SMI activation from either the preboot or runtime environment.\r
28\r
29 This function generates an SMI.\r
30\r
31 @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance.\r
32 @param[in,out] CommandPort The value written to the command port.\r
33 @param[in,out] DataPort The value written to the data port.\r
34 @param[in] Periodic Optional mechanism to engender a periodic stream.\r
35 @param[in] ActivationInterval Optional parameter to repeat at this period one\r
36 time or, if the Periodic Boolean is set, periodically.\r
37\r
38 @retval EFI_SUCCESS The SMI/PMI has been engendered.\r
39 @retval EFI_DEVICE_ERROR The timing is unsupported.\r
40 @retval EFI_INVALID_PARAMETER The activation period is unsupported.\r
41 @retval EFI_NOT_STARTED The SMM base service has not been initialized.\r
42**/\r
43EFI_STATUS\r
44EFIAPI\r
45SmmControl2Trigger (\r
46 IN CONST EFI_SMM_CONTROL2_PROTOCOL *This,\r
47 IN OUT UINT8 *CommandPort OPTIONAL,\r
48 IN OUT UINT8 *DataPort OPTIONAL,\r
49 IN BOOLEAN Periodic OPTIONAL,\r
50 IN UINTN ActivationInterval OPTIONAL\r
51 )\r
52{\r
53 UINTN ArgumentBufferSize = 0;\r
54\r
55 if (CommandPort != NULL) {\r
56 ArgumentBufferSize = 1;\r
57 }\r
58 if (DataPort != NULL) {\r
59 IoWrite8 (mDataPort, *DataPort);\r
60 }\r
61 return mSmmControl->Trigger (mSmmControl, (INT8 *)CommandPort, &ArgumentBufferSize, Periodic, ActivationInterval);\r
62}\r
63\r
64/**\r
65 Clears any system state that was created in response to the Trigger() call.\r
66\r
67 This function acknowledges and causes the deassertion of the SMI activation source.\r
68\r
69 @param[in] This The EFI_SMM_CONTROL2_PROTOCOL instance.\r
70 @param[in] Periodic Optional parameter to repeat at this period one time\r
71\r
72 @retval EFI_SUCCESS The SMI/PMI has been engendered.\r
73 @retval EFI_DEVICE_ERROR The source could not be cleared.\r
74 @retval EFI_INVALID_PARAMETER The service did not support the Periodic input argument.\r
75**/\r
76EFI_STATUS\r
77EFIAPI\r
78SmmControl2Clear (\r
79 IN CONST EFI_SMM_CONTROL2_PROTOCOL *This,\r
80 IN BOOLEAN Periodic OPTIONAL\r
81 )\r
82{\r
83 return mSmmControl->Clear (mSmmControl, Periodic);\r
84}\r
85\r
86/**\r
87 Entry Point for this thunk driver.\r
88\r
89 @param[in] ImageHandle Image handle of this driver.\r
90 @param[in] SystemTable A Pointer to the EFI System Table.\r
91\r
92 @retval EFI_SUCCESS The entry point is executed successfully.\r
93 @retval other Some error occurred when executing this entry point.\r
94**/\r
95EFI_STATUS\r
96EFIAPI\r
97SmmControl2ThunkMain (\r
98 IN EFI_HANDLE ImageHandle,\r
99 IN EFI_SYSTEM_TABLE *SystemTable\r
100 )\r
101{\r
102 EFI_STATUS Status;\r
103 EFI_SMM_CONTROL_REGISTER RegisterInfo;\r
104\r
105 ///\r
106 /// Locate Framework SMM Control Protocol\r
107 ///\r
108 Status = gBS->LocateProtocol (&gEfiSmmControlProtocolGuid, NULL, (VOID **)&mSmmControl);\r
109 ASSERT_EFI_ERROR (Status);\r
110\r
111 gSmmControl2.MinimumTriggerPeriod = mSmmControl->MinimumTriggerPeriod;\r
112\r
113 Status = mSmmControl->GetRegisterInfo (mSmmControl, &RegisterInfo);\r
114 ASSERT_EFI_ERROR (Status);\r
115 mDataPort = RegisterInfo.SmiDataRegister;\r
116\r
117 ///\r
118 /// Publish framework SMM Control Protocol\r
119 ///\r
120 Status = gBS->InstallProtocolInterface (\r
121 &ImageHandle,\r
122 &gEfiSmmControl2ProtocolGuid,\r
123 EFI_NATIVE_INTERFACE,\r
124 &gSmmControl2\r
125 );\r
126 return Status;\r
127}\r
128\r