diff options
author | Haojian Zhuang <haojian.zhuang@linaro.org> | 2018-02-12 12:05:32 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-12 12:05:32 +0800 |
commit | c06852ff6f676cc62dc2072c2a8d82ecd05a774e (patch) | |
tree | ef120029fda46513dbc2810c75c9296dbaba059b | |
parent | 28f2641e36a936b97c0187b0ba47a0e2d6315562 (diff) | |
parent | 88ff655659d2bd16f47dae5e48259ac7f6311a9d (diff) | |
download | OpenPlatformPkg-c06852ff6f676cc62dc2072c2a8d82ecd05a774e.tar.gz |
Merge pull request #100 from hzhuang1/dw_2
Drivers/DwMmcHcDxe: optimize the delay
-rw-r--r-- | Drivers/SdMmc/DwMmcHcDxe/DwMmcHci.c | 25 |
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 {
|