Home | History | Annotate | Download | only in UfsBlockIoPei
      1 /** @file
      2   UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface
      3   for upper layer application to execute UFS-supported SCSI cmds.
      4 
      5   Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
      6   This program and the accompanying materials
      7   are licensed and made available under the terms and conditions of the BSD License
      8   which accompanies this distribution.  The full text of the license may be found at
      9   http://opensource.org/licenses/bsd-license.php.
     10 
     11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _UFS_PASS_THRU_HCI_H_
     17 #define _UFS_PASS_THRU_HCI_H_
     18 
     19 //
     20 // Host Capabilities Register Offsets
     21 //
     22 #define UFS_HC_CAP_OFFSET          0x0000  // Controller Capabilities
     23 #define UFS_HC_VER_OFFSET          0x0008  // Version
     24 #define UFS_HC_DDID_OFFSET         0x0010  // Device ID and Device Class
     25 #define UFS_HC_PMID_OFFSET         0x0014  // Product ID and Manufacturer ID
     26 #define UFS_HC_AHIT_OFFSET         0x0018  // Auto-Hibernate Idle Timer
     27 //
     28 // Operation and Runtime Register Offsets
     29 //
     30 #define UFS_HC_IS_OFFSET           0x0020  // Interrupt Status
     31 #define UFS_HC_IE_OFFSET           0x0024  // Interrupt Enable
     32 #define UFS_HC_STATUS_OFFSET       0x0030  // Host Controller Status
     33 #define UFS_HC_ENABLE_OFFSET       0x0034  // Host Controller Enable
     34 #define UFS_HC_UECPA_OFFSET        0x0038  // Host UIC Error Code PHY Adapter Layer
     35 #define UFS_HC_UECDL_OFFSET        0x003c  // Host UIC Error Code Data Link Layer
     36 #define UFS_HC_UECN_OFFSET         0x0040  // Host UIC Error Code Network Layer
     37 #define UFS_HC_UECT_OFFSET         0x0044  // Host UIC Error Code Transport Layer
     38 #define UFS_HC_UECDME_OFFSET       0x0048  // Host UIC Error Code DME
     39 #define UFS_HC_UTRIACR_OFFSET      0x004c  // UTP Transfer Request Interrupt Aggregation Control Register
     40 //
     41 // UTP Transfer Register Offsets
     42 //
     43 #define UFS_HC_UTRLBA_OFFSET       0x0050  // UTP Transfer Request List Base Address
     44 #define UFS_HC_UTRLBAU_OFFSET      0x0054  // UTP Transfer Request List Base Address Upper 32-Bits
     45 #define UFS_HC_UTRLDBR_OFFSET      0x0058  // UTP Transfer Request List Door Bell Register
     46 #define UFS_HC_UTRLCLR_OFFSET      0x005c  // UTP Transfer Request List CLear Register
     47 #define UFS_HC_UTRLRSR_OFFSET      0x0060  // UTP Transfer Request Run-Stop Register
     48 //
     49 // UTP Task Management Register Offsets
     50 //
     51 #define UFS_HC_UTMRLBA_OFFSET      0x0070  // UTP Task Management Request List Base Address
     52 #define UFS_HC_UTMRLBAU_OFFSET     0x0074  // UTP Task Management Request List Base Address Upper 32-Bits
     53 #define UFS_HC_UTMRLDBR_OFFSET     0x0078  // UTP Task Management Request List Door Bell Register
     54 #define UFS_HC_UTMRLCLR_OFFSET     0x007c  // UTP Task Management Request List CLear Register
     55 #define UFS_HC_UTMRLRSR_OFFSET     0x0080  // UTP Task Management Run-Stop Register
     56 //
     57 // UIC Command Register Offsets
     58 //
     59 #define UFS_HC_UIC_CMD_OFFSET      0x0090  // UIC Command Register
     60 #define UFS_HC_UCMD_ARG1_OFFSET    0x0094  // UIC Command Argument 1
     61 #define UFS_HC_UCMD_ARG2_OFFSET    0x0098  // UIC Command Argument 2
     62 #define UFS_HC_UCMD_ARG3_OFFSET    0x009c  // UIC Command Argument 3
     63 //
     64 // UMA Register Offsets
     65 //
     66 #define UFS_HC_UMA_OFFSET          0x00b0  // Reserved for Unified Memory Extension
     67 
     68 #define UFS_HC_HCE_EN              BIT0
     69 #define UFS_HC_HCS_DP              BIT0
     70 #define UFS_HC_HCS_UCRDY           BIT3
     71 #define UFS_HC_IS_ULSS             BIT8
     72 #define UFS_HC_IS_UCCS             BIT10
     73 #define UFS_HC_CAP_64ADDR          BIT24
     74 #define UFS_HC_CAP_NUTMRS          (BIT16 | BIT17 | BIT18)
     75 #define UFS_HC_CAP_NUTRS           (BIT0 | BIT1 | BIT2 | BIT3 | BIT4)
     76 #define UFS_HC_UTMRLRSR            BIT0
     77 #define UFS_HC_UTRLRSR             BIT0
     78 
     79 //
     80 // A maximum of length of 256KB is supported by PRDT entry
     81 //
     82 #define UFS_MAX_DATA_LEN_PER_PRD   0x40000
     83 
     84 #define UFS_STORAGE_COMMAND_TYPE   0x01
     85 
     86 #define UFS_REGULAR_COMMAND        0x00
     87 #define UFS_INTERRUPT_COMMAND      0x01
     88 
     89 #define UFS_LUN_0                  0x00
     90 #define UFS_LUN_1                  0x01
     91 #define UFS_LUN_2                  0x02
     92 #define UFS_LUN_3                  0x03
     93 #define UFS_LUN_4                  0x04
     94 #define UFS_LUN_5                  0x05
     95 #define UFS_LUN_6                  0x06
     96 #define UFS_LUN_7                  0x07
     97 #define UFS_WLUN_REPORT_LUNS       0x81
     98 #define UFS_WLUN_UFS_DEV           0xD0
     99 #define UFS_WLUN_BOOT              0xB0
    100 #define UFS_WLUN_RPMB              0xC4
    101 
    102 #pragma pack(1)
    103 
    104 //
    105 // UFSHCI 2.0 Spec Section 5.2.1 Offset 00h: CAP - Controller Capabilities
    106 //
    107 typedef struct {
    108   UINT8  Nutrs:4;      // Number of UTP Transfer Request Slots
    109   UINT8  Rsvd1:4;
    110 
    111   UINT8  NoRtt;        // Number of outstanding READY TO TRANSFER (RTT) requests supported
    112 
    113   UINT8  Nutmrs:3;     // Number of UTP Task Management Request Slots
    114   UINT8  Rsvd2:4;
    115   UINT8  AutoHs:1;     // Auto-Hibernation Support
    116 
    117   UINT8  As64:1;       // 64-bit addressing supported
    118   UINT8  Oodds:1;      // Out of order data delivery supported
    119   UINT8  UicDmetms:1;  // UIC DME_TEST_MODE command supported
    120   UINT8  Ume:1;        // Reserved for Unified Memory Extension
    121   UINT8  Rsvd4:4;
    122 } UFS_HC_CAP;
    123 
    124 //
    125 // UFSHCI 2.0 Spec Section 5.2.2 Offset 08h: VER - UFS Version
    126 //
    127 typedef struct {
    128   UINT8  Vs:4;         // Version Suffix
    129   UINT8  Mnr:4;        // Minor version number
    130 
    131   UINT8  Mjr;          // Major version number
    132 
    133   UINT16 Rsvd1;
    134 } UFS_HC_VER;
    135 
    136 //
    137 // UFSHCI 2.0 Spec Section 5.2.3 Offset 10h: HCPID - Host Controller Product ID
    138 //
    139 #define UFS_HC_PID     UINT32
    140 
    141 //
    142 // UFSHCI 2.0 Spec Section 5.2.4 Offset 14h: HCMID - Host Controller Manufacturer ID
    143 //
    144 #define UFS_HC_MID     UINT32
    145 
    146 //
    147 // UFSHCI 2.0 Spec Section 5.2.5 Offset 18h: AHIT - Auto-Hibernate Idle Timer
    148 //
    149 typedef struct {
    150   UINT32 Ahitv:10;     // Auto-Hibernate Idle Timer Value
    151   UINT32 Ts:3;         // Timer scale
    152   UINT32 Rsvd1:19;
    153 } UFS_HC_AHIT;
    154 
    155 //
    156 // UFSHCI 2.0 Spec Section 5.3.1 Offset 20h: IS - Interrupt Status
    157 //
    158 typedef struct {
    159   UINT16 Utrcs:1;      // UTP Transfer Request Completion Status
    160   UINT16 Udepri:1;     // UIC DME_ENDPOINT_RESET Indication
    161   UINT16 Ue:1;         // UIC Error
    162   UINT16 Utms:1;       // UIC Test Mode Status
    163 
    164   UINT16 Upms:1;       // UIC Power Mode Status
    165   UINT16 Uhxs:1;       // UIC Hibernate Exit Status
    166   UINT16 Uhes:1;       // UIC Hibernate Enter Status
    167   UINT16 Ulls:1;       // UIC Link Lost Status
    168 
    169   UINT16 Ulss:1;       // UIC Link Startup Status
    170   UINT16 Utmrcs:1;     // UTP Task  Management Request Completion Status
    171   UINT16 Uccs:1;       // UIC Command Completion Status
    172   UINT16 Dfes:1;       // Device Fatal Error Status
    173 
    174   UINT16 Utpes:1;      // UTP Error Status
    175   UINT16 Rsvd1:3;
    176 
    177   UINT16 Hcfes:1;      // Host Controller Fatal Error Status
    178   UINT16 Sbfes:1;      // System Bus Fatal Error Status
    179   UINT16 Rsvd2:14;
    180 } UFS_HC_IS;
    181 
    182 //
    183 // UFSHCI 2.0 Spec Section 5.3.2 Offset 24h: IE - Interrupt Enable
    184 //
    185 typedef struct {
    186   UINT16 Utrce:1;      // UTP Transfer Request Completion Enable
    187   UINT16 Udeprie:1;    // UIC DME_ENDPOINT_RESET Enable
    188   UINT16 Uee:1;        // UIC Error Enable
    189   UINT16 Utmse:1;      // UIC Test Mode Status Enable
    190 
    191   UINT16 Upmse:1;      // UIC Power Mode Status Enable
    192   UINT16 Uhxse:1;      // UIC Hibernate Exit Status Enable
    193   UINT16 Uhese:1;      // UIC Hibernate Enter Status Enable
    194   UINT16 Ullse:1;      // UIC Link Lost Status Enable
    195 
    196   UINT16 Ulsse:1;      // UIC Link Startup Status Enable
    197   UINT16 Utmrce:1;     // UTP Task  Management Request Completion Enable
    198   UINT16 Ucce:1;       // UIC Command Completion Enable
    199   UINT16 Dfee:1;       // Device Fatal Error Enable
    200 
    201   UINT16 Utpee:1;      // UTP Error Enable
    202   UINT16 Rsvd1:3;
    203 
    204   UINT16 Hcfee:1;      // Host Controller Fatal Error Enable
    205   UINT16 Sbfee:1;      // System Bus Fatal Error Enable
    206   UINT16 Rsvd2:14;
    207 } UFS_HC_IE;
    208 
    209 //
    210 // UFSHCI 2.0 Spec Section 5.3.3 Offset 30h: HCS - Host Controller Status
    211 //
    212 typedef struct {
    213   UINT8  Dp:1;         // Device Present
    214   UINT8  UtrlRdy:1;    // UTP Transfer Request List Ready
    215   UINT8  UtmrlRdy:1;   // UTP Task Management Request List Ready
    216   UINT8  UcRdy:1;      // UIC COMMAND Ready
    217   UINT8  Rsvd1:4;
    218 
    219   UINT8  Upmcrs:3;     // UIC Power Mode Change Request Status
    220   UINT8  Rsvd2:1;      // UIC Hibernate Exit Status Enable
    221   UINT8  Utpec:4;      // UTP Error Code
    222 
    223   UINT8  TtagUtpE;     // Task Tag of UTP error
    224   UINT8  TlunUtpE;     // Target LUN of UTP error
    225 } UFS_HC_STATUS;
    226 
    227 //
    228 // UFSHCI 2.0 Spec Section 5.3.4 Offset 34h: HCE - Host Controller Enable
    229 //
    230 typedef struct {
    231   UINT32 Hce:1;        // Host Controller Enable
    232   UINT32 Rsvd1:31;
    233 } UFS_HC_ENABLE;
    234 
    235 //
    236 // UFSHCI 2.0 Spec Section 5.3.5 Offset 38h: UECPA - Host UIC Error Code PHY Adapter Layer
    237 //
    238 typedef struct {
    239   UINT32 Ec:5;         // UIC PHY Adapter Layer Error Code
    240   UINT32 Rsvd1:26;
    241   UINT32 Err:1;        // UIC PHY Adapter Layer Error
    242 } UFS_HC_UECPA;
    243 
    244 //
    245 // UFSHCI 2.0 Spec Section 5.3.6 Offset 3ch: UECDL - Host UIC Error Code Data Link Layer
    246 //
    247 typedef struct {
    248   UINT32 Ec:15;        // UIC Data Link Layer Error Code
    249   UINT32 Rsvd1:16;
    250   UINT32 Err:1;        // UIC Data Link Layer Error
    251 } UFS_HC_UECDL;
    252 
    253 //
    254 // UFSHCI 2.0 Spec Section 5.3.7 Offset 40h: UECN - Host UIC Error Code Network Layer
    255 //
    256 typedef struct {
    257   UINT32 Ec:3;         // UIC Network Layer Error Code
    258   UINT32 Rsvd1:28;
    259   UINT32 Err:1;        // UIC Network Layer Error
    260 } UFS_HC_UECN;
    261 
    262 //
    263 // UFSHCI 2.0 Spec Section 5.3.8 Offset 44h: UECT - Host UIC Error Code Transport Layer
    264 //
    265 typedef struct {
    266   UINT32 Ec:7;         // UIC Transport Layer Error Code
    267   UINT32 Rsvd1:24;
    268   UINT32 Err:1;        // UIC Transport Layer Error
    269 } UFS_HC_UECT;
    270 
    271 //
    272 // UFSHCI 2.0 Spec Section 5.3.9 Offset 48h: UECDME - Host UIC Error Code
    273 //
    274 typedef struct {
    275   UINT32 Ec:1;         // UIC DME Error Code
    276   UINT32 Rsvd1:30;
    277   UINT32 Err:1;        // UIC DME Error
    278 } UFS_HC_UECDME;
    279 
    280 //
    281 // UFSHCI 2.0 Spec Section 5.3.10 Offset 4Ch: UTRIACR - UTP Transfer Request Interrupt Aggregation Control Register
    282 //
    283 typedef struct {
    284   UINT8  IaToVal;      // Interrupt aggregation timeout value
    285 
    286   UINT8  IacTh:5;      // Interrupt aggregation counter threshold
    287   UINT8  Rsvd1:3;
    288 
    289   UINT8  Ctr:1;        // Counter and Timer Reset
    290   UINT8  Rsvd2:3;
    291   UINT8  Iasb:1;       // Interrupt aggregation status bit
    292   UINT8  Rsvd3:3;
    293 
    294   UINT8  IapwEn:1;     // Interrupt aggregation parameter write enable
    295   UINT8  Rsvd4:6;
    296   UINT8  IaEn:1;       // Interrupt Aggregation Enable/Disable
    297 } UFS_HC_UTRIACR;
    298 
    299 //
    300 // UFSHCI 2.0 Spec Section 5.4.1 Offset 50h: UTRLBA - UTP Transfer Request List Base Address
    301 //
    302 typedef struct {
    303   UINT32 Rsvd1:10;
    304   UINT32 UtrlBa:22;    // UTP Transfer Request List Base Address
    305 } UFS_HC_UTRLBA;
    306 
    307 //
    308 // UFSHCI 2.0 Spec Section 5.4.2 Offset 54h: UTRLBAU - UTP Transfer Request List Base Address Upper 32-bits
    309 //
    310 #define UFS_HC_UTRLBAU UINT32
    311 
    312 //
    313 // UFSHCI 2.0 Spec Section 5.4.3 Offset 58h: UTRLDBR - UTP Transfer Request List Door Bell Register
    314 //
    315 #define UFS_HC_UTRLDBR UINT32
    316 
    317 //
    318 // UFSHCI 2.0 Spec Section 5.4.4 Offset 5Ch: UTRLCLR - UTP Transfer Request List CLear Register
    319 //
    320 #define UFS_HC_UTRLCLR UINT32
    321 
    322 #if 0
    323 //
    324 // UFSHCI 2.0 Spec Section 5.4.5 Offset 60h: UTRLRSR - UTP Transfer Request List Run Stop Register
    325 //
    326 typedef struct {
    327   UINT32 UtrlRsr:1;    // UTP Transfer Request List Run-Stop Register
    328   UINT32 Rsvd1:31;
    329 } UFS_HC_UTRLRSR;
    330 #endif
    331 
    332 //
    333 // UFSHCI 2.0 Spec Section 5.5.1 Offset 70h: UTMRLBA - UTP Task Management Request List Base Address
    334 //
    335 typedef struct {
    336   UINT32 Rsvd1:10;
    337   UINT32 UtmrlBa:22;   // UTP Task Management Request List Base Address
    338 } UFS_HC_UTMRLBA;
    339 
    340 //
    341 // UFSHCI 2.0 Spec Section 5.5.2 Offset 74h: UTMRLBAU - UTP Task Management Request List Base Address Upper 32-bits
    342 //
    343 #define UFS_HC_UTMRLBAU UINT32
    344 
    345 //
    346 // UFSHCI 2.0 Spec Section 5.5.3 Offset 78h: UTMRLDBR - UTP Task Management Request List Door Bell Register
    347 //
    348 typedef struct {
    349   UINT32 UtmrlDbr:8;   // UTP Task Management Request List Door bell Register
    350   UINT32 Rsvd1:24;
    351 } UFS_HC_UTMRLDBR;
    352 
    353 //
    354 // UFSHCI 2.0 Spec Section 5.5.4 Offset 7Ch: UTMRLCLR - UTP Task Management Request List CLear Register
    355 //
    356 typedef struct {
    357   UINT32 UtmrlClr:8;   // UTP Task Management List Clear Register
    358   UINT32 Rsvd1:24;
    359 } UFS_HC_UTMRLCLR;
    360 
    361 #if 0
    362 //
    363 // UFSHCI 2.0 Spec Section 5.5.5 Offset 80h: UTMRLRSR - UTP Task Management Request List Run Stop Register
    364 //
    365 typedef struct {
    366   UINT32 UtmrlRsr:1;   // UTP Task Management Request List Run-Stop Register
    367   UINT32 Rsvd1:31;
    368 } UFS_HC_UTMRLRSR;
    369 #endif
    370 
    371 //
    372 // UFSHCI 2.0 Spec Section 5.6.1 Offset 90h: UICCMD - UIC Command
    373 //
    374 typedef struct {
    375   UINT32 CmdOp:8;      // Command Opcode
    376   UINT32 Rsvd1:24;
    377 } UFS_HC_UICCMD;
    378 
    379 //
    380 // UFSHCI 2.0 Spec Section 5.6.2 Offset 94h: UICCMDARG1 - UIC Command Argument 1
    381 //
    382 #define UFS_HC_UICCMD_ARG1 UINT32
    383 
    384 //
    385 // UFSHCI 2.0 Spec Section 5.6.2 Offset 98h: UICCMDARG2 - UIC Command Argument 2
    386 //
    387 #define UFS_HC_UICCMD_ARG2 UINT32
    388 
    389 //
    390 // UFSHCI 2.0 Spec Section 5.6.2 Offset 9ch: UICCMDARG3 - UIC Command Argument 3
    391 //
    392 #define UFS_HC_UICCMD_ARG3 UINT32
    393 
    394 //
    395 // UIC command opcodes
    396 //
    397 typedef enum {
    398   UfsUicDmeGet            = 0x01,
    399   UfsUicDmeSet            = 0x02,
    400   UfsUicDmePeerGet        = 0x03,
    401   UfsUicDmePeerSet        = 0x04,
    402   UfsUicDmePwrOn          = 0x10,
    403   UfsUicDmePwrOff         = 0x11,
    404   UfsUicDmeEnable         = 0x12,
    405   UfsUicDmeReset          = 0x14,
    406   UfsUicDmeEndpointReset  = 0x15,
    407   UfsUicDmeLinkStartup    = 0x16,
    408   UfsUicDmeHibernateEnter = 0x17,
    409   UfsUicDmeHibernateExit  = 0x18,
    410   UfsUicDmeTestMode       = 0x1A
    411 } UFS_UIC_OPCODE;
    412 
    413 //
    414 // UTP Transfer Request Descriptor
    415 //
    416 typedef struct {
    417   //
    418   // DW0
    419   //
    420   UINT32 Rsvd1:24;
    421   UINT32 Int:1;               /* Interrupt */
    422   UINT32 Dd:2;                /* Data Direction */
    423   UINT32 Rsvd2:1;
    424   UINT32 Ct:4;                /* Command Type */
    425 
    426   //
    427   // DW1
    428   //
    429   UINT32 Rsvd3;
    430 
    431   //
    432   // DW2
    433   //
    434   UINT32 Ocs:8;               /* Overall Command Status */
    435   UINT32 Rsvd4:24;
    436 
    437   //
    438   // DW3
    439   //
    440   UINT32 Rsvd5;
    441 
    442   //
    443   // DW4
    444   //
    445   UINT32 Rsvd6:7;
    446   UINT32 UcdBa:25;            /* UTP Command Descriptor Base Address */
    447 
    448   //
    449   // DW5
    450   //
    451   UINT32 UcdBaU;              /* UTP Command Descriptor Base Address Upper 32-bits */
    452 
    453   //
    454   // DW6
    455   //
    456   UINT16 RuL;                 /* Response UPIU Length */
    457   UINT16 RuO;                 /* Response UPIU Offset */
    458 
    459   //
    460   // DW7
    461   //
    462   UINT16 PrdtL;               /* PRDT Length */
    463   UINT16 PrdtO;               /* PRDT Offset */
    464 } UTP_TRD;
    465 
    466 typedef struct {
    467   //
    468   // DW0
    469   //
    470   UINT32 Rsvd1:2;
    471   UINT32 DbAddr:30;           /* Data Base Address */
    472 
    473   //
    474   // DW1
    475   //
    476   UINT32 DbAddrU;             /* Data Base Address Upper 32-bits */
    477 
    478   //
    479   // DW2
    480   //
    481   UINT32 Rsvd2;
    482 
    483   //
    484   // DW3
    485   //
    486   UINT32 DbCount:18;          /* Data Byte Count */
    487   UINT32 Rsvd3:14;
    488 } UTP_TR_PRD;
    489 
    490 //
    491 // UFS 2.0 Spec Section 10.5.3 - UTP Command UPIU
    492 //
    493 typedef struct {
    494   //
    495   // DW0
    496   //
    497   UINT8  TransCode:6;         /* Transaction Type - 0x01*/
    498   UINT8  Dd:1;
    499   UINT8  Hd:1;
    500   UINT8  Flags;
    501   UINT8  Lun;
    502   UINT8  TaskTag;             /* Task Tag */
    503 
    504   //
    505   // DW1
    506   //
    507   UINT8  CmdSet:4;            /* Command Set Type */
    508   UINT8  Rsvd1:4;
    509   UINT8  Rsvd2;
    510   UINT8  Rsvd3;
    511   UINT8  Rsvd4;
    512 
    513   //
    514   // DW2
    515   //
    516   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    517   UINT8  Rsvd5;
    518   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
    519 
    520   //
    521   // DW3
    522   //
    523   UINT32 ExpDataTranLen;      /* Expected Data Transfer Length - Big Endian */
    524 
    525   //
    526   // DW4 - DW7
    527   //
    528   UINT8  Cdb[16];
    529 } UTP_COMMAND_UPIU;
    530 
    531 //
    532 // UFS 2.0 Spec Section 10.5.4 - UTP Response UPIU
    533 //
    534 typedef struct {
    535   //
    536   // DW0
    537   //
    538   UINT8  TransCode:6;         /* Transaction Type - 0x21*/
    539   UINT8  Dd:1;
    540   UINT8  Hd:1;
    541   UINT8  Flags;
    542   UINT8  Lun;
    543   UINT8  TaskTag;             /* Task Tag */
    544 
    545   //
    546   // DW1
    547   //
    548   UINT8  CmdSet:4;            /* Command Set Type */
    549   UINT8  Rsvd1:4;
    550   UINT8  Rsvd2;
    551   UINT8  Response;            /* Response */
    552   UINT8  Status;              /* Status */
    553 
    554   //
    555   // DW2
    556   //
    557   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    558   UINT8  DevInfo;             /* Device Information */
    559   UINT16 DataSegLen;          /* Data Segment Length - Big Endian */
    560 
    561   //
    562   // DW3
    563   //
    564   UINT32 ResTranCount;        /* Residual Transfer Count - Big Endian */
    565 
    566   //
    567   // DW4 - DW7
    568   //
    569   UINT8  Rsvd3[16];
    570 
    571   //
    572   // Data Segment - Sense Data
    573   //
    574   UINT16 SenseDataLen;        /* Sense Data Length - Big Endian */
    575   UINT8  SenseData[18];       /* Sense Data */
    576 } UTP_RESPONSE_UPIU;
    577 
    578 //
    579 // UFS 2.0 Spec Section 10.5.5 - UTP Data-Out UPIU
    580 //
    581 typedef struct {
    582   //
    583   // DW0
    584   //
    585   UINT8  TransCode:6;         /* Transaction Type - 0x02*/
    586   UINT8  Dd:1;
    587   UINT8  Hd:1;
    588   UINT8  Flags;
    589   UINT8  Lun;
    590   UINT8  TaskTag;             /* Task Tag */
    591 
    592   //
    593   // DW1
    594   //
    595   UINT8  Rsvd1[4];
    596 
    597   //
    598   // DW2
    599   //
    600   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    601   UINT8  Rsvd2;
    602   UINT16 DataSegLen;          /* Data Segment Length - Big Endian */
    603 
    604   //
    605   // DW3
    606   //
    607   UINT32 DataBufOffset;       /* Data Buffer Offset - Big Endian */
    608 
    609   //
    610   // DW4
    611   //
    612   UINT32 DataTranCount;       /* Data Transfer Count - Big Endian */
    613 
    614   //
    615   // DW5 - DW7
    616   //
    617   UINT8  Rsvd3[12];
    618 
    619   //
    620   // Data Segment - Data to be sent out
    621   //
    622   //UINT8  Data[];            /* Data to be sent out, maximum is 65535 bytes */
    623 } UTP_DATA_OUT_UPIU;
    624 
    625 //
    626 // UFS 2.0 Spec Section 10.5.6 - UTP Data-In UPIU
    627 //
    628 typedef struct {
    629   //
    630   // DW0
    631   //
    632   UINT8  TransCode:6;         /* Transaction Type - 0x22*/
    633   UINT8  Dd:1;
    634   UINT8  Hd:1;
    635   UINT8  Flags;
    636   UINT8  Lun;
    637   UINT8  TaskTag;             /* Task Tag */
    638 
    639   //
    640   // DW1
    641   //
    642   UINT8  Rsvd1[4];
    643 
    644   //
    645   // DW2
    646   //
    647   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    648   UINT8  Rsvd2;
    649   UINT16 DataSegLen;          /* Data Segment Length - Big Endian */
    650 
    651   //
    652   // DW3
    653   //
    654   UINT32 DataBufOffset;       /* Data Buffer Offset - Big Endian */
    655 
    656   //
    657   // DW4
    658   //
    659   UINT32 DataTranCount;       /* Data Transfer Count - Big Endian */
    660 
    661   //
    662   // DW5 - DW7
    663   //
    664   UINT8  Rsvd3[12];
    665 
    666   //
    667   // Data Segment - Data to be read
    668   //
    669   //UINT8  Data[];            /* Data to be read, maximum is 65535 bytes */
    670 } UTP_DATA_IN_UPIU;
    671 
    672 //
    673 // UFS 2.0 Spec Section 10.5.7 - UTP Ready-To-Transfer UPIU
    674 //
    675 typedef struct {
    676   //
    677   // DW0
    678   //
    679   UINT8  TransCode:6;         /* Transaction Type - 0x31*/
    680   UINT8  Dd:1;
    681   UINT8  Hd:1;
    682   UINT8  Flags;
    683   UINT8  Lun;
    684   UINT8  TaskTag;             /* Task Tag */
    685 
    686   //
    687   // DW1
    688   //
    689   UINT8  Rsvd1[4];
    690 
    691   //
    692   // DW2
    693   //
    694   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    695   UINT8  Rsvd2;
    696   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
    697 
    698   //
    699   // DW3
    700   //
    701   UINT32 DataBufOffset;       /* Data Buffer Offset - Big Endian */
    702 
    703   //
    704   // DW4
    705   //
    706   UINT32 DataTranCount;       /* Data Transfer Count - Big Endian */
    707 
    708   //
    709   // DW5 - DW7
    710   //
    711   UINT8  Rsvd3[12];
    712 
    713   //
    714   // Data Segment - Data to be read
    715   //
    716   //UINT8  Data[];            /* Data to be read, maximum is 65535 bytes */
    717 } UTP_RDY_TO_TRAN_UPIU;
    718 
    719 //
    720 // UFS 2.0 Spec Section 10.5.8 - UTP Task Management Request UPIU
    721 //
    722 typedef struct {
    723   //
    724   // DW0
    725   //
    726   UINT8  TransCode:6;         /* Transaction Type - 0x04*/
    727   UINT8  Dd:1;
    728   UINT8  Hd:1;
    729   UINT8  Flags;
    730   UINT8  Lun;
    731   UINT8  TaskTag;             /* Task Tag */
    732 
    733   //
    734   // DW1
    735   //
    736   UINT8  Rsvd1;
    737   UINT8  TskManFunc;          /* Task Management Function */
    738   UINT8  Rsvd2[2];
    739 
    740   //
    741   // DW2
    742   //
    743   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    744   UINT8  Rsvd3;
    745   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
    746 
    747   //
    748   // DW3
    749   //
    750   UINT32 InputParam1;         /* Input Parameter 1 - Big Endian */
    751 
    752   //
    753   // DW4
    754   //
    755   UINT32 InputParam2;         /* Input Parameter 2 - Big Endian */
    756 
    757   //
    758   // DW5
    759   //
    760   UINT32 InputParam3;         /* Input Parameter 3 - Big Endian */
    761 
    762   //
    763   // DW6 - DW7
    764   //
    765   UINT8  Rsvd4[8];
    766 } UTP_TM_REQ_UPIU;
    767 
    768 //
    769 // UFS 2.0 Spec Section 10.5.9 - UTP Task Management Response UPIU
    770 //
    771 typedef struct {
    772   //
    773   // DW0
    774   //
    775   UINT8  TransCode:6;         /* Transaction Type - 0x24*/
    776   UINT8  Dd:1;
    777   UINT8  Hd:1;
    778   UINT8  Flags;
    779   UINT8  Lun;
    780   UINT8  TaskTag;             /* Task Tag */
    781 
    782   //
    783   // DW1
    784   //
    785   UINT8  Rsvd1[2];
    786   UINT8  Resp;                /* Response */
    787   UINT8  Rsvd2;
    788 
    789   //
    790   // DW2
    791   //
    792   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
    793   UINT8  Rsvd3;
    794   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
    795 
    796   //
    797   // DW3
    798   //
    799   UINT32 OutputParam1;        /* Output Parameter 1 - Big Endian */
    800 
    801   //
    802   // DW4
    803   //
    804   UINT32 OutputParam2;        /* Output Parameter 2 - Big Endian */
    805 
    806   //
    807   // DW5 - DW7
    808   //
    809   UINT8  Rsvd4[12];
    810 } UTP_TM_RESP_UPIU;
    811 
    812 //
    813 // UTP Task Management Request Descriptor
    814 //
    815 typedef struct {
    816   //
    817   // DW0
    818   //
    819   UINT32 Rsvd1:24;
    820   UINT32 Int:1;               /* Interrupt */
    821   UINT32 Rsvd2:7;
    822 
    823   //
    824   // DW1
    825   //
    826   UINT32 Rsvd3;
    827 
    828   //
    829   // DW2
    830   //
    831   UINT32 Ocs:8;               /* Overall Command Status */
    832   UINT32 Rsvd4:24;
    833 
    834   //
    835   // DW3
    836   //
    837   UINT32 Rsvd5;
    838 
    839   //
    840   // DW4 - DW11
    841   //
    842   UTP_TM_REQ_UPIU TmReq;      /* Task Management Request UPIU */
    843 
    844   //
    845   // DW12 - DW19
    846   //
    847   UTP_TM_RESP_UPIU TmResp;    /* Task Management Response UPIU */
    848 } UTP_TMRD;
    849 
    850 
    851 typedef struct {
    852   UINT8  Opcode;
    853   UINT8  DescId;
    854   UINT8  Index;
    855   UINT8  Selector;
    856   UINT16 Rsvd1;
    857   UINT16 Length;
    858   UINT32 Value;
    859   UINT32 Rsvd2;
    860 } UTP_UPIU_TSF;
    861 
    862 //
    863 // UFS 2.0 Spec Section 10.5.10 - UTP Query Request UPIU
    864 //
    865 typedef struct {
    866   //
    867   // DW0
    868   //
    869   UINT8        TransCode:6;   /* Transaction Type - 0x16*/
    870   UINT8        Dd:1;
    871   UINT8        Hd:1;
    872   UINT8        Flags;
    873   UINT8        Rsvd1;
    874   UINT8        TaskTag;       /* Task Tag */
    875 
    876   //
    877   // DW1
    878   //
    879   UINT8        Rsvd2;
    880   UINT8        QueryFunc;     /* Query Function */
    881   UINT8        Rsvd3[2];
    882 
    883   //
    884   // DW2
    885   //
    886   UINT8        EhsLen;        /* Total EHS Length - 0x00 */
    887   UINT8        Rsvd4;
    888   UINT16       DataSegLen;    /* Data Segment Length - Big Endian */
    889 
    890   //
    891   // DW3 - 6
    892   //
    893   UTP_UPIU_TSF Tsf;           /* Transaction Specific Fields */
    894 
    895   //
    896   // DW7
    897   //
    898   UINT8        Rsvd5[4];
    899 
    900   //
    901   // Data Segment - Data to be transferred
    902   //
    903   //UINT8  Data[];            /* Data to be transferred, maximum is 65535 bytes */
    904 } UTP_QUERY_REQ_UPIU;
    905 
    906 #define QUERY_FUNC_STD_READ_REQ     0x01
    907 #define QUERY_FUNC_STD_WRITE_REQ    0x81
    908 
    909 typedef enum {
    910   UtpQueryFuncOpcodeNop      = 0x00,
    911   UtpQueryFuncOpcodeRdDesc   = 0x01,
    912   UtpQueryFuncOpcodeWrDesc   = 0x02,
    913   UtpQueryFuncOpcodeRdAttr   = 0x03,
    914   UtpQueryFuncOpcodeWrAttr   = 0x04,
    915   UtpQueryFuncOpcodeRdFlag   = 0x05,
    916   UtpQueryFuncOpcodeSetFlag  = 0x06,
    917   UtpQueryFuncOpcodeClrFlag  = 0x07,
    918   UtpQueryFuncOpcodeTogFlag  = 0x08
    919 } UTP_QUERY_FUNC_OPCODE;
    920 
    921 //
    922 // UFS 2.0 Spec Section 10.5.11 - UTP Query Response UPIU
    923 //
    924 typedef struct {
    925   //
    926   // DW0
    927   //
    928   UINT8        TransCode:6;   /* Transaction Type - 0x36*/
    929   UINT8        Dd:1;
    930   UINT8        Hd:1;
    931   UINT8        Flags;
    932   UINT8        Rsvd1;
    933   UINT8        TaskTag;       /* Task Tag */
    934 
    935   //
    936   // DW1
    937   //
    938   UINT8        Rsvd2;
    939   UINT8        QueryFunc;     /* Query Function */
    940   UINT8        QueryResp;     /* Query Response */
    941   UINT8        Rsvd3;
    942 
    943   //
    944   // DW2
    945   //
    946   UINT8        EhsLen;        /* Total EHS Length - 0x00 */
    947   UINT8        DevInfo;       /* Device Information */
    948   UINT16       DataSegLen;    /* Data Segment Length - Big Endian */
    949 
    950   //
    951   // DW3 - 6
    952   //
    953   UTP_UPIU_TSF Tsf;           /* Transaction Specific Fields */
    954 
    955   //
    956   // DW7
    957   //
    958   UINT8        Rsvd4[4];
    959 
    960   //
    961   // Data Segment - Data to be transferred
    962   //
    963   //UINT8      Data[];        /* Data to be transferred, maximum is 65535 bytes */
    964 } UTP_QUERY_RESP_UPIU;
    965 
    966 typedef enum {
    967   UfsUtpQueryResponseSuccess             = 0x00,
    968   UfsUtpQueryResponseParamNotReadable    = 0xF6,
    969   UfsUtpQueryResponseParamNotWriteable   = 0xF7,
    970   UfsUtpQueryResponseParamAlreadyWritten = 0xF8,
    971   UfsUtpQueryResponseInvalidLen          = 0xF9,
    972   UfsUtpQueryResponseInvalidVal          = 0xFA,
    973   UfsUtpQueryResponseInvalidSelector     = 0xFB,
    974   UfsUtpQueryResponseInvalidIndex        = 0xFC,
    975   UfsUtpQueryResponseInvalidIdn          = 0xFD,
    976   UfsUtpQueryResponseInvalidOpc          = 0xFE,
    977   UfsUtpQueryResponseGeneralFailure      = 0xFF
    978 } UTP_QUERY_RESP_CODE;
    979 
    980 //
    981 // UFS 2.0 Spec Section 10.5.12 - UTP Reject UPIU
    982 //
    983 typedef struct {
    984   //
    985   // DW0
    986   //
    987   UINT8  TransCode:6;         /* Transaction Type - 0x3F*/
    988   UINT8  Dd:1;
    989   UINT8  Hd:1;
    990   UINT8  Flags;
    991   UINT8  Lun;
    992   UINT8  TaskTag;             /* Task Tag */
    993 
    994   //
    995   // DW1
    996   //
    997   UINT8  Rsvd1[2];
    998   UINT8  Response;            /* Response - 0x01 */
    999   UINT8  Rsvd2;
   1000 
   1001   //
   1002   // DW2
   1003   //
   1004   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
   1005   UINT8  DevInfo;             /* Device Information - 0x00 */
   1006   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
   1007 
   1008   //
   1009   // DW3
   1010   //
   1011   UINT8  HdrSts;              /* Basic Header Status */
   1012   UINT8  Rsvd3;
   1013   UINT8  E2ESts;              /* End-to-End Status */
   1014   UINT8  Rsvd4;
   1015 
   1016   //
   1017   // DW4 - DW7
   1018   //
   1019   UINT8  Rsvd5[16];
   1020 } UTP_REJ_UPIU;
   1021 
   1022 //
   1023 // UFS 2.0 Spec Section 10.5.13 - UTP NOP OUT UPIU
   1024 //
   1025 typedef struct {
   1026   //
   1027   // DW0
   1028   //
   1029   UINT8  TransCode:6;         /* Transaction Type - 0x00*/
   1030   UINT8  Dd:1;
   1031   UINT8  Hd:1;
   1032   UINT8  Flags;
   1033   UINT8  Rsvd1;
   1034   UINT8  TaskTag;             /* Task Tag */
   1035 
   1036   //
   1037   // DW1
   1038   //
   1039   UINT8  Rsvd2[4];
   1040 
   1041   //
   1042   // DW2
   1043   //
   1044   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
   1045   UINT8  Rsvd3;
   1046   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
   1047 
   1048   //
   1049   // DW3 - DW7
   1050   //
   1051   UINT8  Rsvd4[20];
   1052 } UTP_NOP_OUT_UPIU;
   1053 
   1054 //
   1055 // UFS 2.0 Spec Section 10.5.14 - UTP NOP IN UPIU
   1056 //
   1057 typedef struct {
   1058   //
   1059   // DW0
   1060   //
   1061   UINT8  TransCode:6;         /* Transaction Type - 0x20*/
   1062   UINT8  Dd:1;
   1063   UINT8  Hd:1;
   1064   UINT8  Flags;
   1065   UINT8  Rsvd1;
   1066   UINT8  TaskTag;             /* Task Tag */
   1067 
   1068   //
   1069   // DW1
   1070   //
   1071   UINT8  Rsvd2[2];
   1072   UINT8  Resp;                /* Response - 0x00 */
   1073   UINT8  Rsvd3;
   1074 
   1075   //
   1076   // DW2
   1077   //
   1078   UINT8  EhsLen;              /* Total EHS Length - 0x00 */
   1079   UINT8  DevInfo;             /* Device Information - 0x00 */
   1080   UINT16 DataSegLen;          /* Data Segment Length - Big Endian - 0x0000 */
   1081 
   1082   //
   1083   // DW3 - DW7
   1084   //
   1085   UINT8  Rsvd4[20];
   1086 } UTP_NOP_IN_UPIU;
   1087 
   1088 //
   1089 // UFS Descriptors
   1090 //
   1091 typedef enum {
   1092   UfsDeviceDesc     = 0x00,
   1093   UfsConfigDesc     = 0x01,
   1094   UfsUnitDesc       = 0x02,
   1095   UfsInterConnDesc  = 0x04,
   1096   UfsStringDesc     = 0x05,
   1097   UfsGeometryDesc   = 0x07,
   1098   UfsPowerDesc      = 0x08
   1099 } UFS_DESC_IDN;
   1100 
   1101 //
   1102 // UFS 2.0 Spec Section 14.1.6.2 - Device Descriptor
   1103 //
   1104 typedef struct {
   1105   UINT8  Length;
   1106   UINT8  DescType;
   1107   UINT8  Device;
   1108   UINT8  DevClass;
   1109   UINT8  DevSubClass;
   1110   UINT8  Protocol;
   1111   UINT8  NumLun;
   1112   UINT8  NumWLun;
   1113   UINT8  BootEn;
   1114   UINT8  DescAccessEn;
   1115   UINT8  InitPowerMode;
   1116   UINT8  HighPriorityLun;
   1117   UINT8  SecureRemovalType;
   1118   UINT8  SecurityLun;
   1119   UINT8  BgOpsTermLat;
   1120   UINT8  InitActiveIccLevel;
   1121   UINT16 SpecVersion;
   1122   UINT16 ManufactureDate;
   1123   UINT8  ManufacturerName;
   1124   UINT8  ProductName;
   1125   UINT8  SerialName;
   1126   UINT8  OemId;
   1127   UINT16 ManufacturerId;
   1128   UINT8  Ud0BaseOffset;
   1129   UINT8  Ud0ConfParamLen;
   1130   UINT8  DevRttCap;
   1131   UINT16 PeriodicRtcUpdate;
   1132   UINT8  Rsvd1[17];
   1133   UINT8  Rsvd2[16];
   1134 } UFS_DEV_DESC;
   1135 
   1136 typedef struct {
   1137   UINT8  Length;
   1138   UINT8  DescType;
   1139   UINT8  Rsvd1;
   1140   UINT8  BootEn;
   1141   UINT8  DescAccessEn;
   1142   UINT8  InitPowerMode;
   1143   UINT8  HighPriorityLun;
   1144   UINT8  SecureRemovalType;
   1145   UINT8  InitActiveIccLevel;
   1146   UINT16 PeriodicRtcUpdate;
   1147   UINT8  Rsvd2[5];
   1148 } UFS_CONFIG_DESC_GEN_HEADER;
   1149 
   1150 typedef struct {
   1151   UINT8  LunEn;
   1152   UINT8  BootLunId;
   1153   UINT8  LunWriteProt;
   1154   UINT8  MemType;
   1155   UINT32 NumAllocUnits;
   1156   UINT8  DataReliability;
   1157   UINT8  LogicBlkSize;
   1158   UINT8  ProvisionType;
   1159   UINT16 CtxCap;
   1160   UINT8  Rsvd1[3];
   1161 } UFS_UNIT_DESC_CONFIG_PARAMS;
   1162 
   1163 //
   1164 // UFS 2.0 Spec Section 14.1.6.3 - Configuration Descriptor
   1165 //
   1166 typedef struct {
   1167   UFS_CONFIG_DESC_GEN_HEADER  Header;
   1168   UFS_UNIT_DESC_CONFIG_PARAMS UnitDescConfParams[8];
   1169 } UFS_CONFIG_DESC;
   1170 
   1171 //
   1172 // UFS 2.0 Spec Section 14.1.6.4 - Geometry Descriptor
   1173 //
   1174 typedef struct {
   1175   UINT8  Length;
   1176   UINT8  DescType;
   1177   UINT8  MediaTech;
   1178   UINT8  Rsvd1;
   1179   UINT64 TotalRawDevCapacity;
   1180   UINT8  Rsvd2;
   1181   UINT32 SegSize;
   1182   UINT8  AllocUnitSize;
   1183   UINT8  MinAddrBlkSize;
   1184   UINT8  OptReadBlkSize;
   1185   UINT8  OptWriteBlkSize;
   1186   UINT8  MaxInBufSize;
   1187   UINT8  MaxOutBufSize;
   1188   UINT8  RpmbRwSize;
   1189   UINT8  Rsvd3;
   1190   UINT8  DataOrder;
   1191   UINT8  MaxCtxIdNum;
   1192   UINT8  SysDataTagUnitSize;
   1193   UINT8  SysDataResUnitSize;
   1194   UINT8  SupSecRemovalTypes;
   1195   UINT16 SupMemTypes;
   1196   UINT32 SysCodeMaxNumAllocUnits;
   1197   UINT16 SupCodeCapAdjFac;
   1198   UINT32 NonPersMaxNumAllocUnits;
   1199   UINT16 NonPersCapAdjFac;
   1200   UINT32 Enhance1MaxNumAllocUnits;
   1201   UINT16 Enhance1CapAdjFac;
   1202   UINT32 Enhance2MaxNumAllocUnits;
   1203   UINT16 Enhance2CapAdjFac;
   1204   UINT32 Enhance3MaxNumAllocUnits;
   1205   UINT16 Enhance3CapAdjFac;
   1206   UINT32 Enhance4MaxNumAllocUnits;
   1207   UINT16 Enhance4CapAdjFac;
   1208 } UFS_GEOMETRY_DESC;
   1209 
   1210 //
   1211 // UFS 2.0 Spec Section 14.1.6.5 - Unit Descriptor
   1212 //
   1213 typedef struct {
   1214   UINT8  Length;
   1215   UINT8  DescType;
   1216   UINT8  UnitIdx;
   1217   UINT8  LunEn;
   1218   UINT8  BootLunId;
   1219   UINT8  LunWriteProt;
   1220   UINT8  LunQueueDep;
   1221   UINT8  Rsvd1;
   1222   UINT8  MemType;
   1223   UINT8  DataReliability;
   1224   UINT8  LogicBlkSize;
   1225   UINT64 LogicBlkCount;
   1226   UINT32 EraseBlkSize;
   1227   UINT8  ProvisionType;
   1228   UINT64 PhyMemResCount;
   1229   UINT16 CtxCap;
   1230   UINT8  LargeUnitGranularity;
   1231 } UFS_UNIT_DESC;
   1232 
   1233 //
   1234 // UFS 2.0 Spec Section 14.1.6.6 - RPMB Unit Descriptor
   1235 //
   1236 typedef struct {
   1237   UINT8  Length;
   1238   UINT8  DescType;
   1239   UINT8  UnitIdx;
   1240   UINT8  LunEn;
   1241   UINT8  BootLunId;
   1242   UINT8  LunWriteProt;
   1243   UINT8  LunQueueDep;
   1244   UINT8  Rsvd1;
   1245   UINT8  MemType;
   1246   UINT8  Rsvd2;
   1247   UINT8  LogicBlkSize;
   1248   UINT64 LogicBlkCount;
   1249   UINT32 EraseBlkSize;
   1250   UINT8  ProvisionType;
   1251   UINT64 PhyMemResCount;
   1252   UINT8  Rsvd3[3];
   1253 } UFS_RPMB_UNIT_DESC;
   1254 
   1255 typedef struct {
   1256   UINT16 Value:10;
   1257   UINT16 Rsvd1:4;
   1258   UINT16 Unit:2;
   1259 } UFS_POWER_PARAM_ELEMENT;
   1260 
   1261 //
   1262 // UFS 2.0 Spec Section 14.1.6.7 - Power Parameter Descriptor
   1263 //
   1264 typedef struct {
   1265   UINT8                    Length;
   1266   UINT8                    DescType;
   1267   UFS_POWER_PARAM_ELEMENT  ActiveIccLevelVcc[16];
   1268   UFS_POWER_PARAM_ELEMENT  ActiveIccLevelVccQ[16];
   1269   UFS_POWER_PARAM_ELEMENT  ActiveIccLevelVccQ2[16];
   1270 } UFS_POWER_DESC;
   1271 
   1272 //
   1273 // UFS 2.0 Spec Section 14.1.6.8 - InterConnect Descriptor
   1274 //
   1275 typedef struct {
   1276   UINT8  Length;
   1277   UINT8  DescType;
   1278   UINT16 UniProVer;
   1279   UINT16 MphyVer;
   1280 } UFS_INTER_CONNECT_DESC;
   1281 
   1282 //
   1283 // UFS 2.0 Spec Section 14.1.6.9 - 14.1.6.12 - String Descriptor
   1284 //
   1285 typedef struct {
   1286   UINT8  Length;
   1287   UINT8  DescType;
   1288   CHAR16 Unicode[126];
   1289 } UFS_STRING_DESC;
   1290 
   1291 //
   1292 // UFS 2.0 Spec Section 14.2 - Flags
   1293 //
   1294 typedef enum {
   1295   UfsFlagDevInit         = 0x01,
   1296   UfsFlagPermWpEn        = 0x02,
   1297   UfsFlagPowerOnWpEn     = 0x03,
   1298   UfsFlagBgOpsEn         = 0x04,
   1299   UfsFlagPurgeEn         = 0x06,
   1300   UfsFlagPhyResRemoval   = 0x08,
   1301   UfsFlagBusyRtc         = 0x09,
   1302   UfsFlagPermDisFwUpdate = 0x0B
   1303 } UFS_FLAGS_IDN;
   1304 
   1305 //
   1306 // UFS 2.0 Spec Section 14.2 - Attributes
   1307 //
   1308 typedef enum {
   1309   UfsAttrBootLunEn         = 0x00,
   1310   UfsAttrCurPowerMode      = 0x02,
   1311   UfsAttrActiveIccLevel    = 0x03,
   1312   UfsAttrOutOfOrderDataEn  = 0x04,
   1313   UfsAttrBgOpStatus        = 0x05,
   1314   UfsAttrPurgeStatus       = 0x06,
   1315   UfsAttrMaxDataInSize     = 0x07,
   1316   UfsAttrMaxDataOutSize    = 0x08,
   1317   UfsAttrDynCapNeeded      = 0x09,
   1318   UfsAttrRefClkFreq        = 0x0a,
   1319   UfsAttrConfigDescLock    = 0x0b,
   1320   UfsAttrMaxNumOfRtt       = 0x0c,
   1321   UfsAttrExceptionEvtCtrl  = 0x0d,
   1322   UfsAttrExceptionEvtSts   = 0x0e,
   1323   UfsAttrSecondsPassed     = 0x0f,
   1324   UfsAttrContextConf       = 0x10,
   1325   UfsAttrCorrPrgBlkNum     = 0x11
   1326 } UFS_ATTR_IDN;
   1327 
   1328 typedef enum {
   1329   UfsNoData                = 0,
   1330   UfsDataOut               = 1,
   1331   UfsDataIn                = 2,
   1332   UfsDdReserved
   1333 } UFS_DATA_DIRECTION;
   1334 
   1335 
   1336 #pragma pack()
   1337 
   1338 #endif
   1339 
   1340