mirror of https://github.com/acidanthera/audk.git
1023 lines
25 KiB
C
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
|