2 MMC/SD Card driver for OMAP 35xx (SDIO not supported)
4 This driver always produces a BlockIo protocol but it starts off with no Media
5 present. A TimerCallBack detects when media is inserted or removed and after
6 a media change event a call to BlockIo ReadBlocks/WriteBlocks will cause the
7 media to be detected (or removed) and the BlockIo Media structure will get
8 updated. No MMC/SD Card harward registers are updated until the first BlockIo
9 ReadBlocks/WriteBlocks after media has been insterted (booting with a card
10 plugged in counts as an insertion event).
12 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
14 This program and the accompanying materials
15 are licensed and made available under the terms and conditions of the BSD License
16 which accompanies this distribution. The full text of the license may be found at
17 http://opensource.org/licenses/bsd-license.php
19 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
20 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
28 EFI_BLOCK_IO_MEDIA gMMCHSMedia
= {
29 SIGNATURE_32('s','d','i','o'), // MediaId
30 TRUE
, // RemovableMedia
31 FALSE
, // MediaPresent
32 FALSE
, // LogicalPartition
34 FALSE
, // WriteCaching
42 VENDOR_DEVICE_PATH Mmc
;
46 MMCHS_DEVICE_PATH gMmcHsDevicePath
= {
50 (UINT8
)(sizeof(VENDOR_DEVICE_PATH
)),
51 (UINT8
)((sizeof(VENDOR_DEVICE_PATH
)) >> 8),
52 0xb615f1f5, 0x5088, 0x43cd, 0x80, 0x9c, 0xa1, 0x6e, 0x52, 0x48, 0x7d, 0x00
56 END_ENTIRE_DEVICE_PATH_SUBTYPE
,
57 sizeof (EFI_DEVICE_PATH_PROTOCOL
),
63 EMBEDDED_EXTERNAL_DEVICE
*gTPS65950
;
64 EFI_EVENT gTimerEvent
;
65 BOOLEAN gMediaChange
= FALSE
;
80 gCardInfo
.CIDData
.MDT
= ((Response0
>> 8) & 0xFFF);
81 gCardInfo
.CIDData
.PSN
= (((Response0
>> 24) & 0xFF) | ((Response1
& 0xFFFFFF) << 8));
82 gCardInfo
.CIDData
.PRV
= ((Response1
>> 24) & 0xFF);
83 gCardInfo
.CIDData
.PNM
[4] = ((Response2
) & 0xFF);
84 gCardInfo
.CIDData
.PNM
[3] = ((Response2
>> 8) & 0xFF);
85 gCardInfo
.CIDData
.PNM
[2] = ((Response2
>> 16) & 0xFF);
86 gCardInfo
.CIDData
.PNM
[1] = ((Response2
>> 24) & 0xFF);
87 gCardInfo
.CIDData
.PNM
[0] = ((Response3
) & 0xFF);
88 gCardInfo
.CIDData
.OID
= ((Response3
>> 8) & 0xFFFF);
89 gCardInfo
.CIDData
.MID
= ((Response3
>> 24) & 0xFF);
94 UpdateMMCHSClkFrequency (
98 //Set Clock enable to 0x0 to not provide the clock to the card
99 MmioAnd32 (MMCHS_SYSCTL
, ~CEN
);
101 //Set new clock frequency.
102 MmioAndThenOr32 (MMCHS_SYSCTL
, ~CLKD_MASK
, NewCLKD
<< 6);
104 //Poll till Internal Clock Stable
105 while ((MmioRead32 (MMCHS_SYSCTL
) & ICS_MASK
) != ICS
);
107 //Set Clock enable to 0x1 to provide the clock to the card
108 MmioOr32 (MMCHS_SYSCTL
, CEN
);
115 UINTN CmdInterruptEnableVal
,
120 UINTN RetryCount
= 0;
122 //Check if command line is in use or not. Poll till command line is available.
123 while ((MmioRead32 (MMCHS_PSTATE
) & DATI_MASK
) == DATI_NOT_ALLOWED
);
125 //Provide the block size.
126 MmioWrite32 (MMCHS_BLK
, BLEN_512BYTES
);
128 //Setting Data timeout counter value to max value.
129 MmioAndThenOr32 (MMCHS_SYSCTL
, ~DTO_MASK
, DTO_VAL
);
131 //Clear Status register.
132 MmioWrite32 (MMCHS_STAT
, 0xFFFFFFFF);
134 //Set command argument register
135 MmioWrite32 (MMCHS_ARG
, CmdArgument
);
137 //Enable interrupt enable events to occur
138 MmioWrite32 (MMCHS_IE
, CmdInterruptEnableVal
);
141 MmioWrite32 (MMCHS_CMD
, Cmd
);
143 //Check for the command status.
144 while (RetryCount
< MAX_RETRY_COUNT
) {
146 MmcStatus
= MmioRead32 (MMCHS_STAT
);
147 } while (MmcStatus
== 0);
149 //Read status of command response
150 if ((MmcStatus
& ERRI
) != 0) {
152 //Perform soft-reset for mmci_cmd line.
153 MmioOr32 (MMCHS_SYSCTL
, SRC
);
154 while ((MmioRead32 (MMCHS_SYSCTL
) & SRC
));
156 DEBUG ((EFI_D_INFO
, "MmcStatus: %x\n", MmcStatus
));
157 return EFI_DEVICE_ERROR
;
160 //Check if command is completed.
161 if ((MmcStatus
& CC
) == CC
) {
162 MmioWrite32 (MMCHS_STAT
, CC
);
169 if (RetryCount
== MAX_RETRY_COUNT
) {
178 GetBlockInformation (
183 CSD_SDV2
*CsdSDV2Data
;
186 if (gCardInfo
.CardType
== SD_CARD_2_HIGH
) {
187 CsdSDV2Data
= (CSD_SDV2
*)&gCardInfo
.CSDData
;
189 //Populate BlockSize.
190 *BlockSize
= (0x1UL
<< CsdSDV2Data
->READ_BL_LEN
);
192 //Calculate Total number of blocks.
193 CardSize
= CsdSDV2Data
->C_SIZELow16
| (CsdSDV2Data
->C_SIZEHigh6
<< 2);
194 *NumBlocks
= ((CardSize
+ 1) * 1024);
196 //Populate BlockSize.
197 *BlockSize
= (0x1UL
<< gCardInfo
.CSDData
.READ_BL_LEN
);
199 //Calculate Total number of blocks.
200 CardSize
= gCardInfo
.CSDData
.C_SIZELow2
| (gCardInfo
.CSDData
.C_SIZEHigh10
<< 2);
201 *NumBlocks
= (CardSize
+ 1) * (1 << (gCardInfo
.CSDData
.C_SIZE_MULT
+ 2));
204 //For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes.
205 if (*BlockSize
> 512) {
206 *NumBlocks
= MultU64x32(*NumBlocks
, *BlockSize
/2);
210 DEBUG ((EFI_D_INFO
, "Card type: %x, BlockSize: %x, NumBlocks: %x\n", gCardInfo
.CardType
, *BlockSize
, *NumBlocks
));
216 UINTN
*ClockFrequencySelect
219 UINT8 MaxDataTransferRate
;
220 UINTN TransferRateValue
= 0;
221 UINTN TimeValue
= 0 ;
224 MaxDataTransferRate
= gCardInfo
.CSDData
.TRAN_SPEED
;
226 //Calculate Transfer rate unit (Bits 2:0 of TRAN_SPEED)
227 switch (MaxDataTransferRate
& 0x7) {
229 TransferRateValue
= 100 * 1000;
233 TransferRateValue
= 1 * 1000 * 1000;
237 TransferRateValue
= 10 * 1000 * 1000;
241 TransferRateValue
= 100 * 1000 * 1000;
245 DEBUG((EFI_D_ERROR
, "Invalid parameter.\n"));
249 //Calculate Time value (Bits 6:3 of TRAN_SPEED)
250 switch ((MaxDataTransferRate
>> 3) & 0xF) {
312 DEBUG((EFI_D_ERROR
, "Invalid parameter.\n"));
316 Frequency
= TransferRateValue
* TimeValue
/10;
318 //Calculate Clock divider value to program in MMCHS_SYSCTL[CLKD] field.
319 *ClockFrequencySelect
= ((MMC_REFERENCE_CLK
/Frequency
) + 1);
321 DEBUG ((EFI_D_INFO
, "MaxDataTransferRate: 0x%x, Frequency: %d KHz, ClockFrequencySelect: %x\n", MaxDataTransferRate
, Frequency
/1000, *ClockFrequencySelect
));
326 GetCardConfigurationData (
332 UINTN ClockFrequencySelect
;
334 //Calculate BlockSize and Total number of blocks in the detected card.
335 GetBlockInformation(&BlockSize
, &NumBlocks
);
336 gCardInfo
.BlockSize
= BlockSize
;
337 gCardInfo
.NumBlocks
= NumBlocks
;
339 //Calculate Card clock divider value.
340 CalculateCardCLKD(&ClockFrequencySelect
);
341 gCardInfo
.ClockFrequencySelect
= ClockFrequencySelect
;
353 //Select Device group to belong to P1 device group in Power IC.
355 Status
= gTPS65950
->Write (gTPS65950
, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4
, VMMC1_DEV_GRP
), 1, &Data
);
356 ASSERT_EFI_ERROR(Status
);
358 //Configure voltage regulator for MMC1 in Power IC to output 3.0 voltage.
360 Status
= gTPS65950
->Write (gTPS65950
, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4
, VMMC1_DEDICATED_REG
), 1, &Data
);
361 ASSERT_EFI_ERROR(Status
);
363 //After ramping up voltage, set VDDS stable bit to indicate that voltage level is stable.
364 MmioOr32 (CONTROL_PBIAS_LITE
, (PBIASLITEVMODE0
| PBIASLITEPWRDNZ0
| PBIASSPEEDCTRL0
| PBIASLITEVMODE1
| PBIASLITEWRDNZ1
));
367 MmioAndThenOr32 (GPIO1_BASE
+ GPIO_OE
, ~BIT23
, BIT23
);
369 // Enable Card Detect
370 Data
= CARD_DETECT_ENABLE
;
371 gTPS65950
->Write (gTPS65950
, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID2
, TPS65950_GPIO_CTRL
), 1, &Data
);
379 PerformCardIdenfication (
384 UINTN CmdArgument
= 0;
386 UINTN RetryCount
= 0;
387 BOOLEAN SDCmd8Supported
= FALSE
;
390 MmioWrite32 (MMCHS_IE
, (BADA_EN
| CERR_EN
| DEB_EN
| DCRC_EN
| DTO_EN
| CIE_EN
|
391 CEB_EN
| CCRC_EN
| CTO_EN
| BRR_EN
| BWR_EN
| TC_EN
| CC_EN
));
393 //Controller INIT procedure start.
394 MmioOr32 (MMCHS_CON
, INIT
);
395 MmioWrite32 (MMCHS_CMD
, 0x00000000);
396 while (!(MmioRead32 (MMCHS_STAT
) & CC
));
401 //Set CC bit to 0x1 to clear the flag
402 MmioOr32 (MMCHS_STAT
, CC
);
404 //Retry INIT procedure.
405 MmioWrite32 (MMCHS_CMD
, 0x00000000);
406 while (!(MmioRead32 (MMCHS_STAT
) & CC
));
408 //End initialization sequence
409 MmioAnd32 (MMCHS_CON
, ~INIT
);
411 MmioOr32 (MMCHS_HCTL
, (SDVS_3_0_V
| DTW_1_BIT
| SDBP_ON
));
413 //Change clock frequency to 400KHz to fit protocol
414 UpdateMMCHSClkFrequency(CLKD_400KHZ
);
416 MmioOr32 (MMCHS_CON
, OD
);
419 Status
= SendCmd (CMD0
, CMD0_INT_EN
, CmdArgument
);
420 if (EFI_ERROR(Status
)) {
421 DEBUG ((EFI_D_ERROR
, "Cmd0 fails.\n"));
425 DEBUG ((EFI_D_INFO
, "CMD0 response: %x\n", MmioRead32 (MMCHS_RSP10
)));
428 Status
= SendCmd (CMD5
, CMD5_INT_EN
, CmdArgument
);
429 if (Status
== EFI_SUCCESS
) {
430 DEBUG ((EFI_D_ERROR
, "CMD5 Success. SDIO card. Follow SDIO card specification.\n"));
431 DEBUG ((EFI_D_INFO
, "CMD5 response: %x\n", MmioRead32 (MMCHS_RSP10
)));
432 //NOTE: Returning unsupported error for now. Need to implement SDIO specification.
433 return EFI_UNSUPPORTED
;
435 DEBUG ((EFI_D_INFO
, "CMD5 fails. Not an SDIO card.\n"));
438 MmioOr32 (MMCHS_SYSCTL
, SRC
);
440 while ((MmioRead32 (MMCHS_SYSCTL
) & SRC
));
442 //Send CMD8 command. (New v2.00 command for Voltage check)
443 //Only 2.7V - 3.6V is supported for SD2.0, only SD 2.0 card can pass.
444 //MMC & SD1.1 card will fail this command.
445 CmdArgument
= CMD8_ARG
;
446 Status
= SendCmd (CMD8
, CMD8_INT_EN
, CmdArgument
);
447 if (Status
== EFI_SUCCESS
) {
448 Response
= MmioRead32 (MMCHS_RSP10
);
449 DEBUG ((EFI_D_INFO
, "CMD8 success. CMD8 response: %x\n", Response
));
450 if (Response
!= CmdArgument
) {
451 return EFI_DEVICE_ERROR
;
453 DEBUG ((EFI_D_INFO
, "Card is SD2.0\n"));
454 SDCmd8Supported
= TRUE
; //Supports high capacity.
456 DEBUG ((EFI_D_INFO
, "CMD8 fails. Not an SD2.0 card.\n"));
459 MmioOr32 (MMCHS_SYSCTL
, SRC
);
461 while ((MmioRead32 (MMCHS_SYSCTL
) & SRC
));
463 //Poll till card is busy
464 while (RetryCount
< MAX_RETRY_COUNT
) {
465 //Send CMD55 command.
467 Status
= SendCmd (CMD55
, CMD55_INT_EN
, CmdArgument
);
468 if (Status
== EFI_SUCCESS
) {
469 DEBUG ((EFI_D_INFO
, "CMD55 success. CMD55 response: %x\n", MmioRead32 (MMCHS_RSP10
)));
470 gCardInfo
.CardType
= SD_CARD
;
472 DEBUG ((EFI_D_INFO
, "CMD55 fails.\n"));
473 gCardInfo
.CardType
= MMC_CARD
;
476 //Send appropriate command for the card type which got detected.
477 if (gCardInfo
.CardType
== SD_CARD
) {
478 CmdArgument
= ((UINTN
*) &(gCardInfo
.OCRData
))[0];
481 if (SDCmd8Supported
) {
485 Status
= SendCmd (ACMD41
, ACMD41_INT_EN
, CmdArgument
);
486 if (EFI_ERROR(Status
)) {
487 DEBUG ((EFI_D_INFO
, "ACMD41 fails.\n"));
490 ((UINT32
*) &(gCardInfo
.OCRData
))[0] = MmioRead32 (MMCHS_RSP10
);
491 DEBUG ((EFI_D_INFO
, "SD card detected. ACMD41 OCR: %x\n", ((UINT32
*) &(gCardInfo
.OCRData
))[0]));
492 } else if (gCardInfo
.CardType
== MMC_CARD
) {
494 Status
= SendCmd (CMD1
, CMD1_INT_EN
, CmdArgument
);
495 if (EFI_ERROR(Status
)) {
496 DEBUG ((EFI_D_INFO
, "CMD1 fails.\n"));
499 Response
= MmioRead32 (MMCHS_RSP10
);
500 DEBUG ((EFI_D_INFO
, "MMC card detected.. CMD1 response: %x\n", Response
));
502 //NOTE: For now, I am skipping this since I only have an SD card.
503 //Compare card OCR and host OCR (Section 22.6.1.3.2.4)
504 return EFI_UNSUPPORTED
; //For now, MMC is not supported.
507 //Poll the card until it is out of its power-up sequence.
508 if (gCardInfo
.OCRData
.Busy
== 1) {
510 if (SDCmd8Supported
) {
511 gCardInfo
.CardType
= SD_CARD_2
;
514 //Card is ready. Check CCS (Card capacity status) bit (bit#30).
515 //SD 2.0 standard card will response with CCS 0, SD high capacity card will respond with CCS 1.
516 if (gCardInfo
.OCRData
.AccessMode
& BIT1
) {
517 gCardInfo
.CardType
= SD_CARD_2_HIGH
;
518 DEBUG ((EFI_D_INFO
, "High capacity card.\n"));
520 DEBUG ((EFI_D_INFO
, "Standard capacity card.\n"));
530 if (RetryCount
== MAX_RETRY_COUNT
) {
531 DEBUG ((EFI_D_ERROR
, "Timeout error. RetryCount: %d\n", RetryCount
));
537 Status
= SendCmd (CMD2
, CMD2_INT_EN
, CmdArgument
);
538 if (EFI_ERROR(Status
)) {
539 DEBUG ((EFI_D_ERROR
, "CMD2 fails. Status: %x\n", Status
));
543 DEBUG ((EFI_D_INFO
, "CMD2 response: %x %x %x %x\n", MmioRead32 (MMCHS_RSP10
), MmioRead32 (MMCHS_RSP32
), MmioRead32 (MMCHS_RSP54
), MmioRead32 (MMCHS_RSP76
)));
545 //Parse CID register data.
546 ParseCardCIDData(MmioRead32 (MMCHS_RSP10
), MmioRead32 (MMCHS_RSP32
), MmioRead32 (MMCHS_RSP54
), MmioRead32 (MMCHS_RSP76
));
550 Status
= SendCmd (CMD3
, CMD3_INT_EN
, CmdArgument
);
551 if (EFI_ERROR(Status
)) {
552 DEBUG ((EFI_D_ERROR
, "CMD3 fails. Status: %x\n", Status
));
556 //Set RCA for the detected card. RCA is CMD3 response.
557 gCardInfo
.RCA
= (MmioRead32 (MMCHS_RSP10
) >> 16);
558 DEBUG ((EFI_D_INFO
, "CMD3 response: RCA %x\n", gCardInfo
.RCA
));
560 //MMC Bus setting change after card identification.
561 MmioAnd32 (MMCHS_CON
, ~OD
);
562 MmioOr32 (MMCHS_HCTL
, SDVS_3_0_V
);
563 UpdateMMCHSClkFrequency(CLKD_400KHZ
); //Set the clock frequency to 400KHz.
570 GetCardSpecificData (
577 //Send CMD9 to retrieve CSD.
578 CmdArgument
= gCardInfo
.RCA
<< 16;
579 Status
= SendCmd (CMD9
, CMD9_INT_EN
, CmdArgument
);
580 if (EFI_ERROR(Status
)) {
581 DEBUG ((EFI_D_ERROR
, "CMD9 fails. Status: %x\n", Status
));
585 //Populate 128-bit CSD register data.
586 ((UINT32
*)&(gCardInfo
.CSDData
))[0] = MmioRead32 (MMCHS_RSP10
);
587 ((UINT32
*)&(gCardInfo
.CSDData
))[1] = MmioRead32 (MMCHS_RSP32
);
588 ((UINT32
*)&(gCardInfo
.CSDData
))[2] = MmioRead32 (MMCHS_RSP54
);
589 ((UINT32
*)&(gCardInfo
.CSDData
))[3] = MmioRead32 (MMCHS_RSP76
);
591 DEBUG ((EFI_D_INFO
, "CMD9 response: %x %x %x %x\n", MmioRead32 (MMCHS_RSP10
), MmioRead32 (MMCHS_RSP32
), MmioRead32 (MMCHS_RSP54
), MmioRead32 (MMCHS_RSP76
)));
593 //Calculate total number of blocks and max. data transfer rate supported by the detected card.
594 GetCardConfigurationData();
596 //Change MMCHS clock frequency to what detected card can support.
597 UpdateMMCHSClkFrequency(gCardInfo
.ClockFrequencySelect
);
604 PerformCardConfiguration (
608 UINTN CmdArgument
= 0;
612 CmdArgument
= gCardInfo
.RCA
<< 16;
613 Status
= SendCmd (CMD7
, CMD7_INT_EN
, CmdArgument
);
614 if (EFI_ERROR(Status
)) {
615 DEBUG ((EFI_D_ERROR
, "CMD7 fails. Status: %x\n", Status
));
619 if ((gCardInfo
.CardType
!= UNKNOWN_CARD
) && (gCardInfo
.CardType
!= MMC_CARD
)) {
620 // We could read SCR register, but SD Card Phys spec stats any SD Card shall
621 // set SCR.SD_BUS_WIDTHS to support 4-bit mode, so why bother?
623 // Send ACMD6 (application specific commands must be prefixed with CMD55)
624 Status
= SendCmd (CMD55
, CMD55_INT_EN
, CmdArgument
);
625 if (!EFI_ERROR (Status
)) {
626 // set device into 4-bit data bus mode
627 Status
= SendCmd (ACMD6
, ACMD6_INT_EN
, 0x2);
628 if (!EFI_ERROR (Status
)) {
629 // Set host controler into 4-bit mode
630 MmioOr32 (MMCHS_HCTL
, DTW_4_BIT
);
631 DEBUG ((EFI_D_INFO
, "SD Memory Card set to 4-bit mode\n"));
636 //Send CMD16 to set the block length
637 CmdArgument
= gCardInfo
.BlockSize
;
638 Status
= SendCmd (CMD16
, CMD16_INT_EN
, CmdArgument
);
639 if (EFI_ERROR(Status
)) {
640 DEBUG ((EFI_D_ERROR
, "CMD16 fails. Status: %x\n", Status
));
650 IN EFI_BLOCK_IO_PROTOCOL
*This
,
655 UINTN
*DataBuffer
= Buffer
;
656 UINTN DataSize
= This
->Media
->BlockSize
/4;
658 UINTN RetryCount
= 0;
660 //Check controller status to make sure there is no error.
661 while (RetryCount
< MAX_RETRY_COUNT
) {
664 MmcStatus
= MmioRead32 (MMCHS_STAT
);
665 } while(MmcStatus
== 0);
667 //Check if Buffer read ready (BRR) bit is set?
668 if (MmcStatus
& BRR
) {
671 MmioOr32 (MMCHS_STAT
, BRR
);
673 //Read block worth of data.
674 for (Count
= 0; Count
< DataSize
; Count
++) {
675 *DataBuffer
++ = MmioRead32 (MMCHS_DATA
);
682 if (RetryCount
== MAX_RETRY_COUNT
) {
692 IN EFI_BLOCK_IO_PROTOCOL
*This
,
697 UINTN
*DataBuffer
= Buffer
;
698 UINTN DataSize
= This
->Media
->BlockSize
/4;
700 UINTN RetryCount
= 0;
702 //Check controller status to make sure there is no error.
703 while (RetryCount
< MAX_RETRY_COUNT
) {
706 MmcStatus
= MmioRead32 (MMCHS_STAT
);
707 } while(MmcStatus
== 0);
709 //Check if Buffer write ready (BWR) bit is set?
710 if (MmcStatus
& BWR
) {
713 MmioOr32 (MMCHS_STAT
, BWR
);
715 //Write block worth of data.
716 for (Count
= 0; Count
< DataSize
; Count
++) {
717 MmioWrite32 (MMCHS_DATA
, *DataBuffer
++);
725 if (RetryCount
== MAX_RETRY_COUNT
) {
735 IN EFI_BLOCK_IO_PROTOCOL
*This
,
737 IN OPERATION_TYPE OperationType
742 UINTN RetryCount
= 0;
744 //Read or Write data.
745 if (OperationType
== READ
) {
746 Status
= ReadBlockData(This
, Buffer
);
747 if (EFI_ERROR(Status
)) {
748 DEBUG((EFI_D_ERROR
, "ReadBlockData fails.\n"));
751 } else if (OperationType
== WRITE
) {
752 Status
= WriteBlockData(This
, Buffer
);
753 if (EFI_ERROR(Status
)) {
754 DEBUG((EFI_D_ERROR
, "WriteBlockData fails.\n"));
759 //Check for the Transfer completion.
760 while (RetryCount
< MAX_RETRY_COUNT
) {
763 MmcStatus
= MmioRead32 (MMCHS_STAT
);
764 } while (MmcStatus
== 0);
766 //Check if Transfer complete (TC) bit is set?
767 if (MmcStatus
& TC
) {
770 DEBUG ((EFI_D_ERROR
, "MmcStatus for TC: %x\n", MmcStatus
));
771 //Check if DEB, DCRC or DTO interrupt occured.
772 if ((MmcStatus
& DEB
) | (MmcStatus
& DCRC
) | (MmcStatus
& DTO
)) {
773 //There was an error during the data transfer.
775 //Set SRD bit to 1 and wait until it return to 0x0.
776 MmioOr32 (MMCHS_SYSCTL
, SRD
);
777 while((MmioRead32 (MMCHS_SYSCTL
) & SRD
) != 0x0);
779 return EFI_DEVICE_ERROR
;
785 if (RetryCount
== MAX_RETRY_COUNT
) {
786 DEBUG ((EFI_D_ERROR
, "TransferBlockData timed out.\n"));
802 // Card detect is a GPIO0 on the TPS65950
804 Status
= gTPS65950
->Read (gTPS65950
, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID2
, GPIODATAIN1
), 1, &Data
);
805 if (EFI_ERROR (Status
)) {
809 if ((Data
& CARD_DETECT_BIT
) == CARD_DETECT_BIT
) {
824 if (!CardPresent ()) {
828 //Initialize MMC host controller clocks.
829 Status
= InitializeMMCHS ();
830 if (EFI_ERROR(Status
)) {
831 DEBUG ((EFI_D_ERROR
, "Initialize MMC host controller fails. Status: %x\n", Status
));
835 //Software reset of the MMCHS host controller.
836 MmioWrite32 (MMCHS_SYSCONFIG
, SOFTRESET
);
838 while ((MmioRead32 (MMCHS_SYSSTATUS
) & RESETDONE_MASK
) != RESETDONE
);
840 //Soft reset for all.
841 MmioWrite32 (MMCHS_SYSCTL
, SRA
);
843 while ((MmioRead32 (MMCHS_SYSCTL
) & SRA
) != 0x0);
845 //Voltage capabilities initialization. Activate VS18 and VS30.
846 MmioOr32 (MMCHS_CAPA
, (VS30
| VS18
));
848 //Wakeup configuration
849 MmioOr32 (MMCHS_SYSCONFIG
, ENAWAKEUP
);
850 MmioOr32 (MMCHS_HCTL
, IWE
);
852 //MMCHS Controller default initialization
853 MmioOr32 (MMCHS_CON
, (OD
| DW8_1_4_BIT
| CEATA_OFF
));
855 MmioWrite32 (MMCHS_HCTL
, (SDVS_3_0_V
| DTW_1_BIT
| SDBP_OFF
));
857 //Enable internal clock
858 MmioOr32 (MMCHS_SYSCTL
, ICE
);
860 //Set the clock frequency to 80KHz.
861 UpdateMMCHSClkFrequency (CLKD_80KHZ
);
863 //Enable SD bus power.
864 MmioOr32 (MMCHS_HCTL
, (SDBP_ON
));
866 //Poll till SD bus power bit is set.
867 while ((MmioRead32 (MMCHS_HCTL
) & SDBP_MASK
) != SDBP_ON
);
870 Status
= PerformCardIdenfication ();
871 if (EFI_ERROR(Status
)) {
872 DEBUG ((EFI_D_ERROR
, "No MMC/SD card detected.\n"));
876 //Get CSD (Card specific data) for the detected card.
877 Status
= GetCardSpecificData();
878 if (EFI_ERROR(Status
)) {
882 //Configure the card in data transfer mode.
883 Status
= PerformCardConfiguration();
884 if (EFI_ERROR(Status
)) {
888 //Patch the Media structure.
889 gMMCHSMedia
.LastBlock
= (gCardInfo
.NumBlocks
- 1);
890 gMMCHSMedia
.BlockSize
= gCardInfo
.BlockSize
;
891 gMMCHSMedia
.ReadOnly
= (MmioRead32 (GPIO1_BASE
+ GPIO_DATAIN
) & BIT23
) == BIT23
;
892 gMMCHSMedia
.MediaPresent
= TRUE
;
893 gMMCHSMedia
.MediaId
++;
894 gMediaChange
= FALSE
;
896 DEBUG ((EFI_D_INFO
, "SD Card Media Change\n"));
904 IN EFI_BLOCK_IO_PROTOCOL
*This
,
908 IN OPERATION_TYPE OperationType
911 EFI_STATUS Status
= EFI_SUCCESS
;
912 UINTN RetryCount
= 0;
915 UINTN CmdInterruptEnable
= 0;
916 UINTN CmdArgument
= 0;
918 BOOLEAN MediaPresentLastTime
;
921 OldTpl
= gBS
->RaiseTPL (TPL_NOTIFY
);
924 if (Buffer
== NULL
) {
925 Status
= EFI_INVALID_PARAMETER
;
930 MediaPresentLastTime
= gMMCHSMedia
.MediaPresent
;
933 Status
= DetectCard ();
934 if (EFI_ERROR (Status
)) {
935 // We detected a removal
936 gMMCHSMedia
.MediaPresent
= FALSE
;
937 gMMCHSMedia
.LastBlock
= 0;
938 gMMCHSMedia
.BlockSize
= 512; // Should be zero but there is a bug in DiskIo
939 gMMCHSMedia
.ReadOnly
= FALSE
;
943 gMediaChange
= FALSE
;
944 } else if (!gMMCHSMedia
.MediaPresent
) {
945 Status
= EFI_NO_MEDIA
;
949 if ((MediaPresentLastTime
!= gMMCHSMedia
.MediaPresent
) || Update
) {
950 gBS
->ReinstallProtocolInterface (
952 &gEfiBlockIoProtocolGuid
,
958 if (EFI_ERROR (Status
)) {
962 if (Lba
> This
->Media
->LastBlock
) {
963 Status
= EFI_INVALID_PARAMETER
;
967 if ((BufferSize
% This
->Media
->BlockSize
) != 0) {
968 Status
= EFI_BAD_BUFFER_SIZE
;
972 //Check if the data lines are not in use.
973 while ((RetryCount
++ < MAX_RETRY_COUNT
) && ((MmioRead32 (MMCHS_PSTATE
) & DATI_MASK
) != DATI_ALLOWED
));
974 if (RetryCount
== MAX_RETRY_COUNT
) {
975 Status
= EFI_TIMEOUT
;
979 //Populate the command information based on the operation type.
980 if (OperationType
== READ
) {
981 Cmd
= CMD17
; //Single block read
982 CmdInterruptEnable
= CMD17_INT_EN
;
983 } else if (OperationType
== WRITE
) {
984 Cmd
= CMD24
; //Single block write
985 CmdInterruptEnable
= CMD24_INT_EN
;
988 //Calculate total number of blocks its going to read.
989 NumBlocks
= (BufferSize
+ (This
->Media
->BlockSize
- 1))/This
->Media
->BlockSize
;
991 //Set command argument based on the card access mode (Byte mode or Block mode)
992 if (gCardInfo
.OCRData
.AccessMode
& BIT1
) {
993 CmdArgument
= (UINTN
)Lba
;
995 CmdArgument
= (UINTN
)Lba
* This
->Media
->BlockSize
;
1000 Status
= SendCmd (Cmd
, CmdInterruptEnable
, CmdArgument
);
1001 if (EFI_ERROR(Status
)) {
1002 DEBUG ((EFI_D_ERROR
, "CMD fails. Status: %x\n", Status
));
1006 //Transfer a block worth of data.
1007 Status
= TransferBlockData(This
, Buffer
, OperationType
);
1008 if (EFI_ERROR(Status
)) {
1009 DEBUG ((EFI_D_ERROR
, "TransferBlockData fails. %x\n", Status
));
1013 //Adjust command argument.
1014 if (gCardInfo
.OCRData
.AccessMode
& BIT1
) {
1015 CmdArgument
++; //Increase BlockIndex by one.
1017 CmdArgument
+= This
->Media
->BlockSize
; //Increase BlockIndex by BlockSize
1021 Buffer
= (UINT8
*)Buffer
+ This
->Media
->BlockSize
;
1026 gBS
->RestoreTPL (OldTpl
);
1032 Reset the Block Device.
1034 @param This Indicates a pointer to the calling context.
1035 @param ExtendedVerification Driver may perform diagnostics on reset.
1037 @retval EFI_SUCCESS The device was reset.
1038 @retval EFI_DEVICE_ERROR The device is not functioning properly and could
1045 IN EFI_BLOCK_IO_PROTOCOL
*This
,
1046 IN BOOLEAN ExtendedVerification
1054 Read BufferSize bytes from Lba into Buffer.
1056 @param This Indicates a pointer to the calling context.
1057 @param MediaId Id of the media, changes every time the media is replaced.
1058 @param Lba The starting Logical Block Address to read from
1059 @param BufferSize Size of Buffer, must be a multiple of device block size.
1060 @param Buffer A pointer to the destination buffer for the data. The caller is
1061 responsible for either having implicit or explicit ownership of the buffer.
1063 @retval EFI_SUCCESS The data was read correctly from the device.
1064 @retval EFI_DEVICE_ERROR The device reported an error while performing the read.
1065 @retval EFI_NO_MEDIA There is no media in the device.
1066 @retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
1067 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
1068 @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
1069 or the buffer is not on proper alignment.
1076 IN EFI_BLOCK_IO_PROTOCOL
*This
,
1079 IN UINTN BufferSize
,
1085 //Perform Read operation.
1086 Status
= SdReadWrite (This
, (UINTN
)Lba
, Buffer
, BufferSize
, READ
);
1093 Write BufferSize bytes from Lba into Buffer.
1095 @param This Indicates a pointer to the calling context.
1096 @param MediaId The media ID that the write request is for.
1097 @param Lba The starting logical block address to be written. The caller is
1098 responsible for writing to only legitimate locations.
1099 @param BufferSize Size of Buffer, must be a multiple of device block size.
1100 @param Buffer A pointer to the source buffer for the data.
1102 @retval EFI_SUCCESS The data was written correctly to the device.
1103 @retval EFI_WRITE_PROTECTED The device can not be written to.
1104 @retval EFI_DEVICE_ERROR The device reported an error while performing the write.
1105 @retval EFI_NO_MEDIA There is no media in the device.
1106 @retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
1107 @retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
1108 @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
1109 or the buffer is not on proper alignment.
1115 IN EFI_BLOCK_IO_PROTOCOL
*This
,
1118 IN UINTN BufferSize
,
1124 //Perform write operation.
1125 Status
= SdReadWrite (This
, (UINTN
)Lba
, Buffer
, BufferSize
, WRITE
);
1132 Flush the Block Device.
1134 @param This Indicates a pointer to the calling context.
1136 @retval EFI_SUCCESS All outstanding data was written to the device
1137 @retval EFI_DEVICE_ERROR The device reported an error while writting back the data
1138 @retval EFI_NO_MEDIA There is no media in the device.
1144 IN EFI_BLOCK_IO_PROTOCOL
*This
1151 EFI_BLOCK_IO_PROTOCOL gBlockIo
= {
1152 EFI_BLOCK_IO_INTERFACE_REVISION
, // Revision
1153 &gMMCHSMedia
, // *Media
1154 MMCHSReset
, // Reset
1155 MMCHSReadBlocks
, // ReadBlocks
1156 MMCHSWriteBlocks
, // WriteBlocks
1157 MMCHSFlushBlocks
// FlushBlocks
1162 Timer callback to convert card present hardware into a boolean that indicates
1163 a media change event has happened. If you just check the GPIO you could see
1164 card 1 and then check again after card 1 was removed and card 2 was inserted
1165 and you would still see media present. Thus you need the timer tick to catch
1168 @param Event Event whose notification function is being invoked.
1169 @param Context The pointer to the notification function's context,
1170 which is implementation-dependent. Not used.
1182 Present
= CardPresent ();
1183 if (gMMCHSMedia
.MediaPresent
) {
1184 if (!Present
&& !gMediaChange
) {
1185 gMediaChange
= TRUE
;
1188 if (Present
&& !gMediaChange
) {
1189 gMediaChange
= TRUE
;
1198 IN EFI_HANDLE ImageHandle
,
1199 IN EFI_SYSTEM_TABLE
*SystemTable
1204 Status
= gBS
->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid
, NULL
, (VOID
**)&gTPS65950
);
1205 ASSERT_EFI_ERROR(Status
);
1207 ZeroMem (&gCardInfo
, sizeof (CARD_INFO
));
1209 Status
= gBS
->CreateEvent (EVT_TIMER
| EVT_NOTIFY_SIGNAL
, TPL_CALLBACK
, TimerCallback
, NULL
, &gTimerEvent
);
1210 ASSERT_EFI_ERROR (Status
);
1212 Status
= gBS
->SetTimer (gTimerEvent
, TimerPeriodic
, 1000000ULL); // make me a PCD
1213 ASSERT_EFI_ERROR (Status
);
1216 Status
= gBS
->InstallMultipleProtocolInterfaces (
1218 &gEfiBlockIoProtocolGuid
, &gBlockIo
,
1219 &gEfiDevicePathProtocolGuid
, &gMmcHsDevicePath
,