Skip to content

Commit

Permalink
MdeModulePkg: Add bRefClkFreq card attribute programming support
Browse files Browse the repository at this point in the history
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 Manufacturer Default Value
specified by the spec JESD220*. However, depends on the UFS host system
environment, it need to be set to the 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 <hao.a.wu@intel.com>
Cc: Albecki Mateusz <mateusz.albecki@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>

Signed-off-by: Purna Chandra Rao Bandaru <purna.chandra.rao.bandaru@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
  • Loading branch information
Purna-Chandra-Rao authored and mergify[bot] committed Mar 10, 2022
1 parent c63ef58 commit f06941c
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 21 deletions.
70 changes: 60 additions & 10 deletions MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/** @file
Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>
Copyright (c) Microsoft Corporation.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
Expand Down Expand Up @@ -834,15 +834,17 @@ UfsPassThruDriverBindingStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
)
{
EFI_STATUS Status;
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHc;
UFS_PASS_THRU_PRIVATE_DATA *Private;
UINTN UfsHcBase;
UINT32 Index;
UFS_UNIT_DESC UnitDescriptor;
UFS_DEV_DESC DeviceDescriptor;
UINT32 UnitDescriptorSize;
UINT32 DeviceDescriptorSize;
EFI_STATUS Status;
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHc;
UFS_PASS_THRU_PRIVATE_DATA *Private;
UINTN UfsHcBase;
UINT32 Index;
UFS_UNIT_DESC UnitDescriptor;
UFS_DEV_DESC DeviceDescriptor;
UINT32 UnitDescriptorSize;
UINT32 DeviceDescriptorSize;
EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE Attributes;
UINT8 RefClkAttr;

Status = EFI_SUCCESS;
UfsHc = NULL;
Expand Down Expand Up @@ -917,6 +919,54 @@ UfsPassThruDriverBindingStart (
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:
// At the end of the UFS Interconnect Layer initialization on both host and device side,
Expand Down
10 changes: 1 addition & 9 deletions MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.<BR>
Copyright (c) 2014 - 2022, Intel Corporation. All rights reserved.<BR>
Copyright (c) Microsoft Corporation.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
Expand Down Expand Up @@ -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;
}
}
Expand Down
15 changes: 13 additions & 2 deletions MdeModulePkg/Include/Protocol/UfsHostControllerPlatform.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/** @file
EDKII_UFS_HC_PLATFORM_PROTOCOL definition.
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
Expand All @@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent

#include <Protocol/UfsHostController.h>

#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 1
#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 2

extern EFI_GUID gEdkiiUfsHcPlatformProtocolGuid;

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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

0 comments on commit f06941c

Please sign in to comment.