]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
Update consplitter driver to use dynamic PCD to set console output mode instead of...
[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
39#define MENU_ITEM_NUM \\r
40 (sizeof (mDeviceManagerMenuItemTable) / sizeof (DEVICE_MANAGER_MENU_ITEM))\r
41\r
42/**\r
43 This function is invoked if user selected a iteractive opcode from Device Manager's\r
44 Formset. The decision by user is saved to gCallbackKey for later processing. If\r
45 user set VBIOS, the new value is saved to EFI variable.\r
46\r
47 @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
48 @param Action Specifies the type of action taken by the browser.\r
49 @param QuestionId A unique value which is sent to the original exporting driver\r
50 so that it can identify the type of data to expect.\r
51 @param Type The type of value for the question.\r
52 @param Value A pointer to the data being sent to the original exporting driver.\r
53 @param ActionRequest On return, points to the action requested by the callback function.\r
54\r
55 @retval EFI_SUCCESS The callback successfully handled the action.\r
56 @retval EFI_INVALID_PARAMETER The setup browser call this function with invalid parameters.\r
57\r
58**/\r
59EFI_STATUS\r
60EFIAPI\r
61DeviceManagerCallback (\r
62 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
63 IN EFI_BROWSER_ACTION Action,\r
64 IN EFI_QUESTION_ID QuestionId,\r
65 IN UINT8 Type,\r
66 IN EFI_IFR_TYPE_VALUE *Value,\r
67 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
68 )\r
69{\r
70 DEVICE_MANAGER_CALLBACK_DATA *PrivateData;\r
71\r
72 if ((Value == NULL) || (ActionRequest == NULL)) {\r
73 return EFI_INVALID_PARAMETER;\r
74 }\r
75\r
76 PrivateData = DEVICE_MANAGER_CALLBACK_DATA_FROM_THIS (This);\r
77\r
78 switch (QuestionId) {\r
79 case DEVICE_MANAGER_KEY_VBIOS:\r
80 PrivateData->VideoBios = Value->u8;\r
81 gRT->SetVariable (\r
82 L"VBIOS",\r
83 &gEfiGenericPlatformVariableGuid,\r
84 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
85 sizeof (UINT8),\r
86 &PrivateData->VideoBios\r
87 );\r
88\r
89 //\r
90 // Tell browser not to ask for confirmation of changes,\r
91 // since we have already applied.\r
92 //\r
93 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
94 break;\r
95\r
96 default:\r
97 //\r
98 // The key corresponds the Handle Index which was requested to be displayed\r
99 //\r
100 gCallbackKey = QuestionId;\r
101\r
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
106 break;\r
107 }\r
108\r
109 return EFI_SUCCESS;\r
110}\r
111\r
112/**\r
113\r
114 This function registers HII packages to HII database.\r
115\r
116 @retval EFI_SUCCESS This function complete successfully.\r
117 @return Other value if failed to register HII packages.\r
118\r
119**/\r
120EFI_STATUS\r
121InitializeDeviceManager (\r
122 VOID\r
123 )\r
124{\r
125 EFI_STATUS Status;\r
126 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
127\r
128 //\r
129 // Create driver handle used by HII database\r
130 //\r
131 Status = HiiLibCreateHiiDriverHandle (&gDeviceManagerPrivate.DriverHandle);\r
132 if (EFI_ERROR (Status)) {\r
133 return Status;\r
134 }\r
135\r
136 //\r
137 // Install Config Access protocol to driver handle\r
138 //\r
139 Status = gBS->InstallProtocolInterface (\r
140 &gDeviceManagerPrivate.DriverHandle,\r
141 &gEfiHiiConfigAccessProtocolGuid,\r
142 EFI_NATIVE_INTERFACE,\r
143 &gDeviceManagerPrivate.ConfigAccess\r
144 );\r
145 ASSERT_EFI_ERROR (Status);\r
146\r
147 //\r
148 // Publish our HII data\r
149 //\r
150 PackageList = HiiLibPreparePackageList (2, &mDeviceManagerGuid, DeviceManagerVfrBin, BdsDxeStrings);\r
151 ASSERT (PackageList != NULL);\r
152\r
153 Status = gHiiDatabase->NewPackageList (\r
154 gHiiDatabase,\r
155 PackageList,\r
156 gDeviceManagerPrivate.DriverHandle,\r
157 &gDeviceManagerPrivate.HiiHandle\r
158 );\r
159 FreePool (PackageList);\r
160\r
161 return Status;\r
162}\r
163\r
164/**\r
165 Call the browser and display the device manager to allow user\r
166 to configure the platform.\r
167\r
168 This function create the dynamic content for device manager. It includes\r
169 section header for all class of devices, one-of opcode to set VBIOS.\r
170 \r
171 @retval EFI_SUCCESS Operation is successful.\r
172 @return Other values if failed to clean up the dynamic content from HII\r
173 database.\r
174\r
175**/\r
176EFI_STATUS\r
177CallDeviceManager (\r
178 VOID\r
179 )\r
180{\r
181 EFI_STATUS Status;\r
182 UINTN Count;\r
183 UINTN Index;\r
184 CHAR16 *String;\r
185 UINTN StringLength;\r
186 EFI_HII_UPDATE_DATA UpdateData[MENU_ITEM_NUM];\r
187 EFI_STRING_ID Token;\r
188 EFI_STRING_ID TokenHelp;\r
189 IFR_OPTION *IfrOptionList;\r
190 UINT8 *VideoOption;\r
191 UINTN VideoOptionSize;\r
192 EFI_HII_HANDLE *HiiHandles;\r
193 UINTN HandleBufferLength;\r
194 UINTN NumberOfHiiHandles;\r
195 EFI_HII_HANDLE HiiHandle;\r
196 UINT16 FormSetClass;\r
197 EFI_STRING_ID FormSetTitle;\r
198 EFI_STRING_ID FormSetHelp;\r
199 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
200 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
201\r
202 IfrOptionList = NULL;\r
203 VideoOption = NULL;\r
204 HiiHandles = NULL;\r
205 HandleBufferLength = 0;\r
206\r
207 Status = EFI_SUCCESS;\r
208 gCallbackKey = 0;\r
209\r
210 //\r
211 // Connect all prior to entering the platform setup menu.\r
212 //\r
213 if (!gConnectAllHappened) {\r
214 BdsLibConnectAllDriversToAllControllers ();\r
215 gConnectAllHappened = TRUE;\r
216 }\r
217\r
218 //\r
219 // Create Subtitle OpCodes\r
220 //\r
221 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
222 //\r
223 // Allocate space for creation of UpdateData Buffer\r
224 //\r
225 UpdateData[Index].BufferSize = 0x1000;\r
226 UpdateData[Index].Offset = 0;\r
227 UpdateData[Index].Data = AllocatePool (0x1000);\r
228 ASSERT (UpdateData[Index].Data != NULL);\r
229\r
230 CreateSubTitleOpCode (mDeviceManagerMenuItemTable[Index].StringId, 0, 0, 1, &UpdateData[Index]);\r
231 }\r
232\r
233 //\r
234 // Get all the Hii handles\r
235 //\r
236 Status = HiiLibGetHiiHandles (&HandleBufferLength, &HiiHandles);\r
237 ASSERT_EFI_ERROR (Status && (HiiHandles != NULL));\r
238\r
239 HiiHandle = gDeviceManagerPrivate.HiiHandle;\r
240\r
241 StringLength = 0x1000;\r
242 String = AllocateZeroPool (StringLength);\r
243 ASSERT (String != NULL);\r
244\r
245 //\r
246 // Search for formset of each class type\r
247 //\r
248 NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
249 for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
250 IfrLibExtractClassFromHiiHandle (HiiHandles[Index], &FormSetClass, &FormSetTitle, &FormSetHelp);\r
251\r
252 if (FormSetClass == EFI_NON_DEVICE_CLASS) {\r
253 continue;\r
254 }\r
255\r
256 Token = 0;\r
257 *String = 0;\r
258 StringLength = 0x1000;\r
259 HiiLibGetString (HiiHandles[Index], FormSetTitle, String, &StringLength);\r
260 HiiLibNewString (HiiHandle, &Token, String);\r
261\r
262 TokenHelp = 0;\r
263 *String = 0;\r
264 StringLength = 0x1000;\r
265 HiiLibGetString (HiiHandles[Index], FormSetHelp, String, &StringLength);\r
266 HiiLibNewString (HiiHandle, &TokenHelp, String);\r
267\r
268 for (Count = 0; Count < MENU_ITEM_NUM; Count++) {\r
269 if (FormSetClass & mDeviceManagerMenuItemTable[Count].Class) {\r
270 CreateActionOpCode (\r
271 (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
272 Token,\r
273 TokenHelp,\r
274 EFI_IFR_FLAG_CALLBACK,\r
275 0,\r
276 &UpdateData[Count]\r
277 );\r
278 }\r
279 }\r
280 }\r
281 FreePool (String);\r
282\r
283 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
284 //\r
285 // Add End Opcode for Subtitle\r
286 //\r
287 CreateEndOpCode (&UpdateData[Index]);\r
288\r
289 IfrLibUpdateForm (\r
290 HiiHandle,\r
291 &mDeviceManagerGuid,\r
292 DEVICE_MANAGER_FORM_ID,\r
293 mDeviceManagerMenuItemTable[Index].Class,\r
294 FALSE,\r
295 &UpdateData[Index]\r
296 );\r
297 }\r
298\r
299 //\r
300 // Add oneof for video BIOS selection\r
301 //\r
302 VideoOption = BdsLibGetVariableAndSize (\r
303 L"VBIOS",\r
304 &gEfiGenericPlatformVariableGuid,\r
305 &VideoOptionSize\r
306 );\r
307 if (VideoOption == NULL) {\r
308 gDeviceManagerPrivate.VideoBios = 0;\r
309 } else {\r
310 gDeviceManagerPrivate.VideoBios = VideoOption[0];\r
311 FreePool (VideoOption);\r
312 }\r
313\r
314 ASSERT (gDeviceManagerPrivate.VideoBios <= 1);\r
315\r
316 IfrOptionList = AllocatePool (2 * sizeof (IFR_OPTION));\r
317 ASSERT (IfrOptionList != NULL);\r
318 IfrOptionList[0].Flags = 0;\r
319 IfrOptionList[0].StringToken = STRING_TOKEN (STR_ONE_OF_PCI);\r
320 IfrOptionList[0].Value.u8 = 0;\r
321 IfrOptionList[1].Flags = 0;\r
322 IfrOptionList[1].StringToken = STRING_TOKEN (STR_ONE_OF_AGP);\r
323 IfrOptionList[1].Value.u8 = 1;\r
324 IfrOptionList[gDeviceManagerPrivate.VideoBios].Flags |= EFI_IFR_OPTION_DEFAULT;\r
325\r
326 UpdateData[0].Offset = 0;\r
327 CreateOneOfOpCode (\r
328 DEVICE_MANAGER_KEY_VBIOS,\r
329 0,\r
330 0,\r
331 STRING_TOKEN (STR_ONE_OF_VBIOS),\r
332 STRING_TOKEN (STR_ONE_OF_VBIOS_HELP),\r
333 EFI_IFR_FLAG_CALLBACK,\r
334 EFI_IFR_NUMERIC_SIZE_1,\r
335 IfrOptionList,\r
336 2,\r
337 &UpdateData[0]\r
338 );\r
339\r
340 IfrLibUpdateForm (\r
341 HiiHandle,\r
342 &mDeviceManagerGuid,\r
343 DEVICE_MANAGER_FORM_ID,\r
344 LABEL_VBIOS,\r
345 FALSE,\r
346 &UpdateData[0]\r
347 );\r
348\r
349 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
350 Status = gFormBrowser2->SendForm (\r
351 gFormBrowser2,\r
352 &HiiHandle,\r
353 1,\r
354 NULL,\r
355 0,\r
356 NULL,\r
357 &ActionRequest\r
358 );\r
359 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
360 EnableResetRequired ();\r
361 }\r
362\r
363 //\r
364 // We will have returned from processing a callback - user either hit ESC to exit, or selected\r
365 // a target to display\r
366 //\r
367 if (gCallbackKey != 0) {\r
368 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
369 Status = gFormBrowser2->SendForm (\r
370 gFormBrowser2,\r
371 &HiiHandles[gCallbackKey - DEVICE_KEY_OFFSET],\r
372 1,\r
373 NULL,\r
374 0,\r
375 NULL,\r
376 &ActionRequest\r
377 );\r
378\r
379 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
380 EnableResetRequired ();\r
381 }\r
382\r
383 //\r
384 // Force return to Device Manager\r
385 //\r
386 gCallbackKey = FRONT_PAGE_KEY_DEVICE_MANAGER;\r
387 }\r
388\r
389 //\r
390 // Cleanup dynamic created strings in HII database by reinstall the packagelist\r
391 //\r
392 gHiiDatabase->RemovePackageList (gHiiDatabase, HiiHandle);\r
393 PackageList = HiiLibPreparePackageList (2, &mDeviceManagerGuid, DeviceManagerVfrBin, BdsDxeStrings);\r
394 ASSERT (PackageList != NULL);\r
395 Status = gHiiDatabase->NewPackageList (\r
396 gHiiDatabase,\r
397 PackageList,\r
398 gDeviceManagerPrivate.DriverHandle,\r
399 &gDeviceManagerPrivate.HiiHandle\r
400 );\r
401 FreePool (PackageList);\r
402\r
403 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
404 FreePool (UpdateData[Index].Data);\r
405 }\r
406 FreePool (HiiHandles);\r
407\r
408 return Status;\r
409}\r