]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
HII Library Class interface refine.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / DeviceMngr / DeviceManager.c
CommitLineData
5c08e117 1/** @file\r
2 The platform device manager reference implementation\r
3\r
4Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "DeviceManager.h"\r
16\r
17DEVICE_MANAGER_CALLBACK_DATA gDeviceManagerPrivate = {\r
18 DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE,\r
19 NULL,\r
20 NULL,\r
21 {\r
22 FakeExtractConfig,\r
23 FakeRouteConfig,\r
24 DeviceManagerCallback\r
25 }\r
26};\r
27\r
28EFI_GUID mDeviceManagerGuid = DEVICE_MANAGER_FORMSET_GUID;\r
29\r
30DEVICE_MANAGER_MENU_ITEM mDeviceManagerMenuItemTable[] = {\r
31 { STRING_TOKEN (STR_DISK_DEVICE), EFI_DISK_DEVICE_CLASS },\r
32 { STRING_TOKEN (STR_VIDEO_DEVICE), EFI_VIDEO_DEVICE_CLASS },\r
33 { STRING_TOKEN (STR_NETWORK_DEVICE), EFI_NETWORK_DEVICE_CLASS },\r
34 { STRING_TOKEN (STR_INPUT_DEVICE), EFI_INPUT_DEVICE_CLASS },\r
35 { STRING_TOKEN (STR_ON_BOARD_DEVICE), EFI_ON_BOARD_DEVICE_CLASS },\r
36 { STRING_TOKEN (STR_OTHER_DEVICE), EFI_OTHER_DEVICE_CLASS }\r
37};\r
38\r
f6f910dd 39HII_VENDOR_DEVICE_PATH mDeviceManagerHiiVendorDevicePath = {\r
40 {\r
41 {\r
42 HARDWARE_DEVICE_PATH,\r
43 HW_VENDOR_DP,\r
44 {\r
45 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
46 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
47 }\r
48 },\r
49 //\r
50 // {102579A0-3686-466e-ACD8-80C087044F4A}\r
51 //\r
52 { 0x102579a0, 0x3686, 0x466e, { 0xac, 0xd8, 0x80, 0xc0, 0x87, 0x4, 0x4f, 0x4a } }\r
53 },\r
54 {\r
55 END_DEVICE_PATH_TYPE,\r
56 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
57 { \r
58 (UINT8) (END_DEVICE_PATH_LENGTH),\r
59 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
60 }\r
61 }\r
62};\r
63\r
5c08e117 64#define MENU_ITEM_NUM \\r
65 (sizeof (mDeviceManagerMenuItemTable) / sizeof (DEVICE_MANAGER_MENU_ITEM))\r
66\r
67/**\r
68 This function is invoked if user selected a iteractive opcode from Device Manager's\r
69 Formset. The decision by user is saved to gCallbackKey for later processing. If\r
70 user set VBIOS, the new value is saved to EFI variable.\r
71\r
72 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
73 @param Action Specifies the type of action taken by the browser.\r
74 @param QuestionId A unique value which is sent to the original exporting driver\r
75 so that it can identify the type of data to expect.\r
76 @param Type The type of value for the question.\r
77 @param Value A pointer to the data being sent to the original exporting driver.\r
78 @param ActionRequest On return, points to the action requested by the callback function.\r
79\r
80 @retval EFI_SUCCESS The callback successfully handled the action.\r
81 @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.\r
82\r
83**/\r
84EFI_STATUS\r
85EFIAPI\r
86DeviceManagerCallback (\r
87 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
88 IN EFI_BROWSER_ACTION Action,\r
89 IN EFI_QUESTION_ID QuestionId,\r
90 IN UINT8 Type,\r
91 IN EFI_IFR_TYPE_VALUE *Value,\r
92 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
93 )\r
94{\r
5c08e117 95 if ((Value == NULL) || (ActionRequest == NULL)) {\r
96 return EFI_INVALID_PARAMETER;\r
97 }\r
98\r
5c08e117 99\r
6aa22a17 100 gCallbackKey = QuestionId;\r
5c08e117 101\r
6aa22a17 102 //\r
103 // Request to exit SendForm(), so as to switch to selected form\r
104 //\r
105 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
5c08e117 106\r
5c08e117 107\r
108 return EFI_SUCCESS;\r
109}\r
110\r
111/**\r
112\r
113 This function registers HII packages to HII database.\r
114\r
cb7d01c0 115 @retval EFI_SUCCESS HII packages for the Device Manager were registered successfully.\r
116 @retval EFI_OUT_OF_RESOURCES HII packages for the Device Manager failed to be registered.\r
5c08e117 117\r
118**/\r
119EFI_STATUS\r
120InitializeDeviceManager (\r
121 VOID\r
122 )\r
123{\r
124 EFI_STATUS Status;\r
5c08e117 125\r
126 //\r
f6f910dd 127 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 128 //\r
f6f910dd 129 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 130 &gDeviceManagerPrivate.DriverHandle,\r
f6f910dd 131 &gEfiDevicePathProtocolGuid,\r
132 &mDeviceManagerHiiVendorDevicePath,\r
5c08e117 133 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 134 &gDeviceManagerPrivate.ConfigAccess,\r
135 NULL\r
5c08e117 136 );\r
137 ASSERT_EFI_ERROR (Status);\r
138\r
139 //\r
140 // Publish our HII data\r
141 //\r
cb7d01c0 142 gDeviceManagerPrivate.HiiHandle = HiiAddPackages (\r
143 &mDeviceManagerGuid,\r
144 gDeviceManagerPrivate.DriverHandle,\r
145 DeviceManagerVfrBin,\r
146 BdsDxeStrings,\r
147 NULL\r
148 );\r
149 if (gDeviceManagerPrivate.HiiHandle == NULL) {\r
150 Status = EFI_OUT_OF_RESOURCES;\r
151 } else {\r
152 Status = EFI_SUCCESS;\r
153 }\r
5c08e117 154 return Status;\r
155}\r
156\r
157/**\r
158 Call the browser and display the device manager to allow user\r
159 to configure the platform.\r
160\r
161 This function create the dynamic content for device manager. It includes\r
162 section header for all class of devices, one-of opcode to set VBIOS.\r
163 \r
164 @retval EFI_SUCCESS Operation is successful.\r
165 @return Other values if failed to clean up the dynamic content from HII\r
166 database.\r
167\r
168**/\r
169EFI_STATUS\r
170CallDeviceManager (\r
171 VOID\r
172 )\r
173{\r
174 EFI_STATUS Status;\r
175 UINTN Count;\r
176 UINTN Index;\r
cb7d01c0 177 EFI_STRING String;\r
5c08e117 178 EFI_HII_UPDATE_DATA UpdateData[MENU_ITEM_NUM];\r
179 EFI_STRING_ID Token;\r
180 EFI_STRING_ID TokenHelp;\r
5c08e117 181 EFI_HII_HANDLE *HiiHandles;\r
5c08e117 182 EFI_HII_HANDLE HiiHandle;\r
183 UINT16 FormSetClass;\r
184 EFI_STRING_ID FormSetTitle;\r
185 EFI_STRING_ID FormSetHelp;\r
186 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
5c08e117 187\r
5c08e117 188 HiiHandles = NULL;\r
5c08e117 189\r
190 Status = EFI_SUCCESS;\r
191 gCallbackKey = 0;\r
192\r
193 //\r
194 // Connect all prior to entering the platform setup menu.\r
195 //\r
196 if (!gConnectAllHappened) {\r
197 BdsLibConnectAllDriversToAllControllers ();\r
198 gConnectAllHappened = TRUE;\r
199 }\r
200\r
201 //\r
202 // Create Subtitle OpCodes\r
203 //\r
204 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
205 //\r
206 // Allocate space for creation of UpdateData Buffer\r
207 //\r
208 UpdateData[Index].BufferSize = 0x1000;\r
209 UpdateData[Index].Offset = 0;\r
210 UpdateData[Index].Data = AllocatePool (0x1000);\r
211 ASSERT (UpdateData[Index].Data != NULL);\r
212\r
213 CreateSubTitleOpCode (mDeviceManagerMenuItemTable[Index].StringId, 0, 0, 1, &UpdateData[Index]);\r
214 }\r
215\r
216 //\r
217 // Get all the Hii handles\r
218 //\r
cb7d01c0 219 HiiHandles = HiiGetHiiHandles (NULL);\r
220 ASSERT (HiiHandles != NULL);\r
5c08e117 221\r
222 HiiHandle = gDeviceManagerPrivate.HiiHandle;\r
223\r
5c08e117 224 //\r
225 // Search for formset of each class type\r
226 //\r
cb7d01c0 227 for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
5c08e117 228 IfrLibExtractClassFromHiiHandle (HiiHandles[Index], &FormSetClass, &FormSetTitle, &FormSetHelp);\r
229\r
230 if (FormSetClass == EFI_NON_DEVICE_CLASS) {\r
231 continue;\r
232 }\r
233\r
cb7d01c0 234 String = HiiGetString (HiiHandles[Index], FormSetTitle, NULL);\r
235 ASSERT (String != NULL);\r
236 Token = HiiSetString (HiiHandle, 0, String, NULL);\r
237 FreePool (String);\r
5c08e117 238\r
cb7d01c0 239 String = HiiGetString (HiiHandles[Index], FormSetHelp, NULL);\r
240 ASSERT (String != NULL);\r
241 TokenHelp = HiiSetString (HiiHandle, 0, String, NULL);\r
242 FreePool (String);\r
5c08e117 243\r
244 for (Count = 0; Count < MENU_ITEM_NUM; Count++) {\r
245 if (FormSetClass & mDeviceManagerMenuItemTable[Count].Class) {\r
246 CreateActionOpCode (\r
247 (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
248 Token,\r
249 TokenHelp,\r
250 EFI_IFR_FLAG_CALLBACK,\r
251 0,\r
252 &UpdateData[Count]\r
253 );\r
254 }\r
255 }\r
256 }\r
5c08e117 257\r
258 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
259 //\r
260 // Add End Opcode for Subtitle\r
261 //\r
262 CreateEndOpCode (&UpdateData[Index]);\r
263\r
264 IfrLibUpdateForm (\r
265 HiiHandle,\r
266 &mDeviceManagerGuid,\r
267 DEVICE_MANAGER_FORM_ID,\r
268 mDeviceManagerMenuItemTable[Index].Class,\r
269 FALSE,\r
270 &UpdateData[Index]\r
271 );\r
272 }\r
273\r
5c08e117 274 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
275 Status = gFormBrowser2->SendForm (\r
276 gFormBrowser2,\r
277 &HiiHandle,\r
278 1,\r
279 NULL,\r
280 0,\r
281 NULL,\r
282 &ActionRequest\r
283 );\r
284 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
285 EnableResetRequired ();\r
286 }\r
287\r
288 //\r
289 // We will have returned from processing a callback - user either hit ESC to exit, or selected\r
290 // a target to display\r
291 //\r
292 if (gCallbackKey != 0) {\r
293 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
294 Status = gFormBrowser2->SendForm (\r
295 gFormBrowser2,\r
296 &HiiHandles[gCallbackKey - DEVICE_KEY_OFFSET],\r
297 1,\r
298 NULL,\r
299 0,\r
300 NULL,\r
301 &ActionRequest\r
302 );\r
303\r
304 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
305 EnableResetRequired ();\r
306 }\r
307\r
308 //\r
309 // Force return to Device Manager\r
310 //\r
311 gCallbackKey = FRONT_PAGE_KEY_DEVICE_MANAGER;\r
312 }\r
313\r
314 //\r
315 // Cleanup dynamic created strings in HII database by reinstall the packagelist\r
316 //\r
cb7d01c0 317 HiiRemovePackages (HiiHandle);\r
318\r
319 gDeviceManagerPrivate.HiiHandle = HiiAddPackages (\r
320 &mDeviceManagerGuid,\r
321 gDeviceManagerPrivate.DriverHandle,\r
322 DeviceManagerVfrBin,\r
323 BdsDxeStrings,\r
324 NULL\r
325 );\r
326 if (gDeviceManagerPrivate.HiiHandle == NULL) {\r
327 Status = EFI_OUT_OF_RESOURCES;\r
328 } else {\r
329 Status = EFI_SUCCESS;\r
330 }\r
5c08e117 331\r
332 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
333 FreePool (UpdateData[Index].Data);\r
334 }\r
335 FreePool (HiiHandles);\r
336\r
337 return Status;\r
338}\r