diff options
author | Dmitry Shmidt <dimitrysh@google.com> | 2017-11-29 18:48:28 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-11-29 18:48:28 +0000 |
commit | c848f5c54cd885f2f976d986c92d709e8d7d5558 (patch) | |
tree | 3a3c5774d1704cbd751fef4a024cfbe3799672e5 | |
parent | ef5b4f68b369ad849c84a22df58b73d7c6f05d83 (diff) | |
parent | b1f857f47d6dc8fcfd8b212cda72ee15c2c188bb (diff) | |
download | device_linaro_bootloader_OpenPlatformPkg-c848f5c54cd885f2f976d986c92d709e8d7d5558.tar.gz device_linaro_bootloader_OpenPlatformPkg-c848f5c54cd885f2f976d986c92d709e8d7d5558.tar.bz2 device_linaro_bootloader_OpenPlatformPkg-c848f5c54cd885f2f976d986c92d709e8d7d5558.zip |
Merge remote-tracking branch 'aosp/upstream-hikey-aosp' into opp
am: b1f857f47d
Change-Id: I726807c2ec66787dcf6737ed495fd7ee51120dcf
-rw-r--r-- | Drivers/SdMmc/DwMmcHcDxe/DwMmcHcDxe.h | 1 | ||||
-rw-r--r-- | Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c | 75 | ||||
-rw-r--r-- | Drivers/SdMmc/DwMmcHcDxe/SdDevice.c | 13 | ||||
-rw-r--r-- | Drivers/Usb/DwUsb3Dxe/DwUsb3Dxe.c | 41 | ||||
-rw-r--r-- | Platforms/Hisilicon/HiKey/HiKey.dsc | 2 | ||||
-rw-r--r-- | Platforms/Hisilicon/HiKey960/HiKey960.dsc | 2 |
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
|