]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/SdMmcPciHcDxe/SdMmcPciHci.c
MdeModulePkg/SdMmcPciHcDxe: Do not map memory for non DMA transfer
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / SdMmcPciHcDxe / SdMmcPciHci.c
index fa8ab7275786002f4d42975dad65672b09c19691..6e419e0d982e0b9bbefc6bb47b7ee747790b3c6d 100644 (file)
@@ -1724,6 +1724,62 @@ SdMmcPrintTrb (
   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
@@ -1748,9 +1804,6 @@ SdMmcCreateTrb (
   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
@@ -1793,29 +1846,6 @@ SdMmcCreateTrb (
        (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
@@ -1833,12 +1863,16 @@ SdMmcCreateTrb (
       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