]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
edk2/MdeModulePkg/Universal/BdsDxe/BootMaint/BootMaint.h:
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / DeviceMngr / DeviceManager.c
CommitLineData
93e3992d 1/*++\r
2\r
3Copyright (c) 2004 - 2008, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 DeviceManager.c\r
15\r
16Abstract:\r
17\r
18 The platform device manager reference implement\r
19\r
20--*/\r
21\r
22#include "DeviceManager.h"\r
23\r
24DEVICE_MANAGER_CALLBACK_DATA gDeviceManagerPrivate = {\r
25 DEVICE_MANAGER_CALLBACK_DATA_SIGNATURE,\r
26 NULL,\r
27 NULL,\r
28 {\r
29 FakeExtractConfig,\r
30 FakeRouteConfig,\r
31 DeviceManagerCallback\r
32 }\r
33};\r
34\r
35EFI_GUID mDeviceManagerGuid = DEVICE_MANAGER_FORMSET_GUID;\r
36\r
37DEVICE_MANAGER_MENU_ITEM mDeviceManagerMenuItemTable[] = {\r
38 { STRING_TOKEN (STR_DISK_DEVICE), EFI_DISK_DEVICE_CLASS },\r
39 { STRING_TOKEN (STR_VIDEO_DEVICE), EFI_VIDEO_DEVICE_CLASS },\r
40 { STRING_TOKEN (STR_NETWORK_DEVICE), EFI_NETWORK_DEVICE_CLASS },\r
41 { STRING_TOKEN (STR_INPUT_DEVICE), EFI_INPUT_DEVICE_CLASS },\r
42 { STRING_TOKEN (STR_ON_BOARD_DEVICE), EFI_ON_BOARD_DEVICE_CLASS },\r
43 { STRING_TOKEN (STR_OTHER_DEVICE), EFI_OTHER_DEVICE_CLASS }\r
44};\r
45\r
46#define MENU_ITEM_NUM \\r
47 (sizeof (mDeviceManagerMenuItemTable) / sizeof (DEVICE_MANAGER_MENU_ITEM))\r
48\r
49EFI_STATUS\r
50EFIAPI\r
51DeviceManagerCallback (\r
52 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
53 IN EFI_BROWSER_ACTION Action,\r
54 IN EFI_QUESTION_ID QuestionId,\r
55 IN UINT8 Type,\r
56 IN EFI_IFR_TYPE_VALUE *Value,\r
57 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
58 )\r
59/*++\r
60\r
61 Routine Description:\r
62 This function processes the results of changes in configuration.\r
63\r
64 Arguments:\r
65 This - Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
66 Action - Specifies the type of action taken by the browser.\r
67 QuestionId - A unique value which is sent to the original exporting driver\r
68 so that it can identify the type of data to expect.\r
69 Type - The type of value for the question.\r
70 Value - A pointer to the data being sent to the original exporting driver.\r
71 ActionRequest - On return, points to the action requested by the callback function.\r
72\r
73 Returns:\r
74 EFI_SUCCESS - The callback successfully handled the action.\r
75 EFI_OUT_OF_RESOURCES - Not enough storage is available to hold the variable and its data.\r
76 EFI_DEVICE_ERROR - The variable could not be saved.\r
77 EFI_UNSUPPORTED - The specified Action is not supported by the callback.\r
78\r
79--*/\r
80{\r
81 DEVICE_MANAGER_CALLBACK_DATA *PrivateData;\r
82\r
83 if ((Value == NULL) || (ActionRequest == NULL)) {\r
84 return EFI_INVALID_PARAMETER;\r
85 }\r
86\r
87 PrivateData = DEVICE_MANAGER_CALLBACK_DATA_FROM_THIS (This);\r
88\r
89 switch (QuestionId) {\r
90 case DEVICE_MANAGER_KEY_VBIOS:\r
91 PrivateData->VideoBios = Value->u8;\r
92 gRT->SetVariable (\r
93 L"VBIOS",\r
94 &gEfiGenericPlatformVariableGuid,\r
95 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
96 sizeof (UINT8),\r
97 &PrivateData->VideoBios\r
98 );\r
99\r
100 //\r
101 // Tell browser not to ask for confirmation of changes,\r
102 // since we have already applied.\r
103 //\r
104 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
105 break;\r
106\r
107 default:\r
108 //\r
109 // The key corresponds the Handle Index which was requested to be displayed\r
110 //\r
111 gCallbackKey = QuestionId;\r
112\r
113 //\r
114 // Request to exit SendForm(), so as to switch to selected form\r
115 //\r
116 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
117 break;\r
118 }\r
119\r
120 return EFI_SUCCESS;\r
121}\r
122\r
123EFI_STATUS\r
124InitializeDeviceManager (\r
125 VOID\r
126 )\r
127/*++\r
128\r
129Routine Description:\r
130\r
131 Initialize HII information for the FrontPage\r
132\r
133Arguments:\r
134 None\r
135\r
136Returns:\r
137\r
138--*/\r
139{\r
140 EFI_STATUS Status;\r
141 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
142\r
143 //\r
144 // Create driver handle used by HII database\r
145 //\r
146 Status = HiiLibCreateHiiDriverHandle (&gDeviceManagerPrivate.DriverHandle);\r
147 if (EFI_ERROR (Status)) {\r
148 return Status;\r
149 }\r
150\r
151 //\r
152 // Install Config Access protocol to driver handle\r
153 //\r
154 Status = gBS->InstallProtocolInterface (\r
155 &gDeviceManagerPrivate.DriverHandle,\r
156 &gEfiHiiConfigAccessProtocolGuid,\r
157 EFI_NATIVE_INTERFACE,\r
158 &gDeviceManagerPrivate.ConfigAccess\r
159 );\r
160 ASSERT_EFI_ERROR (Status);\r
161\r
162 //\r
163 // Publish our HII data\r
164 //\r
062539cf 165 PackageList = HiiLibPreparePackageList (2, &mDeviceManagerGuid, DeviceManagerVfrBin, BdsDxeStrings);\r
93e3992d 166 ASSERT (PackageList != NULL);\r
167\r
168 Status = gHiiDatabase->NewPackageList (\r
169 gHiiDatabase,\r
170 PackageList,\r
171 gDeviceManagerPrivate.DriverHandle,\r
172 &gDeviceManagerPrivate.HiiHandle\r
173 );\r
174 FreePool (PackageList);\r
175\r
176 return Status;\r
177}\r
178\r
179EFI_STATUS\r
180CallDeviceManager (\r
181 VOID\r
182 )\r
183/*++\r
184\r
185Routine Description:\r
186\r
187 Call the browser and display the device manager\r
188\r
189Arguments:\r
190\r
191 None\r
192\r
193Returns:\r
194 EFI_SUCCESS - Operation is successful.\r
195 EFI_INVALID_PARAMETER - If the inputs to SendForm function is not valid.\r
196\r
197--*/\r
198{\r
199 EFI_STATUS Status;\r
200 UINTN Count;\r
201 UINTN Index;\r
202 CHAR16 *String;\r
203 UINTN StringLength;\r
204 EFI_HII_UPDATE_DATA UpdateData[MENU_ITEM_NUM];\r
205 EFI_STRING_ID Token;\r
206 EFI_STRING_ID TokenHelp;\r
207 IFR_OPTION *IfrOptionList;\r
208 UINT8 *VideoOption;\r
209 UINTN VideoOptionSize;\r
210 EFI_HII_HANDLE *HiiHandles;\r
211 UINTN HandleBufferLength;\r
212 UINTN NumberOfHiiHandles;\r
213 EFI_HII_HANDLE HiiHandle;\r
214 UINT16 FormSetClass;\r
215 EFI_STRING_ID FormSetTitle;\r
216 EFI_STRING_ID FormSetHelp;\r
217 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
218 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
219\r
220 IfrOptionList = NULL;\r
221 VideoOption = NULL;\r
222 HiiHandles = NULL;\r
223 HandleBufferLength = 0;\r
224\r
225 Status = EFI_SUCCESS;\r
226 gCallbackKey = 0;\r
227\r
228 //\r
229 // Connect all prior to entering the platform setup menu.\r
230 //\r
231 if (!gConnectAllHappened) {\r
232 BdsLibConnectAllDriversToAllControllers ();\r
233 gConnectAllHappened = TRUE;\r
234 }\r
235\r
236 //\r
237 // Create Subtitle OpCodes\r
238 //\r
239 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
240 //\r
241 // Allocate space for creation of UpdateData Buffer\r
242 //\r
243 UpdateData[Index].BufferSize = 0x1000;\r
244 UpdateData[Index].Offset = 0;\r
245 UpdateData[Index].Data = AllocatePool (0x1000);\r
246 ASSERT (UpdateData[Index].Data != NULL);\r
247\r
248 CreateSubTitleOpCode (mDeviceManagerMenuItemTable[Index].StringId, 0, 0, 1, &UpdateData[Index]);\r
249 }\r
250\r
251 //\r
252 // Get all the Hii handles\r
253 //\r
9226efe5 254 Status = HiiLibGetHiiHandles (&HandleBufferLength, &HiiHandles);\r
93e3992d 255 ASSERT_EFI_ERROR (Status);\r
256\r
257 HiiHandle = gDeviceManagerPrivate.HiiHandle;\r
258\r
259 StringLength = 0x1000;\r
260 String = AllocateZeroPool (StringLength);\r
261 ASSERT (String != NULL);\r
262\r
263 //\r
264 // Search for formset of each class type\r
265 //\r
266 NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
267 for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
9226efe5 268 IfrLibExtractClassFromHiiHandle (HiiHandles[Index], &FormSetClass, &FormSetTitle, &FormSetHelp);\r
93e3992d 269\r
270 if (FormSetClass == EFI_NON_DEVICE_CLASS) {\r
271 continue;\r
272 }\r
273\r
274 Token = 0;\r
275 *String = 0;\r
276 StringLength = 0x1000;\r
9226efe5 277 HiiLibGetString (HiiHandles[Index], FormSetTitle, String, &StringLength);\r
278 HiiLibNewString (HiiHandle, &Token, String);\r
93e3992d 279\r
280 TokenHelp = 0;\r
281 *String = 0;\r
282 StringLength = 0x1000;\r
9226efe5 283 HiiLibGetString (HiiHandles[Index], FormSetHelp, String, &StringLength);\r
284 HiiLibNewString (HiiHandle, &TokenHelp, String);\r
93e3992d 285\r
286 for (Count = 0; Count < MENU_ITEM_NUM; Count++) {\r
287 if (FormSetClass & mDeviceManagerMenuItemTable[Count].Class) {\r
288 CreateActionOpCode (\r
289 (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
290 Token,\r
291 TokenHelp,\r
292 EFI_IFR_FLAG_CALLBACK,\r
293 0,\r
294 &UpdateData[Count]\r
295 );\r
296 }\r
297 }\r
298 }\r
299 FreePool (String);\r
300\r
301 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
302 //\r
303 // Add End Opcode for Subtitle\r
304 //\r
305 CreateEndOpCode (&UpdateData[Index]);\r
306\r
307 IfrLibUpdateForm (\r
308 HiiHandle,\r
309 &mDeviceManagerGuid,\r
310 DEVICE_MANAGER_FORM_ID,\r
311 mDeviceManagerMenuItemTable[Index].Class,\r
312 FALSE,\r
313 &UpdateData[Index]\r
314 );\r
315 }\r
316\r
317 //\r
318 // Add oneof for video BIOS selection\r
319 //\r
320 VideoOption = BdsLibGetVariableAndSize (\r
321 L"VBIOS",\r
322 &gEfiGenericPlatformVariableGuid,\r
323 &VideoOptionSize\r
324 );\r
325 if (NULL == VideoOption) {\r
326 gDeviceManagerPrivate.VideoBios = 0;\r
327 } else {\r
328 gDeviceManagerPrivate.VideoBios = VideoOption[0];\r
329 FreePool (VideoOption);\r
330 }\r
331\r
332 ASSERT (gDeviceManagerPrivate.VideoBios <= 1);\r
333\r
334 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
335 ASSERT (IfrOptionList != NULL);\r
336 IfrOptionList[0].Flags = 0;\r
337 IfrOptionList[0].StringToken = STRING_TOKEN (STR_ONE_OF_PCI);\r
338 IfrOptionList[0].Value.u8 = 0;\r
339 IfrOptionList[1].Flags = 0;\r
340 IfrOptionList[1].StringToken = STRING_TOKEN (STR_ONE_OF_AGP);\r
341 IfrOptionList[1].Value.u8 = 1;\r
342 IfrOptionList[gDeviceManagerPrivate.VideoBios].Flags |= EFI_IFR_OPTION_DEFAULT;\r
343\r
344 UpdateData[0].Offset = 0;\r
345 CreateOneOfOpCode (\r
346 DEVICE_MANAGER_KEY_VBIOS,\r
347 0,\r
348 0,\r
349 STRING_TOKEN (STR_ONE_OF_VBIOS),\r
350 STRING_TOKEN (STR_ONE_OF_VBIOS_HELP),\r
351 EFI_IFR_FLAG_CALLBACK,\r
352 EFI_IFR_NUMERIC_SIZE_1,\r
353 IfrOptionList,\r
354 2,\r
355 &UpdateData[0]\r
356 );\r
357\r
358 IfrLibUpdateForm (\r
359 HiiHandle,\r
360 &mDeviceManagerGuid,\r
361 DEVICE_MANAGER_FORM_ID,\r
362 LABEL_VBIOS,\r
363 FALSE,\r
364 &UpdateData[0]\r
365 );\r
366\r
367 //\r
368 // Drop the TPL level from TPL_APPLICATION to TPL_APPLICATION\r
369 //\r
370 gBS->RestoreTPL (TPL_APPLICATION);\r
371\r
372 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
373 Status = gFormBrowser2->SendForm (\r
374 gFormBrowser2,\r
375 &HiiHandle,\r
376 1,\r
377 NULL,\r
378 0,\r
379 NULL,\r
380 &ActionRequest\r
381 );\r
382 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
383 EnableResetRequired ();\r
384 }\r
385\r
386 //\r
387 // We will have returned from processing a callback - user either hit ESC to exit, or selected\r
388 // a target to display\r
389 //\r
390 if (gCallbackKey != 0) {\r
391 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
392 Status = gFormBrowser2->SendForm (\r
393 gFormBrowser2,\r
394 &HiiHandles[gCallbackKey - DEVICE_KEY_OFFSET],\r
395 1,\r
396 NULL,\r
397 0,\r
398 NULL,\r
399 &ActionRequest\r
400 );\r
401\r
402 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
403 EnableResetRequired ();\r
404 }\r
405\r
406 //\r
407 // Force return to Device Manager\r
408 //\r
409 gCallbackKey = FRONT_PAGE_KEY_DEVICE_MANAGER;\r
410 }\r
411\r
412 //\r
413 // Cleanup dynamic created strings in HII database by reinstall the packagelist\r
414 //\r
415 gHiiDatabase->RemovePackageList (gHiiDatabase, HiiHandle);\r
062539cf 416 PackageList = HiiLibPreparePackageList (2, &mDeviceManagerGuid, DeviceManagerVfrBin, BdsDxeStrings);\r
93e3992d 417 ASSERT (PackageList != NULL);\r
418 Status = gHiiDatabase->NewPackageList (\r
419 gHiiDatabase,\r
420 PackageList,\r
421 gDeviceManagerPrivate.DriverHandle,\r
422 &gDeviceManagerPrivate.HiiHandle\r
423 );\r
424 FreePool (PackageList);\r
425\r
426 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
427 FreePool (UpdateData[Index].Data);\r
428 }\r
429 FreePool (HiiHandles);\r
430\r
431 gBS->RaiseTPL (TPL_APPLICATION);\r
432\r
433 return Status;\r
434}\r