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