]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Pci/UhciDxe/UhciQueue.c
MdeModulePkg/SdMmcPciHcDxe: enable 64-bit PCI DMA
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / UhciDxe / UhciQueue.c
index 91c2a485017a4695d6afc50b3ce93bf55fd05360..1a0aa6e636fd95beaebc91f2f3da65aea947a9d1 100644 (file)
@@ -2,8 +2,8 @@
 \r
   The UHCI register operation routines.\r
 \r
-Copyright (c) 2007 - 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -152,21 +152,25 @@ EXIT:
 /**\r
   Link the TD To QH.\r
 \r
+  @param  Uhc         The UHCI device.\r
   @param  Qh          The queue head for the TD to link to.\r
   @param  Td          The TD to link.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 UhciLinkTdToQh (\r
+  IN USB_HC_DEV           *Uhc,\r
   IN UHCI_QH_SW           *Qh,\r
   IN UHCI_TD_SW           *Td\r
   )\r
 {\r
+  EFI_PHYSICAL_ADDRESS  PhyAddr;\r
+\r
+  PhyAddr = UsbHcGetPciAddressForHostMem (Uhc->MemPool, Td, sizeof (UHCI_TD_HW));\r
+\r
   ASSERT ((Qh != NULL) && (Td != NULL));\r
 \r
-  Qh->QhHw.VerticalLink = QH_VLINK (Td, FALSE);\r
+  Qh->QhHw.VerticalLink = QH_VLINK (PhyAddr, FALSE);\r
   Qh->TDs               = (VOID *) Td;\r
 }\r
 \r
@@ -177,8 +181,6 @@ UhciLinkTdToQh (
   @param  Qh          The queue head to unlink from.\r
   @param  Td          The TD to unlink.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 UhciUnlinkTdFromQh (\r
@@ -196,21 +198,25 @@ UhciUnlinkTdFromQh (
 /**\r
   Append a new TD To the previous TD.\r
 \r
+  @param  Uhc         The UHCI device.\r
   @param  PrevTd      Previous UHCI_TD_SW to be linked to.\r
   @param  ThisTd      TD to link.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 UhciAppendTd (\r
+  IN USB_HC_DEV     *Uhc,\r
   IN UHCI_TD_SW     *PrevTd,\r
   IN UHCI_TD_SW     *ThisTd\r
   )\r
 {\r
+  EFI_PHYSICAL_ADDRESS  PhyAddr;\r
+\r
+  PhyAddr = UsbHcGetPciAddressForHostMem (Uhc->MemPool, ThisTd, sizeof (UHCI_TD_HW));\r
+\r
   ASSERT ((PrevTd != NULL) && (ThisTd != NULL));\r
 \r
-  PrevTd->TdHw.NextLink = TD_LINK (ThisTd, TRUE, FALSE);\r
+  PrevTd->TdHw.NextLink = TD_LINK (PhyAddr, TRUE, FALSE);\r
   PrevTd->NextTd        = (VOID *) ThisTd;\r
 }\r
 \r
@@ -310,7 +316,8 @@ UhciCreateTd (
 \r
   @param  Uhc         The UHCI device.\r
   @param  DevAddr     Device address.\r
-  @param  Request     Device request.\r
+  @param  Request     A pointer to cpu memory address of Device request.\r
+  @param  RequestPhy  A pointer to pci memory address of Device request.\r
   @param  IsLow       Full speed or low speed.\r
 \r
   @return The created setup Td Pointer.\r
@@ -321,6 +328,7 @@ UhciCreateSetupTd (
   IN  USB_HC_DEV          *Uhc,\r
   IN  UINT8               DevAddr,\r
   IN  UINT8               *Request,\r
+  IN  UINT8               *RequestPhy,\r
   IN  BOOLEAN             IsLow\r
   )\r
 {\r
@@ -344,10 +352,10 @@ UhciCreateSetupTd (
   Td->TdHw.DeviceAddr   = DevAddr & 0x7F;\r
   Td->TdHw.MaxPacketLen = (UINT32) (sizeof (EFI_USB_DEVICE_REQUEST) - 1);\r
   Td->TdHw.PidCode      = SETUP_PACKET_ID;\r
-  Td->TdHw.DataBuffer   = (UINT32) (UINTN) Request;\r
+  Td->TdHw.DataBuffer   = (UINT32) (UINTN) RequestPhy;\r
 \r
   Td->Data              = Request;\r
-  Td->DataLen           = sizeof (EFI_USB_DEVICE_REQUEST);\r
+  Td->DataLen           = (UINT16) sizeof (EFI_USB_DEVICE_REQUEST);\r
 \r
   return Td;\r
 }\r
@@ -359,7 +367,8 @@ UhciCreateSetupTd (
   @param  Uhc         The UHCI device.\r
   @param  DevAddr     Device address.\r
   @param  Endpoint    Endpoint number.\r
-  @param  DataPtr     Data buffer.\r
+  @param  DataPtr     A pointer to cpu memory address of Data buffer.\r
+  @param  DataPhyPtr  A pointer to pci memory address of Data buffer.\r
   @param  Len         Data length.\r
   @param  PktId       Packet ID.\r
   @param  Toggle      Data toggle value.\r
@@ -374,6 +383,7 @@ UhciCreateDataTd (
   IN  UINT8               DevAddr,\r
   IN  UINT8               Endpoint,\r
   IN  UINT8               *DataPtr,\r
+  IN  UINT8               *DataPhyPtr,\r
   IN  UINTN               Len,\r
   IN  UINT8               PktId,\r
   IN  UINT8               Toggle,\r
@@ -397,7 +407,7 @@ UhciCreateDataTd (
   Td->TdHw.ShortPacket  = FALSE;\r
   Td->TdHw.IsIsoch      = FALSE;\r
   Td->TdHw.IntOnCpl     = FALSE;\r
-  Td->TdHw.ErrorCount   = 0X03;\r
+  Td->TdHw.ErrorCount   = 0x03;\r
   Td->TdHw.Status       = USBTD_ACTIVE;\r
   Td->TdHw.LowSpeed     = IsLow ? 1 : 0;\r
   Td->TdHw.DataToggle   = Toggle & 0x01;\r
@@ -405,7 +415,7 @@ UhciCreateDataTd (
   Td->TdHw.DeviceAddr   = DevAddr & 0x7F;\r
   Td->TdHw.MaxPacketLen = (UINT32) (Len - 1);\r
   Td->TdHw.PidCode      = (UINT8) PktId;\r
-  Td->TdHw.DataBuffer   = (UINT32) (UINTN) DataPtr;\r
+  Td->TdHw.DataBuffer   = (UINT32) (UINTN) DataPhyPtr;\r
 \r
   Td->Data              = DataPtr;\r
   Td->DataLen           = (UINT16) Len;\r
@@ -468,8 +478,10 @@ UhciCreateStatusTd (
   @param  Uhc         The UHCI device.\r
   @param  DeviceAddr  The device address.\r
   @param  DataPktId   Packet Identification of Data Tds.\r
-  @param  Request     A pointer to request structure buffer to transfer.\r
-  @param  Data        A pointer to user data buffer to transfer.\r
+  @param  Request     A pointer to cpu memory address of request structure buffer to transfer.\r
+  @param  RequestPhy  A pointer to pci memory address of request structure buffer to transfer.\r
+  @param  Data        A pointer to cpu memory address of user data buffer to transfer.\r
+  @param  DataPhy     A pointer to pci memory address of user data buffer to transfer.\r
   @param  DataLen     Length of user data to transfer.\r
   @param  MaxPacket   Maximum packet size for control transfer.\r
   @param  IsLow       Full speed or low speed.\r
@@ -483,7 +495,9 @@ UhciCreateCtrlTds (
   IN UINT8                DeviceAddr,\r
   IN UINT8                DataPktId,\r
   IN UINT8                *Request,\r
+  IN UINT8                *RequestPhy,\r
   IN UINT8                *Data,\r
+  IN UINT8                *DataPhy,\r
   IN UINTN                DataLen,\r
   IN UINT8                MaxPacket,\r
   IN BOOLEAN              IsLow\r
@@ -508,7 +522,7 @@ UhciCreateCtrlTds (
   //\r
   // Create setup packets for the transfer\r
   //\r
-  SetupTd = UhciCreateSetupTd (Uhc, DeviceAddr, Request, IsLow);\r
+  SetupTd = UhciCreateSetupTd (Uhc, DeviceAddr, Request, RequestPhy, IsLow);\r
 \r
   if (SetupTd == NULL) {\r
     return NULL;\r
@@ -529,7 +543,8 @@ UhciCreateCtrlTds (
                Uhc,\r
                DeviceAddr,\r
                0,\r
-               Data,\r
+               Data,  //cpu memory address\r
+               DataPhy, //Pci memory address\r
                ThisTdLen,\r
                DataPktId,\r
                DataToggle,\r
@@ -544,12 +559,13 @@ UhciCreateCtrlTds (
       FirstDataTd         = DataTd;\r
       FirstDataTd->NextTd = NULL;\r
     } else {\r
-      UhciAppendTd (PrevDataTd, DataTd);\r
+      UhciAppendTd (Uhc, PrevDataTd, DataTd);\r
     }\r
 \r
     DataToggle ^= 1;\r
     PrevDataTd = DataTd;\r
     Data += ThisTdLen;\r
+    DataPhy += ThisTdLen;\r
     DataLen -= ThisTdLen;\r
   }\r
 \r
@@ -572,10 +588,10 @@ UhciCreateCtrlTds (
   // Link setup Td -> data Tds -> status Td together\r
   //\r
   if (FirstDataTd != NULL) {\r
-    UhciAppendTd (SetupTd, FirstDataTd);\r
-    UhciAppendTd (PrevDataTd, StatusTd);\r
+    UhciAppendTd (Uhc, SetupTd, FirstDataTd);\r
+    UhciAppendTd (Uhc, PrevDataTd, StatusTd);\r
   } else {\r
-    UhciAppendTd (SetupTd, StatusTd);\r
+    UhciAppendTd (Uhc, SetupTd, StatusTd);\r
   }\r
 \r
   return SetupTd;\r
@@ -600,7 +616,8 @@ FREE_TD:
   @param  DevAddr     Address of Device.\r
   @param  EndPoint    Endpoint Number.\r
   @param  PktId       Packet Identification of Data Tds.\r
-  @param  Data        A pointer to user data buffer to transfer.\r
+  @param  Data        A pointer to cpu memory address of user data buffer to transfer.\r
+  @param  DataPhy     A pointer to pci memory address of user data buffer to transfer.\r
   @param  DataLen     Length of user data to transfer.\r
   @param  DataToggle  Data Toggle Pointer.\r
   @param  MaxPacket   Maximum packet size for Bulk/Interrupt transfer.\r
@@ -616,6 +633,7 @@ UhciCreateBulkOrIntTds (
   IN UINT8                EndPoint,\r
   IN UINT8                PktId,\r
   IN UINT8                *Data,\r
+  IN UINT8                *DataPhy,\r
   IN UINTN                DataLen,\r
   IN OUT UINT8            *DataToggle,\r
   IN UINT8                MaxPacket,\r
@@ -649,6 +667,7 @@ UhciCreateBulkOrIntTds (
                DevAddr,\r
                EndPoint,\r
                Data,\r
+               DataPhy,\r
                ThisTdLen,\r
                PktId,\r
                *DataToggle,\r
@@ -667,12 +686,13 @@ UhciCreateBulkOrIntTds (
       FirstDataTd         = DataTd;\r
       FirstDataTd->NextTd = NULL;\r
     } else {\r
-      UhciAppendTd (PrevDataTd, DataTd);\r
+      UhciAppendTd (Uhc, PrevDataTd, DataTd);\r
     }\r
 \r
     *DataToggle ^= 1;\r
     PrevDataTd   = DataTd;\r
     Data        += ThisTdLen;\r
+    DataPhy     += ThisTdLen;\r
     DataLen     -= ThisTdLen;\r
   }\r
 \r