From: Albecki, Mateusz Date: Fri, 9 Aug 2019 14:36:18 +0000 (+0800) Subject: MdeModulePkg/UfsPassThruDxe: Refactor UfsExecUicCommand function X-Git-Tag: edk2-stable201908~114 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=90952ad7339e19b5dcfc44a4559bce813f063e4a 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 Reviewed-by: Hao A Wu --- diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h index 9b68db5ffe..b79be77709 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h @@ -1,6 +1,6 @@ /** @file - Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -13,6 +13,7 @@ #include #include #include +#include #include #include diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c index 912d6f8202..6ea27e473c 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -2,7 +2,7 @@ UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface for upper layer application to execute UFS-supported SCSI cmds. - Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -1633,11 +1633,8 @@ Exit1: /** Send UIC command. - @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] 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. + @param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure. + @param[in, out] UicCommand UIC command descriptor. On exit contains UIC command results. @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. @@ -1646,10 +1643,7 @@ Exit1: EFI_STATUS UfsExecUicCommands ( IN UFS_PASS_THRU_PRIVATE_DATA *Private, - IN UINT8 UicOpcode, - IN UINT32 Arg1, - IN UINT32 Arg2, - IN UINT32 Arg3 + IN OUT EDKII_UIC_COMMAND *UicCommand ) { EFI_STATUS Status; @@ -1675,17 +1669,17 @@ UfsExecUicCommands ( // only after all the UIC command argument registers (UICCMDARG1, UICCMDARG2 and UICCMDARG3) // 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)) { 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)) { 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)) { return Status; } @@ -1698,7 +1692,7 @@ UfsExecUicCommands ( 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)) { return Status; } @@ -1712,14 +1706,18 @@ UfsExecUicCommands ( return Status; } - if (UicOpcode != UfsUicDmeReset) { - Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &Data); + if (UicCommand->Opcode != UfsUicDmeReset) { + Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &UicCommand->Arg2); if (EFI_ERROR (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(); - DumpUicCmdExecResult (UicOpcode, (UINT8)(Data & 0xFF)); + DumpUicCmdExecResult ((UINT8)UicCommand->Opcode, (UINT8)(UicCommand->Arg2 & 0xFF)); DEBUG_CODE_END(); return EFI_DEVICE_ERROR; } @@ -1898,16 +1896,21 @@ UfsDeviceDetection ( IN UFS_PASS_THRU_PRIVATE_DATA *Private ) { - UINTN Retry; - EFI_STATUS Status; - UINT32 Data; + UINTN Retry; + EFI_STATUS Status; + UINT32 Data; + EDKII_UIC_COMMAND LinkStartupCommand; // // Start UFS device detection. // Try up to 3 times for establishing data link with device. // 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)) { return EFI_DEVICE_ERROR; }