aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHaojian Zhuang <haojian.zhuang@linaro.org>2018-02-12 12:05:32 +0800
committerGitHub <noreply@github.com>2018-02-12 12:05:32 +0800
commitc06852ff6f676cc62dc2072c2a8d82ecd05a774e (patch)
treeef120029fda46513dbc2810c75c9296dbaba059b
parent28f2641e36a936b97c0187b0ba47a0e2d6315562 (diff)
parent88ff655659d2bd16f47dae5e48259ac7f6311a9d (diff)
downloadOpenPlatformPkg-c06852ff6f676cc62dc2072c2a8d82ecd05a774e.tar.gz
Merge pull request #100 from hzhuang1/dw_2
Drivers/DwMmcHcDxe: optimize the delay
-rw-r--r--Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
index 3d03780..5db5f34 100644
--- a/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
+++ b/Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c
@@ -1522,10 +1522,13 @@ DwEmmcExecTrb (
UINT32 IntStatus;
UINT32 Argument;
UINT32 ErrMask;
+ UINT32 Timeout;
Packet = Trb->Packet;
PciIo = Trb->Private->PciIo;
+ ArmDataSynchronizationBarrier ();
+ ArmInstructionSynchronizationBarrier ();
// Wait until MMC is idle
do {
Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_STATUS, TRUE, sizeof (MmcStatus), &MmcStatus);
@@ -1588,16 +1591,23 @@ DwEmmcExecTrb (
if (EFI_ERROR (Status)) {
return Status;
}
+ ArmDataSynchronizationBarrier ();
+ ArmInstructionSynchronizationBarrier ();
Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_CMD, FALSE, sizeof (Cmd), &Cmd);
if (EFI_ERROR (Status)) {
return Status;
}
+ ArmDataSynchronizationBarrier ();
+ ArmInstructionSynchronizationBarrier ();
ErrMask = DW_MMC_INT_EBE | DW_MMC_INT_HLE | DW_MMC_INT_RTO |
DW_MMC_INT_RCRC | DW_MMC_INT_RE;
ErrMask |= DW_MMC_INT_DCRC | DW_MMC_INT_DRT | DW_MMC_INT_SBE;
do {
- MicroSecondDelay (500);
+ Timeout = 10000;
+ if (--Timeout == 0) {
+ break;
+ }
Status = DwMmcHcRwMmio (PciIo, Trb->Slot, DW_MMC_RINTSTS, TRUE, sizeof (IntStatus), &IntStatus);
if (EFI_ERROR (Status)) {
return Status;
@@ -1605,9 +1615,12 @@ DwEmmcExecTrb (
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 Not Done
+ MicroSecondDelay (10);
+ continue;
}
+ MicroSecondDelay (10);
} while (!(IntStatus & DW_MMC_INT_CMD_DONE));
switch (Packet->SdMmcCmdBlk->ResponseType) {
case SdMmcResponseTypeR1:
@@ -1791,12 +1804,12 @@ DwSdExecTrb (
if (IntStatus & ErrMask) {
return EFI_DEVICE_ERROR;
}
- if (Trb->DataLen && ((IntStatus & DW_MMC_INT_DTO) == 0)) { // Transfer Done
+ if (Trb->DataLen && ((IntStatus & DW_MMC_INT_DTO) == 0)) {
+ // Transfer not Done
MicroSecondDelay (10);
continue;
- } else {
- MicroSecondDelay (10);
}
+ MicroSecondDelay (10);
} while (!(IntStatus & DW_MMC_INT_CMD_DONE));
if (Packet->InTransferLength) {
do {