mirror of https://github.com/acidanthera/audk.git
MdeModulePkg: Add bRefClkFreq card attribute programming support
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>
This commit is contained in:
parent
c63ef58698
commit
f06941cc46
|
@ -1,6 +1,6 @@
|
||||||
/** @file
|
/** @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>
|
Copyright (c) Microsoft Corporation.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
@ -834,15 +834,17 @@ UfsPassThruDriverBindingStart (
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHc;
|
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHc;
|
||||||
UFS_PASS_THRU_PRIVATE_DATA *Private;
|
UFS_PASS_THRU_PRIVATE_DATA *Private;
|
||||||
UINTN UfsHcBase;
|
UINTN UfsHcBase;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
UFS_UNIT_DESC UnitDescriptor;
|
UFS_UNIT_DESC UnitDescriptor;
|
||||||
UFS_DEV_DESC DeviceDescriptor;
|
UFS_DEV_DESC DeviceDescriptor;
|
||||||
UINT32 UnitDescriptorSize;
|
UINT32 UnitDescriptorSize;
|
||||||
UINT32 DeviceDescriptorSize;
|
UINT32 DeviceDescriptorSize;
|
||||||
|
EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE Attributes;
|
||||||
|
UINT8 RefClkAttr;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
UfsHc = NULL;
|
UfsHc = NULL;
|
||||||
|
@ -917,6 +919,54 @@ UfsPassThruDriverBindingStart (
|
||||||
goto Error;
|
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:
|
// UFS 2.0 spec Section 13.1.3.3:
|
||||||
// At the end of the UFS Interconnect Layer initialization on both host and device side,
|
// At the end of the UFS Interconnect Layer initialization on both host and device side,
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
|
UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
|
||||||
for upper layer application to execute UFS-supported SCSI cmds.
|
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>
|
Copyright (c) Microsoft Corporation.<BR>
|
||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
|
@ -1970,14 +1970,6 @@ UfsDeviceDetection (
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
} else {
|
} 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;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
EDKII_UFS_HC_PLATFORM_PROTOCOL definition.
|
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
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
#include <Protocol/UfsHostController.h>
|
#include <Protocol/UfsHostController.h>
|
||||||
|
|
||||||
#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 1
|
#define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 2
|
||||||
|
|
||||||
extern EFI_GUID gEdkiiUfsHcPlatformProtocolGuid;
|
extern EFI_GUID gEdkiiUfsHcPlatformProtocolGuid;
|
||||||
|
|
||||||
|
@ -83,6 +83,13 @@ typedef enum {
|
||||||
EdkiiUfsHcPostLinkStartup
|
EdkiiUfsHcPostLinkStartup
|
||||||
} EDKII_UFS_HC_PLATFORM_CALLBACK_PHASE;
|
} EDKII_UFS_HC_PLATFORM_CALLBACK_PHASE;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
EdkiiUfsCardRefClkFreq19p2Mhz,
|
||||||
|
EdkiiUfsCardRefClkFreq26Mhz,
|
||||||
|
EdkiiUfsCardRefClkFreq38p4Mhz,
|
||||||
|
EdkiiUfsCardRefClkFreqObsolete
|
||||||
|
} EDKII_UFS_CARD_REF_CLK_FREQ_ATTRIBUTE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Callback function for platform driver.
|
Callback function for platform driver.
|
||||||
|
|
||||||
|
@ -118,6 +125,10 @@ struct _EDKII_UFS_HC_PLATFORM_PROTOCOL {
|
||||||
/// for host controller.
|
/// for host controller.
|
||||||
///
|
///
|
||||||
EDKII_UFS_HC_PLATFORM_CALLBACK Callback;
|
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
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue