]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDriver.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Universal / Disk / RamDiskDxe / RamDiskDriver.c
CommitLineData
20752cb8
HW
1/** @file\r
2 The driver entry point for RamDiskDxe driver.\r
3\r
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
9c463f6f 5 Copyright (c) Microsoft Corporation.<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
12//\r
13// Handle for the EFI_RAM_DISK_PROTOCOL instance\r
14//\r
15EFI_HANDLE mRamDiskHandle = NULL;\r
16\r
17//\r
18// The EFI_RAM_DISK_PROTOCOL instances that is installed onto the driver\r
19// handle\r
20//\r
21EFI_RAM_DISK_PROTOCOL mRamDiskProtocol = {\r
22 RamDiskRegister,\r
23 RamDiskUnregister\r
24};\r
25\r
26//\r
27// RamDiskDxe driver maintains a list of registered RAM disks.\r
28//\r
29LIST_ENTRY RegisteredRamDisks;\r
20752cb8 30\r
07a3fecd
HW
31//\r
32// Pointers to the EFI_ACPI_TABLE_PROTOCOL and EFI_ACPI_SDT_PROTOCOL.\r
33//\r
34EFI_ACPI_TABLE_PROTOCOL *mAcpiTableProtocol = NULL;\r
35EFI_ACPI_SDT_PROTOCOL *mAcpiSdtProtocol = NULL;\r
36\r
07a3fecd
HW
37/**\r
38 Check whether EFI_ACPI_TABLE_PROTOCOL and EFI_ACPI_SDT_PROTOCOL are produced.\r
39 If both protocols are produced, publish all the reserved memory type RAM\r
40 disks to the NVDIMM Firmware Interface Table (NFIT).\r
41\r
42 @param[in] Event Event whose notification function is being invoked.\r
43 @param[in] Context The pointer to the notification function's context,\r
44 which is implementation-dependent.\r
45\r
46**/\r
47VOID\r
48EFIAPI\r
49RamDiskAcpiCheck (\r
1436aea4
MK
50 IN EFI_EVENT Event,\r
51 IN VOID *Context\r
07a3fecd
HW
52 )\r
53{\r
1436aea4
MK
54 EFI_STATUS Status;\r
55 LIST_ENTRY *Entry;\r
56 RAM_DISK_PRIVATE_DATA *PrivateData;\r
07a3fecd
HW
57\r
58 gBS->CloseEvent (Event);\r
59\r
60 //\r
61 // Locate the EFI_ACPI_TABLE_PROTOCOL.\r
62 //\r
63 Status = gBS->LocateProtocol (\r
64 &gEfiAcpiTableProtocolGuid,\r
65 NULL,\r
66 (VOID **)&mAcpiTableProtocol\r
67 );\r
68 if (EFI_ERROR (Status)) {\r
69 DEBUG ((\r
87000d77 70 DEBUG_INFO,\r
76874be3 71 "RamDiskAcpiCheck: Cannot locate the EFI ACPI Table Protocol, "\r
07a3fecd
HW
72 "unable to publish RAM disks to NFIT.\n"\r
73 ));\r
74 return;\r
75 }\r
76\r
77 //\r
78 // Locate the EFI_ACPI_SDT_PROTOCOL.\r
79 //\r
80 Status = gBS->LocateProtocol (\r
81 &gEfiAcpiSdtProtocolGuid,\r
82 NULL,\r
83 (VOID **)&mAcpiSdtProtocol\r
84 );\r
85 if (EFI_ERROR (Status)) {\r
86 DEBUG ((\r
87000d77 87 DEBUG_INFO,\r
76874be3 88 "RamDiskAcpiCheck: Cannot locate the EFI ACPI Sdt Protocol, "\r
07a3fecd
HW
89 "unable to publish RAM disks to NFIT.\n"\r
90 ));\r
91 mAcpiTableProtocol = NULL;\r
92 return;\r
93 }\r
94\r
9c463f6f 95 BASE_LIST_FOR_EACH (Entry, &RegisteredRamDisks) {\r
07a3fecd
HW
96 PrivateData = RAM_DISK_PRIVATE_FROM_THIS (Entry);\r
97 RamDiskPublishNfit (PrivateData);\r
98 }\r
99}\r
100\r
20752cb8
HW
101/**\r
102 The entry point for RamDiskDxe driver.\r
103\r
104 @param[in] ImageHandle The image handle of the driver.\r
105 @param[in] SystemTable The system table.\r
106\r
107 @retval EFI_ALREADY_STARTED The driver already exists in system.\r
108 @retval EFI_OUT_OF_RESOURCES Fail to execute entry point due to lack of\r
109 resources.\r
110 @retval EFI_SUCCES All the related protocols are installed on\r
111 the driver.\r
112\r
113**/\r
114EFI_STATUS\r
115EFIAPI\r
116RamDiskDxeEntryPoint (\r
1436aea4
MK
117 IN EFI_HANDLE ImageHandle,\r
118 IN EFI_SYSTEM_TABLE *SystemTable\r
20752cb8
HW
119 )\r
120{\r
1436aea4
MK
121 EFI_STATUS Status;\r
122 RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivate;\r
123 VOID *DummyInterface;\r
124 EFI_EVENT Event;\r
20752cb8
HW
125\r
126 //\r
127 // If already started, return.\r
128 //\r
129 Status = gBS->LocateProtocol (\r
130 &gEfiRamDiskProtocolGuid,\r
131 NULL,\r
132 &DummyInterface\r
133 );\r
134 if (!EFI_ERROR (Status)) {\r
87000d77 135 DEBUG ((DEBUG_INFO, "Driver already started!\n"));\r
20752cb8
HW
136 return EFI_ALREADY_STARTED;\r
137 }\r
138\r
139 //\r
140 // Create a private data structure.\r
141 //\r
142 ConfigPrivate = AllocateCopyPool (sizeof (RAM_DISK_CONFIG_PRIVATE_DATA), &mRamDiskConfigPrivateDataTemplate);\r
143 if (ConfigPrivate == NULL) {\r
144 return EFI_OUT_OF_RESOURCES;\r
145 }\r
146\r
147 //\r
148 // Install RAM disk configuration form\r
149 //\r
150 Status = InstallRamDiskConfigForm (ConfigPrivate);\r
151 if (EFI_ERROR (Status)) {\r
152 goto ErrorExit;\r
153 }\r
154\r
d0b6596b
TH
155 //\r
156 // Initialize the list of registered RAM disks maintained by the driver\r
157 // before installing the protocol\r
158 //\r
159 InitializeListHead (&RegisteredRamDisks);\r
160\r
20752cb8
HW
161 //\r
162 // Install the EFI_RAM_DISK_PROTOCOL and RAM disk private data onto a\r
163 // new handle\r
164 //\r
165 Status = gBS->InstallMultipleProtocolInterfaces (\r
166 &mRamDiskHandle,\r
167 &gEfiRamDiskProtocolGuid,\r
168 &mRamDiskProtocol,\r
169 &gEfiCallerIdGuid,\r
170 ConfigPrivate,\r
171 NULL\r
172 );\r
173 if (EFI_ERROR (Status)) {\r
174 goto ErrorExit;\r
175 }\r
176\r
07a3fecd
HW
177 Status = EfiCreateEventReadyToBootEx (\r
178 TPL_CALLBACK,\r
179 RamDiskAcpiCheck,\r
180 NULL,\r
181 &Event\r
182 );\r
183 ASSERT_EFI_ERROR (Status);\r
184\r
20752cb8
HW
185 return EFI_SUCCESS;\r
186\r
187ErrorExit:\r
188 if (ConfigPrivate != NULL) {\r
189 UninstallRamDiskConfigForm (ConfigPrivate);\r
190 }\r
191\r
192 return Status;\r
193}\r
194\r
20752cb8
HW
195/**\r
196 Unload the RamDiskDxe driver and its configuration form.\r
197\r
198 @param[in] ImageHandle The driver's image handle.\r
199\r
200 @retval EFI_SUCCESS The RamDiskDxe driver and its configuration\r
201 form is unloaded.\r
202 @retval Others Failed to unload the form.\r
203\r
204**/\r
205EFI_STATUS\r
206EFIAPI\r
207RamDiskDxeUnload (\r
1436aea4 208 IN EFI_HANDLE ImageHandle\r
20752cb8
HW
209 )\r
210{\r
1436aea4
MK
211 EFI_STATUS Status;\r
212 RAM_DISK_CONFIG_PRIVATE_DATA *ConfigPrivate;\r
20752cb8
HW
213\r
214 Status = gBS->HandleProtocol (\r
215 mRamDiskHandle,\r
216 &gEfiCallerIdGuid,\r
1436aea4 217 (VOID **)&ConfigPrivate\r
20752cb8
HW
218 );\r
219 if (EFI_ERROR (Status)) {\r
220 return Status;\r
221 }\r
222\r
223 ASSERT (ConfigPrivate->Signature == RAM_DISK_CONFIG_PRIVATE_DATA_SIGNATURE);\r
224\r
225 //\r
226 // Unregister all registered RAM disks\r
227 //\r
228 UnregisterAllRamDisks ();\r
229\r
230 gBS->UninstallMultipleProtocolInterfaces (\r
231 mRamDiskHandle,\r
232 &gEfiRamDiskProtocolGuid,\r
233 &mRamDiskProtocol,\r
234 &gEfiCallerIdGuid,\r
235 ConfigPrivate,\r
236 NULL\r
237 );\r
238\r
239 UninstallRamDiskConfigForm (ConfigPrivate);\r
240\r
241 return EFI_SUCCESS;\r
242}\r