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

View File

@ -1,6 +1,6 @@
/** @file /** @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 SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -35,7 +35,7 @@ UFS_PASS_THRU_PRIVATE_DATA gUfsPassThruTemplate = {
}, },
0, // UfsHostController 0, // UfsHostController
0, // UfsHcBase 0, // UfsHcBase
0, // Capabilities {0, 0}, // UfsHcInfo
0, // TaskTag 0, // TaskTag
0, // UtpTrlBase 0, // UtpTrlBase
0, // Nutrs 0, // Nutrs
@ -865,6 +865,11 @@ UfsPassThruDriverBindingStart (
Private->UfsHostController = UfsHc; Private->UfsHostController = UfsHc;
Private->UfsHcBase = UfsHcBase; Private->UfsHcBase = UfsHcBase;
InitializeListHead (&Private->Queue); 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. // Initialize UFS Host Controller H/W.

View File

@ -62,7 +62,7 @@ typedef struct _UFS_PASS_THRU_PRIVATE_DATA {
EFI_UFS_DEVICE_CONFIG_PROTOCOL UfsDevConfig; EFI_UFS_DEVICE_CONFIG_PROTOCOL UfsDevConfig;
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHostController; EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHostController;
UINTN UfsHcBase; UINTN UfsHcBase;
UINT32 Capabilities; EDKII_UFS_HC_INFO UfsHcInfo;
UINT8 TaskTag; UINT8 TaskTag;
@ -959,6 +959,19 @@ UfsRwUfsAttribute (
IN OUT UINT32 *AttrSize 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_NAME_PROTOCOL gUfsPassThruComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gUfsPassThruComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gUfsPassThruComponentName2;
extern EFI_DRIVER_BINDING_PROTOCOL gUfsPassThruDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gUfsPassThruDriverBinding;

View File

@ -731,7 +731,7 @@ UfsFindAvailableSlotInTrl (
return Status; 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++) { for (Index = 0; Index < Nutrs; Index++) {
if ((Data & (BIT0 << Index)) == 0) { if ((Data & (BIT0 << Index)) == 0) {
@ -1754,7 +1754,7 @@ UfsAllocateAlignCommonBuffer (
BOOLEAN Is32BitAddr; BOOLEAN Is32BitAddr;
EDKII_UFS_HOST_CONTROLLER_PROTOCOL *UfsHc; 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; Is32BitAddr = FALSE;
} else { } else {
Is32BitAddr = TRUE; Is32BitAddr = TRUE;
@ -1947,7 +1947,6 @@ UfsInitTaskManagementRequestList (
IN UFS_PASS_THRU_PRIVATE_DATA *Private IN UFS_PASS_THRU_PRIVATE_DATA *Private
) )
{ {
UINT32 Data;
UINT8 Nutmrs; UINT8 Nutmrs;
VOID *CmdDescHost; VOID *CmdDescHost;
EFI_PHYSICAL_ADDRESS CmdDescPhyAddr; EFI_PHYSICAL_ADDRESS CmdDescPhyAddr;
@ -1961,17 +1960,10 @@ UfsInitTaskManagementRequestList (
CmdDescMapping = NULL; CmdDescMapping = NULL;
CmdDescPhyAddr = 0; 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. // 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); Status = UfsAllocateAlignCommonBuffer (Private, Nutmrs * sizeof (UTP_TMRD), &CmdDescHost, &CmdDescPhyAddr, &CmdDescMapping);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
@ -2020,7 +2012,6 @@ UfsInitTransferRequestList (
IN UFS_PASS_THRU_PRIVATE_DATA *Private IN UFS_PASS_THRU_PRIVATE_DATA *Private
) )
{ {
UINT32 Data;
UINT8 Nutrs; UINT8 Nutrs;
VOID *CmdDescHost; VOID *CmdDescHost;
EFI_PHYSICAL_ADDRESS CmdDescPhyAddr; EFI_PHYSICAL_ADDRESS CmdDescPhyAddr;
@ -2034,17 +2025,10 @@ UfsInitTransferRequestList (
CmdDescMapping = NULL; CmdDescMapping = NULL;
CmdDescPhyAddr = 0; 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. // 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); Status = UfsAllocateAlignCommonBuffer (Private, Nutrs * sizeof (UTP_TRD), &CmdDescHost, &CmdDescPhyAddr, &CmdDescMapping);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return 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;
}