34 DEBUG ((DEBUG_INFO,
" == Slot [%d] Capability is 0x%llx ==\n", Slot, *(UINT64 *)Capability));
35 DEBUG ((DEBUG_INFO,
" Timeout Clk Freq %d%a\n", Capability->TimeoutFreq, (Capability->TimeoutUnit) ?
"MHz" :
"KHz"));
36 DEBUG ((DEBUG_INFO,
" Base Clk Freq %dMHz\n", Capability->BaseClkFreq));
37 DEBUG ((DEBUG_INFO,
" Max Blk Len %dbytes\n", 512 * (1 << Capability->MaxBlkLen)));
38 DEBUG ((DEBUG_INFO,
" 8-bit Support %a\n", Capability->BusWidth8 ?
"TRUE" :
"FALSE"));
39 DEBUG ((DEBUG_INFO,
" ADMA2 Support %a\n", Capability->Adma2 ?
"TRUE" :
"FALSE"));
40 DEBUG ((DEBUG_INFO,
" HighSpeed Support %a\n", Capability->HighSpeed ?
"TRUE" :
"FALSE"));
41 DEBUG ((DEBUG_INFO,
" SDMA Support %a\n", Capability->Sdma ?
"TRUE" :
"FALSE"));
42 DEBUG ((DEBUG_INFO,
" Suspend/Resume %a\n", Capability->SuspRes ?
"TRUE" :
"FALSE"));
43 DEBUG ((DEBUG_INFO,
" Voltage 3.3 %a\n", Capability->Voltage33 ?
"TRUE" :
"FALSE"));
44 DEBUG ((DEBUG_INFO,
" Voltage 3.0 %a\n", Capability->Voltage30 ?
"TRUE" :
"FALSE"));
45 DEBUG ((DEBUG_INFO,
" Voltage 1.8 %a\n", Capability->Voltage18 ?
"TRUE" :
"FALSE"));
46 DEBUG ((DEBUG_INFO,
" V4 64-bit Sys Bus %a\n", Capability->SysBus64V4 ?
"TRUE" :
"FALSE"));
47 DEBUG ((DEBUG_INFO,
" V3 64-bit Sys Bus %a\n", Capability->SysBus64V3 ?
"TRUE" :
"FALSE"));
48 DEBUG ((DEBUG_INFO,
" Async Interrupt %a\n", Capability->AsyncInt ?
"TRUE" :
"FALSE"));
49 DEBUG ((DEBUG_INFO,
" SlotType "));
50 if (Capability->SlotType == 0x00) {
51 DEBUG ((DEBUG_INFO,
"%a\n",
"Removable Slot"));
52 }
else if (Capability->SlotType == 0x01) {
53 DEBUG ((DEBUG_INFO,
"%a\n",
"Embedded Slot"));
54 }
else if (Capability->SlotType == 0x02) {
55 DEBUG ((DEBUG_INFO,
"%a\n",
"Shared Bus Slot"));
57 DEBUG ((DEBUG_INFO,
"%a\n",
"Reserved"));
60 DEBUG ((DEBUG_INFO,
" SDR50 Support %a\n", Capability->Sdr50 ?
"TRUE" :
"FALSE"));
61 DEBUG ((DEBUG_INFO,
" SDR104 Support %a\n", Capability->Sdr104 ?
"TRUE" :
"FALSE"));
62 DEBUG ((DEBUG_INFO,
" DDR50 Support %a\n", Capability->Ddr50 ?
"TRUE" :
"FALSE"));
63 DEBUG ((DEBUG_INFO,
" UHS-II Support %a\n", Capability->UhsII ?
"TRUE" :
"FALSE"));
64 DEBUG ((DEBUG_INFO,
" Driver Type A %a\n", Capability->DriverTypeA ?
"TRUE" :
"FALSE"));
65 DEBUG ((DEBUG_INFO,
" Driver Type C %a\n", Capability->DriverTypeC ?
"TRUE" :
"FALSE"));
66 DEBUG ((DEBUG_INFO,
" Driver Type D %a\n", Capability->DriverTypeD ?
"TRUE" :
"FALSE"));
67 DEBUG ((DEBUG_INFO,
" Driver Type 4 %a\n", Capability->DriverType4 ?
"TRUE" :
"FALSE"));
68 if (Capability->TimerCount == 0) {
69 DEBUG ((DEBUG_INFO,
" Retuning TimerCnt Disabled\n"));
71 DEBUG ((DEBUG_INFO,
" Retuning TimerCnt %dseconds\n", 2 * (Capability->TimerCount - 1)));
74 DEBUG ((DEBUG_INFO,
" SDR50 Tuning %a\n", Capability->TuningSDR50 ?
"TRUE" :
"FALSE"));
75 DEBUG ((DEBUG_INFO,
" Retuning Mode Mode %d\n", Capability->RetuningMod + 1));
76 DEBUG ((DEBUG_INFO,
" Clock Multiplier M = %d\n", Capability->ClkMultiplier + 1));
77 DEBUG ((DEBUG_INFO,
" ADMA3 Support %a\n", Capability->Adma3 ?
"TRUE" :
"FALSE"));
78 DEBUG ((DEBUG_INFO,
" 1.8V VDD2 %a\n", Capability->Vdd2Voltage18 ?
"TRUE" :
"FALSE"));
79 DEBUG ((DEBUG_INFO,
" HS 400 %a\n", Capability->Hs400 ?
"TRUE" :
"FALSE"));
105 Status = PciIo->Pci.Read (
108 SD_MMC_HC_SLOT_OFFSET,
112 if (EFI_ERROR (Status)) {
116 *FirstBar = SlotInfo.FirstBar;
117 *SlotNum = SlotInfo.SlotNum + 1;
118 ASSERT ((*FirstBar + *SlotNum) < SD_MMC_HC_MAX_SLOT);
159 if ((PciIo ==
NULL) || (Data ==
NULL)) {
160 return EFI_INVALID_PARAMETER;
165 Width = EfiPciIoWidthUint8;
168 Width = EfiPciIoWidthUint16;
172 Width = EfiPciIoWidthUint32;
176 Width = EfiPciIoWidthUint32;
180 return EFI_INVALID_PARAMETER;
184 Status = PciIo->Mem.Read (
193 Status = PciIo->Mem.Write (
242 if (EFI_ERROR (Status)) {
247 Or = *(UINT8 *)OrData;
248 }
else if (Count == 2) {
249 Or = *(UINT16 *)OrData;
250 }
else if (Count == 4) {
251 Or = *(UINT32 *)OrData;
252 }
else if (Count == 8) {
253 Or = *(UINT64 *)OrData;
255 return EFI_INVALID_PARAMETER;
300 if (EFI_ERROR (Status)) {
305 And = *(UINT8 *)AndData;
306 }
else if (Count == 2) {
307 And = *(UINT16 *)AndData;
308 }
else if (Count == 4) {
309 And = *(UINT32 *)AndData;
310 }
else if (Count == 8) {
311 And = *(UINT64 *)AndData;
313 return EFI_INVALID_PARAMETER;
360 if (EFI_ERROR (Status)) {
366 if (Value == TestValue) {
370 return EFI_NOT_READY;
408 BOOLEAN InfiniteWait;
413 InfiniteWait =
FALSE;
416 while (InfiniteWait || (Timeout > 0)) {
425 if (Status != EFI_NOT_READY) {
460 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_CTRL_VER,
TRUE,
sizeof (UINT16), Version);
461 if (EFI_ERROR (Status)) {
494 if ((mOverride !=
NULL) && (mOverride->NotifyPhase !=
NULL)) {
495 Status = mOverride->NotifyPhase (
496 Private->ControllerHandle,
501 if (EFI_ERROR (Status)) {
504 "%a: SD/MMC pre reset notifier callback failed - %r\n",
512 PciIo = Private->PciIo;
514 Status =
SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_SW_RST,
sizeof (SwReset), &SwReset);
516 if (EFI_ERROR (Status)) {
517 DEBUG ((DEBUG_ERROR,
"SdMmcHcReset: write SW Reset for All fails: %r\n", Status));
528 SD_MMC_HC_GENERIC_TIMEOUT
530 if (EFI_ERROR (Status)) {
531 DEBUG ((DEBUG_INFO,
"SdMmcHcReset: reset done with %r\n", Status));
539 if (EFI_ERROR (Status)) {
542 "SdMmcHcReset: SdMmcHcEnableInterrupt done with %r\n",
552 if ((mOverride !=
NULL) && (mOverride->NotifyPhase !=
NULL)) {
553 Status = mOverride->NotifyPhase (
554 Private->ControllerHandle,
559 if (EFI_ERROR (Status)) {
562 "%a: SD/MMC post reset notifier callback failed - %r\n",
596 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_ERR_INT_STS_EN,
FALSE,
sizeof (IntStatus), &IntStatus);
597 if (EFI_ERROR (Status)) {
605 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_NOR_INT_STS_EN,
FALSE,
sizeof (IntStatus), &IntStatus);
632 if (EFI_ERROR (Status)) {
636 CopyMem (Capability, &Cap,
sizeof (Cap));
656 OUT UINT64 *MaxCurrent
661 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_MAX_CURRENT_CAP,
TRUE,
sizeof (UINT64), MaxCurrent);
685 OUT BOOLEAN *MediaPresent
695 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_PRESENT_STATE,
TRUE,
sizeof (PresentState), &PresentState);
696 if (EFI_ERROR (Status)) {
700 if ((PresentState & BIT16) != 0) {
701 *MediaPresent =
TRUE;
703 *MediaPresent =
FALSE;
709 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_NOR_INT_STS,
TRUE,
sizeof (Data), &Data);
710 if (EFI_ERROR (Status)) {
714 if ((Data & (BIT6 | BIT7)) != 0) {
719 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_NOR_INT_STS,
FALSE,
sizeof (Data), &Data);
720 if (EFI_ERROR (Status)) {
724 return EFI_MEDIA_CHANGED;
760 SD_MMC_HC_PRESENT_STATE,
761 sizeof (PresentState),
764 SD_MMC_HC_GENERIC_TIMEOUT
766 if (EFI_ERROR (Status)) {
773 ClockCtrl = (UINT16) ~BIT2;
774 Status =
SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_CLOCK_CTRL,
sizeof (ClockCtrl), &ClockCtrl);
800 return SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_CLOCK_CTRL,
sizeof (ClockCtrl), &ClockCtrl);
822 IN SD_MMC_BUS_MODE BusTiming,
823 IN BOOLEAN FirstTimeSetup,
833 UINT16 ControllerVer;
836 PciIo = Private->PciIo;
837 BaseClkFreq = Private->BaseClkFreq[Slot];
838 ControllerVer = Private->ControllerVersion[Slot];
840 if ((BaseClkFreq == 0) || (ClockFreq == 0)) {
841 return EFI_INVALID_PARAMETER;
844 if (ClockFreq > (BaseClkFreq * 1000)) {
845 ClockFreq = BaseClkFreq * 1000;
852 SettingFreq = BaseClkFreq * 1000;
853 while (ClockFreq < SettingFreq) {
856 SettingFreq = (BaseClkFreq * 1000) / (2 * Divisor);
857 Remainder = (BaseClkFreq * 1000) % (2 * Divisor);
858 if ((ClockFreq == SettingFreq) && (Remainder == 0)) {
862 if ((ClockFreq == SettingFreq) && (Remainder != 0)) {
867 DEBUG ((DEBUG_INFO,
"BaseClkFreq %dMHz Divisor %d ClockFreq %dKhz\n", BaseClkFreq, Divisor, ClockFreq));
872 if ((ControllerVer >= SD_MMC_HC_CTRL_VER_300) &&
873 (ControllerVer <= SD_MMC_HC_CTRL_VER_420))
875 ASSERT (Divisor <= 0x3FF);
876 ClockCtrl = ((Divisor & 0xFF) << 8) | ((Divisor & 0x300) >> 2);
877 }
else if ((ControllerVer == SD_MMC_HC_CTRL_VER_100) ||
878 (ControllerVer == SD_MMC_HC_CTRL_VER_200))
883 if (((Divisor - 1) & Divisor) != 0) {
887 ASSERT (Divisor <= 0x80);
888 ClockCtrl = (Divisor & 0xFF) << 8;
890 DEBUG ((DEBUG_ERROR,
"Unknown SD Host Controller Spec version [0x%x]!!!\n", ControllerVer));
891 return EFI_UNSUPPORTED;
898 if (EFI_ERROR (Status)) {
906 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_CLOCK_CTRL,
FALSE,
sizeof (ClockCtrl), &ClockCtrl);
907 if (EFI_ERROR (Status)) {
908 DEBUG ((DEBUG_ERROR,
"Set SDCLK Frequency Select and Internal Clock Enable fields fails\n"));
918 SD_MMC_HC_CLOCK_CTRL,
922 SD_MMC_HC_GENERIC_TIMEOUT
924 if (EFI_ERROR (Status)) {
929 if (EFI_ERROR (Status)) {
938 if (!FirstTimeSetup && (mOverride !=
NULL) && (mOverride->NotifyPhase !=
NULL)) {
939 Status = mOverride->NotifyPhase (
940 Private->ControllerHandle,
942 EdkiiSdMmcSwitchClockFreqPost,
945 if (EFI_ERROR (Status)) {
948 "%a: SD/MMC switch clock freq post notifier callback failed - %r\n",
956 Private->Slot[Slot].CurrentFreq = ClockFreq;
986 PowerCtrl &= (UINT8) ~BIT0;
987 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_POWER_CTRL,
FALSE,
sizeof (PowerCtrl), &PowerCtrl);
988 if (EFI_ERROR (Status)) {
996 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_POWER_CTRL,
FALSE,
sizeof (PowerCtrl), &PowerCtrl);
1024 if (BusWidth == 1) {
1025 HostCtrl1 = (UINT8) ~(BIT5 | BIT1);
1026 Status =
SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
sizeof (HostCtrl1), &HostCtrl1);
1027 }
else if (BusWidth == 4) {
1028 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
TRUE,
sizeof (HostCtrl1), &HostCtrl1);
1029 if (EFI_ERROR (Status)) {
1034 HostCtrl1 &= (UINT8) ~BIT5;
1035 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
FALSE,
sizeof (HostCtrl1), &HostCtrl1);
1036 }
else if (BusWidth == 8) {
1037 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
TRUE,
sizeof (HostCtrl1), &HostCtrl1);
1038 if (EFI_ERROR (Status)) {
1042 HostCtrl1 &= (UINT8) ~BIT1;
1044 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
FALSE,
sizeof (HostCtrl1), &HostCtrl1);
1047 return EFI_INVALID_PARAMETER;
1069 IN UINT16 ControllerVer
1078 if (ControllerVer >= SD_MMC_HC_CTRL_VER_400) {
1079 HostCtrl2 = SD_MMC_HC_V4_EN;
1083 if (ControllerVer == SD_MMC_HC_CTRL_VER_400) {
1087 if (Capability.SysBus64V3 != 0) {
1088 HostCtrl2 |= SD_MMC_HC_64_ADDR_EN;
1089 DEBUG ((DEBUG_INFO,
"Enabled V4 64 bit system bus support\n"));
1095 else if (ControllerVer >= SD_MMC_HC_CTRL_VER_410) {
1099 if (Capability.SysBus64V4 != 0) {
1100 HostCtrl2 |= SD_MMC_HC_64_ADDR_EN;
1101 DEBUG ((DEBUG_INFO,
"Enabled V4 64 bit system bus support\n"));
1104 HostCtrl2 |= SD_MMC_HC_26_DATA_LEN_ADMA_EN;
1105 DEBUG ((DEBUG_INFO,
"Enabled V4 26 bit data length ADMA support\n"));
1108 Status =
SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2,
sizeof (HostCtrl2), &HostCtrl2);
1109 if (EFI_ERROR (Status)) {
1144 if (Capability.Voltage33 != 0) {
1149 }
else if (Capability.Voltage30 != 0) {
1154 }
else if (Capability.Voltage18 != 0) {
1160 Status =
SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2,
sizeof (HostCtrl2), &HostCtrl2);
1162 if (EFI_ERROR (Status)) {
1167 return EFI_DEVICE_ERROR;
1200 Status =
SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_TIMEOUT_CTRL,
FALSE,
sizeof (Timeout), &Timeout);
1230 if ((mOverride !=
NULL) && (mOverride->NotifyPhase !=
NULL)) {
1231 Status = mOverride->NotifyPhase (
1232 Private->ControllerHandle,
1234 EdkiiSdMmcInitHostPre,
1237 if (EFI_ERROR (Status)) {
1240 "%a: SD/MMC pre init notifier callback failed - %r\n",
1248 PciIo = Private->PciIo;
1249 Capability = Private->Capability[Slot];
1252 if (EFI_ERROR (Status)) {
1264 if (EFI_ERROR (Status)) {
1269 if (EFI_ERROR (Status)) {
1274 if (EFI_ERROR (Status)) {
1282 if ((mOverride !=
NULL) && (mOverride->NotifyPhase !=
NULL)) {
1283 Status = mOverride->NotifyPhase (
1284 Private->ControllerHandle,
1286 EdkiiSdMmcInitHostPost,
1289 if (EFI_ERROR (Status)) {
1292 "%a: SD/MMC post init notifier callback failed - %r\n",
1318 IN SD_MMC_BUS_MODE Timing
1324 HostCtrl2 = (UINT8) ~SD_MMC_HC_CTRL_UHS_MASK;
1325 Status =
SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2,
sizeof (HostCtrl2), &HostCtrl2);
1326 if (EFI_ERROR (Status)) {
1332 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR12;
1335 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR25;
1338 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR50;
1340 case SdMmcUhsSdr104:
1341 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR104;
1344 HostCtrl2 = SD_MMC_HC_CTRL_UHS_DDR50;
1346 case SdMmcMmcLegacy:
1347 HostCtrl2 = SD_MMC_HC_CTRL_MMC_LEGACY;
1350 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS_SDR;
1353 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS_DDR;
1356 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS200;
1359 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS400;
1366 Status =
SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2,
sizeof (HostCtrl2), &HostCtrl2);
1367 if (EFI_ERROR (Status)) {
1371 if ((mOverride !=
NULL) && (mOverride->NotifyPhase !=
NULL)) {
1372 Status = mOverride->NotifyPhase (
1375 EdkiiSdMmcUhsSignaling,
1378 if (EFI_ERROR (Status)) {
1381 "%a: SD/MMC uhs signaling notifier callback failed - %r\n",
1406 IN SD_DRIVER_STRENGTH_TYPE DriverStrength
1412 if (DriverStrength == SdDriverStrengthIgnore) {
1416 HostCtrl2 = (UINT16) ~SD_MMC_HC_CTRL_DRIVER_STRENGTH_MASK;
1417 Status =
SdMmcHcAndMmio (PciIo, SlotIndex, SD_MMC_HC_HOST_CTRL2,
sizeof (HostCtrl2), &HostCtrl2);
1418 if (EFI_ERROR (Status)) {
1422 HostCtrl2 = (DriverStrength << 4) & SD_MMC_HC_CTRL_DRIVER_STRENGTH_MASK;
1423 return SdMmcHcOrMmio (PciIo, SlotIndex, SD_MMC_HC_HOST_CTRL2,
sizeof (HostCtrl2), &HostCtrl2);
1449 Status =
SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
sizeof (HostCtrl1), &HostCtrl1);
1451 HostCtrl1 = (UINT8) ~BIT0;
1452 Status =
SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1,
sizeof (HostCtrl1), &HostCtrl1);
1473 IN UINT16 ControllerVer
1486 UINT32 AdmaMaxDataPerLine;
1490 AdmaMaxDataPerLine = ADMA_MAX_DATA_PER_LINE_16B;
1494 Data = Trb->DataPhy;
1495 DataLen = Trb->DataLen;
1496 PciIo = Trb->Private->PciIo;
1501 if ((Trb->Mode == SdMmcAdma32bMode) &&
1502 ((Data >= 0x100000000ul) || ((Data + DataLen) > 0x100000000ul)))
1504 return EFI_INVALID_PARAMETER;
1510 if (Trb->Mode != SdMmcAdma32bMode) {
1514 if ((Data & (BIT0 | BIT1 | BIT2)) != 0) {
1515 DEBUG ((DEBUG_INFO,
"The buffer [0x%x] to construct ADMA desc is not aligned to 8 bytes boundary!\n", Data));
1521 if ((Data & (BIT0 | BIT1)) != 0) {
1522 DEBUG ((DEBUG_INFO,
"The buffer [0x%x] to construct ADMA desc is not aligned to 4 bytes boundary!\n", Data));
1529 if (Trb->Mode == SdMmcAdma64bV3Mode) {
1531 }
else if (Trb->Mode == SdMmcAdma64bV4Mode) {
1538 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1539 AdmaMaxDataPerLine = ADMA_MAX_DATA_PER_LINE_26B;
1542 Entries =
DivU64x32 ((DataLen + AdmaMaxDataPerLine - 1), AdmaMaxDataPerLine);
1545 Status = PciIo->AllocateBuffer (
1553 if (EFI_ERROR (Status)) {
1554 return EFI_OUT_OF_RESOURCES;
1557 ZeroMem (AdmaDesc, TableSize);
1559 Status = PciIo->Map (
1568 if (EFI_ERROR (Status) || (Bytes != TableSize)) {
1577 return EFI_OUT_OF_RESOURCES;
1580 if ((Trb->Mode == SdMmcAdma32bMode) &&
1581 ((UINT64)(
UINTN)Trb->AdmaDescPhy > 0x100000000ul))
1590 Trb->AdmaMap =
NULL;
1597 return EFI_DEVICE_ERROR;
1600 Remaining = DataLen;
1602 if (Trb->Mode == SdMmcAdma32bMode) {
1603 Trb->Adma32Desc = AdmaDesc;
1604 }
else if (Trb->Mode == SdMmcAdma64bV3Mode) {
1605 Trb->Adma64V3Desc = AdmaDesc;
1607 Trb->Adma64V4Desc = AdmaDesc;
1610 for (Index = 0; Index < Entries; Index++) {
1611 if (Trb->Mode == SdMmcAdma32bMode) {
1612 if (Remaining <= AdmaMaxDataPerLine) {
1613 Trb->Adma32Desc[Index].Valid = 1;
1614 Trb->Adma32Desc[Index].Act = 2;
1615 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1616 Trb->Adma32Desc[Index].UpperLength = (UINT16)
RShiftU64 (Remaining, 16);
1619 Trb->Adma32Desc[Index].LowerLength = (UINT16)(Remaining & MAX_UINT16);
1620 Trb->Adma32Desc[Index].Address = (UINT32)Address;
1623 Trb->Adma32Desc[Index].Valid = 1;
1624 Trb->Adma32Desc[Index].Act = 2;
1625 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1626 Trb->Adma32Desc[Index].UpperLength = 0;
1629 Trb->Adma32Desc[Index].LowerLength = 0;
1630 Trb->Adma32Desc[Index].Address = (UINT32)Address;
1632 }
else if (Trb->Mode == SdMmcAdma64bV3Mode) {
1633 if (Remaining <= AdmaMaxDataPerLine) {
1634 Trb->Adma64V3Desc[Index].Valid = 1;
1635 Trb->Adma64V3Desc[Index].Act = 2;
1636 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1637 Trb->Adma64V3Desc[Index].UpperLength = (UINT16)
RShiftU64 (Remaining, 16);
1640 Trb->Adma64V3Desc[Index].LowerLength = (UINT16)(Remaining & MAX_UINT16);
1641 Trb->Adma64V3Desc[Index].LowerAddress = (UINT32)Address;
1642 Trb->Adma64V3Desc[Index].UpperAddress = (UINT32)
RShiftU64 (Address, 32);
1645 Trb->Adma64V3Desc[Index].Valid = 1;
1646 Trb->Adma64V3Desc[Index].Act = 2;
1647 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1648 Trb->Adma64V3Desc[Index].UpperLength = 0;
1651 Trb->Adma64V3Desc[Index].LowerLength = 0;
1652 Trb->Adma64V3Desc[Index].LowerAddress = (UINT32)Address;
1653 Trb->Adma64V3Desc[Index].UpperAddress = (UINT32)
RShiftU64 (Address, 32);
1656 if (Remaining <= AdmaMaxDataPerLine) {
1657 Trb->Adma64V4Desc[Index].Valid = 1;
1658 Trb->Adma64V4Desc[Index].Act = 2;
1659 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1660 Trb->Adma64V4Desc[Index].UpperLength = (UINT16)
RShiftU64 (Remaining, 16);
1663 Trb->Adma64V4Desc[Index].LowerLength = (UINT16)(Remaining & MAX_UINT16);
1664 Trb->Adma64V4Desc[Index].LowerAddress = (UINT32)Address;
1665 Trb->Adma64V4Desc[Index].UpperAddress = (UINT32)
RShiftU64 (Address, 32);
1668 Trb->Adma64V4Desc[Index].Valid = 1;
1669 Trb->Adma64V4Desc[Index].Act = 2;
1670 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1671 Trb->Adma64V4Desc[Index].UpperLength = 0;
1674 Trb->Adma64V4Desc[Index].LowerLength = 0;
1675 Trb->Adma64V4Desc[Index].LowerAddress = (UINT32)Address;
1676 Trb->Adma64V4Desc[Index].UpperAddress = (UINT32)
RShiftU64 (Address, 32);
1680 Remaining -= AdmaMaxDataPerLine;
1681 Address += AdmaMaxDataPerLine;
1687 if (Trb->Mode == SdMmcAdma32bMode) {
1688 Trb->Adma32Desc[Index].End = 1;
1689 }
else if (Trb->Mode == SdMmcAdma64bV3Mode) {
1690 Trb->Adma64V3Desc[Index].End = 1;
1692 Trb->Adma64V4Desc[Index].End = 1;
1706 IN UINT32 DebugLevel,
1710 if (Packet ==
NULL) {
1714 DEBUG ((DebugLevel,
"Printing EFI_SD_MMC_PASS_THRU_COMMAND_PACKET\n"));
1715 if (Packet->SdMmcCmdBlk !=
NULL) {
1716 DEBUG ((DebugLevel,
"Command index: %d, argument: %X\n", Packet->SdMmcCmdBlk->CommandIndex, Packet->SdMmcCmdBlk->CommandArgument));
1717 DEBUG ((DebugLevel,
"Command type: %d, response type: %d\n", Packet->SdMmcCmdBlk->CommandType, Packet->SdMmcCmdBlk->ResponseType));
1720 if (Packet->SdMmcStatusBlk !=
NULL) {
1723 "Response 0: %X, 1: %X, 2: %X, 3: %X\n",
1724 Packet->SdMmcStatusBlk->Resp0,
1725 Packet->SdMmcStatusBlk->Resp1,
1726 Packet->SdMmcStatusBlk->Resp2,
1727 Packet->SdMmcStatusBlk->Resp3
1731 DEBUG ((DebugLevel,
"Timeout: %ld\n", Packet->Timeout));
1732 DEBUG ((DebugLevel,
"InDataBuffer: %p\n", Packet->InDataBuffer));
1733 DEBUG ((DebugLevel,
"OutDataBuffer: %p\n", Packet->OutDataBuffer));
1734 DEBUG ((DebugLevel,
"InTransferLength: %d\n", Packet->InTransferLength));
1735 DEBUG ((DebugLevel,
"OutTransferLength: %d\n", Packet->OutTransferLength));
1736 DEBUG ((DebugLevel,
"TransactionStatus: %r\n", Packet->TransactionStatus));
1747 IN UINT32 DebugLevel,
1755 DEBUG ((DebugLevel,
"Printing SD_MMC_HC_TRB\n"));
1756 DEBUG ((DebugLevel,
"Slot: %d\n", Trb->Slot));
1757 DEBUG ((DebugLevel,
"BlockSize: %d\n", Trb->BlockSize));
1758 DEBUG ((DebugLevel,
"Data: %p\n", Trb->Data));
1759 DEBUG ((DebugLevel,
"DataLen: %d\n", Trb->DataLen));
1760 DEBUG ((DebugLevel,
"Read: %d\n", Trb->Read));
1761 DEBUG ((DebugLevel,
"DataPhy: %lX\n", Trb->DataPhy));
1762 DEBUG ((DebugLevel,
"DataMap: %p\n", Trb->DataMap));
1763 DEBUG ((DebugLevel,
"Mode: %d\n", Trb->Mode));
1764 DEBUG ((DebugLevel,
"AdmaLengthMode: %d\n", Trb->AdmaLengthMode));
1765 DEBUG ((DebugLevel,
"Event: %p\n", Trb->Event));
1766 DEBUG ((DebugLevel,
"Started: %d\n", Trb->Started));
1767 DEBUG ((DebugLevel,
"CommandComplete: %d\n", Trb->CommandComplete));
1768 DEBUG ((DebugLevel,
"Timeout: %ld\n", Trb->Timeout));
1769 DEBUG ((DebugLevel,
"Retries: %d\n", Trb->Retries));
1770 DEBUG ((DebugLevel,
"PioModeTransferCompleted: %d\n", Trb->PioModeTransferCompleted));
1771 DEBUG ((DebugLevel,
"PioBlockIndex: %d\n", Trb->PioBlockIndex));
1772 DEBUG ((DebugLevel,
"Adma32Desc: %p\n", Trb->Adma32Desc));
1773 DEBUG ((DebugLevel,
"Adma64V3Desc: %p\n", Trb->Adma64V3Desc));
1774 DEBUG ((DebugLevel,
"Adma64V4Desc: %p\n", Trb->Adma64V4Desc));
1775 DEBUG ((DebugLevel,
"AdmaMap: %p\n", Trb->AdmaMap));
1776 DEBUG ((DebugLevel,
"AdmaPages: %X\n", Trb->AdmaPages));
1809 PciIo = Private->PciIo;
1810 if ((Trb->Data !=
NULL) && (Trb->DataLen != 0)) {
1811 MapLength = Trb->DataLen;
1812 Status = PciIo->Map (
1820 if (EFI_ERROR (Status) || (Trb->DataLen != MapLength)) {
1821 return EFI_BAD_BUFFER_SIZE;
1825 if ((Trb->Mode == SdMmcAdma32bMode) ||
1826 (Trb->Mode == SdMmcAdma64bV3Mode) ||
1827 (Trb->Mode == SdMmcAdma64bV4Mode))
1830 if (EFI_ERROR (Status)) {
1868 Trb->Signature = SD_MMC_HC_TRB_SIG;
1870 Trb->BlockSize = 0x200;
1871 Trb->Packet = Packet;
1873 Trb->Started =
FALSE;
1874 Trb->CommandComplete =
FALSE;
1875 Trb->Timeout = Packet->Timeout;
1876 Trb->Retries = SD_MMC_TRB_RETRIES;
1877 Trb->PioModeTransferCompleted =
FALSE;
1878 Trb->PioBlockIndex = 0;
1879 Trb->Private = Private;
1881 if ((Packet->InTransferLength != 0) && (Packet->InDataBuffer !=
NULL)) {
1882 Trb->Data = Packet->InDataBuffer;
1883 Trb->DataLen = Packet->InTransferLength;
1885 }
else if ((Packet->OutTransferLength != 0) && (Packet->OutDataBuffer !=
NULL)) {
1886 Trb->Data = Packet->OutDataBuffer;
1887 Trb->DataLen = Packet->OutTransferLength;
1889 }
else if ((Packet->InTransferLength == 0) && (Packet->OutTransferLength == 0)) {
1896 if ((Trb->DataLen != 0) && (Trb->DataLen < Trb->BlockSize)) {
1897 Trb->BlockSize = (UINT16)Trb->DataLen;
1900 if (((Private->Slot[Trb->Slot].CardType == EmmcCardType) &&
1901 (Packet->SdMmcCmdBlk->CommandIndex == EMMC_SEND_TUNING_BLOCK)) ||
1902 ((Private->Slot[Trb->Slot].CardType == SdCardType) &&
1903 (Packet->SdMmcCmdBlk->CommandIndex == SD_SEND_TUNING_BLOCK)))
1905 Trb->Mode = SdMmcPioMode;
1907 if (Trb->DataLen == 0) {
1908 Trb->Mode = SdMmcNoData;
1909 }
else if (Private->Capability[Slot].Adma2 != 0) {
1910 Trb->Mode = SdMmcAdma32bMode;
1911 Trb->AdmaLengthMode = SdMmcAdmaLen16b;
1912 if ((Private->ControllerVersion[Slot] == SD_MMC_HC_CTRL_VER_300) &&
1913 (Private->Capability[Slot].SysBus64V3 == 1))
1915 Trb->Mode = SdMmcAdma64bV3Mode;
1916 }
else if (((Private->ControllerVersion[Slot] == SD_MMC_HC_CTRL_VER_400) &&
1917 (Private->Capability[Slot].SysBus64V3 == 1)) ||
1918 ((Private->ControllerVersion[Slot] >= SD_MMC_HC_CTRL_VER_410) &&
1919 (Private->Capability[Slot].SysBus64V4 == 1)))
1921 Trb->Mode = SdMmcAdma64bV4Mode;
1924 if (Private->ControllerVersion[Slot] >= SD_MMC_HC_CTRL_VER_410) {
1925 Trb->AdmaLengthMode = SdMmcAdmaLen26b;
1929 if (EFI_ERROR (Status)) {
1932 }
else if (Private->Capability[Slot].Sdma != 0) {
1933 Trb->Mode = SdMmcSdmaMode;
1935 if (EFI_ERROR (Status)) {
1939 Trb->Mode = SdMmcPioMode;
1943 if (Event !=
NULL) {
1944 OldTpl =
gBS->RaiseTPL (TPL_NOTIFY);
1946 gBS->RestoreTPL (OldTpl);
1969 PciIo = Trb->Private->PciIo;
1971 if (Trb->AdmaMap !=
NULL) {
1978 if (Trb->Adma32Desc !=
NULL) {
1986 if (Trb->Adma64V3Desc !=
NULL) {
1994 if (Trb->Adma64V4Desc !=
NULL) {
2002 if (Trb->DataMap !=
NULL) {
2033 UINT32 PresentState;
2035 Packet = Trb->Packet;
2037 if ((Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeAdtc) ||
2038 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR1b) ||
2039 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR5b))
2045 PresentState = BIT0 | BIT1;
2051 PresentState = BIT0;
2054 PciIo = Private->PciIo;
2058 SD_MMC_HC_PRESENT_STATE,
2059 sizeof (PresentState),
2087 BOOLEAN InfiniteWait;
2092 Packet = Trb->Packet;
2093 Timeout = Packet->Timeout;
2095 InfiniteWait =
TRUE;
2097 InfiniteWait =
FALSE;
2100 while (InfiniteWait || (Timeout > 0)) {
2105 if (Status != EFI_NOT_READY) {
2148 BOOLEAN AddressingMode64;
2150 AddressingMode64 =
FALSE;
2152 Packet = Trb->Packet;
2153 PciIo = Trb->Private->PciIo;
2158 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_ERR_INT_STS,
FALSE, sizeof (IntStatus), &IntStatus);
2159 if (EFI_ERROR (Status)) {
2167 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_NOR_INT_STS,
FALSE, sizeof (IntStatus), &IntStatus);
2168 if (EFI_ERROR (Status)) {
2172 if (Private->ControllerVersion[Trb->Slot] >= SD_MMC_HC_CTRL_VER_400) {
2176 SD_MMC_HC_HOST_CTRL2,
2178 SD_MMC_HC_64_ADDR_EN,
2179 SD_MMC_HC_64_ADDR_EN
2181 if (!EFI_ERROR (Status)) {
2182 AddressingMode64 =
TRUE;
2189 if ((Trb->Mode == SdMmcAdma32bMode) ||
2190 (Trb->Mode == SdMmcAdma64bV4Mode))
2193 Status =
SdMmcHcOrMmio (PciIo, Trb->Slot, SD_MMC_HC_HOST_CTRL1, sizeof (HostCtrl1), &HostCtrl1);
2194 if (EFI_ERROR (Status)) {
2197 }
else if (Trb->Mode == SdMmcAdma64bV3Mode) {
2198 HostCtrl1 = BIT4|BIT3;
2199 Status =
SdMmcHcOrMmio (PciIo, Trb->Slot, SD_MMC_HC_HOST_CTRL1, sizeof (HostCtrl1), &HostCtrl1);
2200 if (EFI_ERROR (Status)) {
2207 if (Trb->Mode == SdMmcSdmaMode) {
2208 if ((!AddressingMode64) &&
2209 ((UINT64)(
UINTN)Trb->DataPhy >= 0x100000000ul))
2211 return EFI_INVALID_PARAMETER;
2214 SdmaAddr = (UINT64)(
UINTN)Trb->DataPhy;
2216 if (Private->ControllerVersion[Trb->Slot] >= SD_MMC_HC_CTRL_VER_400) {
2217 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_ADMA_SYS_ADDR,
FALSE, sizeof (UINT64), &SdmaAddr);
2219 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_SDMA_ADDR,
FALSE, sizeof (UINT32), &SdmaAddr);
2222 if (EFI_ERROR (Status)) {
2225 }
else if ((Trb->Mode == SdMmcAdma32bMode) ||
2226 (Trb->Mode == SdMmcAdma64bV3Mode) ||
2227 (Trb->Mode == SdMmcAdma64bV4Mode))
2229 AdmaAddr = (UINT64)(
UINTN)Trb->AdmaDescPhy;
2230 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_ADMA_SYS_ADDR,
FALSE, sizeof (AdmaAddr), &AdmaAddr);
2231 if (EFI_ERROR (Status)) {
2236 BlkSize = Trb->BlockSize;
2237 if (Trb->Mode == SdMmcSdmaMode) {
2244 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_BLK_SIZE,
FALSE, sizeof (BlkSize), &BlkSize);
2245 if (EFI_ERROR (Status)) {
2250 if (Trb->Mode != SdMmcNoData) {
2254 BlkCount = (Trb->DataLen / Trb->BlockSize);
2257 if (Private->ControllerVersion[Trb->Slot] >= SD_MMC_HC_CTRL_VER_410) {
2258 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_SDMA_ADDR,
FALSE, sizeof (UINT32), &BlkCount);
2260 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_BLK_COUNT,
FALSE, sizeof (UINT16), &BlkCount);
2263 if (EFI_ERROR (Status)) {
2267 Argument = Packet->SdMmcCmdBlk->CommandArgument;
2268 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_ARG1,
FALSE, sizeof (Argument), &Argument);
2269 if (EFI_ERROR (Status)) {
2274 if (Trb->Mode != SdMmcNoData) {
2275 if (Trb->Mode != SdMmcPioMode) {
2284 TransMode |= BIT5 | BIT1;
2290 if (Private->Slot[Trb->Slot].CardType == SdCardType) {
2297 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_TRANS_MOD,
FALSE, sizeof (TransMode), &TransMode);
2298 if (EFI_ERROR (Status)) {
2302 Cmd = (UINT16)
LShiftU64 (Packet->SdMmcCmdBlk->CommandIndex, 8);
2303 if (Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeAdtc) {
2310 if (Packet->SdMmcCmdBlk->CommandType != SdMmcCommandTypeBc) {
2311 switch (Packet->SdMmcCmdBlk->ResponseType) {
2312 case SdMmcResponseTypeR1:
2313 case SdMmcResponseTypeR5:
2314 case SdMmcResponseTypeR6:
2315 case SdMmcResponseTypeR7:
2316 Cmd |= (BIT1 | BIT3 | BIT4);
2318 case SdMmcResponseTypeR2:
2319 Cmd |= (BIT0 | BIT3);
2321 case SdMmcResponseTypeR3:
2322 case SdMmcResponseTypeR4:
2325 case SdMmcResponseTypeR1b:
2326 case SdMmcResponseTypeR5b:
2327 Cmd |= (BIT0 | BIT1 | BIT3 | BIT4);
2338 Status =
SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_COMMAND,
FALSE, sizeof (Cmd), &Cmd);
2356 IN UINT16 ErrIntStatus
2363 if ((ErrIntStatus & 0x0F) != 0) {
2367 if ((ErrIntStatus & 0x70) != 0) {
2379 if (EFI_ERROR (Status)) {
2390 SD_MMC_HC_GENERIC_TIMEOUT
2392 if (EFI_ERROR (Status)) {
2420 UINT16 ErrIntStatus;
2424 if ((IntStatus & BIT15) == 0) {
2431 SD_MMC_HC_ERR_INT_STS,
2433 sizeof (ErrIntStatus),
2436 if (EFI_ERROR (Status)) {
2440 DEBUG ((DEBUG_ERROR,
"Error reported by SDHCI\n"));
2441 DEBUG ((DEBUG_ERROR,
"Interrupt status = %X\n", IntStatus));
2442 DEBUG ((DEBUG_ERROR,
"Error interrupt status = %X\n", ErrIntStatus));
2453 if (((ErrIntStatus & BIT4) != 0) && ((IntStatus & BIT1) != 0)) {
2464 if ((ErrIntStatus & (BIT1 | BIT2 | BIT5 | BIT6)) != 0) {
2465 ErrorStatus = EFI_CRC_ERROR;
2467 ErrorStatus = EFI_DEVICE_ERROR;
2471 if (EFI_ERROR (Status)) {
2500 Packet = Trb->Packet;
2502 if (Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeBc) {
2506 for (Index = 0; Index < 4; Index++) {
2510 SD_MMC_HC_RESPONSE + Index * 4,
2515 if (EFI_ERROR (Status)) {
2520 CopyMem (Packet->SdMmcStatusBlk, Response, sizeof (Response));
2548 if ((IntStatus & BIT0) != 0) {
2553 SD_MMC_HC_NOR_INT_STS,
2558 if (EFI_ERROR (Status)) {
2563 if (EFI_ERROR (Status)) {
2567 Trb->CommandComplete =
TRUE;
2571 return EFI_NOT_READY;
2598 BlockCount = (Trb->DataLen / Trb->BlockSize);
2599 if (Trb->DataLen % Trb->BlockSize != 0) {
2603 if (Trb->PioBlockIndex >= BlockCount) {
2607 switch (Trb->BlockSize % sizeof (UINT32)) {
2609 Width = EfiPciIoWidthFifoUint32;
2610 Count = Trb->BlockSize /
sizeof (UINT32);
2613 Width = EfiPciIoWidthFifoUint16;
2614 Count = Trb->BlockSize /
sizeof (UINT16);
2619 Width = EfiPciIoWidthFifoUint8;
2620 Count = Trb->BlockSize;
2625 if ((IntStatus & BIT5) == 0) {
2626 return EFI_NOT_READY;
2630 SdMmcHcRwMmio (Private->PciIo, Trb->Slot, SD_MMC_HC_NOR_INT_STS,
FALSE, sizeof (Data16), &Data16);
2632 Status = Private->PciIo->Mem.Read (
2636 SD_MMC_HC_BUF_DAT_PORT,
2638 (
VOID *)((UINT8 *)Trb->Data + (Trb->BlockSize * Trb->PioBlockIndex))
2640 if (EFI_ERROR (Status)) {
2644 Trb->PioBlockIndex++;
2646 if ((IntStatus & BIT4) == 0) {
2647 return EFI_NOT_READY;
2651 SdMmcHcRwMmio (Private->PciIo, Trb->Slot, SD_MMC_HC_NOR_INT_STS,
FALSE, sizeof (Data16), &Data16);
2653 Status = Private->PciIo->Mem.Write (
2657 SD_MMC_HC_BUF_DAT_PORT,
2659 (
VOID *)((UINT8 *)Trb->Data + (Trb->BlockSize * Trb->PioBlockIndex))
2661 if (EFI_ERROR (Status)) {
2665 Trb->PioBlockIndex++;
2668 if (Trb->PioBlockIndex >= BlockCount) {
2669 Trb->PioModeTransferCompleted =
TRUE;
2672 return EFI_NOT_READY;
2694 SdmaAddr = SD_MMC_SDMA_ROUND_UP ((
UINTN)Trb->DataPhy, SD_MMC_SDMA_BOUNDARY);
2696 if (Private->ControllerVersion[Trb->Slot] >= SD_MMC_HC_CTRL_VER_400) {
2700 SD_MMC_HC_ADMA_SYS_ADDR,
2709 SD_MMC_HC_SDMA_ADDR,
2716 if (EFI_ERROR (Status)) {
2720 Trb->DataPhy = (UINT64)(
UINTN)SdmaAddr;
2747 if ((IntStatus & BIT1) != 0) {
2752 SD_MMC_HC_NOR_INT_STS,
2760 if ((Trb->Mode == SdMmcPioMode) && !Trb->PioModeTransferCompleted) {
2762 if (EFI_ERROR (Status)) {
2767 if ((Trb->Mode == SdMmcSdmaMode) && ((IntStatus & BIT3) != 0)) {
2772 SD_MMC_HC_NOR_INT_STS,
2777 if (EFI_ERROR (Status)) {
2782 if (EFI_ERROR (Status)) {
2787 return EFI_NOT_READY;
2811 Packet = Trb->Packet;
2818 SD_MMC_HC_NOR_INT_STS,
2823 if (EFI_ERROR (Status)) {
2832 if (EFI_ERROR (Status)) {
2841 if (((Private->Slot[Trb->Slot].CardType == EmmcCardType) &&
2842 (Packet->SdMmcCmdBlk->CommandIndex == EMMC_SEND_TUNING_BLOCK)) ||
2843 ((Private->Slot[Trb->Slot].CardType == SdCardType) &&
2844 (Packet->SdMmcCmdBlk->CommandIndex == SD_SEND_TUNING_BLOCK)))
2850 if (!Trb->CommandComplete) {
2852 if (EFI_ERROR (Status)) {
2857 if ((Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeAdtc) ||
2858 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR1b) ||
2859 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR5b))
2867 if (Status != EFI_NOT_READY) {
2869 if (EFI_ERROR (Status)) {
2870 DEBUG ((DEBUG_ERROR,
"TRB failed with %r\n", Status));
2873 DEBUG ((DEBUG_VERBOSE,
"TRB success\n"));
2900 BOOLEAN InfiniteWait;
2902 Packet = Trb->Packet;
2906 Timeout = Packet->Timeout;
2908 InfiniteWait =
TRUE;
2910 InfiniteWait =
FALSE;
2913 while (InfiniteWait || (Timeout > 0)) {
2918 if (Status != EFI_NOT_READY) {
UINT64 EFIAPI DivU64x32(IN UINT64 Dividend, IN UINT32 Divisor)
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
UINT64 EFIAPI MultU64x32(IN UINT64 Multiplicand, IN UINT32 Multiplier)
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
INTN EFIAPI HighBitSet32(IN UINT32 Operand)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define DEBUG(Expression)
EFI_PCI_IO_PROTOCOL_WIDTH
EFI_PCI_IO_PROTOCOL_OPERATION
@ EfiPciIoOperationBusMasterWrite
@ EfiPciIoOperationBusMasterRead
@ EfiPciIoOperationBusMasterCommonBuffer
EFI_STATUS SdMmcHcInitPowerVoltage(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN SD_MMC_HC_SLOT_CAP Capability)
EFI_STATUS BuildAdmaDescTable(IN SD_MMC_HC_TRB *Trb, IN UINT16 ControllerVer)
EFI_STATUS SdMmcHcReset(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot)
VOID SdMmcPrintTrb(IN UINT32 DebugLevel, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS SdMmcWaitTrbEnv(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS SdMmcCheckDataTransfer(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb, IN UINT16 IntStatus)
EFI_STATUS SdMmcUpdateSdmaAddress(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS SdMmcHcCardDetect(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT BOOLEAN *MediaPresent)
EFI_STATUS EFIAPI SdMmcHcRwMmio(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN BOOLEAN Read, IN UINT8 Count, IN OUT VOID *Data)
EFI_STATUS SdMmcCheckTrbResult(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
SD_MMC_HC_TRB * SdMmcCreateTrb(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN EFI_SD_MMC_PASS_THRU_COMMAND_PACKET *Packet, IN EFI_EVENT Event)
EFI_STATUS SdMmcHcStartSdClock(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
EFI_STATUS SdMmcHcInitHost(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot)
EFI_STATUS SdMmcCheckAndRecoverErrors(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN UINT16 IntStatus)
EFI_STATUS SdMmcHcGetMaxCurrent(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT UINT64 *MaxCurrent)
EFI_STATUS SdMmcSetDriverStrength(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 SlotIndex, IN SD_DRIVER_STRENGTH_TYPE DriverStrength)
VOID SdMmcPrintPacket(IN UINT32 DebugLevel, IN EFI_SD_MMC_PASS_THRU_COMMAND_PACKET *Packet)
EFI_STATUS SdMmcCheckTrbEnv(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS SdMmcHcInitV4Enhancements(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN SD_MMC_HC_SLOT_CAP Capability, IN UINT16 ControllerVer)
EFI_STATUS SdMmcHcUhsSignaling(IN EFI_HANDLE ControllerHandle, IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN SD_MMC_BUS_MODE Timing)
EFI_STATUS EFIAPI SdMmcHcGetSlotInfo(IN EFI_PCI_IO_PROTOCOL *PciIo, OUT UINT8 *FirstBar, OUT UINT8 *SlotNum)
EFI_STATUS SdMmcHcClockSupply(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN SD_MMC_BUS_MODE BusTiming, IN BOOLEAN FirstTimeSetup, IN UINT64 ClockFreq)
EFI_STATUS SdMmcTransferDataWithPio(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb, IN UINT16 IntStatus)
EFI_STATUS SdMmcGetResponse(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS EFIAPI SdMmcHcAndMmio(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN UINT8 Count, IN VOID *AndData)
EFI_STATUS SdMmcHcGetCapability(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT SD_MMC_HC_SLOT_CAP *Capability)
EFI_STATUS SdMmcHcInitTimeoutCtrl(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
EFI_STATUS SdMmcHcStopClock(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
EFI_STATUS SdMmcHcPowerControl(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN UINT8 PowerCtrl)
EFI_STATUS SdMmcCheckCommandComplete(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb, IN UINT16 IntStatus)
EFI_STATUS SdMmcHcGetControllerVersion(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT UINT16 *Version)
EFI_STATUS SdMmcSoftwareReset(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN UINT16 ErrIntStatus)
EFI_STATUS SdMmcSetupMemoryForDmaTransfer(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS SdMmcHcLedOnOff(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN BOOLEAN On)
EFI_STATUS SdMmcWaitTrbResult(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS EFIAPI SdMmcHcWaitMmioSet(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN UINT8 Count, IN UINT64 MaskValue, IN UINT64 TestValue, IN UINT64 Timeout)
VOID DumpCapabilityReg(IN UINT8 Slot, IN SD_MMC_HC_SLOT_CAP *Capability)
EFI_STATUS EFIAPI SdMmcHcCheckMmioSet(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN UINT8 Count, IN UINT64 MaskValue, IN UINT64 TestValue)
EFI_STATUS SdMmcHcSetBusWidth(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN UINT16 BusWidth)
EFI_STATUS SdMmcHcEnableInterrupt(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
VOID SdMmcFreeTrb(IN SD_MMC_HC_TRB *Trb)
EFI_STATUS SdMmcExecTrb(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
EFI_STATUS EFIAPI SdMmcHcOrMmio(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN UINT8 Count, IN VOID *OrData)
UINT64 EFI_PHYSICAL_ADDRESS
#define EFI_SIZE_TO_PAGES(Size)