mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-27 15:44:04 +02:00
MdeModulePkg/UfsPassThruDxe: Refactor UfsExecUicCommand function
https://bugzilla.tianocore.org/show_bug.cgi?id=1343 UfsExecUicCommand function has been refactored to allow the caller to check the command results which is important for commands such as UIC read. Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
parent
1bfd58c22e
commit
90952ad733
@ -1,6 +1,6 @@
|
|||||||
/** @file
|
/** @file
|
||||||
|
|
||||||
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
@ -13,6 +13,7 @@
|
|||||||
#include <Protocol/ScsiPassThruExt.h>
|
#include <Protocol/ScsiPassThruExt.h>
|
||||||
#include <Protocol/UfsDeviceConfig.h>
|
#include <Protocol/UfsDeviceConfig.h>
|
||||||
#include <Protocol/UfsHostController.h>
|
#include <Protocol/UfsHostController.h>
|
||||||
|
#include <Protocol/UfsHostControllerPlatform.h>
|
||||||
|
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
#include <Library/UefiDriverEntryPoint.h>
|
#include <Library/UefiDriverEntryPoint.h>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
|
UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
|
||||||
for upper layer application to execute UFS-supported SCSI cmds.
|
for upper layer application to execute UFS-supported SCSI cmds.
|
||||||
|
|
||||||
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
@ -1633,11 +1633,8 @@ Exit1:
|
|||||||
/**
|
/**
|
||||||
Send UIC command.
|
Send UIC command.
|
||||||
|
|
||||||
@param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure.
|
@param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure.
|
||||||
@param[in] UicOpcode The opcode of the UIC command.
|
@param[in, out] UicCommand UIC command descriptor. On exit contains UIC command results.
|
||||||
@param[in] Arg1 The value for 1st argument of the UIC command.
|
|
||||||
@param[in] Arg2 The value for 2nd argument of the UIC command.
|
|
||||||
@param[in] Arg3 The value for 3rd argument of the UIC command.
|
|
||||||
|
|
||||||
@return EFI_SUCCESS Successfully execute this UIC command and detect attached UFS device.
|
@return EFI_SUCCESS Successfully execute this UIC command and detect attached UFS device.
|
||||||
@return EFI_DEVICE_ERROR Fail to execute this UIC command and detect attached UFS device.
|
@return EFI_DEVICE_ERROR Fail to execute this UIC command and detect attached UFS device.
|
||||||
@ -1646,10 +1643,7 @@ Exit1:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UfsExecUicCommands (
|
UfsExecUicCommands (
|
||||||
IN UFS_PASS_THRU_PRIVATE_DATA *Private,
|
IN UFS_PASS_THRU_PRIVATE_DATA *Private,
|
||||||
IN UINT8 UicOpcode,
|
IN OUT EDKII_UIC_COMMAND *UicCommand
|
||||||
IN UINT32 Arg1,
|
|
||||||
IN UINT32 Arg2,
|
|
||||||
IN UINT32 Arg3
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -1675,17 +1669,17 @@ UfsExecUicCommands (
|
|||||||
// only after all the UIC command argument registers (UICCMDARG1, UICCMDARG2 and UICCMDARG3)
|
// only after all the UIC command argument registers (UICCMDARG1, UICCMDARG2 and UICCMDARG3)
|
||||||
// are set.
|
// are set.
|
||||||
//
|
//
|
||||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG1_OFFSET, Arg1);
|
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG1_OFFSET, UicCommand->Arg1);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG2_OFFSET, Arg2);
|
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG2_OFFSET, UicCommand->Arg2);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG3_OFFSET, Arg3);
|
Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG3_OFFSET, UicCommand->Arg3);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -1698,7 +1692,7 @@ UfsExecUicCommands (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = UfsMmioWrite32 (Private, UFS_HC_UIC_CMD_OFFSET, (UINT32)UicOpcode);
|
Status = UfsMmioWrite32 (Private, UFS_HC_UIC_CMD_OFFSET, UicCommand->Opcode);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -1712,14 +1706,18 @@ UfsExecUicCommands (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UicOpcode != UfsUicDmeReset) {
|
if (UicCommand->Opcode != UfsUicDmeReset) {
|
||||||
Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &Data);
|
Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &UicCommand->Arg2);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
if ((Data & 0xFF) != 0) {
|
Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG3_OFFSET, &UicCommand->Arg3);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
if ((UicCommand->Arg2 & 0xFF) != 0) {
|
||||||
DEBUG_CODE_BEGIN();
|
DEBUG_CODE_BEGIN();
|
||||||
DumpUicCmdExecResult (UicOpcode, (UINT8)(Data & 0xFF));
|
DumpUicCmdExecResult ((UINT8)UicCommand->Opcode, (UINT8)(UicCommand->Arg2 & 0xFF));
|
||||||
DEBUG_CODE_END();
|
DEBUG_CODE_END();
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -1898,16 +1896,21 @@ UfsDeviceDetection (
|
|||||||
IN UFS_PASS_THRU_PRIVATE_DATA *Private
|
IN UFS_PASS_THRU_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Retry;
|
UINTN Retry;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 Data;
|
UINT32 Data;
|
||||||
|
EDKII_UIC_COMMAND LinkStartupCommand;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Start UFS device detection.
|
// Start UFS device detection.
|
||||||
// Try up to 3 times for establishing data link with device.
|
// Try up to 3 times for establishing data link with device.
|
||||||
//
|
//
|
||||||
for (Retry = 0; Retry < 3; Retry++) {
|
for (Retry = 0; Retry < 3; Retry++) {
|
||||||
Status = UfsExecUicCommands (Private, UfsUicDmeLinkStartup, 0, 0, 0);
|
LinkStartupCommand.Opcode = UfsUicDmeLinkStartup;
|
||||||
|
LinkStartupCommand.Arg1 = 0;
|
||||||
|
LinkStartupCommand.Arg2 = 0;
|
||||||
|
LinkStartupCommand.Arg3 = 0;
|
||||||
|
Status = UfsExecUicCommands (Private, &LinkStartupCommand);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user