aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-11-30 08:57:33 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-11-30 08:57:33 +0000
commit0ad1035bcda7c1cd238d8593c85d0e5bda025b4b (patch)
tree3a3c5774d1704cbd751fef4a024cfbe3799672e5
parent53f1ccb0ceb6667ad961d9406af520aa22797ceb (diff)
parent03a789f5c8f08fd2403e4903dbcc6b9cd923b5ff (diff)
downloaddevice_linaro_bootloader_OpenPlatformPkg-0ad1035bcda7c1cd238d8593c85d0e5bda025b4b.tar.gz
device_linaro_bootloader_OpenPlatformPkg-0ad1035bcda7c1cd238d8593c85d0e5bda025b4b.tar.bz2
device_linaro_bootloader_OpenPlatformPkg-0ad1035bcda7c1cd238d8593c85d0e5bda025b4b.zip
Snap for 4476081 from 03a789f5c8f08fd2403e4903dbcc6b9cd923b5ff to pi-release
Change-Id: I71057a3090c81b949eb9bdf8c683855c572a0e16
-rw-r--r--Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h1
-rw-r--r--Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c75
-rw-r--r--Drivers/SdMmc/DwMmcHcDxe/SdDevice.c13
-rw-r--r--Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c41
-rw-r--r--Platforms/Hisilicon/HiKey/HiKey.dsc2
-rw-r--r--Platforms/Hisilicon/HiKey960/HiKey960.dsc2
6 files changed, 91 insertions, 43 deletions
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 @@ typedef struct {
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 @@ ReadFifo (
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 @@ ReadFifo (
}
// 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 @@ DwMmcCreateTrb (
}
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 @@ DwSdExecTrb (
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 @@ DwSdExecTrb (
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 @@ DwSdExecTrb (
} 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 @@ DwSdExecTrb (
if (IntStatus & ErrMask) {
return EFI_DEVICE_ERROR;
}
- if (IntStatus & DW_MMC_INT_DTO) { // Transfer Done
- break;
- }
- if (--Timeout == 0) {
- break;
+ if (Trb->DataLen && ((IntStatus & DW_MMC_INT_DTO) == 0)) { // Transfer Done
+ MicroSecondDelay (10);
+ continue;
+ } else {
+ MicroSecondDelay (10);
}
- 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 @@ SdCardIdentification (
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 @@ SdCardIdentification (
}
//
- // 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 @@ STATIC usb_setup_pkt_t *gEndPoint0SetupPacket;
#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 @@ DwUsb3DoSetConfig (
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 @@ DwUsb3EndPointcompleteRequest (
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 @@ DwUsb3Send (
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