2 This file contains the definination for host controller
3 register operation routines.
5 Copyright (c) 2013-2015 Intel Corporation.
7 SPDX-License-Identifier: BSD-2-Clause-Patent
16 #define HC_STATE_RESET 0x0
17 #define HC_STATE_RESUME 0x1
18 #define HC_STATE_OPERATIONAL 0x2
19 #define HC_STATE_SUSPEND 0x3
21 #define PERIODIC_ENABLE 0x01
22 #define ISOCHRONOUS_ENABLE 0x02
23 #define CONTROL_ENABLE 0x04
24 #define BULK_ENABLE 0x08
25 #define CONTROL_BULK_RATIO 0x10
27 #define HC_FUNCTIONAL_STATE 0x20
28 #define INTERRUPT_ROUTING 0x40
31 #define CONTROL_LIST_FILLED 0x02
32 #define BULK_LIST_FILLED 0x04
33 #define CHANGE_OWNER_REQUEST 0x08
35 #define SCHEDULE_OVERRUN_COUNT 0x10
37 #define SCHEDULE_OVERRUN 0x00001
38 #define WRITEBACK_DONE_HEAD 0x00002
39 #define START_OF_FRAME 0x00004
40 #define RESUME_DETECT 0x00008
41 #define UNRECOVERABLE_ERROR 0x00010
42 #define FRAME_NUMBER_OVERFLOW 0x00020
43 #define ROOTHUB_STATUS_CHANGE 0x00040
44 #define OWNERSHIP_CHANGE 0x00080
46 #define MASTER_INTERRUPT 0x00400
48 #define CONTROL_HEAD 0x001
49 #define BULK_HEAD 0x002
50 #define DONE_HEAD 0x004
53 #define Hc_PERIODIC_CURRENT 0x002
54 #define Hc_CONTOL_HEAD 0x004
55 #define Hc_CONTROL_CURRENT_PTR 0x008
56 #define Hc_BULK_HEAD 0x010
57 #define Hc_BULK_CURRENT_PTR 0x020
58 #define Hc_DONE_HEAD 0x040
60 #define FRAME_INTERVAL 0x008
61 #define FS_LARGEST_DATA_PACKET 0x010
62 #define FRMINT_TOGGLE 0x020
63 #define FRAME_REMAINING 0x040
64 #define FRAME_REMAIN_TOGGLE 0x080
66 #define RH_DESC_A 0x00001
67 #define RH_DESC_B 0x00002
68 #define RH_NUM_DS_PORTS 0x00004
69 #define RH_NO_PSWITCH 0x00008
70 #define RH_PSWITCH_MODE 0x00010
71 #define RH_DEVICE_TYPE 0x00020
72 #define RH_OC_PROT_MODE 0x00040
73 #define RH_NOC_PROT 0x00080
74 #define RH_POTPGT 0x00100
75 #define RH_NO_POTPGT 0x00200
76 #define RH_DEV_REMOVABLE 0x00400
77 #define RH_PORT_PWR_CTRL_MASK 0x00800
79 #define RH_LOCAL_PSTAT 0x00001
80 #define RH_OC_ID 0x00002
81 #define RH_REMOTE_WK_ENABLE 0x00004
82 #define RH_LOCAL_PSTAT_CHANGE 0x00008
83 #define RH_OC_ID_CHANGE 0x00010
84 #define RH_CLR_RMT_WK_ENABLE 0x00020
86 #define RH_CLEAR_PORT_ENABLE 0x0001
87 #define RH_SET_PORT_ENABLE 0x0002
88 #define RH_SET_PORT_SUSPEND 0x0004
89 #define RH_CLEAR_SUSPEND_STATUS 0x0008
90 #define RH_SET_PORT_RESET 0x0010
91 #define RH_SET_PORT_POWER 0x0020
92 #define RH_CLEAR_PORT_POWER 0x0040
93 #define RH_CONNECT_STATUS_CHANGE 0x10000
94 #define RH_PORT_ENABLE_STAT_CHANGE 0x20000
95 #define RH_PORT_SUSPEND_STAT_CHANGE 0x40000
96 #define RH_OC_INDICATOR_CHANGE 0x80000
97 #define RH_PORT_RESET_STAT_CHANGE 0x100000
99 #define RH_CURR_CONNECT_STAT 0x0001
100 #define RH_PORT_ENABLE_STAT 0x0002
101 #define RH_PORT_SUSPEND_STAT 0x0004
102 #define RH_PORT_OC_INDICATOR 0x0008
103 #define RH_PORT_RESET_STAT 0x0010
104 #define RH_PORT_POWER_STAT 0x0020
105 #define RH_LSDEVICE_ATTACHED 0x0040
107 #define RESET_SYSTEM_BUS (1 << 0)
108 #define RESET_HOST_CONTROLLER (1 << 1)
109 #define RESET_CLOCK_GENERATION (1 << 2)
110 #define RESET_SSE_GLOBAL (1 << 5)
111 #define RESET_PSPL (1 << 6)
112 #define RESET_PCPL (1 << 7)
113 #define RESET_SSEP1 (1 << 9)
114 #define RESET_SSEP2 (1 << 10)
115 #define RESET_SSEP3 (1 << 11)
117 #define ONE_SECOND 1000000
118 #define ONE_MILLI_SEC 1000
119 #define MAX_BYTES_PER_TD 0x1000
120 #define MAX_RETRY_TIMES 100
121 #define PORT_NUMBER_ON_MAINSTONE2 1
125 // Operational Register Offsets
129 // Command & Status Registers Offsets
131 #define HC_REVISION 0x00
132 #define HC_CONTROL 0x04
133 #define HC_COMMAND_STATUS 0x08
134 #define HC_INTERRUPT_STATUS 0x0C
135 #define HC_INTERRUPT_ENABLE 0x10
136 #define HC_INTERRUPT_DISABLE 0x14
139 // Memory Pointer Offsets
142 #define HC_PERIODIC_CURRENT 0x1C
143 #define HC_CONTROL_HEAD 0x20
144 #define HC_CONTROL_CURRENT_PTR 0x24
145 #define HC_BULK_HEAD 0x28
146 #define HC_BULK_CURRENT_PTR 0x2C
147 #define HC_DONE_HEAD 0x30
150 // Frame Register Offsets
152 #define HC_FRM_INTERVAL 0x34
153 #define HC_FRM_REMAINING 0x38
154 #define HC_FRM_NUMBER 0x3C
155 #define HC_PERIODIC_START 0x40
156 #define HC_LS_THREASHOLD 0x44
159 // Root Hub Register Offsets
161 #define HC_RH_DESC_A 0x48
162 #define HC_RH_DESC_B 0x4C
163 #define HC_RH_STATUS 0x50
164 #define HC_RH_PORT_STATUS 0x54
166 #define USBHOST_OFFSET_UHCHR 0x64 // Usb Host reset register
168 #define OHC_BAR_INDEX 0
171 // Usb Host controller register offset
173 #define USBHOST_OFFSET_UHCREV 0x0 // Usb Host revision register
174 #define USBHOST_OFFSET_UHCHCON 0x4 // Usb Host control register
175 #define USBHOST_OFFSET_UHCCOMS 0x8 // Usb Host Command Status register
176 #define USBHOST_OFFSET_UHCINTS 0xC // Usb Host Interrupt Status register
177 #define USBHOST_OFFSET_UHCINTE 0x10 // Usb Host Interrupt Enable register
178 #define USBHOST_OFFSET_UHCINTD 0x14 // Usb Host Interrupt Disable register
179 #define USBHOST_OFFSET_UHCHCCA 0x18 // Usb Host Controller Communication Area
180 #define USBHOST_OFFSET_UHCPCED 0x1C // Usb Host Period Current Endpoint Descriptor
181 #define USBHOST_OFFSET_UHCCHED 0x20 // Usb Host Control Head Endpoint Descriptor
182 #define USBHOST_OFFSET_UHCCCED 0x24 // Usb Host Control Current Endpoint Descriptor
183 #define USBHOST_OFFSET_UHCBHED 0x28 // Usb Host Bulk Head Endpoint Descriptor
184 #define USBHOST_OFFSET_UHCBCED 0x2C // Usb Host Bulk Current Endpoint Descriptor
185 #define USBHOST_OFFSET_UHCDHEAD 0x30 // Usb Host Done Head register
186 #define USBHOST_OFFSET_UHCFMI 0x34 // Usb Host Frame Interval register
187 #define USBHOST_OFFSET_UHCFMR 0x38 // Usb Host Frame Remaining register
188 #define USBHOST_OFFSET_UHCFMN 0x3C // Usb Host Frame Number register
189 #define USBHOST_OFFSET_UHCPERS 0x40 // Usb Host Periodic Start register
190 #define USBHOST_OFFSET_UHCLST 0x44 // Usb Host Low-Speed Threshold register
191 #define USBHOST_OFFSET_UHCRHDA 0x48 // Usb Host Root Hub Descriptor A register
192 #define USBHOST_OFFSET_UHCRHDB 0x4C // Usb Host Root Hub Descriptor B register
193 #define USBHOST_OFFSET_UHCRHS 0x50 // Usb Host Root Hub Status register
194 #define USBHOST_OFFSET_UHCRHPS1 0x54 // Usb Host Root Hub Port Status 1 register
197 // Usb Host controller register bit fields
213 UINT32 ControlBulkRatio
:2;
214 UINT32 PeriodicEnable
:1;
215 UINT32 IsochronousEnable
:1;
216 UINT32 ControlEnable
:1;
218 UINT32 FunctionalState
:2;
219 UINT32 InterruptRouting
:1;
220 UINT32 RemoteWakeup
:1;
221 UINT32 RemoteWakeupEnable
:1;
227 UINT32 ControlListFilled
:1;
228 UINT32 BulkListFilled
:1;
229 UINT32 ChangeOwnerRequest
:1;
231 UINT32 ScheduleOverrunCount
:2;
236 UINT32 SchedulingOverrun
:1;
237 UINT32 WriteBackDone
:1;
239 UINT32 ResumeDetected
:1;
240 UINT32 UnrecoverableError
:1;
241 UINT32 FrameNumOverflow
:1;
242 UINT32 RHStatusChange
:1;
244 UINT32 OwnerChange
:1;
246 } HcINTERRUPT_STATUS
;
249 UINT32 SchedulingOverrunInt
:1;
250 UINT32 WriteBackDoneInt
:1;
252 UINT32 ResumeDetectedInt
:1;
253 UINT32 UnrecoverableErrorInt
:1;
254 UINT32 FrameNumOverflowInt
:1;
255 UINT32 RHStatusChangeInt
:1;
257 UINT32 OwnerChangedInt
:1;
258 UINT32 MasterInterruptEnable
:1;
259 } HcINTERRUPT_CONTROL
;
272 UINT32 FrameInterval
:14;
274 UINT32 FSMaxDataPacket
:15;
275 UINT32 FrmIntervalToggle
:1;
279 UINT32 FrameRemaining
:14;
281 UINT32 FrameRemainingToggle
:1;
285 UINT32 FrameNumber
:16;
290 UINT32 PeriodicStart
:14;
295 UINT32 LsThreshold
:12;
300 UINT32 NumDownStrmPorts
:8;
301 UINT32 PowerSwitchMode
:1;
302 UINT32 NoPowerSwitch
:1;
304 UINT32 OverCurrentProtMode
:1;
305 UINT32 NoOverCurrentProtMode
:1;
307 UINT32 PowerOnToPowerGoodTime
:8;
311 UINT32 DeviceRemovable
:16;
312 UINT32 PortPowerControlMask
:16;
316 UINT32 LocalPowerStat
:1;
317 UINT32 OverCurrentIndicator
:1;
319 UINT32 DevRemoteWakeupEnable
:1;
320 UINT32 LocalPowerStatChange
:1;
321 UINT32 OverCurrentIndicatorChange
:1;
323 UINT32 ClearRemoteWakeupEnable
:1;
327 UINT32 CurrentConnectStat
:1;
329 UINT32 SuspendStat
:1;
330 UINT32 OCIndicator
:1;
334 UINT32 LsDeviceAttached
:1;
336 UINT32 ConnectStatChange
:1;
337 UINT32 EnableStatChange
:1;
338 UINT32 SuspendStatChange
:1;
339 UINT32 OCIndicatorChange
:1;
340 UINT32 ResetStatChange
:1;
367 Get OHCI operational reg value
369 @param Ohc UHC private data
370 @param Offset Offset of the operational reg
372 @retval Value of the register
376 OhciGetOperationalReg (
377 IN USB_OHCI_HC_DEV
*Ohc
,
382 Set OHCI operational reg value
384 @param Ohc UHC private data
385 @param Offset Offset of the operational reg
386 @param Value Value to set
388 @retval EFI_SUCCESS Value set to the reg
392 OhciSetOperationalReg (
393 USB_OHCI_HC_DEV
*Ohc
,
399 Get HcRevision reg value
401 @param Ohc UHC private data
403 @retval Value of the register
415 Set HcReset reg value
417 @param Ohc UHC private data
418 @param Field Field to set
419 @param Value Value to set
421 @retval EFI_SUCCESS Value set
427 IN USB_OHCI_HC_DEV
*Ohc
,
433 Get specific field of HcReset reg value
435 @param Ohc UHC private data
436 @param Field Field to get
438 @retval Value of the field
444 IN USB_OHCI_HC_DEV
*Ohc
,
449 Set HcControl reg value
451 @param Ohc UHC private data
452 @param Field Field to set
453 @param Value Value to set
455 @retval EFI_SUCCESS Value set
461 IN USB_OHCI_HC_DEV
*Ohc
,
467 Get specific field of HcControl reg value
469 @param Ohc UHC private data
470 @param Field Field to get
472 @retval Value of the field
479 IN USB_OHCI_HC_DEV
*Ohc
,
484 Set HcCommand reg value
486 @param Ohc UHC private data
487 @param Field Field to set
488 @param Value Value to set
490 @retval EFI_SUCCESS Value set
495 OhciSetHcCommandStatus (
496 IN USB_OHCI_HC_DEV
*Ohc
,
502 Get specific field of HcCommand reg value
504 @param Ohc UHC private data
505 @param Field Field to get
507 @retval Value of the field
512 OhciGetHcCommandStatus (
513 IN USB_OHCI_HC_DEV
*Ohc
,
518 Clear specific fields of Interrupt Status
520 @param Ohc UHC private data
521 @param Field Field to clear
523 @retval EFI_SUCCESS Fields cleared
528 OhciClearInterruptStatus (
529 IN USB_OHCI_HC_DEV
*Ohc
,
534 Get fields of HcInterrupt reg value
536 @param Ohc UHC private data
537 @param Field Field to get
539 @retval Value of the field
544 OhciGetHcInterruptStatus (
545 IN USB_OHCI_HC_DEV
*Ohc
,
550 Set Interrupt Control reg value
552 @param Ohc UHC private data
553 @param StatEnable Enable or Disable
554 @param Field Field to set
555 @param Value Value to set
557 @retval EFI_SUCCESS Value set
562 OhciSetInterruptControl (
563 IN USB_OHCI_HC_DEV
*Ohc
,
564 IN BOOLEAN StatEnable
,
570 Get field of HcInterruptControl reg value
572 @param Ohc UHC private data
573 @param Field Field to get
575 @retval Value of the field
580 OhciGetHcInterruptControl (
581 IN USB_OHCI_HC_DEV
*Ohc
,
586 Set memory pointer of specific type
588 @param Ohc UHC private data
589 @param PointerType Type of the pointer to set
590 @param Value Value to set
592 @retval EFI_SUCCESS Memory pointer set
597 OhciSetMemoryPointer(
598 IN USB_OHCI_HC_DEV
*Ohc
,
599 IN UINTN PointerType
,
604 Get memory pointer of specific type
606 @param Ohc UHC private data
607 @param PointerType Type of pointer
609 @retval Memory pointer of the specific type
614 OhciGetMemoryPointer (
615 IN USB_OHCI_HC_DEV
*Ohc
,
620 Set Frame Interval value
622 @param Ohc UHC private data
623 @param Field Field to set
624 @param Value Value to set
626 @retval EFI_SUCCESS Value set
631 OhciSetFrameInterval (
632 IN USB_OHCI_HC_DEV
*Ohc
,
638 Get field of frame interval reg value
640 @param Ohc UHC private data
641 @param Field Field to get
643 @retval Value of the field
648 OhciGetFrameInterval (
649 IN USB_OHCI_HC_DEV
*Ohc
,
654 Set Frame Remaining reg value
656 @param Ohc UHC private data
657 @param Value Value to set
659 @retval EFI_SUCCESS Value set
664 OhciSetFrameRemaining (
665 IN USB_OHCI_HC_DEV
*Ohc
,
670 Get value of frame remaining reg
672 @param Ohc UHC private data
673 @param Field Field to get
675 @retval Value of frame remaining reg
679 OhciGetFrameRemaining (
680 IN USB_OHCI_HC_DEV
*Ohc
,
685 Set frame number reg value
687 @param Ohc UHC private data
688 @param Value Value to set
690 @retval EFI_SUCCESS Value set
696 IN USB_OHCI_HC_DEV
*Ohc
,
701 Get frame number reg value
703 @param Ohc UHC private data
705 @retval Value of frame number reg
711 IN USB_OHCI_HC_DEV
*Ohc
715 Set period start reg value
717 @param Ohc UHC private data
718 @param Value Value to set
720 @retval EFI_SUCCESS Value set
725 OhciSetPeriodicStart (
726 IN USB_OHCI_HC_DEV
*Ohc
,
731 Get periodic start reg value
733 @param Ohc UHC private data
735 @param Value of periodic start reg
740 OhciGetPeriodicStart (
741 IN USB_OHCI_HC_DEV
*Ohc
745 Set Ls Threshold reg value
747 @param Ohc UHC private data
748 @param Value Value to set
750 @retval EFI_SUCCESS Value set
756 IN USB_OHCI_HC_DEV
*Ohc
,
761 Get Ls Threshold reg value
763 @param Ohc UHC private data
765 @retval Value of Ls Threshold reg
771 IN USB_OHCI_HC_DEV
*Ohc
775 Set Root Hub Descriptor reg value
777 @param Ohc UHC private data
778 @param Field Field to set
779 @param Value Value to set
781 @retval EFI_SUCCESS Value set
785 OhciSetRootHubDescriptor (
786 IN USB_OHCI_HC_DEV
*Ohc
,
792 Get Root Hub Descriptor reg value
794 @param Ohc UHC private data
795 @param Field Field to get
797 @retval Value of the field
802 OhciGetRootHubDescriptor (
803 IN USB_OHCI_HC_DEV
*Ohc
,
808 Set Root Hub Status reg value
810 @param Ohc UHC private data
811 @param Field Field to set
813 @retval EFI_SUCCESS Value set
818 OhciSetRootHubStatus (
819 IN USB_OHCI_HC_DEV
*Ohc
,
824 Get Root Hub Status reg value
826 @param Ohc UHC private data
827 @param Field Field to get
829 @retval Value of the field
834 OhciGetRootHubStatus (
835 IN USB_OHCI_HC_DEV
*Ohc
,
840 Set Root Hub Port Status reg value
842 @param Ohc UHC private data
843 @param Index Index of the port
844 @param Field Field to set
846 @retval EFI_SUCCESS Value set
851 OhciSetRootHubPortStatus (
852 IN USB_OHCI_HC_DEV
*Ohc
,
858 Get Root Hub Port Status reg value
860 @param Ohc UHC private data
861 @param Index Index of the port
862 @param Field Field to get
864 @retval Value of the field and index
869 OhciReadRootHubPortStatus (
870 IN USB_OHCI_HC_DEV
*Ohc
,