SdMmcPrintPacket (DebugLevel, Trb->Packet);\r
}\r
\r
+/**\r
+ Sets up host memory to allow DMA transfer.\r
+\r
+ @param[in] Private A pointer to the SD_MMC_HC_PRIVATE_DATA instance.\r
+ @param[in] Slot The slot number of the SD card to send the command to.\r
+ @param[in] Packet A pointer to the SD command data structure.\r
+\r
+ @retval EFI_SUCCESS Memory has been mapped for DMA transfer.\r
+ @retval Others Memory has not been mapped.\r
+**/\r
+EFI_STATUS\r
+SdMmcSetupMemoryForDmaTransfer (\r
+ IN SD_MMC_HC_PRIVATE_DATA *Private,\r
+ IN UINT8 Slot,\r
+ IN SD_MMC_HC_TRB *Trb\r
+ )\r
+{\r
+ EFI_PCI_IO_PROTOCOL_OPERATION Flag;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ UINTN MapLength;\r
+ EFI_STATUS Status;\r
+\r
+ if (Trb->Read) {\r
+ Flag = EfiPciIoOperationBusMasterWrite;\r
+ } else {\r
+ Flag = EfiPciIoOperationBusMasterRead;\r
+ }\r
+\r
+ PciIo = Private->PciIo;\r
+ if (Trb->Data != NULL && Trb->DataLen != 0) {\r
+ MapLength = Trb->DataLen;\r
+ Status = PciIo->Map (\r
+ PciIo,\r
+ Flag,\r
+ Trb->Data,\r
+ &MapLength,\r
+ &Trb->DataPhy,\r
+ &Trb->DataMap\r
+ );\r
+ if (EFI_ERROR (Status) || (Trb->DataLen != MapLength)) {\r
+ return EFI_BAD_BUFFER_SIZE;\r
+ }\r
+ }\r
+\r
+ if (Trb->Mode == SdMmcAdma32bMode ||\r
+ Trb->Mode == SdMmcAdma64bV3Mode ||\r
+ Trb->Mode == SdMmcAdma64bV4Mode) {\r
+ Status = BuildAdmaDescTable (Trb, Private->ControllerVersion[Slot]);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
/**\r
Create a new TRB for the SD/MMC cmd request.\r
\r
SD_MMC_HC_TRB *Trb;\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
- EFI_PCI_IO_PROTOCOL_OPERATION Flag;\r
- EFI_PCI_IO_PROTOCOL *PciIo;\r
- UINTN MapLength;\r
\r
Trb = AllocateZeroPool (sizeof (SD_MMC_HC_TRB));\r
if (Trb == NULL) {\r
(Packet->SdMmcCmdBlk->CommandIndex == SD_SEND_TUNING_BLOCK))) {\r
Trb->Mode = SdMmcPioMode;\r
} else {\r
- if (Trb->Read) {\r
- Flag = EfiPciIoOperationBusMasterWrite;\r
- } else {\r
- Flag = EfiPciIoOperationBusMasterRead;\r
- }\r
-\r
- PciIo = Private->PciIo;\r
- if (Trb->DataLen != 0) {\r
- MapLength = Trb->DataLen;\r
- Status = PciIo->Map (\r
- PciIo,\r
- Flag,\r
- Trb->Data,\r
- &MapLength,\r
- &Trb->DataPhy,\r
- &Trb->DataMap\r
- );\r
- if (EFI_ERROR (Status) || (Trb->DataLen != MapLength)) {\r
- Status = EFI_BAD_BUFFER_SIZE;\r
- goto Error;\r
- }\r
- }\r
-\r
if (Trb->DataLen == 0) {\r
Trb->Mode = SdMmcNoData;\r
} else if (Private->Capability[Slot].Adma2 != 0) {\r
if (Private->ControllerVersion[Slot] >= SD_MMC_HC_CTRL_VER_410) {\r
Trb->AdmaLengthMode = SdMmcAdmaLen26b;\r
}\r
- Status = BuildAdmaDescTable (Trb, Private->ControllerVersion[Slot]);\r
+ Status = SdMmcSetupMemoryForDmaTransfer (Private, Slot, Trb);\r
if (EFI_ERROR (Status)) {\r
goto Error;\r
}\r
} else if (Private->Capability[Slot].Sdma != 0) {\r
Trb->Mode = SdMmcSdmaMode;\r
+ Status = SdMmcSetupMemoryForDmaTransfer (Private, Slot, Trb);\r
+ if (EFI_ERROR (Status)) {\r
+ goto Error;\r
+ }\r
} else {\r
Trb->Mode = SdMmcPioMode;\r
}\r