]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/DeviceMngr/DeviceManager.c
Retire Extended HII library class.
[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
115 @retval EFI_SUCCESS This function complete successfully.\r
116 @return Other value if failed to register HII packages.\r
117\r
118**/\r
119EFI_STATUS\r
120InitializeDeviceManager (\r
121 VOID\r
122 )\r
123{\r
124 EFI_STATUS Status;\r
125 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
126\r
127 //\r
f6f910dd 128 // Install Device Path Protocol and Config Access protocol to driver handle\r
5c08e117 129 //\r
f6f910dd 130 Status = gBS->InstallMultipleProtocolInterfaces (\r
5c08e117 131 &gDeviceManagerPrivate.DriverHandle,\r
f6f910dd 132 &gEfiDevicePathProtocolGuid,\r
133 &mDeviceManagerHiiVendorDevicePath,\r
5c08e117 134 &gEfiHiiConfigAccessProtocolGuid,\r
f6f910dd 135 &gDeviceManagerPrivate.ConfigAccess,\r
136 NULL\r
5c08e117 137 );\r
138 ASSERT_EFI_ERROR (Status);\r
139\r
140 //\r
141 // Publish our HII data\r
142 //\r
143 PackageList = HiiLibPreparePackageList (2, &mDeviceManagerGuid, DeviceManagerVfrBin, BdsDxeStrings);\r
144 ASSERT (PackageList != NULL);\r
145\r
146 Status = gHiiDatabase->NewPackageList (\r
147 gHiiDatabase,\r
148 PackageList,\r
149 gDeviceManagerPrivate.DriverHandle,\r
150 &gDeviceManagerPrivate.HiiHandle\r
151 );\r
152 FreePool (PackageList);\r
153\r
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
177 CHAR16 *String;\r
178 UINTN StringLength;\r
179 EFI_HII_UPDATE_DATA UpdateData[MENU_ITEM_NUM];\r
180 EFI_STRING_ID Token;\r
181 EFI_STRING_ID TokenHelp;\r
5c08e117 182 EFI_HII_HANDLE *HiiHandles;\r
183 UINTN HandleBufferLength;\r
184 UINTN NumberOfHiiHandles;\r
185 EFI_HII_HANDLE HiiHandle;\r
186 UINT16 FormSetClass;\r
187 EFI_STRING_ID FormSetTitle;\r
188 EFI_STRING_ID FormSetHelp;\r
189 EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
190 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
191\r
5c08e117 192 HiiHandles = NULL;\r
193 HandleBufferLength = 0;\r
194\r
195 Status = EFI_SUCCESS;\r
196 gCallbackKey = 0;\r
197\r
198 //\r
199 // Connect all prior to entering the platform setup menu.\r
200 //\r
201 if (!gConnectAllHappened) {\r
202 BdsLibConnectAllDriversToAllControllers ();\r
203 gConnectAllHappened = TRUE;\r
204 }\r
205\r
206 //\r
207 // Create Subtitle OpCodes\r
208 //\r
209 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
210 //\r
211 // Allocate space for creation of UpdateData Buffer\r
212 //\r
213 UpdateData[Index].BufferSize = 0x1000;\r
214 UpdateData[Index].Offset = 0;\r
215 UpdateData[Index].Data = AllocatePool (0x1000);\r
216 ASSERT (UpdateData[Index].Data != NULL);\r
217\r
218 CreateSubTitleOpCode (mDeviceManagerMenuItemTable[Index].StringId, 0, 0, 1, &UpdateData[Index]);\r
219 }\r
220\r
221 //\r
222 // Get all the Hii handles\r
223 //\r
224 Status = HiiLibGetHiiHandles (&HandleBufferLength, &HiiHandles);\r
225 ASSERT_EFI_ERROR (Status && (HiiHandles != NULL));\r
226\r
227 HiiHandle = gDeviceManagerPrivate.HiiHandle;\r
228\r
229 StringLength = 0x1000;\r
230 String = AllocateZeroPool (StringLength);\r
231 ASSERT (String != NULL);\r
232\r
233 //\r
234 // Search for formset of each class type\r
235 //\r
236 NumberOfHiiHandles = HandleBufferLength / sizeof (EFI_HII_HANDLE);\r
237 for (Index = 0; Index < NumberOfHiiHandles; Index++) {\r
238 IfrLibExtractClassFromHiiHandle (HiiHandles[Index], &FormSetClass, &FormSetTitle, &FormSetHelp);\r
239\r
240 if (FormSetClass == EFI_NON_DEVICE_CLASS) {\r
241 continue;\r
242 }\r
243\r
244 Token = 0;\r
245 *String = 0;\r
246 StringLength = 0x1000;\r
247 HiiLibGetString (HiiHandles[Index], FormSetTitle, String, &StringLength);\r
248 HiiLibNewString (HiiHandle, &Token, String);\r
249\r
250 TokenHelp = 0;\r
251 *String = 0;\r
252 StringLength = 0x1000;\r
253 HiiLibGetString (HiiHandles[Index], FormSetHelp, String, &StringLength);\r
254 HiiLibNewString (HiiHandle, &TokenHelp, String);\r
255\r
256 for (Count = 0; Count < MENU_ITEM_NUM; Count++) {\r
257 if (FormSetClass & mDeviceManagerMenuItemTable[Count].Class) {\r
258 CreateActionOpCode (\r
259 (EFI_QUESTION_ID) (Index + DEVICE_KEY_OFFSET),\r
260 Token,\r
261 TokenHelp,\r
262 EFI_IFR_FLAG_CALLBACK,\r
263 0,\r
264 &UpdateData[Count]\r
265 );\r
266 }\r
267 }\r
268 }\r
269 FreePool (String);\r
270\r
271 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
272 //\r
273 // Add End Opcode for Subtitle\r
274 //\r
275 CreateEndOpCode (&UpdateData[Index]);\r
276\r
277 IfrLibUpdateForm (\r
278 HiiHandle,\r
279 &mDeviceManagerGuid,\r
280 DEVICE_MANAGER_FORM_ID,\r
281 mDeviceManagerMenuItemTable[Index].Class,\r
282 FALSE,\r
283 &UpdateData[Index]\r
284 );\r
285 }\r
286\r
5c08e117 287 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
288 Status = gFormBrowser2->SendForm (\r
289 gFormBrowser2,\r
290 &HiiHandle,\r
291 1,\r
292 NULL,\r
293 0,\r
294 NULL,\r
295 &ActionRequest\r
296 );\r
297 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
298 EnableResetRequired ();\r
299 }\r
300\r
301 //\r
302 // We will have returned from processing a callback - user either hit ESC to exit, or selected\r
303 // a target to display\r
304 //\r
305 if (gCallbackKey != 0) {\r
306 ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
307 Status = gFormBrowser2->SendForm (\r
308 gFormBrowser2,\r
309 &HiiHandles[gCallbackKey - DEVICE_KEY_OFFSET],\r
310 1,\r
311 NULL,\r
312 0,\r
313 NULL,\r
314 &ActionRequest\r
315 );\r
316\r
317 if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
318 EnableResetRequired ();\r
319 }\r
320\r
321 //\r
322 // Force return to Device Manager\r
323 //\r
324 gCallbackKey = FRONT_PAGE_KEY_DEVICE_MANAGER;\r
325 }\r
326\r
327 //\r
328 // Cleanup dynamic created strings in HII database by reinstall the packagelist\r
329 //\r
330 gHiiDatabase->RemovePackageList (gHiiDatabase, HiiHandle);\r
331 PackageList = HiiLibPreparePackageList (2, &mDeviceManagerGuid, DeviceManagerVfrBin, BdsDxeStrings);\r
332 ASSERT (PackageList != NULL);\r
333 Status = gHiiDatabase->NewPackageList (\r
334 gHiiDatabase,\r
335 PackageList,\r
336 gDeviceManagerPrivate.DriverHandle,\r
337 &gDeviceManagerPrivate.HiiHandle\r
338 );\r
339 FreePool (PackageList);\r
340\r
341 for (Index = 0; Index < MENU_ITEM_NUM; Index++) {\r
342 FreePool (UpdateData[Index].Data);\r
343 }\r
344 FreePool (HiiHandles);\r
345\r
346 return Status;\r
347}\r