]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskImpl.c
MdeModulePkg/UfsPassThruDxe: Use BaseLib linked list iteration macros
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / RamDiskDxe / RamDiskImpl.c
CommitLineData
20752cb8
HW
1/** @file\r
2 HII Config Access protocol implementation of RamDiskDxe driver.\r
3\r
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
124b18cf 5 (C) Copyright 2016-2018 Hewlett Packard Enterprise Development LP<BR>\r
9d510e61 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
20752cb8
HW
7\r
8**/\r
9\r
10#include "RamDiskImpl.h"\r
11\r
12CHAR16 mRamDiskStorageName[] = L"RAM_DISK_CONFIGURATION";\r
13\r
14RAM_DISK_CONFIG_PRIVATE_DATA mRamDiskConfigPrivateDataTemplate = {\r
15 RAM_DISK_CONFIG_PRIVATE_DATA_SIGNATURE,\r
5cf8a917 16 {\r
4b1f4646
TS
17 EFI_PAGE_SIZE,\r
18 RAM_DISK_BOOT_SERVICE_DATA_MEMORY\r
5cf8a917 19 },\r
20752cb8
HW
20 {\r
21 RamDiskExtractConfig,\r
22 RamDiskRouteConfig,\r
23 RamDiskCallback\r
24 }\r
25};\r
26\r
27HII_VENDOR_DEVICE_PATH mRamDiskHiiVendorDevicePath = {\r
28 {\r
29 {\r
30 HARDWARE_DEVICE_PATH,\r
31 HW_VENDOR_DP,\r
32 {\r
33 (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
34 (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
35 }\r
36 },\r
37 RAM_DISK_FORM_SET_GUID\r
38 },\r
39 {\r
40 END_DEVICE_PATH_TYPE,\r
41 END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
42 {\r
43 (UINT8) (END_DEVICE_PATH_LENGTH),\r
44 (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
45 }\r
46 }\r
47};\r
48\r
49\r
50/**\r
51 This function publish the RAM disk configuration Form.\r
52\r
53 @param[in, out] ConfigPrivateData\r
54 Points to RAM disk configuration private data.\r
55\r
56 @retval EFI_SUCCESS HII Form is installed successfully.\r
57 @retval EFI_OUT_OF_RESOURCES Not enough resource for HII Form installation.\r
58 @retval Others Other errors as indicated.\r
59\r
60**/\r
61EFI_STATUS\r
62InstallRamDiskConfigForm (\r
63 IN OUT RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivateData\r
64 )\r
65{\r
66 EFI_STATUS Status;\r
67 EFI_HII_HANDLE HiiHandle;\r
68 EFI_HANDLE DriverHandle;\r
69 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
70\r
71 DriverHandle = NULL;\r
72 ConfigAccess = &ConfigPrivateData->ConfigAccess;\r
73 Status = gBS->InstallMultipleProtocolInterfaces (\r
74 &DriverHandle,\r
75 &gEfiDevicePathProtocolGuid,\r
76 &mRamDiskHiiVendorDevicePath,\r
77 &gEfiHiiConfigAccessProtocolGuid,\r
78 ConfigAccess,\r
79 NULL\r
80 );\r
81 if (EFI_ERROR (Status)) {\r
82 return Status;\r
83 }\r
84\r
85 ConfigPrivateData->DriverHandle = DriverHandle;\r
86\r
87 //\r
88 // Publish the HII package list\r
89 //\r
90 HiiHandle = HiiAddPackages (\r
91 &gRamDiskFormSetGuid,\r
92 DriverHandle,\r
93 RamDiskDxeStrings,\r
94 RamDiskHiiBin,\r
95 NULL\r
96 );\r
97 if (HiiHandle == NULL) {\r
98 gBS->UninstallMultipleProtocolInterfaces (\r
99 DriverHandle,\r
100 &gEfiDevicePathProtocolGuid,\r
101 &mRamDiskHiiVendorDevicePath,\r
102 &gEfiHiiConfigAccessProtocolGuid,\r
103 ConfigAccess,\r
104 NULL\r
105 );\r
106 return EFI_OUT_OF_RESOURCES;\r
107 }\r
108\r
109 ConfigPrivateData->HiiHandle = HiiHandle;\r
110\r
111 return EFI_SUCCESS;\r
112}\r
113\r
114\r
115/**\r
116 This function removes RAM disk configuration Form.\r
117\r
118 @param[in, out] ConfigPrivateData\r
119 Points to RAM disk configuration private data.\r
120\r
121**/\r
122VOID\r
123UninstallRamDiskConfigForm (\r
124 IN OUT RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivateData\r
125 )\r
126{\r
127 //\r
128 // Uninstall HII package list\r
129 //\r
130 if (ConfigPrivateData->HiiHandle != NULL) {\r
131 HiiRemovePackages (ConfigPrivateData->HiiHandle);\r
132 ConfigPrivateData->HiiHandle = NULL;\r
133 }\r
134\r
135 //\r
136 // Uninstall HII Config Access Protocol\r
137 //\r
138 if (ConfigPrivateData->DriverHandle != NULL) {\r
139 gBS->UninstallMultipleProtocolInterfaces (\r
140 ConfigPrivateData->DriverHandle,\r
141 &gEfiDevicePathProtocolGuid,\r
142 &mRamDiskHiiVendorDevicePath,\r
143 &gEfiHiiConfigAccessProtocolGuid,\r
144 &ConfigPrivateData->ConfigAccess,\r
145 NULL\r
146 );\r
147 ConfigPrivateData->DriverHandle = NULL;\r
148 }\r
149\r
150 FreePool (ConfigPrivateData);\r
151}\r
152\r
153\r
154/**\r
155 Unregister all registered RAM disks.\r
156\r
157**/\r
158VOID\r
159UnregisterAllRamDisks (\r
160 VOID\r
161 )\r
162{\r
163 LIST_ENTRY *Entry;\r
164 LIST_ENTRY *NextEntry;\r
165 RAM_DISK_PRIVATE_DATA *PrivateData;\r
166\r
167 if (!IsListEmpty(&RegisteredRamDisks)) {\r
168 EFI_LIST_FOR_EACH_SAFE (Entry, NextEntry, &RegisteredRamDisks) {\r
169 PrivateData = RAM_DISK_PRIVATE_FROM_THIS (Entry);\r
170\r
171 gBS->UninstallMultipleProtocolInterfaces (\r
172 PrivateData->Handle,\r
173 &gEfiBlockIoProtocolGuid,\r
174 &PrivateData->BlockIo,\r
216fefa3
HW
175 &gEfiBlockIo2ProtocolGuid,\r
176 &PrivateData->BlockIo2,\r
20752cb8
HW
177 &gEfiDevicePathProtocolGuid,\r
178 (EFI_DEVICE_PATH_PROTOCOL *) PrivateData->DevicePath,\r
179 NULL\r
180 );\r
181\r
182 RemoveEntryList (&PrivateData->ThisInstance);\r
183\r
184 if (RamDiskCreateHii == PrivateData->CreateMethod) {\r
185 //\r
186 // If a RAM disk is created within HII, then the RamDiskDxe driver\r
187 // driver is responsible for freeing the allocated memory for the\r
188 // RAM disk.\r
189 //\r
190 FreePool ((VOID *)(UINTN) PrivateData->StartingAddr);\r
191 }\r
192\r
20752cb8
HW
193 FreePool (PrivateData->DevicePath);\r
194 FreePool (PrivateData);\r
20752cb8
HW
195 }\r
196 }\r
197}\r
198\r
199\r
200/**\r
201 This function allows a caller to extract the current configuration for one\r
202 or more named elements from the target driver.\r
203\r
204 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
205 @param[in] Request A null-terminated Unicode string in\r
206 <ConfigRequest> format.\r
207 @param[out] Progress On return, points to a character in the Request\r
208 string. Points to the string's null terminator if\r
209 request was successful. Points to the most recent\r
210 '&' before the first failing name/value pair (or\r
211 the beginning of the string if the failure is in\r
212 the first name/value pair) if the request was not\r
213 successful.\r
214 @param[out] Results A null-terminated Unicode string in\r
215 <ConfigAltResp> format which has all values filled\r
216 in for the names in the Request string. String to\r
217 be allocated by the called function.\r
218\r
219 @retval EFI_SUCCESS The Results is filled with the requested\r
220 values.\r
221 @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results.\r
222 @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name.\r
223 @retval EFI_NOT_FOUND Routing data doesn't match any storage in\r
224 this driver.\r
225\r
226**/\r
227EFI_STATUS\r
228EFIAPI\r
229RamDiskExtractConfig (\r
230 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
231 IN CONST EFI_STRING Request,\r
232 OUT EFI_STRING *Progress,\r
233 OUT EFI_STRING *Results\r
234 )\r
235{\r
20752cb8
HW
236 if (Progress == NULL || Results == NULL) {\r
237 return EFI_INVALID_PARAMETER;\r
238 }\r
20752cb8 239 *Progress = Request;\r
5cf8a917 240 return EFI_NOT_FOUND;\r
20752cb8
HW
241}\r
242\r
243\r
244/**\r
245 This function processes the results of changes in configuration.\r
246\r
247 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
248 @param[in] Configuration A null-terminated Unicode string in <ConfigResp>\r
249 format.\r
250 @param[out] Progress A pointer to a string filled in with the offset of\r
251 the most recent '&' before the first failing\r
252 name/value pair (or the beginning of the string if\r
253 the failure is in the first name/value pair) or\r
254 the terminating NULL if all was successful.\r
255\r
256 @retval EFI_SUCCESS The Results is processed successfully.\r
257 @retval EFI_INVALID_PARAMETER Configuration is NULL.\r
258 @retval EFI_NOT_FOUND Routing data doesn't match any storage in\r
259 this driver.\r
260\r
261**/\r
262EFI_STATUS\r
263EFIAPI\r
264RamDiskRouteConfig (\r
265 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
266 IN CONST EFI_STRING Configuration,\r
267 OUT EFI_STRING *Progress\r
268 )\r
269{\r
270 if (Configuration == NULL || Progress == NULL) {\r
271 return EFI_INVALID_PARAMETER;\r
272 }\r
273\r
124b18cf
TP
274 *Progress = Configuration;\r
275\r
5cf8a917 276 return EFI_NOT_FOUND;\r
20752cb8
HW
277}\r
278\r
279\r
280/**\r
281 Allocate memory and register the RAM disk created within RamDiskDxe\r
282 driver HII.\r
283\r
284 @param[in] Size If creating raw, size of the RAM disk to create.\r
285 If creating from file, zero.\r
286 @param[in] FileHandle If creating raw, NULL. If creating from file, the\r
287 file handle.\r
4b1f4646 288 @param[in] MemoryType Type of memory to be used to create RAM Disk.\r
20752cb8
HW
289\r
290 @retval EFI_SUCCESS RAM disk is created and registered.\r
291 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to match the\r
292 size required.\r
293\r
294**/\r
295EFI_STATUS\r
296HiiCreateRamDisk (\r
297 IN UINT64 Size,\r
4b1f4646
TS
298 IN EFI_FILE_HANDLE FileHandle,\r
299 IN UINT8 MemoryType\r
20752cb8
HW
300 )\r
301{\r
302 EFI_STATUS Status;\r
303 UINTN BufferSize;\r
4b1f4646 304 UINT64 *StartingAddr;\r
20752cb8
HW
305 EFI_INPUT_KEY Key;\r
306 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
307 RAM_DISK_PRIVATE_DATA *PrivateData;\r
308 EFI_FILE_INFO *FileInformation;\r
309\r
310 FileInformation = NULL;\r
4b1f4646 311 StartingAddr = NULL;\r
20752cb8
HW
312\r
313 if (FileHandle != NULL) {\r
314 //\r
315 // Create from file.\r
316 //\r
317 FileInformation = FileInfo (FileHandle);\r
318 if (NULL == FileInformation) {\r
319 do {\r
320 CreatePopUp (\r
321 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
322 &Key,\r
323 L"",\r
324 L"Not enough memory to get the file information!",\r
325 L"Press ENTER to continue ...",\r
326 L"",\r
327 NULL\r
328 );\r
329 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
330\r
331 return EFI_OUT_OF_RESOURCES;\r
332 }\r
333\r
334 //\r
335 // Update the size of RAM disk according to the file size.\r
336 //\r
337 Size = FileInformation->FileSize;\r
338 }\r
339\r
5cf8a917
HW
340 if (Size > (UINTN) -1) {\r
341 do {\r
342 CreatePopUp (\r
343 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
344 &Key,\r
345 L"",\r
346 L"The given RAM disk size is too large!",\r
347 L"Press ENTER to continue ...",\r
348 L"",\r
349 NULL\r
350 );\r
351 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
352\r
353 return EFI_OUT_OF_RESOURCES;\r
354 }\r
355\r
4b1f4646
TS
356 if (MemoryType == RAM_DISK_BOOT_SERVICE_DATA_MEMORY) {\r
357 Status = gBS->AllocatePool (\r
358 EfiBootServicesData,\r
359 (UINTN)Size,\r
360 (VOID**)&StartingAddr\r
361 );\r
362 } else if (MemoryType == RAM_DISK_RESERVED_MEMORY) {\r
363 Status = gBS->AllocatePool (\r
364 EfiReservedMemoryType,\r
365 (UINTN)Size,\r
366 (VOID**)&StartingAddr\r
367 );\r
368 } else {\r
369 Status = EFI_INVALID_PARAMETER;\r
370 }\r
371\r
372 if ((StartingAddr == NULL) || EFI_ERROR(Status)) {\r
20752cb8
HW
373 do {\r
374 CreatePopUp (\r
375 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
376 &Key,\r
377 L"",\r
378 L"Not enough memory to create the RAM disk!",\r
379 L"Press ENTER to continue ...",\r
380 L"",\r
381 NULL\r
382 );\r
383 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
384\r
385 return EFI_OUT_OF_RESOURCES;\r
386 }\r
387\r
388 if (FileHandle != NULL) {\r
389 //\r
390 // Copy the file content to the RAM disk.\r
391 //\r
392 BufferSize = (UINTN) Size;\r
393 FileHandle->Read (\r
394 FileHandle,\r
395 &BufferSize,\r
396 (VOID *)(UINTN) StartingAddr\r
397 );\r
398 if (BufferSize != FileInformation->FileSize) {\r
399 do {\r
400 CreatePopUp (\r
401 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
402 &Key,\r
403 L"",\r
404 L"File content read error!",\r
405 L"Press ENTER to continue ...",\r
406 L"",\r
407 NULL\r
408 );\r
409 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
410\r
411 return EFI_DEVICE_ERROR;\r
412 }\r
413 }\r
414\r
415 //\r
416 // Register the newly created RAM disk.\r
417 //\r
418 Status = RamDiskRegister (\r
4b1f4646 419 ((UINT64)(UINTN) StartingAddr),\r
20752cb8
HW
420 Size,\r
421 &gEfiVirtualDiskGuid,\r
422 NULL,\r
423 &DevicePath\r
424 );\r
425 if (EFI_ERROR (Status)) {\r
426 do {\r
427 CreatePopUp (\r
428 EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
429 &Key,\r
430 L"",\r
431 L"Fail to register the newly created RAM disk!",\r
432 L"Press ENTER to continue ...",\r
433 L"",\r
434 NULL\r
435 );\r
436 } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
437\r
438 return Status;\r
439 }\r
440\r
441 //\r
442 // If RAM disk is created within HII, memory should be freed when the\r
443 // RAM disk is unregisterd.\r
444 //\r
445 PrivateData = RAM_DISK_PRIVATE_FROM_THIS (RegisteredRamDisks.BackLink);\r
446 PrivateData->CreateMethod = RamDiskCreateHii;\r
447\r
448 return EFI_SUCCESS;\r
449}\r
450\r
451\r
452/**\r
453 This function updates the registered RAM disks list on the main form.\r
454\r
455 @param[in, out] ConfigPrivate\r
456 Private data for configurating hii data for RAM\r
457 disks.\r
458\r
459**/\r
460VOID\r
461UpdateMainForm (\r
462 IN OUT RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivate\r
463 )\r
464{\r
465 VOID *StartOpCodeHandle;\r
466 VOID *EndOpCodeHandle;\r
467 EFI_IFR_GUID_LABEL *StartLabel;\r
468 EFI_IFR_GUID_LABEL *EndLabel;\r
469 LIST_ENTRY *Entry;\r
470 UINTN Index;\r
471 RAM_DISK_PRIVATE_DATA *PrivateData;\r
472 CHAR16 *String;\r
473 CHAR16 RamDiskStr[128];\r
474 EFI_STRING_ID StringId;\r
20752cb8
HW
475\r
476 //\r
477 // Init OpCode Handle\r
478 //\r
479 StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
480 ASSERT (StartOpCodeHandle != NULL);\r
481\r
482 EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
483 ASSERT (EndOpCodeHandle != NULL);\r
484\r
485 //\r
486 // Create Hii Extend Label OpCode as the start opcode\r
487 //\r
488 StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
489 StartOpCodeHandle,\r
490 &gEfiIfrTianoGuid,\r
491 NULL,\r
492 sizeof (EFI_IFR_GUID_LABEL)\r
493 );\r
494 StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
495 StartLabel->Number = MAIN_LABEL_LIST_START;\r
496\r
497 //\r
498 // Create Hii Extend Label OpCode as the end opcode\r
499 //\r
500 EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (\r
501 EndOpCodeHandle,\r
502 &gEfiIfrTianoGuid,\r
503 NULL,\r
504 sizeof (EFI_IFR_GUID_LABEL)\r
505 );\r
506 EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
507 EndLabel->Number = MAIN_LABEL_LIST_END;\r
508\r
509 Index = 0;\r
20752cb8 510 EFI_LIST_FOR_EACH (Entry, &RegisteredRamDisks) {\r
09abc636
HW
511 PrivateData = RAM_DISK_PRIVATE_FROM_THIS (Entry);\r
512 PrivateData->CheckBoxId = (EFI_QUESTION_ID)\r
513 (MAIN_CHECKBOX_QUESTION_ID_START + Index);\r
514 //\r
515 // CheckBox is unchecked by default.\r
516 //\r
517 PrivateData->CheckBoxChecked = FALSE;\r
518 String = RamDiskStr;\r
20752cb8
HW
519\r
520 UnicodeSPrint (\r
521 String,\r
522 sizeof (RamDiskStr),\r
523 L" RAM Disk %d: [0x%lx, 0x%lx]\n",\r
524 Index,\r
525 PrivateData->StartingAddr,\r
5eae4ff0 526 PrivateData->StartingAddr + PrivateData->Size - 1\r
20752cb8
HW
527 );\r
528\r
529 StringId = HiiSetString (ConfigPrivate->HiiHandle, 0, RamDiskStr, NULL);\r
530 ASSERT (StringId != 0);\r
531\r
532 HiiCreateCheckBoxOpCode (\r
533 StartOpCodeHandle,\r
09abc636
HW
534 PrivateData->CheckBoxId,\r
535 0,\r
536 0,\r
20752cb8
HW
537 StringId,\r
538 STRING_TOKEN (STR_RAM_DISK_LIST_HELP),\r
09abc636 539 EFI_IFR_FLAG_CALLBACK,\r
20752cb8
HW
540 0,\r
541 NULL\r
542 );\r
543\r
544 Index++;\r
545 }\r
20752cb8
HW
546\r
547 HiiUpdateForm (\r
548 ConfigPrivate->HiiHandle,\r
549 &gRamDiskFormSetGuid,\r
550 MAIN_FORM_ID,\r
551 StartOpCodeHandle,\r
552 EndOpCodeHandle\r
553 );\r
554\r
555 HiiFreeOpCodeHandle (StartOpCodeHandle);\r
556 HiiFreeOpCodeHandle (EndOpCodeHandle);\r
557}\r
558\r
559\r
560/**\r
561 This function processes the results of changes in configuration.\r
562\r
563 @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
564 @param[in] Action Specifies the type of action taken by the browser.\r
565 @param[in] QuestionId A unique value which is sent to the original\r
566 exporting driver so that it can identify the type\r
567 of data to expect.\r
568 @param[in] Type The type of value for the question.\r
569 @param[in] Value A pointer to the data being sent to the original\r
570 exporting driver.\r
571 @param[out] ActionRequest On return, points to the action requested by the\r
572 callback function.\r
573\r
574 @retval EFI_SUCCESS The callback successfully handled the action.\r
575 @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the\r
576 variable and its data.\r
577 @retval EFI_DEVICE_ERROR The variable could not be saved.\r
578 @retval EFI_UNSUPPORTED The specified Action is not supported by the\r
579 callback.\r
580\r
581**/\r
582EFI_STATUS\r
583EFIAPI\r
584RamDiskCallback (\r
585 IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,\r
586 IN EFI_BROWSER_ACTION Action,\r
587 IN EFI_QUESTION_ID QuestionId,\r
588 IN UINT8 Type,\r
589 IN EFI_IFR_TYPE_VALUE *Value,\r
590 OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest\r
591 )\r
592{\r
593 EFI_STATUS Status;\r
20752cb8
HW
594 RAM_DISK_PRIVATE_DATA *PrivateData;\r
595 RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivate;\r
20752cb8
HW
596 EFI_DEVICE_PATH_PROTOCOL *FileDevPath;\r
597 EFI_FILE_HANDLE FileHandle;\r
598 LIST_ENTRY *Entry;\r
599 LIST_ENTRY *NextEntry;\r
20752cb8
HW
600\r
601 if ((This == NULL) || (Value == NULL) || (ActionRequest == NULL)) {\r
602 return EFI_INVALID_PARAMETER;\r
603 }\r
604\r
5cf8a917
HW
605 ConfigPrivate = RAM_DISK_CONFIG_PRIVATE_FROM_THIS (This);\r
606\r
20752cb8
HW
607 if (Action == EFI_BROWSER_ACTION_RETRIEVE) {\r
608 Status = EFI_UNSUPPORTED;\r
609 if (QuestionId == CREATE_RAW_SIZE_QUESTION_ID) {\r
610 Value->u64 = EFI_PAGE_SIZE;\r
5cf8a917 611 ConfigPrivate->ConfigStore.Size = EFI_PAGE_SIZE;\r
20752cb8 612 Status = EFI_SUCCESS;\r
4b1f4646
TS
613 } else if (QuestionId == CREATE_RAW_MEMORY_TYPE_QUESTION_ID) {\r
614 Value->u8 = RAM_DISK_BOOT_SERVICE_DATA_MEMORY;\r
615 ConfigPrivate->ConfigStore.MemType = RAM_DISK_BOOT_SERVICE_DATA_MEMORY;\r
616 Status = EFI_SUCCESS;\r
20752cb8
HW
617 }\r
618 return Status;\r
619 }\r
620\r
621 if ((Action != EFI_BROWSER_ACTION_CHANGED) &&\r
622 (Action != EFI_BROWSER_ACTION_CHANGING) &&\r
623 (Action != EFI_BROWSER_ACTION_FORM_OPEN)) {\r
624 return EFI_UNSUPPORTED;\r
625 }\r
626\r
20752cb8
HW
627 //\r
628 // Update the RAM disk list show at the main form first.\r
629 //\r
630 if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
631 Status = EFI_UNSUPPORTED;\r
632 if (QuestionId == MAIN_GOTO_FILE_EXPLORER_ID) {\r
633 UpdateMainForm (ConfigPrivate);\r
634 Status = EFI_SUCCESS;\r
635 }\r
636 return Status;\r
637 }\r
638\r
20752cb8
HW
639 Status = EFI_SUCCESS;\r
640\r
20752cb8
HW
641 if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
642 switch (QuestionId) {\r
643 case MAIN_GOTO_FILE_EXPLORER_ID:\r
644 Status = ChooseFile (NULL, NULL, NULL, &FileDevPath);\r
645 if (EFI_ERROR (Status)) {\r
646 break;\r
647 }\r
648\r
649 if (FileDevPath != NULL) {\r
650 //\r
651 // Open the file.\r
652 //\r
5b080845 653 Status = EfiOpenFileByDevicePath (\r
20752cb8
HW
654 &FileDevPath,\r
655 &FileHandle,\r
656 EFI_FILE_MODE_READ,\r
657 0\r
658 );\r
659 if (EFI_ERROR (Status)) {\r
660 break;\r
661 }\r
662\r
663 //\r
664 // Create from file, RAM disk size is zero. It will be updated\r
665 // according to the file size.\r
666 //\r
4b1f4646
TS
667 Status = HiiCreateRamDisk (\r
668 0,\r
669 FileHandle,\r
670 ConfigPrivate->ConfigStore.MemType\r
671 );\r
20752cb8
HW
672 if (EFI_ERROR (Status)) {\r
673 break;\r
674 }\r
675\r
676 //\r
677 // Refresh the registered RAM disks list.\r
678 //\r
679 UpdateMainForm (ConfigPrivate);\r
680 }\r
20752cb8
HW
681 break;\r
682\r
683 default:\r
684 break;\r
685 }\r
686 } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
687 switch (QuestionId) {\r
688 case MAIN_REMOVE_RD_QUESTION_ID:\r
689 //\r
690 // Remove the selected RAM disks\r
691 //\r
20752cb8 692 EFI_LIST_FOR_EACH_SAFE (Entry, NextEntry, &RegisteredRamDisks) {\r
09abc636
HW
693 PrivateData = RAM_DISK_PRIVATE_FROM_THIS (Entry);\r
694 if (PrivateData->CheckBoxChecked) {\r
20752cb8
HW
695 RamDiskUnregister (\r
696 (EFI_DEVICE_PATH_PROTOCOL *) PrivateData->DevicePath\r
697 );\r
698 }\r
699 }\r
20752cb8
HW
700\r
701 UpdateMainForm (ConfigPrivate);\r
702\r
703 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;\r
20752cb8
HW
704 break;\r
705\r
5cf8a917
HW
706 case CREATE_RAW_SIZE_QUESTION_ID:\r
707 ConfigPrivate->ConfigStore.Size = Value->u64;\r
708 break;\r
709\r
4b1f4646
TS
710 case CREATE_RAW_MEMORY_TYPE_QUESTION_ID:\r
711 ConfigPrivate->ConfigStore.MemType = Value->u8;\r
712 break;\r
713\r
20752cb8
HW
714 case CREATE_RAW_SUBMIT_QUESTION_ID:\r
715 //\r
716 // Create raw, FileHandle is NULL.\r
717 //\r
4b1f4646
TS
718 Status = HiiCreateRamDisk (\r
719 ConfigPrivate->ConfigStore.Size,\r
720 NULL,\r
721 ConfigPrivate->ConfigStore.MemType\r
722 );\r
20752cb8
HW
723 if (EFI_ERROR (Status)) {\r
724 break;\r
725 }\r
726\r
727 //\r
728 // Refresh the registered RAM disks list.\r
729 //\r
730 UpdateMainForm (ConfigPrivate);\r
731\r
732 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
733 break;\r
734\r
735 case CREATE_RAW_DISCARD_QUESTION_ID:\r
736 *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
737 break;\r
738\r
739 default:\r
09abc636
HW
740 //\r
741 // QuestionIds for checkboxes\r
742 //\r
743 if ((QuestionId >= MAIN_CHECKBOX_QUESTION_ID_START) &&\r
744 (QuestionId < CREATE_RAW_RAM_DISK_FORM_ID)) {\r
745 EFI_LIST_FOR_EACH (Entry, &RegisteredRamDisks) {\r
746 PrivateData = RAM_DISK_PRIVATE_FROM_THIS (Entry);\r
747 if (PrivateData->CheckBoxId == QuestionId) {\r
748 PrivateData->CheckBoxChecked = (BOOLEAN) (Value->u8 != 0);\r
749 }\r
750 }\r
751 }\r
20752cb8
HW
752 break;\r
753 }\r
754 }\r
755\r
20752cb8
HW
756 return EFI_SUCCESS;\r
757}\r