MdeModulePkg/SdMmcPciHcDxe: Enhance driver traces

To allow for easier debug of failing commands we
have added a capability to print TRB and command
packet when we start execution of the TRB(on
DEBUG_VERBOSE level) and when the TRB failed to
execute correctly(on DEBUG_ERROR level). Additionally
we will also print error interrupt status and interrupt
status register on failed SD command.

Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Marcin Wojtas <mw@semihalf.com>
Cc: Zhichao Gao <zhichao.gao@intel.com>
Cc: Liming Gao <liming.gao@intel.com>

Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com>
Tested-by: Hao A Wu <hao.a.wu@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
Albecki, Mateusz 2020-02-28 01:25:22 +08:00 committed by mergify[bot]
parent 643623147a
commit 9767a597d7
1 changed files with 87 additions and 0 deletions

View File

@ -1647,6 +1647,82 @@ BuildAdmaDescTable (
return EFI_SUCCESS;
}
/**
Prints the contents of the command packet to the debug port.
@param[in] DebugLevel Debug level at which the packet should be printed.
@param[in] Packet Pointer to packet to print.
**/
VOID
SdMmcPrintPacket (
IN UINT32 DebugLevel,
IN EFI_SD_MMC_PASS_THRU_COMMAND_PACKET *Packet
)
{
if (Packet == NULL) {
return;
}
DEBUG ((DebugLevel, "Printing EFI_SD_MMC_PASS_THRU_COMMAND_PACKET\n"));
if (Packet->SdMmcCmdBlk != NULL) {
DEBUG ((DebugLevel, "Command index: %d, argument: %X\n", Packet->SdMmcCmdBlk->CommandIndex, Packet->SdMmcCmdBlk->CommandArgument));
DEBUG ((DebugLevel, "Command type: %d, response type: %d\n", Packet->SdMmcCmdBlk->CommandType, Packet->SdMmcCmdBlk->ResponseType));
}
if (Packet->SdMmcStatusBlk != NULL) {
DEBUG ((DebugLevel, "Response 0: %X, 1: %X, 2: %X, 3: %X\n",
Packet->SdMmcStatusBlk->Resp0,
Packet->SdMmcStatusBlk->Resp1,
Packet->SdMmcStatusBlk->Resp2,
Packet->SdMmcStatusBlk->Resp3
));
}
DEBUG ((DebugLevel, "Timeout: %ld\n", Packet->Timeout));
DEBUG ((DebugLevel, "InDataBuffer: %p\n", Packet->InDataBuffer));
DEBUG ((DebugLevel, "OutDataBuffer: %p\n", Packet->OutDataBuffer));
DEBUG ((DebugLevel, "InTransferLength: %d\n", Packet->InTransferLength));
DEBUG ((DebugLevel, "OutTransferLength: %d\n", Packet->OutTransferLength));
DEBUG ((DebugLevel, "TransactionStatus: %r\n", Packet->TransactionStatus));
}
/**
Prints the contents of the TRB to the debug port.
@param[in] DebugLevel Debug level at which the TRB should be printed.
@param[in] Trb Pointer to the TRB structure.
**/
VOID
SdMmcPrintTrb (
IN UINT32 DebugLevel,
IN SD_MMC_HC_TRB *Trb
)
{
if (Trb == NULL) {
return;
}
DEBUG ((DebugLevel, "Printing SD_MMC_HC_TRB\n"));
DEBUG ((DebugLevel, "Slot: %d\n", Trb->Slot));
DEBUG ((DebugLevel, "BlockSize: %d\n", Trb->BlockSize));
DEBUG ((DebugLevel, "Data: %p\n", Trb->Data));
DEBUG ((DebugLevel, "DataLen: %d\n", Trb->DataLen));
DEBUG ((DebugLevel, "Read: %d\n", Trb->Read));
DEBUG ((DebugLevel, "DataPhy: %lX\n", Trb->DataPhy));
DEBUG ((DebugLevel, "DataMap: %p\n", Trb->DataMap));
DEBUG ((DebugLevel, "Mode: %d\n", Trb->Mode));
DEBUG ((DebugLevel, "AdmaLengthMode: %d\n", Trb->AdmaLengthMode));
DEBUG ((DebugLevel, "Event: %p\n", Trb->Event));
DEBUG ((DebugLevel, "Started: %d\n", Trb->Started));
DEBUG ((DebugLevel, "Timeout: %ld\n", Trb->Timeout));
DEBUG ((DebugLevel, "Retries: %d\n", Trb->Retries));
DEBUG ((DebugLevel, "Adma32Desc: %p\n", Trb->Adma32Desc));
DEBUG ((DebugLevel, "Adma64V3Desc: %p\n", Trb->Adma64V3Desc));
DEBUG ((DebugLevel, "Adma64V4Desc: %p\n", Trb->Adma64V4Desc));
DEBUG ((DebugLevel, "AdmaMap: %p\n", Trb->AdmaMap));
DEBUG ((DebugLevel, "AdmaPages: %X\n", Trb->AdmaPages));
SdMmcPrintPacket (DebugLevel, Trb->Packet);
}
/**
Create a new TRB for the SD/MMC cmd request.
@ -2238,6 +2314,10 @@ SdMmcCheckAndRecoverErrors (
return Status;
}
DEBUG ((DEBUG_ERROR, "Error reported by SDHCI\n"));
DEBUG ((DEBUG_ERROR, "Interrupt status = %X\n", IntStatus));
DEBUG ((DEBUG_ERROR, "Error interrupt status = %X\n", ErrIntStatus));
//
// If the data timeout error is reported
// but data transfer is signaled as completed we
@ -2441,6 +2521,13 @@ Done:
if (Status != EFI_NOT_READY) {
SdMmcHcLedOnOff (Private->PciIo, Trb->Slot, FALSE);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "TRB failed with %r\n", Status));
SdMmcPrintTrb (DEBUG_ERROR, Trb);
} else {
DEBUG ((DEBUG_VERBOSE, "TRB success\n"));
SdMmcPrintTrb (DEBUG_VERBOSE, Trb);
}
}
return Status;