3 The definition for SD media device driver model and blkio protocol routines.
5 Copyright (c) 2013-2016 Intel Corporation.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include "SDMediaDevice.h"
15 EFI_DRIVER_BINDING_PROTOCOL gSDMediaDeviceDriverBinding
= {
16 SDMediaDeviceSupported
,
25 Entry point for EFI drivers.
27 @param ImageHandle EFI_HANDLE.
28 @param SystemTable EFI_SYSTEM_TABLE.
30 @retval EFI_SUCCESS Driver is successfully loaded.
31 @return Others Failed.
36 InitializeSDMediaDevice (
37 IN EFI_HANDLE ImageHandle
,
38 IN EFI_SYSTEM_TABLE
*SystemTable
41 return EfiLibInstallDriverBindingComponentName2 (
44 &gSDMediaDeviceDriverBinding
,
53 Test to see if this driver supports ControllerHandle. Any
54 ControllerHandle that has BlockIoProtocol installed will be supported.
56 @param This Protocol instance pointer.
57 @param Controller Handle of device to test.
58 @param RemainingDevicePath Not used.
60 @return EFI_SUCCESS This driver supports this device.
61 @return EFI_UNSUPPORTED This driver does not support this device.
66 SDMediaDeviceSupported (
67 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
68 IN EFI_HANDLE Controller
,
69 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
73 EFI_SD_HOST_IO_PROTOCOL
*SDHostIo
;
76 // Test whether there is PCI IO Protocol attached on the controller handle.
78 Status
= gBS
->OpenProtocol (
80 &gEfiSDHostIoProtocolGuid
,
82 This
->DriverBindingHandle
,
84 EFI_OPEN_PROTOCOL_BY_DRIVER
86 if (EFI_ERROR (Status
)) {
92 &gEfiSDHostIoProtocolGuid
,
93 This
->DriverBindingHandle
,
102 Starting the SD Media Device Driver.
104 @param This Protocol instance pointer.
105 @param Controller Handle of device to test.
106 @param RemainingDevicePath Not used.
108 @retval EFI_SUCCESS This driver supports this device.
109 @retval EFI_UNSUPPORTED This driver does not support this device.
110 @retval EFI_DEVICE_ERROR This driver cannot be started due to device Error.
111 EFI_OUT_OF_RESOURCES- Failed due to resource shortage.
117 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
118 IN EFI_HANDLE Controller
,
119 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath
123 EFI_SD_HOST_IO_PROTOCOL
*SDHostIo
;
129 // Open PCI I/O Protocol and save pointer to open protocol
130 // in private data area.
132 Status
= gBS
->OpenProtocol (
134 &gEfiSDHostIoProtocolGuid
,
136 This
->DriverBindingHandle
,
138 EFI_OPEN_PROTOCOL_BY_DRIVER
140 if (EFI_ERROR (Status
)) {
141 DEBUG ((EFI_D_ERROR
, "SDMediaDeviceStart: Fail to open gEfiSDHostIoProtocolGuid \r\n"));
145 Status
= SDHostIo
->DetectCardAndInitHost (SDHostIo
);
146 if (EFI_ERROR (Status
)) {
147 DEBUG ((EFI_D_INFO
, "SDMediaDeviceStart: Fail to DetectCardAndInitHost \r\n"));
151 CardData
= (CARD_DATA
*)AllocateZeroPool(sizeof (CARD_DATA
));
152 if (CardData
== NULL
) {
153 Status
= EFI_OUT_OF_RESOURCES
;
154 DEBUG ((EFI_D_ERROR
, "SDMediaDeviceStart: Fail to AllocateZeroPool(CARD_DATA) \r\n"));
158 ASSERT (SDHostIo
->HostCapability
.BoundarySize
>= 4 * 1024);
159 CardData
->RawBufferPointer
= (UINT8
*)((UINTN
)DMA_MEMORY_TOP
);
160 Status
= gBS
->AllocatePages (
163 EFI_SIZE_TO_PAGES (2 * SDHostIo
->HostCapability
.BoundarySize
),
164 (EFI_PHYSICAL_ADDRESS
*)(&CardData
->RawBufferPointer
)
167 if (CardData
->RawBufferPointer
== NULL
) {
168 DEBUG ((EFI_D_ERROR
, "SDMediaDeviceStart: Fail to AllocateZeroPool(2*x) \r\n"));
169 Status
= EFI_OUT_OF_RESOURCES
;
172 CardData
->AlignedBuffer
= CardData
->RawBufferPointer
- ((UINTN
)(CardData
->RawBufferPointer
) & (SDHostIo
->HostCapability
.BoundarySize
- 1)) + SDHostIo
->HostCapability
.BoundarySize
;
174 CardData
->Signature
= CARD_DATA_SIGNATURE
;
175 CardData
->SDHostIo
= SDHostIo
;
177 Status
= MMCSDCardInit (CardData
);
178 if (EFI_ERROR (Status
)) {
179 DEBUG ((EFI_D_ERROR
, "SDMediaDeviceStart: Fail to MMCSDCardInit \r\n"));
182 DEBUG ((EFI_D_INFO
, "SDMediaDeviceStart: MMCSDCardInit SuccessFul\n"));
184 if (CardData
->CardType
== CEATACard
) {
185 Status
= CEATABlockIoInit (CardData
);
187 Status
= MMCSDBlockIoInit (CardData
);
190 if (EFI_ERROR (Status
)) {
191 DEBUG ((EFI_D_ERROR
, "SDMediaDeviceStart: Fail to BlockIoInit \r\n"));
194 DEBUG ((EFI_D_INFO
, "SDMediaDeviceStart: BlockIo is successfully installed\n"));
197 Status
= gBS
->InstallProtocolInterface (
199 &gEfiBlockIoProtocolGuid
,
200 EFI_NATIVE_INTERFACE
,
203 if (EFI_ERROR (Status
)) {
204 DEBUG ((EFI_D_ERROR
, "SDMediaDeviceStart: Fail to install gEfiBlockIoProtocolGuid \r\n"));
209 // Install the component name protocol
211 CardData
->ControllerNameTable
= NULL
;
215 gSDMediaDeviceName
.SupportedLanguages
,
216 &CardData
->ControllerNameTable
,
217 L
"MMC/SD Media Device",
222 gSDMediaDeviceName2
.SupportedLanguages
,
223 &CardData
->ControllerNameTable
,
224 L
"MMC/SD Media Device",
229 if (EFI_ERROR (Status
)) {
230 DEBUG ((EFI_D_INFO
, "SDMediaDeviceStart: End with failure\r\n"));
231 if (CardData
!= NULL
) {
232 if (CardData
->RawBufferPointer
!= NULL
) {
233 gBS
->FreePages ((EFI_PHYSICAL_ADDRESS
) (UINTN
) CardData
->RawBufferPointer
, EFI_SIZE_TO_PAGES (2 * SDHostIo
->HostCapability
.BoundarySize
));
244 Stop this driver on ControllerHandle. Support stopping any child handles
245 created by this driver.
247 @param This Protocol instance pointer.
248 @param Controller Handle of device to stop driver on.
249 @param NumberOfChildren Number of Children in the ChildHandleBuffer.
250 @param ChildHandleBuffer List of handles for the children we need to stop.
259 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
260 IN EFI_HANDLE Controller
,
261 IN UINTN NumberOfChildren
,
262 IN EFI_HANDLE
*ChildHandleBuffer
267 EFI_BLOCK_IO_PROTOCOL
*BlockIo
;
270 // First find BlockIo Protocol
272 Status
= gBS
->OpenProtocol (
274 &gEfiBlockIoProtocolGuid
,
276 This
->DriverBindingHandle
,
278 EFI_OPEN_PROTOCOL_GET_PROTOCOL
280 if (EFI_ERROR (Status
)) {
284 CardData
= CARD_DATA_FROM_THIS(BlockIo
);
287 // Uninstall Block I/O protocol from the device handle
289 Status
= gBS
->UninstallProtocolInterface (
291 &gEfiBlockIoProtocolGuid
,
294 if (EFI_ERROR (Status
)) {
298 if (CardData
!= NULL
) {
299 if (CardData
->RawBufferPointer
!= NULL
) {
300 gBS
->FreePages ((EFI_PHYSICAL_ADDRESS
) (UINTN
) CardData
->RawBufferPointer
, EFI_SIZE_TO_PAGES (2 * CardData
->SDHostIo
->HostCapability
.BoundarySize
));
302 FreeUnicodeStringTable (CardData
->ControllerNameTable
);
308 &gEfiSDHostIoProtocolGuid
,
309 This
->DriverBindingHandle
,