From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: mateusz.albecki@intel.com) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by groups.io with SMTP; Fri, 09 Aug 2019 05:21:22 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Aug 2019 05:21:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,364,1559545200"; d="scan'208";a="375186665" Received: from gklab-27-32.ger.corp.intel.com ([10.102.28.45]) by fmsmga006.fm.intel.com with ESMTP; 09 Aug 2019 05:21:20 -0700 From: "Albecki, Mateusz" To: devel@edk2.groups.io Cc: Mateusz Albecki , Hao A Wu Subject: [PATCHv2 4/4] MdeModulePkg/UfsPassThruDxe: Implement EDKII_UFS_HC_PLATFORM_PROTOCOL Date: Fri, 9 Aug 2019 14:20:53 +0200 Message-Id: <20190809122053.1784-5-mateusz.albecki@intel.com> X-Mailer: git-send-email 2.14.1.windows.1 In-Reply-To: <20190809122053.1784-1-mateusz.albecki@intel.com> References: <20190809122053.1784-1-mateusz.albecki@intel.com> 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 Signed-off-by: Mateusz Albecki --- MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c | 17 ++++++ MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h | 26 +++++++++ .../Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf | 1 + .../Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c | 68 ++++++++++++++++++++++ 4 files changed, 112 insertions(+) diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c index 0c96dacf16..7f0ae36dc5 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c @@ -42,6 +42,7 @@ UFS_PASS_THRU_PRIVATE_DATA gUfsPassThruTemplate = { 0, // UfsHostController 0, // UfsHcBase {0, 0}, // UfsHcInfo + {NULL, NULL}, // UfsHcDriverInterface 0, // TaskTag 0, // UtpTrlBase 0, // Nutrs @@ -98,6 +99,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 @@ -870,7 +873,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 101d0b4bb8..c2025a725e 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h @@ -69,6 +69,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; @@ -132,6 +133,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; @@ -965,6 +973,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. @@ -981,5 +1006,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 467c533ceb..4838967b5e 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruDxe.inf @@ -59,6 +59,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 edcd395091..0d768b7ada 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -1871,6 +1871,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 // @@ -1914,6 +1922,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; } @@ -1937,6 +1953,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. @@ -1966,6 +1990,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; + } + } + return EFI_NOT_FOUND; } @@ -2379,6 +2411,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. @@ -2409,6 +2469,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 -------------------------------------------------------------------- Intel Technology Poland sp. z o.o. ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | Kapital zakladowy 200.000 PLN. Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i moze zawierac informacje poufne. W razie przypadkowego otrzymania tej wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione. This e-mail and any attachments may contain confidential material for the sole use of the intended recipient(s). If you are not the intended recipient, please contact the sender and delete all copies; any review or distribution by others is strictly prohibited.