audk/MdePkg/Include/IndustryStandard/Ufs.h

1023 lines
25 KiB
C

/*++ @file
Common definitions for Universal Flash Storage (UFS)
Copyright (c) Microsoft Corporation. All rights reserved.
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
@par Revision Reference:
JESD220 - Universal Flash Storage (UFS)
Version 4.0
https://www.jedec.org/system/files/docs/JESD220F.pdf
--*/
#ifndef __UFS_H__
#define __UFS_H__
#include <Base.h>
#define UFS_LUN_0 0x00
#define UFS_LUN_1 0x01
#define UFS_LUN_2 0x02
#define UFS_LUN_3 0x03
#define UFS_LUN_4 0x04
#define UFS_LUN_5 0x05
#define UFS_LUN_6 0x06
#define UFS_LUN_7 0x07
#define UFS_WLUN_REPORT_LUNS 0x81
#define UFS_WLUN_UFS_DEV 0xD0
#define UFS_WLUN_BOOT 0xB0
#define UFS_WLUN_RPMB 0xC4
#pragma pack(1)
//
// UFS 4.0 Spec Table 10.13 - UTP Command UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x01*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 CmdSet : 4; /* Command Set Type */
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd1;
UINT8 Rsvd2;
UINT8 Rsvd3 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3
//
UINT32 ExpDataTranLen; /* Expected Data Transfer Length - Big Endian */
//
// DW4 - DW7
//
UINT8 Cdb[16];
} UTP_COMMAND_UPIU;
//
// UFS 4.0 Spec Table 10.15 - UTP Response UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x21*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 CmdSet : 4; /* Command Set Type */
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd1 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
UINT8 Response; /* Response */
UINT8 Status; /* Status */
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 DevInfo; /* Device Information */
UINT16 DataSegLen; /* Data Segment Length - Big Endian */
//
// DW3
//
UINT32 ResTranCount; /* Residual Transfer Count - Big Endian */
//
// DW4 - DW7
//
UINT8 Rsvd2[16];
//
// Data Segment - Sense Data
//
UINT16 SenseDataLen; /* Sense Data Length - Big Endian */
UINT8 SenseData[18]; /* Sense Data */
} UTP_RESPONSE_UPIU;
//
// UFS 4.0 Spec Table 10.21 - UTP Data-Out UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x02*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd1 : 4;
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd2[2];
UINT8 Rsvd3 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian */
//
// DW3
//
UINT32 DataBufOffset; /* Data Buffer Offset - Big Endian */
//
// DW4
//
UINT32 DataTranCount; /* Data Transfer Count - Big Endian */
//
// DW5 - DW7
//
UINT8 Rsvd5[12];
//
// Data Segment - Data to be sent out
//
// UINT8 Data[]; /* Data to be sent out, maximum is 65535 bytes */
} UTP_DATA_OUT_UPIU;
//
// UFS 4.0 Spec Table 10.23 - UTP Data-In UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x22*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd1 : 4;
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd2 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
UINT8 Rsvd3[2];
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian */
//
// DW3
//
UINT32 DataBufOffset; /* Data Buffer Offset - Big Endian */
//
// DW4
//
UINT32 DataTranCount; /* Data Transfer Count - Big Endian */
//
// DW5
//
UINT8 HintControl : 4; /* Hint Control */
UINT8 Rsvd5 : 4;
UINT8 HintIid : 4; /* Hint Initiator ID */
UINT8 HintExt_Iid : 4; /* Hint Initiator ID Extended */
UINT8 HintLun; /* Hint LUN */
UINT8 HintTaskTag; /* Hint Task Tag */
//
// DW6
//
UINT32 HintDataBufOffset; /* Hint Data Buffer Offset - Big Endian */
//
// DW7
//
UINT32 HintDataCount; /* Hint Data Count - Big Endian */
//
// Data Segment - Data to be read
//
// UINT8 Data[]; /* Data to be read, maximum is 65535 bytes */
} UTP_DATA_IN_UPIU;
//
// UFS 4.0 Spec Table 10.25 - UTP Ready-To-Transfer UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x31*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd1 : 4;
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd2 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
UINT8 Rsvd3[2];
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3
//
UINT32 DataBufOffset; /* Data Buffer Offset - Big Endian */
//
// DW4
//
UINT32 DataTranCount; /* Data Transfer Count - Big Endian */
//
// DW5
//
UINT8 HintControl : 4; /* Hint Control */
UINT8 Rsvd5 : 4;
UINT8 HintIid : 4; /* Hint Initiator ID */
UINT8 HintExt_Iid : 4; /* Hint Initiator ID Extended */
UINT8 HintLun; /* Hint LUN */
UINT8 HintTaskTag; /* Hint Task Tag */
//
// DW6
//
UINT32 HintDataBufOffset; /* Hint Data Buffer Offset - Big Endian */
//
// DW7
//
UINT32 HintDataCount; /* Hint Data Count - Big Endian */
//
// Data Segment - Data to be read
//
// UINT8 Data[]; /* Data to be read, maximum is 65535 bytes */
} UTP_RDY_TO_TRAN_UPIU;
//
// UFS 4.0 Spec Table 10.27 - UTP Task Management Request UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x04*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd1 : 4;
UINT8 Iid : 4; /* Initiator ID */
UINT8 TskManFunc; /* Task Management Function */
UINT8 Rsvd2;
UINT8 Rsvd3 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3
//
UINT32 InputParam1; /* Input Parameter 1 - Big Endian */
//
// DW4
//
UINT32 InputParam2; /* Input Parameter 2 - Big Endian */
//
// DW5
//
UINT32 InputParam3; /* Input Parameter 3 - Big Endian */
//
// DW6 - DW7
//
UINT8 Rsvd5[8];
} UTP_TM_REQ_UPIU;
//
// UFS 4.0 Spec Table 10.30 - UTP Task Management Response UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x24*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd1 : 4;
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd2 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
UINT8 Resp; /* Response */
UINT8 Rsvd3;
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3
//
UINT32 OutputParam1; /* Output Parameter 1 - Big Endian */
//
// DW4
//
UINT32 OutputParam2; /* Output Parameter 2 - Big Endian */
//
// DW5 - DW7
//
UINT8 Rsvd5[12];
} UTP_TM_RESP_UPIU;
//
// UFS 4.0 Spec Table 10.35 - 10.57 - Transaction Specific Fields for (Genericized) Opcode
//
typedef struct {
UINT8 Opcode;
UINT8 DescId;
UINT8 Index;
UINT8 Selector;
UINT16 Rsvd1;
UINT16 Length;
UINT32 Value;
UINT32 Rsvd2;
} UTP_UPIU_TSF;
//
// UFS 4.0 Spec Table 10.33 - UTP Query Request UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x16*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Rsvd1;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd2;
UINT8 QueryFunc; /* Query Function */
UINT8 Rsvd3[2];
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd4;
UINT16 DataSegLen; /* Data Segment Length - Big Endian */
//
// DW3 - 6
//
UTP_UPIU_TSF Tsf; /* Transaction Specific Fields */
//
// DW7
//
UINT8 Rsvd5[4];
//
// Data Segment - Data to be transferred
//
// UINT8 Data[]; /* Data to be transferred, maximum is 65535 bytes */
} UTP_QUERY_REQ_UPIU;
#define QUERY_FUNC_STD_READ_REQ 0x01
#define QUERY_FUNC_STD_WRITE_REQ 0x81
//
// UFS 4.0 Spec Table 10.36 - Query Function opcode values
//
typedef enum {
UtpQueryFuncOpcodeNop = 0x00,
UtpQueryFuncOpcodeRdDesc = 0x01,
UtpQueryFuncOpcodeWrDesc = 0x02,
UtpQueryFuncOpcodeRdAttr = 0x03,
UtpQueryFuncOpcodeWrAttr = 0x04,
UtpQueryFuncOpcodeRdFlag = 0x05,
UtpQueryFuncOpcodeSetFlag = 0x06,
UtpQueryFuncOpcodeClrFlag = 0x07,
UtpQueryFuncOpcodeTogFlag = 0x08
} UTP_QUERY_FUNC_OPCODE;
//
// UFS 4.0 Spec Table 10.46 - UTP Query Response UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x36*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Rsvd1;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd2;
UINT8 QueryFunc; /* Query Function */
UINT8 QueryResp; /* Query Response */
UINT8 Rsvd3;
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 DevInfo; /* Device Information */
UINT16 DataSegLen; /* Data Segment Length - Big Endian */
//
// DW3 - 6
//
UTP_UPIU_TSF Tsf; /* Transaction Specific Fields */
//
// DW7
//
UINT8 Rsvd4[4];
//
// Data Segment - Data to be transferred
//
// UINT8 Data[]; /* Data to be transferred, maximum is 65535 bytes */
} UTP_QUERY_RESP_UPIU;
//
// UFS 4.0 Spec Table 10.47 - Query Response Code
//
typedef enum {
UfsUtpQueryResponseSuccess = 0x00,
UfsUtpQueryResponseParamNotReadable = 0xF6,
UfsUtpQueryResponseParamNotWriteable = 0xF7,
UfsUtpQueryResponseParamAlreadyWritten = 0xF8,
UfsUtpQueryResponseInvalidLen = 0xF9,
UfsUtpQueryResponseInvalidVal = 0xFA,
UfsUtpQueryResponseInvalidSelector = 0xFB,
UfsUtpQueryResponseInvalidIndex = 0xFC,
UfsUtpQueryResponseInvalidIdn = 0xFD,
UfsUtpQueryResponseInvalidOpc = 0xFE,
UfsUtpQueryResponseGeneralFailure = 0xFF
} UTP_QUERY_RESP_CODE;
//
// UFS 4.0 Spec Table 10.58 - UTP Reject UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x3F*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Lun;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd1 : 4;
UINT8 Iid : 4; /* Initiator ID */
UINT8 Rsvd2 : 4;
UINT8 Ext_Iid : 4; /* Initiator ID Extended */
UINT8 Response; /* Response - 0x01 */
UINT8 Rsvd3;
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 DevInfo; /* Device Information - 0x00 */
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3
//
UINT8 HdrSts; /* Basic Header Status */
UINT8 Rsvd4;
UINT8 E2ESts; /* End-to-End Status */
UINT8 Rsvd5;
//
// DW4 - DW7
//
UINT8 Rsvd6[16];
} UTP_REJ_UPIU;
//
// UFS 4.0 Spec Table 10.61 - UTP NOP OUT UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x00*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Rsvd1;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd2[4];
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 Rsvd3;
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3 - DW7
//
UINT8 Rsvd4[20];
} UTP_NOP_OUT_UPIU;
//
// UFS 4.0 Spec Table 10.62 - UTP NOP IN UPIU
//
typedef struct {
//
// DW0
//
UINT8 TransCode : 6; /* Transaction Type - 0x20*/
UINT8 Dd : 1;
UINT8 Hd : 1;
UINT8 Flags;
UINT8 Rsvd1;
UINT8 TaskTag; /* Task Tag */
//
// DW1
//
UINT8 Rsvd2[2];
UINT8 Resp; /* Response - 0x00 */
UINT8 Rsvd3;
//
// DW2
//
UINT8 EhsLen; /* Total EHS Length - 0x00 */
UINT8 DevInfo; /* Device Information - 0x00 */
UINT16 DataSegLen; /* Data Segment Length - Big Endian - 0x0000 */
//
// DW3 - DW7
//
UINT8 Rsvd4[20];
} UTP_NOP_IN_UPIU;
//
// UFS 4.0 Spec Table 14.1 - Descriptor identification values
//
typedef enum {
UfsDeviceDesc = 0x00,
UfsConfigDesc = 0x01,
UfsUnitDesc = 0x02,
UfsInterConnDesc = 0x04,
UfsStringDesc = 0x05,
UfsGeometryDesc = 0x07,
UfsPowerDesc = 0x08,
UfsDevHealthDesc = 0x09
} UFS_DESC_IDN;
//
// UFS 4.0 Spec Table 14.4 - Device Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT8 Device;
UINT8 DevClass;
UINT8 DevSubClass;
UINT8 Protocol;
UINT8 NumLun;
UINT8 NumWLun;
UINT8 BootEn;
UINT8 DescAccessEn;
UINT8 InitPowerMode;
UINT8 HighPriorityLun;
UINT8 SecureRemovalType;
UINT8 SecurityLun;
UINT8 BgOpsTermLat;
UINT8 InitActiveIccLevel;
UINT16 SpecVersion;
UINT16 ManufactureDate;
UINT8 ManufacturerName;
UINT8 ProductName;
UINT8 SerialName;
UINT8 OemId;
UINT16 ManufacturerId;
UINT8 Ud0BaseOffset;
UINT8 Ud0ConfParamLen;
UINT8 DevRttCap;
UINT16 PeriodicRtcUpdate;
UINT8 UFSFeaturesSupport; // Deprecated, use ExtendedUFSFeaturesSupport
UINT8 FFUTimeout;
UINT8 QueueDepth;
UINT16 DeviceVersion;
UINT8 NumSecureWPArea;
UINT32 PSAMaxDataSize;
UINT8 PSAStateTimeout;
UINT8 ProductRevisionLevel;
UINT8 Rsvd1[5];
UINT8 Rsvd2[16];
UINT8 Rsvd3[3];
UINT8 Rsvd4[12];
UINT32 ExtendedUFSFeaturesSupport;
UINT8 WriteBoosterBufPreserveUserSpaceEn;
UINT8 WriteBoosterBufType;
UINT32 NumSharedWriteBoosterAllocUnits;
} UFS_DEV_DESC;
//
// UFS 4.0 Spec Table 14.4 (Offset 10h) - Specification version
//
typedef union {
struct {
UINT8 Suffix : 4;
UINT8 Minor : 4;
UINT8 Major;
} Bits;
UINT16 Data;
} UFS_SPEC_VERSION;
//
// UFS 4.0 Spec Table 14.4 (Offset 4Fh) - Extended UFS Features Support
//
typedef union {
struct {
UINT32 FFU : 1;
UINT32 PSA : 1;
UINT32 DeviceLifeSpan : 1;
UINT32 RefreshOperation : 1;
UINT32 TooHighTemp : 1;
UINT32 TooLowTemp : 1;
UINT32 ExtendedTemp : 1;
UINT32 Rsvd1 : 1;
UINT32 WriteBooster : 1;
UINT32 PerformanceThrottling : 1;
UINT32 AdvancedRPMB : 1;
UINT32 Rsvd2 : 3;
UINT32 Barrier : 1;
UINT32 ClearErrorHistory : 1;
UINT32 Ext_Iid : 1;
UINT32 Rsvd3 : 1;
UINT32 Rsvd4 : 14;
} Bits;
UINT32 Data;
} EXTENDED_UFS_FEATURES_SUPPORT;
//
// UFS 4.0 Spec Table 14.10 - Configuration Descriptor Header (INDEX = 0)
// and Device Descriptor Configuration parameters
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT8 ConfDescContinue;
UINT8 BootEn;
UINT8 DescAccessEn;
UINT8 InitPowerMode;
UINT8 HighPriorityLun;
UINT8 SecureRemovalType;
UINT8 InitActiveIccLevel;
UINT16 PeriodicRtcUpdate;
UINT8 Rsvd1;
UINT8 RpmbRegionEnable;
UINT8 RpmbRegion1Size;
UINT8 RpmbRegion2Size;
UINT8 RpmbRegion3Size;
UINT8 WriteBoosterBufPreserveUserSpaceEn;
UINT8 WriteBoosterBufType;
UINT32 NumSharedWriteBoosterAllocUnits;
} UFS_CONFIG_DESC_GEN_HEADER;
//
// UFS 4.0 Spec Table 14.11 - Configuration Descriptor Header (INDEX = 1/2/3)
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT8 ConfDescContinue;
UINT8 Rsvd1[19];
} UFS_CONFIG_DESC_EXT_HEADER;
//
// UFS 4.0 Spec Table 14.12 - UNit Descriptor configurable parameters
//
typedef struct {
UINT8 LunEn;
UINT8 BootLunId;
UINT8 LunWriteProt;
UINT8 MemType;
UINT32 NumAllocUnits;
UINT8 DataReliability;
UINT8 LogicBlkSize;
UINT8 ProvisionType;
UINT16 CtxCap;
UINT8 Rsvd1[3];
UINT8 Rsvd2[6];
UINT32 LuNumWriteBoosterBufAllocUnits;
} UFS_UNIT_DESC_CONFIG_PARAMS;
//
// UFS 4.0 Spec Table 14.6 - Configuration Descriptor Format
//
// WARNING: This struct contains variable-size members! (across spec versions)
// To maintain backward compatibility, UnitDescConfParams should not be
// accessed as a struct member.
// Instead, use `Ud0BaseOffset` and `Ud0ConfParamLen` from the Device
// Descriptor to calculate the offset and location of the Unit Descriptors.
//
typedef struct {
UFS_CONFIG_DESC_GEN_HEADER Header;
UFS_UNIT_DESC_CONFIG_PARAMS UnitDescConfParams[8];
} UFS_CONFIG_DESC;
//
// UFS 4.0 Spec Table 14.13 - Geometry Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT8 MediaTech;
UINT8 Rsvd1;
UINT64 TotalRawDevCapacity;
UINT8 MaxNumberLu;
UINT32 SegSize;
UINT8 AllocUnitSize;
UINT8 MinAddrBlkSize;
UINT8 OptReadBlkSize;
UINT8 OptWriteBlkSize;
UINT8 MaxInBufSize;
UINT8 MaxOutBufSize;
UINT8 RpmbRwSize;
UINT8 DynamicCapacityResourcePolicy;
UINT8 DataOrder;
UINT8 MaxCtxIdNum;
UINT8 SysDataTagUnitSize;
UINT8 SysDataResUnitSize;
UINT8 SupSecRemovalTypes;
UINT16 SupMemTypes;
UINT32 SysCodeMaxNumAllocUnits;
UINT16 SupCodeCapAdjFac;
UINT32 NonPersMaxNumAllocUnits;
UINT16 NonPersCapAdjFac;
UINT32 Enhance1MaxNumAllocUnits;
UINT16 Enhance1CapAdjFac;
UINT32 Enhance2MaxNumAllocUnits;
UINT16 Enhance2CapAdjFac;
UINT32 Enhance3MaxNumAllocUnits;
UINT16 Enhance3CapAdjFac;
UINT32 Enhance4MaxNumAllocUnits;
UINT16 Enhance4CapAdjFac;
UINT32 OptLogicBlkSize;
UINT8 Rsvd2[5];
UINT8 Rsvd3[2];
UINT32 WriteBoosterBufMaxNumAllocUnits;
UINT8 DeviceMaxWriteBoosterLus;
UINT8 WriteBoosterBufCapAdjFac;
UINT8 SupWriteBoosterBufUserSpaceReductionTypes;
UINT8 SupWriteBoosterBufTypes;
} UFS_GEOMETRY_DESC;
//
// UFS 4.0 Spec Table 14.14 - Unit Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT8 UnitIdx;
UINT8 LunEn;
UINT8 BootLunId;
UINT8 LunWriteProt;
UINT8 LunQueueDep;
UINT8 PsaSensitive;
UINT8 MemType;
UINT8 DataReliability;
UINT8 LogicBlkSize;
UINT64 LogicBlkCount;
UINT32 EraseBlkSize;
UINT8 ProvisionType;
UINT64 PhyMemResCount;
UINT16 CtxCap;
UINT8 LargeUnitGranularity;
UINT8 Rsvd1[6];
UINT32 LuNumWriteBoosterBufAllocUnits;
} UFS_UNIT_DESC;
//
// UFS 4.0 Spec Table 14.15 - RPMB Unit Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT8 UnitIdx;
UINT8 LunEn;
UINT8 BootLunId;
UINT8 LunWriteProt;
UINT8 LunQueueDep;
UINT8 PsaSensitive;
UINT8 MemType;
UINT8 RpmbRegionEnable;
UINT8 LogicBlkSize;
UINT64 LogicBlkCount;
UINT8 RpmbRegion0Size;
UINT8 RpmbRegion1Size;
UINT8 RpmbRegion2Size;
UINT8 RpmbRegion3Size;
UINT8 ProvisionType;
UINT64 PhyMemResCount;
UINT8 Rsvd3[3];
} UFS_RPMB_UNIT_DESC;
//
// UFS 4.0 Spec Table 7.13 - Format for Power Parameter element
//
typedef struct {
UINT16 Value : 12;
UINT16 Rsvd1 : 2;
UINT16 Unit : 2;
} UFS_POWER_PARAM_ELEMENT;
//
// UFS 4.0 Spec Table 14.16 - Power Parameters Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UFS_POWER_PARAM_ELEMENT ActiveIccLevelVcc[16];
UFS_POWER_PARAM_ELEMENT ActiveIccLevelVccQ[16];
UFS_POWER_PARAM_ELEMENT ActiveIccLevelVccQ2[16];
} UFS_POWER_DESC;
//
// UFS 4.0 Spec Table 14.17 - Interconnect Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
UINT16 UniProVer;
UINT16 MphyVer;
} UFS_INTER_CONNECT_DESC;
//
// UFS 4.0 Spec Table 14.18 - 14.22 - String Descriptor
//
typedef struct {
UINT8 Length;
UINT8 DescType;
CHAR16 Unicode[126];
} UFS_STRING_DESC;
//
// UFS 4.0 Spec Table 14.26 - Flags
//
typedef enum {
UfsFlagDevInit = 0x01,
UfsFlagPermWpEn = 0x02,
UfsFlagPowerOnWpEn = 0x03,
UfsFlagBgOpsEn = 0x04,
UfsFlagDevLifeSpanModeEn = 0x05,
UfsFlagPurgeEn = 0x06,
UfsFlagRefreshEn = 0x07,
UfsFlagPhyResRemoval = 0x08,
UfsFlagBusyRtc = 0x09,
UfsFlagPermDisFwUpdate = 0x0B,
UfsFlagWriteBoosterEn = 0x0E,
UfsFlagWbBufFlushEn = 0x0F,
UfsFlagWbBufFlushHibernate = 0x10
} UFS_FLAGS_IDN;
//
// UFS 4.0 Spec Table 14.28 - Attributes
//
typedef enum {
UfsAttrBootLunEn = 0x00,
UfsAttrCurPowerMode = 0x02,
UfsAttrActiveIccLevel = 0x03,
UfsAttrOutOfOrderDataEn = 0x04,
UfsAttrBgOpStatus = 0x05,
UfsAttrPurgeStatus = 0x06,
UfsAttrMaxDataInSize = 0x07,
UfsAttrMaxDataOutSize = 0x08,
UfsAttrDynCapNeeded = 0x09,
UfsAttrRefClkFreq = 0x0a,
UfsAttrConfigDescLock = 0x0b,
UfsAttrMaxNumOfRtt = 0x0c,
UfsAttrExceptionEvtCtrl = 0x0d,
UfsAttrExceptionEvtSts = 0x0e,
UfsAttrSecondsPassed = 0x0f,
UfsAttrContextConf = 0x10,
UfsAttrDeviceFfuStatus = 0x14,
UfsAttrPsaState = 0x15,
UfsAttrPsaDataSize = 0x16,
UfsAttrRefClkGatingWaitTime = 0x17,
UfsAttrDeviceCaseRoughTemp = 0x18,
UfsAttrDeviceTooHighTempBound = 0x19,
UfsAttrDeviceTooLowTempBound = 0x1a,
UfsAttrThrottlingStatus = 0x1b,
UfsAttrWriteBoosterBufFlushStatus = 0x1c,
UfsAttrAvailableWriteBoosterBufSize = 0x1d,
UfsAttrWriteBoosterBufLifeTimeEst = 0x1e,
UfsAttrCurrentWriteBoosterBufSize = 0x1f,
UfsAttrExtIidEn = 0x2a,
UfsAttrHostHintCacheSize = 0x2b,
UfsAttrRefreshStatus = 0x2c,
UfsAttrRefreshFreq = 0x2d,
UfsAttrRefreshUnit = 0x2e,
UfsAttrRefreshMethod = 0x2f,
UfsAttrTimestamp = 0x30
} UFS_ATTR_IDN;
#pragma pack()
#endif