MdeModulePkg/UfsPassThruDxe: Refactor private data to use UfsHcInfo

https://bugzilla.tianocore.org/show_bug.cgi?id=1343

Private data has been refactored to use EDKII_UFS_HC_INFO structure
to store host controller capabilities and version
information. Getting host controller data has been moved
into single place and is done before host controller enable.

Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
This commit is contained in:
Albecki, Mateusz 2019-08-09 22:36:19 +08:00 committed by Hao A Wu
parent 90952ad733
commit a71272ed7a
3 changed files with 58 additions and 23 deletions
MdeModulePkg/Bus/Ufs/UfsPassThruDxe

@ -1,6 +1,6 @@
/** @file
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
**/
@ -35,7 +35,7 @@ UFS_PASS_THRU_PRIVATE_DATA gUfsPassThruTemplate = {
},
0, // UfsHostController
0, // UfsHcBase
0, // Capabilities
{0, 0}, // UfsHcInfo
0, // TaskTag
0, // UtpTrlBase
0, // Nutrs
@ -865,6 +865,11 @@ UfsPassThruDriverBindingStart (
Private->UfsHostController = UfsHc;
Private->UfsHcBase = UfsHcBase;
InitializeListHead (&Private->Queue);
Status = GetUfsHcInfo (Private);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Failed to initialize UfsHcInfo\n"));
goto Error;
}
//
// Initialize UFS Host Controller H/W.

@ -62,7 +62,7 @@ typedef struct _UFS_PASS_THRU_PRIVATE_DATA {
EFI_UFS_DEVICE_CONFIG_PROTOCOL UfsDevConfig;
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHostController;
UINTN UfsHcBase;
UINT32 Capabilities;
EDKII_UFS_HC_INFO UfsHcInfo;
UINT8 TaskTag;
@ -959,6 +959,19 @@ UfsRwUfsAttribute (
IN OUT UINT32 *AttrSize
);
/**
Initializes UfsHcInfo field in private data.
@param[in] Private Pointer to host controller private data.
@retval EFI_SUCCESS UfsHcInfo initialized successfully.
@retval Others Failed to initalize UfsHcInfo.
**/
EFI_STATUS
GetUfsHcInfo (
IN UFS_PASS_THRU_PRIVATE_DATA *Private
);
extern EFI_COMPONENT_NAME_PROTOCOL gUfsPassThruComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gUfsPassThruComponentName2;
extern EFI_DRIVER_BINDING_PROTOCOL gUfsPassThruDriverBinding;

@ -731,7 +731,7 @@ UfsFindAvailableSlotInTrl (
return Status;
}
Nutrs = (UINT8)((Private->Capabilities & UFS_HC_CAP_NUTRS) + 1);
Nutrs = (UINT8)((Private->UfsHcInfo.Capabilities & UFS_HC_CAP_NUTRS) + 1);
for (Index = 0; Index < Nutrs; Index++) {
if ((Data & (BIT0 << Index)) == 0) {
@ -1754,7 +1754,7 @@ UfsAllocateAlignCommonBuffer (
BOOLEAN Is32BitAddr;
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHc;
if ((Private->Capabilities & UFS_HC_CAP_64ADDR) == UFS_HC_CAP_64ADDR) {
if ((Private->UfsHcInfo.Capabilities & UFS_HC_CAP_64ADDR) == UFS_HC_CAP_64ADDR) {
Is32BitAddr = FALSE;
} else {
Is32BitAddr = TRUE;
@ -1947,7 +1947,6 @@ UfsInitTaskManagementRequestList (
IN UFS_PASS_THRU_PRIVATE_DATA *Private
)
{
UINT32 Data;
UINT8 Nutmrs;
VOID *CmdDescHost;
EFI_PHYSICAL_ADDRESS CmdDescPhyAddr;
@ -1961,17 +1960,10 @@ UfsInitTaskManagementRequestList (
CmdDescMapping = NULL;
CmdDescPhyAddr = 0;
Status = UfsMmioRead32 (Private, UFS_HC_CAP_OFFSET, &Data);
if (EFI_ERROR (Status)) {
return Status;
}
Private->Capabilities = Data;
//
// Allocate and initialize UTP Task Management Request List.
//
Nutmrs = (UINT8) (RShiftU64 ((Private->Capabilities & UFS_HC_CAP_NUTMRS), 16) + 1);
Nutmrs = (UINT8) (RShiftU64 ((Private->UfsHcInfo.Capabilities & UFS_HC_CAP_NUTMRS), 16) + 1);
Status = UfsAllocateAlignCommonBuffer (Private, Nutmrs * sizeof (UTP_TMRD), &CmdDescHost, &CmdDescPhyAddr, &CmdDescMapping);
if (EFI_ERROR (Status)) {
return Status;
@ -2020,7 +2012,6 @@ UfsInitTransferRequestList (
IN UFS_PASS_THRU_PRIVATE_DATA *Private
)
{
UINT32 Data;
UINT8 Nutrs;
VOID *CmdDescHost;
EFI_PHYSICAL_ADDRESS CmdDescPhyAddr;
@ -2034,17 +2025,10 @@ UfsInitTransferRequestList (
CmdDescMapping = NULL;
CmdDescPhyAddr = 0;
Status = UfsMmioRead32 (Private, UFS_HC_CAP_OFFSET, &Data);
if (EFI_ERROR (Status)) {
return Status;
}
Private->Capabilities = Data;
//
// Allocate and initialize UTP Transfer Request List.
//
Nutrs = (UINT8)((Private->Capabilities & UFS_HC_CAP_NUTRS) + 1);
Nutrs = (UINT8)((Private->UfsHcInfo.Capabilities & UFS_HC_CAP_NUTRS) + 1);
Status = UfsAllocateAlignCommonBuffer (Private, Nutrs * sizeof (UTP_TRD), &CmdDescHost, &CmdDescPhyAddr, &CmdDescMapping);
if (EFI_ERROR (Status)) {
return Status;
@ -2366,3 +2350,36 @@ ProcessAsyncTaskList (
}
}
/**
Initializes UfsHcInfo field in private data.
@param[in] Private Pointer to host controller private data.
@retval EFI_SUCCESS UfsHcInfo initialized successfully.
@retval Others Failed to initalize UfsHcInfo.
**/
EFI_STATUS
GetUfsHcInfo (
IN UFS_PASS_THRU_PRIVATE_DATA *Private
)
{
UINT32 Data;
EFI_STATUS Status;
Status = UfsMmioRead32 (Private, UFS_HC_VER_OFFSET, &Data);
if (EFI_ERROR (Status)) {
return Status;
}
Private->UfsHcInfo.Version = Data;
Status = UfsMmioRead32 (Private, UFS_HC_CAP_OFFSET, &Data);
if (EFI_ERROR (Status)) {
return Status;
}
Private->UfsHcInfo.Capabilities = Data;
return EFI_SUCCESS;
}