0, // UfsHostController\r
0, // UfsHcBase\r
{0, 0}, // UfsHcInfo\r
+ {NULL, NULL}, // UfsHcDriverInterface\r
0, // TaskTag\r
0, // UtpTrlBase\r
0, // Nutrs\r
\r
UINT8 mUfsTargetId[TARGET_MAX_BYTES];\r
\r
+GLOBAL_REMOVE_IF_UNREFERENCED EDKII_UFS_HC_PLATFORM_PROTOCOL *mUfsHcPlatform;\r
+\r
/**\r
Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function\r
supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the\r
Private->ExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;\r
Private->UfsHostController = UfsHc;\r
Private->UfsHcBase = UfsHcBase;\r
+ Private->Handle = Controller;\r
+ Private->UfsHcDriverInterface.UfsHcProtocol = UfsHc;\r
+ Private->UfsHcDriverInterface.UfsExecUicCommand = UfsHcDriverInterfaceExecUicCommand;\r
InitializeListHead (&Private->Queue);\r
+\r
+ //\r
+ // This has to be done before initializing UfsHcInfo or calling the UfsControllerInit\r
+ //\r
+ if (mUfsHcPlatform == NULL) {\r
+ Status = gBS->LocateProtocol (&gEdkiiUfsHcPlatformProtocolGuid, NULL, (VOID**)&mUfsHcPlatform);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_INFO, "No UfsHcPlatformProtocol present\n"));\r
+ }\r
+ }\r
+\r
Status = GetUfsHcInfo (Private);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "Failed to initialize UfsHcInfo\n"));\r
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHostController;\r
UINTN UfsHcBase;\r
EDKII_UFS_HC_INFO UfsHcInfo;\r
+ EDKII_UFS_HC_DRIVER_INTERFACE UfsHcDriverInterface;\r
\r
UINT8 TaskTag;\r
\r
UFS_PASS_THRU_SIG \\r
)\r
\r
+#define UFS_PASS_THRU_PRIVATE_DATA_FROM_DRIVER_INTF(a) \\r
+ CR (a, \\r
+ UFS_PASS_THRU_PRIVATE_DATA, \\r
+ UfsHcDriverInterface, \\r
+ UFS_PASS_THRU_SIG \\r
+ )\r
+\r
typedef struct _UFS_DEVICE_MANAGEMENT_REQUEST_PACKET {\r
UINT64 Timeout;\r
VOID *DataBuffer;\r
IN OUT UINT32 *AttrSize\r
);\r
\r
+/**\r
+ Execute UIC command.\r
+\r
+ @param[in] This Pointer to driver interface produced by the UFS controller.\r
+ @param[in, out] UicCommand Descriptor of the command that will be executed.\r
+\r
+ @retval EFI_SUCCESS Command executed successfully.\r
+ @retval EFI_INVALID_PARAMETER This or UicCommand is NULL.\r
+ @retval Others Command failed to execute.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UfsHcDriverInterfaceExecUicCommand (\r
+ IN EDKII_UFS_HC_DRIVER_INTERFACE *This,\r
+ IN OUT EDKII_UIC_COMMAND *UicCommand\r
+ );\r
+\r
/**\r
Initializes UfsHcInfo field in private data.\r
\r
extern EFI_COMPONENT_NAME_PROTOCOL gUfsPassThruComponentName;\r
extern EFI_COMPONENT_NAME2_PROTOCOL gUfsPassThruComponentName2;\r
extern EFI_DRIVER_BINDING_PROTOCOL gUfsPassThruDriverBinding;\r
+extern EDKII_UFS_HC_PLATFORM_PROTOCOL *mUfsHcPlatform;\r
\r
#endif\r
return Status;\r
}\r
\r
-\r
-\r
/**\r
Read specified flag from a UFS device.\r
\r
EFI_STATUS Status;\r
UINT32 Data;\r
\r
+ if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {\r
+ Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPreHce, &Private->UfsHcDriverInterface);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failure from platform driver during EdkiiUfsHcPreHce, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+ }\r
+\r
//\r
// UFS 2.0 spec section 7.1.1 - Host Controller Initialization\r
//\r
return EFI_DEVICE_ERROR;\r
}\r
\r
+ if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {\r
+ Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPostHce, &Private->UfsHcDriverInterface);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failure from platform driver during EdkiiUfsHcPostHce, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
UINT32 Data;\r
EDKII_UIC_COMMAND LinkStartupCommand;\r
\r
+ if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {\r
+ Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPreLinkStartup, &Private->UfsHcDriverInterface);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failure from platform driver during EdkiiUfsHcPreLinkStartup, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+ }\r
+\r
//\r
// Start UFS device detection.\r
// Try up to 3 times for establishing data link with device.\r
return EFI_DEVICE_ERROR;\r
}\r
} else {\r
+ if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {\r
+ Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPostLinkStartup, &Private->UfsHcDriverInterface);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failure from platform driver during EdkiiUfsHcPostLinkStartup, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+ }\r
return EFI_SUCCESS;\r
}\r
}\r
}\r
}\r
\r
+/**\r
+ Execute UIC command.\r
+\r
+ @param[in] This Pointer to driver interface produced by the UFS controller.\r
+ @param[in, out] UicCommand Descriptor of the command that will be executed.\r
+\r
+ @retval EFI_SUCCESS Command executed successfully.\r
+ @retval EFI_INVALID_PARAMETER This or UicCommand is NULL.\r
+ @retval Others Command failed to execute.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UfsHcDriverInterfaceExecUicCommand (\r
+ IN EDKII_UFS_HC_DRIVER_INTERFACE *This,\r
+ IN OUT EDKII_UIC_COMMAND *UicCommand\r
+ )\r
+{\r
+ UFS_PASS_THRU_PRIVATE_DATA *Private;\r
+\r
+ if (This == NULL || UicCommand == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ Private = UFS_PASS_THRU_PRIVATE_DATA_FROM_DRIVER_INTF (This);\r
+\r
+ return UfsExecUicCommands (Private, UicCommand);\r
+}\r
+\r
/**\r
Initializes UfsHcInfo field in private data.\r
\r
\r
Private->UfsHcInfo.Capabilities = Data;\r
\r
+ if (mUfsHcPlatform != NULL && mUfsHcPlatform->OverrideHcInfo != NULL) {\r
+ Status = mUfsHcPlatform->OverrideHcInfo (Private->Handle, &Private->UfsHcInfo);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failure from platform on OverrideHcInfo, Status = %r\n", Status));\r
+ return Status;\r
+ }\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r