1 /** @file
2   Debug Port Library implementation based on usb3 debug port.
3 
4   Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php.
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef __USB3_DEBUG_PORT_LIB_INTERNAL__
16 #define __USB3_DEBUG_PORT_LIB_INTERNAL__
17 
18 #include <Uefi.h>
19 #include <Base.h>
20 #include <IndustryStandard/Usb.h>
21 #include <Library/IoLib.h>
22 #include <IndustryStandard/Pci.h>
23 #include <Library/PcdLib.h>
24 #include <Library/UefiLib.h>
25 #include <Library/UefiBootServicesTableLib.h>
26 #include <Library/MemoryAllocationLib.h>
27 #include <Library/DebugLib.h>
28 #include <Library/BaseMemoryLib.h>
29 #include <Library/BaseLib.h>
30 #include <Library/TimerLib.h>
31 #include <Library/DebugCommunicationLib.h>
32 #include <Library/PciLib.h>
33 
34 //
35 // USB Debug GUID value
36 //
37 #define USB3_DBG_GUID \
38     { \
39       0xb2a56f4d, 0x9177, 0x4fc8, { 0xa6, 0x77, 0xdd, 0x96, 0x3e, 0xb4, 0xcb, 0x1b } \
40     }
41 
42 //
43 // The state machine of usb debug port
44 //
45 #define USB3DBG_NO_DBG_CAB    0   // The XHCI host controller does not support debug capability
46 #define USB3DBG_DBG_CAB       1   // The XHCI host controller supports debug capability
47 #define USB3DBG_ENABLED       2   // The XHCI debug device is enabled
48 #define USB3DBG_NOT_ENABLED   4   // The XHCI debug device is not enabled
49 
50 #define USB3_DEBUG_PORT_WRITE_MAX_PACKET_SIZE 0x08
51 
52 //
53 // MaxPacketSize for DbC Endpoint Descriptor IN and OUT
54 //
55 #define XHCI_DEBUG_DEVICE_MAX_PACKET_SIZE    0x400
56 
57 #define XHCI_DEBUG_DEVICE_VENDOR_ID   0x0525
58 #define XHCI_DEBUG_DEVICE_PRODUCT_ID  0x127A
59 #define XHCI_DEBUG_DEVICE_PROTOCOL    0xFF
60 #define XHCI_DEBUG_DEVICE_REVISION    0x00
61 
62 #define XHCI_BASE_ADDRESS_64_BIT_MASK 0xFFFFFFFFFFFF0000ULL
63 #define XHCI_BASE_ADDRESS_32_BIT_MASK 0xFFFF0000
64 
65 #define PCI_CAPABILITY_ID_DEBUG_PORT  0x0A
66 #define XHC_HCCPARAMS_OFFSET          0x10
67 #define XHC_CAPABILITY_ID_MASK        0xFF
68 #define XHC_NEXT_CAPABILITY_MASK      0xFF00
69 
70 #define XHC_HCSPARAMS1_OFFSET         0x4    // Structural Parameters 1
71 #define XHC_USBCMD_OFFSET             0x0    // USB Command Register Offset
72 #define XHC_USBSTS_OFFSET             0x4    // USB Status Register Offset
73 #define XHC_PORTSC_OFFSET             0x400  // Port Status and Control Register Offset
74 
75 #define XHC_USBCMD_RUN                BIT0  // Run/Stop
76 #define XHC_USBCMD_RESET              BIT1  // Host Controller Reset
77 
78 #define XHC_USBSTS_HALT               BIT0
79 
80 //
81 // Indicate the timeout when data is transferred in microsecond. 0 means infinite timeout.
82 //
83 #define DATA_TRANSFER_WRITE_TIMEOUT      0
84 #define DATA_TRANSFER_READ_TIMEOUT       50000
85 #define DATA_TRANSFER_POLL_TIMEOUT       1000
86 #define XHC_DEBUG_PORT_1_MILLISECOND     1000
87 //
88 // XHCI port power off/on delay
89 //
90 #define XHC_DEBUG_PORT_ON_OFF_DELAY    100000
91 
92 //
93 // USB debug device string descritpor (header size + unicode string length)
94 //
95 #define STRING0_DESC_LEN      4
96 #define MANU_DESC_LEN         12
97 #define PRODUCT_DESC_LEN      40
98 #define SERIAL_DESC_LEN       4
99 
100 //
101 // Debug Capability Register Offset
102 //
103 #define XHC_DC_DCID                  0x0
104 #define XHC_DC_DCDB                  0x4
105 #define XHC_DC_DCERSTSZ              0x8
106 #define XHC_DC_DCERSTBA              0x10
107 #define XHC_DC_DCERDP                0x18
108 #define XHC_DC_DCCTRL                0x20
109 #define XHC_DC_DCST                  0x24
110 #define XHC_DC_DCPORTSC              0x28
111 #define XHC_DC_DCCP                  0x30
112 #define XHC_DC_DCDDI1                0x38
113 #define XHC_DC_DCDDI2                0x3C
114 
115 #define TRB_TYPE_LINK                6
116 
117 #define ERST_NUMBER                  0x01
118 #define TR_RING_TRB_NUMBER           0x100
119 #define EVENT_RING_TRB_NUMBER        0x200
120 
121 #define ED_BULK_OUT                  2
122 #define ED_BULK_IN                   6
123 
124 #define XHC_LOW_32BIT(Addr64)          ((UINT32)(((UINTN)(Addr64)) & 0xFFFFFFFF))
125 #define XHC_HIGH_32BIT(Addr64)         ((UINT32)(RShiftU64((UINT64)(UINTN)(Addr64), 32) & 0xFFFFFFFF))
126 #define XHC_BIT_IS_SET(Data, Bit)      ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
127 
128 //
129 // Endpoint Type (EP Type).
130 //
131 #define ED_NOT_VALID                          0
132 #define ED_ISOCH_OUT                          1
133 #define ED_BULK_OUT                           2
134 #define ED_INTERRUPT_OUT                      3
135 #define ED_CONTROL_BIDIR                      4
136 #define ED_ISOCH_IN                           5
137 #define ED_BULK_IN                            6
138 #define ED_INTERRUPT_IN                       7
139 
140 //
141 // 6.4.5 TRB Completion Codes
142 //
143 #define TRB_COMPLETION_INVALID                0
144 #define TRB_COMPLETION_SUCCESS                1
145 #define TRB_COMPLETION_DATA_BUFFER_ERROR      2
146 #define TRB_COMPLETION_BABBLE_ERROR           3
147 #define TRB_COMPLETION_USB_TRANSACTION_ERROR  4
148 #define TRB_COMPLETION_TRB_ERROR              5
149 #define TRB_COMPLETION_STALL_ERROR            6
150 #define TRB_COMPLETION_SHORT_PACKET           13
151 
152 //
153 // 6.4.6 TRB Types
154 //
155 #define TRB_TYPE_NORMAL                       1
156 #define TRB_TYPE_SETUP_STAGE                  2
157 #define TRB_TYPE_DATA_STAGE                   3
158 #define TRB_TYPE_STATUS_STAGE                 4
159 #define TRB_TYPE_ISOCH                        5
160 #define TRB_TYPE_LINK                         6
161 #define TRB_TYPE_EVENT_DATA                   7
162 #define TRB_TYPE_NO_OP                        8
163 #define TRB_TYPE_EN_SLOT                      9
164 #define TRB_TYPE_DIS_SLOT                     10
165 #define TRB_TYPE_ADDRESS_DEV                  11
166 #define TRB_TYPE_CON_ENDPOINT                 12
167 #define TRB_TYPE_EVALU_CONTXT                 13
168 #define TRB_TYPE_RESET_ENDPOINT               14
169 #define TRB_TYPE_STOP_ENDPOINT                15
170 #define TRB_TYPE_SET_TR_DEQUE                 16
171 #define TRB_TYPE_RESET_DEV                    17
172 #define TRB_TYPE_GET_PORT_BANW                21
173 #define TRB_TYPE_FORCE_HEADER                 22
174 #define TRB_TYPE_NO_OP_COMMAND                23
175 #define TRB_TYPE_TRANS_EVENT                  32
176 #define TRB_TYPE_COMMAND_COMPLT_EVENT         33
177 #define TRB_TYPE_PORT_STATUS_CHANGE_EVENT     34
178 #define TRB_TYPE_HOST_CONTROLLER_EVENT        37
179 #define TRB_TYPE_DEVICE_NOTIFI_EVENT          38
180 #define TRB_TYPE_MFINDEX_WRAP_EVENT           39
181 
182 //
183 // Convert millisecond to microsecond.
184 //
185 #define XHC_1_MILLISECOND                     (1000)
186 #define XHC_POLL_DELAY                        (1000)
187 #define XHC_GENERIC_TIMEOUT                   (10 * 1000)
188 
189 #define EFI_USB_SPEED_FULL                    0x0000  ///< 12 Mb/s, USB 1.1 OHCI and UHCI HC.
190 #define EFI_USB_SPEED_LOW                     0x0001  ///< 1 Mb/s, USB 1.1 OHCI and UHCI HC.
191 #define EFI_USB_SPEED_HIGH                    0x0002  ///< 480 Mb/s, USB 2.0 EHCI HC.
192 #define EFI_USB_SPEED_SUPER                   0x0003  ///< 4.8 Gb/s, USB 3.0 XHCI HC.
193 
194 //
195 // Transfer types, used in URB to identify the transfer type
196 //
197 #define XHC_CTRL_TRANSFER                     0x01
198 #define XHC_BULK_TRANSFER                     0x02
199 #define XHC_INT_TRANSFER_SYNC                 0x04
200 #define XHC_INT_TRANSFER_ASYNC                0x08
201 #define XHC_INT_ONLY_TRANSFER_ASYNC           0x10
202 
203 //
204 // USB Transfer Results
205 //
206 #define EFI_USB_NOERROR             0x00
207 #define EFI_USB_ERR_NOTEXECUTE      0x01
208 #define EFI_USB_ERR_STALL           0x02
209 #define EFI_USB_ERR_BUFFER          0x04
210 #define EFI_USB_ERR_BABBLE          0x08
211 #define EFI_USB_ERR_NAK             0x10
212 #define EFI_USB_ERR_CRC             0x20
213 #define EFI_USB_ERR_TIMEOUT         0x40
214 #define EFI_USB_ERR_BITSTUFF        0x80
215 #define EFI_USB_ERR_SYSTEM          0x100
216 
217 #pragma pack(1)
218 
219 //
220 // 7.6.9 OUT/IN EP Context: 64 bytes
221 // 7.6.9.2 When used by the DbC it is always a 64 byte data structure
222 //
223 typedef struct _ENDPOINT_CONTEXT_64 {
224   UINT32                  EPState:3;
225   UINT32                  RsvdZ1:5;
226   UINT32                  Mult:2;         // set to 0
227   UINT32                  MaxPStreams:5;  // set to 0
228   UINT32                  LSA:1;          // set to 0
229   UINT32                  Interval:8;     // set to 0
230   UINT32                  RsvdZ2:8;
231 
232   UINT32                  RsvdZ3:1;
233   UINT32                  CErr:2;
234   UINT32                  EPType:3;
235   UINT32                  RsvdZ4:1;
236   UINT32                  HID:1;          // set to 0
237   UINT32                  MaxBurstSize:8;
238   UINT32                  MaxPacketSize:16;
239 
240   UINT32                  PtrLo;
241 
242   UINT32                  PtrHi;
243 
244   UINT32                  AverageTRBLength:16;
245   UINT32                  MaxESITPayload:16;  // set to 0
246 
247   UINT32                  RsvdZ5;             // Reserved
248   UINT32                  RsvdZ6;
249   UINT32                  RsvdZ7;
250 
251   UINT32                  RsvdZ8;
252   UINT32                  RsvdZ9;
253   UINT32                  RsvdZ10;
254   UINT32                  RsvdZ11;
255 
256   UINT32                  RsvdZ12;
257   UINT32                  RsvdZ13;
258   UINT32                  RsvdZ14;
259   UINT32                  RsvdZ15;
260 } ENDPOINT_CONTEXT_64;
261 
262 //
263 // 6.4.1.1 Normal TRB: 16 bytes
264 // A Normal TRB is used in several ways; exclusively on Bulk and Interrupt Transfer Rings for normal and
265 // Scatter/Gather operations, to define additional data buffers for Scatter/Gather operations on Isoch Transfer
266 // Rings, and to define the Data stage information for Control Transfer Rings.
267 //
268 typedef struct _TRANSFER_TRB_NORMAL {
269   UINT32                  TRBPtrLo;
270 
271   UINT32                  TRBPtrHi;
272 
273   UINT32                  Length:17;
274   UINT32                  TDSize:5;
275   UINT32                  IntTarget:10;
276 
277   UINT32                  CycleBit:1;
278   UINT32                  ENT:1;
279   UINT32                  ISP:1;
280   UINT32                  NS:1;
281   UINT32                  CH:1;
282   UINT32                  IOC:1;
283   UINT32                  IDT:1;
284   UINT32                  RsvdZ1:2;
285   UINT32                  BEI:1;
286   UINT32                  Type:6;
287   UINT32                  RsvdZ2:16;
288 } TRANSFER_TRB_NORMAL;
289 
290 //
291 // 6.4.2.1 Transfer Event TRB: 16 bytes
292 // A Transfer Event provides the completion status associated with a Transfer TRB. Refer to section 4.11.3.1
293 // for more information on the use and operation of Transfer Events.
294 //
295 typedef struct _EVT_TRB_TRANSFER {
296   UINT32                  TRBPtrLo;
297 
298   UINT32                  TRBPtrHi;
299 
300   UINT32                  Length:24;
301   UINT32                  Completecode:8;
302 
303   UINT32                  CycleBit:1;
304   UINT32                  RsvdZ1:1;
305   UINT32                  ED:1;
306   UINT32                  RsvdZ2:7;
307   UINT32                  Type:6;
308   UINT32                  EndpointId:5;
309   UINT32                  RsvdZ3:3;
310   UINT32                  SlotId:8;
311 } EVT_TRB_TRANSFER;
312 
313 //
314 // 6.4.4.1 Link TRB: 16 bytes
315 // A Link TRB provides support for non-contiguous TRB Rings.
316 //
317 typedef struct _LINK_TRB {
318   UINT32                  PtrLo;
319 
320   UINT32                  PtrHi;
321 
322   UINT32                  RsvdZ1:22;
323   UINT32                  InterTarget:10;
324 
325   UINT32                  CycleBit:1;
326   UINT32                  TC:1;
327   UINT32                  RsvdZ2:2;
328   UINT32                  CH:1;
329   UINT32                  IOC:1;
330   UINT32                  RsvdZ3:4;
331   UINT32                  Type:6;
332   UINT32                  RsvdZ4:16;
333 } LINK_TRB;
334 
335 //
336 // TRB Template: 16 bytes
337 //
338 typedef struct _TRB_TEMPLATE {
339   UINT32                    Parameter1;
340 
341   UINT32                    Parameter2;
342 
343   UINT32                    Status;
344 
345   UINT32                    CycleBit:1;
346   UINT32                    RsvdZ1:9;
347   UINT32                    Type:6;
348   UINT32                    Control:16;
349 } TRB_TEMPLATE;
350 
351 //
352 // Refer to XHCI 6.5 Event Ring Segment Table: 16 bytes
353 //
354 typedef struct _EVENT_RING_SEG_TABLE_ENTRY {
355   UINT32                  PtrLo;
356   UINT32                  PtrHi;
357   UINT32                  RingTrbSize:16;
358   UINT32                  RsvdZ1:16;
359   UINT32                  RsvdZ2;
360 } EVENT_RING_SEG_TABLE_ENTRY;
361 
362 //
363 // Size: 40 bytes
364 //
365 typedef struct _EVENT_RING {
366   EFI_PHYSICAL_ADDRESS      ERSTBase;
367   EFI_PHYSICAL_ADDRESS      EventRingSeg0;
368   UINT32                    TrbNumber;
369   EFI_PHYSICAL_ADDRESS      EventRingEnqueue;
370   EFI_PHYSICAL_ADDRESS      EventRingDequeue;
371   UINT32                    EventRingCCS;
372 } EVENT_RING;
373 
374 // Size: 32 bytes
375 typedef struct _TRANSFER_RING {
376   EFI_PHYSICAL_ADDRESS      RingSeg0;
377   UINT32                    TrbNumber;
378   EFI_PHYSICAL_ADDRESS      RingEnqueue;
379   EFI_PHYSICAL_ADDRESS      RingDequeue;
380   UINT32                    RingPCS;
381 } TRANSFER_RING;
382 
383 //
384 // Size: 64 bytes
385 //
386 typedef struct _DBC_INFO_CONTEXT {
387   UINT64        String0DescAddress;
388   UINT64        ManufacturerStrDescAddress;
389   UINT64        ProductStrDescAddress;
390   UINT64        SerialNumberStrDescAddress;
391   UINT64        String0Length:8;
392   UINT64        ManufacturerStrLength:8;
393   UINT64        ProductStrLength:8;
394   UINT64        SerialNumberStrLength:8;
395   UINT64        RsvdZ1:32;
396   UINT64        RsvdZ2;
397   UINT64        RsvdZ3;
398   UINT64        RsvdZ4;
399 } DBC_INFO_CONTEXT;
400 
401 //
402 // Debug Capability Context Data Structure: 192 bytes
403 //
404 typedef struct _XHC_DC_CONTEXT {
405   DBC_INFO_CONTEXT      DbcInfoContext;
406   ENDPOINT_CONTEXT_64   EpOutContext;
407   ENDPOINT_CONTEXT_64   EpInContext;
408 } XHC_DC_CONTEXT;
409 
410 //
411 // Size: 16 bytes
412 //
413 typedef union _TRB {
414   TRB_TEMPLATE                TrbTemplate;
415   TRANSFER_TRB_NORMAL         TrbNormal;
416 } TRB;
417 
418 ///
419 /// USB data transfer direction
420 ///
421 typedef enum {
422   EfiUsbDataIn,
423   EfiUsbDataOut,
424   EfiUsbNoData
425 } EFI_USB_DATA_DIRECTION;
426 
427 //
428 // URB (Usb Request Block) contains information for all kinds of
429 // usb requests.
430 //
431 typedef struct _URB {
432   //
433   // Transfer data buffer
434   //
435   EFI_PHYSICAL_ADDRESS            Data;
436   UINT32                          DataLen;
437 
438   //
439   // Execute result
440   //
441   UINT32                          Result;
442   //
443   // Completed data length
444   //
445   UINT32                          Completed;
446   //
447   // Tranfer Ring info
448   //
449   EFI_PHYSICAL_ADDRESS            Ring;
450   EFI_PHYSICAL_ADDRESS            Trb;
451   BOOLEAN                         Finished;
452   EFI_USB_DATA_DIRECTION          Direction;
453 } URB;
454 
455 typedef struct _USB3_DEBUG_PORT_INSTANCE {
456   UINT8                                   Initialized;
457 
458   //
459   // The flag indicates debug device is ready
460   //
461   BOOLEAN                                 DebugSupport;
462 
463   //
464   // The flag indicates debug device is ready
465   //
466   BOOLEAN                                 Ready;
467 
468   //
469   // The flag indicates if USB 3.0 ports has been turn off/on power
470   //
471   BOOLEAN                                 ChangePortPower;
472 
473   //
474   // XHCI MMIO Base address
475   //
476   EFI_PHYSICAL_ADDRESS                    XhciMmioBase;
477 
478   //
479   // XHCI OP RegisterBase address
480   //
481   EFI_PHYSICAL_ADDRESS                    XhciOpRegister;
482 
483   //
484   // XHCI Debug Register Base Address
485   //
486   EFI_PHYSICAL_ADDRESS                    DebugCapabilityBase;
487 
488   //
489   // XHCI Debug Capability offset
490   //
491   UINT64                                  DebugCapabilityOffset;
492 
493   //
494   // XHCI Debug Context Address
495   //
496   EFI_PHYSICAL_ADDRESS                    DebugCapabilityContext;
497 
498   //
499   // Transfer Ring
500   //
501   TRANSFER_RING                           TransferRingOut;
502   TRANSFER_RING                           TransferRingIn;
503 
504   //
505   // EventRing
506   //
507   EVENT_RING                              EventRing;
508 
509   //
510   // URB - Read
511   //
512   URB                                     UrbOut;
513 
514   //
515   // URB - Write
516   //
517   URB                                     UrbIn;
518 
519   //
520   // The available data length in the following data buffer.
521   //
522   UINT8                                   DataCount;
523   //
524   // The data buffer address for data read and poll.
525   //
526   EFI_PHYSICAL_ADDRESS                    Data;
527 } USB3_DEBUG_PORT_HANDLE;
528 
529 #pragma pack()
530 
531 /**
532   Read XHCI debug register.
533 
534  @param  Handle        Debug port handle.
535   @param  Offset       The offset of the debug register.
536 
537   @return The register content read
538 
539 **/
540 UINT32
541 XhcReadDebugReg (
542   IN  USB3_DEBUG_PORT_HANDLE    *Handle,
543   IN  UINT32                      Offset
544   );
545 
546 /**
547   Set one bit of the debug register while keeping other bits.
548 
549   @param  Handle       Debug port handle.
550   @param  Offset       The offset of the debug register.
551   @param  Bit          The bit mask of the register to set.
552 
553 **/
554 VOID
555 XhcSetDebugRegBit (
556   IN USB3_DEBUG_PORT_HANDLE  *Handle,
557   IN UINT32                   Offset,
558   IN UINT32                   Bit
559   );
560 
561 /**
562   Write the data to the debug register.
563 
564   @param  Handle       Debug port handle.
565   @param  Offset       The offset of the debug register.
566   @param  Data         The data to write.
567 
568 **/
569 VOID
570 XhcWriteDebugReg (
571   IN USB3_DEBUG_PORT_HANDLE     *Handle,
572   IN UINT32                     Offset,
573   IN UINT32                     Data
574   );
575 
576 /**
577   Discover the USB3 debug device.
578 
579   @param  Handle                Debug port handle.
580 
581   @retval RETURN_SUCCESS        The serial device was initialized.
582   @retval RETURN_DEVICE_ERROR   The serial device could not be initialized.
583 
584 **/
585 RETURN_STATUS
586 DiscoverUsb3DebugPort(
587   USB3_DEBUG_PORT_HANDLE  *Handle
588   );
589 
590 /**
591   Initialize the Serial Device hardware.
592 
593   @param  Handle            Debug port handle.
594 
595   @retval RETURN_SUCCESS    The serial device was initialized successfully.
596   @retval !RETURN_SUCCESS   Error.
597 
598 **/
599 RETURN_STATUS
600 InitializeUsb3DebugPort (
601   USB3_DEBUG_PORT_HANDLE  *Handle
602   );
603 
604 /**
605   Return XHCI MMIO base address.
606 
607 **/
608 EFI_PHYSICAL_ADDRESS
609 GetXhciBaseAddress (
610   VOID
611   );
612 
613 /**
614   Verifies if the bit positions specified by a mask are set in a register.
615 
616   @param[in, out] Register    UNITN register
617   @param[in]      BitMask     32-bit mask
618 
619   @return  BOOLEAN  - TRUE  if all bits specified by the mask are enabled.
620                     - FALSE even if one of the bits specified by the mask
621                             is not enabled.
622 **/
623 BOOLEAN
624 XhcIsBitSet(
625   UINTN   Register,
626   UINT32  BitMask
627   );
628 
629 /**
630   Sets bits as per the enabled bit positions in the mask.
631 
632   @param[in, out] Register    UINTN register
633   @param[in]      BitMask     32-bit mask
634 **/
635 VOID
636 XhcSetR32Bit(
637   UINTN   Register,
638   UINT32  BitMask
639   );
640 
641 /**
642   Clears bits as per the enabled bit positions in the mask.
643 
644   @param[in, out] Register    UINTN register
645   @param[in]      BitMask     32-bit mask
646 **/
647 VOID
648 XhcClearR32Bit(
649   IN OUT  UINTN  Register,
650   IN      UINT32 BitMask
651   );
652 
653 /**
654   Initialize USB3 debug port.
655 
656   This method invokes various internal functions to facilitate
657   detection and initialization of USB3 debug port.
658 
659   @retval RETURN_SUCCESS        The serial device was initialized.
660 **/
661 RETURN_STATUS
662 EFIAPI
663 USB3Initialize (
664   VOID
665   );
666 
667 /**
668   Return command register value in XHCI controller.
669 
670 **/
671 UINT16
672 GetXhciPciCommand (
673   VOID
674   );
675 
676 /**
677   Allocate aligned memory for XHC's usage.
678 
679   @param  BufferSize      The size, in bytes, of the Buffer.
680 
681   @return A pointer to the allocated buffer or NULL if allocation fails.
682 
683 **/
684 VOID*
685 AllocateAlignBuffer (
686   IN UINTN                    BufferSize
687   );
688 
689 /**
690   The real function to initialize USB3 debug port.
691 
692   This method invokes various internal functions to facilitate
693   detection and initialization of USB3 debug port.
694 
695   @retval RETURN_SUCCESS        The serial device was initialized.
696 **/
697 RETURN_STATUS
698 EFIAPI
699 USB3InitializeReal (
700   VOID
701   );
702 
703 /**
704   Submits bulk transfer to a bulk endpoint of a USB device.
705 
706   @param  Handle                The instance of debug device.
707   @param  Direction             The direction of data transfer.
708   @param  Data                  Array of pointers to the buffers of data to transmit
709                                 from or receive into.
710   @param  DataLength            The lenght of the data buffer.
711   @param  Timeout               Indicates the maximum time, in millisecond, which
712                                 the transfer is allowed to complete.
713 
714   @retval EFI_SUCCESS           The transfer was completed successfully.
715   @retval EFI_OUT_OF_RESOURCES  The transfer failed due to lack of resource.
716   @retval EFI_INVALID_PARAMETER Some parameters are invalid.
717   @retval EFI_TIMEOUT           The transfer failed due to timeout.
718   @retval EFI_DEVICE_ERROR      The transfer failed due to host controller error.
719 
720 **/
721 EFI_STATUS
722 EFIAPI
723 XhcDataTransfer (
724   IN     USB3_DEBUG_PORT_HANDLE              *Handle,
725   IN     EFI_USB_DATA_DIRECTION              Direction,
726   IN OUT VOID                                *Data,
727   IN OUT UINTN                               *DataLength,
728   IN     UINTN                               Timeout
729   );
730 
731 #endif //__SERIAL_PORT_LIB_USB__
732