public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Albecki, Mateusz" <mateusz.albecki@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Subject: Re: [PATCH 4/4] MdeModulePkg/UfsPassThruDxe: Implement EDKII_UFS_HC_PLATFORM_PROTOCOL
Date: Thu, 8 Aug 2019 02:37:26 +0000	[thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A093C9174EA@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20190807165107.688-5-mateusz.albecki@intel.com>

Hello Mateusz,

One inline comment below:


> -----Original Message-----
> From: Albecki, Mateusz
> Sent: Thursday, August 08, 2019 12:51 AM
> To: devel@edk2.groups.io
> Cc: Albecki, Mateusz; Wu, Hao A
> Subject: [PATCH 4/4] MdeModulePkg/UfsPassThruDxe: Implement
> EDKII_UFS_HC_PLATFORM_PROTOCOL
> 
> 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.
> 
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com>
> ---
>  MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c  | 17 ++++++
>  MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h  | 26 +++++++++
>  .../Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf      |  3 +-
>  .../Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c        | 68
> ++++++++++++++++++++++
>  4 files changed, 113 insertions(+), 1 deletion(-)
> 
> diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
> b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
> index 09333c51d6..1559efe191 100644
> --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
> +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
> @@ -36,6 +36,7 @@ UFS_PASS_THRU_PRIVATE_DATA
> gUfsPassThruTemplate = {
>    0,                              // UfsHostController
>    0,                              // UfsHcBase
>    {0, 0},                         // UfsHcInfo
> +  {NULL, NULL},                   // UfsHcDriverInterface
>    0,                              // TaskTag
>    0,                              // UtpTrlBase
>    0,                              // Nutrs
> @@ -92,6 +93,8 @@ UFS_DEVICE_PATH    mUfsDevicePathTemplate = {
> 
>  UINT8 mUfsTargetId[TARGET_MAX_BYTES];
> 
> +GLOBAL_REMOVE_IF_UNREFERENCED
> EDKII_UFS_HC_PLATFORM_PROTOCOL  *mUfsHcPlatform;
> +
>  /**
>    Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI
> channel. This function
>    supports both blocking I/O and nonblocking I/O. The blocking I/O
> functionality is required, and the
> @@ -864,7 +867,21 @@ UfsPassThruDriverBindingStart (
>    Private->ExtScsiPassThru.Mode = &Private->ExtScsiPassThruMode;
>    Private->UfsHostController    = UfsHc;
>    Private->UfsHcBase            = UfsHcBase;
> +  Private->Handle               = Controller;
> +  Private->UfsHcDriverInterface.UfsHcProtocol = UfsHc;
> +  Private->UfsHcDriverInterface.UfsExecUicCommand =
> UfsHcDriverInterfaceExecUicCommand;
>    InitializeListHead (&Private->Queue);
> +
> +  //
> +  // This has to be done before initializing UfsHcInfo or calling the
> UfsControllerInit
> +  //
> +  if (mUfsHcPlatform == NULL) {
> +    Status = gBS->LocateProtocol (&gEdkiiUfsHcPlatformProtocolGuid, NULL,
> (VOID**)&mUfsHcPlatform);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_INFO, "No UfsHcPlatformProtocol present\n"));
> +    }
> +  }
> +
>    Status = GetUfsHcInfo (Private);
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, "Failed to initialize UfsHcInfo\n"));
> diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
> b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
> index c511aa8c7a..cbc0c2126e 100644
> --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
> +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
> @@ -63,6 +63,7 @@ typedef struct _UFS_PASS_THRU_PRIVATE_DATA {
>    EDKII_UFS_HOST_CONTROLLER_PROTOCOL  *UfsHostController;
>    UINTN                               UfsHcBase;
>    EDKII_UFS_HC_INFO                   UfsHcInfo;
> +  EDKII_UFS_HC_DRIVER_INTERFACE       UfsHcDriverInterface;
> 
>    UINT8                               TaskTag;
> 
> @@ -126,6 +127,13 @@ typedef struct {
>        UFS_PASS_THRU_SIG \
>        )
> 
> +#define UFS_PASS_THRU_PRIVATE_DATA_FROM_DRIVER_INTF(a) \
> +  CR (a, \
> +      UFS_PASS_THRU_PRIVATE_DATA, \
> +      UfsHcDriverInterface, \
> +      UFS_PASS_THRU_SIG \
> +      )
> +
>  typedef struct _UFS_DEVICE_MANAGEMENT_REQUEST_PACKET {
>    UINT64           Timeout;
>    VOID             *DataBuffer;
> @@ -959,6 +967,23 @@ UfsRwUfsAttribute (
>    IN OUT UINT32                        *AttrSize
>    );
> 
> +/**
> +  Execute UIC command.
> +
> +  @param[in]      This        Pointer to driver interface produced by the UFS
> controller.
> +  @param[in, out] UicCommand  Descriptor of the command that will be
> executed.
> +
> +  @retval EFI_SUCCESS            Command executed successfully.
> +  @retval EFI_INVALID_PARAMETER  This or UicCommand is NULL.
> +  @retval Others                 Command failed to execute.
> +**/
> +EFI_STATUS
> +EFIAPI
> +UfsHcDriverInterfaceExecUicCommand (
> +  IN     EDKII_UFS_HC_DRIVER_INTERFACE  *This,
> +  IN OUT EDKII_UIC_COMMAND              *UicCommand
> +  );
> +
>  /**
>    Initializes UfsHcInfo field in private data.
> 
> @@ -975,5 +1000,6 @@ GetUfsHcInfo (
>  extern EFI_COMPONENT_NAME_PROTOCOL
> gUfsPassThruComponentName;
>  extern EFI_COMPONENT_NAME2_PROTOCOL
> gUfsPassThruComponentName2;
>  extern EFI_DRIVER_BINDING_PROTOCOL  gUfsPassThruDriverBinding;
> +extern EDKII_UFS_HC_PLATFORM_PROTOCOL  *mUfsHcPlatform;
> 
>  #endif
> diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf
> b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf
> index 24f5ea3a8f..92dc25714b 100644
> --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf
> +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf
> @@ -1,7 +1,7 @@
>  ## @file
>  # Description file for the Universal Flash Storage (UFS) Pass Thru driver.
>  #
> -# 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
>  #
> @@ -54,6 +54,7 @@
>    gEfiExtScsiPassThruProtocolGuid               ## BY_START
>    gEfiUfsDeviceConfigProtocolGuid               ## BY_START
>    gEdkiiUfsHostControllerProtocolGuid           ## TO_START
> +  gEdkiiUfsHcPlatformProtocolGuid               ## SOMETIMES_CONSUMES
> 
>  [UserExtensions.TianoCore."ExtraFiles"]
>    UfsPassThruExtra.uni
> diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
> b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
> index 74be3efc41..e2c104b103 100644
> --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
> +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
> @@ -1835,6 +1835,14 @@ UfsEnableHostController (
>    EFI_STATUS             Status;
>    UINT32                 Data;
> 
> +  if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {
> +    Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPreHce,
> &Private->UfsHcDriverInterface);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failure from platform driver during
> EdkiiUfsHcPreHce, Status = %r\n", Status));
> +      return Status;
> +    }
> +  }
> +
>    //
>    // UFS 2.0 spec section 7.1.1 - Host Controller Initialization
>    //
> @@ -1878,6 +1886,14 @@ UfsEnableHostController (
>      return EFI_DEVICE_ERROR;
>    }
> 
> +  if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {
> +    Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPostHce,
> &Private->UfsHcDriverInterface);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failure from platform driver during
> EdkiiUfsHcPostHce, Status = %r\n", Status));
> +      return Status;
> +    }
> +  }
> +
>    return EFI_SUCCESS;
>  }
> 
> @@ -1901,6 +1917,14 @@ UfsDeviceDetection (
>    UINT32             Data;
>    EDKII_UIC_COMMAND  LinkStartupCommand;
> 
> +  if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {
> +    Status = mUfsHcPlatform->Callback (Private->Handle,
> EdkiiUfsHcPreLinkStartup, &Private->UfsHcDriverInterface);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failure from platform driver during
> EdkiiUfsHcPreLinkStartup, Status = %r\n", Status));
> +      return Status;
> +    }
> +  }
> +
>    //
>    // Start UFS device detection.
>    // Try up to 3 times for establishing data link with device.
> @@ -1930,6 +1954,14 @@ UfsDeviceDetection (
>      }
>    }
> 
> +  if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) {
> +    Status = mUfsHcPlatform->Callback (Private->Handle,
> EdkiiUfsHcPostLinkStartup, &Private->UfsHcDriverInterface);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failure from platform driver during
> EdkiiUfsHcPostLinkStartup, Status = %r\n", Status));
> +      return Status;
> +    }
> +  }
> +


It looks to me that the 'PostLinkStartup' callback is triggered when the UFS
device detection fails (placed above "return EFI_NOT_FOUND;").

Per my understanding, the callback should be invoked when such detection
process succeeds. Could you help to confirm on this?

Best Regards,
Hao Wu


>    return EFI_NOT_FOUND;
>  }
> 
> @@ -2350,6 +2382,34 @@ ProcessAsyncTaskList (
>    }
>  }
> 
> +/**
> +  Execute UIC command.
> +
> +  @param[in]      This        Pointer to driver interface produced by the UFS
> controller.
> +  @param[in, out] UicCommand  Descriptor of the command that will be
> executed.
> +
> +  @retval EFI_SUCCESS            Command executed successfully.
> +  @retval EFI_INVALID_PARAMETER  This or UicCommand is NULL.
> +  @retval Others                 Command failed to execute.
> +**/
> +EFI_STATUS
> +EFIAPI
> +UfsHcDriverInterfaceExecUicCommand (
> +  IN     EDKII_UFS_HC_DRIVER_INTERFACE  *This,
> +  IN OUT EDKII_UIC_COMMAND              *UicCommand
> +  )
> +{
> +  UFS_PASS_THRU_PRIVATE_DATA    *Private;
> +
> +  if (This == NULL || UicCommand == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Private = UFS_PASS_THRU_PRIVATE_DATA_FROM_DRIVER_INTF (This);
> +
> +  return UfsExecUicCommands (Private, UicCommand);
> +}
> +
>  /**
>    Initializes UfsHcInfo field in private data.
> 
> @@ -2380,6 +2440,14 @@ GetUfsHcInfo (
> 
>    Private->UfsHcInfo.Capabilities = Data;
> 
> +  if (mUfsHcPlatform != NULL && mUfsHcPlatform->OverrideHcInfo != NULL)
> {
> +    Status = mUfsHcPlatform->OverrideHcInfo (Private->Handle, &Private-
> >UfsHcInfo);
> +    if (EFI_ERROR (Status)) {
> +      DEBUG ((DEBUG_ERROR, "Failure from platform on OverrideHcInfo,
> Status = %r\n", Status));
> +      return Status;
> +    }
> +  }
> +
>    return EFI_SUCCESS;
>  }
> 
> --
> 2.14.1.windows.1


  reply	other threads:[~2019-08-08  2:37 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-07 16:51 [PATCH 0/4] Add EDKII_UFS_HC_PLATFORM_PROTOCOL to support platform specific programming of UFS host controllers Albecki, Mateusz
2019-08-07 16:51 ` [PATCH 1/4] MdeModulePkg: Add definition of the EDKII_UFS_HC_PLATFORM_PROTOCOL Albecki, Mateusz
2019-08-08  2:36   ` Wu, Hao A
2019-08-07 16:51 ` [PATCH 2/4] MdeModulePkg/UfsPassThruDxe: Refactor UfsExecUicCommand function Albecki, Mateusz
2019-08-08  2:36   ` [edk2-devel] " Wu, Hao A
2019-08-07 16:51 ` [PATCH 3/4] MdeModulePkg/UfsPassThruDxe: Refactor private data to use EDKII_UFS_HC_INFO Albecki, Mateusz
2019-08-08  2:37   ` [edk2-devel] " Wu, Hao A
2019-08-08 20:44     ` Albecki, Mateusz
2019-08-07 16:51 ` [PATCH 4/4] MdeModulePkg/UfsPassThruDxe: Implement EDKII_UFS_HC_PLATFORM_PROTOCOL Albecki, Mateusz
2019-08-08  2:37   ` Wu, Hao A [this message]
2019-08-08 20:52     ` Albecki, Mateusz
2019-08-08  2:37 ` [PATCH 0/4] Add EDKII_UFS_HC_PLATFORM_PROTOCOL to support platform specific programming of UFS host controllers Wu, Hao A
2019-08-08 19:59   ` Laszlo Ersek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A093C9174EA@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox