xref: /openbsd/sys/dev/usb/ehcireg.h (revision 9d524485)
1*9d524485Skettenis /*	$OpenBSD: ehcireg.h,v 1.21 2016/10/02 06:36:39 kettenis Exp $ */
2d45175cfSderaadt /*	$NetBSD: ehcireg.h,v 1.17 2004/06/23 06:45:56 mycroft Exp $	*/
38e3f8616Sderaadt 
48e3f8616Sderaadt /*
5532eeba4Smglocker  * Copyright (c) 2001, 2004 The NetBSD Foundation, Inc.
68e3f8616Sderaadt  * All rights reserved.
78e3f8616Sderaadt  *
88e3f8616Sderaadt  * This code is derived from software contributed to The NetBSD Foundation
98e3f8616Sderaadt  * by Lennart Augustsson (lennart@augustsson.net).
108e3f8616Sderaadt  *
118e3f8616Sderaadt  * Redistribution and use in source and binary forms, with or without
128e3f8616Sderaadt  * modification, are permitted provided that the following conditions
138e3f8616Sderaadt  * are met:
148e3f8616Sderaadt  * 1. Redistributions of source code must retain the above copyright
158e3f8616Sderaadt  *    notice, this list of conditions and the following disclaimer.
168e3f8616Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
178e3f8616Sderaadt  *    notice, this list of conditions and the following disclaimer in the
188e3f8616Sderaadt  *    documentation and/or other materials provided with the distribution.
198e3f8616Sderaadt  *
208e3f8616Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
218e3f8616Sderaadt  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
228e3f8616Sderaadt  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
238e3f8616Sderaadt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
248e3f8616Sderaadt  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
258e3f8616Sderaadt  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
268e3f8616Sderaadt  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
278e3f8616Sderaadt  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
288e3f8616Sderaadt  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
298e3f8616Sderaadt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
308e3f8616Sderaadt  * POSSIBILITY OF SUCH DAMAGE.
318e3f8616Sderaadt  */
328e3f8616Sderaadt 
338e3f8616Sderaadt #ifndef _DEV_PCI_EHCIREG_H_
348e3f8616Sderaadt #define _DEV_PCI_EHCIREG_H_
358e3f8616Sderaadt 
368e3f8616Sderaadt /*** PCI config registers ***/
378e3f8616Sderaadt 
388e3f8616Sderaadt #define PCI_CBMEM		0x10	/* configuration base MEM */
398e3f8616Sderaadt 
408e3f8616Sderaadt #define PCI_INTERFACE_EHCI	0x20
418e3f8616Sderaadt 
428e3f8616Sderaadt #define PCI_USBREV		0x60	/* RO USB protocol revision */
438e3f8616Sderaadt #define  PCI_USBREV_MASK	0xff
448e3f8616Sderaadt #define  PCI_USBREV_PRE_1_0	0x00
458e3f8616Sderaadt #define  PCI_USBREV_1_0		0x10
468e3f8616Sderaadt #define  PCI_USBREV_1_1		0x11
478e3f8616Sderaadt #define  PCI_USBREV_2_0		0x20
488e3f8616Sderaadt 
498e3f8616Sderaadt #define PCI_EHCI_FLADJ		0x61	/*RW Frame len adj, SOF=59488+6*fladj */
508e3f8616Sderaadt 
518e3f8616Sderaadt #define PCI_EHCI_PORTWAKECAP	0x62	/* RW Port wake caps (opt)  */
528e3f8616Sderaadt 
539ad4efa2Sdlg /* EHCI Extended Capabilities */
549ad4efa2Sdlg #define EHCI_EC_LEGSUP		0x01
559ad4efa2Sdlg 
569ad4efa2Sdlg #define EHCI_EECP_NEXT(x)	(((x) >> 8) & 0xff)
579ad4efa2Sdlg #define EHCI_EECP_ID(x)		((x) & 0xff)
589ad4efa2Sdlg 
597a4d0cfeSfgsch #define EHCI_LEGSUP_LEGSUP	0x00
609ad4efa2Sdlg #define  EHCI_LEGSUP_OSOWNED	0x01000000 /* OS owned semaphore */
619ad4efa2Sdlg #define  EHCI_LEGSUP_BIOSOWNED	0x00010000 /* BIOS owned semaphore */
629ad4efa2Sdlg #define PCI_LEGSUP_USBLEGCTLSTS	0x04
638e3f8616Sderaadt 
648e3f8616Sderaadt /*** EHCI capability registers ***/
658e3f8616Sderaadt 
668e3f8616Sderaadt #define EHCI_CAPLENGTH		0x00	/*RO Capability register length field */
678e3f8616Sderaadt /* reserved			0x01 */
688e3f8616Sderaadt #define EHCI_HCIVERSION		0x02	/* RO Interface version number */
698e3f8616Sderaadt 
708e3f8616Sderaadt #define EHCI_HCSPARAMS		0x04	/* RO Structural parameters */
718e3f8616Sderaadt #define  EHCI_HCS_DEBUGPORT(x)	(((x) >> 20) & 0xf)
72f686c0b7Sderaadt #define  EHCI_HCS_P_INDICATOR(x) ((x) & 0x10000)
738e3f8616Sderaadt #define  EHCI_HCS_N_CC(x)	(((x) >> 12) & 0xf) /* # of companion ctlrs */
748e3f8616Sderaadt #define  EHCI_HCS_N_PCC(x)	(((x) >> 8) & 0xf) /* # of ports per comp. */
75e7c12299Sderaadt #define  EHCI_HCS_PRR(x)	((x) & 0x80) /* port routing rules */
768e3f8616Sderaadt #define  EHCI_HCS_PPC(x)	((x) & 0x10) /* port power control */
778e3f8616Sderaadt #define  EHCI_HCS_N_PORTS(x)	((x) & 0xf) /* # of ports */
788e3f8616Sderaadt 
798e3f8616Sderaadt #define EHCI_HCCPARAMS		0x08	/* RO Capability parameters */
808e3f8616Sderaadt #define  EHCI_HCC_EECP(x)	(((x) >> 8) & 0xff) /* extended ports caps */
818e3f8616Sderaadt #define  EHCI_HCC_IST(x)	(((x) >> 4) & 0xf) /* isoc sched threshold */
828e3f8616Sderaadt #define  EHCI_HCC_ASPC(x)	((x) & 0x4) /* async sched park cap */
838e3f8616Sderaadt #define  EHCI_HCC_PFLF(x)	((x) & 0x2) /* prog frame list flag */
848e3f8616Sderaadt #define  EHCI_HCC_64BIT(x)	((x) & 0x1) /* 64 bit address cap */
858e3f8616Sderaadt 
868e3f8616Sderaadt #define EHCI_HCSP_PORTROUTE	0x0c	/*RO Companion port route description */
878e3f8616Sderaadt 
888e3f8616Sderaadt /* EHCI operational registers.  Offset given by EHCI_CAPLENGTH register */
898e3f8616Sderaadt #define EHCI_USBCMD		0x00	/* RO, RW, WO Command register */
908e3f8616Sderaadt #define  EHCI_CMD_ITC_M		0x00ff0000 /* RW interrupt threshold ctrl */
918e3f8616Sderaadt #define   EHCI_CMD_ITC_1	0x00010000
928e3f8616Sderaadt #define   EHCI_CMD_ITC_2	0x00020000
938e3f8616Sderaadt #define   EHCI_CMD_ITC_4	0x00040000
948e3f8616Sderaadt #define   EHCI_CMD_ITC_8	0x00080000
958e3f8616Sderaadt #define   EHCI_CMD_ITC_16	0x00100000
968e3f8616Sderaadt #define   EHCI_CMD_ITC_32	0x00200000
978e3f8616Sderaadt #define   EHCI_CMD_ITC_64	0x00400000
988e3f8616Sderaadt #define  EHCI_CMD_ASPME		0x00000800 /* RW/RO async park enable */
998e3f8616Sderaadt #define  EHCI_CMD_ASPMC		0x00000300 /* RW/RO async park count */
1008e3f8616Sderaadt #define  EHCI_CMD_LHCR		0x00000080 /* RW light host ctrl reset */
1018e3f8616Sderaadt #define  EHCI_CMD_IAAD		0x00000040 /* RW intr on async adv door bell */
1028e3f8616Sderaadt #define  EHCI_CMD_ASE		0x00000020 /* RW async sched enable */
1038e3f8616Sderaadt #define  EHCI_CMD_PSE		0x00000010 /* RW periodic sched enable */
1048e3f8616Sderaadt #define  EHCI_CMD_FLS_M		0x0000000c /* RW/RO frame list size */
1058e3f8616Sderaadt #define  EHCI_CMD_FLS(x)	(((x) >> 2) & 3) /* RW/RO frame list size */
1068e3f8616Sderaadt #define  EHCI_CMD_HCRESET	0x00000002 /* RW reset */
1078e3f8616Sderaadt #define  EHCI_CMD_RS		0x00000001 /* RW run/stop */
1088e3f8616Sderaadt 
1098e3f8616Sderaadt #define EHCI_USBSTS		0x04	/* RO, RW, RWC Status register */
1108e3f8616Sderaadt #define  EHCI_STS_ASS		0x00008000 /* RO async sched status */
1118e3f8616Sderaadt #define  EHCI_STS_PSS		0x00004000 /* RO periodic sched status */
1128e3f8616Sderaadt #define  EHCI_STS_REC		0x00002000 /* RO reclamation */
1138e3f8616Sderaadt #define  EHCI_STS_HCH		0x00001000 /* RO host controller halted */
1148e3f8616Sderaadt #define  EHCI_STS_IAA		0x00000020 /* RWC interrupt on async adv */
1158e3f8616Sderaadt #define  EHCI_STS_HSE		0x00000010 /* RWC host system error */
1168e3f8616Sderaadt #define  EHCI_STS_FLR		0x00000008 /* RWC frame list rollover */
1178e3f8616Sderaadt #define  EHCI_STS_PCD		0x00000004 /* RWC port change detect */
1188e3f8616Sderaadt #define  EHCI_STS_ERRINT	0x00000002 /* RWC error interrupt */
1198e3f8616Sderaadt #define  EHCI_STS_INT		0x00000001 /* RWC interrupt */
1208e3f8616Sderaadt #define  EHCI_STS_INTRS(x)	((x) & 0x3f)
1218e3f8616Sderaadt 
1228e3f8616Sderaadt #define EHCI_NORMAL_INTRS (EHCI_STS_IAA | EHCI_STS_HSE | EHCI_STS_PCD | EHCI_STS_ERRINT | EHCI_STS_INT)
1238e3f8616Sderaadt 
1248e3f8616Sderaadt #define EHCI_USBINTR		0x08	/* RW Interrupt register */
1258e3f8616Sderaadt #define EHCI_INTR_IAAE		0x00000020 /* interrupt on async advance ena */
1268e3f8616Sderaadt #define EHCI_INTR_HSEE		0x00000010 /* host system error ena */
1278e3f8616Sderaadt #define EHCI_INTR_FLRE		0x00000008 /* frame list rollover ena */
1288e3f8616Sderaadt #define EHCI_INTR_PCIE		0x00000004 /* port change ena */
1298e3f8616Sderaadt #define EHCI_INTR_UEIE		0x00000002 /* USB error intr ena */
1308e3f8616Sderaadt #define EHCI_INTR_UIE		0x00000001 /* USB intr ena */
1318e3f8616Sderaadt 
1328e3f8616Sderaadt #define EHCI_FRINDEX		0x0c	/* RW Frame Index register */
1338e3f8616Sderaadt 
1348e3f8616Sderaadt #define EHCI_CTRLDSSEGMENT	0x10	/* RW Control Data Structure Segment */
1358e3f8616Sderaadt 
1368e3f8616Sderaadt #define EHCI_PERIODICLISTBASE	0x14	/* RW Periodic List Base */
1378e3f8616Sderaadt #define EHCI_ASYNCLISTADDR	0x18	/* RW Async List Base */
1388e3f8616Sderaadt 
1398e3f8616Sderaadt #define EHCI_CONFIGFLAG		0x40	/* RW Configure Flag register */
1408e3f8616Sderaadt #define  EHCI_CONF_CF		0x00000001 /* RW configure flag */
1418e3f8616Sderaadt 
1428e3f8616Sderaadt #define EHCI_PORTSC(n)		(0x40+4*(n)) /* RO, RW, RWC Port Status reg */
1438e3f8616Sderaadt #define  EHCI_PS_WKOC_E		0x00400000 /* RW wake on over current ena */
1448e3f8616Sderaadt #define  EHCI_PS_WKDSCNNT_E	0x00200000 /* RW wake on disconnect ena */
1458e3f8616Sderaadt #define  EHCI_PS_WKCNNT_E	0x00100000 /* RW wake on connect ena */
1468e3f8616Sderaadt #define  EHCI_PS_PTC		0x000f0000 /* RW port test control */
1478e3f8616Sderaadt #define  EHCI_PS_PIC		0x0000c000 /* RW port indicator control */
1488e3f8616Sderaadt #define  EHCI_PS_PO		0x00002000 /* RW port owner */
1498e3f8616Sderaadt #define  EHCI_PS_PP		0x00001000 /* RW,RO port power */
1508e3f8616Sderaadt #define  EHCI_PS_LS		0x00000c00 /* RO line status */
1518e3f8616Sderaadt #define  EHCI_PS_IS_LOWSPEED(x)	(((x) & EHCI_PS_LS) == 0x00000400)
1528e3f8616Sderaadt #define  EHCI_PS_PR		0x00000100 /* RW port reset */
1538e3f8616Sderaadt #define  EHCI_PS_SUSP		0x00000080 /* RW suspend */
1548e3f8616Sderaadt #define  EHCI_PS_FPR		0x00000040 /* RW force port resume */
1558e3f8616Sderaadt #define  EHCI_PS_OCC		0x00000020 /* RWC over current change */
1568e3f8616Sderaadt #define  EHCI_PS_OCA		0x00000010 /* RO over current active */
1578e3f8616Sderaadt #define  EHCI_PS_PEC		0x00000008 /* RWC port enable change */
1588e3f8616Sderaadt #define  EHCI_PS_PE		0x00000004 /* RW port enable */
1598e3f8616Sderaadt #define  EHCI_PS_CSC		0x00000002 /* RWC connect status change */
1608e3f8616Sderaadt #define  EHCI_PS_CS		0x00000001 /* RO connect status */
1618e3f8616Sderaadt #define  EHCI_PS_CLEAR		(EHCI_PS_OCC|EHCI_PS_PEC|EHCI_PS_CSC)
1628e3f8616Sderaadt 
1638e3f8616Sderaadt #define EHCI_PORT_RESET_COMPLETE 2 /* ms */
1648e3f8616Sderaadt 
165*9d524485Skettenis /* Nonstandard register to set controller mode. */
166*9d524485Skettenis #define EHCI_USBMODE		0x68
167*9d524485Skettenis #define  EHCI_USBMODE_CM_M	0x00000003
168*9d524485Skettenis #define  EHCI_USBMODE_CM_IDLE	0x00000000
169*9d524485Skettenis #define  EHCI_USBMODE_CM_DEVICE	0x00000002
170*9d524485Skettenis #define  EHCI_USBMODE_CM_HOST	0x00000003
171*9d524485Skettenis 
1728e3f8616Sderaadt #define EHCI_FLALIGN_ALIGN	0x1000
1738e3f8616Sderaadt 
1748e3f8616Sderaadt /* No data structure may cross a page boundary. */
1758e3f8616Sderaadt #define EHCI_PAGE_SIZE		0x1000
1768e3f8616Sderaadt #define EHCI_PAGE(x)		((x) &~ 0xfff)
1778e3f8616Sderaadt #define EHCI_PAGE_OFFSET(x)	((x) & 0xfff)
1788e3f8616Sderaadt 
1798e3f8616Sderaadt typedef u_int32_t ehci_link_t;
1808e3f8616Sderaadt #define EHCI_LINK_TERMINATE	0x00000001
1818e3f8616Sderaadt #define EHCI_LINK_TYPE(x)	((x) & 0x00000006)
1828e3f8616Sderaadt #define  EHCI_LINK_ITD		0x0
1838e3f8616Sderaadt #define  EHCI_LINK_QH		0x2
1848e3f8616Sderaadt #define  EHCI_LINK_SITD		0x4
1858e3f8616Sderaadt #define  EHCI_LINK_FSTN		0x6
1868e3f8616Sderaadt #define EHCI_LINK_ADDR(x)	((x) &~ 0x1f)
1878e3f8616Sderaadt 
1888e3f8616Sderaadt typedef u_int32_t ehci_physaddr_t;
189532eeba4Smglocker typedef u_int32_t ehci_isoc_trans_t;
190532eeba4Smglocker typedef u_int32_t ehci_isoc_bufr_ptr_t;
1910189abdaSdlg #define	EHCI_BUFPTR_MASK	0xfffff000
1928e3f8616Sderaadt 
1938e3f8616Sderaadt /* Isochronous Transfer Descriptor */
1944502485dSderaadt #define EHCI_ITD_NTRANS		8
1954502485dSderaadt #define EHCI_ITD_NBUFFERS	7
196ab0b1be7Smglocker struct ehci_itd {
197532eeba4Smglocker 	volatile ehci_link_t            itd_next;
198532eeba4Smglocker 	volatile ehci_isoc_trans_t      itd_ctl[8];
199532eeba4Smglocker #define EHCI_ITD_GET_STATUS(x)	(((x) >> 28) & 0xf)
200532eeba4Smglocker #define EHCI_ITD_SET_STATUS(x)	(((x) & 0xf) << 28)
201532eeba4Smglocker #define EHCI_ITD_ACTIVE		0x80000000
202532eeba4Smglocker #define EHCI_ITD_BUF_ERR	0x40000000
203532eeba4Smglocker #define EHCI_ITD_BABBLE		0x20000000
204532eeba4Smglocker #define EHCI_ITD_ERROR		0x10000000
205532eeba4Smglocker #define EHCI_ITD_GET_LEN(x)	(((x) >> 16) & 0xfff)
206532eeba4Smglocker #define EHCI_ITD_SET_LEN(x)	(((x) & 0xfff) << 16)
207532eeba4Smglocker #define EHCI_ITD_IOC		0x8000
208532eeba4Smglocker #define EHCI_ITD_GET_IOC(x)	(((x) >> 15) & 1)
209532eeba4Smglocker #define EHCI_ITD_SET_IOC(x)	(((x) << 15) & EHCI_ITD_IOC)
210b9156f65Smglocker #define EHCI_ITD_GET_PG(x)	(((x) >> 12) & 0x7)
211b9156f65Smglocker #define EHCI_ITD_SET_PG(x)	(((x) & 0x7) << 12)
212532eeba4Smglocker #define EHCI_ITD_GET_OFFS(x)	(((x) >> 0) & 0xfff)
213532eeba4Smglocker #define EHCI_ITD_SET_OFFS(x)	(((x) & 0xfff) << 0)
214532eeba4Smglocker 	volatile ehci_isoc_bufr_ptr_t   itd_bufr[7];
215f0ce5612Smpi #define EHCI_ITD_GET_ENDPT(x)	(((x) >> 8) & 0xf)
216f0ce5612Smpi #define EHCI_ITD_SET_ENDPT(x)	(((x) & 0xf) << 8)
217532eeba4Smglocker #define EHCI_ITD_GET_DADDR(x)	((x) & 0x7f)
218532eeba4Smglocker #define EHCI_ITD_SET_DADDR(x)	((x) & 0x7f)
219532eeba4Smglocker #define EHCI_ITD_GET_DIR(x)	(((x) >> 11) & 1)
220532eeba4Smglocker #define EHCI_ITD_SET_DIR(x)	(((x) & 1) << 11)
221532eeba4Smglocker #define EHCI_ITD_GET_MAXPKT(x)	((x) & 0x7ff)
222532eeba4Smglocker #define EHCI_ITD_SET_MAXPKT(x)	((x) & 0x7ff)
223532eeba4Smglocker #define EHCI_ITD_GET_MULTI(x)	((x) & 0x3)
224532eeba4Smglocker #define EHCI_ITD_SET_MULTI(x)	((x) & 0x3)
225b9156f65Smglocker 	volatile ehci_isoc_bufr_ptr_t	itd_bufr_hi[7];
226ab0b1be7Smglocker };
2278e3f8616Sderaadt #define EHCI_ITD_ALIGN		32
2288e3f8616Sderaadt 
2298e3f8616Sderaadt /* Split Transaction Isochronous Transfer Descriptor */
230ab0b1be7Smglocker struct ehci_sitd {
231f0ce5612Smpi 	volatile ehci_link_t		sitd_next;
232f0ce5612Smpi 	volatile u_int32_t		sitd_endp;
2330189abdaSdlg #define EHCI_SITD_GET_ADDR(x)	(((x) >>  0) & 0x7f) /* endpoint addr */
2340189abdaSdlg #define EHCI_SITD_SET_ADDR(x)	(x)
2350189abdaSdlg #define EHCI_SITD_GET_ENDPT(x)	(((x) >>  8) & 0xf) /* endpoint no */
2360189abdaSdlg #define EHCI_SITD_SET_ENDPT(x)	((x) <<  8)
2370189abdaSdlg #define EHCI_SITD_GET_HUBA(x)	(((x) >> 16) & 0x7f) /* hub address */
2380189abdaSdlg #define EHCI_SITD_SET_HUBA(x)	((x) << 16)
2394502485dSderaadt #define EHCI_SITD_GET_PORT(x)	(((x) >> 23) & 0x7f) /* hub port */
2404502485dSderaadt #define EHCI_SITD_SET_PORT(x)	((x) << 23)
2416297d786Seric #define EHCI_SITD_GET_DIR(x)	(((x) >> 31) & 0x1) /* direction */
2426297d786Seric #define EHCI_SITD_SET_DIR(x)	((x) << 31)
243f0ce5612Smpi 	volatile u_int32_t		sitd_sched;
2446297d786Seric #define EHCI_SITD_GET_SMASK(x)	(((x) >>  0) & 0xff) /* intr sched mask */
2456297d786Seric #define EHCI_SITD_SET_SMASK(x)	((x) <<  0)
2466297d786Seric #define EHCI_SITD_GET_CMASK(x)	(((x) >>  8) & 0xff) /* split completion mask */
2476297d786Seric #define EHCI_SITD_SET_CMASK(x)	((x) <<  8)
248f0ce5612Smpi 	volatile u_int32_t		sitd_trans;
249f0ce5612Smpi #define  EHCI_SITD_IOC		0x80000000
2504502485dSderaadt #define  EHCI_SITD_ACTIVE	0x80
2514502485dSderaadt #define  EHCI_SITD_ERR		0x40
2524502485dSderaadt #define  EHCI_SITD_BUFERR	0x20
2534502485dSderaadt #define  EHCI_SITD_BABBLE	0x10
2544502485dSderaadt #define  EHCI_SITD_XACTERR	0x08
2554502485dSderaadt #define  EHCI_SITD_MISSEDMICRO	0x04
2564502485dSderaadt #define  EHCI_SITD_SPLITXSTATE	0x02
257f0ce5612Smpi #define EHCI_SITD_GET_LEN(x)	(((x) >> 16) & 0x3ff) /* bytes to transfer */
258f0ce5612Smpi #define EHCI_SITD_SET_LEN(x)	(((x) & 0x3ff) << 16)
2594502485dSderaadt #define EHCI_SITD_GET_PG(x)	(((x) >> 30) & 0x1) /* buffer page */
2604502485dSderaadt #define EHCI_SITD_SET_PG(x)	((x) << 30)
261f0ce5612Smpi 	volatile ehci_physaddr_t	sitd_bufr[2];
2626297d786Seric #define EHCI_SITD_GET_TCOUNT(x)	(((x) >>  0) & 0x7) /* transaction count */
2636297d786Seric #define EHCI_SITD_SET_TCOUNT(x)	((x) << 0)
2644502485dSderaadt #define EHCI_SITD_GET_TP(x)	(((x) >>  3) & 0x3) /* transaction position */
2654502485dSderaadt #define EHCI_SITD_SET_TP(x)	((x) <<  3)
2664502485dSderaadt #define  EHCI_SITD_TP_ALL	0x0
2674502485dSderaadt #define  EHCI_SITD_TP_BEGIN	0x1
2684502485dSderaadt #define  EHCI_SITD_TP_MIDDLE	0x2
2694502485dSderaadt #define  EHCI_SITD_TP_END	0x3
270f0ce5612Smpi 	volatile ehci_link_t		sitd_back;
271f0ce5612Smpi 	volatile ehci_physaddr_t	sitd_bufr_hi[2]; /* 64bit */
272ab0b1be7Smglocker };
2738e3f8616Sderaadt #define EHCI_SITD_ALIGN		32
2748e3f8616Sderaadt 
2758e3f8616Sderaadt /* Queue Element Transfer Descriptor */
2768e3f8616Sderaadt #define EHCI_QTD_NBUFFERS	5
277ab0b1be7Smglocker struct ehci_qtd {
2788e3f8616Sderaadt 	ehci_link_t	qtd_next;
2798e3f8616Sderaadt 	ehci_link_t	qtd_altnext;
2808e3f8616Sderaadt 	u_int32_t	qtd_status;
2818e3f8616Sderaadt #define EHCI_QTD_GET_STATUS(x)	(((x) >>  0) & 0xff)
282c8ad0228Sdlg #define EHCI_QTD_SET_STATUS(x)	((x) << 0)
2838e3f8616Sderaadt #define  EHCI_QTD_ACTIVE	0x80
2848e3f8616Sderaadt #define  EHCI_QTD_HALTED	0x40
2858e3f8616Sderaadt #define  EHCI_QTD_BUFERR	0x20
2868e3f8616Sderaadt #define  EHCI_QTD_BABBLE	0x10
2878e3f8616Sderaadt #define  EHCI_QTD_XACTERR	0x08
2888e3f8616Sderaadt #define  EHCI_QTD_MISSEDMICRO	0x04
2898e3f8616Sderaadt #define  EHCI_QTD_SPLITXSTATE	0x02
2908e3f8616Sderaadt #define  EHCI_QTD_PINGSTATE	0x01
2918e3f8616Sderaadt #define  EHCI_QTD_STATERRS	0x7c
2928e3f8616Sderaadt #define EHCI_QTD_GET_PID(x)	(((x) >>  8) & 0x3)
2938e3f8616Sderaadt #define EHCI_QTD_SET_PID(x)	((x) <<  8)
2948e3f8616Sderaadt #define  EHCI_QTD_PID_OUT	0x0
2958e3f8616Sderaadt #define  EHCI_QTD_PID_IN	0x1
2968e3f8616Sderaadt #define  EHCI_QTD_PID_SETUP	0x2
2978e3f8616Sderaadt #define EHCI_QTD_GET_CERR(x)	(((x) >> 10) &  0x3)
2988e3f8616Sderaadt #define EHCI_QTD_SET_CERR(x)	((x) << 10)
2998e3f8616Sderaadt #define EHCI_QTD_GET_C_PAGE(x)	(((x) >> 12) &  0x7)
3008e3f8616Sderaadt #define EHCI_QTD_SET_C_PAGE(x)	((x) << 12)
3018e3f8616Sderaadt #define EHCI_QTD_GET_IOC(x)	(((x) >> 15) &  0x1)
3028e3f8616Sderaadt #define EHCI_QTD_IOC		0x00008000
3038e3f8616Sderaadt #define EHCI_QTD_GET_BYTES(x)	(((x) >> 16) &  0x7fff)
3048e3f8616Sderaadt #define EHCI_QTD_SET_BYTES(x)	((x) << 16)
3058e3f8616Sderaadt #define EHCI_QTD_GET_TOGGLE(x)	(((x) >> 31) &  0x1)
306e7c12299Sderaadt #define EHCI_QTD_SET_TOGGLE(x)	((x) << 31)
30711609460Sderaadt #define EHCI_QTD_TOGGLE_MASK	0x80000000
3088e3f8616Sderaadt 	ehci_physaddr_t	qtd_buffer[EHCI_QTD_NBUFFERS];
3098e3f8616Sderaadt 	ehci_physaddr_t qtd_buffer_hi[EHCI_QTD_NBUFFERS];
310ab0b1be7Smglocker };
3118e3f8616Sderaadt #define EHCI_QTD_ALIGN		32
3128e3f8616Sderaadt 
3138e3f8616Sderaadt /* Queue Head */
314ab0b1be7Smglocker struct ehci_qh {
3158e3f8616Sderaadt 	ehci_link_t	qh_link;
3168e3f8616Sderaadt 	u_int32_t	qh_endp;
3178e3f8616Sderaadt #define EHCI_QH_GET_ADDR(x)	(((x) >>  0) & 0x7f) /* endpoint addr */
3188e3f8616Sderaadt #define EHCI_QH_SET_ADDR(x)	(x)
3198e3f8616Sderaadt #define EHCI_QH_ADDRMASK	0x0000007f
3208e3f8616Sderaadt #define EHCI_QH_GET_INACT(x)	(((x) >>  7) & 0x01) /* inactivate on next */
3218e3f8616Sderaadt #define EHCI_QH_INACT		0x00000080
3228e3f8616Sderaadt #define EHCI_QH_GET_ENDPT(x)	(((x) >>  8) & 0x0f) /* endpoint no */
3238e3f8616Sderaadt #define EHCI_QH_SET_ENDPT(x)	((x) <<  8)
3248e3f8616Sderaadt #define EHCI_QH_GET_EPS(x)	(((x) >> 12) & 0x03) /* endpoint speed */
3258e3f8616Sderaadt #define EHCI_QH_SET_EPS(x)	((x) << 12)
3268e3f8616Sderaadt #define  EHCI_QH_SPEED_FULL	0x0
3278e3f8616Sderaadt #define  EHCI_QH_SPEED_LOW	0x1
3288e3f8616Sderaadt #define  EHCI_QH_SPEED_HIGH	0x2
3298e3f8616Sderaadt #define EHCI_QH_GET_DTC(x)	(((x) >> 14) & 0x01) /* data toggle control */
3308e3f8616Sderaadt #define EHCI_QH_DTC		0x00004000
3318e3f8616Sderaadt #define EHCI_QH_GET_HRECL(x)	(((x) >> 15) & 0x01) /* head of reclamation */
3328e3f8616Sderaadt #define EHCI_QH_HRECL		0x00008000
3338e3f8616Sderaadt #define EHCI_QH_GET_MPL(x)	(((x) >> 16) & 0x7ff) /* max packet len */
3348e3f8616Sderaadt #define EHCI_QH_SET_MPL(x)	((x) << 16)
335f686c0b7Sderaadt #define EHCI_QH_MPLMASK		0x07ff0000
336e7c12299Sderaadt #define EHCI_QH_GET_CTL(x)	(((x) >> 27) & 0x01) /* control endpoint */
3378e3f8616Sderaadt #define EHCI_QH_CTL		0x08000000
3388e3f8616Sderaadt #define EHCI_QH_GET_NRL(x)	(((x) >> 28) & 0x0f) /* NAK reload */
3398e3f8616Sderaadt #define EHCI_QH_SET_NRL(x)	((x) << 28)
3408e3f8616Sderaadt 	u_int32_t	qh_endphub;
3418e3f8616Sderaadt #define EHCI_QH_GET_SMASK(x)	(((x) >>  0) & 0xff) /* intr sched mask */
3428e3f8616Sderaadt #define EHCI_QH_SET_SMASK(x)	((x) <<  0)
3438e3f8616Sderaadt #define EHCI_QH_GET_CMASK(x)	(((x) >>  8) & 0xff) /* split completion mask */
3448e3f8616Sderaadt #define EHCI_QH_SET_CMASK(x)	((x) <<  8)
3458e3f8616Sderaadt #define EHCI_QH_GET_HUBA(x)	(((x) >> 16) & 0x7f) /* hub address */
3468e3f8616Sderaadt #define EHCI_QH_SET_HUBA(x)	((x) << 16)
3478e3f8616Sderaadt #define EHCI_QH_GET_PORT(x)	(((x) >> 23) & 0x7f) /* hub port */
3488e3f8616Sderaadt #define EHCI_QH_SET_PORT(x)	((x) << 23)
3498e3f8616Sderaadt #define EHCI_QH_GET_MULT(x)	(((x) >> 30) & 0x03) /* pipe multiplier */
3508e3f8616Sderaadt #define EHCI_QH_SET_MULT(x)	((x) << 30)
3518e3f8616Sderaadt 	ehci_link_t	qh_curqtd;
352ab0b1be7Smglocker 	struct ehci_qtd	qh_qtd;
353ab0b1be7Smglocker };
3548e3f8616Sderaadt #define EHCI_QH_ALIGN		32
3558e3f8616Sderaadt 
3568e3f8616Sderaadt /* Periodic Frame Span Traversal Node */
357ab0b1be7Smglocker struct ehci_fstn {
3588e3f8616Sderaadt 	ehci_link_t	fstn_link;
3598e3f8616Sderaadt 	ehci_link_t	fstn_back;
360ab0b1be7Smglocker };
3618e3f8616Sderaadt #define EHCI_FSTN_ALIGN		32
3628e3f8616Sderaadt 
3638e3f8616Sderaadt #endif /* _DEV_PCI_EHCIREG_H_ */
364