TianoCore EDK2 master
Loading...
Searching...
No Matches
SdMmcPciHci.c
Go to the documentation of this file.
1
16#include "SdMmcPciHcDxe.h"
17
25VOID
27 IN UINT8 Slot,
28 IN SD_MMC_HC_SLOT_CAP *Capability
29 )
30{
31 //
32 // Dump Capability Data
33 //
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"));
56 } else {
57 DEBUG ((DEBUG_INFO, "%a\n", "Reserved"));
58 }
59
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"));
70 } else {
71 DEBUG ((DEBUG_INFO, " Retuning TimerCnt %dseconds\n", 2 * (Capability->TimerCount - 1)));
72 }
73
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"));
80 return;
81}
82
95EFIAPI
98 OUT UINT8 *FirstBar,
99 OUT UINT8 *SlotNum
100 )
101{
102 EFI_STATUS Status;
103 SD_MMC_HC_SLOT_INFO SlotInfo;
104
105 Status = PciIo->Pci.Read (
106 PciIo,
107 EfiPciIoWidthUint8,
108 SD_MMC_HC_SLOT_OFFSET,
109 sizeof (SlotInfo),
110 &SlotInfo
111 );
112 if (EFI_ERROR (Status)) {
113 return Status;
114 }
115
116 *FirstBar = SlotInfo.FirstBar;
117 *SlotNum = SlotInfo.SlotNum + 1;
118 ASSERT ((*FirstBar + *SlotNum) < SD_MMC_HC_MAX_SLOT);
119 return EFI_SUCCESS;
120}
121
146EFIAPI
148 IN EFI_PCI_IO_PROTOCOL *PciIo,
149 IN UINT8 BarIndex,
150 IN UINT32 Offset,
151 IN BOOLEAN Read,
152 IN UINT8 Count,
153 IN OUT VOID *Data
154 )
155{
156 EFI_STATUS Status;
158
159 if ((PciIo == NULL) || (Data == NULL)) {
160 return EFI_INVALID_PARAMETER;
161 }
162
163 switch (Count) {
164 case 1:
165 Width = EfiPciIoWidthUint8;
166 break;
167 case 2:
168 Width = EfiPciIoWidthUint16;
169 Count = 1;
170 break;
171 case 4:
172 Width = EfiPciIoWidthUint32;
173 Count = 1;
174 break;
175 case 8:
176 Width = EfiPciIoWidthUint32;
177 Count = 2;
178 break;
179 default:
180 return EFI_INVALID_PARAMETER;
181 }
182
183 if (Read) {
184 Status = PciIo->Mem.Read (
185 PciIo,
186 Width,
187 BarIndex,
188 (UINT64)Offset,
189 Count,
190 Data
191 );
192 } else {
193 Status = PciIo->Mem.Write (
194 PciIo,
195 Width,
196 BarIndex,
197 (UINT64)Offset,
198 Count,
199 Data
200 );
201 }
202
203 return Status;
204}
205
228EFIAPI
230 IN EFI_PCI_IO_PROTOCOL *PciIo,
231 IN UINT8 BarIndex,
232 IN UINT32 Offset,
233 IN UINT8 Count,
234 IN VOID *OrData
235 )
236{
237 EFI_STATUS Status;
238 UINT64 Data;
239 UINT64 Or;
240
241 Status = SdMmcHcRwMmio (PciIo, BarIndex, Offset, TRUE, Count, &Data);
242 if (EFI_ERROR (Status)) {
243 return Status;
244 }
245
246 if (Count == 1) {
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;
254 } else {
255 return EFI_INVALID_PARAMETER;
256 }
257
258 Data |= Or;
259 Status = SdMmcHcRwMmio (PciIo, BarIndex, Offset, FALSE, Count, &Data);
260
261 return Status;
262}
263
286EFIAPI
288 IN EFI_PCI_IO_PROTOCOL *PciIo,
289 IN UINT8 BarIndex,
290 IN UINT32 Offset,
291 IN UINT8 Count,
292 IN VOID *AndData
293 )
294{
295 EFI_STATUS Status;
296 UINT64 Data;
297 UINT64 And;
298
299 Status = SdMmcHcRwMmio (PciIo, BarIndex, Offset, TRUE, Count, &Data);
300 if (EFI_ERROR (Status)) {
301 return Status;
302 }
303
304 if (Count == 1) {
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;
312 } else {
313 return EFI_INVALID_PARAMETER;
314 }
315
316 Data &= And;
317 Status = SdMmcHcRwMmio (PciIo, BarIndex, Offset, FALSE, Count, &Data);
318
319 return Status;
320}
321
342EFIAPI
344 IN EFI_PCI_IO_PROTOCOL *PciIo,
345 IN UINT8 BarIndex,
346 IN UINT32 Offset,
347 IN UINT8 Count,
348 IN UINT64 MaskValue,
349 IN UINT64 TestValue
350 )
351{
352 EFI_STATUS Status;
353 UINT64 Value;
354
355 //
356 // Access PCI MMIO space to see if the value is the tested one.
357 //
358 Value = 0;
359 Status = SdMmcHcRwMmio (PciIo, BarIndex, Offset, TRUE, Count, &Value);
360 if (EFI_ERROR (Status)) {
361 return Status;
362 }
363
364 Value &= MaskValue;
365
366 if (Value == TestValue) {
367 return EFI_SUCCESS;
368 }
369
370 return EFI_NOT_READY;
371}
372
396EFIAPI
398 IN EFI_PCI_IO_PROTOCOL *PciIo,
399 IN UINT8 BarIndex,
400 IN UINT32 Offset,
401 IN UINT8 Count,
402 IN UINT64 MaskValue,
403 IN UINT64 TestValue,
404 IN UINT64 Timeout
405 )
406{
407 EFI_STATUS Status;
408 BOOLEAN InfiniteWait;
409
410 if (Timeout == 0) {
411 InfiniteWait = TRUE;
412 } else {
413 InfiniteWait = FALSE;
414 }
415
416 while (InfiniteWait || (Timeout > 0)) {
417 Status = SdMmcHcCheckMmioSet (
418 PciIo,
419 BarIndex,
420 Offset,
421 Count,
422 MaskValue,
423 TestValue
424 );
425 if (Status != EFI_NOT_READY) {
426 return Status;
427 }
428
429 //
430 // Stall for 1 microsecond.
431 //
432 gBS->Stall (1);
433
434 Timeout--;
435 }
436
437 return EFI_TIMEOUT;
438}
439
453 IN EFI_PCI_IO_PROTOCOL *PciIo,
454 IN UINT8 Slot,
455 OUT UINT16 *Version
456 )
457{
458 EFI_STATUS Status;
459
460 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_CTRL_VER, TRUE, sizeof (UINT16), Version);
461 if (EFI_ERROR (Status)) {
462 return Status;
463 }
464
465 *Version &= 0xFF;
466
467 return EFI_SUCCESS;
468}
469
482 IN SD_MMC_HC_PRIVATE_DATA *Private,
483 IN UINT8 Slot
484 )
485{
486 EFI_STATUS Status;
487 UINT8 SwReset;
488 EFI_PCI_IO_PROTOCOL *PciIo;
489
490 //
491 // Notify the SD/MMC override protocol that we are about to reset
492 // the SD/MMC host controller.
493 //
494 if ((mOverride != NULL) && (mOverride->NotifyPhase != NULL)) {
495 Status = mOverride->NotifyPhase (
496 Private->ControllerHandle,
497 Slot,
498 EdkiiSdMmcResetPre,
499 NULL
500 );
501 if (EFI_ERROR (Status)) {
502 DEBUG ((
503 DEBUG_WARN,
504 "%a: SD/MMC pre reset notifier callback failed - %r\n",
505 __func__,
506 Status
507 ));
508 return Status;
509 }
510 }
511
512 PciIo = Private->PciIo;
513 SwReset = BIT0;
514 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_SW_RST, sizeof (SwReset), &SwReset);
515
516 if (EFI_ERROR (Status)) {
517 DEBUG ((DEBUG_ERROR, "SdMmcHcReset: write SW Reset for All fails: %r\n", Status));
518 return Status;
519 }
520
521 Status = SdMmcHcWaitMmioSet (
522 PciIo,
523 Slot,
524 SD_MMC_HC_SW_RST,
525 sizeof (SwReset),
526 BIT0,
527 0x00,
528 SD_MMC_HC_GENERIC_TIMEOUT
529 );
530 if (EFI_ERROR (Status)) {
531 DEBUG ((DEBUG_INFO, "SdMmcHcReset: reset done with %r\n", Status));
532 return Status;
533 }
534
535 //
536 // Enable all interrupt after reset all.
537 //
538 Status = SdMmcHcEnableInterrupt (PciIo, Slot);
539 if (EFI_ERROR (Status)) {
540 DEBUG ((
541 DEBUG_INFO,
542 "SdMmcHcReset: SdMmcHcEnableInterrupt done with %r\n",
543 Status
544 ));
545 return Status;
546 }
547
548 //
549 // Notify the SD/MMC override protocol that we have just reset
550 // the SD/MMC host controller.
551 //
552 if ((mOverride != NULL) && (mOverride->NotifyPhase != NULL)) {
553 Status = mOverride->NotifyPhase (
554 Private->ControllerHandle,
555 Slot,
556 EdkiiSdMmcResetPost,
557 NULL
558 );
559 if (EFI_ERROR (Status)) {
560 DEBUG ((
561 DEBUG_WARN,
562 "%a: SD/MMC post reset notifier callback failed - %r\n",
563 __func__,
564 Status
565 ));
566 }
567 }
568
569 return Status;
570}
571
585 IN EFI_PCI_IO_PROTOCOL *PciIo,
586 IN UINT8 Slot
587 )
588{
589 EFI_STATUS Status;
590 UINT16 IntStatus;
591
592 //
593 // Enable all bits in Error Interrupt Status Enable Register
594 //
595 IntStatus = 0xFFFF;
596 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_ERR_INT_STS_EN, FALSE, sizeof (IntStatus), &IntStatus);
597 if (EFI_ERROR (Status)) {
598 return Status;
599 }
600
601 //
602 // Enable all bits in Normal Interrupt Status Enable Register
603 //
604 IntStatus = 0xFFFF;
605 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_NOR_INT_STS_EN, FALSE, sizeof (IntStatus), &IntStatus);
606
607 return Status;
608}
609
623 IN EFI_PCI_IO_PROTOCOL *PciIo,
624 IN UINT8 Slot,
625 OUT SD_MMC_HC_SLOT_CAP *Capability
626 )
627{
628 EFI_STATUS Status;
629 UINT64 Cap;
630
631 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_CAP, TRUE, sizeof (Cap), &Cap);
632 if (EFI_ERROR (Status)) {
633 return Status;
634 }
635
636 CopyMem (Capability, &Cap, sizeof (Cap));
637
638 return EFI_SUCCESS;
639}
640
654 IN EFI_PCI_IO_PROTOCOL *PciIo,
655 IN UINT8 Slot,
656 OUT UINT64 *MaxCurrent
657 )
658{
659 EFI_STATUS Status;
660
661 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_MAX_CURRENT_CAP, TRUE, sizeof (UINT64), MaxCurrent);
662
663 return Status;
664}
665
683 IN EFI_PCI_IO_PROTOCOL *PciIo,
684 IN UINT8 Slot,
685 OUT BOOLEAN *MediaPresent
686 )
687{
688 EFI_STATUS Status;
689 UINT16 Data;
690 UINT32 PresentState;
691
692 //
693 // Check Present State Register to see if there is a card presented.
694 //
695 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_PRESENT_STATE, TRUE, sizeof (PresentState), &PresentState);
696 if (EFI_ERROR (Status)) {
697 return Status;
698 }
699
700 if ((PresentState & BIT16) != 0) {
701 *MediaPresent = TRUE;
702 } else {
703 *MediaPresent = FALSE;
704 }
705
706 //
707 // Check Normal Interrupt Status Register
708 //
709 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_NOR_INT_STS, TRUE, sizeof (Data), &Data);
710 if (EFI_ERROR (Status)) {
711 return Status;
712 }
713
714 if ((Data & (BIT6 | BIT7)) != 0) {
715 //
716 // Clear BIT6 and BIT7 by writing 1 to these two bits if set.
717 //
718 Data &= BIT6 | BIT7;
719 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_NOR_INT_STS, FALSE, sizeof (Data), &Data);
720 if (EFI_ERROR (Status)) {
721 return Status;
722 }
723
724 return EFI_MEDIA_CHANGED;
725 }
726
727 return EFI_SUCCESS;
728}
729
744 IN EFI_PCI_IO_PROTOCOL *PciIo,
745 IN UINT8 Slot
746 )
747{
748 EFI_STATUS Status;
749 UINT32 PresentState;
750 UINT16 ClockCtrl;
751
752 //
753 // Ensure no SD transactions are occurring on the SD Bus by
754 // waiting for Command Inhibit (DAT) and Command Inhibit (CMD)
755 // in the Present State register to be 0.
756 //
757 Status = SdMmcHcWaitMmioSet (
758 PciIo,
759 Slot,
760 SD_MMC_HC_PRESENT_STATE,
761 sizeof (PresentState),
762 BIT0 | BIT1,
763 0,
764 SD_MMC_HC_GENERIC_TIMEOUT
765 );
766 if (EFI_ERROR (Status)) {
767 return Status;
768 }
769
770 //
771 // Set SD Clock Enable in the Clock Control register to 0
772 //
773 ClockCtrl = (UINT16) ~BIT2;
774 Status = SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_CLOCK_CTRL, sizeof (ClockCtrl), &ClockCtrl);
775
776 return Status;
777}
778
790 IN EFI_PCI_IO_PROTOCOL *PciIo,
791 IN UINT8 Slot
792 )
793{
794 UINT16 ClockCtrl;
795
796 //
797 // Set SD Clock Enable in the Clock Control register to 1
798 //
799 ClockCtrl = BIT2;
800 return SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_CLOCK_CTRL, sizeof (ClockCtrl), &ClockCtrl);
801}
802
820 IN SD_MMC_HC_PRIVATE_DATA *Private,
821 IN UINT8 Slot,
822 IN SD_MMC_BUS_MODE BusTiming,
823 IN BOOLEAN FirstTimeSetup,
824 IN UINT64 ClockFreq
825 )
826{
827 EFI_STATUS Status;
828 UINT32 SettingFreq;
829 UINT32 Divisor;
830 UINT32 Remainder;
831 UINT16 ClockCtrl;
832 UINT32 BaseClkFreq;
833 UINT16 ControllerVer;
834 EFI_PCI_IO_PROTOCOL *PciIo;
835
836 PciIo = Private->PciIo;
837 BaseClkFreq = Private->BaseClkFreq[Slot];
838 ControllerVer = Private->ControllerVersion[Slot];
839
840 if ((BaseClkFreq == 0) || (ClockFreq == 0)) {
841 return EFI_INVALID_PARAMETER;
842 }
843
844 if (ClockFreq > (BaseClkFreq * 1000)) {
845 ClockFreq = BaseClkFreq * 1000;
846 }
847
848 //
849 // Calculate the divisor of base frequency.
850 //
851 Divisor = 0;
852 SettingFreq = BaseClkFreq * 1000;
853 while (ClockFreq < SettingFreq) {
854 Divisor++;
855
856 SettingFreq = (BaseClkFreq * 1000) / (2 * Divisor);
857 Remainder = (BaseClkFreq * 1000) % (2 * Divisor);
858 if ((ClockFreq == SettingFreq) && (Remainder == 0)) {
859 break;
860 }
861
862 if ((ClockFreq == SettingFreq) && (Remainder != 0)) {
863 SettingFreq++;
864 }
865 }
866
867 DEBUG ((DEBUG_INFO, "BaseClkFreq %dMHz Divisor %d ClockFreq %dKhz\n", BaseClkFreq, Divisor, ClockFreq));
868
869 //
870 // Set SDCLK Frequency Select and Internal Clock Enable fields in Clock Control register.
871 //
872 if ((ControllerVer >= SD_MMC_HC_CTRL_VER_300) &&
873 (ControllerVer <= SD_MMC_HC_CTRL_VER_420))
874 {
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))
879 {
880 //
881 // Only the most significant bit can be used as divisor.
882 //
883 if (((Divisor - 1) & Divisor) != 0) {
884 Divisor = 1 << (HighBitSet32 (Divisor) + 1);
885 }
886
887 ASSERT (Divisor <= 0x80);
888 ClockCtrl = (Divisor & 0xFF) << 8;
889 } else {
890 DEBUG ((DEBUG_ERROR, "Unknown SD Host Controller Spec version [0x%x]!!!\n", ControllerVer));
891 return EFI_UNSUPPORTED;
892 }
893
894 //
895 // Stop bus clock at first
896 //
897 Status = SdMmcHcStopClock (PciIo, Slot);
898 if (EFI_ERROR (Status)) {
899 return Status;
900 }
901
902 //
903 // Supply clock frequency with specified divisor
904 //
905 ClockCtrl |= BIT0;
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"));
909 return Status;
910 }
911
912 //
913 // Wait Internal Clock Stable in the Clock Control register to be 1
914 //
915 Status = SdMmcHcWaitMmioSet (
916 PciIo,
917 Slot,
918 SD_MMC_HC_CLOCK_CTRL,
919 sizeof (ClockCtrl),
920 BIT1,
921 BIT1,
922 SD_MMC_HC_GENERIC_TIMEOUT
923 );
924 if (EFI_ERROR (Status)) {
925 return Status;
926 }
927
928 Status = SdMmcHcStartSdClock (PciIo, Slot);
929 if (EFI_ERROR (Status)) {
930 return Status;
931 }
932
933 //
934 // We don't notify the platform on first time setup to avoid changing
935 // legacy behavior. During first time setup we also don't know what type
936 // of the card slot it is and which enum value of BusTiming applies.
937 //
938 if (!FirstTimeSetup && (mOverride != NULL) && (mOverride->NotifyPhase != NULL)) {
939 Status = mOverride->NotifyPhase (
940 Private->ControllerHandle,
941 Slot,
942 EdkiiSdMmcSwitchClockFreqPost,
943 &BusTiming
944 );
945 if (EFI_ERROR (Status)) {
946 DEBUG ((
947 DEBUG_ERROR,
948 "%a: SD/MMC switch clock freq post notifier callback failed - %r\n",
949 __func__,
950 Status
951 ));
952 return Status;
953 }
954 }
955
956 Private->Slot[Slot].CurrentFreq = ClockFreq;
957
958 return Status;
959}
960
976 IN EFI_PCI_IO_PROTOCOL *PciIo,
977 IN UINT8 Slot,
978 IN UINT8 PowerCtrl
979 )
980{
981 EFI_STATUS Status;
982
983 //
984 // Clr SD Bus Power
985 //
986 PowerCtrl &= (UINT8) ~BIT0;
987 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_POWER_CTRL, FALSE, sizeof (PowerCtrl), &PowerCtrl);
988 if (EFI_ERROR (Status)) {
989 return Status;
990 }
991
992 //
993 // Set SD Bus Voltage Select and SD Bus Power fields in Power Control Register
994 //
995 PowerCtrl |= BIT0;
996 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_POWER_CTRL, FALSE, sizeof (PowerCtrl), &PowerCtrl);
997
998 return Status;
999}
1000
1016 IN EFI_PCI_IO_PROTOCOL *PciIo,
1017 IN UINT8 Slot,
1018 IN UINT16 BusWidth
1019 )
1020{
1021 EFI_STATUS Status;
1022 UINT8 HostCtrl1;
1023
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)) {
1030 return Status;
1031 }
1032
1033 HostCtrl1 |= BIT1;
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)) {
1039 return Status;
1040 }
1041
1042 HostCtrl1 &= (UINT8) ~BIT1;
1043 HostCtrl1 |= BIT5;
1044 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1, FALSE, sizeof (HostCtrl1), &HostCtrl1);
1045 } else {
1046 ASSERT (FALSE);
1047 return EFI_INVALID_PARAMETER;
1048 }
1049
1050 return Status;
1051}
1052
1066 IN EFI_PCI_IO_PROTOCOL *PciIo,
1067 IN UINT8 Slot,
1068 IN SD_MMC_HC_SLOT_CAP Capability,
1069 IN UINT16 ControllerVer
1070 )
1071{
1072 EFI_STATUS Status;
1073 UINT16 HostCtrl2;
1074
1075 //
1076 // Check if controller version V4 or higher
1077 //
1078 if (ControllerVer >= SD_MMC_HC_CTRL_VER_400) {
1079 HostCtrl2 = SD_MMC_HC_V4_EN;
1080 //
1081 // Check if controller version V4.0
1082 //
1083 if (ControllerVer == SD_MMC_HC_CTRL_VER_400) {
1084 //
1085 // Check if 64bit support is available
1086 //
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"));
1090 }
1091 }
1092 //
1093 // Check if controller version V4.10 or higher
1094 //
1095 else if (ControllerVer >= SD_MMC_HC_CTRL_VER_410) {
1096 //
1097 // Check if 64bit support is available
1098 //
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"));
1102 }
1103
1104 HostCtrl2 |= SD_MMC_HC_26_DATA_LEN_ADMA_EN;
1105 DEBUG ((DEBUG_INFO, "Enabled V4 26 bit data length ADMA support\n"));
1106 }
1107
1108 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, sizeof (HostCtrl2), &HostCtrl2);
1109 if (EFI_ERROR (Status)) {
1110 return Status;
1111 }
1112 }
1113
1114 return EFI_SUCCESS;
1115}
1116
1132 IN EFI_PCI_IO_PROTOCOL *PciIo,
1133 IN UINT8 Slot,
1134 IN SD_MMC_HC_SLOT_CAP Capability
1135 )
1136{
1137 EFI_STATUS Status;
1138 UINT8 MaxVoltage;
1139 UINT8 HostCtrl2;
1140
1141 //
1142 // Calculate supported maximum voltage according to SD Bus Voltage Select
1143 //
1144 if (Capability.Voltage33 != 0) {
1145 //
1146 // Support 3.3V
1147 //
1148 MaxVoltage = 0x0E;
1149 } else if (Capability.Voltage30 != 0) {
1150 //
1151 // Support 3.0V
1152 //
1153 MaxVoltage = 0x0C;
1154 } else if (Capability.Voltage18 != 0) {
1155 //
1156 // Support 1.8V
1157 //
1158 MaxVoltage = 0x0A;
1159 HostCtrl2 = BIT3;
1160 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, sizeof (HostCtrl2), &HostCtrl2);
1161 gBS->Stall (5000);
1162 if (EFI_ERROR (Status)) {
1163 return Status;
1164 }
1165 } else {
1166 ASSERT (FALSE);
1167 return EFI_DEVICE_ERROR;
1168 }
1169
1170 //
1171 // Set SD Bus Voltage Select and SD Bus Power fields in Power Control Register
1172 //
1173 Status = SdMmcHcPowerControl (PciIo, Slot, MaxVoltage);
1174
1175 return Status;
1176}
1177
1192 IN EFI_PCI_IO_PROTOCOL *PciIo,
1193 IN UINT8 Slot
1194 )
1195{
1196 EFI_STATUS Status;
1197 UINT8 Timeout;
1198
1199 Timeout = 0x0E;
1200 Status = SdMmcHcRwMmio (PciIo, Slot, SD_MMC_HC_TIMEOUT_CTRL, FALSE, sizeof (Timeout), &Timeout);
1201
1202 return Status;
1203}
1204
1218 IN SD_MMC_HC_PRIVATE_DATA *Private,
1219 IN UINT8 Slot
1220 )
1221{
1222 EFI_STATUS Status;
1223 EFI_PCI_IO_PROTOCOL *PciIo;
1224 SD_MMC_HC_SLOT_CAP Capability;
1225
1226 //
1227 // Notify the SD/MMC override protocol that we are about to initialize
1228 // the SD/MMC host controller.
1229 //
1230 if ((mOverride != NULL) && (mOverride->NotifyPhase != NULL)) {
1231 Status = mOverride->NotifyPhase (
1232 Private->ControllerHandle,
1233 Slot,
1234 EdkiiSdMmcInitHostPre,
1235 NULL
1236 );
1237 if (EFI_ERROR (Status)) {
1238 DEBUG ((
1239 DEBUG_WARN,
1240 "%a: SD/MMC pre init notifier callback failed - %r\n",
1241 __func__,
1242 Status
1243 ));
1244 return Status;
1245 }
1246 }
1247
1248 PciIo = Private->PciIo;
1249 Capability = Private->Capability[Slot];
1250
1251 Status = SdMmcHcInitV4Enhancements (PciIo, Slot, Capability, Private->ControllerVersion[Slot]);
1252 if (EFI_ERROR (Status)) {
1253 return Status;
1254 }
1255
1256 //
1257 // Perform first time clock setup with 400 KHz frequency.
1258 // We send the 0 as the BusTiming value because at this time
1259 // we still do not know the slot type and which enum value will apply.
1260 // Since it is a first time setup SdMmcHcClockSupply won't notify
1261 // the platofrm driver anyway so it doesn't matter.
1262 //
1263 Status = SdMmcHcClockSupply (Private, Slot, 0, TRUE, 400);
1264 if (EFI_ERROR (Status)) {
1265 return Status;
1266 }
1267
1268 Status = SdMmcHcInitPowerVoltage (PciIo, Slot, Capability);
1269 if (EFI_ERROR (Status)) {
1270 return Status;
1271 }
1272
1273 Status = SdMmcHcInitTimeoutCtrl (PciIo, Slot);
1274 if (EFI_ERROR (Status)) {
1275 return Status;
1276 }
1277
1278 //
1279 // Notify the SD/MMC override protocol that we are have just initialized
1280 // the SD/MMC host controller.
1281 //
1282 if ((mOverride != NULL) && (mOverride->NotifyPhase != NULL)) {
1283 Status = mOverride->NotifyPhase (
1284 Private->ControllerHandle,
1285 Slot,
1286 EdkiiSdMmcInitHostPost,
1287 NULL
1288 );
1289 if (EFI_ERROR (Status)) {
1290 DEBUG ((
1291 DEBUG_WARN,
1292 "%a: SD/MMC post init notifier callback failed - %r\n",
1293 __func__,
1294 Status
1295 ));
1296 }
1297 }
1298
1299 return Status;
1300}
1301
1315 IN EFI_HANDLE ControllerHandle,
1316 IN EFI_PCI_IO_PROTOCOL *PciIo,
1317 IN UINT8 Slot,
1318 IN SD_MMC_BUS_MODE Timing
1319 )
1320{
1321 EFI_STATUS Status;
1322 UINT8 HostCtrl2;
1323
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)) {
1327 return Status;
1328 }
1329
1330 switch (Timing) {
1331 case SdMmcUhsSdr12:
1332 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR12;
1333 break;
1334 case SdMmcUhsSdr25:
1335 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR25;
1336 break;
1337 case SdMmcUhsSdr50:
1338 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR50;
1339 break;
1340 case SdMmcUhsSdr104:
1341 HostCtrl2 = SD_MMC_HC_CTRL_UHS_SDR104;
1342 break;
1343 case SdMmcUhsDdr50:
1344 HostCtrl2 = SD_MMC_HC_CTRL_UHS_DDR50;
1345 break;
1346 case SdMmcMmcLegacy:
1347 HostCtrl2 = SD_MMC_HC_CTRL_MMC_LEGACY;
1348 break;
1349 case SdMmcMmcHsSdr:
1350 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS_SDR;
1351 break;
1352 case SdMmcMmcHsDdr:
1353 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS_DDR;
1354 break;
1355 case SdMmcMmcHs200:
1356 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS200;
1357 break;
1358 case SdMmcMmcHs400:
1359 HostCtrl2 = SD_MMC_HC_CTRL_MMC_HS400;
1360 break;
1361 default:
1362 HostCtrl2 = 0;
1363 break;
1364 }
1365
1366 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL2, sizeof (HostCtrl2), &HostCtrl2);
1367 if (EFI_ERROR (Status)) {
1368 return Status;
1369 }
1370
1371 if ((mOverride != NULL) && (mOverride->NotifyPhase != NULL)) {
1372 Status = mOverride->NotifyPhase (
1373 ControllerHandle,
1374 Slot,
1375 EdkiiSdMmcUhsSignaling,
1376 &Timing
1377 );
1378 if (EFI_ERROR (Status)) {
1379 DEBUG ((
1380 DEBUG_ERROR,
1381 "%a: SD/MMC uhs signaling notifier callback failed - %r\n",
1382 __func__,
1383 Status
1384 ));
1385 return Status;
1386 }
1387 }
1388
1389 return EFI_SUCCESS;
1390}
1391
1404 IN EFI_PCI_IO_PROTOCOL *PciIo,
1405 IN UINT8 SlotIndex,
1406 IN SD_DRIVER_STRENGTH_TYPE DriverStrength
1407 )
1408{
1409 EFI_STATUS Status;
1410 UINT16 HostCtrl2;
1411
1412 if (DriverStrength == SdDriverStrengthIgnore) {
1413 return EFI_SUCCESS;
1414 }
1415
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)) {
1419 return Status;
1420 }
1421
1422 HostCtrl2 = (DriverStrength << 4) & SD_MMC_HC_CTRL_DRIVER_STRENGTH_MASK;
1423 return SdMmcHcOrMmio (PciIo, SlotIndex, SD_MMC_HC_HOST_CTRL2, sizeof (HostCtrl2), &HostCtrl2);
1424}
1425
1439 IN EFI_PCI_IO_PROTOCOL *PciIo,
1440 IN UINT8 Slot,
1441 IN BOOLEAN On
1442 )
1443{
1444 EFI_STATUS Status;
1445 UINT8 HostCtrl1;
1446
1447 if (On) {
1448 HostCtrl1 = BIT0;
1449 Status = SdMmcHcOrMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1, sizeof (HostCtrl1), &HostCtrl1);
1450 } else {
1451 HostCtrl1 = (UINT8) ~BIT0;
1452 Status = SdMmcHcAndMmio (PciIo, Slot, SD_MMC_HC_HOST_CTRL1, sizeof (HostCtrl1), &HostCtrl1);
1453 }
1454
1455 return Status;
1456}
1457
1472 IN SD_MMC_HC_TRB *Trb,
1473 IN UINT16 ControllerVer
1474 )
1475{
1477 UINT64 DataLen;
1478 UINT64 Entries;
1479 UINT32 Index;
1480 UINT64 Remaining;
1481 UINT64 Address;
1482 UINTN TableSize;
1483 EFI_PCI_IO_PROTOCOL *PciIo;
1484 EFI_STATUS Status;
1485 UINTN Bytes;
1486 UINT32 AdmaMaxDataPerLine;
1487 UINT32 DescSize;
1488 VOID *AdmaDesc;
1489
1490 AdmaMaxDataPerLine = ADMA_MAX_DATA_PER_LINE_16B;
1491 DescSize = sizeof (SD_MMC_HC_ADMA_32_DESC_LINE);
1492 AdmaDesc = NULL;
1493
1494 Data = Trb->DataPhy;
1495 DataLen = Trb->DataLen;
1496 PciIo = Trb->Private->PciIo;
1497
1498 //
1499 // Check for valid ranges in 32bit ADMA Descriptor Table
1500 //
1501 if ((Trb->Mode == SdMmcAdma32bMode) &&
1502 ((Data >= 0x100000000ul) || ((Data + DataLen) > 0x100000000ul)))
1503 {
1504 return EFI_INVALID_PARAMETER;
1505 }
1506
1507 //
1508 // Check address field alignment
1509 //
1510 if (Trb->Mode != SdMmcAdma32bMode) {
1511 //
1512 // Address field shall be set on 64-bit boundary (Lower 3-bit is always set to 0)
1513 //
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));
1516 }
1517 } else {
1518 //
1519 // Address field shall be set on 32-bit boundary (Lower 2-bit is always set to 0)
1520 //
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));
1523 }
1524 }
1525
1526 //
1527 // Configure 64b ADMA.
1528 //
1529 if (Trb->Mode == SdMmcAdma64bV3Mode) {
1530 DescSize = sizeof (SD_MMC_HC_ADMA_64_V3_DESC_LINE);
1531 } else if (Trb->Mode == SdMmcAdma64bV4Mode) {
1532 DescSize = sizeof (SD_MMC_HC_ADMA_64_V4_DESC_LINE);
1533 }
1534
1535 //
1536 // Configure 26b data length.
1537 //
1538 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1539 AdmaMaxDataPerLine = ADMA_MAX_DATA_PER_LINE_26B;
1540 }
1541
1542 Entries = DivU64x32 ((DataLen + AdmaMaxDataPerLine - 1), AdmaMaxDataPerLine);
1543 TableSize = (UINTN)MultU64x32 (Entries, DescSize);
1544 Trb->AdmaPages = (UINT32)EFI_SIZE_TO_PAGES (TableSize);
1545 Status = PciIo->AllocateBuffer (
1546 PciIo,
1549 EFI_SIZE_TO_PAGES (TableSize),
1550 (VOID **)&AdmaDesc,
1551 0
1552 );
1553 if (EFI_ERROR (Status)) {
1554 return EFI_OUT_OF_RESOURCES;
1555 }
1556
1557 ZeroMem (AdmaDesc, TableSize);
1558 Bytes = TableSize;
1559 Status = PciIo->Map (
1560 PciIo,
1562 AdmaDesc,
1563 &Bytes,
1564 &Trb->AdmaDescPhy,
1565 &Trb->AdmaMap
1566 );
1567
1568 if (EFI_ERROR (Status) || (Bytes != TableSize)) {
1569 //
1570 // Map error or unable to map the whole RFis buffer into a contiguous region.
1571 //
1572 PciIo->FreeBuffer (
1573 PciIo,
1574 EFI_SIZE_TO_PAGES (TableSize),
1575 AdmaDesc
1576 );
1577 return EFI_OUT_OF_RESOURCES;
1578 }
1579
1580 if ((Trb->Mode == SdMmcAdma32bMode) &&
1581 ((UINT64)(UINTN)Trb->AdmaDescPhy > 0x100000000ul))
1582 {
1583 //
1584 // The ADMA doesn't support 64bit addressing.
1585 //
1586 PciIo->Unmap (
1587 PciIo,
1588 Trb->AdmaMap
1589 );
1590 Trb->AdmaMap = NULL;
1591
1592 PciIo->FreeBuffer (
1593 PciIo,
1594 EFI_SIZE_TO_PAGES (TableSize),
1595 AdmaDesc
1596 );
1597 return EFI_DEVICE_ERROR;
1598 }
1599
1600 Remaining = DataLen;
1601 Address = Data;
1602 if (Trb->Mode == SdMmcAdma32bMode) {
1603 Trb->Adma32Desc = AdmaDesc;
1604 } else if (Trb->Mode == SdMmcAdma64bV3Mode) {
1605 Trb->Adma64V3Desc = AdmaDesc;
1606 } else {
1607 Trb->Adma64V4Desc = AdmaDesc;
1608 }
1609
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);
1617 }
1618
1619 Trb->Adma32Desc[Index].LowerLength = (UINT16)(Remaining & MAX_UINT16);
1620 Trb->Adma32Desc[Index].Address = (UINT32)Address;
1621 break;
1622 } else {
1623 Trb->Adma32Desc[Index].Valid = 1;
1624 Trb->Adma32Desc[Index].Act = 2;
1625 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1626 Trb->Adma32Desc[Index].UpperLength = 0;
1627 }
1628
1629 Trb->Adma32Desc[Index].LowerLength = 0;
1630 Trb->Adma32Desc[Index].Address = (UINT32)Address;
1631 }
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);
1638 }
1639
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);
1643 break;
1644 } else {
1645 Trb->Adma64V3Desc[Index].Valid = 1;
1646 Trb->Adma64V3Desc[Index].Act = 2;
1647 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1648 Trb->Adma64V3Desc[Index].UpperLength = 0;
1649 }
1650
1651 Trb->Adma64V3Desc[Index].LowerLength = 0;
1652 Trb->Adma64V3Desc[Index].LowerAddress = (UINT32)Address;
1653 Trb->Adma64V3Desc[Index].UpperAddress = (UINT32)RShiftU64 (Address, 32);
1654 }
1655 } else {
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);
1661 }
1662
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);
1666 break;
1667 } else {
1668 Trb->Adma64V4Desc[Index].Valid = 1;
1669 Trb->Adma64V4Desc[Index].Act = 2;
1670 if (Trb->AdmaLengthMode == SdMmcAdmaLen26b) {
1671 Trb->Adma64V4Desc[Index].UpperLength = 0;
1672 }
1673
1674 Trb->Adma64V4Desc[Index].LowerLength = 0;
1675 Trb->Adma64V4Desc[Index].LowerAddress = (UINT32)Address;
1676 Trb->Adma64V4Desc[Index].UpperAddress = (UINT32)RShiftU64 (Address, 32);
1677 }
1678 }
1679
1680 Remaining -= AdmaMaxDataPerLine;
1681 Address += AdmaMaxDataPerLine;
1682 }
1683
1684 //
1685 // Set the last descriptor line as end of descriptor table
1686 //
1687 if (Trb->Mode == SdMmcAdma32bMode) {
1688 Trb->Adma32Desc[Index].End = 1;
1689 } else if (Trb->Mode == SdMmcAdma64bV3Mode) {
1690 Trb->Adma64V3Desc[Index].End = 1;
1691 } else {
1692 Trb->Adma64V4Desc[Index].End = 1;
1693 }
1694
1695 return EFI_SUCCESS;
1696}
1697
1704VOID
1706 IN UINT32 DebugLevel,
1708 )
1709{
1710 if (Packet == NULL) {
1711 return;
1712 }
1713
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));
1718 }
1719
1720 if (Packet->SdMmcStatusBlk != NULL) {
1721 DEBUG ((
1722 DebugLevel,
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
1728 ));
1729 }
1730
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));
1737}
1738
1745VOID
1747 IN UINT32 DebugLevel,
1748 IN SD_MMC_HC_TRB *Trb
1749 )
1750{
1751 if (Trb == NULL) {
1752 return;
1753 }
1754
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));
1777
1778 SdMmcPrintPacket (DebugLevel, Trb->Packet);
1779}
1780
1793 IN SD_MMC_HC_PRIVATE_DATA *Private,
1794 IN UINT8 Slot,
1795 IN SD_MMC_HC_TRB *Trb
1796 )
1797{
1799 EFI_PCI_IO_PROTOCOL *PciIo;
1800 UINTN MapLength;
1801 EFI_STATUS Status;
1802
1803 if (Trb->Read) {
1805 } else {
1807 }
1808
1809 PciIo = Private->PciIo;
1810 if ((Trb->Data != NULL) && (Trb->DataLen != 0)) {
1811 MapLength = Trb->DataLen;
1812 Status = PciIo->Map (
1813 PciIo,
1814 Flag,
1815 Trb->Data,
1816 &MapLength,
1817 &Trb->DataPhy,
1818 &Trb->DataMap
1819 );
1820 if (EFI_ERROR (Status) || (Trb->DataLen != MapLength)) {
1821 return EFI_BAD_BUFFER_SIZE;
1822 }
1823 }
1824
1825 if ((Trb->Mode == SdMmcAdma32bMode) ||
1826 (Trb->Mode == SdMmcAdma64bV3Mode) ||
1827 (Trb->Mode == SdMmcAdma64bV4Mode))
1828 {
1829 Status = BuildAdmaDescTable (Trb, Private->ControllerVersion[Slot]);
1830 if (EFI_ERROR (Status)) {
1831 return Status;
1832 }
1833 }
1834
1835 return EFI_SUCCESS;
1836}
1837
1853 IN SD_MMC_HC_PRIVATE_DATA *Private,
1854 IN UINT8 Slot,
1856 IN EFI_EVENT Event
1857 )
1858{
1859 SD_MMC_HC_TRB *Trb;
1860 EFI_STATUS Status;
1861 EFI_TPL OldTpl;
1862
1863 Trb = AllocateZeroPool (sizeof (SD_MMC_HC_TRB));
1864 if (Trb == NULL) {
1865 return NULL;
1866 }
1867
1868 Trb->Signature = SD_MMC_HC_TRB_SIG;
1869 Trb->Slot = Slot;
1870 Trb->BlockSize = 0x200;
1871 Trb->Packet = Packet;
1872 Trb->Event = Event;
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;
1880
1881 if ((Packet->InTransferLength != 0) && (Packet->InDataBuffer != NULL)) {
1882 Trb->Data = Packet->InDataBuffer;
1883 Trb->DataLen = Packet->InTransferLength;
1884 Trb->Read = TRUE;
1885 } else if ((Packet->OutTransferLength != 0) && (Packet->OutDataBuffer != NULL)) {
1886 Trb->Data = Packet->OutDataBuffer;
1887 Trb->DataLen = Packet->OutTransferLength;
1888 Trb->Read = FALSE;
1889 } else if ((Packet->InTransferLength == 0) && (Packet->OutTransferLength == 0)) {
1890 Trb->Data = NULL;
1891 Trb->DataLen = 0;
1892 } else {
1893 goto Error;
1894 }
1895
1896 if ((Trb->DataLen != 0) && (Trb->DataLen < Trb->BlockSize)) {
1897 Trb->BlockSize = (UINT16)Trb->DataLen;
1898 }
1899
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)))
1904 {
1905 Trb->Mode = SdMmcPioMode;
1906 } else {
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))
1914 {
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)))
1920 {
1921 Trb->Mode = SdMmcAdma64bV4Mode;
1922 }
1923
1924 if (Private->ControllerVersion[Slot] >= SD_MMC_HC_CTRL_VER_410) {
1925 Trb->AdmaLengthMode = SdMmcAdmaLen26b;
1926 }
1927
1928 Status = SdMmcSetupMemoryForDmaTransfer (Private, Slot, Trb);
1929 if (EFI_ERROR (Status)) {
1930 goto Error;
1931 }
1932 } else if (Private->Capability[Slot].Sdma != 0) {
1933 Trb->Mode = SdMmcSdmaMode;
1934 Status = SdMmcSetupMemoryForDmaTransfer (Private, Slot, Trb);
1935 if (EFI_ERROR (Status)) {
1936 goto Error;
1937 }
1938 } else {
1939 Trb->Mode = SdMmcPioMode;
1940 }
1941 }
1942
1943 if (Event != NULL) {
1944 OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
1945 InsertTailList (&Private->Queue, &Trb->TrbList);
1946 gBS->RestoreTPL (OldTpl);
1947 }
1948
1949 return Trb;
1950
1951Error:
1952 SdMmcFreeTrb (Trb);
1953 return NULL;
1954}
1955
1962VOID
1964 IN SD_MMC_HC_TRB *Trb
1965 )
1966{
1967 EFI_PCI_IO_PROTOCOL *PciIo;
1968
1969 PciIo = Trb->Private->PciIo;
1970
1971 if (Trb->AdmaMap != NULL) {
1972 PciIo->Unmap (
1973 PciIo,
1974 Trb->AdmaMap
1975 );
1976 }
1977
1978 if (Trb->Adma32Desc != NULL) {
1979 PciIo->FreeBuffer (
1980 PciIo,
1981 Trb->AdmaPages,
1982 Trb->Adma32Desc
1983 );
1984 }
1985
1986 if (Trb->Adma64V3Desc != NULL) {
1987 PciIo->FreeBuffer (
1988 PciIo,
1989 Trb->AdmaPages,
1990 Trb->Adma64V3Desc
1991 );
1992 }
1993
1994 if (Trb->Adma64V4Desc != NULL) {
1995 PciIo->FreeBuffer (
1996 PciIo,
1997 Trb->AdmaPages,
1998 Trb->Adma64V4Desc
1999 );
2000 }
2001
2002 if (Trb->DataMap != NULL) {
2003 PciIo->Unmap (
2004 PciIo,
2005 Trb->DataMap
2006 );
2007 }
2008
2009 FreePool (Trb);
2010 return;
2011}
2012
2026 IN SD_MMC_HC_PRIVATE_DATA *Private,
2027 IN SD_MMC_HC_TRB *Trb
2028 )
2029{
2030 EFI_STATUS Status;
2032 EFI_PCI_IO_PROTOCOL *PciIo;
2033 UINT32 PresentState;
2034
2035 Packet = Trb->Packet;
2036
2037 if ((Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeAdtc) ||
2038 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR1b) ||
2039 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR5b))
2040 {
2041 //
2042 // Wait Command Inhibit (CMD) and Command Inhibit (DAT) in
2043 // the Present State register to be 0
2044 //
2045 PresentState = BIT0 | BIT1;
2046 } else {
2047 //
2048 // Wait Command Inhibit (CMD) in the Present State register
2049 // to be 0
2050 //
2051 PresentState = BIT0;
2052 }
2053
2054 PciIo = Private->PciIo;
2055 Status = SdMmcHcCheckMmioSet (
2056 PciIo,
2057 Trb->Slot,
2058 SD_MMC_HC_PRESENT_STATE,
2059 sizeof (PresentState),
2060 PresentState,
2061 0
2062 );
2063
2064 return Status;
2065}
2066
2080 IN SD_MMC_HC_PRIVATE_DATA *Private,
2081 IN SD_MMC_HC_TRB *Trb
2082 )
2083{
2084 EFI_STATUS Status;
2086 UINT64 Timeout;
2087 BOOLEAN InfiniteWait;
2088
2089 //
2090 // Wait Command Complete Interrupt Status bit in Normal Interrupt Status Register
2091 //
2092 Packet = Trb->Packet;
2093 Timeout = Packet->Timeout;
2094 if (Timeout == 0) {
2095 InfiniteWait = TRUE;
2096 } else {
2097 InfiniteWait = FALSE;
2098 }
2099
2100 while (InfiniteWait || (Timeout > 0)) {
2101 //
2102 // Check Trb execution result by reading Normal Interrupt Status register.
2103 //
2104 Status = SdMmcCheckTrbEnv (Private, Trb);
2105 if (Status != EFI_NOT_READY) {
2106 return Status;
2107 }
2108
2109 //
2110 // Stall for 1 microsecond.
2111 //
2112 gBS->Stall (1);
2113
2114 Timeout--;
2115 }
2116
2117 return EFI_TIMEOUT;
2118}
2119
2132 IN SD_MMC_HC_PRIVATE_DATA *Private,
2133 IN SD_MMC_HC_TRB *Trb
2134 )
2135{
2136 EFI_STATUS Status;
2138 EFI_PCI_IO_PROTOCOL *PciIo;
2139 UINT16 Cmd;
2140 UINT16 IntStatus;
2141 UINT32 Argument;
2142 UINT32 BlkCount;
2143 UINT16 BlkSize;
2144 UINT16 TransMode;
2145 UINT8 HostCtrl1;
2146 UINT64 SdmaAddr;
2147 UINT64 AdmaAddr;
2148 BOOLEAN AddressingMode64;
2149
2150 AddressingMode64 = FALSE;
2151
2152 Packet = Trb->Packet;
2153 PciIo = Trb->Private->PciIo;
2154 //
2155 // Clear all bits in Error Interrupt Status Register
2156 //
2157 IntStatus = 0xFFFF;
2158 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_ERR_INT_STS, FALSE, sizeof (IntStatus), &IntStatus);
2159 if (EFI_ERROR (Status)) {
2160 return Status;
2161 }
2162
2163 //
2164 // Clear all bits in Normal Interrupt Status Register excepts for Card Removal & Card Insertion bits.
2165 //
2166 IntStatus = 0xFF3F;
2167 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_NOR_INT_STS, FALSE, sizeof (IntStatus), &IntStatus);
2168 if (EFI_ERROR (Status)) {
2169 return Status;
2170 }
2171
2172 if (Private->ControllerVersion[Trb->Slot] >= SD_MMC_HC_CTRL_VER_400) {
2173 Status = SdMmcHcCheckMmioSet (
2174 PciIo,
2175 Trb->Slot,
2176 SD_MMC_HC_HOST_CTRL2,
2177 sizeof (UINT16),
2178 SD_MMC_HC_64_ADDR_EN,
2179 SD_MMC_HC_64_ADDR_EN
2180 );
2181 if (!EFI_ERROR (Status)) {
2182 AddressingMode64 = TRUE;
2183 }
2184 }
2185
2186 //
2187 // Set Host Control 1 register DMA Select field
2188 //
2189 if ((Trb->Mode == SdMmcAdma32bMode) ||
2190 (Trb->Mode == SdMmcAdma64bV4Mode))
2191 {
2192 HostCtrl1 = BIT4;
2193 Status = SdMmcHcOrMmio (PciIo, Trb->Slot, SD_MMC_HC_HOST_CTRL1, sizeof (HostCtrl1), &HostCtrl1);
2194 if (EFI_ERROR (Status)) {
2195 return Status;
2196 }
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)) {
2201 return Status;
2202 }
2203 }
2204
2205 SdMmcHcLedOnOff (PciIo, Trb->Slot, TRUE);
2206
2207 if (Trb->Mode == SdMmcSdmaMode) {
2208 if ((!AddressingMode64) &&
2209 ((UINT64)(UINTN)Trb->DataPhy >= 0x100000000ul))
2210 {
2211 return EFI_INVALID_PARAMETER;
2212 }
2213
2214 SdmaAddr = (UINT64)(UINTN)Trb->DataPhy;
2215
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);
2218 } else {
2219 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_SDMA_ADDR, FALSE, sizeof (UINT32), &SdmaAddr);
2220 }
2221
2222 if (EFI_ERROR (Status)) {
2223 return Status;
2224 }
2225 } else if ((Trb->Mode == SdMmcAdma32bMode) ||
2226 (Trb->Mode == SdMmcAdma64bV3Mode) ||
2227 (Trb->Mode == SdMmcAdma64bV4Mode))
2228 {
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)) {
2232 return Status;
2233 }
2234 }
2235
2236 BlkSize = Trb->BlockSize;
2237 if (Trb->Mode == SdMmcSdmaMode) {
2238 //
2239 // Set SDMA boundary to be 512K bytes.
2240 //
2241 BlkSize |= 0x7000;
2242 }
2243
2244 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_BLK_SIZE, FALSE, sizeof (BlkSize), &BlkSize);
2245 if (EFI_ERROR (Status)) {
2246 return Status;
2247 }
2248
2249 BlkCount = 0;
2250 if (Trb->Mode != SdMmcNoData) {
2251 //
2252 // Calcuate Block Count.
2253 //
2254 BlkCount = (Trb->DataLen / Trb->BlockSize);
2255 }
2256
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);
2259 } else {
2260 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_BLK_COUNT, FALSE, sizeof (UINT16), &BlkCount);
2261 }
2262
2263 if (EFI_ERROR (Status)) {
2264 return Status;
2265 }
2266
2267 Argument = Packet->SdMmcCmdBlk->CommandArgument;
2268 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_ARG1, FALSE, sizeof (Argument), &Argument);
2269 if (EFI_ERROR (Status)) {
2270 return Status;
2271 }
2272
2273 TransMode = 0;
2274 if (Trb->Mode != SdMmcNoData) {
2275 if (Trb->Mode != SdMmcPioMode) {
2276 TransMode |= BIT0;
2277 }
2278
2279 if (Trb->Read) {
2280 TransMode |= BIT4;
2281 }
2282
2283 if (BlkCount > 1) {
2284 TransMode |= BIT5 | BIT1;
2285 }
2286
2287 //
2288 // Only SD memory card needs to use AUTO CMD12 feature.
2289 //
2290 if (Private->Slot[Trb->Slot].CardType == SdCardType) {
2291 if (BlkCount > 1) {
2292 TransMode |= BIT2;
2293 }
2294 }
2295 }
2296
2297 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_TRANS_MOD, FALSE, sizeof (TransMode), &TransMode);
2298 if (EFI_ERROR (Status)) {
2299 return Status;
2300 }
2301
2302 Cmd = (UINT16)LShiftU64 (Packet->SdMmcCmdBlk->CommandIndex, 8);
2303 if (Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeAdtc) {
2304 Cmd |= BIT5;
2305 }
2306
2307 //
2308 // Convert ResponseType to value
2309 //
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);
2317 break;
2318 case SdMmcResponseTypeR2:
2319 Cmd |= (BIT0 | BIT3);
2320 break;
2321 case SdMmcResponseTypeR3:
2322 case SdMmcResponseTypeR4:
2323 Cmd |= BIT1;
2324 break;
2325 case SdMmcResponseTypeR1b:
2326 case SdMmcResponseTypeR5b:
2327 Cmd |= (BIT0 | BIT1 | BIT3 | BIT4);
2328 break;
2329 default:
2330 ASSERT (FALSE);
2331 break;
2332 }
2333 }
2334
2335 //
2336 // Execute cmd
2337 //
2338 Status = SdMmcHcRwMmio (PciIo, Trb->Slot, SD_MMC_HC_COMMAND, FALSE, sizeof (Cmd), &Cmd);
2339 return Status;
2340}
2341
2354 IN SD_MMC_HC_PRIVATE_DATA *Private,
2355 IN UINT8 Slot,
2356 IN UINT16 ErrIntStatus
2357 )
2358{
2359 UINT8 SwReset;
2360 EFI_STATUS Status;
2361
2362 SwReset = 0;
2363 if ((ErrIntStatus & 0x0F) != 0) {
2364 SwReset |= BIT1;
2365 }
2366
2367 if ((ErrIntStatus & 0x70) != 0) {
2368 SwReset |= BIT2;
2369 }
2370
2371 Status = SdMmcHcRwMmio (
2372 Private->PciIo,
2373 Slot,
2374 SD_MMC_HC_SW_RST,
2375 FALSE,
2376 sizeof (SwReset),
2377 &SwReset
2378 );
2379 if (EFI_ERROR (Status)) {
2380 return Status;
2381 }
2382
2383 Status = SdMmcHcWaitMmioSet (
2384 Private->PciIo,
2385 Slot,
2386 SD_MMC_HC_SW_RST,
2387 sizeof (SwReset),
2388 0xFF,
2389 0,
2390 SD_MMC_HC_GENERIC_TIMEOUT
2391 );
2392 if (EFI_ERROR (Status)) {
2393 return Status;
2394 }
2395
2396 return EFI_SUCCESS;
2397}
2398
2415 IN SD_MMC_HC_PRIVATE_DATA *Private,
2416 IN UINT8 Slot,
2417 IN UINT16 IntStatus
2418 )
2419{
2420 UINT16 ErrIntStatus;
2421 EFI_STATUS Status;
2422 EFI_STATUS ErrorStatus;
2423
2424 if ((IntStatus & BIT15) == 0) {
2425 return EFI_SUCCESS;
2426 }
2427
2428 Status = SdMmcHcRwMmio (
2429 Private->PciIo,
2430 Slot,
2431 SD_MMC_HC_ERR_INT_STS,
2432 TRUE,
2433 sizeof (ErrIntStatus),
2434 &ErrIntStatus
2435 );
2436 if (EFI_ERROR (Status)) {
2437 return Status;
2438 }
2439
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));
2443
2444 //
2445 // If the data timeout error is reported
2446 // but data transfer is signaled as completed we
2447 // have to ignore data timeout. We also assume that no
2448 // other error is present on the link since data transfer
2449 // completed successfully. Error interrupt status
2450 // register is going to be reset when the next command
2451 // is started.
2452 //
2453 if (((ErrIntStatus & BIT4) != 0) && ((IntStatus & BIT1) != 0)) {
2454 return EFI_SUCCESS;
2455 }
2456
2457 //
2458 // We treat both CMD and DAT CRC errors and
2459 // end bits errors as EFI_CRC_ERROR. This will
2460 // let higher layer know that the error possibly
2461 // happened due to random bus condition and the
2462 // command can be retried.
2463 //
2464 if ((ErrIntStatus & (BIT1 | BIT2 | BIT5 | BIT6)) != 0) {
2465 ErrorStatus = EFI_CRC_ERROR;
2466 } else {
2467 ErrorStatus = EFI_DEVICE_ERROR;
2468 }
2469
2470 Status = SdMmcSoftwareReset (Private, Slot, ErrIntStatus);
2471 if (EFI_ERROR (Status)) {
2472 return Status;
2473 }
2474
2475 return ErrorStatus;
2476}
2477
2491 IN SD_MMC_HC_PRIVATE_DATA *Private,
2492 IN SD_MMC_HC_TRB *Trb
2493 )
2494{
2496 UINT8 Index;
2497 UINT32 Response[4];
2498 EFI_STATUS Status;
2499
2500 Packet = Trb->Packet;
2501
2502 if (Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeBc) {
2503 return EFI_SUCCESS;
2504 }
2505
2506 for (Index = 0; Index < 4; Index++) {
2507 Status = SdMmcHcRwMmio (
2508 Private->PciIo,
2509 Trb->Slot,
2510 SD_MMC_HC_RESPONSE + Index * 4,
2511 TRUE,
2512 sizeof (UINT32),
2513 &Response[Index]
2514 );
2515 if (EFI_ERROR (Status)) {
2516 return Status;
2517 }
2518 }
2519
2520 CopyMem (Packet->SdMmcStatusBlk, Response, sizeof (Response));
2521
2522 return EFI_SUCCESS;
2523}
2524
2540 IN SD_MMC_HC_PRIVATE_DATA *Private,
2541 IN SD_MMC_HC_TRB *Trb,
2542 IN UINT16 IntStatus
2543 )
2544{
2545 UINT16 Data16;
2546 EFI_STATUS Status;
2547
2548 if ((IntStatus & BIT0) != 0) {
2549 Data16 = BIT0;
2550 Status = SdMmcHcRwMmio (
2551 Private->PciIo,
2552 Trb->Slot,
2553 SD_MMC_HC_NOR_INT_STS,
2554 FALSE,
2555 sizeof (Data16),
2556 &Data16
2557 );
2558 if (EFI_ERROR (Status)) {
2559 return Status;
2560 }
2561
2562 Status = SdMmcGetResponse (Private, Trb);
2563 if (EFI_ERROR (Status)) {
2564 return Status;
2565 }
2566
2567 Trb->CommandComplete = TRUE;
2568 return EFI_SUCCESS;
2569 }
2570
2571 return EFI_NOT_READY;
2572}
2573
2587 IN SD_MMC_HC_PRIVATE_DATA *Private,
2588 IN SD_MMC_HC_TRB *Trb,
2589 IN UINT16 IntStatus
2590 )
2591{
2592 EFI_STATUS Status;
2593 UINT16 Data16;
2594 UINT32 BlockCount;
2596 UINTN Count;
2597
2598 BlockCount = (Trb->DataLen / Trb->BlockSize);
2599 if (Trb->DataLen % Trb->BlockSize != 0) {
2600 BlockCount += 1;
2601 }
2602
2603 if (Trb->PioBlockIndex >= BlockCount) {
2604 return EFI_SUCCESS;
2605 }
2606
2607 switch (Trb->BlockSize % sizeof (UINT32)) {
2608 case 0:
2609 Width = EfiPciIoWidthFifoUint32;
2610 Count = Trb->BlockSize / sizeof (UINT32);
2611 break;
2612 case 2:
2613 Width = EfiPciIoWidthFifoUint16;
2614 Count = Trb->BlockSize / sizeof (UINT16);
2615 break;
2616 case 1:
2617 case 3:
2618 default:
2619 Width = EfiPciIoWidthFifoUint8;
2620 Count = Trb->BlockSize;
2621 break;
2622 }
2623
2624 if (Trb->Read) {
2625 if ((IntStatus & BIT5) == 0) {
2626 return EFI_NOT_READY;
2627 }
2628
2629 Data16 = BIT5;
2630 SdMmcHcRwMmio (Private->PciIo, Trb->Slot, SD_MMC_HC_NOR_INT_STS, FALSE, sizeof (Data16), &Data16);
2631
2632 Status = Private->PciIo->Mem.Read (
2633 Private->PciIo,
2634 Width,
2635 Trb->Slot,
2636 SD_MMC_HC_BUF_DAT_PORT,
2637 Count,
2638 (VOID *)((UINT8 *)Trb->Data + (Trb->BlockSize * Trb->PioBlockIndex))
2639 );
2640 if (EFI_ERROR (Status)) {
2641 return Status;
2642 }
2643
2644 Trb->PioBlockIndex++;
2645 } else {
2646 if ((IntStatus & BIT4) == 0) {
2647 return EFI_NOT_READY;
2648 }
2649
2650 Data16 = BIT4;
2651 SdMmcHcRwMmio (Private->PciIo, Trb->Slot, SD_MMC_HC_NOR_INT_STS, FALSE, sizeof (Data16), &Data16);
2652
2653 Status = Private->PciIo->Mem.Write (
2654 Private->PciIo,
2655 Width,
2656 Trb->Slot,
2657 SD_MMC_HC_BUF_DAT_PORT,
2658 Count,
2659 (VOID *)((UINT8 *)Trb->Data + (Trb->BlockSize * Trb->PioBlockIndex))
2660 );
2661 if (EFI_ERROR (Status)) {
2662 return Status;
2663 }
2664
2665 Trb->PioBlockIndex++;
2666 }
2667
2668 if (Trb->PioBlockIndex >= BlockCount) {
2669 Trb->PioModeTransferCompleted = TRUE;
2670 return EFI_SUCCESS;
2671 } else {
2672 return EFI_NOT_READY;
2673 }
2674}
2675
2687 IN SD_MMC_HC_PRIVATE_DATA *Private,
2688 IN SD_MMC_HC_TRB *Trb
2689 )
2690{
2691 UINT64 SdmaAddr;
2692 EFI_STATUS Status;
2693
2694 SdmaAddr = SD_MMC_SDMA_ROUND_UP ((UINTN)Trb->DataPhy, SD_MMC_SDMA_BOUNDARY);
2695
2696 if (Private->ControllerVersion[Trb->Slot] >= SD_MMC_HC_CTRL_VER_400) {
2697 Status = SdMmcHcRwMmio (
2698 Private->PciIo,
2699 Trb->Slot,
2700 SD_MMC_HC_ADMA_SYS_ADDR,
2701 FALSE,
2702 sizeof (UINT64),
2703 &SdmaAddr
2704 );
2705 } else {
2706 Status = SdMmcHcRwMmio (
2707 Private->PciIo,
2708 Trb->Slot,
2709 SD_MMC_HC_SDMA_ADDR,
2710 FALSE,
2711 sizeof (UINT32),
2712 &SdmaAddr
2713 );
2714 }
2715
2716 if (EFI_ERROR (Status)) {
2717 return Status;
2718 }
2719
2720 Trb->DataPhy = (UINT64)(UINTN)SdmaAddr;
2721 return EFI_SUCCESS;
2722}
2723
2739 IN SD_MMC_HC_PRIVATE_DATA *Private,
2740 IN SD_MMC_HC_TRB *Trb,
2741 IN UINT16 IntStatus
2742 )
2743{
2744 UINT16 Data16;
2745 EFI_STATUS Status;
2746
2747 if ((IntStatus & BIT1) != 0) {
2748 Data16 = BIT1;
2749 Status = SdMmcHcRwMmio (
2750 Private->PciIo,
2751 Trb->Slot,
2752 SD_MMC_HC_NOR_INT_STS,
2753 FALSE,
2754 sizeof (Data16),
2755 &Data16
2756 );
2757 return Status;
2758 }
2759
2760 if ((Trb->Mode == SdMmcPioMode) && !Trb->PioModeTransferCompleted) {
2761 Status = SdMmcTransferDataWithPio (Private, Trb, IntStatus);
2762 if (EFI_ERROR (Status)) {
2763 return Status;
2764 }
2765 }
2766
2767 if ((Trb->Mode == SdMmcSdmaMode) && ((IntStatus & BIT3) != 0)) {
2768 Data16 = BIT3;
2769 Status = SdMmcHcRwMmio (
2770 Private->PciIo,
2771 Trb->Slot,
2772 SD_MMC_HC_NOR_INT_STS,
2773 FALSE,
2774 sizeof (Data16),
2775 &Data16
2776 );
2777 if (EFI_ERROR (Status)) {
2778 return Status;
2779 }
2780
2781 Status = SdMmcUpdateSdmaAddress (Private, Trb);
2782 if (EFI_ERROR (Status)) {
2783 return Status;
2784 }
2785 }
2786
2787 return EFI_NOT_READY;
2788}
2789
2803 IN SD_MMC_HC_PRIVATE_DATA *Private,
2804 IN SD_MMC_HC_TRB *Trb
2805 )
2806{
2807 EFI_STATUS Status;
2809 UINT16 IntStatus;
2810
2811 Packet = Trb->Packet;
2812 //
2813 // Check Trb execution result by reading Normal Interrupt Status register.
2814 //
2815 Status = SdMmcHcRwMmio (
2816 Private->PciIo,
2817 Trb->Slot,
2818 SD_MMC_HC_NOR_INT_STS,
2819 TRUE,
2820 sizeof (IntStatus),
2821 &IntStatus
2822 );
2823 if (EFI_ERROR (Status)) {
2824 goto Done;
2825 }
2826
2827 //
2828 // Check if there are any errors reported by host controller
2829 // and if neccessary recover the controller before next command is executed.
2830 //
2831 Status = SdMmcCheckAndRecoverErrors (Private, Trb->Slot, IntStatus);
2832 if (EFI_ERROR (Status)) {
2833 goto Done;
2834 }
2835
2836 //
2837 // Tuning commands are the only ones that do not generate command
2838 // complete interrupt. Process them here before entering the code
2839 // that waits for command completion.
2840 //
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)))
2845 {
2846 Status = SdMmcTransferDataWithPio (Private, Trb, IntStatus);
2847 goto Done;
2848 }
2849
2850 if (!Trb->CommandComplete) {
2851 Status = SdMmcCheckCommandComplete (Private, Trb, IntStatus);
2852 if (EFI_ERROR (Status)) {
2853 goto Done;
2854 }
2855 }
2856
2857 if ((Packet->SdMmcCmdBlk->CommandType == SdMmcCommandTypeAdtc) ||
2858 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR1b) ||
2859 (Packet->SdMmcCmdBlk->ResponseType == SdMmcResponseTypeR5b))
2860 {
2861 Status = SdMmcCheckDataTransfer (Private, Trb, IntStatus);
2862 } else {
2863 Status = EFI_SUCCESS;
2864 }
2865
2866Done:
2867 if (Status != EFI_NOT_READY) {
2868 SdMmcHcLedOnOff (Private->PciIo, Trb->Slot, FALSE);
2869 if (EFI_ERROR (Status)) {
2870 DEBUG ((DEBUG_ERROR, "TRB failed with %r\n", Status));
2871 SdMmcPrintTrb (DEBUG_ERROR, Trb);
2872 } else {
2873 DEBUG ((DEBUG_VERBOSE, "TRB success\n"));
2874 SdMmcPrintTrb (DEBUG_VERBOSE, Trb);
2875 }
2876 }
2877
2878 return Status;
2879}
2880
2893 IN SD_MMC_HC_PRIVATE_DATA *Private,
2894 IN SD_MMC_HC_TRB *Trb
2895 )
2896{
2897 EFI_STATUS Status;
2899 UINT64 Timeout;
2900 BOOLEAN InfiniteWait;
2901
2902 Packet = Trb->Packet;
2903 //
2904 // Wait Command Complete Interrupt Status bit in Normal Interrupt Status Register
2905 //
2906 Timeout = Packet->Timeout;
2907 if (Timeout == 0) {
2908 InfiniteWait = TRUE;
2909 } else {
2910 InfiniteWait = FALSE;
2911 }
2912
2913 while (InfiniteWait || (Timeout > 0)) {
2914 //
2915 // Check Trb execution result by reading Normal Interrupt Status register.
2916 //
2917 Status = SdMmcCheckTrbResult (Private, Trb);
2918 if (Status != EFI_NOT_READY) {
2919 return Status;
2920 }
2921
2922 //
2923 // Stall for 1 microsecond.
2924 //
2925 gBS->Stall (1);
2926
2927 Timeout--;
2928 }
2929
2930 return EFI_TIMEOUT;
2931}
UINT64 UINTN
UINT64 EFIAPI DivU64x32(IN UINT64 Dividend, IN UINT32 Divisor)
Definition: DivU64x32.c:29
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
Definition: RShiftU64.c:28
UINT64 EFIAPI MultU64x32(IN UINT64 Multiplicand, IN UINT32 Multiplier)
Definition: MultU64x32.c:27
UINT64 EFIAPI LShiftU64(IN UINT64 Operand, IN UINTN Count)
Definition: LShiftU64.c:28
INTN EFIAPI HighBitSet32(IN UINT32 Operand)
Definition: HighBitSet32.c:27
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
Definition: LinkedList.c:259
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 NULL
Definition: Base.h:319
#define VOID
Definition: Base.h:269
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define DEBUG(Expression)
Definition: DebugLib.h:435
EFI_PCI_IO_PROTOCOL_WIDTH
Definition: PciIo.h:28
EFI_PCI_IO_PROTOCOL_OPERATION
Definition: PciIo.h:77
@ EfiPciIoOperationBusMasterWrite
Definition: PciIo.h:85
@ EfiPciIoOperationBusMasterRead
Definition: PciIo.h:81
@ EfiPciIoOperationBusMasterCommonBuffer
Definition: PciIo.h:90
EFI_STATUS SdMmcHcInitPowerVoltage(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN SD_MMC_HC_SLOT_CAP Capability)
Definition: SdMmcPciHci.c:1131
EFI_STATUS BuildAdmaDescTable(IN SD_MMC_HC_TRB *Trb, IN UINT16 ControllerVer)
Definition: SdMmcPciHci.c:1471
EFI_STATUS SdMmcHcReset(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot)
Definition: SdMmcPciHci.c:481
VOID SdMmcPrintTrb(IN UINT32 DebugLevel, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:1746
EFI_STATUS SdMmcWaitTrbEnv(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2079
EFI_STATUS SdMmcCheckDataTransfer(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb, IN UINT16 IntStatus)
Definition: SdMmcPciHci.c:2738
EFI_STATUS SdMmcUpdateSdmaAddress(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2686
EFI_STATUS SdMmcHcCardDetect(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT BOOLEAN *MediaPresent)
Definition: SdMmcPciHci.c:682
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)
Definition: SdMmcPciHci.c:147
EFI_STATUS SdMmcCheckTrbResult(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2802
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)
Definition: SdMmcPciHci.c:1852
EFI_STATUS SdMmcHcStartSdClock(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
Definition: SdMmcPciHci.c:789
EFI_STATUS SdMmcHcInitHost(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot)
Definition: SdMmcPciHci.c:1217
EFI_STATUS SdMmcCheckAndRecoverErrors(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN UINT16 IntStatus)
Definition: SdMmcPciHci.c:2414
EFI_STATUS SdMmcHcGetMaxCurrent(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT UINT64 *MaxCurrent)
Definition: SdMmcPciHci.c:653
EFI_STATUS SdMmcSetDriverStrength(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 SlotIndex, IN SD_DRIVER_STRENGTH_TYPE DriverStrength)
Definition: SdMmcPciHci.c:1403
VOID SdMmcPrintPacket(IN UINT32 DebugLevel, IN EFI_SD_MMC_PASS_THRU_COMMAND_PACKET *Packet)
Definition: SdMmcPciHci.c:1705
EFI_STATUS SdMmcCheckTrbEnv(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2025
EFI_STATUS SdMmcHcInitV4Enhancements(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN SD_MMC_HC_SLOT_CAP Capability, IN UINT16 ControllerVer)
Definition: SdMmcPciHci.c:1065
EFI_STATUS SdMmcHcUhsSignaling(IN EFI_HANDLE ControllerHandle, IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN SD_MMC_BUS_MODE Timing)
Definition: SdMmcPciHci.c:1314
EFI_STATUS EFIAPI SdMmcHcGetSlotInfo(IN EFI_PCI_IO_PROTOCOL *PciIo, OUT UINT8 *FirstBar, OUT UINT8 *SlotNum)
Definition: SdMmcPciHci.c:96
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)
Definition: SdMmcPciHci.c:819
EFI_STATUS SdMmcTransferDataWithPio(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb, IN UINT16 IntStatus)
Definition: SdMmcPciHci.c:2586
EFI_STATUS SdMmcGetResponse(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2490
EFI_STATUS EFIAPI SdMmcHcAndMmio(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN UINT8 Count, IN VOID *AndData)
Definition: SdMmcPciHci.c:287
EFI_STATUS SdMmcHcGetCapability(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT SD_MMC_HC_SLOT_CAP *Capability)
Definition: SdMmcPciHci.c:622
EFI_STATUS SdMmcHcInitTimeoutCtrl(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
Definition: SdMmcPciHci.c:1191
EFI_STATUS SdMmcHcStopClock(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
Definition: SdMmcPciHci.c:743
EFI_STATUS SdMmcHcPowerControl(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN UINT8 PowerCtrl)
Definition: SdMmcPciHci.c:975
EFI_STATUS SdMmcCheckCommandComplete(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb, IN UINT16 IntStatus)
Definition: SdMmcPciHci.c:2539
EFI_STATUS SdMmcHcGetControllerVersion(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, OUT UINT16 *Version)
Definition: SdMmcPciHci.c:452
EFI_STATUS SdMmcSoftwareReset(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN UINT16 ErrIntStatus)
Definition: SdMmcPciHci.c:2353
EFI_STATUS SdMmcSetupMemoryForDmaTransfer(IN SD_MMC_HC_PRIVATE_DATA *Private, IN UINT8 Slot, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:1792
EFI_STATUS SdMmcHcLedOnOff(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN BOOLEAN On)
Definition: SdMmcPciHci.c:1438
EFI_STATUS SdMmcWaitTrbResult(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2892
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)
Definition: SdMmcPciHci.c:397
VOID DumpCapabilityReg(IN UINT8 Slot, IN SD_MMC_HC_SLOT_CAP *Capability)
Definition: SdMmcPciHci.c:26
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)
Definition: SdMmcPciHci.c:343
EFI_STATUS SdMmcHcSetBusWidth(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot, IN UINT16 BusWidth)
Definition: SdMmcPciHci.c:1015
EFI_STATUS SdMmcHcEnableInterrupt(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 Slot)
Definition: SdMmcPciHci.c:584
VOID SdMmcFreeTrb(IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:1963
EFI_STATUS SdMmcExecTrb(IN SD_MMC_HC_PRIVATE_DATA *Private, IN SD_MMC_HC_TRB *Trb)
Definition: SdMmcPciHci.c:2131
EFI_STATUS EFIAPI SdMmcHcOrMmio(IN EFI_PCI_IO_PROTOCOL *PciIo, IN UINT8 BarIndex, IN UINT32 Offset, IN UINT8 Count, IN VOID *OrData)
Definition: SdMmcPciHci.c:229
UINT64 EFI_PHYSICAL_ADDRESS
Definition: UefiBaseType.h:50
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
VOID * EFI_EVENT
Definition: UefiBaseType.h:37
UINTN EFI_TPL
Definition: UefiBaseType.h:41
#define EFI_SIZE_TO_PAGES(Size)
Definition: UefiBaseType.h:200
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS
@ EfiBootServicesData
@ AllocateAnyPages
Definition: UefiSpec.h:33