+ if (Trb->Mode == SdMmcAdma32bMode) {\r
+ Trb->Adma32Desc[Index].End = 1;\r
+ } else if (Trb->Mode == SdMmcAdma64bV3Mode) {\r
+ Trb->Adma64V3Desc[Index].End = 1;\r
+ } else {\r
+ Trb->Adma64V4Desc[Index].End = 1;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Prints the contents of the command packet to the debug port.\r
+\r
+ @param[in] DebugLevel Debug level at which the packet should be printed.\r
+ @param[in] Packet Pointer to packet to print.\r
+**/\r
+VOID\r
+SdMmcPrintPacket (\r
+ IN UINT32 DebugLevel,\r
+ IN EFI_SD_MMC_PASS_THRU_COMMAND_PACKET *Packet\r
+ )\r
+{\r
+ if (Packet == NULL) {\r
+ return;\r
+ }\r
+\r
+ DEBUG ((DebugLevel, "Printing EFI_SD_MMC_PASS_THRU_COMMAND_PACKET\n"));\r
+ if (Packet->SdMmcCmdBlk != NULL) {\r
+ DEBUG ((DebugLevel, "Command index: %d, argument: %X\n", Packet->SdMmcCmdBlk->CommandIndex, Packet->SdMmcCmdBlk->CommandArgument));\r
+ DEBUG ((DebugLevel, "Command type: %d, response type: %d\n", Packet->SdMmcCmdBlk->CommandType, Packet->SdMmcCmdBlk->ResponseType));\r
+ }\r
+\r
+ if (Packet->SdMmcStatusBlk != NULL) {\r
+ DEBUG ((\r
+ DebugLevel,\r
+ "Response 0: %X, 1: %X, 2: %X, 3: %X\n",\r
+ Packet->SdMmcStatusBlk->Resp0,\r
+ Packet->SdMmcStatusBlk->Resp1,\r
+ Packet->SdMmcStatusBlk->Resp2,\r
+ Packet->SdMmcStatusBlk->Resp3\r
+ ));\r
+ }\r
+\r
+ DEBUG ((DebugLevel, "Timeout: %ld\n", Packet->Timeout));\r
+ DEBUG ((DebugLevel, "InDataBuffer: %p\n", Packet->InDataBuffer));\r
+ DEBUG ((DebugLevel, "OutDataBuffer: %p\n", Packet->OutDataBuffer));\r
+ DEBUG ((DebugLevel, "InTransferLength: %d\n", Packet->InTransferLength));\r
+ DEBUG ((DebugLevel, "OutTransferLength: %d\n", Packet->OutTransferLength));\r
+ DEBUG ((DebugLevel, "TransactionStatus: %r\n", Packet->TransactionStatus));\r
+}\r
+\r
+/**\r
+ Prints the contents of the TRB to the debug port.\r
+\r
+ @param[in] DebugLevel Debug level at which the TRB should be printed.\r
+ @param[in] Trb Pointer to the TRB structure.\r
+**/\r
+VOID\r
+SdMmcPrintTrb (\r
+ IN UINT32 DebugLevel,\r
+ IN SD_MMC_HC_TRB *Trb\r
+ )\r
+{\r
+ if (Trb == NULL) {\r
+ return;\r
+ }\r
+\r
+ DEBUG ((DebugLevel, "Printing SD_MMC_HC_TRB\n"));\r
+ DEBUG ((DebugLevel, "Slot: %d\n", Trb->Slot));\r
+ DEBUG ((DebugLevel, "BlockSize: %d\n", Trb->BlockSize));\r
+ DEBUG ((DebugLevel, "Data: %p\n", Trb->Data));\r
+ DEBUG ((DebugLevel, "DataLen: %d\n", Trb->DataLen));\r
+ DEBUG ((DebugLevel, "Read: %d\n", Trb->Read));\r
+ DEBUG ((DebugLevel, "DataPhy: %lX\n", Trb->DataPhy));\r
+ DEBUG ((DebugLevel, "DataMap: %p\n", Trb->DataMap));\r
+ DEBUG ((DebugLevel, "Mode: %d\n", Trb->Mode));\r
+ DEBUG ((DebugLevel, "AdmaLengthMode: %d\n", Trb->AdmaLengthMode));\r
+ DEBUG ((DebugLevel, "Event: %p\n", Trb->Event));\r
+ DEBUG ((DebugLevel, "Started: %d\n", Trb->Started));\r
+ DEBUG ((DebugLevel, "CommandComplete: %d\n", Trb->CommandComplete));\r
+ DEBUG ((DebugLevel, "Timeout: %ld\n", Trb->Timeout));\r
+ DEBUG ((DebugLevel, "Retries: %d\n", Trb->Retries));\r
+ DEBUG ((DebugLevel, "PioModeTransferCompleted: %d\n", Trb->PioModeTransferCompleted));\r
+ DEBUG ((DebugLevel, "PioBlockIndex: %d\n", Trb->PioBlockIndex));\r
+ DEBUG ((DebugLevel, "Adma32Desc: %p\n", Trb->Adma32Desc));\r
+ DEBUG ((DebugLevel, "Adma64V3Desc: %p\n", Trb->Adma64V3Desc));\r
+ DEBUG ((DebugLevel, "Adma64V4Desc: %p\n", Trb->Adma64V4Desc));\r
+ DEBUG ((DebugLevel, "AdmaMap: %p\n", Trb->AdmaMap));\r
+ DEBUG ((DebugLevel, "AdmaPages: %X\n", Trb->AdmaPages));\r
+\r
+ 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
+ {\r
+ Status = BuildAdmaDescTable (Trb, Private->ControllerVersion[Slot]);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ }\r
+\r