/** @file\r
\r
- Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
}\r
};\r
\r
-/**\r
- Execute Request Sense SCSI command on a specific UFS device.\r
-\r
- @param[in] Private A pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.\r
- @param[in] Lun The lun on which the SCSI cmd executed.\r
- @param[out] DataBuffer A pointer to output sense data.\r
- @param[out] DataBufferLength The length of output sense data.\r
-\r
- @retval EFI_SUCCESS The command executed successfully.\r
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to send SCSI Request Packet.\r
- @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute.\r
-\r
-**/\r
-EFI_STATUS\r
-UfsPeimRequestSense (\r
- IN UFS_PEIM_HC_PRIVATE_DATA *Private,\r
- IN UINTN Lun,\r
- OUT VOID *DataBuffer,\r
- OUT UINT32 *DataBufferLength\r
- )\r
-{\r
- UFS_SCSI_REQUEST_PACKET Packet;\r
- UINT8 Cdb[UFS_SCSI_OP_LENGTH_SIX];\r
- EFI_STATUS Status;\r
-\r
- ZeroMem (&Packet, sizeof (UFS_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, sizeof (Cdb));\r
-\r
- Cdb[0] = EFI_SCSI_OP_REQUEST_SENSE;\r
-\r
- Packet.Timeout = UFS_TIMEOUT;\r
- Packet.Cdb = Cdb;\r
- Packet.CdbLength = sizeof (Cdb);\r
- Packet.DataDirection = UfsDataIn;\r
- Packet.InDataBuffer = DataBuffer;\r
- Packet.InTransferLength = *DataBufferLength;\r
- Packet.SenseData = NULL;\r
- Packet.SenseDataLength = 0;\r
-\r
- Status = UfsExecScsiCmds (Private,(UINT8)Lun, &Packet);\r
\r
- if (!EFI_ERROR (Status)) {\r
- *DataBufferLength = Packet.InTransferLength;\r
- }\r
-\r
- return Status;\r
-}\r
\r
/**\r
Execute TEST UNITY READY SCSI command on a specific UFS device.\r
return Status;\r
}\r
\r
-/**\r
- Execute INQUIRY SCSI command on a specific UFS device.\r
\r
- @param[in] Private A pointer to UFS_PEIM_HC_PRIVATE_DATA data structure.\r
- @param[in] Lun The lun on which the SCSI cmd executed.\r
- @param[out] Inquiry A pointer to Inquiry data buffer.\r
- @param[out] InquiryLengths The length of output Inquiry data.\r
- @param[out] SenseData A pointer to output sense data.\r
- @param[out] SenseDataLength The length of output sense data.\r
-\r
- @retval EFI_SUCCESS The command executed successfully.\r
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to send SCSI Request Packet.\r
- @retval EFI_TIMEOUT A timeout occurred while waiting for the SCSI Request Packet to execute.\r
-\r
-**/\r
-EFI_STATUS\r
-UfsPeimInquiry (\r
- IN UFS_PEIM_HC_PRIVATE_DATA *Private,\r
- IN UINTN Lun,\r
- OUT VOID *Inquiry,\r
- OUT UINT32 *InquiryLength,\r
- OUT VOID *SenseData, OPTIONAL\r
- OUT UINT8 *SenseDataLength\r
- )\r
-{\r
- UFS_SCSI_REQUEST_PACKET Packet;\r
- UINT8 Cdb[UFS_SCSI_OP_LENGTH_SIX];\r
- EFI_STATUS Status;\r
-\r
- ZeroMem (&Packet, sizeof (UFS_SCSI_REQUEST_PACKET));\r
- ZeroMem (Cdb, sizeof (Cdb));\r
-\r
- Cdb[0] = EFI_SCSI_OP_INQUIRY;\r
- Cdb[4] = sizeof (EFI_SCSI_INQUIRY_DATA);\r
-\r
- Packet.Timeout = UFS_TIMEOUT;\r
- Packet.Cdb = Cdb;\r
- Packet.CdbLength = sizeof (Cdb);\r
- Packet.InDataBuffer = Inquiry;\r
- Packet.InTransferLength = *InquiryLength;\r
- Packet.DataDirection = UfsDataIn;\r
- Packet.SenseData = SenseData;\r
- Packet.SenseDataLength = *SenseDataLength;\r
-\r
- Status = UfsExecScsiCmds (Private, (UINT8)Lun, &Packet);\r
-\r
- if (*SenseDataLength != 0) {\r
- *SenseDataLength = Packet.SenseDataLength;\r
- }\r
-\r
- if (!EFI_ERROR (Status)) {\r
- *InquiryLength = Packet.InTransferLength;\r
- }\r
-\r
- return Status;\r
-}\r
\r
/**\r
Execute READ CAPACITY(10) SCSI command on a specific UFS device.\r
EFI_SCSI_DISK_CAPACITY_DATA16 Capacity16;\r
UINTN DataLength;\r
BOOLEAN NeedRetry;\r
+ UINTN Lun;\r
\r
Private = GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS (This);\r
NeedRetry = TRUE;\r
\r
- if (DeviceIndex >= UFS_PEIM_MAX_LUNS) {\r
+ if ((DeviceIndex == 0) || (DeviceIndex > UFS_PEIM_MAX_LUNS)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if ((Private->Luns.BitMask & (BIT0 << DeviceIndex)) == 0) {\r
+ Lun = DeviceIndex - 1;\r
+ if ((Private->Luns.BitMask & (BIT0 << Lun)) == 0) {\r
return EFI_ACCESS_DENIED;\r
}\r
\r
do {\r
Status = UfsPeimTestUnitReady (\r
Private,\r
- DeviceIndex,\r
+ Lun,\r
&SenseData,\r
&SenseDataLength\r
);\r
continue;\r
}\r
\r
- Status = UfsPeimParsingSenseKeys (&(Private->Media[DeviceIndex]), &SenseData, &NeedRetry);\r
+ Status = UfsPeimParsingSenseKeys (&(Private->Media[Lun]), &SenseData, &NeedRetry);\r
if (EFI_ERROR (Status)) {\r
return EFI_DEVICE_ERROR;\r
}\r
\r
DataLength = sizeof (EFI_SCSI_DISK_CAPACITY_DATA);\r
SenseDataLength = 0;\r
- Status = UfsPeimReadCapacity (Private, DeviceIndex, &Capacity, (UINT32 *)&DataLength, NULL, &SenseDataLength);\r
+ Status = UfsPeimReadCapacity (Private, Lun, &Capacity, (UINT32 *)&DataLength, NULL, &SenseDataLength);\r
if (EFI_ERROR (Status)) {\r
return EFI_DEVICE_ERROR;\r
}\r
(Capacity.LastLba1 == 0xff) && (Capacity.LastLba0 == 0xff)) {\r
DataLength = sizeof (EFI_SCSI_DISK_CAPACITY_DATA16);\r
SenseDataLength = 0;\r
- Status = UfsPeimReadCapacity16 (Private, DeviceIndex, &Capacity16, (UINT32 *)&DataLength, NULL, &SenseDataLength);\r
+ Status = UfsPeimReadCapacity16 (Private, Lun, &Capacity16, (UINT32 *)&DataLength, NULL, &SenseDataLength);\r
if (EFI_ERROR (Status)) {\r
return EFI_DEVICE_ERROR;\r
}\r
- Private->Media[DeviceIndex].LastBlock = ((UINT32)Capacity16.LastLba3 << 24) | (Capacity16.LastLba2 << 16) | (Capacity16.LastLba1 << 8) | Capacity16.LastLba0;\r
- Private->Media[DeviceIndex].LastBlock |= LShiftU64 ((UINT64)Capacity16.LastLba7, 56) | LShiftU64((UINT64)Capacity16.LastLba6, 48) | LShiftU64 ((UINT64)Capacity16.LastLba5, 40) | LShiftU64 ((UINT64)Capacity16.LastLba4, 32);\r
- Private->Media[DeviceIndex].BlockSize = (Capacity16.BlockSize3 << 24) | (Capacity16.BlockSize2 << 16) | (Capacity16.BlockSize1 << 8) | Capacity16.BlockSize0;\r
+ Private->Media[Lun].LastBlock = ((UINT32)Capacity16.LastLba3 << 24) | (Capacity16.LastLba2 << 16) | (Capacity16.LastLba1 << 8) | Capacity16.LastLba0;\r
+ Private->Media[Lun].LastBlock |= LShiftU64 ((UINT64)Capacity16.LastLba7, 56) | LShiftU64((UINT64)Capacity16.LastLba6, 48) | LShiftU64 ((UINT64)Capacity16.LastLba5, 40) | LShiftU64 ((UINT64)Capacity16.LastLba4, 32);\r
+ Private->Media[Lun].BlockSize = (Capacity16.BlockSize3 << 24) | (Capacity16.BlockSize2 << 16) | (Capacity16.BlockSize1 << 8) | Capacity16.BlockSize0;\r
} else {\r
- Private->Media[DeviceIndex].LastBlock = ((UINT32)Capacity.LastLba3 << 24) | (Capacity.LastLba2 << 16) | (Capacity.LastLba1 << 8) | Capacity.LastLba0;\r
- Private->Media[DeviceIndex].BlockSize = (Capacity.BlockSize3 << 24) | (Capacity.BlockSize2 << 16) | (Capacity.BlockSize1 << 8) | Capacity.BlockSize0;\r
+ Private->Media[Lun].LastBlock = ((UINT32)Capacity.LastLba3 << 24) | (Capacity.LastLba2 << 16) | (Capacity.LastLba1 << 8) | Capacity.LastLba0;\r
+ Private->Media[Lun].BlockSize = (Capacity.BlockSize3 << 24) | (Capacity.BlockSize2 << 16) | (Capacity.BlockSize1 << 8) | Capacity.BlockSize0;\r
}\r
\r
MediaInfo->DeviceType = UfsDevice;\r
- MediaInfo->MediaPresent = Private->Media[DeviceIndex].MediaPresent;\r
- MediaInfo->LastBlock = (UINTN)Private->Media[DeviceIndex].LastBlock;\r
- MediaInfo->BlockSize = Private->Media[DeviceIndex].BlockSize;\r
+ MediaInfo->MediaPresent = Private->Media[Lun].MediaPresent;\r
+ MediaInfo->LastBlock = (UINTN)Private->Media[Lun].LastBlock;\r
+ MediaInfo->BlockSize = Private->Media[Lun].BlockSize;\r
\r
return EFI_SUCCESS;\r
}\r
EFI_SCSI_SENSE_DATA SenseData;\r
UINT8 SenseDataLength;\r
BOOLEAN NeedRetry;\r
+ UINTN Lun;\r
\r
Status = EFI_SUCCESS;\r
NeedRetry = TRUE;\r
return EFI_SUCCESS;\r
}\r
\r
- if (DeviceIndex >= UFS_PEIM_MAX_LUNS) {\r
+ if ((DeviceIndex == 0) || (DeviceIndex > UFS_PEIM_MAX_LUNS)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if ((Private->Luns.BitMask & (BIT0 << DeviceIndex)) == 0) {\r
+ Lun = DeviceIndex - 1;\r
+ if ((Private->Luns.BitMask & (BIT0 << Lun)) == 0) {\r
return EFI_ACCESS_DENIED;\r
}\r
\r
- BlockSize = Private->Media[DeviceIndex].BlockSize;\r
+ BlockSize = Private->Media[Lun].BlockSize;\r
\r
if (BufferSize % BlockSize != 0) {\r
Status = EFI_BAD_BUFFER_SIZE;\r
}\r
\r
- if (StartLBA > Private->Media[DeviceIndex].LastBlock) {\r
+ if (StartLBA > Private->Media[Lun].LastBlock) {\r
Status = EFI_INVALID_PARAMETER;\r
}\r
\r
do {\r
Status = UfsPeimTestUnitReady (\r
Private,\r
- DeviceIndex,\r
+ Lun,\r
&SenseData,\r
&SenseDataLength\r
);\r
continue;\r
}\r
\r
- Status = UfsPeimParsingSenseKeys (&(Private->Media[DeviceIndex]), &SenseData, &NeedRetry);\r
+ Status = UfsPeimParsingSenseKeys (&(Private->Media[Lun]), &SenseData, &NeedRetry);\r
if (EFI_ERROR (Status)) {\r
return EFI_DEVICE_ERROR;\r
}\r
} while (NeedRetry);\r
\r
SenseDataLength = 0;\r
- if (Private->Media[DeviceIndex].LastBlock < 0xfffffffful) {\r
+ if (Private->Media[Lun].LastBlock < 0xfffffffful) {\r
Status = UfsPeimRead10 (\r
Private,\r
- DeviceIndex,\r
+ Lun,\r
(UINT32)StartLBA,\r
(UINT32)NumberOfBlocks,\r
Buffer,\r
} else {\r
Status = UfsPeimRead16 (\r
Private,\r
- DeviceIndex,\r
+ Lun,\r
(UINT32)StartLBA,\r
(UINT32)NumberOfBlocks,\r
Buffer,\r
EFI_STATUS Status;\r
UFS_PEIM_HC_PRIVATE_DATA *Private;\r
EFI_PEI_BLOCK_IO_MEDIA Media;\r
+ UINTN Lun;\r
\r
Private = GET_UFS_PEIM_HC_PRIVATE_DATA_FROM_THIS2 (This);\r
\r
return Status;\r
}\r
\r
- CopyMem (MediaInfo, &(Private->Media[DeviceIndex]), sizeof (EFI_PEI_BLOCK_IO2_MEDIA));\r
+ Lun = DeviceIndex - 1;\r
+ CopyMem (MediaInfo, &(Private->Media[Lun]), sizeof (EFI_PEI_BLOCK_IO2_MEDIA));\r
return EFI_SUCCESS;\r
}\r
\r