]> xenbits.xensource.com Git - people/aperard/ovmf.git/commitdiff
MdeModulePkg/UfsPassThruDxe: Implement EDKII_UFS_HC_PLATFORM_PROTOCOL
authorAlbecki, Mateusz <mateusz.albecki@intel.com>
Fri, 9 Aug 2019 14:36:20 +0000 (22:36 +0800)
committerHao A Wu <hao.a.wu@intel.com>
Tue, 13 Aug 2019 02:54:35 +0000 (10:54 +0800)
https://bugzilla.tianocore.org/show_bug.cgi?id=1343

This commit adds EDKII_UFS_HC_PLATFORM_PROTOCOL implementation
in UfsPassThruDxe driver in version 1. Driver assumes that at
most one instance of the protocol exists in the system. Presence
of the protocol is not mandatory.

Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf
MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c

index 7dce217d49773441fe337d407b6f7b9f7c3a224b..b12404aacb11fefe8a130b35932acf5caf842982 100644 (file)
@@ -36,6 +36,7 @@ UFS_PASS_THRU_PRIVATE_DATA gUfsPassThruTemplate = {
   0,                              // UfsHostController\r
   0,                              // UfsHcBase\r
   {0, 0},                         // UfsHcInfo\r
+  {NULL, NULL},                   // UfsHcDriverInterface\r
   0,                              // TaskTag\r
   0,                              // UtpTrlBase\r
   0,                              // Nutrs\r
@@ -92,6 +93,8 @@ UFS_DEVICE_PATH    mUfsDevicePathTemplate = {
 \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
@@ -864,7 +867,21 @@ UfsPassThruDriverBindingStart (
   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
index c511aa8c7a6a09e0d97e5cd14aff5e1982df40a3..cbc0c2126eee926ef8a11bb9613f8471c61ff161 100644 (file)
@@ -63,6 +63,7 @@ typedef struct _UFS_PASS_THRU_PRIVATE_DATA {
   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
@@ -126,6 +127,13 @@ typedef struct {
       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
@@ -959,6 +967,23 @@ UfsRwUfsAttribute (
   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
@@ -975,5 +1000,6 @@ GetUfsHcInfo (
 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
index 24f5ea3a8f5ff75d950ea0ddedbfe66e98f7b6d3..92dc25714b2d44aff18f6d333a91a5b35eb6bfa0 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Description file for the Universal Flash Storage (UFS) Pass Thru driver.\r
 #\r
-# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
@@ -54,6 +54,7 @@
   gEfiExtScsiPassThruProtocolGuid               ## BY_START\r
   gEfiUfsDeviceConfigProtocolGuid               ## BY_START\r
   gEdkiiUfsHostControllerProtocolGuid           ## TO_START\r
+  gEdkiiUfsHcPlatformProtocolGuid               ## SOMETIMES_CONSUMES\r
 \r
 [UserExtensions.TianoCore."ExtraFiles"]\r
   UfsPassThruExtra.uni\r
index 74be3efc411b05b28133a0f970be94b64f2ae7dd..0b95e7dddddeb169bf6a0f08e010b2492d0e5252 100644 (file)
@@ -1202,8 +1202,6 @@ UfsSetFlag (
   return Status;\r
 }\r
 \r
-\r
-\r
 /**\r
   Read specified flag from a UFS device.\r
 \r
@@ -1835,6 +1833,14 @@ UfsEnableHostController (
   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
@@ -1878,6 +1884,14 @@ UfsEnableHostController (
     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
@@ -1901,6 +1915,14 @@ UfsDeviceDetection (
   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
@@ -1926,6 +1948,13 @@ UfsDeviceDetection (
         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
@@ -2350,6 +2379,34 @@ ProcessAsyncTaskList (
   }\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
@@ -2380,6 +2437,14 @@ GetUfsHcInfo (
 \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