mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-04 13:23:26 +01:00
1340 lines
32 KiB
C
1340 lines
32 KiB
C
|
/** @file
|
||
|
UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
|
||
|
for upper layer application to execute UFS-supported SCSI cmds.
|
||
|
|
||
|
Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef _UFS_PASS_THRU_HCI_H_
|
||
|
#define _UFS_PASS_THRU_HCI_H_
|
||
|
|
||
|
//
|
||
|
// Host Capabilities Register Offsets
|
||
|
//
|
||
|
#define UFS_HC_CAP_OFFSET 0x0000 // Controller Capabilities
|
||
|
#define UFS_HC_VER_OFFSET 0x0008 // Version
|
||
|
#define UFS_HC_DDID_OFFSET 0x0010 // Device ID and Device Class
|
||
|
#define UFS_HC_PMID_OFFSET 0x0014 // Product ID and Manufacturer ID
|
||
|
#define UFS_HC_AHIT_OFFSET 0x0018 // Auto-Hibernate Idle Timer
|
||
|
//
|
||
|
// Operation and Runtime Register Offsets
|
||
|
//
|
||
|
#define UFS_HC_IS_OFFSET 0x0020 // Interrupt Status
|
||
|
#define UFS_HC_IE_OFFSET 0x0024 // Interrupt Enable
|
||
|
#define UFS_HC_STATUS_OFFSET 0x0030 // Host Controller Status
|
||
|
#define UFS_HC_ENABLE_OFFSET 0x0034 // Host Controller Enable
|
||
|
#define UFS_HC_UECPA_OFFSET 0x0038 // Host UIC Error Code PHY Adapter Layer
|
||
|
#define UFS_HC_UECDL_OFFSET 0x003c // Host UIC Error Code Data Link Layer
|
||
|
#define UFS_HC_UECN_OFFSET 0x0040 // Host UIC Error Code Network Layer
|
||
|
#define UFS_HC_UECT_OFFSET 0x0044 // Host UIC Error Code Transport Layer
|
||
|
#define UFS_HC_UECDME_OFFSET 0x0048 // Host UIC Error Code DME
|
||
|
#define UFS_HC_UTRIACR_OFFSET 0x004c // UTP Transfer Request Interrupt Aggregation Control Register
|
||
|
//
|
||
|
// UTP Transfer Register Offsets
|
||
|
//
|
||
|
#define UFS_HC_UTRLBA_OFFSET 0x0050 // UTP Transfer Request List Base Address
|
||
|
#define UFS_HC_UTRLBAU_OFFSET 0x0054 // UTP Transfer Request List Base Address Upper 32-Bits
|
||
|
#define UFS_HC_UTRLDBR_OFFSET 0x0058 // UTP Transfer Request List Door Bell Register
|
||
|
#define UFS_HC_UTRLCLR_OFFSET 0x005c // UTP Transfer Request List CLear Register
|
||
|
#define UFS_HC_UTRLRSR_OFFSET 0x0060 // UTP Transfer Request Run-Stop Register
|
||
|
//
|
||
|
// UTP Task Management Register Offsets
|
||
|
//
|
||
|
#define UFS_HC_UTMRLBA_OFFSET 0x0070 // UTP Task Management Request List Base Address
|
||
|
#define UFS_HC_UTMRLBAU_OFFSET 0x0074 // UTP Task Management Request List Base Address Upper 32-Bits
|
||
|
#define UFS_HC_UTMRLDBR_OFFSET 0x0078 // UTP Task Management Request List Door Bell Register
|
||
|
#define UFS_HC_UTMRLCLR_OFFSET 0x007c // UTP Task Management Request List CLear Register
|
||
|
#define UFS_HC_UTMRLRSR_OFFSET 0x0080 // UTP Task Management Run-Stop Register
|
||
|
//
|
||
|
// UIC Command Register Offsets
|
||
|
//
|
||
|
#define UFS_HC_UIC_CMD_OFFSET 0x0090 // UIC Command Register
|
||
|
#define UFS_HC_UCMD_ARG1_OFFSET 0x0094 // UIC Command Argument 1
|
||
|
#define UFS_HC_UCMD_ARG2_OFFSET 0x0098 // UIC Command Argument 2
|
||
|
#define UFS_HC_UCMD_ARG3_OFFSET 0x009c // UIC Command Argument 3
|
||
|
//
|
||
|
// UMA Register Offsets
|
||
|
//
|
||
|
#define UFS_HC_UMA_OFFSET 0x00b0 // Reserved for Unified Memory Extension
|
||
|
|
||
|
#define UFS_HC_HCE_EN BIT0
|
||
|
#define UFS_HC_HCS_DP BIT0
|
||
|
#define UFS_HC_HCS_UCRDY BIT3
|
||
|
#define UFS_HC_IS_ULSS BIT8
|
||
|
#define UFS_HC_IS_UCCS BIT10
|
||
|
#define UFS_HC_CAP_64ADDR BIT24
|
||
|
#define UFS_HC_CAP_NUTMRS (BIT16 | BIT17 | BIT18)
|
||
|
#define UFS_HC_CAP_NUTRS (BIT0 | BIT1 | BIT2 | BIT3 | BIT4)
|
||
|
#define UFS_HC_UTMRLRSR BIT0
|
||
|
#define UFS_HC_UTRLRSR BIT0
|
||
|
|
||
|
//
|
||
|
// The initial value of the OCS field of UTP TRD or TMRD descriptor
|
||
|
// defined in JEDEC JESD223 specification
|
||
|
//
|
||
|
#define UFS_HC_TRD_OCS_INIT_VALUE 0x0F
|
||
|
|
||
|
//
|
||
|
// A maximum of length of 256KB is supported by PRDT entry
|
||
|
//
|
||
|
#define UFS_MAX_DATA_LEN_PER_PRD 0x40000
|
||
|
|
||
|
#define UFS_STORAGE_COMMAND_TYPE 0x01
|
||
|
|
||
|
#define UFS_REGULAR_COMMAND 0x00
|
||
|
#define UFS_INTERRUPT_COMMAND 0x01
|
||
|
|
||
|
#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)
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.2.1 Offset 00h: CAP - Controller Capabilities
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Nutrs:4; // Number of UTP Transfer Request Slots
|
||
|
UINT8 Rsvd1:4;
|
||
|
|
||
|
UINT8 NoRtt; // Number of outstanding READY TO TRANSFER (RTT) requests supported
|
||
|
|
||
|
UINT8 Nutmrs:3; // Number of UTP Task Management Request Slots
|
||
|
UINT8 Rsvd2:4;
|
||
|
UINT8 AutoHs:1; // Auto-Hibernation Support
|
||
|
|
||
|
UINT8 As64:1; // 64-bit addressing supported
|
||
|
UINT8 Oodds:1; // Out of order data delivery supported
|
||
|
UINT8 UicDmetms:1; // UIC DME_TEST_MODE command supported
|
||
|
UINT8 Ume:1; // Reserved for Unified Memory Extension
|
||
|
UINT8 Rsvd4:4;
|
||
|
} UFS_HC_CAP;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.2.2 Offset 08h: VER - UFS Version
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Vs:4; // Version Suffix
|
||
|
UINT8 Mnr:4; // Minor version number
|
||
|
|
||
|
UINT8 Mjr; // Major version number
|
||
|
|
||
|
UINT16 Rsvd1;
|
||
|
} UFS_HC_VER;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.2.3 Offset 10h: HCPID - Host Controller Product ID
|
||
|
//
|
||
|
#define UFS_HC_PID UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.2.4 Offset 14h: HCMID - Host Controller Manufacturer ID
|
||
|
//
|
||
|
#define UFS_HC_MID UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.2.5 Offset 18h: AHIT - Auto-Hibernate Idle Timer
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Ahitv:10; // Auto-Hibernate Idle Timer Value
|
||
|
UINT32 Ts:3; // Timer scale
|
||
|
UINT32 Rsvd1:19;
|
||
|
} UFS_HC_AHIT;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.1 Offset 20h: IS - Interrupt Status
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT16 Utrcs:1; // UTP Transfer Request Completion Status
|
||
|
UINT16 Udepri:1; // UIC DME_ENDPOINT_RESET Indication
|
||
|
UINT16 Ue:1; // UIC Error
|
||
|
UINT16 Utms:1; // UIC Test Mode Status
|
||
|
|
||
|
UINT16 Upms:1; // UIC Power Mode Status
|
||
|
UINT16 Uhxs:1; // UIC Hibernate Exit Status
|
||
|
UINT16 Uhes:1; // UIC Hibernate Enter Status
|
||
|
UINT16 Ulls:1; // UIC Link Lost Status
|
||
|
|
||
|
UINT16 Ulss:1; // UIC Link Startup Status
|
||
|
UINT16 Utmrcs:1; // UTP Task Management Request Completion Status
|
||
|
UINT16 Uccs:1; // UIC Command Completion Status
|
||
|
UINT16 Dfes:1; // Device Fatal Error Status
|
||
|
|
||
|
UINT16 Utpes:1; // UTP Error Status
|
||
|
UINT16 Rsvd1:3;
|
||
|
|
||
|
UINT16 Hcfes:1; // Host Controller Fatal Error Status
|
||
|
UINT16 Sbfes:1; // System Bus Fatal Error Status
|
||
|
UINT16 Rsvd2:14;
|
||
|
} UFS_HC_IS;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.2 Offset 24h: IE - Interrupt Enable
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT16 Utrce:1; // UTP Transfer Request Completion Enable
|
||
|
UINT16 Udeprie:1; // UIC DME_ENDPOINT_RESET Enable
|
||
|
UINT16 Uee:1; // UIC Error Enable
|
||
|
UINT16 Utmse:1; // UIC Test Mode Status Enable
|
||
|
|
||
|
UINT16 Upmse:1; // UIC Power Mode Status Enable
|
||
|
UINT16 Uhxse:1; // UIC Hibernate Exit Status Enable
|
||
|
UINT16 Uhese:1; // UIC Hibernate Enter Status Enable
|
||
|
UINT16 Ullse:1; // UIC Link Lost Status Enable
|
||
|
|
||
|
UINT16 Ulsse:1; // UIC Link Startup Status Enable
|
||
|
UINT16 Utmrce:1; // UTP Task Management Request Completion Enable
|
||
|
UINT16 Ucce:1; // UIC Command Completion Enable
|
||
|
UINT16 Dfee:1; // Device Fatal Error Enable
|
||
|
|
||
|
UINT16 Utpee:1; // UTP Error Enable
|
||
|
UINT16 Rsvd1:3;
|
||
|
|
||
|
UINT16 Hcfee:1; // Host Controller Fatal Error Enable
|
||
|
UINT16 Sbfee:1; // System Bus Fatal Error Enable
|
||
|
UINT16 Rsvd2:14;
|
||
|
} UFS_HC_IE;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.3 Offset 30h: HCS - Host Controller Status
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Dp:1; // Device Present
|
||
|
UINT8 UtrlRdy:1; // UTP Transfer Request List Ready
|
||
|
UINT8 UtmrlRdy:1; // UTP Task Management Request List Ready
|
||
|
UINT8 UcRdy:1; // UIC COMMAND Ready
|
||
|
UINT8 Rsvd1:4;
|
||
|
|
||
|
UINT8 Upmcrs:3; // UIC Power Mode Change Request Status
|
||
|
UINT8 Rsvd2:1; // UIC Hibernate Exit Status Enable
|
||
|
UINT8 Utpec:4; // UTP Error Code
|
||
|
|
||
|
UINT8 TtagUtpE; // Task Tag of UTP error
|
||
|
UINT8 TlunUtpE; // Target LUN of UTP error
|
||
|
} UFS_HC_STATUS;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.4 Offset 34h: HCE - Host Controller Enable
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Hce:1; // Host Controller Enable
|
||
|
UINT32 Rsvd1:31;
|
||
|
} UFS_HC_ENABLE;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.5 Offset 38h: UECPA - Host UIC Error Code PHY Adapter Layer
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Ec:5; // UIC PHY Adapter Layer Error Code
|
||
|
UINT32 Rsvd1:26;
|
||
|
UINT32 Err:1; // UIC PHY Adapter Layer Error
|
||
|
} UFS_HC_UECPA;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.6 Offset 3ch: UECDL - Host UIC Error Code Data Link Layer
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Ec:15; // UIC Data Link Layer Error Code
|
||
|
UINT32 Rsvd1:16;
|
||
|
UINT32 Err:1; // UIC Data Link Layer Error
|
||
|
} UFS_HC_UECDL;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.7 Offset 40h: UECN - Host UIC Error Code Network Layer
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Ec:3; // UIC Network Layer Error Code
|
||
|
UINT32 Rsvd1:28;
|
||
|
UINT32 Err:1; // UIC Network Layer Error
|
||
|
} UFS_HC_UECN;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.8 Offset 44h: UECT - Host UIC Error Code Transport Layer
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Ec:7; // UIC Transport Layer Error Code
|
||
|
UINT32 Rsvd1:24;
|
||
|
UINT32 Err:1; // UIC Transport Layer Error
|
||
|
} UFS_HC_UECT;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.9 Offset 48h: UECDME - Host UIC Error Code
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Ec:1; // UIC DME Error Code
|
||
|
UINT32 Rsvd1:30;
|
||
|
UINT32 Err:1; // UIC DME Error
|
||
|
} UFS_HC_UECDME;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.3.10 Offset 4Ch: UTRIACR - UTP Transfer Request Interrupt Aggregation Control Register
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 IaToVal; // Interrupt aggregation timeout value
|
||
|
|
||
|
UINT8 IacTh:5; // Interrupt aggregation counter threshold
|
||
|
UINT8 Rsvd1:3;
|
||
|
|
||
|
UINT8 Ctr:1; // Counter and Timer Reset
|
||
|
UINT8 Rsvd2:3;
|
||
|
UINT8 Iasb:1; // Interrupt aggregation status bit
|
||
|
UINT8 Rsvd3:3;
|
||
|
|
||
|
UINT8 IapwEn:1; // Interrupt aggregation parameter write enable
|
||
|
UINT8 Rsvd4:6;
|
||
|
UINT8 IaEn:1; // Interrupt Aggregation Enable/Disable
|
||
|
} UFS_HC_UTRIACR;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.4.1 Offset 50h: UTRLBA - UTP Transfer Request List Base Address
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Rsvd1:10;
|
||
|
UINT32 UtrlBa:22; // UTP Transfer Request List Base Address
|
||
|
} UFS_HC_UTRLBA;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.4.2 Offset 54h: UTRLBAU - UTP Transfer Request List Base Address Upper 32-bits
|
||
|
//
|
||
|
#define UFS_HC_UTRLBAU UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.4.3 Offset 58h: UTRLDBR - UTP Transfer Request List Door Bell Register
|
||
|
//
|
||
|
#define UFS_HC_UTRLDBR UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.4.4 Offset 5Ch: UTRLCLR - UTP Transfer Request List CLear Register
|
||
|
//
|
||
|
#define UFS_HC_UTRLCLR UINT32
|
||
|
|
||
|
#if 0
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.4.5 Offset 60h: UTRLRSR - UTP Transfer Request List Run Stop Register
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 UtrlRsr:1; // UTP Transfer Request List Run-Stop Register
|
||
|
UINT32 Rsvd1:31;
|
||
|
} UFS_HC_UTRLRSR;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.5.1 Offset 70h: UTMRLBA - UTP Task Management Request List Base Address
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 Rsvd1:10;
|
||
|
UINT32 UtmrlBa:22; // UTP Task Management Request List Base Address
|
||
|
} UFS_HC_UTMRLBA;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.5.2 Offset 74h: UTMRLBAU - UTP Task Management Request List Base Address Upper 32-bits
|
||
|
//
|
||
|
#define UFS_HC_UTMRLBAU UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.5.3 Offset 78h: UTMRLDBR - UTP Task Management Request List Door Bell Register
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 UtmrlDbr:8; // UTP Task Management Request List Door bell Register
|
||
|
UINT32 Rsvd1:24;
|
||
|
} UFS_HC_UTMRLDBR;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.5.4 Offset 7Ch: UTMRLCLR - UTP Task Management Request List CLear Register
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 UtmrlClr:8; // UTP Task Management List Clear Register
|
||
|
UINT32 Rsvd1:24;
|
||
|
} UFS_HC_UTMRLCLR;
|
||
|
|
||
|
#if 0
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.5.5 Offset 80h: UTMRLRSR - UTP Task Management Request List Run Stop Register
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 UtmrlRsr:1; // UTP Task Management Request List Run-Stop Register
|
||
|
UINT32 Rsvd1:31;
|
||
|
} UFS_HC_UTMRLRSR;
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.6.1 Offset 90h: UICCMD - UIC Command
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT32 CmdOp:8; // Command Opcode
|
||
|
UINT32 Rsvd1:24;
|
||
|
} UFS_HC_UICCMD;
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.6.2 Offset 94h: UICCMDARG1 - UIC Command Argument 1
|
||
|
//
|
||
|
#define UFS_HC_UICCMD_ARG1 UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.6.2 Offset 98h: UICCMDARG2 - UIC Command Argument 2
|
||
|
//
|
||
|
#define UFS_HC_UICCMD_ARG2 UINT32
|
||
|
|
||
|
//
|
||
|
// UFSHCI 2.0 Spec Section 5.6.2 Offset 9ch: UICCMDARG3 - UIC Command Argument 3
|
||
|
//
|
||
|
#define UFS_HC_UICCMD_ARG3 UINT32
|
||
|
|
||
|
//
|
||
|
// UIC command opcodes
|
||
|
//
|
||
|
typedef enum {
|
||
|
UfsUicDmeGet = 0x01,
|
||
|
UfsUicDmeSet = 0x02,
|
||
|
UfsUicDmePeerGet = 0x03,
|
||
|
UfsUicDmePeerSet = 0x04,
|
||
|
UfsUicDmePwrOn = 0x10,
|
||
|
UfsUicDmePwrOff = 0x11,
|
||
|
UfsUicDmeEnable = 0x12,
|
||
|
UfsUicDmeReset = 0x14,
|
||
|
UfsUicDmeEndpointReset = 0x15,
|
||
|
UfsUicDmeLinkStartup = 0x16,
|
||
|
UfsUicDmeHibernateEnter = 0x17,
|
||
|
UfsUicDmeHibernateExit = 0x18,
|
||
|
UfsUicDmeTestMode = 0x1A
|
||
|
} UFS_UIC_OPCODE;
|
||
|
|
||
|
//
|
||
|
// UTP Transfer Request Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
//
|
||
|
// DW0
|
||
|
//
|
||
|
UINT32 Rsvd1:24;
|
||
|
UINT32 Int:1; /* Interrupt */
|
||
|
UINT32 Dd:2; /* Data Direction */
|
||
|
UINT32 Rsvd2:1;
|
||
|
UINT32 Ct:4; /* Command Type */
|
||
|
|
||
|
//
|
||
|
// DW1
|
||
|
//
|
||
|
UINT32 Rsvd3;
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT32 Ocs:8; /* Overall Command Status */
|
||
|
UINT32 Rsvd4:24;
|
||
|
|
||
|
//
|
||
|
// DW3
|
||
|
//
|
||
|
UINT32 Rsvd5;
|
||
|
|
||
|
//
|
||
|
// DW4
|
||
|
//
|
||
|
UINT32 Rsvd6:7;
|
||
|
UINT32 UcdBa:25; /* UTP Command Descriptor Base Address */
|
||
|
|
||
|
//
|
||
|
// DW5
|
||
|
//
|
||
|
UINT32 UcdBaU; /* UTP Command Descriptor Base Address Upper 32-bits */
|
||
|
|
||
|
//
|
||
|
// DW6
|
||
|
//
|
||
|
UINT16 RuL; /* Response UPIU Length */
|
||
|
UINT16 RuO; /* Response UPIU Offset */
|
||
|
|
||
|
//
|
||
|
// DW7
|
||
|
//
|
||
|
UINT16 PrdtL; /* PRDT Length */
|
||
|
UINT16 PrdtO; /* PRDT Offset */
|
||
|
} UTP_TRD;
|
||
|
|
||
|
typedef struct {
|
||
|
//
|
||
|
// DW0
|
||
|
//
|
||
|
UINT32 Rsvd1:2;
|
||
|
UINT32 DbAddr:30; /* Data Base Address */
|
||
|
|
||
|
//
|
||
|
// DW1
|
||
|
//
|
||
|
UINT32 DbAddrU; /* Data Base Address Upper 32-bits */
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT32 Rsvd2;
|
||
|
|
||
|
//
|
||
|
// DW3
|
||
|
//
|
||
|
UINT32 DbCount:18; /* Data Byte Count */
|
||
|
UINT32 Rsvd3:14;
|
||
|
} UTP_TR_PRD;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.3 - 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 Rsvd1:4;
|
||
|
UINT8 Rsvd2;
|
||
|
UINT8 Rsvd3;
|
||
|
UINT8 Rsvd4;
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT8 EhsLen; /* Total EHS Length - 0x00 */
|
||
|
UINT8 Rsvd5;
|
||
|
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 2.0 Spec Section 10.5.4 - 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 Rsvd1:4;
|
||
|
UINT8 Rsvd2;
|
||
|
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 Rsvd3[16];
|
||
|
|
||
|
//
|
||
|
// Data Segment - Sense Data
|
||
|
//
|
||
|
UINT16 SenseDataLen; /* Sense Data Length - Big Endian */
|
||
|
UINT8 SenseData[18]; /* Sense Data */
|
||
|
} UTP_RESPONSE_UPIU;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.5 - 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];
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT8 EhsLen; /* Total EHS Length - 0x00 */
|
||
|
UINT8 Rsvd2;
|
||
|
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 Rsvd3[12];
|
||
|
|
||
|
//
|
||
|
// Data Segment - Data to be sent out
|
||
|
//
|
||
|
//UINT8 Data[]; /* Data to be sent out, maximum is 65535 bytes */
|
||
|
} UTP_DATA_OUT_UPIU;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.6 - 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];
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT8 EhsLen; /* Total EHS Length - 0x00 */
|
||
|
UINT8 Rsvd2;
|
||
|
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 Rsvd3[12];
|
||
|
|
||
|
//
|
||
|
// Data Segment - Data to be read
|
||
|
//
|
||
|
//UINT8 Data[]; /* Data to be read, maximum is 65535 bytes */
|
||
|
} UTP_DATA_IN_UPIU;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.7 - 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];
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT8 EhsLen; /* Total EHS Length - 0x00 */
|
||
|
UINT8 Rsvd2;
|
||
|
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 - DW7
|
||
|
//
|
||
|
UINT8 Rsvd3[12];
|
||
|
|
||
|
//
|
||
|
// Data Segment - Data to be read
|
||
|
//
|
||
|
//UINT8 Data[]; /* Data to be read, maximum is 65535 bytes */
|
||
|
} UTP_RDY_TO_TRAN_UPIU;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.8 - 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;
|
||
|
UINT8 TskManFunc; /* Task Management Function */
|
||
|
UINT8 Rsvd2[2];
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT8 EhsLen; /* Total EHS Length - 0x00 */
|
||
|
UINT8 Rsvd3;
|
||
|
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 Rsvd4[8];
|
||
|
} UTP_TM_REQ_UPIU;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.9 - 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[2];
|
||
|
UINT8 Resp; /* Response */
|
||
|
UINT8 Rsvd2;
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT8 EhsLen; /* Total EHS Length - 0x00 */
|
||
|
UINT8 Rsvd3;
|
||
|
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 Rsvd4[12];
|
||
|
} UTP_TM_RESP_UPIU;
|
||
|
|
||
|
//
|
||
|
// UTP Task Management Request Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
//
|
||
|
// DW0
|
||
|
//
|
||
|
UINT32 Rsvd1:24;
|
||
|
UINT32 Int:1; /* Interrupt */
|
||
|
UINT32 Rsvd2:7;
|
||
|
|
||
|
//
|
||
|
// DW1
|
||
|
//
|
||
|
UINT32 Rsvd3;
|
||
|
|
||
|
//
|
||
|
// DW2
|
||
|
//
|
||
|
UINT32 Ocs:8; /* Overall Command Status */
|
||
|
UINT32 Rsvd4:24;
|
||
|
|
||
|
//
|
||
|
// DW3
|
||
|
//
|
||
|
UINT32 Rsvd5;
|
||
|
|
||
|
//
|
||
|
// DW4 - DW11
|
||
|
//
|
||
|
UTP_TM_REQ_UPIU TmReq; /* Task Management Request UPIU */
|
||
|
|
||
|
//
|
||
|
// DW12 - DW19
|
||
|
//
|
||
|
UTP_TM_RESP_UPIU TmResp; /* Task Management Response UPIU */
|
||
|
} UTP_TMRD;
|
||
|
|
||
|
|
||
|
typedef struct {
|
||
|
UINT8 Opcode;
|
||
|
UINT8 DescId;
|
||
|
UINT8 Index;
|
||
|
UINT8 Selector;
|
||
|
UINT16 Rsvd1;
|
||
|
UINT16 Length;
|
||
|
UINT32 Value;
|
||
|
UINT32 Rsvd2;
|
||
|
} UTP_UPIU_TSF;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.10 - 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
|
||
|
|
||
|
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 2.0 Spec Section 10.5.11 - 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;
|
||
|
|
||
|
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 2.0 Spec Section 10.5.12 - 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[2];
|
||
|
UINT8 Response; /* Response - 0x01 */
|
||
|
UINT8 Rsvd2;
|
||
|
|
||
|
//
|
||
|
// 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 Rsvd3;
|
||
|
UINT8 E2ESts; /* End-to-End Status */
|
||
|
UINT8 Rsvd4;
|
||
|
|
||
|
//
|
||
|
// DW4 - DW7
|
||
|
//
|
||
|
UINT8 Rsvd5[16];
|
||
|
} UTP_REJ_UPIU;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 10.5.13 - 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 2.0 Spec Section 10.5.14 - 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 Descriptors
|
||
|
//
|
||
|
typedef enum {
|
||
|
UfsDeviceDesc = 0x00,
|
||
|
UfsConfigDesc = 0x01,
|
||
|
UfsUnitDesc = 0x02,
|
||
|
UfsInterConnDesc = 0x04,
|
||
|
UfsStringDesc = 0x05,
|
||
|
UfsGeometryDesc = 0x07,
|
||
|
UfsPowerDesc = 0x08
|
||
|
} UFS_DESC_IDN;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.2 - 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 Rsvd1[17];
|
||
|
UINT8 Rsvd2[16];
|
||
|
} UFS_DEV_DESC;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT8 Length;
|
||
|
UINT8 DescType;
|
||
|
UINT8 Rsvd1;
|
||
|
UINT8 BootEn;
|
||
|
UINT8 DescAccessEn;
|
||
|
UINT8 InitPowerMode;
|
||
|
UINT8 HighPriorityLun;
|
||
|
UINT8 SecureRemovalType;
|
||
|
UINT8 InitActiveIccLevel;
|
||
|
UINT16 PeriodicRtcUpdate;
|
||
|
UINT8 Rsvd2[5];
|
||
|
} UFS_CONFIG_DESC_GEN_HEADER;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT8 LunEn;
|
||
|
UINT8 BootLunId;
|
||
|
UINT8 LunWriteProt;
|
||
|
UINT8 MemType;
|
||
|
UINT32 NumAllocUnits;
|
||
|
UINT8 DataReliability;
|
||
|
UINT8 LogicBlkSize;
|
||
|
UINT8 ProvisionType;
|
||
|
UINT16 CtxCap;
|
||
|
UINT8 Rsvd1[3];
|
||
|
} UFS_UNIT_DESC_CONFIG_PARAMS;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.3 - Configuration Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
UFS_CONFIG_DESC_GEN_HEADER Header;
|
||
|
UFS_UNIT_DESC_CONFIG_PARAMS UnitDescConfParams[8];
|
||
|
} UFS_CONFIG_DESC;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.4 - Geometry Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Length;
|
||
|
UINT8 DescType;
|
||
|
UINT8 MediaTech;
|
||
|
UINT8 Rsvd1;
|
||
|
UINT64 TotalRawDevCapacity;
|
||
|
UINT8 Rsvd2;
|
||
|
UINT32 SegSize;
|
||
|
UINT8 AllocUnitSize;
|
||
|
UINT8 MinAddrBlkSize;
|
||
|
UINT8 OptReadBlkSize;
|
||
|
UINT8 OptWriteBlkSize;
|
||
|
UINT8 MaxInBufSize;
|
||
|
UINT8 MaxOutBufSize;
|
||
|
UINT8 RpmbRwSize;
|
||
|
UINT8 Rsvd3;
|
||
|
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;
|
||
|
} UFS_GEOMETRY_DESC;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.5 - Unit Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Length;
|
||
|
UINT8 DescType;
|
||
|
UINT8 UnitIdx;
|
||
|
UINT8 LunEn;
|
||
|
UINT8 BootLunId;
|
||
|
UINT8 LunWriteProt;
|
||
|
UINT8 LunQueueDep;
|
||
|
UINT8 Rsvd1;
|
||
|
UINT8 MemType;
|
||
|
UINT8 DataReliability;
|
||
|
UINT8 LogicBlkSize;
|
||
|
UINT64 LogicBlkCount;
|
||
|
UINT32 EraseBlkSize;
|
||
|
UINT8 ProvisionType;
|
||
|
UINT64 PhyMemResCount;
|
||
|
UINT16 CtxCap;
|
||
|
UINT8 LargeUnitGranularity;
|
||
|
} UFS_UNIT_DESC;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.6 - RPMB Unit Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Length;
|
||
|
UINT8 DescType;
|
||
|
UINT8 UnitIdx;
|
||
|
UINT8 LunEn;
|
||
|
UINT8 BootLunId;
|
||
|
UINT8 LunWriteProt;
|
||
|
UINT8 LunQueueDep;
|
||
|
UINT8 Rsvd1;
|
||
|
UINT8 MemType;
|
||
|
UINT8 Rsvd2;
|
||
|
UINT8 LogicBlkSize;
|
||
|
UINT64 LogicBlkCount;
|
||
|
UINT32 EraseBlkSize;
|
||
|
UINT8 ProvisionType;
|
||
|
UINT64 PhyMemResCount;
|
||
|
UINT8 Rsvd3[3];
|
||
|
} UFS_RPMB_UNIT_DESC;
|
||
|
|
||
|
typedef struct {
|
||
|
UINT16 Value:10;
|
||
|
UINT16 Rsvd1:4;
|
||
|
UINT16 Unit:2;
|
||
|
} UFS_POWER_PARAM_ELEMENT;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.7 - Power Parameter 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 2.0 Spec Section 14.1.6.8 - InterConnect Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Length;
|
||
|
UINT8 DescType;
|
||
|
UINT16 UniProVer;
|
||
|
UINT16 MphyVer;
|
||
|
} UFS_INTER_CONNECT_DESC;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.1.6.9 - 14.1.6.12 - String Descriptor
|
||
|
//
|
||
|
typedef struct {
|
||
|
UINT8 Length;
|
||
|
UINT8 DescType;
|
||
|
CHAR16 Unicode[126];
|
||
|
} UFS_STRING_DESC;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.2 - Flags
|
||
|
//
|
||
|
typedef enum {
|
||
|
UfsFlagDevInit = 0x01,
|
||
|
UfsFlagPermWpEn = 0x02,
|
||
|
UfsFlagPowerOnWpEn = 0x03,
|
||
|
UfsFlagBgOpsEn = 0x04,
|
||
|
UfsFlagPurgeEn = 0x06,
|
||
|
UfsFlagPhyResRemoval = 0x08,
|
||
|
UfsFlagBusyRtc = 0x09,
|
||
|
UfsFlagPermDisFwUpdate = 0x0B
|
||
|
} UFS_FLAGS_IDN;
|
||
|
|
||
|
//
|
||
|
// UFS 2.0 Spec Section 14.2 - 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,
|
||
|
UfsAttrCorrPrgBlkNum = 0x11
|
||
|
} UFS_ATTR_IDN;
|
||
|
|
||
|
typedef enum {
|
||
|
UfsNoData = 0,
|
||
|
UfsDataOut = 1,
|
||
|
UfsDataIn = 2,
|
||
|
UfsDdReserved
|
||
|
} UFS_DATA_DIRECTION;
|
||
|
|
||
|
|
||
|
#pragma pack()
|
||
|
|
||
|
#endif
|
||
|
|