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