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.
26
EFI_BLOCK_IO_MEDIA gMMCHSMedia = {
27
SIGNATURE_32('s','d','i','o'), // MediaId
28
TRUE, // RemovableMedia
29
FALSE, // MediaPresent
30
FALSE, // LogicalPartition
32
FALSE, // WriteCaching
40
VENDOR_DEVICE_PATH Mmc;
44
MMCHS_DEVICE_PATH gMmcHsDevicePath = {
48
(UINT8)(sizeof(VENDOR_DEVICE_PATH)),
49
(UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8),
50
0xb615f1f5, 0x5088, 0x43cd, 0x80, 0x9c, 0xa1, 0x6e, 0x52, 0x48, 0x7d, 0x00
54
END_ENTIRE_DEVICE_PATH_SUBTYPE,
55
sizeof (EFI_DEVICE_PATH_PROTOCOL),
61
EMBEDDED_EXTERNAL_DEVICE *gTPS65950;
62
EFI_EVENT gTimerEvent;
63
BOOLEAN gMediaChange = FALSE;
78
gCardInfo.CIDData.MDT = ((Response0 >> 8) & 0xFFF);
79
gCardInfo.CIDData.PSN = (((Response0 >> 24) & 0xFF) | ((Response1 & 0xFFFFFF) << 8));
80
gCardInfo.CIDData.PRV = ((Response1 >> 24) & 0xFF);
81
gCardInfo.CIDData.PNM[4] = ((Response2) & 0xFF);
82
gCardInfo.CIDData.PNM[3] = ((Response2 >> 8) & 0xFF);
83
gCardInfo.CIDData.PNM[2] = ((Response2 >> 16) & 0xFF);
84
gCardInfo.CIDData.PNM[1] = ((Response2 >> 24) & 0xFF);
85
gCardInfo.CIDData.PNM[0] = ((Response3) & 0xFF);
86
gCardInfo.CIDData.OID = ((Response3 >> 8) & 0xFFFF);
87
gCardInfo.CIDData.MID = ((Response3 >> 24) & 0xFF);
92
UpdateMMCHSClkFrequency (
96
//Set Clock enable to 0x0 to not provide the clock to the card
97
MmioAnd32 (MMCHS_SYSCTL, ~CEN);
99
//Set new clock frequency.
100
MmioAndThenOr32 (MMCHS_SYSCTL, ~CLKD_MASK, NewCLKD << 6);
102
//Poll till Internal Clock Stable
103
while ((MmioRead32 (MMCHS_SYSCTL) & ICS_MASK) != ICS);
105
//Set Clock enable to 0x1 to provide the clock to the card
106
MmioOr32 (MMCHS_SYSCTL, CEN);
113
UINTN CmdInterruptEnableVal,
118
UINTN RetryCount = 0;
120
//Check if command line is in use or not. Poll till command line is available.
121
while ((MmioRead32 (MMCHS_PSTATE) & DATI_MASK) == DATI_NOT_ALLOWED);
123
//Provide the block size.
124
MmioWrite32 (MMCHS_BLK, BLEN_512BYTES);
126
//Setting Data timeout counter value to max value.
127
MmioAndThenOr32 (MMCHS_SYSCTL, ~DTO_MASK, DTO_VAL);
129
//Clear Status register.
130
MmioWrite32 (MMCHS_STAT, 0xFFFFFFFF);
132
//Set command argument register
133
MmioWrite32 (MMCHS_ARG, CmdArgument);
135
//Enable interrupt enable events to occur
136
MmioWrite32 (MMCHS_IE, CmdInterruptEnableVal);
139
MmioWrite32 (MMCHS_CMD, Cmd);
141
//Check for the command status.
142
while (RetryCount < MAX_RETRY_COUNT) {
144
MmcStatus = MmioRead32 (MMCHS_STAT);
145
} while (MmcStatus == 0);
147
//Read status of command response
148
if ((MmcStatus & ERRI) != 0) {
150
//Perform soft-reset for mmci_cmd line.
151
MmioOr32 (MMCHS_SYSCTL, SRC);
152
while ((MmioRead32 (MMCHS_SYSCTL) & SRC));
154
DEBUG ((EFI_D_INFO, "MmcStatus: %x\n", MmcStatus));
155
return EFI_DEVICE_ERROR;
158
//Check if command is completed.
159
if ((MmcStatus & CC) == CC) {
160
MmioWrite32 (MMCHS_STAT, CC);
167
if (RetryCount == MAX_RETRY_COUNT) {
176
GetBlockInformation (
181
CSD_SDV2 *CsdSDV2Data;
184
if (gCardInfo.CardType == SD_CARD_2_HIGH) {
185
CsdSDV2Data = (CSD_SDV2 *)&gCardInfo.CSDData;
187
//Populate BlockSize.
188
*BlockSize = (0x1UL << CsdSDV2Data->READ_BL_LEN);
190
//Calculate Total number of blocks.
191
CardSize = CsdSDV2Data->C_SIZELow16 | (CsdSDV2Data->C_SIZEHigh6 << 2);
192
*NumBlocks = ((CardSize + 1) * 1024);
194
//Populate BlockSize.
195
*BlockSize = (0x1UL << gCardInfo.CSDData.READ_BL_LEN);
197
//Calculate Total number of blocks.
198
CardSize = gCardInfo.CSDData.C_SIZELow2 | (gCardInfo.CSDData.C_SIZEHigh10 << 2);
199
*NumBlocks = (CardSize + 1) * (1 << (gCardInfo.CSDData.C_SIZE_MULT + 2));
202
//For >=2G card, BlockSize may be 1K, but the transfer size is 512 bytes.
203
if (*BlockSize > 512) {
204
*NumBlocks = MultU64x32(*NumBlocks, *BlockSize/2);
208
DEBUG ((EFI_D_INFO, "Card type: %x, BlockSize: %x, NumBlocks: %x\n", gCardInfo.CardType, *BlockSize, *NumBlocks));
214
UINTN *ClockFrequencySelect
217
UINT8 MaxDataTransferRate;
218
UINTN TransferRateValue = 0;
219
UINTN TimeValue = 0 ;
222
MaxDataTransferRate = gCardInfo.CSDData.TRAN_SPEED;
224
// For SD Cards we would need to send CMD6 to set
225
// speeds abouve 25MHz. High Speed mode 50 MHz and up
227
//Calculate Transfer rate unit (Bits 2:0 of TRAN_SPEED)
228
switch (MaxDataTransferRate & 0x7) {
230
TransferRateValue = 100 * 1000;
234
TransferRateValue = 1 * 1000 * 1000;
238
TransferRateValue = 10 * 1000 * 1000;
242
TransferRateValue = 100 * 1000 * 1000;
246
DEBUG((EFI_D_ERROR, "Invalid parameter.\n"));
250
//Calculate Time value (Bits 6:3 of TRAN_SPEED)
251
switch ((MaxDataTransferRate >> 3) & 0xF) {
313
DEBUG((EFI_D_ERROR, "Invalid parameter.\n"));
317
Frequency = TransferRateValue * TimeValue/10;
319
//Calculate Clock divider value to program in MMCHS_SYSCTL[CLKD] field.
320
*ClockFrequencySelect = ((MMC_REFERENCE_CLK/Frequency) + 1);
322
DEBUG ((EFI_D_INFO, "MaxDataTransferRate: 0x%x, Frequency: %d KHz, ClockFrequencySelect: %x\n", MaxDataTransferRate, Frequency/1000, *ClockFrequencySelect));
327
GetCardConfigurationData (
333
UINTN ClockFrequencySelect;
335
//Calculate BlockSize and Total number of blocks in the detected card.
336
GetBlockInformation(&BlockSize, &NumBlocks);
337
gCardInfo.BlockSize = BlockSize;
338
gCardInfo.NumBlocks = NumBlocks;
340
//Calculate Card clock divider value.
341
CalculateCardCLKD(&ClockFrequencySelect);
342
gCardInfo.ClockFrequencySelect = ClockFrequencySelect;
354
//Select Device group to belong to P1 device group in Power IC.
356
Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VMMC1_DEV_GRP), 1, &Data);
357
ASSERT_EFI_ERROR(Status);
359
//Configure voltage regulator for MMC1 in Power IC to output 3.0 voltage.
361
Status = gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID4, VMMC1_DEDICATED_REG), 1, &Data);
362
ASSERT_EFI_ERROR(Status);
364
//After ramping up voltage, set VDDS stable bit to indicate that voltage level is stable.
365
MmioOr32 (CONTROL_PBIAS_LITE, (PBIASLITEVMODE0 | PBIASLITEPWRDNZ0 | PBIASSPEEDCTRL0 | PBIASLITEVMODE1 | PBIASLITEWRDNZ1));
368
MmioAndThenOr32 (GPIO1_BASE + GPIO_OE, ~BIT23, BIT23);
370
// Enable Card Detect
371
Data = CARD_DETECT_ENABLE;
372
gTPS65950->Write (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID2, TPS65950_GPIO_CTRL), 1, &Data);
380
PerformCardIdenfication (
385
UINTN CmdArgument = 0;
387
UINTN RetryCount = 0;
388
BOOLEAN SDCmd8Supported = FALSE;
391
MmioWrite32 (MMCHS_IE, (BADA_EN | CERR_EN | DEB_EN | DCRC_EN | DTO_EN | CIE_EN |
392
CEB_EN | CCRC_EN | CTO_EN | BRR_EN | BWR_EN | TC_EN | CC_EN));
394
//Controller INIT procedure start.
395
MmioOr32 (MMCHS_CON, INIT);
396
MmioWrite32 (MMCHS_CMD, 0x00000000);
397
while (!(MmioRead32 (MMCHS_STAT) & CC));
402
//Set CC bit to 0x1 to clear the flag
403
MmioOr32 (MMCHS_STAT, CC);
405
//Retry INIT procedure.
406
MmioWrite32 (MMCHS_CMD, 0x00000000);
407
while (!(MmioRead32 (MMCHS_STAT) & CC));
409
//End initialization sequence
410
MmioAnd32 (MMCHS_CON, ~INIT);
412
MmioOr32 (MMCHS_HCTL, (SDVS_3_0_V | DTW_1_BIT | SDBP_ON));
414
//Change clock frequency to 400KHz to fit protocol
415
UpdateMMCHSClkFrequency(CLKD_400KHZ);
417
MmioOr32 (MMCHS_CON, OD);
420
Status = SendCmd (CMD0, CMD0_INT_EN, CmdArgument);
421
if (EFI_ERROR(Status)) {
422
DEBUG ((EFI_D_ERROR, "Cmd0 fails.\n"));
426
DEBUG ((EFI_D_INFO, "CMD0 response: %x\n", MmioRead32 (MMCHS_RSP10)));
429
Status = SendCmd (CMD5, CMD5_INT_EN, CmdArgument);
430
if (Status == EFI_SUCCESS) {
431
DEBUG ((EFI_D_ERROR, "CMD5 Success. SDIO card. Follow SDIO card specification.\n"));
432
DEBUG ((EFI_D_INFO, "CMD5 response: %x\n", MmioRead32 (MMCHS_RSP10)));
433
//NOTE: Returning unsupported error for now. Need to implement SDIO specification.
434
return EFI_UNSUPPORTED;
436
DEBUG ((EFI_D_INFO, "CMD5 fails. Not an SDIO card.\n"));
439
MmioOr32 (MMCHS_SYSCTL, SRC);
441
while ((MmioRead32 (MMCHS_SYSCTL) & SRC));
443
//Send CMD8 command. (New v2.00 command for Voltage check)
444
//Only 2.7V - 3.6V is supported for SD2.0, only SD 2.0 card can pass.
445
//MMC & SD1.1 card will fail this command.
446
CmdArgument = CMD8_ARG;
447
Status = SendCmd (CMD8, CMD8_INT_EN, CmdArgument);
448
if (Status == EFI_SUCCESS) {
449
Response = MmioRead32 (MMCHS_RSP10);
450
DEBUG ((EFI_D_INFO, "CMD8 success. CMD8 response: %x\n", Response));
451
if (Response != CmdArgument) {
452
return EFI_DEVICE_ERROR;
454
DEBUG ((EFI_D_INFO, "Card is SD2.0\n"));
455
SDCmd8Supported = TRUE; //Supports high capacity.
457
DEBUG ((EFI_D_INFO, "CMD8 fails. Not an SD2.0 card.\n"));
460
MmioOr32 (MMCHS_SYSCTL, SRC);
462
while ((MmioRead32 (MMCHS_SYSCTL) & SRC));
464
//Poll till card is busy
465
while (RetryCount < MAX_RETRY_COUNT) {
466
//Send CMD55 command.
468
Status = SendCmd (CMD55, CMD55_INT_EN, CmdArgument);
469
if (Status == EFI_SUCCESS) {
470
DEBUG ((EFI_D_INFO, "CMD55 success. CMD55 response: %x\n", MmioRead32 (MMCHS_RSP10)));
471
gCardInfo.CardType = SD_CARD;
473
DEBUG ((EFI_D_INFO, "CMD55 fails.\n"));
474
gCardInfo.CardType = MMC_CARD;
477
//Send appropriate command for the card type which got detected.
478
if (gCardInfo.CardType == SD_CARD) {
479
CmdArgument = ((UINTN *) &(gCardInfo.OCRData))[0];
482
if (SDCmd8Supported) {
486
Status = SendCmd (ACMD41, ACMD41_INT_EN, CmdArgument);
487
if (EFI_ERROR(Status)) {
488
DEBUG ((EFI_D_INFO, "ACMD41 fails.\n"));
491
((UINT32 *) &(gCardInfo.OCRData))[0] = MmioRead32 (MMCHS_RSP10);
492
DEBUG ((EFI_D_INFO, "SD card detected. ACMD41 OCR: %x\n", ((UINT32 *) &(gCardInfo.OCRData))[0]));
493
} else if (gCardInfo.CardType == MMC_CARD) {
495
Status = SendCmd (CMD1, CMD1_INT_EN, CmdArgument);
496
if (EFI_ERROR(Status)) {
497
DEBUG ((EFI_D_INFO, "CMD1 fails.\n"));
500
Response = MmioRead32 (MMCHS_RSP10);
501
DEBUG ((EFI_D_INFO, "MMC card detected.. CMD1 response: %x\n", Response));
503
//NOTE: For now, I am skipping this since I only have an SD card.
504
//Compare card OCR and host OCR (Section 22.6.1.3.2.4)
505
return EFI_UNSUPPORTED; //For now, MMC is not supported.
508
//Poll the card until it is out of its power-up sequence.
509
if (gCardInfo.OCRData.Busy == 1) {
511
if (SDCmd8Supported) {
512
gCardInfo.CardType = SD_CARD_2;
515
//Card is ready. Check CCS (Card capacity status) bit (bit#30).
516
//SD 2.0 standard card will response with CCS 0, SD high capacity card will respond with CCS 1.
517
if (gCardInfo.OCRData.AccessMode & BIT1) {
518
gCardInfo.CardType = SD_CARD_2_HIGH;
519
DEBUG ((EFI_D_INFO, "High capacity card.\n"));
521
DEBUG ((EFI_D_INFO, "Standard capacity card.\n"));
531
if (RetryCount == MAX_RETRY_COUNT) {
532
DEBUG ((EFI_D_ERROR, "Timeout error. RetryCount: %d\n", RetryCount));
538
Status = SendCmd (CMD2, CMD2_INT_EN, CmdArgument);
539
if (EFI_ERROR(Status)) {
540
DEBUG ((EFI_D_ERROR, "CMD2 fails. Status: %x\n", Status));
544
DEBUG ((EFI_D_INFO, "CMD2 response: %x %x %x %x\n", MmioRead32 (MMCHS_RSP10), MmioRead32 (MMCHS_RSP32), MmioRead32 (MMCHS_RSP54), MmioRead32 (MMCHS_RSP76)));
546
//Parse CID register data.
547
ParseCardCIDData(MmioRead32 (MMCHS_RSP10), MmioRead32 (MMCHS_RSP32), MmioRead32 (MMCHS_RSP54), MmioRead32 (MMCHS_RSP76));
551
Status = SendCmd (CMD3, CMD3_INT_EN, CmdArgument);
552
if (EFI_ERROR(Status)) {
553
DEBUG ((EFI_D_ERROR, "CMD3 fails. Status: %x\n", Status));
557
//Set RCA for the detected card. RCA is CMD3 response.
558
gCardInfo.RCA = (MmioRead32 (MMCHS_RSP10) >> 16);
559
DEBUG ((EFI_D_INFO, "CMD3 response: RCA %x\n", gCardInfo.RCA));
561
//MMC Bus setting change after card identification.
562
MmioAnd32 (MMCHS_CON, ~OD);
563
MmioOr32 (MMCHS_HCTL, SDVS_3_0_V);
564
UpdateMMCHSClkFrequency(CLKD_400KHZ); //Set the clock frequency to 400KHz.
571
GetCardSpecificData (
578
//Send CMD9 to retrieve CSD.
579
CmdArgument = gCardInfo.RCA << 16;
580
Status = SendCmd (CMD9, CMD9_INT_EN, CmdArgument);
581
if (EFI_ERROR(Status)) {
582
DEBUG ((EFI_D_ERROR, "CMD9 fails. Status: %x\n", Status));
586
//Populate 128-bit CSD register data.
587
((UINT32 *)&(gCardInfo.CSDData))[0] = MmioRead32 (MMCHS_RSP10);
588
((UINT32 *)&(gCardInfo.CSDData))[1] = MmioRead32 (MMCHS_RSP32);
589
((UINT32 *)&(gCardInfo.CSDData))[2] = MmioRead32 (MMCHS_RSP54);
590
((UINT32 *)&(gCardInfo.CSDData))[3] = MmioRead32 (MMCHS_RSP76);
592
DEBUG ((EFI_D_INFO, "CMD9 response: %x %x %x %x\n", MmioRead32 (MMCHS_RSP10), MmioRead32 (MMCHS_RSP32), MmioRead32 (MMCHS_RSP54), MmioRead32 (MMCHS_RSP76)));
594
//Calculate total number of blocks and max. data transfer rate supported by the detected card.
595
GetCardConfigurationData();
602
PerformCardConfiguration (
606
UINTN CmdArgument = 0;
610
CmdArgument = gCardInfo.RCA << 16;
611
Status = SendCmd (CMD7, CMD7_INT_EN, CmdArgument);
612
if (EFI_ERROR(Status)) {
613
DEBUG ((EFI_D_ERROR, "CMD7 fails. Status: %x\n", Status));
617
if ((gCardInfo.CardType != UNKNOWN_CARD) && (gCardInfo.CardType != MMC_CARD)) {
618
// We could read SCR register, but SD Card Phys spec stats any SD Card shall
619
// set SCR.SD_BUS_WIDTHS to support 4-bit mode, so why bother?
621
// Send ACMD6 (application specific commands must be prefixed with CMD55)
622
Status = SendCmd (CMD55, CMD55_INT_EN, CmdArgument);
623
if (!EFI_ERROR (Status)) {
624
// set device into 4-bit data bus mode
625
Status = SendCmd (ACMD6, ACMD6_INT_EN, 0x2);
626
if (!EFI_ERROR (Status)) {
627
// Set host controler into 4-bit mode
628
MmioOr32 (MMCHS_HCTL, DTW_4_BIT);
629
DEBUG ((EFI_D_INFO, "SD Memory Card set to 4-bit mode\n"));
634
//Send CMD16 to set the block length
635
CmdArgument = gCardInfo.BlockSize;
636
Status = SendCmd (CMD16, CMD16_INT_EN, CmdArgument);
637
if (EFI_ERROR(Status)) {
638
DEBUG ((EFI_D_ERROR, "CMD16 fails. Status: %x\n", Status));
642
//Change MMCHS clock frequency to what detected card can support.
643
UpdateMMCHSClkFrequency(gCardInfo.ClockFrequencySelect);
651
IN EFI_BLOCK_IO_PROTOCOL *This,
656
UINTN *DataBuffer = Buffer;
657
UINTN DataSize = This->Media->BlockSize/4;
659
UINTN RetryCount = 0;
661
//Check controller status to make sure there is no error.
662
while (RetryCount < MAX_RETRY_COUNT) {
665
MmcStatus = MmioRead32 (MMCHS_STAT);
666
} while(MmcStatus == 0);
668
//Check if Buffer read ready (BRR) bit is set?
669
if (MmcStatus & BRR) {
672
MmioOr32 (MMCHS_STAT, BRR);
674
//Read block worth of data.
675
for (Count = 0; Count < DataSize; Count++) {
676
*DataBuffer++ = MmioRead32 (MMCHS_DATA);
683
if (RetryCount == MAX_RETRY_COUNT) {
693
IN EFI_BLOCK_IO_PROTOCOL *This,
698
UINTN *DataBuffer = Buffer;
699
UINTN DataSize = This->Media->BlockSize/4;
701
UINTN RetryCount = 0;
703
//Check controller status to make sure there is no error.
704
while (RetryCount < MAX_RETRY_COUNT) {
707
MmcStatus = MmioRead32 (MMCHS_STAT);
708
} while(MmcStatus == 0);
710
//Check if Buffer write ready (BWR) bit is set?
711
if (MmcStatus & BWR) {
714
MmioOr32 (MMCHS_STAT, BWR);
716
//Write block worth of data.
717
for (Count = 0; Count < DataSize; Count++) {
718
MmioWrite32 (MMCHS_DATA, *DataBuffer++);
726
if (RetryCount == MAX_RETRY_COUNT) {
735
IN EFI_BLOCK_IO_PROTOCOL *This,
739
IN OPERATION_TYPE OperationType
745
UINTN CmdInterruptEnable;
748
EFI_PHYSICAL_ADDRESS BufferAddress;
750
DMA_MAP_OPERATION DmaOperation;
751
EFI_STATUS MmcStatus;
752
UINTN RetryCount = 0;
755
// Map passed in buffer for DMA xfer
756
DmaSize = BlockCount * This->Media->BlockSize;
757
Status = DmaMap (DmaOperation, Buffer, &DmaSize, &BufferAddress, &BufferMap);
758
if (EFI_ERROR (Status)) {
762
ZeroMem (&DmaOperation, sizeof (DMA_MAP_OPERATION));
765
Dma4.DataType = 2; // DMA4_CSDPi[1:0] 32-bit elements from MMCHS_DATA
767
Dma4.SourceEndiansim = 0; // DMA4_CSDPi[21]
769
Dma4.DestinationEndianism = 0; // DMA4_CSDPi[19]
771
Dma4.SourcePacked = 0; // DMA4_CSDPi[6]
773
Dma4.DestinationPacked = 0; // DMA4_CSDPi[13]
775
Dma4.NumberOfElementPerFrame = This->Media->BlockSize/4; // DMA4_CENi (TRM 4K is optimum value)
777
Dma4.NumberOfFramePerTransferBlock = BlockCount; // DMA4_CFNi
779
Dma4.ReadPriority = 0; // DMA4_CCRi[6] Low priority read
781
Dma4.WritePriority = 0; // DMA4_CCRi[23] Prefetech disabled
784
//Populate the command information based on the operation type.
785
if (OperationType == READ) {
786
Cmd = CMD18; //Multiple block read
787
CmdInterruptEnable = CMD18_INT_EN;
788
DmaOperation = MapOperationBusMasterCommonBuffer;
790
Dma4.ReadPortAccessType =0 ; // DMA4_CSDPi[8:7] Can not burst MMCHS_DATA reg
792
Dma4.WritePortAccessType = 3; // DMA4_CSDPi[15:14] Memory burst 16x32
794
Dma4.WriteMode = 1; // DMA4_CSDPi[17:16] Write posted
798
Dma4.SourceStartAddress = MMCHS_DATA; // DMA4_CSSAi
800
Dma4.DestinationStartAddress = (UINT32)BufferAddress; // DMA4_CDSAi
802
Dma4.SourceElementIndex = 1; // DMA4_CSEi
804
Dma4.SourceFrameIndex = 0x200; // DMA4_CSFi
806
Dma4.DestinationElementIndex = 1; // DMA4_CDEi
808
Dma4.DestinationFrameIndex = 0; // DMA4_CDFi
812
Dma4.ReadPortAccessMode = 0; // DMA4_CCRi[13:12] Always read MMCHS_DATA
814
Dma4.WritePortAccessMode = 1; // DMA4_CCRi[15:14] Post increment memory address
816
Dma4.ReadRequestNumber = 0x1e; // DMA4_CCRi[4:0] Syncro with MMCA_DMA_RX (61)
818
Dma4.WriteRequestNumber = 1; // DMA4_CCRi[20:19] Syncro upper 0x3e == 62 (one based)
820
} else if (OperationType == WRITE) {
821
Cmd = CMD25; //Multiple block write
822
CmdInterruptEnable = CMD25_INT_EN;
823
DmaOperation = MapOperationBusMasterRead;
825
Dma4.ReadPortAccessType = 3; // DMA4_CSDPi[8:7] Memory burst 16x32
827
Dma4.WritePortAccessType = 0; // DMA4_CSDPi[15:14] Can not burst MMCHS_DATA reg
829
Dma4.WriteMode = 1; // DMA4_CSDPi[17:16] Write posted ???
833
Dma4.SourceStartAddress = (UINT32)BufferAddress; // DMA4_CSSAi
835
Dma4.DestinationStartAddress = MMCHS_DATA; // DMA4_CDSAi
837
Dma4.SourceElementIndex = 1; // DMA4_CSEi
839
Dma4.SourceFrameIndex = 0x200; // DMA4_CSFi
841
Dma4.DestinationElementIndex = 1; // DMA4_CDEi
843
Dma4.DestinationFrameIndex = 0; // DMA4_CDFi
847
Dma4.ReadPortAccessMode = 1; // DMA4_CCRi[13:12] Post increment memory address
849
Dma4.WritePortAccessMode = 0; // DMA4_CCRi[15:14] Always write MMCHS_DATA
851
Dma4.ReadRequestNumber = 0x1d; // DMA4_CCRi[4:0] Syncro with MMCA_DMA_TX (60)
853
Dma4.WriteRequestNumber = 1; // DMA4_CCRi[20:19] Syncro upper 0x3d == 61 (one based)
856
return EFI_INVALID_PARAMETER;
860
EnableDmaChannel (2, &Dma4);
863
//Set command argument based on the card access mode (Byte mode or Block mode)
864
if (gCardInfo.OCRData.AccessMode & BIT1) {
867
CmdArgument = Lba * This->Media->BlockSize;
871
Status = SendCmd (Cmd, CmdInterruptEnable, CmdArgument);
872
if (EFI_ERROR (Status)) {
873
DEBUG ((EFI_D_ERROR, "CMD fails. Status: %x\n", Status));
877
//Check for the Transfer completion.
878
while (RetryCount < MAX_RETRY_COUNT) {
881
MmcStatus = MmioRead32 (MMCHS_STAT);
882
} while (MmcStatus == 0);
884
//Check if Transfer complete (TC) bit is set?
885
if (MmcStatus & TC) {
888
DEBUG ((EFI_D_ERROR, "MmcStatus for TC: %x\n", MmcStatus));
889
//Check if DEB, DCRC or DTO interrupt occured.
890
if ((MmcStatus & DEB) | (MmcStatus & DCRC) | (MmcStatus & DTO)) {
891
//There was an error during the data transfer.
893
//Set SRD bit to 1 and wait until it return to 0x0.
894
MmioOr32 (MMCHS_SYSCTL, SRD);
895
while((MmioRead32 (MMCHS_SYSCTL) & SRD) != 0x0);
897
DisableDmaChannel (2, DMA4_CSR_BLOCK, DMA4_CSR_ERR);
898
DmaUnmap (BufferMap);
899
return EFI_DEVICE_ERROR;
905
DisableDmaChannel (2, DMA4_CSR_BLOCK, DMA4_CSR_ERR);
906
Status = DmaUnmap (BufferMap);
908
if (RetryCount == MAX_RETRY_COUNT) {
909
DEBUG ((EFI_D_ERROR, "TransferBlockData timed out.\n"));
919
IN EFI_BLOCK_IO_PROTOCOL *This,
922
IN OPERATION_TYPE OperationType
927
UINTN RetryCount = 0;
929
UINTN CmdInterruptEnable = 0;
930
UINTN CmdArgument = 0;
933
//Populate the command information based on the operation type.
934
if (OperationType == READ) {
935
Cmd = CMD17; //Single block read
936
CmdInterruptEnable = CMD18_INT_EN;
937
} else if (OperationType == WRITE) {
938
Cmd = CMD24; //Single block write
939
CmdInterruptEnable = CMD24_INT_EN;
942
//Set command argument based on the card access mode (Byte mode or Block mode)
943
if (gCardInfo.OCRData.AccessMode & BIT1) {
946
CmdArgument = Lba * This->Media->BlockSize;
950
Status = SendCmd (Cmd, CmdInterruptEnable, CmdArgument);
951
if (EFI_ERROR(Status)) {
952
DEBUG ((EFI_D_ERROR, "CMD fails. Status: %x\n", Status));
956
//Read or Write data.
957
if (OperationType == READ) {
958
Status = ReadBlockData (This, Buffer);
959
if (EFI_ERROR(Status)) {
960
DEBUG((EFI_D_ERROR, "ReadBlockData fails.\n"));
963
} else if (OperationType == WRITE) {
964
Status = WriteBlockData (This, Buffer);
965
if (EFI_ERROR(Status)) {
966
DEBUG((EFI_D_ERROR, "WriteBlockData fails.\n"));
971
//Check for the Transfer completion.
972
while (RetryCount < MAX_RETRY_COUNT) {
975
MmcStatus = MmioRead32 (MMCHS_STAT);
976
} while (MmcStatus == 0);
978
//Check if Transfer complete (TC) bit is set?
979
if (MmcStatus & TC) {
982
DEBUG ((EFI_D_ERROR, "MmcStatus for TC: %x\n", MmcStatus));
983
//Check if DEB, DCRC or DTO interrupt occured.
984
if ((MmcStatus & DEB) | (MmcStatus & DCRC) | (MmcStatus & DTO)) {
985
//There was an error during the data transfer.
987
//Set SRD bit to 1 and wait until it return to 0x0.
988
MmioOr32 (MMCHS_SYSCTL, SRD);
989
while((MmioRead32 (MMCHS_SYSCTL) & SRD) != 0x0);
991
return EFI_DEVICE_ERROR;
997
if (RetryCount == MAX_RETRY_COUNT) {
998
DEBUG ((EFI_D_ERROR, "TransferBlockData timed out.\n"));
1014
// Card detect is a GPIO0 on the TPS65950
1016
Status = gTPS65950->Read (gTPS65950, EXTERNAL_DEVICE_REGISTER(I2C_ADDR_GRP_ID2, GPIODATAIN1), 1, &Data);
1017
if (EFI_ERROR (Status)) {
1021
if ((Data & CARD_DETECT_BIT) == CARD_DETECT_BIT) {
1036
if (!CardPresent ()) {
1037
return EFI_NO_MEDIA;
1040
//Initialize MMC host controller clocks.
1041
Status = InitializeMMCHS ();
1042
if (EFI_ERROR(Status)) {
1043
DEBUG ((EFI_D_ERROR, "Initialize MMC host controller fails. Status: %x\n", Status));
1047
//Software reset of the MMCHS host controller.
1048
MmioWrite32 (MMCHS_SYSCONFIG, SOFTRESET);
1050
while ((MmioRead32 (MMCHS_SYSSTATUS) & RESETDONE_MASK) != RESETDONE);
1052
//Soft reset for all.
1053
MmioWrite32 (MMCHS_SYSCTL, SRA);
1055
while ((MmioRead32 (MMCHS_SYSCTL) & SRA) != 0x0);
1057
//Voltage capabilities initialization. Activate VS18 and VS30.
1058
MmioOr32 (MMCHS_CAPA, (VS30 | VS18));
1060
//Wakeup configuration
1061
MmioOr32 (MMCHS_SYSCONFIG, ENAWAKEUP);
1062
MmioOr32 (MMCHS_HCTL, IWE);
1064
//MMCHS Controller default initialization
1065
MmioOr32 (MMCHS_CON, (OD | DW8_1_4_BIT | CEATA_OFF));
1067
MmioWrite32 (MMCHS_HCTL, (SDVS_3_0_V | DTW_1_BIT | SDBP_OFF));
1069
//Enable internal clock
1070
MmioOr32 (MMCHS_SYSCTL, ICE);
1072
//Set the clock frequency to 80KHz.
1073
UpdateMMCHSClkFrequency (CLKD_80KHZ);
1075
//Enable SD bus power.
1076
MmioOr32 (MMCHS_HCTL, (SDBP_ON));
1078
//Poll till SD bus power bit is set.
1079
while ((MmioRead32 (MMCHS_HCTL) & SDBP_MASK) != SDBP_ON);
1082
Status = PerformCardIdenfication ();
1083
if (EFI_ERROR(Status)) {
1084
DEBUG ((EFI_D_ERROR, "No MMC/SD card detected.\n"));
1088
//Get CSD (Card specific data) for the detected card.
1089
Status = GetCardSpecificData();
1090
if (EFI_ERROR(Status)) {
1094
//Configure the card in data transfer mode.
1095
Status = PerformCardConfiguration();
1096
if (EFI_ERROR(Status)) {
1100
//Patch the Media structure.
1101
gMMCHSMedia.LastBlock = (gCardInfo.NumBlocks - 1);
1102
gMMCHSMedia.BlockSize = gCardInfo.BlockSize;
1103
gMMCHSMedia.ReadOnly = (MmioRead32 (GPIO1_BASE + GPIO_DATAIN) & BIT23) == BIT23;
1104
gMMCHSMedia.MediaPresent = TRUE;
1105
gMMCHSMedia.MediaId++;
1107
DEBUG ((EFI_D_INFO, "SD Card Media Change on Handle 0x%08x\n", gImageHandle));
1112
#define MAX_MMCHS_TRANSFER_SIZE 0x4000
1116
IN EFI_BLOCK_IO_PROTOCOL *This,
1119
IN UINTN BufferSize,
1120
IN OPERATION_TYPE OperationType
1123
EFI_STATUS Status = EFI_SUCCESS;
1124
UINTN RetryCount = 0;
1126
UINTN BytesToBeTranferedThisPass = 0;
1127
UINTN BytesRemainingToBeTransfered;
1138
Status = DetectCard ();
1139
if (EFI_ERROR (Status)) {
1140
// We detected a removal
1141
gMMCHSMedia.MediaPresent = FALSE;
1142
gMMCHSMedia.LastBlock = 0;
1143
gMMCHSMedia.BlockSize = 512; // Should be zero but there is a bug in DiskIo
1144
gMMCHSMedia.ReadOnly = FALSE;
1146
gMediaChange = FALSE;
1147
} else if (!gMMCHSMedia.MediaPresent) {
1148
Status = EFI_NO_MEDIA;
1153
DEBUG ((EFI_D_INFO, "SD Card ReinstallProtocolInterface ()\n"));
1154
gBS->ReinstallProtocolInterface (
1156
&gEfiBlockIoProtocolGuid,
1160
return EFI_MEDIA_CHANGED;
1163
if (EFI_ERROR (Status)) {
1167
if (Buffer == NULL) {
1168
Status = EFI_INVALID_PARAMETER;
1172
if (Lba > This->Media->LastBlock) {
1173
Status = EFI_INVALID_PARAMETER;
1177
if ((BufferSize % This->Media->BlockSize) != 0) {
1178
Status = EFI_BAD_BUFFER_SIZE;
1182
//Check if the data lines are not in use.
1183
while ((RetryCount++ < MAX_RETRY_COUNT) && ((MmioRead32 (MMCHS_PSTATE) & DATI_MASK) != DATI_ALLOWED));
1184
if (RetryCount == MAX_RETRY_COUNT) {
1185
Status = EFI_TIMEOUT;
1189
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
1191
BytesRemainingToBeTransfered = BufferSize;
1192
while (BytesRemainingToBeTransfered > 0) {
1195
Status = EFI_NO_MEDIA;
1196
DEBUG ((EFI_D_INFO, "SdReadWrite() EFI_NO_MEDIA due to gMediaChange\n"));
1197
goto DoneRestoreTPL;
1200
// Turn OFF DMA path until it is debugged
1201
// BytesToBeTranferedThisPass = (BytesToBeTranferedThisPass >= MAX_MMCHS_TRANSFER_SIZE) ? MAX_MMCHS_TRANSFER_SIZE : BytesRemainingToBeTransfered;
1202
BytesToBeTranferedThisPass = This->Media->BlockSize;
1204
BlockCount = BytesToBeTranferedThisPass/This->Media->BlockSize;
1206
if (BlockCount > 1) {
1207
Status = DmaBlocks (This, Lba, Buffer, BlockCount, OperationType);
1209
//Transfer a block worth of data.
1210
Status = TransferBlock (This, Lba, Buffer, OperationType);
1213
if (EFI_ERROR(Status)) {
1214
DEBUG ((EFI_D_ERROR, "TransferBlockData fails. %x\n", Status));
1215
goto DoneRestoreTPL;
1218
BytesRemainingToBeTransfered -= BytesToBeTranferedThisPass;
1220
Buffer = (UINT8 *)Buffer + This->Media->BlockSize;
1225
gBS->RestoreTPL (OldTpl);
1236
Reset the Block Device.
1240
@param This Indicates a pointer to the calling context.
1242
@param ExtendedVerification Driver may perform diagnostics on reset.
1246
@retval EFI_SUCCESS The device was reset.
1248
@retval EFI_DEVICE_ERROR The device is not functioning properly and could
1258
IN EFI_BLOCK_IO_PROTOCOL *This,
1259
IN BOOLEAN ExtendedVerification
1268
Read BufferSize bytes from Lba into Buffer.
1272
@param This Indicates a pointer to the calling context.
1274
@param MediaId Id of the media, changes every time the media is replaced.
1276
@param Lba The starting Logical Block Address to read from
1278
@param BufferSize Size of Buffer, must be a multiple of device block size.
1280
@param Buffer A pointer to the destination buffer for the data. The caller is
1282
responsible for either having implicit or explicit ownership of the buffer.
1286
@retval EFI_SUCCESS The data was read correctly from the device.
1288
@retval EFI_DEVICE_ERROR The device reported an error while performing the read.
1290
@retval EFI_NO_MEDIA There is no media in the device.
1292
@retval EFI_MEDIA_CHANGED The MediaId does not matched the current device.
1294
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
1296
@retval EFI_INVALID_PARAMETER The read request contains LBAs that are not valid,
1298
or the buffer is not on proper alignment.
1306
IN EFI_BLOCK_IO_PROTOCOL *This,
1309
IN UINTN BufferSize,
1315
//Perform Read operation.
1316
Status = SdReadWrite (This, (UINTN)Lba, Buffer, BufferSize, READ);
1325
Write BufferSize bytes from Lba into Buffer.
1329
@param This Indicates a pointer to the calling context.
1331
@param MediaId The media ID that the write request is for.
1333
@param Lba The starting logical block address to be written. The caller is
1335
responsible for writing to only legitimate locations.
1337
@param BufferSize Size of Buffer, must be a multiple of device block size.
1339
@param Buffer A pointer to the source buffer for the data.
1343
@retval EFI_SUCCESS The data was written correctly to the device.
1345
@retval EFI_WRITE_PROTECTED The device can not be written to.
1347
@retval EFI_DEVICE_ERROR The device reported an error while performing the write.
1349
@retval EFI_NO_MEDIA There is no media in the device.
1351
@retval EFI_MEDIA_CHNAGED The MediaId does not matched the current device.
1353
@retval EFI_BAD_BUFFER_SIZE The Buffer was not a multiple of the block size of the device.
1355
@retval EFI_INVALID_PARAMETER The write request contains LBAs that are not valid,
1357
or the buffer is not on proper alignment.
1365
IN EFI_BLOCK_IO_PROTOCOL *This,
1368
IN UINTN BufferSize,
1374
//Perform write operation.
1375
Status = SdReadWrite (This, (UINTN)Lba, Buffer, BufferSize, WRITE);
1385
Flush the Block Device.
1389
@param This Indicates a pointer to the calling context.
1393
@retval EFI_SUCCESS All outstanding data was written to the device
1395
@retval EFI_DEVICE_ERROR The device reported an error while writting back the data
1397
@retval EFI_NO_MEDIA There is no media in the device.
1405
IN EFI_BLOCK_IO_PROTOCOL *This
1412
EFI_BLOCK_IO_PROTOCOL gBlockIo = {
1413
EFI_BLOCK_IO_INTERFACE_REVISION, // Revision
1414
&gMMCHSMedia, // *Media
1415
MMCHSReset, // Reset
1416
MMCHSReadBlocks, // ReadBlocks
1417
MMCHSWriteBlocks, // WriteBlocks
1418
MMCHSFlushBlocks // FlushBlocks
1424
Timer callback to convert card present hardware into a boolean that indicates
1426
a media change event has happened. If you just check the GPIO you could see
1428
card 1 and then check again after card 1 was removed and card 2 was inserted
1430
and you would still see media present. Thus you need the timer tick to catch
1436
@param Event Event whose notification function is being invoked.
1438
@param Context The pointer to the notification function's context,
1440
which is implementation-dependent. Not used.
1454
Present = CardPresent ();
1455
if (gMMCHSMedia.MediaPresent) {
1456
if (!Present && !gMediaChange) {
1457
gMediaChange = TRUE;
1460
if (Present && !gMediaChange) {
1461
gMediaChange = TRUE;
1470
IN EFI_HANDLE ImageHandle,
1471
IN EFI_SYSTEM_TABLE *SystemTable
1476
Status = gBS->LocateProtocol (&gEmbeddedExternalDeviceProtocolGuid, NULL, (VOID **)&gTPS65950);
1477
ASSERT_EFI_ERROR(Status);
1479
ZeroMem (&gCardInfo, sizeof (CARD_INFO));
1481
Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, TimerCallback, NULL, &gTimerEvent);
1482
ASSERT_EFI_ERROR (Status);
1484
Status = gBS->SetTimer (gTimerEvent, TimerPeriodic, FixedPcdGet32 (PcdMmchsTimerFreq100NanoSeconds));
1485
ASSERT_EFI_ERROR (Status);
1488
Status = gBS->InstallMultipleProtocolInterfaces (
1490
&gEfiBlockIoProtocolGuid, &gBlockIo,
1491
&gEfiDevicePathProtocolGuid, &gMmcHsDevicePath,