]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/EmmcDevice.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / SdMmcPciHcDxe / EmmcDevice.c
1 /** @file
2 This file provides some helper functions which are specific for EMMC device.
3
4 Copyright (c) 2018, NVIDIA CORPORATION. All rights reserved.
5 Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include "SdMmcPciHcDxe.h"
11
12 /**
13 Send command GO_IDLE_STATE (CMD0 with argument of 0x00000000) to the device to
14 make it go to Idle State.
15
16 Refer to EMMC Electrical Standard Spec 5.1 Section 6.4 for details.
17
18 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
19 @param[in] Slot The slot number of the SD card to send the command to.
20
21 @retval EFI_SUCCESS The EMMC device is reset correctly.
22 @retval Others The device reset fails.
23
24 **/
25 EFI_STATUS
26 EmmcReset (
27 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
28 IN UINT8 Slot
29 )
30 {
31 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
32 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
33 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
34 EFI_STATUS Status;
35
36 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
37 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
38 ZeroMem (&Packet, sizeof (Packet));
39
40 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
41 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
42 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
43
44 SdMmcCmdBlk.CommandIndex = EMMC_GO_IDLE_STATE;
45 SdMmcCmdBlk.CommandType = SdMmcCommandTypeBc;
46 SdMmcCmdBlk.ResponseType = 0;
47 SdMmcCmdBlk.CommandArgument = 0;
48
49 gBS->Stall (1000);
50
51 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
52
53 return Status;
54 }
55
56 /**
57 Send command SEND_OP_COND to the EMMC device to get the data of the OCR register.
58
59 Refer to EMMC Electrical Standard Spec 5.1 Section 6.4 for details.
60
61 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
62 @param[in] Slot The slot number of the SD card to send the command to.
63 @param[in, out] Argument On input, the argument of SEND_OP_COND is to send to the device.
64 On output, the argument is the value of OCR register.
65
66 @retval EFI_SUCCESS The operation is done correctly.
67 @retval Others The operation fails.
68
69 **/
70 EFI_STATUS
71 EmmcGetOcr (
72 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
73 IN UINT8 Slot,
74 IN OUT UINT32 *Argument
75 )
76 {
77 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
78 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
79 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
80 EFI_STATUS Status;
81
82 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
83 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
84 ZeroMem (&Packet, sizeof (Packet));
85
86 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
87 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
88 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
89
90 SdMmcCmdBlk.CommandIndex = EMMC_SEND_OP_COND;
91 SdMmcCmdBlk.CommandType = SdMmcCommandTypeBcr;
92 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR3;
93 SdMmcCmdBlk.CommandArgument = *Argument;
94
95 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
96 if (!EFI_ERROR (Status)) {
97 //
98 // For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12.
99 //
100 *Argument = SdMmcStatusBlk.Resp0;
101 }
102
103 return Status;
104 }
105
106 /**
107 Broadcast command ALL_SEND_CID to the bus to ask all the EMMC devices to send the
108 data of their CID registers.
109
110 Refer to EMMC Electrical Standard Spec 5.1 Section 6.4 for details.
111
112 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
113 @param[in] Slot The slot number of the SD card to send the command to.
114
115 @retval EFI_SUCCESS The operation is done correctly.
116 @retval Others The operation fails.
117
118 **/
119 EFI_STATUS
120 EmmcGetAllCid (
121 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
122 IN UINT8 Slot
123 )
124 {
125 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
126 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
127 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
128 EFI_STATUS Status;
129
130 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
131 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
132 ZeroMem (&Packet, sizeof (Packet));
133
134 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
135 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
136 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
137
138 SdMmcCmdBlk.CommandIndex = EMMC_ALL_SEND_CID;
139 SdMmcCmdBlk.CommandType = SdMmcCommandTypeBcr;
140 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;
141 SdMmcCmdBlk.CommandArgument = 0;
142
143 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
144
145 return Status;
146 }
147
148 /**
149 Send command SET_RELATIVE_ADDR to the EMMC device to assign a Relative device
150 Address (RCA).
151
152 Refer to EMMC Electrical Standard Spec 5.1 Section 6.4 for details.
153
154 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
155 @param[in] Slot The slot number of the SD card to send the command to.
156 @param[in] Rca The relative device address to be assigned.
157
158 @retval EFI_SUCCESS The operation is done correctly.
159 @retval Others The operation fails.
160
161 **/
162 EFI_STATUS
163 EmmcSetRca (
164 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
165 IN UINT8 Slot,
166 IN UINT16 Rca
167 )
168 {
169 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
170 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
171 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
172 EFI_STATUS Status;
173
174 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
175 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
176 ZeroMem (&Packet, sizeof (Packet));
177
178 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
179 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
180 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
181
182 SdMmcCmdBlk.CommandIndex = EMMC_SET_RELATIVE_ADDR;
183 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
184 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
185 SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
186
187 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
188
189 return Status;
190 }
191
192 /**
193 Send command SEND_CSD to the EMMC device to get the data of the CSD register.
194
195 Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details.
196
197 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
198 @param[in] Slot The slot number of the SD card to send the command to.
199 @param[in] Rca The relative device address of selected device.
200 @param[out] Csd The buffer to store the content of the CSD register.
201 Note the caller should ignore the lowest byte of this
202 buffer as the content of this byte is meaningless even
203 if the operation succeeds.
204
205 @retval EFI_SUCCESS The operation is done correctly.
206 @retval Others The operation fails.
207
208 **/
209 EFI_STATUS
210 EmmcGetCsd (
211 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
212 IN UINT8 Slot,
213 IN UINT16 Rca,
214 OUT EMMC_CSD *Csd
215 )
216 {
217 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
218 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
219 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
220 EFI_STATUS Status;
221
222 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
223 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
224 ZeroMem (&Packet, sizeof (Packet));
225
226 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
227 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
228 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
229
230 SdMmcCmdBlk.CommandIndex = EMMC_SEND_CSD;
231 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
232 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR2;
233 SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
234
235 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
236 if (!EFI_ERROR (Status)) {
237 //
238 // For details, refer to SD Host Controller Simplified Spec 3.0 Table 2-12.
239 //
240 CopyMem (((UINT8*)Csd) + 1, &SdMmcStatusBlk.Resp0, sizeof (EMMC_CSD) - 1);
241 }
242
243 return Status;
244 }
245
246 /**
247 Send command SELECT_DESELECT_CARD to the EMMC device to select/deselect it.
248
249 Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details.
250
251 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
252 @param[in] Slot The slot number of the SD card to send the command to.
253 @param[in] Rca The relative device address of selected device.
254
255 @retval EFI_SUCCESS The operation is done correctly.
256 @retval Others The operation fails.
257
258 **/
259 EFI_STATUS
260 EmmcSelect (
261 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
262 IN UINT8 Slot,
263 IN UINT16 Rca
264 )
265 {
266 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
267 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
268 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
269 EFI_STATUS Status;
270
271 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
272 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
273 ZeroMem (&Packet, sizeof (Packet));
274
275 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
276 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
277 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
278
279 SdMmcCmdBlk.CommandIndex = EMMC_SELECT_DESELECT_CARD;
280 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
281 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
282 SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
283
284 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
285
286 return Status;
287 }
288
289 /**
290 Send command SEND_EXT_CSD to the EMMC device to get the data of the EXT_CSD register.
291
292 Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details.
293
294 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
295 @param[in] Slot The slot number of the SD card to send the command to.
296 @param[out] ExtCsd The buffer to store the content of the EXT_CSD register.
297
298 @retval EFI_SUCCESS The operation is done correctly.
299 @retval Others The operation fails.
300
301 **/
302 EFI_STATUS
303 EmmcGetExtCsd (
304 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
305 IN UINT8 Slot,
306 OUT EMMC_EXT_CSD *ExtCsd
307 )
308 {
309 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
310 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
311 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
312 EFI_STATUS Status;
313
314 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
315 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
316 ZeroMem (&Packet, sizeof (Packet));
317
318 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
319 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
320 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
321
322 SdMmcCmdBlk.CommandIndex = EMMC_SEND_EXT_CSD;
323 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAdtc;
324 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
325 SdMmcCmdBlk.CommandArgument = 0x00000000;
326
327 Packet.InDataBuffer = ExtCsd;
328 Packet.InTransferLength = sizeof (EMMC_EXT_CSD);
329
330 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
331 return Status;
332 }
333
334 /**
335 Send command SWITCH to the EMMC device to switch the mode of operation of the
336 selected Device or modifies the EXT_CSD registers.
337
338 Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details.
339
340 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
341 @param[in] Slot The slot number of the SD card to send the command to.
342 @param[in] Access The access mode of SWTICH command.
343 @param[in] Index The offset of the field to be access.
344 @param[in] Value The value to be set to the specified field of EXT_CSD register.
345 @param[in] CmdSet The value of CmdSet field of EXT_CSD register.
346
347 @retval EFI_SUCCESS The operation is done correctly.
348 @retval Others The operation fails.
349
350 **/
351 EFI_STATUS
352 EmmcSwitch (
353 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
354 IN UINT8 Slot,
355 IN UINT8 Access,
356 IN UINT8 Index,
357 IN UINT8 Value,
358 IN UINT8 CmdSet
359 )
360 {
361 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
362 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
363 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
364 EFI_STATUS Status;
365
366 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
367 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
368 ZeroMem (&Packet, sizeof (Packet));
369
370 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
371 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
372 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
373
374 SdMmcCmdBlk.CommandIndex = EMMC_SWITCH;
375 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
376 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1b;
377 SdMmcCmdBlk.CommandArgument = (Access << 24) | (Index << 16) | (Value << 8) | CmdSet;
378
379 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
380
381 return Status;
382 }
383
384 /**
385 Send command SEND_STATUS to the addressed EMMC device to get its status register.
386
387 Refer to EMMC Electrical Standard Spec 5.1 Section 6.10.4 for details.
388
389 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
390 @param[in] Slot The slot number of the SD card to send the command to.
391 @param[in] Rca The relative device address of addressed device.
392 @param[out] DevStatus The returned device status.
393
394 @retval EFI_SUCCESS The operation is done correctly.
395 @retval Others The operation fails.
396
397 **/
398 EFI_STATUS
399 EmmcSendStatus (
400 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
401 IN UINT8 Slot,
402 IN UINT16 Rca,
403 OUT UINT32 *DevStatus
404 )
405 {
406 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
407 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
408 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
409 EFI_STATUS Status;
410
411 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
412 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
413 ZeroMem (&Packet, sizeof (Packet));
414
415 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
416 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
417 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
418
419 SdMmcCmdBlk.CommandIndex = EMMC_SEND_STATUS;
420 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAc;
421 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
422 SdMmcCmdBlk.CommandArgument = (UINT32)Rca << 16;
423
424 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
425 if (!EFI_ERROR (Status)) {
426 *DevStatus = SdMmcStatusBlk.Resp0;
427 }
428
429 return Status;
430 }
431
432 /**
433 Send command SEND_TUNING_BLOCK to the EMMC device for HS200 optimal sampling point
434 detection.
435
436 It may be sent up to 40 times until the host finishes the tuning procedure.
437
438 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.8 for details.
439
440 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
441 @param[in] Slot The slot number of the SD card to send the command to.
442 @param[in] BusWidth The bus width to work.
443
444 @retval EFI_SUCCESS The operation is done correctly.
445 @retval Others The operation fails.
446
447 **/
448 EFI_STATUS
449 EmmcSendTuningBlk (
450 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
451 IN UINT8 Slot,
452 IN UINT8 BusWidth
453 )
454 {
455 EFI_SD_MMC_COMMAND_BLOCK SdMmcCmdBlk;
456 EFI_SD_MMC_STATUS_BLOCK SdMmcStatusBlk;
457 EFI_SD_MMC_PASS_THRU_COMMAND_PACKET Packet;
458 EFI_STATUS Status;
459 UINT8 TuningBlock[128];
460
461 ZeroMem (&SdMmcCmdBlk, sizeof (SdMmcCmdBlk));
462 ZeroMem (&SdMmcStatusBlk, sizeof (SdMmcStatusBlk));
463 ZeroMem (&Packet, sizeof (Packet));
464
465 Packet.SdMmcCmdBlk = &SdMmcCmdBlk;
466 Packet.SdMmcStatusBlk = &SdMmcStatusBlk;
467 Packet.Timeout = SD_MMC_HC_GENERIC_TIMEOUT;
468
469 SdMmcCmdBlk.CommandIndex = EMMC_SEND_TUNING_BLOCK;
470 SdMmcCmdBlk.CommandType = SdMmcCommandTypeAdtc;
471 SdMmcCmdBlk.ResponseType = SdMmcResponseTypeR1;
472 SdMmcCmdBlk.CommandArgument = 0;
473
474 Packet.InDataBuffer = TuningBlock;
475 if (BusWidth == 8) {
476 Packet.InTransferLength = sizeof (TuningBlock);
477 } else {
478 Packet.InTransferLength = 64;
479 }
480
481 Status = SdMmcPassThruPassThru (PassThru, Slot, &Packet, NULL);
482
483 return Status;
484 }
485
486 /**
487 Tunning the clock to get HS200 optimal sampling point.
488
489 Command SEND_TUNING_BLOCK may be sent up to 40 times until the host finishes the
490 tuning procedure.
491
492 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.8 and SD Host Controller
493 Simplified Spec 3.0 Figure 2-29 for details.
494
495 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
496 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
497 @param[in] Slot The slot number of the SD card to send the command to.
498 @param[in] BusWidth The bus width to work.
499
500 @retval EFI_SUCCESS The operation is done correctly.
501 @retval Others The operation fails.
502
503 **/
504 EFI_STATUS
505 EmmcTuningClkForHs200 (
506 IN EFI_PCI_IO_PROTOCOL *PciIo,
507 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
508 IN UINT8 Slot,
509 IN UINT8 BusWidth
510 )
511 {
512 EFI_STATUS Status;
513 UINT8 HostCtrl2;
514 UINT8 Retry;
515
516 //
517 // Notify the host that the sampling clock tuning procedure starts.
518 //
519 HostCtrl2 = BIT6;
520 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, sizeof (HostCtrl2), &HostCtrl2);
521 if (EFI_ERROR (Status)) {
522 return Status;
523 }
524 //
525 // Ask the device to send a sequence of tuning blocks till the tuning procedure is done.
526 //
527 Retry = 0;
528 do {
529 Status = EmmcSendTuningBlk (PassThru, Slot, BusWidth);
530 if (EFI_ERROR (Status)) {
531 DEBUG ((DEBUG_ERROR, "EmmcTuningClkForHs200: Send tuning block fails with %r\n", Status));
532 return Status;
533 }
534
535 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, TRUE, sizeof (HostCtrl2), &HostCtrl2);
536 if (EFI_ERROR (Status)) {
537 return Status;
538 }
539
540 if ((HostCtrl2 & (BIT6 | BIT7)) == 0) {
541 break;
542 }
543
544 if ((HostCtrl2 & (BIT6 | BIT7)) == BIT7) {
545 return EFI_SUCCESS;
546 }
547 } while (++Retry < 40);
548
549 DEBUG ((DEBUG_ERROR, "EmmcTuningClkForHs200: Send tuning block fails at %d times with HostCtrl2 %02x\n", Retry, HostCtrl2));
550 //
551 // Abort the tuning procedure and reset the tuning circuit.
552 //
553 HostCtrl2 = (UINT8)~(BIT6 | BIT7);
554 Status = SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, sizeof (HostCtrl2), &HostCtrl2);
555 if (EFI_ERROR (Status)) {
556 return Status;
557 }
558 return EFI_DEVICE_ERROR;
559 }
560
561 /**
562 Switch the bus width to specified width.
563
564 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.9 and SD Host Controller
565 Simplified Spec 3.0 Figure 3-7 for details.
566
567 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
568 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
569 @param[in] Slot The slot number of the SD card to send the command to.
570 @param[in] Rca The relative device address to be assigned.
571 @param[in] IsDdr If TRUE, use dual data rate data simpling method. Otherwise
572 use single data rate data simpling method.
573 @param[in] BusWidth The bus width to be set, it could be 4 or 8.
574
575 @retval EFI_SUCCESS The operation is done correctly.
576 @retval Others The operation fails.
577
578 **/
579 EFI_STATUS
580 EmmcSwitchBusWidth (
581 IN EFI_PCI_IO_PROTOCOL *PciIo,
582 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
583 IN UINT8 Slot,
584 IN UINT16 Rca,
585 IN BOOLEAN IsDdr,
586 IN UINT8 BusWidth
587 )
588 {
589 EFI_STATUS Status;
590 UINT8 Access;
591 UINT8 Index;
592 UINT8 Value;
593 UINT8 CmdSet;
594 UINT32 DevStatus;
595
596 //
597 // Write Byte, the Value field is written into the byte pointed by Index.
598 //
599 Access = 0x03;
600 Index = OFFSET_OF (EMMC_EXT_CSD, BusWidth);
601 if (BusWidth == 4) {
602 Value = 1;
603 } else if (BusWidth == 8) {
604 Value = 2;
605 } else {
606 return EFI_INVALID_PARAMETER;
607 }
608
609 if (IsDdr) {
610 Value += 4;
611 }
612
613 CmdSet = 0;
614 Status = EmmcSwitch (PassThru, Slot, Access, Index, Value, CmdSet);
615 if (EFI_ERROR (Status)) {
616 DEBUG ((DEBUG_ERROR, "EmmcSwitchBusWidth: Switch to bus width %d fails with %r\n", BusWidth, Status));
617 return Status;
618 }
619
620 Status = EmmcSendStatus (PassThru, Slot, Rca, &DevStatus);
621 if (EFI_ERROR (Status)) {
622 DEBUG ((DEBUG_ERROR, "EmmcSwitchBusWidth: Send status fails with %r\n", Status));
623 return Status;
624 }
625 //
626 // Check the switch operation is really successful or not.
627 //
628 if ((DevStatus & BIT7) != 0) {
629 DEBUG ((DEBUG_ERROR, "EmmcSwitchBusWidth: The switch operation fails as DevStatus is 0x%08x\n", DevStatus));
630 return EFI_DEVICE_ERROR;
631 }
632
633 Status = SdMmcHcSetBusWidth (PciIo, Slot, BusWidth);
634
635 return Status;
636 }
637
638 /**
639 Switch the bus timing and clock frequency.
640
641 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6 and SD Host Controller
642 Simplified Spec 3.0 Figure 3-3 for details.
643
644 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
645 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
646 @param[in] Slot The slot number of the SD card to send the command to.
647 @param[in] Rca The relative device address to be assigned.
648 @param[in] HsTiming The value to be written to HS_TIMING field of EXT_CSD register.
649 @param[in] Timing The bus mode timing indicator.
650 @param[in] ClockFreq The max clock frequency to be set, the unit is MHz.
651
652 @retval EFI_SUCCESS The operation is done correctly.
653 @retval Others The operation fails.
654
655 **/
656 EFI_STATUS
657 EmmcSwitchBusTiming (
658 IN EFI_PCI_IO_PROTOCOL *PciIo,
659 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
660 IN UINT8 Slot,
661 IN UINT16 Rca,
662 IN UINT8 HsTiming,
663 IN SD_MMC_BUS_MODE Timing,
664 IN UINT32 ClockFreq
665 )
666 {
667 EFI_STATUS Status;
668 UINT8 Access;
669 UINT8 Index;
670 UINT8 Value;
671 UINT8 CmdSet;
672 UINT32 DevStatus;
673 SD_MMC_HC_PRIVATE_DATA *Private;
674
675 Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru);
676 //
677 // Write Byte, the Value field is written into the byte pointed by Index.
678 //
679 Access = 0x03;
680 Index = OFFSET_OF (EMMC_EXT_CSD, HsTiming);
681 Value = HsTiming;
682 CmdSet = 0;
683
684 Status = EmmcSwitch (PassThru, Slot, Access, Index, Value, CmdSet);
685 if (EFI_ERROR (Status)) {
686 DEBUG ((DEBUG_ERROR, "EmmcSwitchBusTiming: Switch to hstiming %d fails with %r\n", HsTiming, Status));
687 return Status;
688 }
689
690 //
691 // Convert the clock freq unit from MHz to KHz.
692 //
693 Status = SdMmcHcClockSupply (PciIo, Slot, ClockFreq * 1000, Private->BaseClkFreq[Slot], Private->ControllerVersion[Slot]);
694 if (EFI_ERROR (Status)) {
695 return Status;
696 }
697
698 Status = EmmcSendStatus (PassThru, Slot, Rca, &DevStatus);
699 if (EFI_ERROR (Status)) {
700 DEBUG ((DEBUG_ERROR, "EmmcSwitchBusTiming: Send status fails with %r\n", Status));
701 return Status;
702 }
703 //
704 // Check the switch operation is really successful or not.
705 //
706 if ((DevStatus & BIT7) != 0) {
707 DEBUG ((DEBUG_ERROR, "EmmcSwitchBusTiming: The switch operation fails as DevStatus is 0x%08x\n", DevStatus));
708 return EFI_DEVICE_ERROR;
709 }
710
711 if (mOverride != NULL && mOverride->NotifyPhase != NULL) {
712 Status = mOverride->NotifyPhase (
713 Private->ControllerHandle,
714 Slot,
715 EdkiiSdMmcSwitchClockFreqPost,
716 &Timing
717 );
718 if (EFI_ERROR (Status)) {
719 DEBUG ((
720 DEBUG_ERROR,
721 "%a: SD/MMC switch clock freq post notifier callback failed - %r\n",
722 __FUNCTION__,
723 Status
724 ));
725 return Status;
726 }
727 }
728
729 return Status;
730 }
731
732 /**
733 Switch to the High Speed timing according to request.
734
735 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.8 and SD Host Controller
736 Simplified Spec 3.0 Figure 2-29 for details.
737
738 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
739 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
740 @param[in] Slot The slot number of the SD card to send the command to.
741 @param[in] Rca The relative device address to be assigned.
742 @param[in] ClockFreq The max clock frequency to be set.
743 @param[in] IsDdr If TRUE, use dual data rate data simpling method. Otherwise
744 use single data rate data simpling method.
745 @param[in] BusWidth The bus width to be set, it could be 4 or 8.
746
747 @retval EFI_SUCCESS The operation is done correctly.
748 @retval Others The operation fails.
749
750 **/
751 EFI_STATUS
752 EmmcSwitchToHighSpeed (
753 IN EFI_PCI_IO_PROTOCOL *PciIo,
754 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
755 IN UINT8 Slot,
756 IN UINT16 Rca,
757 IN UINT32 ClockFreq,
758 IN BOOLEAN IsDdr,
759 IN UINT8 BusWidth
760 )
761 {
762 EFI_STATUS Status;
763 UINT8 HsTiming;
764 UINT8 HostCtrl1;
765 SD_MMC_BUS_MODE Timing;
766 SD_MMC_HC_PRIVATE_DATA *Private;
767
768 Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru);
769
770 Status = EmmcSwitchBusWidth (PciIo, PassThru, Slot, Rca, IsDdr, BusWidth);
771 if (EFI_ERROR (Status)) {
772 return Status;
773 }
774 //
775 // Set to Hight Speed timing
776 //
777 HostCtrl1 = BIT2;
778 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1, sizeof (HostCtrl1), &HostCtrl1);
779 if (EFI_ERROR (Status)) {
780 return Status;
781 }
782
783 if (IsDdr) {
784 Timing = SdMmcMmcHsDdr;
785 } else if (ClockFreq == 52) {
786 Timing = SdMmcMmcHsSdr;
787 } else {
788 Timing = SdMmcMmcLegacy;
789 }
790
791 Status = SdMmcHcUhsSignaling (Private->ControllerHandle, PciIo, Slot, Timing);
792 if (EFI_ERROR (Status)) {
793 return Status;
794 }
795
796 HsTiming = 1;
797 Status = EmmcSwitchBusTiming (PciIo, PassThru, Slot, Rca, HsTiming, Timing, ClockFreq);
798
799 return Status;
800 }
801
802 /**
803 Switch to the HS200 timing according to request.
804
805 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.8 and SD Host Controller
806 Simplified Spec 3.0 Figure 2-29 for details.
807
808 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
809 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
810 @param[in] Slot The slot number of the SD card to send the command to.
811 @param[in] Rca The relative device address to be assigned.
812 @param[in] ClockFreq The max clock frequency to be set.
813 @param[in] BusWidth The bus width to be set, it could be 4 or 8.
814
815 @retval EFI_SUCCESS The operation is done correctly.
816 @retval Others The operation fails.
817
818 **/
819 EFI_STATUS
820 EmmcSwitchToHS200 (
821 IN EFI_PCI_IO_PROTOCOL *PciIo,
822 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
823 IN UINT8 Slot,
824 IN UINT16 Rca,
825 IN UINT32 ClockFreq,
826 IN UINT8 BusWidth
827 )
828 {
829 EFI_STATUS Status;
830 UINT8 HsTiming;
831 UINT16 ClockCtrl;
832 SD_MMC_BUS_MODE Timing;
833 SD_MMC_HC_PRIVATE_DATA *Private;
834
835 Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru);
836
837 if ((BusWidth != 4) && (BusWidth != 8)) {
838 return EFI_INVALID_PARAMETER;
839 }
840
841 Status = EmmcSwitchBusWidth (PciIo, PassThru, Slot, Rca, FALSE, BusWidth);
842 if (EFI_ERROR (Status)) {
843 return Status;
844 }
845 //
846 // Set to HS200/SDR104 timing
847 //
848 //
849 // Stop bus clock at first
850 //
851 Status = SdMmcHcStopClock (PciIo, Slot);
852 if (EFI_ERROR (Status)) {
853 return Status;
854 }
855
856 Timing = SdMmcMmcHs200;
857
858 Status = SdMmcHcUhsSignaling (Private->ControllerHandle, PciIo, Slot, Timing);
859 if (EFI_ERROR (Status)) {
860 return Status;
861 }
862
863 //
864 // Wait Internal Clock Stable in the Clock Control register to be 1 before set SD Clock Enable bit
865 //
866 Status = SdMmcHcWaitMmioSet (
867 PciIo,
868 Slot,
869 SD_MMC_HC_CLOCK_CTRL,
870 sizeof (ClockCtrl),
871 BIT1,
872 BIT1,
873 SD_MMC_HC_GENERIC_TIMEOUT
874 );
875 if (EFI_ERROR (Status)) {
876 return Status;
877 }
878 //
879 // Set SD Clock Enable in the Clock Control register to 1
880 //
881 ClockCtrl = BIT2;
882 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_CLOCK_CTRL, sizeof (ClockCtrl), &ClockCtrl);
883
884 HsTiming = 2;
885 Status = EmmcSwitchBusTiming (PciIo, PassThru, Slot, Rca, HsTiming, Timing, ClockFreq);
886 if (EFI_ERROR (Status)) {
887 return Status;
888 }
889
890 Status = EmmcTuningClkForHs200 (PciIo, PassThru, Slot, BusWidth);
891
892 return Status;
893 }
894
895 /**
896 Switch to the HS400 timing according to request.
897
898 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.8 and SD Host Controller
899 Simplified Spec 3.0 Figure 2-29 for details.
900
901 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
902 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
903 @param[in] Slot The slot number of the SD card to send the command to.
904 @param[in] Rca The relative device address to be assigned.
905 @param[in] ClockFreq The max clock frequency to be set.
906
907 @retval EFI_SUCCESS The operation is done correctly.
908 @retval Others The operation fails.
909
910 **/
911 EFI_STATUS
912 EmmcSwitchToHS400 (
913 IN EFI_PCI_IO_PROTOCOL *PciIo,
914 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
915 IN UINT8 Slot,
916 IN UINT16 Rca,
917 IN UINT32 ClockFreq
918 )
919 {
920 EFI_STATUS Status;
921 UINT8 HsTiming;
922 SD_MMC_BUS_MODE Timing;
923 SD_MMC_HC_PRIVATE_DATA *Private;
924
925 Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru);
926
927 Status = EmmcSwitchToHS200 (PciIo, PassThru, Slot, Rca, ClockFreq, 8);
928 if (EFI_ERROR (Status)) {
929 return Status;
930 }
931 //
932 // Set to Hight Speed timing and set the clock frequency to a value less than 52MHz.
933 //
934 HsTiming = 1;
935 Status = EmmcSwitchBusTiming (PciIo, PassThru, Slot, Rca, HsTiming, SdMmcMmcHsSdr, 52);
936 if (EFI_ERROR (Status)) {
937 return Status;
938 }
939 //
940 // HS400 mode must use 8 data lines.
941 //
942 Status = EmmcSwitchBusWidth (PciIo, PassThru, Slot, Rca, TRUE, 8);
943 if (EFI_ERROR (Status)) {
944 return Status;
945 }
946
947 Timing = SdMmcMmcHs400;
948
949 Status = SdMmcHcUhsSignaling (Private->ControllerHandle, PciIo, Slot, Timing);
950 if (EFI_ERROR (Status)) {
951 return Status;
952 }
953
954 HsTiming = 3;
955 Status = EmmcSwitchBusTiming (PciIo, PassThru, Slot, Rca, HsTiming, Timing, ClockFreq);
956
957 return Status;
958 }
959
960 /**
961 Switch the high speed timing according to request.
962
963 Refer to EMMC Electrical Standard Spec 5.1 Section 6.6.8 and SD Host Controller
964 Simplified Spec 3.0 Figure 2-29 for details.
965
966 @param[in] PciIo A pointer to the EFI_PCI_IO_PROTOCOL instance.
967 @param[in] PassThru A pointer to the EFI_SD_MMC_PASS_THRU_PROTOCOL instance.
968 @param[in] Slot The slot number of the SD card to send the command to.
969 @param[in] Rca The relative device address to be assigned.
970
971 @retval EFI_SUCCESS The operation is done correctly.
972 @retval Others The operation fails.
973
974 **/
975 EFI_STATUS
976 EmmcSetBusMode (
977 IN EFI_PCI_IO_PROTOCOL *PciIo,
978 IN EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru,
979 IN UINT8 Slot,
980 IN UINT16 Rca
981 )
982 {
983 EFI_STATUS Status;
984 EMMC_CSD Csd;
985 EMMC_EXT_CSD ExtCsd;
986 UINT8 HsTiming;
987 BOOLEAN IsDdr;
988 UINT32 ClockFreq;
989 UINT8 BusWidth;
990 SD_MMC_HC_PRIVATE_DATA *Private;
991
992 Private = SD_MMC_HC_PRIVATE_FROM_THIS (PassThru);
993
994 Status = EmmcGetCsd (PassThru, Slot, Rca, &Csd);
995 if (EFI_ERROR (Status)) {
996 DEBUG ((DEBUG_ERROR, "EmmcSetBusMode: GetCsd fails with %r\n", Status));
997 return Status;
998 }
999
1000 Status = EmmcSelect (PassThru, Slot, Rca);
1001 if (EFI_ERROR (Status)) {
1002 DEBUG ((DEBUG_ERROR, "EmmcSetBusMode: Select fails with %r\n", Status));
1003 return Status;
1004 }
1005
1006 ASSERT (Private->BaseClkFreq[Slot] != 0);
1007 //
1008 // Check if the Host Controller support 8bits bus width.
1009 //
1010 if (Private->Capability[Slot].BusWidth8 != 0) {
1011 BusWidth = 8;
1012 } else {
1013 BusWidth = 4;
1014 }
1015 //
1016 // Get Deivce_Type from EXT_CSD register.
1017 //
1018 Status = EmmcGetExtCsd (PassThru, Slot, &ExtCsd);
1019 if (EFI_ERROR (Status)) {
1020 DEBUG ((DEBUG_ERROR, "EmmcSetBusMode: GetExtCsd fails with %r\n", Status));
1021 return Status;
1022 }
1023 //
1024 // Calculate supported bus speed/bus width/clock frequency.
1025 //
1026 HsTiming = 0;
1027 IsDdr = FALSE;
1028 ClockFreq = 0;
1029 if (((ExtCsd.DeviceType & (BIT4 | BIT5)) != 0) && (Private->Capability[Slot].Sdr104 != 0)) {
1030 HsTiming = 2;
1031 IsDdr = FALSE;
1032 ClockFreq = 200;
1033 } else if (((ExtCsd.DeviceType & (BIT2 | BIT3)) != 0) && (Private->Capability[Slot].Ddr50 != 0)) {
1034 HsTiming = 1;
1035 IsDdr = TRUE;
1036 ClockFreq = 52;
1037 } else if (((ExtCsd.DeviceType & BIT1) != 0) && (Private->Capability[Slot].HighSpeed != 0)) {
1038 HsTiming = 1;
1039 IsDdr = FALSE;
1040 ClockFreq = 52;
1041 } else if (((ExtCsd.DeviceType & BIT0) != 0) && (Private->Capability[Slot].HighSpeed != 0)) {
1042 HsTiming = 1;
1043 IsDdr = FALSE;
1044 ClockFreq = 26;
1045 }
1046 //
1047 // Check if both of the device and the host controller support HS400 DDR mode.
1048 //
1049 if (((ExtCsd.DeviceType & (BIT6 | BIT7)) != 0) && (Private->Capability[Slot].Hs400 != 0)) {
1050 //
1051 // The host controller supports 8bits bus.
1052 //
1053 ASSERT (BusWidth == 8);
1054 HsTiming = 3;
1055 IsDdr = TRUE;
1056 ClockFreq = 200;
1057 }
1058
1059 if ((ClockFreq == 0) || (HsTiming == 0)) {
1060 //
1061 // Continue using default setting.
1062 //
1063 return EFI_SUCCESS;
1064 }
1065
1066 DEBUG ((DEBUG_INFO, "EmmcSetBusMode: HsTiming %d ClockFreq %d BusWidth %d Ddr %a\n", HsTiming, ClockFreq, BusWidth, IsDdr ? "TRUE":"FALSE"));
1067
1068 if (HsTiming == 3) {
1069 //
1070 // Execute HS400 timing switch procedure
1071 //
1072 Status = EmmcSwitchToHS400 (PciIo, PassThru, Slot, Rca, ClockFreq);
1073 } else if (HsTiming == 2) {
1074 //
1075 // Execute HS200 timing switch procedure
1076 //
1077 Status = EmmcSwitchToHS200 (PciIo, PassThru, Slot, Rca, ClockFreq, BusWidth);
1078 } else {
1079 //
1080 // Execute High Speed timing switch procedure
1081 //
1082 Status = EmmcSwitchToHighSpeed (PciIo, PassThru, Slot, Rca, ClockFreq, IsDdr, BusWidth);
1083 }
1084
1085 DEBUG ((DEBUG_INFO, "EmmcSetBusMode: Switch to %a %r\n", (HsTiming == 3) ? "HS400" : ((HsTiming == 2) ? "HS200" : "HighSpeed"), Status));
1086
1087 return Status;
1088 }
1089
1090 /**
1091 Execute EMMC device identification procedure.
1092
1093 Refer to EMMC Electrical Standard Spec 5.1 Section 6.4 for details.
1094
1095 @param[in] Private A pointer to the SD_MMC_HC_PRIVATE_DATA instance.
1096 @param[in] Slot The slot number of the SD card to send the command to.
1097
1098 @retval EFI_SUCCESS There is a EMMC card.
1099 @retval Others There is not a EMMC card.
1100
1101 **/
1102 EFI_STATUS
1103 EmmcIdentification (
1104 IN SD_MMC_HC_PRIVATE_DATA *Private,
1105 IN UINT8 Slot
1106 )
1107 {
1108 EFI_STATUS Status;
1109 EFI_PCI_IO_PROTOCOL *PciIo;
1110 EFI_SD_MMC_PASS_THRU_PROTOCOL *PassThru;
1111 UINT32 Ocr;
1112 UINT16 Rca;
1113 UINTN Retry;
1114
1115 PciIo = Private->PciIo;
1116 PassThru = &Private->PassThru;
1117
1118 Status = EmmcReset (PassThru, Slot);
1119 if (EFI_ERROR (Status)) {
1120 DEBUG ((DEBUG_VERBOSE, "EmmcIdentification: Executing Cmd0 fails with %r\n", Status));
1121 return Status;
1122 }
1123
1124 Ocr = 0;
1125 Retry = 0;
1126 do {
1127 Status = EmmcGetOcr (PassThru, Slot, &Ocr);
1128 if (EFI_ERROR (Status)) {
1129 DEBUG ((DEBUG_VERBOSE, "EmmcIdentification: Executing Cmd1 fails with %r\n", Status));
1130 return Status;
1131 }
1132 Ocr |= BIT30;
1133
1134 if (Retry++ == 100) {
1135 DEBUG ((DEBUG_VERBOSE, "EmmcIdentification: Executing Cmd1 fails too many times\n"));
1136 return EFI_DEVICE_ERROR;
1137 }
1138 gBS->Stall(10 * 1000);
1139 } while ((Ocr & BIT31) == 0);
1140
1141 Status = EmmcGetAllCid (PassThru, Slot);
1142 if (EFI_ERROR (Status)) {
1143 DEBUG ((DEBUG_VERBOSE, "EmmcIdentification: Executing Cmd2 fails with %r\n", Status));
1144 return Status;
1145 }
1146 //
1147 // Slot starts from 0 and valid RCA starts from 1.
1148 // Here we takes a simple formula to calculate the RCA.
1149 // Don't support multiple devices on the slot, that is
1150 // shared bus slot feature.
1151 //
1152 Rca = Slot + 1;
1153 Status = EmmcSetRca (PassThru, Slot, Rca);
1154 if (EFI_ERROR (Status)) {
1155 DEBUG ((DEBUG_ERROR, "EmmcIdentification: Executing Cmd3 fails with %r\n", Status));
1156 return Status;
1157 }
1158 //
1159 // Enter Data Tranfer Mode.
1160 //
1161 DEBUG ((DEBUG_INFO, "EmmcIdentification: Found a EMMC device at slot [%d], RCA [%d]\n", Slot, Rca));
1162 Private->Slot[Slot].CardType = EmmcCardType;
1163
1164 Status = EmmcSetBusMode (PciIo, PassThru, Slot, Rca);
1165
1166 return Status;
1167 }
1168