Merge remote-tracking branch 'aosp/upstream-hikey-aosp' into opp

Change-Id: Ia7da9569b03f596805bf705b458daf28901e2ae0
diff --git a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h
index 4e175b9..4fe040e 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h
+++ b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h
@@ -139,6 +139,7 @@
   VOID                                *DmaMap;

 

   BOOLEAN                             UseFifo;

+  BOOLEAN                             UseBE;                  // Big-endian

 

   DW_MMC_HC_PRIVATE_DATA              *Private;

 } DW_MMC_HC_TRB;

diff --git a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
index 9ca044b..cf34e30 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
+++ b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
@@ -1214,17 +1214,23 @@
   UINT32                    Intsts;

   UINT32                    Sts;

   UINT32                    FifoCount;

+  UINT32                    Index;     // count with bytes

+  UINT32                    Ascending;

+  UINT32                    Descending;

 

   PciIo   = Trb->Private->PciIo;

   Received = 0;

-  Count = (Trb->DataLen + 3) / 4;

-  while (1) {

+  Count = 0;

+  Index = 0;

+  Ascending = 0;

+  Descending = ((Trb->DataLen + 3) & ~3) - 4;

+  do {

     Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, TRUE, sizeof (Intsts), &Intsts);

     if (EFI_ERROR (Status)) {

       DEBUG ((DEBUG_ERROR, "ReadFifo: failed to read RINTSTS, Status:%r\n", Status));

       return Status;

     }

-    if (Intsts & DW_MMC_INT_DTO) {

+    if (Trb->DataLen && ((Intsts & DW_MMC_INT_RXDR) || (Intsts & DW_MMC_INT_DTO))) {

       Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_STATUS, TRUE, sizeof (Sts), &Sts);

       if (EFI_ERROR (Status)) {

         DEBUG ((DEBUG_ERROR, "ReadFifo: failed to read STATUS, Status:%r\n", Status));

@@ -1232,28 +1238,30 @@
       }

       // Convert to bytes

       FifoCount = GET_STS_FIFO_COUNT (Sts) << 2;

-      Count = (MIN (FifoCount, Trb->DataLen) + 3) / 4;

-      Received = 0;

-      // Read FIFO

-      while (Count && (Received < Count)) {

+      if ((FifoCount == 0) && (Received < Trb->DataLen)) {

+        continue;

+      }

+      Index = 0;

+      Count = (MIN (FifoCount, Trb->DataLen) + 3) & ~3;

+      while (Index < Count) {

         Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_FIFO_START, TRUE, sizeof (Data), &Data);

         if (EFI_ERROR (Status)) {

           DEBUG ((DEBUG_ERROR, "ReadFifo: failed to read FIFO, Status:%r\n", Status));

           return Status;

         }

-        *(UINT32 *)((UINTN)Trb->Data + ((Count - Received - 1) << 2)) = SwapBytes32 (Data);

-        Received++;

-      }

-    }

-    if (Intsts & DW_MMC_INT_CMD_DONE) {

-      if ((Intsts == DW_MMC_INT_CMD_DONE) && Count) {

-        // CMD_DONE interrupt comes earlier before other interrupts. Just wait for a while.

-        continue;

-      } else {

-        break;

-      }

-    }

-  }

+        if (Trb->UseBE) {

+          *(UINT32 *)((UINTN)Trb->Data + Descending) = SwapBytes32 (Data);

+          Descending = Descending - 4;

+        } else {

+          *(UINT32 *)((UINTN)Trb->Data + Ascending) = Data;

+          Ascending += 4;

+        }

+        Index += 4;

+        Received += 4;

+      } // while

+    } // if

+  } while (((Intsts & DW_MMC_INT_CMD_DONE) == 0) || (Received < Trb->DataLen));

+  // Clear RINTSTS

   Intsts = ~0;

   Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, FALSE, sizeof (Intsts), &Intsts);

   if (EFI_ERROR (Status)) {

@@ -1334,9 +1342,13 @@
     }

 

     PciIo = Private->PciIo;

+#if 0

     if ((Private->Slot[Trb->Slot].CardType == SdCardType) &&

         (Trb->DataLen != 0) &&

         (Trb->DataLen <= DWMMC_FIFO_THRESHOLD)) {

+#else

+    if (Private->Slot[Trb->Slot].CardType == SdCardType) {

+#endif

       Trb->UseFifo = TRUE;

     } else {

       Trb->UseFifo = FALSE;

@@ -1689,6 +1701,9 @@
     case SD_STOP_TRANSMISSION:

       Cmd |= BIT_CMD_STOP_ABORT_CMD;

       break;

+    case SD_SEND_SCR:

+      Trb->UseBE = TRUE;

+      break;

     }

     if (Packet->InTransferLength) {

       Cmd |= BIT_CMD_WAIT_PRVDATA_COMPLETE | BIT_CMD_DATA_EXPECTED | BIT_CMD_READ;

@@ -1725,7 +1740,11 @@
     if (EFI_ERROR (Status)) {

       return Status;

     }

-    BlkSize = Packet->InTransferLength;

+    if (Packet->InTransferLength > DW_MMC_BLOCK_SIZE) {

+      BlkSize = DW_MMC_BLOCK_SIZE;

+    } else {

+      BlkSize = Packet->InTransferLength;

+    }

     Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_BLKSIZ, FALSE, sizeof (BlkSize), &BlkSize);

     if (EFI_ERROR (Status)) {

       DEBUG ((DEBUG_ERROR, "DwMmcHcReset: set block size fails: %r\n", Status));

@@ -1761,6 +1780,9 @@
   } else {

     Timeout = 10000;

     do {

+      if (--Timeout == 0) {

+        break;

+      }

       Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, TRUE, sizeof (IntStatus), &IntStatus);

       if (EFI_ERROR (Status)) {

         return Status;

@@ -1768,13 +1790,12 @@
       if (IntStatus & ErrMask) {

         return EFI_DEVICE_ERROR;

       }

-      if (IntStatus & DW_MMC_INT_DTO) {  // Transfer Done

-        break;

+      if (Trb->DataLen && ((IntStatus & DW_MMC_INT_DTO) == 0)) {  // Transfer Done

+        MicroSecondDelay (10);

+        continue;

+      } else {

+        MicroSecondDelay (10);

       }

-      if (--Timeout == 0) {

-        break;

-      }

-      MicroSecondDelay (10);

     } while (!(IntStatus & DW_MMC_INT_CMD_DONE));

     if (Packet->InTransferLength) {

       do {

diff --git a/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c b/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c
index fdbe383..4f14b60 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c
+++ b/Drivers/SdMmc/DwMmcHcDxe/SdDevice.c
@@ -949,16 +949,7 @@
     return Status;

   }

   //

-  // 3. Send SDIO Cmd5 to the device to the SDIO device OCR register.

-  //

-  Status = SdioSendOpCond (PassThru, Slot, 0, FALSE);

-  if (!EFI_ERROR (Status)) {

-    DEBUG ((DEBUG_INFO, "SdCardIdentification: Found SDIO device, ignore it as we don't support\n"));

-    return EFI_DEVICE_ERROR;

-  }

-  MicroSecondDelay (10000);

-  //

-  // 4. Send Acmd41 with voltage window 0 to the device

+  // 3. Send Acmd41 with voltage window 0 to the device

   //

   Status = SdCardSendOpCond (PassThru, Slot, 0, 0, FALSE, FALSE, FALSE, &Ocr);

   if (EFI_ERROR (Status)) {

@@ -996,7 +987,7 @@
   }

 

   //

-  // 5. Repeatly send Acmd41 with supply voltage window to the device.

+  // 4. Repeatly send Acmd41 with supply voltage window to the device.

   //    Note here we only support the cards complied with SD physical

   //    layer simplified spec version 2.0 and version 3.0 and above.

   //

diff --git a/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c b/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c
index 5ed3dd4..c2fad30 100644
--- a/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c
+++ b/Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c
@@ -88,6 +88,7 @@
 #define USB3_STATUS_BUF_SIZE    512
 STATIC UINT8                          *gEndPoint0StatusBuf;
 STATIC USB_DEVICE_RX_CALLBACK         mDataReceivedCallback;
+STATIC UINTN                          mDataBufferSize;
 /*
 	UINT8 ep0_status_buf[USB3_STATUS_BUF_SIZE];
 */
@@ -1755,7 +1756,18 @@
         ASSERT (gRxBuf != NULL);
         WriteBackDataCacheRange (gRxBuf, DATA_SIZE);
         req->bufdma = (UINT64 *)gRxBuf;
-        req->length = DATA_SIZE;
+        if (mDataBufferSize == 0) {
+          req->length = CMD_SIZE;
+        } else if (mDataBufferSize > DATA_SIZE) {
+          req->length = DATA_SIZE;
+          mDataBufferSize = mDataBufferSize - DATA_SIZE;
+        } else if (mDataBufferSize > CMD_SIZE) {
+          req->length = CMD_SIZE;
+          mDataBufferSize = mDataBufferSize - CMD_SIZE;
+        } else {
+          req->length = mDataBufferSize;
+          mDataBufferSize = 0;
+        }
         DwUsb3EndPointXStartTransfer (pcd, ep);
       }
     } else {
@@ -2115,7 +2127,18 @@
       ASSERT (gRxBuf != NULL);
       WriteBackDataCacheRange (gRxBuf, DATA_SIZE);
       req->bufdma = (UINT64 *)gRxBuf;
-      req->length = DATA_SIZE;
+      if (mDataBufferSize == 0) {
+        req->length = CMD_SIZE;
+      } else if (mDataBufferSize > DATA_SIZE) {
+        req->length = DATA_SIZE;
+        mDataBufferSize = mDataBufferSize - DATA_SIZE;
+      } else if (mDataBufferSize > CMD_SIZE) {
+        req->length = CMD_SIZE;
+        mDataBufferSize = mDataBufferSize - CMD_SIZE;
+      } else {
+        req->length = mDataBufferSize;
+        mDataBufferSize = 0;
+      }
       DwUsb3EndPointXStartTransfer (pcd, ep);
     }
   }
@@ -2301,9 +2324,21 @@
   return EFI_SUCCESS;
 }
 
+EFI_STATUS
+DwUsb3Request (
+  IN UINTN   BufferSize
+  )
+{
+  if (BufferSize) {
+    mDataBufferSize = BufferSize;
+  }
+  return EFI_SUCCESS;
+}
+
 USB_DEVICE_PROTOCOL mUsbDevice = {
   DwUsb3Start,
-  DwUsb3Send
+  DwUsb3Send,
+  DwUsb3Request
 };
 
 EFI_STATUS
diff --git a/Platforms/Hisilicon/HiKey/HiKey.dsc b/Platforms/Hisilicon/HiKey/HiKey.dsc
index 3a6b554..3b99cf5 100644
--- a/Platforms/Hisilicon/HiKey/HiKey.dsc
+++ b/Platforms/Hisilicon/HiKey/HiKey.dsc
@@ -358,7 +358,7 @@
   # Android Loader

   #

   gEmbeddedTokenSpaceGuid.PcdAndroidBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00D023F70000000000)/eMMC(0x0)/Ctrl(0x0)/HD(6,GPT,5C0F213C-17E1-4149-88C8-8B50FB4EC70E,0x7000,0x20000)"

-  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00E023F70000000000)/SD(0x0)/HD(1,MBR,0x00000000,0x3F,0x21FC0)"

+  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00E023F70000000000)/SD(0x0)/HD(1,MBR,0x263000B1,0x3F,0x21FC0)"

 

   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|1

 

diff --git a/Platforms/Hisilicon/HiKey960/HiKey960.dsc b/Platforms/Hisilicon/HiKey960/HiKey960.dsc
index ae979d5..4f40969 100644
--- a/Platforms/Hisilicon/HiKey960/HiKey960.dsc
+++ b/Platforms/Hisilicon/HiKey960/HiKey960.dsc
@@ -369,7 +369,7 @@
   # Android Loader

   #

   gEmbeddedTokenSpaceGuid.PcdAndroidBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00003BFF0000000000)/UFS(0x0,0x3)/HD(7,GPT,D3340696-9B95-4C64-8DF6-E6D4548FBA41,0x12100,0x4000)"

-  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00F037FF0000000000)/SD(0x0)/HD(1,MBR,0x00000000,0x3F,0x21FC0)"

+  gEmbeddedTokenSpaceGuid.PcdSdBootDevicePath|L"VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,00F037FF0000000000)/SD(0x0)/HD(1,MBR,0x263000B1,0x3F,0x21FC0)"

 

   gEfiMdePkgTokenSpaceGuid.PcdPlatformBootTimeOut|1