]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.h
MdeModulePkg: Add UFS (Universal Flash Storage) Stack
[mirror_edk2.git] / MdeModulePkg / Bus / Ufs / UfsPassThruDxe / UfsPassThruHci.h
diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.h b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.h
new file mode 100644 (file)
index 0000000..a423a92
--- /dev/null
@@ -0,0 +1,1339 @@
+/** @file\r
+  UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface\r
+  for upper layer application to execute UFS-supported SCSI cmds.\r
+\r
+  Copyright (c) 2014, 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
+\r
+**/\r
+\r
+#ifndef _UFS_PASS_THRU_HCI_H_\r
+#define _UFS_PASS_THRU_HCI_H_\r
+\r
+//\r
+// Host Capabilities Register Offsets\r
+//\r
+#define UFS_HC_CAP_OFFSET          0x0000  // Controller Capabilities\r
+#define UFS_HC_VER_OFFSET          0x0008  // Version\r
+#define UFS_HC_DDID_OFFSET         0x0010  // Device ID and Device Class\r
+#define UFS_HC_PMID_OFFSET         0x0014  // Product ID and Manufacturer ID\r
+#define UFS_HC_AHIT_OFFSET         0x0018  // Auto-Hibernate Idle Timer\r
+//\r
+// Operation and Runtime Register Offsets\r
+//\r
+#define UFS_HC_IS_OFFSET           0x0020  // Interrupt Status\r
+#define UFS_HC_IE_OFFSET           0x0024  // Interrupt Enable\r
+#define UFS_HC_STATUS_OFFSET       0x0030  // Host Controller Status\r
+#define UFS_HC_ENABLE_OFFSET       0x0034  // Host Controller Enable\r
+#define UFS_HC_UECPA_OFFSET        0x0038  // Host UIC Error Code PHY Adapter Layer\r
+#define UFS_HC_UECDL_OFFSET        0x003c  // Host UIC Error Code Data Link Layer\r
+#define UFS_HC_UECN_OFFSET         0x0040  // Host UIC Error Code Network Layer\r
+#define UFS_HC_UECT_OFFSET         0x0044  // Host UIC Error Code Transport Layer\r
+#define UFS_HC_UECDME_OFFSET       0x0048  // Host UIC Error Code DME\r
+#define UFS_HC_UTRIACR_OFFSET      0x004c  // UTP Transfer Request Interrupt Aggregation Control Register\r
+//\r
+// UTP Transfer Register Offsets\r
+//\r
+#define UFS_HC_UTRLBA_OFFSET       0x0050  // UTP Transfer Request List Base Address\r
+#define UFS_HC_UTRLBAU_OFFSET      0x0054  // UTP Transfer Request List Base Address Upper 32-Bits\r
+#define UFS_HC_UTRLDBR_OFFSET      0x0058  // UTP Transfer Request List Door Bell Register\r
+#define UFS_HC_UTRLCLR_OFFSET      0x005c  // UTP Transfer Request List CLear Register\r
+#define UFS_HC_UTRLRSR_OFFSET      0x0060  // UTP Transfer Request Run-Stop Register\r
+//\r
+// UTP Task Management Register Offsets\r
+//\r
+#define UFS_HC_UTMRLBA_OFFSET      0x0070  // UTP Task Management Request List Base Address\r
+#define UFS_HC_UTMRLBAU_OFFSET     0x0074  // UTP Task Management Request List Base Address Upper 32-Bits\r
+#define UFS_HC_UTMRLDBR_OFFSET     0x0078  // UTP Task Management Request List Door Bell Register\r
+#define UFS_HC_UTMRLCLR_OFFSET     0x007c  // UTP Task Management Request List CLear Register\r
+#define UFS_HC_UTMRLRSR_OFFSET     0x0080  // UTP Task Management Run-Stop Register\r
+//\r
+// UIC Command Register Offsets\r
+//\r
+#define UFS_HC_UIC_CMD_OFFSET      0x0090  // UIC Command Register\r
+#define UFS_HC_UCMD_ARG1_OFFSET    0x0094  // UIC Command Argument 1\r
+#define UFS_HC_UCMD_ARG2_OFFSET    0x0098  // UIC Command Argument 2\r
+#define UFS_HC_UCMD_ARG3_OFFSET    0x009c  // UIC Command Argument 3\r
+//\r
+// UMA Register Offsets\r
+//\r
+#define UFS_HC_UMA_OFFSET          0x00b0  // Reserved for Unified Memory Extension\r
+\r
+#define UFS_HC_HCE_EN              BIT0\r
+#define UFS_HC_HCS_DP              BIT0\r
+#define UFS_HC_HCS_UCRDY           BIT3\r
+#define UFS_HC_IS_ULSS             BIT8\r
+#define UFS_HC_IS_UCCS             BIT10\r
+#define UFS_HC_CAP_64ADDR          BIT24\r
+#define UFS_HC_CAP_NUTMRS          (BIT16 | BIT17 | BIT18)\r
+#define UFS_HC_CAP_NUTRS           (BIT0 | BIT1 | BIT2 | BIT3 | BIT4)\r
+#define UFS_HC_UTMRLRSR            BIT0\r
+#define UFS_HC_UTRLRSR             BIT0\r
+\r
+//\r
+// A maximum of length of 256KB is supported by PRDT entry\r
+//\r
+#define UFS_MAX_DATA_LEN_PER_PRD   0x40000\r
+\r
+#define UFS_STORAGE_COMMAND_TYPE   0x01\r
+\r
+#define UFS_REGULAR_COMMAND        0x00\r
+#define UFS_INTERRUPT_COMMAND      0x01\r
+\r
+#define UFS_LUN_0                  0x00\r
+#define UFS_LUN_1                  0x01\r
+#define UFS_LUN_2                  0x02\r
+#define UFS_LUN_3                  0x03\r
+#define UFS_LUN_4                  0x04\r
+#define UFS_LUN_5                  0x05\r
+#define UFS_LUN_6                  0x06\r
+#define UFS_LUN_7                  0x07\r
+#define UFS_WLUN_REPORT_LUNS       0x81\r
+#define UFS_WLUN_UFS_DEV           0xD0\r
+#define UFS_WLUN_BOOT              0xB0\r
+#define UFS_WLUN_RPMB              0xC4\r
+\r
+#pragma pack(1)\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.2.1 Offset 00h: CAP - Controller Capabilities\r
+//\r
+typedef struct {\r
+  UINT8  Nutrs:4;      // Number of UTP Transfer Request Slots\r
+  UINT8  Rsvd1:4;\r
+\r
+  UINT8  NoRtt;        // Number of outstanding READY TO TRANSFER (RTT) requests supported\r
+\r
+  UINT8  Nutmrs:3;     // Number of UTP Task Management Request Slots\r
+  UINT8  Rsvd2:4;\r
+  UINT8  AutoHs:1;     // Auto-Hibernation Support\r
+\r
+  UINT8  As64:1;       // 64-bit addressing supported\r
+  UINT8  Oodds:1;      // Out of order data delivery supported\r
+  UINT8  UicDmetms:1;  // UIC DME_TEST_MODE command supported\r
+  UINT8  Ume:1;        // Reserved for Unified Memory Extension\r
+  UINT8  Rsvd4:4;\r
+} UFS_HC_CAP;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.2.2 Offset 08h: VER - UFS Version\r
+//\r
+typedef struct {\r
+  UINT8  Vs:4;         // Version Suffix\r
+  UINT8  Mnr:4;        // Minor version number\r
+\r
+  UINT8  Mjr;          // Major version number\r
+\r
+  UINT16 Rsvd1;\r
+} UFS_HC_VER;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.2.3 Offset 10h: HCPID - Host Controller Product ID\r
+//\r
+#define UFS_HC_PID     UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.2.4 Offset 14h: HCMID - Host Controller Manufacturer ID\r
+//\r
+#define UFS_HC_MID     UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.2.5 Offset 18h: AHIT - Auto-Hibernate Idle Timer\r
+//\r
+typedef struct {\r
+  UINT32 Ahitv:10;     // Auto-Hibernate Idle Timer Value \r
+  UINT32 Ts:3;         // Timer scale\r
+  UINT32 Rsvd1:19;\r
+} UFS_HC_AHIT;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.1 Offset 20h: IS - Interrupt Status\r
+//\r
+typedef struct {\r
+  UINT16 Utrcs:1;      // UTP Transfer Request Completion Status\r
+  UINT16 Udepri:1;     // UIC DME_ENDPOINT_RESET Indication\r
+  UINT16 Ue:1;         // UIC Error\r
+  UINT16 Utms:1;       // UIC Test Mode Status \r
+\r
+  UINT16 Upms:1;       // UIC Power Mode Status \r
+  UINT16 Uhxs:1;       // UIC Hibernate Exit Status \r
+  UINT16 Uhes:1;       // UIC Hibernate Enter Status \r
+  UINT16 Ulls:1;       // UIC Link Lost Status \r
+\r
+  UINT16 Ulss:1;       // UIC Link Startup Status \r
+  UINT16 Utmrcs:1;     // UTP Task  Management Request Completion Status \r
+  UINT16 Uccs:1;       // UIC Command Completion Status \r
+  UINT16 Dfes:1;       // Device Fatal Error Status  \r
+\r
+  UINT16 Utpes:1;      // UTP Error Status  \r
+  UINT16 Rsvd1:3;\r
+\r
+  UINT16 Hcfes:1;      // Host Controller Fatal Error Status\r
+  UINT16 Sbfes:1;      // System Bus Fatal Error Status\r
+  UINT16 Rsvd2:14;\r
+} UFS_HC_IS;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.2 Offset 24h: IE - Interrupt Enable\r
+//\r
+typedef struct {\r
+  UINT16 Utrce:1;      // UTP Transfer Request Completion Enable\r
+  UINT16 Udeprie:1;    // UIC DME_ENDPOINT_RESET Enable\r
+  UINT16 Uee:1;        // UIC Error Enable\r
+  UINT16 Utmse:1;      // UIC Test Mode Status Enable\r
+\r
+  UINT16 Upmse:1;      // UIC Power Mode Status Enable \r
+  UINT16 Uhxse:1;      // UIC Hibernate Exit Status Enable\r
+  UINT16 Uhese:1;      // UIC Hibernate Enter Status Enable \r
+  UINT16 Ullse:1;      // UIC Link Lost Status Enable\r
+\r
+  UINT16 Ulsse:1;      // UIC Link Startup Status Enable\r
+  UINT16 Utmrce:1;     // UTP Task  Management Request Completion Enable\r
+  UINT16 Ucce:1;       // UIC Command Completion Enable\r
+  UINT16 Dfee:1;       // Device Fatal Error Enable\r
+\r
+  UINT16 Utpee:1;      // UTP Error Enable\r
+  UINT16 Rsvd1:3;\r
+\r
+  UINT16 Hcfee:1;      // Host Controller Fatal Error Enable\r
+  UINT16 Sbfee:1;      // System Bus Fatal Error Enable\r
+  UINT16 Rsvd2:14;\r
+} UFS_HC_IE;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.3 Offset 30h: HCS - Host Controller Status\r
+//\r
+typedef struct {\r
+  UINT8  Dp:1;         // Device Present\r
+  UINT8  UtrlRdy:1;    // UTP Transfer Request List Ready\r
+  UINT8  UtmrlRdy:1;   // UTP Task Management Request List Ready\r
+  UINT8  UcRdy:1;      // UIC COMMAND Ready\r
+  UINT8  Rsvd1:4;\r
+\r
+  UINT8  Upmcrs:3;     // UIC Power Mode Change Request Status\r
+  UINT8  Rsvd2:1;      // UIC Hibernate Exit Status Enable\r
+  UINT8  Utpec:4;      // UTP Error Code\r
+\r
+  UINT8  TtagUtpE;     // Task Tag of UTP error\r
+  UINT8  TlunUtpE;     // Target LUN of UTP error\r
+} UFS_HC_STATUS;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.4 Offset 34h: HCE - Host Controller Enable\r
+//\r
+typedef struct {\r
+  UINT32 Hce:1;        // Host Controller Enable\r
+  UINT32 Rsvd1:31;\r
+} UFS_HC_ENABLE;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.5 Offset 38h: UECPA - Host UIC Error Code PHY Adapter Layer\r
+//\r
+typedef struct {\r
+  UINT32 Ec:5;         // UIC PHY Adapter Layer Error Code\r
+  UINT32 Rsvd1:26;\r
+  UINT32 Err:1;        // UIC PHY Adapter Layer Error\r
+} UFS_HC_UECPA;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.6 Offset 3ch: UECDL - Host UIC Error Code Data Link Layer\r
+//\r
+typedef struct {\r
+  UINT32 Ec:15;        // UIC Data Link Layer Error Code\r
+  UINT32 Rsvd1:16;\r
+  UINT32 Err:1;        // UIC Data Link Layer Error\r
+} UFS_HC_UECDL;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.7 Offset 40h: UECN - Host UIC Error Code Network Layer\r
+//\r
+typedef struct {\r
+  UINT32 Ec:3;         // UIC Network Layer Error Code\r
+  UINT32 Rsvd1:28;\r
+  UINT32 Err:1;        // UIC Network Layer Error\r
+} UFS_HC_UECN;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.8 Offset 44h: UECT - Host UIC Error Code Transport Layer\r
+//\r
+typedef struct {\r
+  UINT32 Ec:7;         // UIC Transport Layer Error Code\r
+  UINT32 Rsvd1:24;\r
+  UINT32 Err:1;        // UIC Transport Layer Error\r
+} UFS_HC_UECT;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.9 Offset 48h: UECDME - Host UIC Error Code\r
+//\r
+typedef struct {\r
+  UINT32 Ec:1;         // UIC DME Error Code\r
+  UINT32 Rsvd1:30;\r
+  UINT32 Err:1;        // UIC DME Error\r
+} UFS_HC_UECDME;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.3.10 Offset 4Ch: UTRIACR - UTP Transfer Request Interrupt Aggregation Control Register\r
+//\r
+typedef struct {\r
+  UINT8  IaToVal;      // Interrupt aggregation timeout value\r
+\r
+  UINT8  IacTh:5;      // Interrupt aggregation counter threshold\r
+  UINT8  Rsvd1:3;\r
+\r
+  UINT8  Ctr:1;        // Counter and Timer Reset\r
+  UINT8  Rsvd2:3;\r
+  UINT8  Iasb:1;       // Interrupt aggregation status bit\r
+  UINT8  Rsvd3:3;\r
+\r
+  UINT8  IapwEn:1;     // Interrupt aggregation parameter write enable\r
+  UINT8  Rsvd4:6;\r
+  UINT8  IaEn:1;       // Interrupt Aggregation Enable/Disable\r
+} UFS_HC_UTRIACR;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.4.1 Offset 50h: UTRLBA - UTP Transfer Request List Base Address\r
+//\r
+typedef struct {\r
+  UINT32 Rsvd1:10;\r
+  UINT32 UtrlBa:22;    // UTP Transfer Request List Base Address\r
+} UFS_HC_UTRLBA;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.4.2 Offset 54h: UTRLBAU - UTP Transfer Request List Base Address Upper 32-bits\r
+//\r
+#define UFS_HC_UTRLBAU UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.4.3 Offset 58h: UTRLDBR - UTP Transfer Request List Door Bell Register\r
+//\r
+#define UFS_HC_UTRLDBR UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.4.4 Offset 5Ch: UTRLCLR - UTP Transfer Request List CLear Register\r
+//\r
+#define UFS_HC_UTRLCLR UINT32\r
+\r
+#if 0\r
+//\r
+// UFSHCI 2.0 Spec Section 5.4.5 Offset 60h: UTRLRSR - UTP Transfer Request List Run Stop Register\r
+//\r
+typedef struct {\r
+  UINT32 UtrlRsr:1;    // UTP Transfer Request List Run-Stop Register\r
+  UINT32 Rsvd1:31;\r
+} UFS_HC_UTRLRSR;\r
+#endif\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.5.1 Offset 70h: UTMRLBA - UTP Task Management Request List Base Address\r
+//\r
+typedef struct {\r
+  UINT32 Rsvd1:10;\r
+  UINT32 UtmrlBa:22;   // UTP Task Management Request List Base Address\r
+} UFS_HC_UTMRLBA;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.5.2 Offset 74h: UTMRLBAU - UTP Task Management Request List Base Address Upper 32-bits\r
+//\r
+#define UFS_HC_UTMRLBAU UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.5.3 Offset 78h: UTMRLDBR - UTP Task Management Request List Door Bell Register\r
+//\r
+typedef struct {\r
+  UINT32 UtmrlDbr:8;   // UTP Task Management Request List Door bell Register\r
+  UINT32 Rsvd1:24;\r
+} UFS_HC_UTMRLDBR;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.5.4 Offset 7Ch: UTMRLCLR - UTP Task Management Request List CLear Register\r
+//\r
+typedef struct {\r
+  UINT32 UtmrlClr:8;   // UTP Task Management List Clear Register\r
+  UINT32 Rsvd1:24;\r
+} UFS_HC_UTMRLCLR;\r
+\r
+#if 0\r
+//\r
+// UFSHCI 2.0 Spec Section 5.5.5 Offset 80h: UTMRLRSR - UTP Task Management Request List Run Stop Register\r
+//\r
+typedef struct {\r
+  UINT32 UtmrlRsr:1;   // UTP Task Management Request List Run-Stop Register\r
+  UINT32 Rsvd1:31;\r
+} UFS_HC_UTMRLRSR;\r
+#endif\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.6.1 Offset 90h: UICCMD - UIC Command\r
+//\r
+typedef struct {\r
+  UINT32 CmdOp:8;      // Command Opcode\r
+  UINT32 Rsvd1:24;\r
+} UFS_HC_UICCMD;\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.6.2 Offset 94h: UICCMDARG1 - UIC Command Argument 1\r
+//\r
+#define UFS_HC_UICCMD_ARG1 UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.6.2 Offset 98h: UICCMDARG2 - UIC Command Argument 2\r
+//\r
+#define UFS_HC_UICCMD_ARG2 UINT32\r
+\r
+//\r
+// UFSHCI 2.0 Spec Section 5.6.2 Offset 9ch: UICCMDARG3 - UIC Command Argument 3\r
+//\r
+#define UFS_HC_UICCMD_ARG3 UINT32\r
+\r
+//\r
+// UIC command opcodes\r
+//\r
+typedef enum {\r
+  UfsUicDmeGet            = 0x01,\r
+  UfsUicDmeSet            = 0x02,\r
+  UfsUicDmePeerGet        = 0x03,\r
+  UfsUicDmePeerSet        = 0x04,\r
+  UfsUicDmePwrOn          = 0x10,\r
+  UfsUicDmePwrOff         = 0x11,\r
+  UfsUicDmeEnable         = 0x12,\r
+  UfsUicDmeReset          = 0x14,\r
+  UfsUicDmeEndpointReset  = 0x15,\r
+  UfsUicDmeLinkStartup    = 0x16,\r
+  UfsUicDmeHibernateEnter = 0x17,\r
+  UfsUicDmeHibernateExit  = 0x18,\r
+  UfsUicDmeTestMode       = 0x1A\r
+} UFS_UIC_OPCODE;\r
+\r
+//\r
+// UTP Transfer Request Descriptor\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT32 Rsvd1:24;\r
+  UINT32 Int:1;               /* Interrupt */\r
+  UINT32 Dd:2;                /* Data Direction */\r
+  UINT32 Rsvd2:1;\r
+  UINT32 Ct:4;                /* Command Type */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT32 Rsvd3;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT32 Ocs:8;               /* Overall Command Status */\r
+  UINT32 Rsvd4:24;\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 Rsvd5;\r
+\r
+  //\r
+  // DW4\r
+  //\r
+  UINT32 Rsvd6:7;\r
+  UINT32 UcdBa:25;            /* UTP Command Descriptor Base Address */\r
+  \r
+  //\r
+  // DW5\r
+  //\r
+  UINT32 UcdBaU;              /* UTP Command Descriptor Base Address Upper 32-bits */\r
\r
+  //\r
+  // DW6\r
+  //\r
+  UINT16 RuL;                 /* Response UPIU Length */  \r
+  UINT16 RuO;                 /* Response UPIU Offset */\r
+\r
+  //\r
+  // DW7\r
+  //\r
+  UINT16 PrdtL;               /* PRDT Length */  \r
+  UINT16 PrdtO;               /* PRDT Offset */\r
+} UTP_TRD;\r
+\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT32 Rsvd1:2;\r
+  UINT32 DbAddr:30;           /* Data Base Address */\r
+  \r
+  //\r
+  // DW1\r
+  //\r
+  UINT32 DbAddrU;             /* Data Base Address Upper 32-bits */\r
\r
+  //\r
+  // DW2\r
+  //\r
+  UINT32 Rsvd2;\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 DbCount:18;          /* Data Byte Count */\r
+  UINT32 Rsvd3:14;\r
+} UTP_TR_PRD;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.3 - UTP Command UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x01*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  CmdSet:4;            /* Command Set Type */\r
+  UINT8  Rsvd1:4;\r
+  UINT8  Rsvd2;\r
+  UINT8  Rsvd3;\r
+  UINT8  Rsvd4;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd5;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 ExpDataTranLen;      /* Expected Data Transfer Length - Big Endian */\r
+\r
+  //\r
+  // DW4 - DW7\r
+  //\r
+  UINT8  Cdb[16];\r
+} UTP_COMMAND_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.4 - UTP Response UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x21*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  CmdSet:4;            /* Command Set Type */\r
+  UINT8  Rsvd1:4;\r
+  UINT8  Rsvd2;\r
+  UINT8  Response;            /* Response */\r
+  UINT8  Status;              /* Status */\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  DevInfo;             /* Device Information */\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 ResTranCount;        /* Residual Transfer Count - Big Endian */\r
+\r
+  //\r
+  // DW4 - DW7\r
+  //\r
+  UINT8  Rsvd3[16];\r
+\r
+  //\r
+  // Data Segment - Sense Data\r
+  //\r
+  UINT16 SenseDataLen;        /* Sense Data Length - Big Endian */\r
+  UINT8  SenseData[18];       /* Sense Data */\r
+} UTP_RESPONSE_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.5 - UTP Data-Out UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x02*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd1[4];\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd2;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 DataBufOffset;       /* Data Buffer Offset - Big Endian */\r
+\r
+  //\r
+  // DW4\r
+  //\r
+  UINT32 DataTranCount;       /* Data Transfer Count - Big Endian */\r
+\r
+  //\r
+  // DW5 - DW7\r
+  //\r
+  UINT8  Rsvd3[12];\r
+\r
+  //\r
+  // Data Segment - Data to be sent out\r
+  //\r
+  //UINT8  Data[];            /* Data to be sent out, maximum is 65535 bytes */\r
+} UTP_DATA_OUT_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.6 - UTP Data-In UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x22*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd1[4];\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd2;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 DataBufOffset;       /* Data Buffer Offset - Big Endian */\r
+\r
+  //\r
+  // DW4\r
+  //\r
+  UINT32 DataTranCount;       /* Data Transfer Count - Big Endian */\r
+\r
+  //\r
+  // DW5 - DW7\r
+  //\r
+  UINT8  Rsvd3[12];\r
+\r
+  //\r
+  // Data Segment - Data to be read\r
+  //\r
+  //UINT8  Data[];            /* Data to be read, maximum is 65535 bytes */\r
+} UTP_DATA_IN_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.7 - UTP Ready-To-Transfer UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x31*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd1[4];\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd2;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 DataBufOffset;       /* Data Buffer Offset - Big Endian */\r
+\r
+  //\r
+  // DW4\r
+  //\r
+  UINT32 DataTranCount;       /* Data Transfer Count - Big Endian */\r
+\r
+  //\r
+  // DW5 - DW7\r
+  //\r
+  UINT8  Rsvd3[12];\r
+\r
+  //\r
+  // Data Segment - Data to be read\r
+  //\r
+  //UINT8  Data[];            /* Data to be read, maximum is 65535 bytes */\r
+} UTP_RDY_TO_TRAN_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.8 - UTP Task Management Request UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x04*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd1;\r
+  UINT8  TskManFunc;          /* Task Management Function */\r
+  UINT8  Rsvd2[2];\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd3;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 InputParam1;         /* Input Parameter 1 - Big Endian */\r
+\r
+  //\r
+  // DW4\r
+  //\r
+  UINT32 InputParam2;         /* Input Parameter 2 - Big Endian */\r
+\r
+  //\r
+  // DW5\r
+  //\r
+  UINT32 InputParam3;         /* Input Parameter 3 - Big Endian */\r
+\r
+  //\r
+  // DW6 - DW7\r
+  //\r
+  UINT8  Rsvd4[8];\r
+} UTP_TM_REQ_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.9 - UTP Task Management Response UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x24*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd1[2];\r
+  UINT8  Resp;                /* Response */\r
+  UINT8  Rsvd2;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd3;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 OutputParam1;        /* Output Parameter 1 - Big Endian */\r
+\r
+  //\r
+  // DW4\r
+  //\r
+  UINT32 OutputParam2;        /* Output Parameter 2 - Big Endian */\r
+\r
+  //\r
+  // DW5 - DW7\r
+  //\r
+  UINT8  Rsvd4[12];\r
+} UTP_TM_RESP_UPIU;\r
+\r
+//\r
+// UTP Task Management Request Descriptor\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT32 Rsvd1:24;\r
+  UINT32 Int:1;               /* Interrupt */\r
+  UINT32 Rsvd2:7;\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT32 Rsvd3;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT32 Ocs:8;               /* Overall Command Status */\r
+  UINT32 Rsvd4:24;\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT32 Rsvd5;\r
+\r
+  //\r
+  // DW4 - DW11\r
+  //\r
+  UTP_TM_REQ_UPIU TmReq;      /* Task Management Request UPIU */\r
+  \r
+  //\r
+  // DW12 - DW19\r
+  //\r
+  UTP_TM_RESP_UPIU TmResp;    /* Task Management Response UPIU */\r
+} UTP_TMRD;\r
+\r
+\r
+typedef struct {\r
+  UINT8  Opcode;\r
+  UINT8  DescId;\r
+  UINT8  Index;\r
+  UINT8  Selector;\r
+  UINT16 Rsvd1;\r
+  UINT16 Length;\r
+  UINT32 Value;\r
+  UINT32 Rsvd2;\r
+} UTP_UPIU_TSF;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.10 - UTP Query Request UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8        TransCode:6;   /* Transaction Type - 0x16*/\r
+  UINT8        Dd:1;\r
+  UINT8        Hd:1;\r
+  UINT8        Flags;\r
+  UINT8        Rsvd1;\r
+  UINT8        TaskTag;       /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8        Rsvd2;\r
+  UINT8        QueryFunc;     /* Query Function */\r
+  UINT8        Rsvd3[2];\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8        EhsLen;        /* Total EHS Length - 0x00 */\r
+  UINT8        Rsvd4;\r
+  UINT16       DataSegLen;    /* Data Segment Length - Big Endian */\r
+\r
+  //\r
+  // DW3 - 6\r
+  //\r
+  UTP_UPIU_TSF Tsf;           /* Transaction Specific Fields */\r
+\r
+  //\r
+  // DW7\r
+  //\r
+  UINT8        Rsvd5[4];\r
+\r
+  //\r
+  // Data Segment - Data to be transferred\r
+  //\r
+  //UINT8  Data[];            /* Data to be transferred, maximum is 65535 bytes */\r
+} UTP_QUERY_REQ_UPIU;\r
+\r
+#define QUERY_FUNC_STD_READ_REQ     0x01\r
+#define QUERY_FUNC_STD_WRITE_REQ    0x81\r
+\r
+typedef enum {\r
+  UtpQueryFuncOpcodeNop      = 0x00,\r
+  UtpQueryFuncOpcodeRdDesc   = 0x01,\r
+  UtpQueryFuncOpcodeWrDesc   = 0x02,\r
+  UtpQueryFuncOpcodeRdAttr   = 0x03,\r
+  UtpQueryFuncOpcodeWrAttr   = 0x04,\r
+  UtpQueryFuncOpcodeRdFlag   = 0x05,\r
+  UtpQueryFuncOpcodeSetFlag  = 0x06,\r
+  UtpQueryFuncOpcodeClrFlag  = 0x07,\r
+  UtpQueryFuncOpcodeTogFlag  = 0x08\r
+} UTP_QUERY_FUNC_OPCODE;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.11 - UTP Query Response UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8        TransCode:6;   /* Transaction Type - 0x36*/\r
+  UINT8        Dd:1;\r
+  UINT8        Hd:1;\r
+  UINT8        Flags;\r
+  UINT8        Rsvd1;\r
+  UINT8        TaskTag;       /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8        Rsvd2;\r
+  UINT8        QueryFunc;     /* Query Function */\r
+  UINT8        QueryResp;     /* Query Response */\r
+  UINT8        Rsvd3;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8        EhsLen;        /* Total EHS Length - 0x00 */\r
+  UINT8        DevInfo;       /* Device Information */\r
+  UINT16       DataSegLen;    /* Data Segment Length - Big Endian */\r
+\r
+  //\r
+  // DW3 - 6\r
+  //\r
+  UTP_UPIU_TSF Tsf;           /* Transaction Specific Fields */\r
+\r
+  //\r
+  // DW7\r
+  //\r
+  UINT8        Rsvd4[4];\r
+\r
+  //\r
+  // Data Segment - Data to be transferred\r
+  //\r
+  //UINT8      Data[];        /* Data to be transferred, maximum is 65535 bytes */\r
+} UTP_QUERY_RESP_UPIU;\r
+\r
+typedef enum {\r
+  UfsUtpQueryResponseSuccess             = 0x00,\r
+  UfsUtpQueryResponseParamNotReadable    = 0xF6,\r
+  UfsUtpQueryResponseParamNotWriteable   = 0xF7,  \r
+  UfsUtpQueryResponseParamAlreadyWritten = 0xF8,\r
+  UfsUtpQueryResponseInvalidLen          = 0xF9,\r
+  UfsUtpQueryResponseInvalidVal          = 0xFA,\r
+  UfsUtpQueryResponseInvalidSelector     = 0xFB,\r
+  UfsUtpQueryResponseInvalidIndex        = 0xFC,\r
+  UfsUtpQueryResponseInvalidIdn          = 0xFD,\r
+  UfsUtpQueryResponseInvalidOpc          = 0xFE,\r
+  UfsUtpQueryResponseGeneralFailure      = 0xFF\r
+} UTP_QUERY_RESP_CODE;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.12 - UTP Reject UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x3F*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Lun;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd1[2];\r
+  UINT8  Response;            /* Response - 0x01 */\r
+  UINT8  Rsvd2;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  DevInfo;             /* Device Information - 0x00 */\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3\r
+  //\r
+  UINT8  HdrSts;              /* Basic Header Status */\r
+  UINT8  Rsvd3;\r
+  UINT8  E2ESts;              /* End-to-End Status */\r
+  UINT8  Rsvd4;\r
+\r
+  //\r
+  // DW4 - DW7\r
+  //\r
+  UINT8  Rsvd5[16];\r
+} UTP_REJ_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.13 - UTP NOP OUT UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x00*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Rsvd1;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd2[4];\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  Rsvd3;\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3 - DW7\r
+  //\r
+  UINT8  Rsvd4[20];\r
+} UTP_NOP_OUT_UPIU;\r
+\r
+//\r
+// UFS 2.0 Spec Section 10.5.14 - UTP NOP IN UPIU\r
+//\r
+typedef struct {\r
+  //\r
+  // DW0\r
+  //\r
+  UINT8  TransCode:6;         /* Transaction Type - 0x20*/\r
+  UINT8  Dd:1;\r
+  UINT8  Hd:1;\r
+  UINT8  Flags;\r
+  UINT8  Rsvd1;\r
+  UINT8  TaskTag;             /* Task Tag */\r
+\r
+  //\r
+  // DW1\r
+  //\r
+  UINT8  Rsvd2[2];\r
+  UINT8  Resp;                /* Response - 0x00 */\r
+  UINT8  Rsvd3;\r
+\r
+  //\r
+  // DW2\r
+  //\r
+  UINT8  EhsLen;              /* Total EHS Length - 0x00 */\r
+  UINT8  DevInfo;             /* Device Information - 0x00 */\r
+  UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */\r
+\r
+  //\r
+  // DW3 - DW7\r
+  //\r
+  UINT8  Rsvd4[20];\r
+} UTP_NOP_IN_UPIU;\r
+\r
+//\r
+// UFS Descriptors\r
+//\r
+typedef enum {\r
+  UfsDeviceDesc     = 0x00,\r
+  UfsConfigDesc     = 0x01,\r
+  UfsUnitDesc       = 0x02,\r
+  UfsInterConnDesc  = 0x04,\r
+  UfsStringDesc     = 0x05,\r
+  UfsGeometryDesc   = 0x07,\r
+  UfsPowerDesc      = 0x08\r
+} UFS_DESC_IDN;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.2 - Device Descriptor\r
+//\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  UINT8  Device;\r
+  UINT8  DevClass;\r
+  UINT8  DevSubClass;\r
+  UINT8  Protocol;\r
+  UINT8  NumLun;\r
+  UINT8  NumWLun;\r
+  UINT8  BootEn;\r
+  UINT8  DescAccessEn;\r
+  UINT8  InitPowerMode;\r
+  UINT8  HighPriorityLun;\r
+  UINT8  SecureRemovalType;\r
+  UINT8  SecurityLun;\r
+  UINT8  BgOpsTermLat;\r
+  UINT8  InitActiveIccLevel;\r
+  UINT16 SpecVersion;\r
+  UINT16 ManufactureDate;\r
+  UINT8  ManufacturerName;\r
+  UINT8  ProductName;\r
+  UINT8  SerialName;\r
+  UINT8  OemId;\r
+  UINT16 ManufacturerId;\r
+  UINT8  Ud0BaseOffset;\r
+  UINT8  Ud0ConfParamLen;\r
+  UINT8  DevRttCap;\r
+  UINT16 PeriodicRtcUpdate;\r
+  UINT8  Rsvd1[17];\r
+  UINT8  Rsvd2[16];\r
+} UFS_DEV_DESC;\r
+\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  UINT8  Rsvd1;\r
+  UINT8  BootEn;\r
+  UINT8  DescAccessEn;\r
+  UINT8  InitPowerMode;\r
+  UINT8  HighPriorityLun;\r
+  UINT8  SecureRemovalType;\r
+  UINT8  InitActiveIccLevel;\r
+  UINT16 PeriodicRtcUpdate;\r
+  UINT8  Rsvd2[5];\r
+} UFS_CONFIG_DESC_GEN_HEADER;\r
+\r
+typedef struct {\r
+  UINT8  LunEn;\r
+  UINT8  BootLunId;\r
+  UINT8  LunWriteProt;\r
+  UINT8  MemType;\r
+  UINT32 NumAllocUnits;\r
+  UINT8  DataReliability;\r
+  UINT8  LogicBlkSize;\r
+  UINT8  ProvisionType;\r
+  UINT16 CtxCap;\r
+  UINT8  Rsvd1[3];\r
+} UFS_UNIT_DESC_CONFIG_PARAMS;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.3 - Configuration Descriptor\r
+//\r
+typedef struct {\r
+  UFS_CONFIG_DESC_GEN_HEADER  Header;\r
+  UFS_UNIT_DESC_CONFIG_PARAMS UnitDescConfParams[8];\r
+} UFS_CONFIG_DESC;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.4 - Geometry Descriptor\r
+//\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  UINT8  MediaTech;\r
+  UINT8  Rsvd1;\r
+  UINT64 TotalRawDevCapacity;\r
+  UINT8  Rsvd2;\r
+  UINT32 SegSize;\r
+  UINT8  AllocUnitSize;\r
+  UINT8  MinAddrBlkSize;\r
+  UINT8  OptReadBlkSize;\r
+  UINT8  OptWriteBlkSize;\r
+  UINT8  MaxInBufSize;\r
+  UINT8  MaxOutBufSize;\r
+  UINT8  RpmbRwSize;\r
+  UINT8  Rsvd3;\r
+  UINT8  DataOrder;\r
+  UINT8  MaxCtxIdNum;\r
+  UINT8  SysDataTagUnitSize;\r
+  UINT8  SysDataResUnitSize;\r
+  UINT8  SupSecRemovalTypes;\r
+  UINT16 SupMemTypes;\r
+  UINT32 SysCodeMaxNumAllocUnits;\r
+  UINT16 SupCodeCapAdjFac;\r
+  UINT32 NonPersMaxNumAllocUnits;\r
+  UINT16 NonPersCapAdjFac;\r
+  UINT32 Enhance1MaxNumAllocUnits;\r
+  UINT16 Enhance1CapAdjFac;\r
+  UINT32 Enhance2MaxNumAllocUnits;\r
+  UINT16 Enhance2CapAdjFac;\r
+  UINT32 Enhance3MaxNumAllocUnits;\r
+  UINT16 Enhance3CapAdjFac;\r
+  UINT32 Enhance4MaxNumAllocUnits;\r
+  UINT16 Enhance4CapAdjFac;\r
+} UFS_GEOMETRY_DESC;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.5 - Unit Descriptor\r
+//\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  UINT8  UnitIdx;\r
+  UINT8  LunEn;\r
+  UINT8  BootLunId;\r
+  UINT8  LunWriteProt;\r
+  UINT8  LunQueueDep;\r
+  UINT8  Rsvd1;\r
+  UINT8  MemType;\r
+  UINT8  DataReliability;\r
+  UINT8  LogicBlkSize;\r
+  UINT64 LogicBlkCount;\r
+  UINT32 EraseBlkSize;\r
+  UINT8  ProvisionType;\r
+  UINT64 PhyMemResCount;\r
+  UINT16 CtxCap;\r
+  UINT8  LargeUnitGranularity;\r
+} UFS_UNIT_DESC;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.6 - RPMB Unit Descriptor\r
+//\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  UINT8  UnitIdx;\r
+  UINT8  LunEn;\r
+  UINT8  BootLunId;\r
+  UINT8  LunWriteProt;\r
+  UINT8  LunQueueDep;\r
+  UINT8  Rsvd1;\r
+  UINT8  MemType;\r
+  UINT8  Rsvd2;\r
+  UINT8  LogicBlkSize;\r
+  UINT64 LogicBlkCount;\r
+  UINT32 EraseBlkSize;\r
+  UINT8  ProvisionType;\r
+  UINT64 PhyMemResCount;\r
+  UINT8  Rsvd3[3];\r
+} UFS_RPMB_UNIT_DESC;\r
+\r
+typedef struct {\r
+  UINT16 Value:10;\r
+  UINT16 Rsvd1:4;\r
+  UINT16 Unit:2;\r
+} UFS_POWER_PARAM_ELEMENT;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.7 - Power Parameter Descriptor\r
+//\r
+typedef struct {\r
+  UINT8                    Length;\r
+  UINT8                    DescType;\r
+  UFS_POWER_PARAM_ELEMENT  ActiveIccLevelVcc[16];\r
+  UFS_POWER_PARAM_ELEMENT  ActiveIccLevelVccQ[16];\r
+  UFS_POWER_PARAM_ELEMENT  ActiveIccLevelVccQ2[16];\r
+} UFS_POWER_DESC;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.8 - InterConnect Descriptor\r
+//\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  UINT16 UniProVer;\r
+  UINT16 MphyVer;\r
+} UFS_INTER_CONNECT_DESC;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.1.6.9 - 14.1.6.12 - String Descriptor\r
+//\r
+typedef struct {\r
+  UINT8  Length;\r
+  UINT8  DescType;\r
+  CHAR16 Unicode[126];\r
+} UFS_STRING_DESC;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.2 - Flags\r
+//\r
+typedef enum {\r
+  UfsFlagDevInit         = 0x01,\r
+  UfsFlagPermWpEn        = 0x02,\r
+  UfsFlagPowerOnWpEn     = 0x03,\r
+  UfsFlagBgOpsEn         = 0x04,\r
+  UfsFlagPurgeEn         = 0x06,\r
+  UfsFlagPhyResRemoval   = 0x08,\r
+  UfsFlagBusyRtc         = 0x09,\r
+  UfsFlagPermDisFwUpdate = 0x0B    \r
+} UFS_FLAGS_IDN;\r
+\r
+//\r
+// UFS 2.0 Spec Section 14.2 - Attributes\r
+//\r
+typedef enum {\r
+  UfsAttrBootLunEn         = 0x00,\r
+  UfsAttrCurPowerMode      = 0x02,\r
+  UfsAttrActiveIccLevel    = 0x03,\r
+  UfsAttrOutOfOrderDataEn  = 0x04,\r
+  UfsAttrBgOpStatus        = 0x05,\r
+  UfsAttrPurgeStatus       = 0x06,\r
+  UfsAttrMaxDataInSize     = 0x07,\r
+  UfsAttrMaxDataOutSize    = 0x08,\r
+  UfsAttrDynCapNeeded      = 0x09,\r
+  UfsAttrRefClkFreq        = 0x0a,\r
+  UfsAttrConfigDescLock    = 0x0b,\r
+  UfsAttrMaxNumOfRtt       = 0x0c,\r
+  UfsAttrExceptionEvtCtrl  = 0x0d,\r
+  UfsAttrExceptionEvtSts   = 0x0e,\r
+  UfsAttrSecondsPassed     = 0x0f,\r
+  UfsAttrContextConf       = 0x10,\r
+  UfsAttrCorrPrgBlkNum     = 0x11\r
+} UFS_ATTR_IDN;\r
+\r
+typedef enum {\r
+  UfsNoData                = 0,\r
+  UfsDataOut               = 1,\r
+  UfsDataIn                = 2,\r
+  UfsDdReserved\r
+} UFS_DATA_DIRECTION;\r
+\r
+\r
+#pragma pack()\r
+\r
+#endif\r
+\r