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