UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface\r
for upper layer application to execute UFS-supported SCSI cmds.\r
\r
- Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
/**\r
Send UIC command.\r
\r
- @param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure.\r
- @param[in] UicOpcode The opcode of the UIC command.\r
- @param[in] Arg1 The value for 1st argument of the UIC command.\r
- @param[in] Arg2 The value for 2nd argument of the UIC command.\r
- @param[in] Arg3 The value for 3rd argument of the UIC command.\r
+ @param[in] Private The pointer to the UFS_PASS_THRU_PRIVATE_DATA data structure.\r
+ @param[in, out] UicCommand UIC command descriptor. On exit contains UIC command results.\r
\r
@return EFI_SUCCESS Successfully execute this UIC command and detect attached UFS device.\r
@return EFI_DEVICE_ERROR Fail to execute this UIC command and detect attached UFS device.\r
EFI_STATUS\r
UfsExecUicCommands (\r
IN UFS_PASS_THRU_PRIVATE_DATA *Private,\r
- IN UINT8 UicOpcode,\r
- IN UINT32 Arg1,\r
- IN UINT32 Arg2,\r
- IN UINT32 Arg3\r
+ IN OUT EDKII_UIC_COMMAND *UicCommand\r
)\r
{\r
EFI_STATUS Status;\r
// only after all the UIC command argument registers (UICCMDARG1, UICCMDARG2 and UICCMDARG3)\r
// are set.\r
//\r
- Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG1_OFFSET, Arg1);\r
+ Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG1_OFFSET, UicCommand->Arg1);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG2_OFFSET, Arg2);\r
+ Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG2_OFFSET, UicCommand->Arg2);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG3_OFFSET, Arg3);\r
+ Status = UfsMmioWrite32 (Private, UFS_HC_UCMD_ARG3_OFFSET, UicCommand->Arg3);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
return Status;\r
}\r
\r
- Status = UfsMmioWrite32 (Private, UFS_HC_UIC_CMD_OFFSET, (UINT32)UicOpcode);\r
+ Status = UfsMmioWrite32 (Private, UFS_HC_UIC_CMD_OFFSET, UicCommand->Opcode);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
return Status;\r
}\r
\r
- if (UicOpcode != UfsUicDmeReset) {\r
- Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &Data);\r
+ if (UicCommand->Opcode != UfsUicDmeReset) {\r
+ Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG2_OFFSET, &UicCommand->Arg2);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- if ((Data & 0xFF) != 0) {\r
+ Status = UfsMmioRead32 (Private, UFS_HC_UCMD_ARG3_OFFSET, &UicCommand->Arg3);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ if ((UicCommand->Arg2 & 0xFF) != 0) {\r
DEBUG_CODE_BEGIN();\r
- DumpUicCmdExecResult (UicOpcode, (UINT8)(Data & 0xFF));\r
+ DumpUicCmdExecResult ((UINT8)UicCommand->Opcode, (UINT8)(UicCommand->Arg2 & 0xFF));\r
DEBUG_CODE_END();\r
return EFI_DEVICE_ERROR;\r
}\r
IN UFS_PASS_THRU_PRIVATE_DATA *Private\r
)\r
{\r
- UINTN Retry;\r
- EFI_STATUS Status;\r
- UINT32 Data;\r
+ UINTN Retry;\r
+ EFI_STATUS Status;\r
+ UINT32 Data;\r
+ EDKII_UIC_COMMAND LinkStartupCommand;\r
\r
//\r
// Start UFS device detection.\r
// Try up to 3 times for establishing data link with device.\r
//\r
for (Retry = 0; Retry < 3; Retry++) {\r
- Status = UfsExecUicCommands (Private, UfsUicDmeLinkStartup, 0, 0, 0);\r
+ LinkStartupCommand.Opcode = UfsUicDmeLinkStartup;\r
+ LinkStartupCommand.Arg1 = 0;\r
+ LinkStartupCommand.Arg2 = 0;\r
+ LinkStartupCommand.Arg3 = 0;\r
+ Status = UfsExecUicCommands (Private, &LinkStartupCommand);\r
if (EFI_ERROR (Status)) {\r
return EFI_DEVICE_ERROR;\r
}\r