xref: /illumos-gate/usr/src/cmd/bhyve/pci_xhci.h (revision 32640292339b07090f10ce34d455f98711077343)
14c87aefeSPatrick Mooney /*-
2*32640292SAndy Fiddaman  * SPDX-License-Identifier: BSD-2-Clause
34c87aefeSPatrick Mooney  *
44c87aefeSPatrick Mooney  * Copyright (c) 2014 Leon Dang <ldang@nahannisys.com>
54c87aefeSPatrick Mooney  * All rights reserved.
64c87aefeSPatrick Mooney  *
74c87aefeSPatrick Mooney  * Redistribution and use in source and binary forms, with or without
84c87aefeSPatrick Mooney  * modification, are permitted provided that the following conditions
94c87aefeSPatrick Mooney  * are met:
104c87aefeSPatrick Mooney  * 1. Redistributions of source code must retain the above copyright
114c87aefeSPatrick Mooney  *    notice, this list of conditions and the following disclaimer.
124c87aefeSPatrick Mooney  * 2. Redistributions in binary form must reproduce the above copyright
134c87aefeSPatrick Mooney  *    notice, this list of conditions and the following disclaimer in the
144c87aefeSPatrick Mooney  *    documentation and/or other materials provided with the distribution.
154c87aefeSPatrick Mooney  *
164c87aefeSPatrick Mooney  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
174c87aefeSPatrick Mooney  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
184c87aefeSPatrick Mooney  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
194c87aefeSPatrick Mooney  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
204c87aefeSPatrick Mooney  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
214c87aefeSPatrick Mooney  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
224c87aefeSPatrick Mooney  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
234c87aefeSPatrick Mooney  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
244c87aefeSPatrick Mooney  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
254c87aefeSPatrick Mooney  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
264c87aefeSPatrick Mooney  * SUCH DAMAGE.
274c87aefeSPatrick Mooney  */
284c87aefeSPatrick Mooney 
294c87aefeSPatrick Mooney #ifndef	_PCI_XHCI_H_
304c87aefeSPatrick Mooney #define	_PCI_XHCI_H_
314c87aefeSPatrick Mooney 
324c87aefeSPatrick Mooney #define	PCI_USBREV		0x60	/* USB protocol revision */
334c87aefeSPatrick Mooney 
344c87aefeSPatrick Mooney 
354c87aefeSPatrick Mooney enum {					/* dsc_slotstate */
364c87aefeSPatrick Mooney 	XHCI_ST_DISABLED,
374c87aefeSPatrick Mooney 	XHCI_ST_ENABLED,
384c87aefeSPatrick Mooney 	XHCI_ST_DEFAULT,
394c87aefeSPatrick Mooney 	XHCI_ST_ADDRESSED,
404c87aefeSPatrick Mooney 	XHCI_ST_CONFIGURED,
414c87aefeSPatrick Mooney 	XHCI_ST_MAX
424c87aefeSPatrick Mooney };
434c87aefeSPatrick Mooney 
444c87aefeSPatrick Mooney enum {
454c87aefeSPatrick Mooney 	XHCI_ST_SLCTX_DISABLED,
464c87aefeSPatrick Mooney 	XHCI_ST_SLCTX_DEFAULT,
474c87aefeSPatrick Mooney 	XHCI_ST_SLCTX_ADDRESSED,
484c87aefeSPatrick Mooney 	XHCI_ST_SLCTX_CONFIGURED
494c87aefeSPatrick Mooney };
504c87aefeSPatrick Mooney 
514c87aefeSPatrick Mooney enum {
524c87aefeSPatrick Mooney 	XHCI_ST_EPCTX_DISABLED,
534c87aefeSPatrick Mooney 	XHCI_ST_EPCTX_RUNNING,
544c87aefeSPatrick Mooney 	XHCI_ST_EPCTX_HALTED,
554c87aefeSPatrick Mooney 	XHCI_ST_EPCTX_STOPPED,
564c87aefeSPatrick Mooney 	XHCI_ST_EPCTX_ERROR
574c87aefeSPatrick Mooney };
584c87aefeSPatrick Mooney 
594c87aefeSPatrick Mooney #define	XHCI_MAX_DEVICES	MIN(USB_MAX_DEVICES, 128)
604c87aefeSPatrick Mooney #define	XHCI_MAX_ENDPOINTS	32	/* hardcoded - do not change */
614c87aefeSPatrick Mooney #define	XHCI_MAX_SCRATCHPADS	32
624c87aefeSPatrick Mooney #define	XHCI_MAX_EVENTS		(16 * 13)
634c87aefeSPatrick Mooney #define	XHCI_MAX_COMMANDS	(16 * 1)
644c87aefeSPatrick Mooney #define	XHCI_MAX_RSEG		1
654c87aefeSPatrick Mooney #define	XHCI_MAX_TRANSFERS	4
664c87aefeSPatrick Mooney #if USB_MAX_EP_STREAMS == 8
674c87aefeSPatrick Mooney #define	XHCI_MAX_STREAMS	8
684c87aefeSPatrick Mooney #define	XHCI_MAX_STREAMS_LOG	3
694c87aefeSPatrick Mooney #elif USB_MAX_EP_STREAMS == 1
704c87aefeSPatrick Mooney #define	XHCI_MAX_STREAMS	1
714c87aefeSPatrick Mooney #define	XHCI_MAX_STREAMS_LOG	0
724c87aefeSPatrick Mooney #else
734c87aefeSPatrick Mooney #error "The USB_MAX_EP_STREAMS value is not supported."
744c87aefeSPatrick Mooney #endif
754c87aefeSPatrick Mooney #define	XHCI_DEV_CTX_ADDR_ALIGN		64	/* bytes */
764c87aefeSPatrick Mooney #define	XHCI_DEV_CTX_ALIGN		64	/* bytes */
774c87aefeSPatrick Mooney #define	XHCI_INPUT_CTX_ALIGN		64	/* bytes */
784c87aefeSPatrick Mooney #define	XHCI_SLOT_CTX_ALIGN		32	/* bytes */
794c87aefeSPatrick Mooney #define	XHCI_ENDP_CTX_ALIGN		32	/* bytes */
804c87aefeSPatrick Mooney #define	XHCI_STREAM_CTX_ALIGN		16	/* bytes */
814c87aefeSPatrick Mooney #define	XHCI_TRANS_RING_SEG_ALIGN	16	/* bytes */
824c87aefeSPatrick Mooney #define	XHCI_CMD_RING_SEG_ALIGN		64	/* bytes */
834c87aefeSPatrick Mooney #define	XHCI_EVENT_RING_SEG_ALIGN	64	/* bytes */
844c87aefeSPatrick Mooney #define	XHCI_SCRATCH_BUF_ARRAY_ALIGN	64	/* bytes */
854c87aefeSPatrick Mooney #define	XHCI_SCRATCH_BUFFER_ALIGN	USB_PAGE_SIZE
864c87aefeSPatrick Mooney #define	XHCI_TRB_ALIGN			16	/* bytes */
874c87aefeSPatrick Mooney #define	XHCI_TD_ALIGN			64	/* bytes */
884c87aefeSPatrick Mooney #define	XHCI_PAGE_SIZE			4096	/* bytes */
894c87aefeSPatrick Mooney 
904c87aefeSPatrick Mooney struct xhci_slot_ctx {
9159d65d31SAndy Fiddaman 	uint32_t	dwSctx0;
924c87aefeSPatrick Mooney #define	XHCI_SCTX_0_ROUTE_SET(x)		((x) & 0xFFFFF)
934c87aefeSPatrick Mooney #define	XHCI_SCTX_0_ROUTE_GET(x)		((x) & 0xFFFFF)
944c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SPEED_SET(x)		(((x) & 0xF) << 20)
954c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SPEED_GET(x)		(((x) >> 20) & 0xF)
964c87aefeSPatrick Mooney #define	XHCI_SCTX_0_MTT_SET(x)			(((x) & 0x1) << 25)
974c87aefeSPatrick Mooney #define	XHCI_SCTX_0_MTT_GET(x)			(((x) >> 25) & 0x1)
984c87aefeSPatrick Mooney #define	XHCI_SCTX_0_HUB_SET(x)			(((x) & 0x1) << 26)
994c87aefeSPatrick Mooney #define	XHCI_SCTX_0_HUB_GET(x)			(((x) >> 26) & 0x1)
1004c87aefeSPatrick Mooney #define	XHCI_SCTX_0_CTX_NUM_SET(x)		(((x) & 0x1F) << 27)
1014c87aefeSPatrick Mooney #define	XHCI_SCTX_0_CTX_NUM_GET(x)		(((x) >> 27) & 0x1F)
10259d65d31SAndy Fiddaman 	uint32_t	dwSctx1;
1034c87aefeSPatrick Mooney #define	XHCI_SCTX_1_MAX_EL_SET(x)		((x) & 0xFFFF)
1044c87aefeSPatrick Mooney #define	XHCI_SCTX_1_MAX_EL_GET(x)		((x) & 0xFFFF)
1054c87aefeSPatrick Mooney #define	XHCI_SCTX_1_RH_PORT_SET(x)		(((x) & 0xFF) << 16)
1064c87aefeSPatrick Mooney #define	XHCI_SCTX_1_RH_PORT_GET(x)		(((x) >> 16) & 0xFF)
1074c87aefeSPatrick Mooney #define	XHCI_SCTX_1_NUM_PORTS_SET(x)		(((x) & 0xFF) << 24)
1084c87aefeSPatrick Mooney #define	XHCI_SCTX_1_NUM_PORTS_GET(x)		(((x) >> 24) & 0xFF)
10959d65d31SAndy Fiddaman 	uint32_t	dwSctx2;
1104c87aefeSPatrick Mooney #define	XHCI_SCTX_2_TT_HUB_SID_SET(x)		((x) & 0xFF)
1114c87aefeSPatrick Mooney #define	XHCI_SCTX_2_TT_HUB_SID_GET(x)		((x) & 0xFF)
1124c87aefeSPatrick Mooney #define	XHCI_SCTX_2_TT_PORT_NUM_SET(x)		(((x) & 0xFF) << 8)
1134c87aefeSPatrick Mooney #define	XHCI_SCTX_2_TT_PORT_NUM_GET(x)		(((x) >> 8) & 0xFF)
1144c87aefeSPatrick Mooney #define	XHCI_SCTX_2_TT_THINK_TIME_SET(x)	(((x) & 0x3) << 16)
1154c87aefeSPatrick Mooney #define	XHCI_SCTX_2_TT_THINK_TIME_GET(x)	(((x) >> 16) & 0x3)
1164c87aefeSPatrick Mooney #define	XHCI_SCTX_2_IRQ_TARGET_SET(x)		(((x) & 0x3FF) << 22)
1174c87aefeSPatrick Mooney #define	XHCI_SCTX_2_IRQ_TARGET_GET(x)		(((x) >> 22) & 0x3FF)
11859d65d31SAndy Fiddaman 	uint32_t	dwSctx3;
1194c87aefeSPatrick Mooney #define	XHCI_SCTX_3_DEV_ADDR_SET(x)		((x) & 0xFF)
1204c87aefeSPatrick Mooney #define	XHCI_SCTX_3_DEV_ADDR_GET(x)		((x) & 0xFF)
1214c87aefeSPatrick Mooney #define	XHCI_SCTX_3_SLOT_STATE_SET(x)		(((x) & 0x1F) << 27)
1224c87aefeSPatrick Mooney #define	XHCI_SCTX_3_SLOT_STATE_GET(x)		(((x) >> 27) & 0x1F)
12359d65d31SAndy Fiddaman 	uint32_t	dwSctx4;
12459d65d31SAndy Fiddaman 	uint32_t	dwSctx5;
12559d65d31SAndy Fiddaman 	uint32_t	dwSctx6;
12659d65d31SAndy Fiddaman 	uint32_t	dwSctx7;
1274c87aefeSPatrick Mooney };
1284c87aefeSPatrick Mooney 
1294c87aefeSPatrick Mooney struct xhci_endp_ctx {
13059d65d31SAndy Fiddaman 	uint32_t	dwEpCtx0;
1314c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_EPSTATE_SET(x)		((x) & 0x7)
1324c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_EPSTATE_GET(x)		((x) & 0x7)
1334c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_MULT_SET(x)		(((x) & 0x3) << 8)
1344c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_MULT_GET(x)		(((x) >> 8) & 0x3)
1354c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_MAXP_STREAMS_SET(x)	(((x) & 0x1F) << 10)
1364c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_MAXP_STREAMS_GET(x)	(((x) >> 10) & 0x1F)
1374c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_LSA_SET(x)			(((x) & 0x1) << 15)
1384c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_LSA_GET(x)			(((x) >> 15) & 0x1)
1394c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_IVAL_SET(x)		(((x) & 0xFF) << 16)
1404c87aefeSPatrick Mooney #define	XHCI_EPCTX_0_IVAL_GET(x)		(((x) >> 16) & 0xFF)
14159d65d31SAndy Fiddaman 	uint32_t	dwEpCtx1;
1424c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_CERR_SET(x)		(((x) & 0x3) << 1)
1434c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_CERR_GET(x)		(((x) >> 1) & 0x3)
1444c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_EPTYPE_SET(x)		(((x) & 0x7) << 3)
1454c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_EPTYPE_GET(x)		(((x) >> 3) & 0x7)
1464c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_HID_SET(x)			(((x) & 0x1) << 7)
1474c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_HID_GET(x)			(((x) >> 7) & 0x1)
1484c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_MAXB_SET(x)		(((x) & 0xFF) << 8)
1494c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_MAXB_GET(x)		(((x) >> 8) & 0xFF)
1504c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_MAXP_SIZE_SET(x)		(((x) & 0xFFFF) << 16)
1514c87aefeSPatrick Mooney #define	XHCI_EPCTX_1_MAXP_SIZE_GET(x)		(((x) >> 16) & 0xFFFF)
15259d65d31SAndy Fiddaman 	uint64_t	qwEpCtx2;
1534c87aefeSPatrick Mooney #define	XHCI_EPCTX_2_DCS_SET(x)			((x) & 0x1)
1544c87aefeSPatrick Mooney #define	XHCI_EPCTX_2_DCS_GET(x)			((x) & 0x1)
1554c87aefeSPatrick Mooney #define	XHCI_EPCTX_2_TR_DQ_PTR_MASK		0xFFFFFFFFFFFFFFF0U
15659d65d31SAndy Fiddaman 	uint32_t	dwEpCtx4;
1574c87aefeSPatrick Mooney #define	XHCI_EPCTX_4_AVG_TRB_LEN_SET(x)		((x) & 0xFFFF)
1584c87aefeSPatrick Mooney #define	XHCI_EPCTX_4_AVG_TRB_LEN_GET(x)		((x) & 0xFFFF)
1594c87aefeSPatrick Mooney #define	XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_SET(x)	(((x) & 0xFFFF) << 16)
1604c87aefeSPatrick Mooney #define	XHCI_EPCTX_4_MAX_ESIT_PAYLOAD_GET(x)	(((x) >> 16) & 0xFFFF)
16159d65d31SAndy Fiddaman 	uint32_t	dwEpCtx5;
16259d65d31SAndy Fiddaman 	uint32_t	dwEpCtx6;
16359d65d31SAndy Fiddaman 	uint32_t	dwEpCtx7;
1644c87aefeSPatrick Mooney };
1654c87aefeSPatrick Mooney 
1664c87aefeSPatrick Mooney struct xhci_input_ctx {
1674c87aefeSPatrick Mooney #define	XHCI_INCTX_NON_CTRL_MASK	0xFFFFFFFCU
16859d65d31SAndy Fiddaman 	uint32_t	dwInCtx0;
1694c87aefeSPatrick Mooney #define	XHCI_INCTX_0_DROP_MASK(n)	(1U << (n))
17059d65d31SAndy Fiddaman 	uint32_t	dwInCtx1;
1714c87aefeSPatrick Mooney #define	XHCI_INCTX_1_ADD_MASK(n)	(1U << (n))
17259d65d31SAndy Fiddaman 	uint32_t	dwInCtx2;
17359d65d31SAndy Fiddaman 	uint32_t	dwInCtx3;
17459d65d31SAndy Fiddaman 	uint32_t	dwInCtx4;
17559d65d31SAndy Fiddaman 	uint32_t	dwInCtx5;
17659d65d31SAndy Fiddaman 	uint32_t	dwInCtx6;
17759d65d31SAndy Fiddaman 	uint32_t	dwInCtx7;
1784c87aefeSPatrick Mooney };
1794c87aefeSPatrick Mooney 
1804c87aefeSPatrick Mooney struct xhci_input_dev_ctx {
1814c87aefeSPatrick Mooney 	struct xhci_input_ctx	ctx_input;
1824c87aefeSPatrick Mooney 	union {
1834c87aefeSPatrick Mooney 		struct xhci_slot_ctx	u_slot;
1844c87aefeSPatrick Mooney 		struct xhci_endp_ctx	u_ep[XHCI_MAX_ENDPOINTS];
1854c87aefeSPatrick Mooney 	} ctx_dev_slep;
1864c87aefeSPatrick Mooney };
1874c87aefeSPatrick Mooney 
1884c87aefeSPatrick Mooney struct xhci_dev_ctx {
1894c87aefeSPatrick Mooney 	union {
1904c87aefeSPatrick Mooney 		struct xhci_slot_ctx	u_slot;
1914c87aefeSPatrick Mooney 		struct xhci_endp_ctx	u_ep[XHCI_MAX_ENDPOINTS];
1924c87aefeSPatrick Mooney 	} ctx_dev_slep;
1934c87aefeSPatrick Mooney } __aligned(XHCI_DEV_CTX_ALIGN);
1944c87aefeSPatrick Mooney #define	ctx_slot	ctx_dev_slep.u_slot
1954c87aefeSPatrick Mooney #define	ctx_ep		ctx_dev_slep.u_ep
1964c87aefeSPatrick Mooney 
1974c87aefeSPatrick Mooney struct xhci_stream_ctx {
19859d65d31SAndy Fiddaman 	uint64_t	qwSctx0;
1994c87aefeSPatrick Mooney #define	XHCI_SCTX_0_DCS_GET(x)		((x) & 0x1)
2004c87aefeSPatrick Mooney #define	XHCI_SCTX_0_DCS_SET(x)		((x) & 0x1)
2014c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_SET(x)		(((x) & 0x7) << 1)
2024c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_GET(x)		(((x) >> 1) & 0x7)
2034c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_SEC_TR_RING	0x0
2044c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_TR_RING	0x1
2054c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_SSA_8	0x2
2064c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_SSA_16	0x3
2074c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_SSA_32	0x4
2084c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_SSA_64	0x5
2094c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_SSA_128	0x6
2104c87aefeSPatrick Mooney #define	XHCI_SCTX_0_SCT_PRIM_SSA_256	0x7
2114c87aefeSPatrick Mooney #define	XHCI_SCTX_0_TR_DQ_PTR_MASK	0xFFFFFFFFFFFFFFF0U
21259d65d31SAndy Fiddaman 	uint32_t	dwSctx2;
21359d65d31SAndy Fiddaman 	uint32_t	dwSctx3;
2144c87aefeSPatrick Mooney };
2154c87aefeSPatrick Mooney 
2164c87aefeSPatrick Mooney struct xhci_trb {
21759d65d31SAndy Fiddaman 	uint64_t	qwTrb0;
2184c87aefeSPatrick Mooney #define	XHCI_TRB_0_DIR_IN_MASK		(0x80ULL << 0)
2194c87aefeSPatrick Mooney #define	XHCI_TRB_0_WLENGTH_MASK		(0xFFFFULL << 48)
22059d65d31SAndy Fiddaman 	uint32_t	dwTrb2;
2214c87aefeSPatrick Mooney #define	XHCI_TRB_2_ERROR_GET(x)		(((x) >> 24) & 0xFF)
2224c87aefeSPatrick Mooney #define	XHCI_TRB_2_ERROR_SET(x)		(((x) & 0xFF) << 24)
2234c87aefeSPatrick Mooney #define	XHCI_TRB_2_TDSZ_GET(x)		(((x) >> 17) & 0x1F)
2244c87aefeSPatrick Mooney #define	XHCI_TRB_2_TDSZ_SET(x)		(((x) & 0x1F) << 17)
2254c87aefeSPatrick Mooney #define	XHCI_TRB_2_REM_GET(x)		((x) & 0xFFFFFF)
2264c87aefeSPatrick Mooney #define	XHCI_TRB_2_REM_SET(x)		((x) & 0xFFFFFF)
2274c87aefeSPatrick Mooney #define	XHCI_TRB_2_BYTES_GET(x)		((x) & 0x1FFFF)
2284c87aefeSPatrick Mooney #define	XHCI_TRB_2_BYTES_SET(x)		((x) & 0x1FFFF)
2294c87aefeSPatrick Mooney #define	XHCI_TRB_2_IRQ_GET(x)		(((x) >> 22) & 0x3FF)
2304c87aefeSPatrick Mooney #define	XHCI_TRB_2_IRQ_SET(x)		(((x) & 0x3FF) << 22)
2314c87aefeSPatrick Mooney #define	XHCI_TRB_2_STREAM_GET(x)	(((x) >> 16) & 0xFFFF)
2324c87aefeSPatrick Mooney #define	XHCI_TRB_2_STREAM_SET(x)	(((x) & 0xFFFF) << 16)
2334c87aefeSPatrick Mooney 
23459d65d31SAndy Fiddaman 	uint32_t	dwTrb3;
2354c87aefeSPatrick Mooney #define	XHCI_TRB_3_TYPE_GET(x)		(((x) >> 10) & 0x3F)
2364c87aefeSPatrick Mooney #define	XHCI_TRB_3_TYPE_SET(x)		(((x) & 0x3F) << 10)
2374c87aefeSPatrick Mooney #define	XHCI_TRB_3_CYCLE_BIT		(1U << 0)
2384c87aefeSPatrick Mooney #define	XHCI_TRB_3_TC_BIT		(1U << 1)	/* command ring only */
2394c87aefeSPatrick Mooney #define	XHCI_TRB_3_ENT_BIT		(1U << 1)	/* transfer ring only */
2404c87aefeSPatrick Mooney #define	XHCI_TRB_3_ISP_BIT		(1U << 2)
2414c87aefeSPatrick Mooney #define	XHCI_TRB_3_ED_BIT		(1U << 2)
2424c87aefeSPatrick Mooney #define	XHCI_TRB_3_NSNOOP_BIT		(1U << 3)
2434c87aefeSPatrick Mooney #define	XHCI_TRB_3_CHAIN_BIT		(1U << 4)
2444c87aefeSPatrick Mooney #define	XHCI_TRB_3_IOC_BIT		(1U << 5)
2454c87aefeSPatrick Mooney #define	XHCI_TRB_3_IDT_BIT		(1U << 6)
2464c87aefeSPatrick Mooney #define	XHCI_TRB_3_TBC_GET(x)		(((x) >> 7) & 3)
2474c87aefeSPatrick Mooney #define	XHCI_TRB_3_TBC_SET(x)		(((x) & 3) << 7)
2484c87aefeSPatrick Mooney #define	XHCI_TRB_3_BEI_BIT		(1U << 9)
2494c87aefeSPatrick Mooney #define	XHCI_TRB_3_DCEP_BIT		(1U << 9)
2504c87aefeSPatrick Mooney #define	XHCI_TRB_3_PRSV_BIT		(1U << 9)
2514c87aefeSPatrick Mooney #define	XHCI_TRB_3_BSR_BIT		(1U << 9)
2524c87aefeSPatrick Mooney #define	XHCI_TRB_3_TRT_MASK		(3U << 16)
2534c87aefeSPatrick Mooney #define	XHCI_TRB_3_TRT_NONE		(0U << 16)
2544c87aefeSPatrick Mooney #define	XHCI_TRB_3_TRT_OUT		(2U << 16)
2554c87aefeSPatrick Mooney #define	XHCI_TRB_3_TRT_IN		(3U << 16)
2564c87aefeSPatrick Mooney #define	XHCI_TRB_3_DIR_IN		(1U << 16)
2574c87aefeSPatrick Mooney #define	XHCI_TRB_3_TLBPC_GET(x)		(((x) >> 16) & 0xF)
2584c87aefeSPatrick Mooney #define	XHCI_TRB_3_TLBPC_SET(x)		(((x) & 0xF) << 16)
2594c87aefeSPatrick Mooney #define	XHCI_TRB_3_EP_GET(x)		(((x) >> 16) & 0x1F)
2604c87aefeSPatrick Mooney #define	XHCI_TRB_3_EP_SET(x)		(((x) & 0x1F) << 16)
2614c87aefeSPatrick Mooney #define	XHCI_TRB_3_FRID_GET(x)		(((x) >> 20) & 0x7FF)
2624c87aefeSPatrick Mooney #define	XHCI_TRB_3_FRID_SET(x)		(((x) & 0x7FF) << 20)
2634c87aefeSPatrick Mooney #define	XHCI_TRB_3_ISO_SIA_BIT		(1U << 31)
2644c87aefeSPatrick Mooney #define	XHCI_TRB_3_SUSP_EP_BIT		(1U << 23)
2654c87aefeSPatrick Mooney #define	XHCI_TRB_3_SLOT_GET(x)		(((x) >> 24) & 0xFF)
2664c87aefeSPatrick Mooney #define	XHCI_TRB_3_SLOT_SET(x)		(((x) & 0xFF) << 24)
2674c87aefeSPatrick Mooney 
2684c87aefeSPatrick Mooney /* Commands */
2694c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_RESERVED		0x00
2704c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_NORMAL		0x01
2714c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_SETUP_STAGE	0x02
2724c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_DATA_STAGE	0x03
2734c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_STATUS_STAGE	0x04
2744c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_ISOCH		0x05
2754c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_LINK		0x06
2764c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_EVENT_DATA	0x07
2774c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_NOOP		0x08
2784c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_ENABLE_SLOT	0x09
2794c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_DISABLE_SLOT	0x0A
2804c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_ADDRESS_DEVICE	0x0B
2814c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_CONFIGURE_EP	0x0C
2824c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_EVALUATE_CTX	0x0D
2834c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_RESET_EP		0x0E
2844c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_STOP_EP		0x0F
2854c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_SET_TR_DEQUEUE	0x10
2864c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_RESET_DEVICE	0x11
2874c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_FORCE_EVENT	0x12
2884c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_NEGOTIATE_BW	0x13
2894c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_SET_LATENCY_TOL  	0x14
2904c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_GET_PORT_BW	0x15
2914c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_FORCE_HEADER	0x16
2924c87aefeSPatrick Mooney #define	XHCI_TRB_TYPE_NOOP_CMD		0x17
2934c87aefeSPatrick Mooney 
2944c87aefeSPatrick Mooney /* Events */
2954c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_TRANSFER		0x20
2964c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_CMD_COMPLETE	0x21
2974c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_PORT_STS_CHANGE  0x22
2984c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_BW_REQUEST      	0x23
2994c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_DOORBELL		0x24
3004c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_HOST_CTRL	0x25
3014c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_DEVICE_NOTIFY	0x26
3024c87aefeSPatrick Mooney #define	XHCI_TRB_EVENT_MFINDEX_WRAP	0x27
3034c87aefeSPatrick Mooney 
3044c87aefeSPatrick Mooney /* Error codes */
3054c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_INVALID		0x00
3064c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_SUCCESS		0x01
3074c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_DATA_BUF		0x02
3084c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_BABBLE		0x03
3094c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_XACT		0x04
3104c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_TRB		0x05
3114c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_STALL		0x06
3124c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_RESOURCE		0x07
3134c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_BANDWIDTH	0x08
3144c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_NO_SLOTS		0x09
3154c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_STREAM_TYPE	0x0A
3164c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_SLOT_NOT_ON	0x0B
3174c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_ENDP_NOT_ON	0x0C
3184c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_SHORT_PKT	0x0D
3194c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_RING_UNDERRUN	0x0E
3204c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_RING_OVERRUN	0x0F
3214c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_VF_RING_FULL	0x10
3224c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_PARAMETER	0x11
3234c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_BW_OVERRUN	0x12
3244c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_CONTEXT_STATE	0x13
3254c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_NO_PING_RESP	0x14
3264c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_EV_RING_FULL	0x15
3274c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_INCOMPAT_DEV	0x16
3284c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_MISSED_SERVICE	0x17
3294c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_CMD_RING_STOP	0x18
3304c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_CMD_ABORTED	0x19
3314c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_STOPPED		0x1A
3324c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_LENGTH		0x1B
3334c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_BAD_MELAT	0x1D
3344c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_ISOC_OVERRUN	0x1F
3354c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_EVENT_LOST	0x20
3364c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_UNDEFINED	0x21
3374c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_INVALID_SID	0x22
3384c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_SEC_BW		0x23
3394c87aefeSPatrick Mooney #define	XHCI_TRB_ERROR_SPLIT_XACT	0x24
3404c87aefeSPatrick Mooney } __aligned(4);
3414c87aefeSPatrick Mooney 
3424c87aefeSPatrick Mooney struct xhci_dev_endpoint_trbs {
3434c87aefeSPatrick Mooney 	struct xhci_trb		trb[(XHCI_MAX_STREAMS *
3444c87aefeSPatrick Mooney 	    XHCI_MAX_TRANSFERS) + XHCI_MAX_STREAMS];
3454c87aefeSPatrick Mooney };
3464c87aefeSPatrick Mooney 
3474c87aefeSPatrick Mooney struct xhci_event_ring_seg {
34859d65d31SAndy Fiddaman 	uint64_t	qwEvrsTablePtr;
34959d65d31SAndy Fiddaman 	uint32_t	dwEvrsTableSize;
35059d65d31SAndy Fiddaman 	uint32_t	dwEvrsReserved;
3514c87aefeSPatrick Mooney };
3524c87aefeSPatrick Mooney 
3534c87aefeSPatrick Mooney #endif /* _PCI_XHCI_H_ */
354