From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by mx.groups.io with SMTP id smtpd.web09.25470.1646653666362833324 for ; Mon, 07 Mar 2022 03:47:46 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="unable to parse pub key" header.i=@intel.com header.s=intel header.b=bu4ec+BL; spf=pass (domain: intel.com, ip: 134.134.136.31, mailfrom: purna.chandra.rao.bandaru@intel.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1646653666; x=1678189666; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=hhJvV35qMmqYY2wbjkzIQd1LPtvpL1uR8Jl0v/MJ6+M=; b=bu4ec+BLqDPWP8sx0VDVMqkTDtKeNs1NWmLFZPgIWM0xaHoaXCksbXG2 S6YVF4lg/eCk+ptkdXLXMWC0bOJJHnmHIgSGcn/Ik7fr3CUv4mQ0p1UQD Jia9lY2KZUxzIeQbuAuRc7GWJAgSTJRRkSRCq4u+VZvRc9YLnAmoh77kl tzIGOtaTyksZB9C8sp8moSQ/VKOoZ30uVo1O1P85HcFlHDAza5pdQgCur hNMwXaHYssV9ww9mJLzFqRMp80Lf4aOA7KAdmjVNrkqeZ7kvp+Rk9B5L0 FFov9nUT/8AHxKJT9OY0fxgW0Gi4C2tdKG7LwtC6bL8uw6OO8dSj730gk w==; X-IronPort-AV: E=McAfee;i="6200,9189,10278"; a="315085620" X-IronPort-AV: E=Sophos;i="5.90,162,1643702400"; d="scan'208";a="315085620" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Mar 2022 03:47:45 -0800 X-IronPort-AV: E=Sophos;i="5.90,162,1643702400"; d="scan'208";a="512652750" Received: from pbandaru-mobl1.gar.corp.intel.com ([10.252.86.6]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Mar 2022 03:47:43 -0800 From: "Bandaru, Purna Chandra Rao" To: devel@edk2.groups.io Cc: Purna Chandra Rao Bandaru , Wu Hao A , Albecki Mateusz , Liming Gao , Zhiguang Liu Subject: [PATCH] [PATCH v2] MdeModulePkg: Add bRefClkFreq card attribute programming support Date: Mon, 7 Mar 2022 17:17:26 +0530 Message-Id: <1828e4b1d46a6ae53d275d374707909deba007d6.1646653492.git.purna.chandra.rao.bandaru@intel.com> X-Mailer: git-send-email 2.31.1.windows.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3851 When the UFS card comes out of Manufacturer, bRefClkFreq attribute is set to 1h on the UFS card as per the "MDV” (Manufacturer Default Value) specified by the spec JESD220*. However, depends on the UFS host system environment, it need to be set to correct value. Reference Clock Frequency value 0h:19.2 MHz 1h: 26 MHz 2h: 38.4 MHz 3h: Obsolete Others: Reserved Cc: Wu Hao A Cc: Albecki Mateusz Cc: Liming Gao Cc: Zhiguang Liu Signed-off-by: Purna Chandra Rao Bandaru --- .../Bus/Ufs/UfsPassThruDxe/UfsPassThru.c | 50 ++++++++++++++++++- .../Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c | 10 +--- .../Protocol/UfsHostControllerPlatform.h | 15 +++++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c index 4c2d6ae27f..638b14b0c1 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c @@ -1,6 +1,6 @@ /** @file - Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.
Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -843,6 +843,8 @@ UfsPassThruDriverBindingStart ( UFS_DEV_DESC DeviceDescriptor; UINT32 UnitDescriptorSize; UINT32 DeviceDescriptorSize; + EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE Attributes; + UINT8 RefClkAttr; Status = EFI_SUCCESS; UfsHc = NULL; @@ -916,6 +918,52 @@ UfsPassThruDriverBindingStart ( DEBUG ((DEBUG_ERROR, "Ufs Host Controller Initialization Error, Status = %r\n", Status)); goto Error; } + if ((mUfsHcPlatform != NULL) && + ((mUfsHcPlatform->RefClkFreq == EdkiiUfsCardRefClkFreq19p2Mhz) || + (mUfsHcPlatform->RefClkFreq == EdkiiUfsCardRefClkFreq26Mhz) || + (mUfsHcPlatform->RefClkFreq == EdkiiUfsCardRefClkFreq38p4Mhz))) { + RefClkAttr = UfsAttrRefClkFreq; + Attributes = EdkiiUfsCardRefClkFreqObsolete; + Status = UfsRwAttributes (Private, TRUE, RefClkAttr, 0, 0, (UINT32 *) &Attributes); + if (!EFI_ERROR (Status)) { + if (Attributes != mUfsHcPlatform->RefClkFreq) { + Attributes = mUfsHcPlatform->RefClkFreq; + DEBUG ( + (DEBUG_INFO, + "Setting bRefClkFreq attribute(%x) to %x\n 0 -> 19.2 Mhz\n 1 -> 26 Mhz\n 2 -> 38.4 Mhz\n 3 -> Obsolete\n", + RefClkAttr, + Attributes) + ); + Status = UfsRwAttributes (Private, FALSE, RefClkAttr, 0, 0, (UINT32 *) &Attributes); + if (EFI_ERROR (Status)) { + DEBUG ( + (DEBUG_ERROR, + "Failed to Change Reference Clock Attribute to %d, Status = %r \n", + mUfsHcPlatform->RefClkFreq, + Status) + ); + } + } + } else { + DEBUG ( + (DEBUG_ERROR, + "Failed to Read Reference Clock Attribute, Status = %r \n", + Status) + ); + } + } + + 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; + } + } // // UFS 2.0 spec Section 13.1.3.3: diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c index eba35cc669..4a9fa01e7d 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -2,7 +2,7 @@ UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface for upper layer application to execute UFS-supported SCSI cmds. - Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.
+ Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.
Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1970,14 +1970,6 @@ UfsDeviceDetection ( return EFI_DEVICE_ERROR; } } else { - 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_SUCCESS; } } diff --git a/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h b/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h index faa82d0c4e..32e9f6488c 100644 --- a/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h +++ b/MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h @@ -1,7 +1,7 @@ /** @file EDKII_UFS_HC_PLATFORM_PROTOCOL definition. -Copyright (c) 2019, Intel Corporation. All rights reserved.
+Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include -#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 1 +#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 2 extern EFI_GUID gEdkiiUfsHcPlatformProtocolGuid; @@ -83,6 +83,13 @@ typedef enum { EdkiiUfsHcPostLinkStartup } EDKII_UFS_HC_PLATFORM_CALLBACK_PHASE; +typedef enum { + EdkiiUfsCardRefClkFreq19p2Mhz, + EdkiiUfsCardRefClkFreq26Mhz, + EdkiiUfsCardRefClkFreq38p4Mhz, + EdkiiUfsCardRefClkFreqObsolete +} EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE; + /** Callback function for platform driver. @@ -118,6 +125,10 @@ struct _EDKII_UFS_HC_PLATFORM_PROTOCOL { /// for host controller. /// EDKII_UFS_HC_PLATFORM_CALLBACK Callback; + /// + /// Reference Clock Frequency Ufs Card Attribute that need to be set in this Ufs Host Environment. + /// + EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE RefClkFreq; }; #endif -- 2.31.1.windows.1