]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.h
MdeModulePkg: Add UFS (Universal Flash Storage) Stack
[mirror_edk2.git] / MdeModulePkg / Bus / Ufs / UfsPassThruDxe / UfsPassThruHci.h
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