]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkSocPkg/QuarkSouthCluster/Sdio/Dxe/SDMediaDeviceDxe/SDMediaDevice.c
QuarkSocPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkSocPkg / QuarkSouthCluster / Sdio / Dxe / SDMediaDeviceDxe / SDMediaDevice.c
CommitLineData
9b6bbcdb
MK
1/** @file\r
2\r
3The definition for SD media device driver model and blkio protocol routines.\r
4\r
74c6a103 5Copyright (c) 2013-2016 Intel Corporation.\r
9b6bbcdb 6\r
c9f231d0 7SPDX-License-Identifier: BSD-2-Clause-Patent\r
9b6bbcdb
MK
8\r
9**/\r
10\r
11\r
12#include "SDMediaDevice.h"\r
13\r
14\r
15EFI_DRIVER_BINDING_PROTOCOL gSDMediaDeviceDriverBinding = {\r
16 SDMediaDeviceSupported,\r
17 SDMediaDeviceStart,\r
18 SDMediaDeviceStop,\r
19 0x20,\r
20 NULL,\r
21 NULL\r
22};\r
23\r
24/**\r
25 Entry point for EFI drivers.\r
26\r
27 @param ImageHandle EFI_HANDLE.\r
28 @param SystemTable EFI_SYSTEM_TABLE.\r
29\r
30 @retval EFI_SUCCESS Driver is successfully loaded.\r
31 @return Others Failed.\r
32\r
33**/\r
34EFI_STATUS\r
35EFIAPI\r
36InitializeSDMediaDevice (\r
37 IN EFI_HANDLE ImageHandle,\r
38 IN EFI_SYSTEM_TABLE *SystemTable\r
39 )\r
40{\r
41 return EfiLibInstallDriverBindingComponentName2 (\r
42 ImageHandle,\r
43 SystemTable,\r
44 &gSDMediaDeviceDriverBinding,\r
45 ImageHandle,\r
46 &gSDMediaDeviceName,\r
47 &gSDMediaDeviceName2\r
48 );\r
49}\r
50\r
51\r
52/**\r
53 Test to see if this driver supports ControllerHandle. Any\r
54 ControllerHandle that has BlockIoProtocol installed will be supported.\r
55\r
56 @param This Protocol instance pointer.\r
57 @param Controller Handle of device to test.\r
58 @param RemainingDevicePath Not used.\r
59\r
60 @return EFI_SUCCESS This driver supports this device.\r
61 @return EFI_UNSUPPORTED This driver does not support this device.\r
62\r
63**/\r
64EFI_STATUS\r
65EFIAPI\r
66SDMediaDeviceSupported (\r
67 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
68 IN EFI_HANDLE Controller,\r
69 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
70 )\r
71{\r
72 EFI_STATUS Status;\r
73 EFI_SD_HOST_IO_PROTOCOL *SDHostIo;\r
74\r
75 //\r
76 // Test whether there is PCI IO Protocol attached on the controller handle.\r
77 //\r
78 Status = gBS->OpenProtocol (\r
79 Controller,\r
80 &gEfiSDHostIoProtocolGuid,\r
81 (VOID **)&SDHostIo,\r
82 This->DriverBindingHandle,\r
83 Controller,\r
84 EFI_OPEN_PROTOCOL_BY_DRIVER\r
85 );\r
86 if (EFI_ERROR (Status)) {\r
87 goto Exit;\r
88 }\r
89\r
90 gBS->CloseProtocol (\r
91 Controller,\r
92 &gEfiSDHostIoProtocolGuid,\r
93 This->DriverBindingHandle,\r
94 Controller\r
95 );\r
96\r
97Exit:\r
98 return Status;\r
99}\r
100\r
101/**\r
102 Starting the SD Media Device Driver.\r
103\r
104 @param This Protocol instance pointer.\r
105 @param Controller Handle of device to test.\r
106 @param RemainingDevicePath Not used.\r
107\r
108 @retval EFI_SUCCESS This driver supports this device.\r
109 @retval EFI_UNSUPPORTED This driver does not support this device.\r
110 @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error.\r
111 EFI_OUT_OF_RESOURCES- Failed due to resource shortage.\r
112\r
113**/\r
114EFI_STATUS\r
115EFIAPI\r
116SDMediaDeviceStart (\r
117 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
118 IN EFI_HANDLE Controller,\r
119 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
120 )\r
121{\r
122 EFI_STATUS Status;\r
123 EFI_SD_HOST_IO_PROTOCOL *SDHostIo;\r
124 CARD_DATA *CardData;\r
125\r
126 CardData = NULL;\r
127\r
128 //\r
129 // Open PCI I/O Protocol and save pointer to open protocol\r
130 // in private data area.\r
131 //\r
132 Status = gBS->OpenProtocol (\r
133 Controller,\r
134 &gEfiSDHostIoProtocolGuid,\r
135 (VOID **) &SDHostIo,\r
136 This->DriverBindingHandle,\r
137 Controller,\r
138 EFI_OPEN_PROTOCOL_BY_DRIVER\r
139 );\r
140 if (EFI_ERROR (Status)) {\r
141 DEBUG ((EFI_D_ERROR, "SDMediaDeviceStart: Fail to open gEfiSDHostIoProtocolGuid \r\n"));\r
142 goto Exit;\r
143 }\r
144\r
145 Status = SDHostIo->DetectCardAndInitHost (SDHostIo);\r
146 if (EFI_ERROR (Status)) {\r
147 DEBUG ((EFI_D_INFO, "SDMediaDeviceStart: Fail to DetectCardAndInitHost \r\n"));\r
148 goto Exit;\r
149 }\r
150\r
151 CardData = (CARD_DATA*)AllocateZeroPool(sizeof (CARD_DATA));\r
152 if (CardData == NULL) {\r
153 Status = EFI_OUT_OF_RESOURCES;\r
154 DEBUG ((EFI_D_ERROR, "SDMediaDeviceStart: Fail to AllocateZeroPool(CARD_DATA) \r\n"));\r
155 goto Exit;\r
156 }\r
157\r
158 ASSERT (SDHostIo->HostCapability.BoundarySize >= 4 * 1024);\r
159 CardData->RawBufferPointer = (UINT8*)((UINTN)DMA_MEMORY_TOP);\r
160 Status = gBS->AllocatePages (\r
161 AllocateMaxAddress,\r
162 EfiBootServicesData,\r
163 EFI_SIZE_TO_PAGES (2 * SDHostIo->HostCapability.BoundarySize),\r
164 (EFI_PHYSICAL_ADDRESS *)(&CardData->RawBufferPointer)\r
165 );\r
166\r
167 if (CardData->RawBufferPointer == NULL) {\r
168 DEBUG ((EFI_D_ERROR, "SDMediaDeviceStart: Fail to AllocateZeroPool(2*x) \r\n"));\r
169 Status = EFI_OUT_OF_RESOURCES;\r
170 goto Exit;\r
171 }\r
172 CardData->AlignedBuffer = CardData->RawBufferPointer - ((UINTN)(CardData->RawBufferPointer) & (SDHostIo->HostCapability.BoundarySize - 1)) + SDHostIo->HostCapability.BoundarySize;\r
173\r
174 CardData->Signature = CARD_DATA_SIGNATURE;\r
175 CardData->SDHostIo = SDHostIo;\r
176\r
177 Status = MMCSDCardInit (CardData);\r
178 if (EFI_ERROR (Status)) {\r
179 DEBUG ((EFI_D_ERROR, "SDMediaDeviceStart: Fail to MMCSDCardInit \r\n"));\r
180 goto Exit;\r
181 }\r
182 DEBUG ((EFI_D_INFO, "SDMediaDeviceStart: MMCSDCardInit SuccessFul\n"));\r
183\r
184 if (CardData->CardType == CEATACard) {\r
185 Status = CEATABlockIoInit (CardData);\r
186 } else {\r
187 Status = MMCSDBlockIoInit (CardData);\r
188 }\r
189\r
190 if (EFI_ERROR (Status)) {\r
191 DEBUG ((EFI_D_ERROR, "SDMediaDeviceStart: Fail to BlockIoInit \r\n"));\r
192 goto Exit;\r
193 }\r
194 DEBUG ((EFI_D_INFO, "SDMediaDeviceStart: BlockIo is successfully installed\n"));\r
195\r
196\r
197 Status = gBS->InstallProtocolInterface (\r
198 &Controller,\r
199 &gEfiBlockIoProtocolGuid,\r
200 EFI_NATIVE_INTERFACE,\r
201 &CardData->BlockIo\r
202 );\r
203 if (EFI_ERROR (Status)) {\r
204 DEBUG ((EFI_D_ERROR, "SDMediaDeviceStart: Fail to install gEfiBlockIoProtocolGuid \r\n"));\r
205 goto Exit;\r
206 }\r
207\r
208 //\r
209 // Install the component name protocol\r
210 //\r
211 CardData->ControllerNameTable = NULL;\r
212\r
213 AddUnicodeString2 (\r
214 "eng",\r
215 gSDMediaDeviceName.SupportedLanguages,\r
216 &CardData->ControllerNameTable,\r
217 L"MMC/SD Media Device",\r
218 TRUE\r
219 );\r
220 AddUnicodeString2 (\r
221 "en",\r
222 gSDMediaDeviceName2.SupportedLanguages,\r
223 &CardData->ControllerNameTable,\r
224 L"MMC/SD Media Device",\r
225 FALSE\r
226 );\r
227\r
228Exit:\r
229 if (EFI_ERROR (Status)) {\r
230 DEBUG ((EFI_D_INFO, "SDMediaDeviceStart: End with failure\r\n"));\r
231 if (CardData != NULL) {\r
232 if (CardData->RawBufferPointer != NULL) {\r
233 gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) CardData->RawBufferPointer, EFI_SIZE_TO_PAGES (2 * SDHostIo->HostCapability.BoundarySize));\r
234 }\r
235 FreePool (CardData);\r
236 }\r
237 }\r
238\r
239 return Status;\r
240}\r
241\r
242\r
243/**\r
74c6a103 244 Stop this driver on ControllerHandle. Support stopping any child handles\r
9b6bbcdb
MK
245 created by this driver.\r
246\r
247 @param This Protocol instance pointer.\r
248 @param Controller Handle of device to stop driver on.\r
249 @param NumberOfChildren Number of Children in the ChildHandleBuffer.\r
250 @param ChildHandleBuffer List of handles for the children we need to stop.\r
251\r
252 @return EFI_SUCCESS\r
253 @return others\r
254\r
255**/\r
256EFI_STATUS\r
257EFIAPI\r
258SDMediaDeviceStop (\r
259 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
260 IN EFI_HANDLE Controller,\r
261 IN UINTN NumberOfChildren,\r
262 IN EFI_HANDLE *ChildHandleBuffer\r
263 )\r
264{\r
265 EFI_STATUS Status;\r
266 CARD_DATA *CardData;\r
267 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
268\r
269 //\r
270 // First find BlockIo Protocol\r
271 //\r
272 Status = gBS->OpenProtocol (\r
273 Controller,\r
274 &gEfiBlockIoProtocolGuid,\r
275 (VOID **)&BlockIo,\r
276 This->DriverBindingHandle,\r
277 Controller,\r
278 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
279 );\r
280 if (EFI_ERROR (Status)) {\r
281 return Status;\r
282 }\r
283\r
284 CardData = CARD_DATA_FROM_THIS(BlockIo);\r
285\r
286 //\r
287 // Uninstall Block I/O protocol from the device handle\r
288 //\r
289 Status = gBS->UninstallProtocolInterface (\r
290 Controller,\r
291 &gEfiBlockIoProtocolGuid,\r
292 BlockIo\r
293 );\r
294 if (EFI_ERROR (Status)) {\r
295 return Status;\r
296 }\r
297\r
298 if (CardData != NULL) {\r
299 if (CardData->RawBufferPointer != NULL) {\r
300 gBS->FreePages ((EFI_PHYSICAL_ADDRESS) (UINTN) CardData->RawBufferPointer, EFI_SIZE_TO_PAGES (2 * CardData->SDHostIo->HostCapability.BoundarySize));\r
301 }\r
302 FreeUnicodeStringTable (CardData->ControllerNameTable);\r
303 FreePool (CardData);\r
304 }\r
305\r
306 gBS->CloseProtocol (\r
307 Controller,\r
308 &gEfiSDHostIoProtocolGuid,\r
309 This->DriverBindingHandle,\r
310 Controller\r
311 );\r
312\r
313 return EFI_SUCCESS;\r
314}\r
315\r
316\r
317\r