xref: /freebsd/sys/dev/thunderbolt/tbcfg_reg.h (revision 2ed9833791f28e14843ac813f90cb030e45948dc)
1*2ed98337SAymeric Wibo /*-
2*2ed98337SAymeric Wibo  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*2ed98337SAymeric Wibo  *
4*2ed98337SAymeric Wibo  * Copyright (c) 2022 Scott Long
5*2ed98337SAymeric Wibo  * All rights reserved.
6*2ed98337SAymeric Wibo  *
7*2ed98337SAymeric Wibo  * Redistribution and use in source and binary forms, with or without
8*2ed98337SAymeric Wibo  * modification, are permitted provided that the following conditions
9*2ed98337SAymeric Wibo  * are met:
10*2ed98337SAymeric Wibo  * 1. Redistributions of source code must retain the above copyright
11*2ed98337SAymeric Wibo  *    notice, this list of conditions and the following disclaimer.
12*2ed98337SAymeric Wibo  * 2. Redistributions in binary form must reproduce the above copyright
13*2ed98337SAymeric Wibo  *    notice, this list of conditions and the following disclaimer in the
14*2ed98337SAymeric Wibo  *    documentation and/or other materials provided with the distribution.
15*2ed98337SAymeric Wibo  *
16*2ed98337SAymeric Wibo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*2ed98337SAymeric Wibo  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*2ed98337SAymeric Wibo  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*2ed98337SAymeric Wibo  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*2ed98337SAymeric Wibo  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*2ed98337SAymeric Wibo  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*2ed98337SAymeric Wibo  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*2ed98337SAymeric Wibo  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*2ed98337SAymeric Wibo  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*2ed98337SAymeric Wibo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*2ed98337SAymeric Wibo  * SUCH DAMAGE.
27*2ed98337SAymeric Wibo  *
28*2ed98337SAymeric Wibo  * Thunderbolt3/USB4 config space register definitions
29*2ed98337SAymeric Wibo  *
30*2ed98337SAymeric Wibo  * $FreeBSD$
31*2ed98337SAymeric Wibo  */
32*2ed98337SAymeric Wibo 
33*2ed98337SAymeric Wibo #ifndef _TBCFG_REG_H
34*2ed98337SAymeric Wibo #define _TBCFG_REG_H
35*2ed98337SAymeric Wibo 
36*2ed98337SAymeric Wibo /* Config space read request, 6.4.2.3 */
37*2ed98337SAymeric Wibo struct tb_cfg_read {
38*2ed98337SAymeric Wibo 	tb_route_t			route;
39*2ed98337SAymeric Wibo 	uint32_t			addr_attrs;
40*2ed98337SAymeric Wibo #define TB_CFG_ADDR_SHIFT		0
41*2ed98337SAymeric Wibo #define TB_CFG_ADDR_MASK		GENMASK(12,0)
42*2ed98337SAymeric Wibo #define TB_CFG_SIZE_SHIFT		13
43*2ed98337SAymeric Wibo #define TB_CFG_SIZE_MASK		GENMASK(18,13)
44*2ed98337SAymeric Wibo #define TB_CFG_ADAPTER_SHIFT		19
45*2ed98337SAymeric Wibo #define TB_CFG_ADAPTER_MASK		GENMASK(24,19)
46*2ed98337SAymeric Wibo #define TB_CFG_CS_PATH			(0x00 << 25)
47*2ed98337SAymeric Wibo #define TB_CFG_CS_ADAPTER		(0x01 << 25)
48*2ed98337SAymeric Wibo #define TB_CFG_CS_ROUTER		(0x02 << 25)
49*2ed98337SAymeric Wibo #define TB_CFG_CS_COUNTERS		(0x03 << 25)
50*2ed98337SAymeric Wibo #define TB_CFG_SEQ_SHIFT		27
51*2ed98337SAymeric Wibo #define TB_CFG_SEQ_MASK			(28,27)
52*2ed98337SAymeric Wibo 	uint32_t			crc;
53*2ed98337SAymeric Wibo };
54*2ed98337SAymeric Wibo 
55*2ed98337SAymeric Wibo /* Config space read request, 6.4.2.4 */
56*2ed98337SAymeric Wibo struct tb_cfg_read_resp {
57*2ed98337SAymeric Wibo 	tb_route_t			route;
58*2ed98337SAymeric Wibo 	uint32_t			addr_attrs;
59*2ed98337SAymeric Wibo 	uint32_t			data[0];	/* Up to 60 dwords */
60*2ed98337SAymeric Wibo 	/* uint32_t crc is at the end */
61*2ed98337SAymeric Wibo } __packed;
62*2ed98337SAymeric Wibo 
63*2ed98337SAymeric Wibo /* Config space write request, 6.4.2.5 */
64*2ed98337SAymeric Wibo struct tb_cfg_write {
65*2ed98337SAymeric Wibo 	tb_route_t			route;
66*2ed98337SAymeric Wibo 	uint32_t			addr_attrs;
67*2ed98337SAymeric Wibo 	uint32_t			data[0];	/* Up to 60 dwords */
68*2ed98337SAymeric Wibo 	/* uint32_t crc is at the end */
69*2ed98337SAymeric Wibo } __packed;
70*2ed98337SAymeric Wibo 
71*2ed98337SAymeric Wibo /* Config space write response, 6.4.2.6 */
72*2ed98337SAymeric Wibo struct tb_cfg_write_resp {
73*2ed98337SAymeric Wibo 	tb_route_t			route;
74*2ed98337SAymeric Wibo 	uint32_t			addr_attrs;
75*2ed98337SAymeric Wibo 	uint32_t			crc;
76*2ed98337SAymeric Wibo } __packed;
77*2ed98337SAymeric Wibo 
78*2ed98337SAymeric Wibo /* Config space event, 6.4.2.7 */
79*2ed98337SAymeric Wibo struct tb_cfg_notify {
80*2ed98337SAymeric Wibo 	tb_route_t			route;
81*2ed98337SAymeric Wibo 	uint32_t			event_adap;
82*2ed98337SAymeric Wibo #define TB_CFG_EVENT_MASK		GENMASK(7,0)
83*2ed98337SAymeric Wibo #define GET_NOTIFY_EVENT(n)		((n)->event_adap & TB_CFG_EVENT_MASK)
84*2ed98337SAymeric Wibo #define TB_CFG_ERR_CONN			0x00
85*2ed98337SAymeric Wibo #define TB_CFG_ERR_LINK			0x01
86*2ed98337SAymeric Wibo #define TB_CFG_ERR_ADDR			0x02
87*2ed98337SAymeric Wibo #define TB_CFG_ERR_ADP			0x04
88*2ed98337SAymeric Wibo #define TB_CFG_ERR_ENUM			0x08
89*2ed98337SAymeric Wibo #define TB_CFG_ERR_NUA			0x09
90*2ed98337SAymeric Wibo #define TB_CFG_ERR_LEN			0x0b
91*2ed98337SAymeric Wibo #define TB_CFG_ERR_HEC			0x0c
92*2ed98337SAymeric Wibo #define TB_CFG_ERR_FC			0x0d
93*2ed98337SAymeric Wibo #define TB_CFG_ERR_PLUG			0x0e
94*2ed98337SAymeric Wibo #define TB_CFG_ERR_LOCK			0x0f
95*2ed98337SAymeric Wibo #define TB_CFG_HP_ACK			0x07
96*2ed98337SAymeric Wibo #define TB_CFG_DP_BW			0x20
97*2ed98337SAymeric Wibo #define TB_CFG_EVENT_ADAPTER_SHIFT	8
98*2ed98337SAymeric Wibo #define TB_CFG_EVENT_ADAPTER_MASK	GENMASK(13,8)
99*2ed98337SAymeric Wibo #define GET_NOTIFY_ADAPTER(n)		(((n)->event_adap & \
100*2ed98337SAymeric Wibo 					TB_CFG_EVENT_ADAPTER_MASK) >> \
101*2ed98337SAymeric Wibo 					TB_CFG_EVENT_ADAPTER_SHIFT)
102*2ed98337SAymeric Wibo #define TB_CFG_PG_NONE			0x00000000
103*2ed98337SAymeric Wibo #define TB_CFG_PG_PLUG			0x80000000
104*2ed98337SAymeric Wibo #define TB_CFG_PG_UNPLUG		0xc0000000
105*2ed98337SAymeric Wibo 	uint32_t			crc;
106*2ed98337SAymeric Wibo } __packed;
107*2ed98337SAymeric Wibo 
108*2ed98337SAymeric Wibo /* Config space event acknowledgement, 6.4.2.8 */
109*2ed98337SAymeric Wibo struct tb_cfg_notify_ack {
110*2ed98337SAymeric Wibo 	tb_route_t			route;
111*2ed98337SAymeric Wibo 	uint32_t			crc;
112*2ed98337SAymeric Wibo } __packed;
113*2ed98337SAymeric Wibo 
114*2ed98337SAymeric Wibo /* Config space hot plug event, 6.4.2.10 */
115*2ed98337SAymeric Wibo struct tb_cfg_hotplug {
116*2ed98337SAymeric Wibo 	tb_route_t			route;
117*2ed98337SAymeric Wibo 	uint32_t			adapter_attrs;
118*2ed98337SAymeric Wibo #define TB_CFG_ADPT_MASK		GENMASK(5,0)
119*2ed98337SAymeric Wibo #define TB_CFG_UPG_PLUG			(0x0 << 31)
120*2ed98337SAymeric Wibo #define TB_CFG_UPG_UNPLUG		(0x1 << 31)
121*2ed98337SAymeric Wibo 	uint32_t			crc;
122*2ed98337SAymeric Wibo } __packed;
123*2ed98337SAymeric Wibo 
124*2ed98337SAymeric Wibo /* Config space inter-domain request, 6.4.2.11 */
125*2ed98337SAymeric Wibo struct tb_cfg_xdomain {
126*2ed98337SAymeric Wibo 	tb_route_t			route;
127*2ed98337SAymeric Wibo 	uint32_t			data[0];
128*2ed98337SAymeric Wibo 	/* uint32_t crc is at the end */
129*2ed98337SAymeric Wibo } __packed;
130*2ed98337SAymeric Wibo 
131*2ed98337SAymeric Wibo /* Config space inter-domain response, 6.4.2.12 */
132*2ed98337SAymeric Wibo struct tb_cfg_xdomain_resp {
133*2ed98337SAymeric Wibo 	tb_route_t			route;
134*2ed98337SAymeric Wibo 	uint32_t			data[0];
135*2ed98337SAymeric Wibo 	/* uint32_t crc is at the end */
136*2ed98337SAymeric Wibo } __packed;
137*2ed98337SAymeric Wibo 
138*2ed98337SAymeric Wibo /* Config space router basic registers 8.2.1.1 */
139*2ed98337SAymeric Wibo struct tb_cfg_router {
140*2ed98337SAymeric Wibo 	uint16_t			vendor_id;	/* ROUTER_CS_0 */
141*2ed98337SAymeric Wibo 	uint16_t			product_id;
142*2ed98337SAymeric Wibo 	uint32_t			router_cs_1;	/* ROUTER_CS_1 */
143*2ed98337SAymeric Wibo #define ROUTER_CS1_NEXT_CAP_MASK	GENMASK(7,0)
144*2ed98337SAymeric Wibo #define GET_ROUTER_CS_NEXT_CAP(r)	(r->router_cs_1 & \
145*2ed98337SAymeric Wibo 					ROUTER_CS1_NEXT_CAP_MASK)
146*2ed98337SAymeric Wibo #define ROUTER_CS1_UPSTREAM_SHIFT	8
147*2ed98337SAymeric Wibo #define ROUTER_CS1_UPSTREAM_MASK	GENMASK(13,8)
148*2ed98337SAymeric Wibo #define GET_ROUTER_CS_UPSTREAM_ADAP(r)	((r->router_cs_1 & \
149*2ed98337SAymeric Wibo 					ROUTER_CS1_UPSTREAM_MASK) >> \
150*2ed98337SAymeric Wibo 					ROUTER_CS1_UPSTREAM_SHIFT)
151*2ed98337SAymeric Wibo #define ROUTER_CS1_MAX_SHIFT		14
152*2ed98337SAymeric Wibo #define ROUTER_CS1_MAX_MASK		GENMASK(19,14)
153*2ed98337SAymeric Wibo #define GET_ROUTER_CS_MAX_ADAP(r)	((r->router_cs_1 & \
154*2ed98337SAymeric Wibo 					ROUTER_CS1_MAX_MASK) >> \
155*2ed98337SAymeric Wibo 					ROUTER_CS1_MAX_SHIFT)
156*2ed98337SAymeric Wibo #define ROUTER_CS1_MAX_ADAPTERS		64
157*2ed98337SAymeric Wibo #define ROUTER_CS1_DEPTH_SHIFT		20
158*2ed98337SAymeric Wibo #define ROUTER_CS1_DEPTH_MASK		GENMASK(22,20)
159*2ed98337SAymeric Wibo #define GET_ROUTER_CS_DEPTH(r)		((r->router_cs_1 & \
160*2ed98337SAymeric Wibo 					ROUTER_CS1_DEPTH_MASK) >> \
161*2ed98337SAymeric Wibo 					ROUTER_CS1_DEPTH_SHIFT)
162*2ed98337SAymeric Wibo #define ROUTER_CS1_REVISION_SHIFT	24
163*2ed98337SAymeric Wibo #define ROUTER_CS1_REVISION_MASK	GENMASK(31,24)
164*2ed98337SAymeric Wibo #define GET_ROUTER_CS_REVISION		((r->router_cs_1 & \
165*2ed98337SAymeric Wibo 					ROUTER_CS1_REVISION_MASK) >> \
166*2ed98337SAymeric Wibo 					ROUTER_CS1_REVISION_SHIFT)
167*2ed98337SAymeric Wibo 	uint32_t			topology_lo;	/* ROUTER_CS_2 */
168*2ed98337SAymeric Wibo 	uint32_t			topology_hi;	/* ROUTER_CS_3 */
169*2ed98337SAymeric Wibo #define CFG_TOPOLOGY_VALID		(1 << 31)
170*2ed98337SAymeric Wibo 	uint8_t				notification_timeout; /* ROUTER_CS_4 */
171*2ed98337SAymeric Wibo 	uint8_t				cm_version;
172*2ed98337SAymeric Wibo #define CFG_CM_USB4			0x10
173*2ed98337SAymeric Wibo 	uint8_t				rsrvd1;
174*2ed98337SAymeric Wibo 	uint8_t				usb4_version;
175*2ed98337SAymeric Wibo #define CFG_USB4_V1_0			0x10
176*2ed98337SAymeric Wibo 	uint32_t			flags_cs5;	/* ROUTER_CS_5 */
177*2ed98337SAymeric Wibo #define CFG_CS5_SLP			(1 << 0)
178*2ed98337SAymeric Wibo #define CFG_CS5_WOP			(1 << 1)
179*2ed98337SAymeric Wibo #define CFG_CS5_WOU			(1 << 2)
180*2ed98337SAymeric Wibo #define CFG_CS5_DP			(1 << 3)
181*2ed98337SAymeric Wibo #define CFG_CS5_C3S			(1 << 23)
182*2ed98337SAymeric Wibo #define CFG_CS5_PTO			(1 << 24)
183*2ed98337SAymeric Wibo #define CFG_CS5_UTO			(1 << 25)
184*2ed98337SAymeric Wibo #define CFG_CS5_HCO			(1 << 26)
185*2ed98337SAymeric Wibo #define CFG_CS5_CV			(1 << 31)
186*2ed98337SAymeric Wibo 	uint32_t			flags_cs6;	/* ROUTER_CS_6 */
187*2ed98337SAymeric Wibo #define CFG_CS6_SLPR			(1 << 0)
188*2ed98337SAymeric Wibo #define CFG_CS6_TNS			(1 << 1)
189*2ed98337SAymeric Wibo #define CFG_CS6_WAKE_PCIE		(1 << 2)
190*2ed98337SAymeric Wibo #define CFG_CS6_WAKE_USB3		(1 << 3)
191*2ed98337SAymeric Wibo #define CFG_CS6_WAKE_DP			(1 << 4)
192*2ed98337SAymeric Wibo #define CFG_CS6_HCI			(1 << 18)
193*2ed98337SAymeric Wibo #define CFG_CS6_RR			(1 << 24)
194*2ed98337SAymeric Wibo #define CFG_CS6_CR			(1 << 25)
195*2ed98337SAymeric Wibo 	uint32_t			uuid_hi;	/* ROUTER_CS_7 */
196*2ed98337SAymeric Wibo 	uint32_t			uuid_lo;	/* ROUTER_CS_8 */
197*2ed98337SAymeric Wibo 	uint32_t			data[16];	/* ROUTER_CS_9-24 */
198*2ed98337SAymeric Wibo 	uint32_t			metadata;	/* ROUTER_CS_25 */
199*2ed98337SAymeric Wibo 	uint32_t			opcode_status;	/* ROUTER_CS_26 */
200*2ed98337SAymeric Wibo /* TBD: Opcodes and status */
201*2ed98337SAymeric Wibo #define CFG_ONS				(1 << 30)
202*2ed98337SAymeric Wibo #define CFG_OV				(1 << 31)
203*2ed98337SAymeric Wibo } __packed;
204*2ed98337SAymeric Wibo 
205*2ed98337SAymeric Wibo #define TB_CFG_CAP_OFFSET_MAX		0xfff
206*2ed98337SAymeric Wibo 
207*2ed98337SAymeric Wibo /* Config space router capability header 8.2.1.3/8.2.1.4 */
208*2ed98337SAymeric Wibo struct tb_cfg_cap_hdr {
209*2ed98337SAymeric Wibo 	uint8_t				next_cap;
210*2ed98337SAymeric Wibo 	uint8_t				cap_id;
211*2ed98337SAymeric Wibo } __packed;
212*2ed98337SAymeric Wibo 
213*2ed98337SAymeric Wibo /* Config space router TMU registers 8.2.1.2 */
214*2ed98337SAymeric Wibo struct tb_cfg_cap_tmu {
215*2ed98337SAymeric Wibo 	struct tb_cfg_cap_hdr		hdr;
216*2ed98337SAymeric Wibo #define TB_CFG_CAP_TMU			0x03
217*2ed98337SAymeric Wibo } __packed;
218*2ed98337SAymeric Wibo 
219*2ed98337SAymeric Wibo struct tb_cfg_vsc_cap {
220*2ed98337SAymeric Wibo 	struct tb_cfg_cap_hdr		hdr;
221*2ed98337SAymeric Wibo #define TB_CFG_CAP_VSC			0x05
222*2ed98337SAymeric Wibo 	uint8_t				vsc_id;
223*2ed98337SAymeric Wibo 	uint8_t				len;
224*2ed98337SAymeric Wibo } __packed;
225*2ed98337SAymeric Wibo 
226*2ed98337SAymeric Wibo struct tb_cfg_vsec_cap {
227*2ed98337SAymeric Wibo 	struct tb_cfg_cap_hdr		hdr;
228*2ed98337SAymeric Wibo #define TB_CFG_CAP_VSEC			0x05
229*2ed98337SAymeric Wibo 	uint8_t				vsec_id;
230*2ed98337SAymeric Wibo 	uint8_t				len;
231*2ed98337SAymeric Wibo 	uint16_t			vsec_next_cap;
232*2ed98337SAymeric Wibo 	uint16_t			vsec_len;
233*2ed98337SAymeric Wibo } __packed;
234*2ed98337SAymeric Wibo 
235*2ed98337SAymeric Wibo union tb_cfg_cap {
236*2ed98337SAymeric Wibo 	struct tb_cfg_cap_hdr		hdr;
237*2ed98337SAymeric Wibo 	struct tb_cfg_cap_tmu		tmu;
238*2ed98337SAymeric Wibo 	struct tb_cfg_vsc_cap		vsc;
239*2ed98337SAymeric Wibo 	struct tb_cfg_vsec_cap		vsec;
240*2ed98337SAymeric Wibo } __packed;
241*2ed98337SAymeric Wibo 
242*2ed98337SAymeric Wibo #define TB_CFG_VSC_PLUG		0x01	/* Hot Plug and DROM */
243*2ed98337SAymeric Wibo 
244*2ed98337SAymeric Wibo #define TB_CFG_VSEC_LC		0x06	/* Link Controller */
245*2ed98337SAymeric Wibo #define TB_LC_DESC		0x02	/* LC Descriptor fields */
246*2ed98337SAymeric Wibo #define TB_LC_DESC_NUM_LC_MASK	GENMASK(3, 0)
247*2ed98337SAymeric Wibo #define TB_LC_DESC_SIZE_SHIFT	8
248*2ed98337SAymeric Wibo #define TB_LC_DESC_SIZE_MASK	GENMASK(15, 8)
249*2ed98337SAymeric Wibo #define TB_LC_DESC_PORT_SHIFT	16
250*2ed98337SAymeric Wibo #define TB_LC_DESC_PORT_MASK	GENMASK(27, 16)
251*2ed98337SAymeric Wibo #define TB_LC_UUID		0x03
252*2ed98337SAymeric Wibo #define TB_LC_DP_SINK		0x10	/* Display Port config */
253*2ed98337SAymeric Wibo #define TB_LC_PORT_ATTR		0x8d	/* Port attributes */
254*2ed98337SAymeric Wibo #define TB_LC_PORT_ATTR_BE	(1 << 12)	/* Bonding enabled */
255*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL		0x96	/* Sleep control */
256*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOC	(1 << 1)
257*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOD	(1 << 2)
258*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOU4	(1 << 5)
259*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_WOP	(1 << 6)
260*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L1C	(1 << 16)
261*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L1D	(1 << 17)
262*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L2C	(1 << 20)
263*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_L2D	(1 << 21)
264*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_UFP	(1 << 30)
265*2ed98337SAymeric Wibo #define TB_LC_SX_CTRL_SLP	(1 << 31)
266*2ed98337SAymeric Wibo #define TB_LC_POWER		0x740
267*2ed98337SAymeric Wibo 
268*2ed98337SAymeric Wibo /* Config space adapter basic registers 8.2.2.1 */
269*2ed98337SAymeric Wibo struct tb_cfg_adapter {
270*2ed98337SAymeric Wibo 	uint16_t			vendor_id;	/* ADP CS0 */
271*2ed98337SAymeric Wibo 	uint16_t			product_id;
272*2ed98337SAymeric Wibo 	uint32_t			adp_cs1;	/* ADP CS1 */
273*2ed98337SAymeric Wibo #define ADP_CS1_NEXT_CAP_MASK		GENMASK(7,0)
274*2ed98337SAymeric Wibo #define GET_ADP_CS_NEXT_CAP(a)		(a->adp_cs1 & \
275*2ed98337SAymeric Wibo 					ADP_CS1_NEXT_CAP_MASK)
276*2ed98337SAymeric Wibo #define ADP_CS1_COUNTER_SHIFT		8
277*2ed98337SAymeric Wibo #define ADP_CS1_COUNTER_MASK		GENMASK(18,8)
278*2ed98337SAymeric Wibo #define GET_ADP_CS_MAX_COUNTERS(a)	((a->adp_cs1 & \
279*2ed98337SAymeric Wibo 					ADP_CS1_COUNTER_MASK) >> \
280*2ed98337SAymeric Wibo 					ADP_CS1_COUNTER_SHIFT)
281*2ed98337SAymeric Wibo #define CFG_COUNTER_CONFIG_FLAG		(1 << 19)
282*2ed98337SAymeric Wibo 	uint32_t			adp_cs2;	/* ADP CS2 */
283*2ed98337SAymeric Wibo #define ADP_CS2_TYPE_MASK		GENMASK(23,0)
284*2ed98337SAymeric Wibo #define GET_ADP_CS_TYPE(a)		(a->adp_cs2 & ADP_CS2_TYPE_MASK)
285*2ed98337SAymeric Wibo #define ADP_CS2_UNSUPPORTED		0x000000
286*2ed98337SAymeric Wibo #define ADP_CS2_LANE			0x000001
287*2ed98337SAymeric Wibo #define ADP_CS2_HOSTIF			0x000002
288*2ed98337SAymeric Wibo #define ADP_CS2_PCIE_DFP		0x100101
289*2ed98337SAymeric Wibo #define ADP_CS2_PCIE_UFP		0x100102
290*2ed98337SAymeric Wibo #define ADP_CS2_DP_OUT			0x0e0102
291*2ed98337SAymeric Wibo #define ADP_CS2_DP_IN			0x0e0101
292*2ed98337SAymeric Wibo #define ADP_CS2_USB3_DFP		0x200101
293*2ed98337SAymeric Wibo #define ADP_CS2_USB3_UFP		0x200102
294*2ed98337SAymeric Wibo 	uint32_t			adp_cs3;	/* ADP CS 3 */
295*2ed98337SAymeric Wibo #define ADP_CS3_ADP_NUM_SHIFT		20
296*2ed98337SAymeric Wibo #define ADP_CS3_ADP_NUM_MASK		GENMASK(25,20)
297*2ed98337SAymeric Wibo #define GET_ADP_CS_ADP_NUM(a)		((a->adp_cs3 & \
298*2ed98337SAymeric Wibo 					ADP_CS3_ADP_NUM_MASK) >> \
299*2ed98337SAymeric Wibo 					ADP_CS3_ADP_NUM_SHIFT)
300*2ed98337SAymeric Wibo #define CFG_ADP_HEC_ERROR		(1 << 29)
301*2ed98337SAymeric Wibo #define CFG_ADP_FC_ERROR		(1 << 30)
302*2ed98337SAymeric Wibo #define CFG_ADP_SBC			(1 << 31)
303*2ed98337SAymeric Wibo } __packed;
304*2ed98337SAymeric Wibo 
305*2ed98337SAymeric Wibo /* Config space lane adapter capability 8.2.2.3 */
306*2ed98337SAymeric Wibo struct tb_cfg_cap_lane {
307*2ed98337SAymeric Wibo 	struct tb_cfg_cap_hdr	hdr;		/* LANE_ADP_CS_0 */
308*2ed98337SAymeric Wibo #define TB_CFG_CAP_LANE		0x01
309*2ed98337SAymeric Wibo 	/* Supported link/width/power */
310*2ed98337SAymeric Wibo 	uint16_t		supp_lwp;
311*2ed98337SAymeric Wibo #define CAP_LANE_LINK_MASK	GENMASK(3,0)
312*2ed98337SAymeric Wibo #define CAP_LANE_LINK_GEN3	0x0004
313*2ed98337SAymeric Wibo #define CAP_LANE_LINK_GEN2	0x0008
314*2ed98337SAymeric Wibo #define CAP_LANE_WIDTH_MASK	GENMASK(9,4)
315*2ed98337SAymeric Wibo #define CAP_LANE_WIDTH_1X	0x0010
316*2ed98337SAymeric Wibo #define CAP_LANE_WIDTH_2X	0x0020
317*2ed98337SAymeric Wibo #define CAP_LANE_POWER_CL0	0x0400
318*2ed98337SAymeric Wibo #define CAP_LANE_POWER_CL1	0x0800
319*2ed98337SAymeric Wibo #define CAP_LANE_POWER_CL2	0x1000
320*2ed98337SAymeric Wibo 	/* Target link/width/power */
321*2ed98337SAymeric Wibo 	uint16_t		targ_lwp;	/* LANE_ADP_CS_1 */
322*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_GEN2	0x0008
323*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_GEN3	0x000c
324*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_SINGLE	0x0010
325*2ed98337SAymeric Wibo #define CAP_LANE_TARGET_DUAL	0x0030
326*2ed98337SAymeric Wibo #define CAP_LANE_DISABLE	0x4000
327*2ed98337SAymeric Wibo #define CAP_LANE_BONDING	0x8000
328*2ed98337SAymeric Wibo 	/* Current link/width/state */
329*2ed98337SAymeric Wibo 	uint16_t		current_lws;
330*2ed98337SAymeric Wibo /* Same definitions a supp_lwp for bits 0 - 9 */
331*2ed98337SAymeric Wibo #define CAP_LANE_STATE_SHIFT	10
332*2ed98337SAymeric Wibo #define CAP_LANE_STATE_MASK	GENMASK(13,10)
333*2ed98337SAymeric Wibo #define CAP_LANE_STATE_DISABLE	(0x0 << CAP_LANE_STATE_SHIFT)
334*2ed98337SAymeric Wibo #define CAP_LANE_STATE_TRAINING	(0x1 << CAP_LANE_STATE_SHIFT)
335*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CL0	(0x2 << CAP_LANE_STATE_SHIFT)
336*2ed98337SAymeric Wibo #define CAP_LANE_STATE_TXCL0	(0x3 << CAP_LANE_STATE_SHIFT)
337*2ed98337SAymeric Wibo #define CAP_LANE_STATE_RXCL0	(0x4 << CAP_LANE_STATE_SHIFT)
338*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CL1	(0x5 << CAP_LANE_STATE_SHIFT)
339*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CL2	(0x6 << CAP_LANE_STATE_SHIFT)
340*2ed98337SAymeric Wibo #define CAP_LANE_STATE_CLD	(0x7 << CAP_LANE_STATE_SHIFT)
341*2ed98337SAymeric Wibo #define CAP_LANE_PMS		0x4000
342*2ed98337SAymeric Wibo 	/* Logical Layer Errors */
343*2ed98337SAymeric Wibo 	uint16_t		lle;		/* LANE_ADP_CS_2 */
344*2ed98337SAymeric Wibo #define CAP_LANE_LLE_MASK	GENMASK(6,0)
345*2ed98337SAymeric Wibo #define CAP_LANE_LLE_ALE	0x01
346*2ed98337SAymeric Wibo #define CAP_LANE_LLE_OSE	0x02
347*2ed98337SAymeric Wibo #define CAP_LANE_LLE_TE		0x04
348*2ed98337SAymeric Wibo #define CAP_LANE_LLE_EBE	0x08
349*2ed98337SAymeric Wibo #define CAP_LANE_LLE_DBE	0x10
350*2ed98337SAymeric Wibo #define CAP_LANE_LLE_RDE	0x20
351*2ed98337SAymeric Wibo #define CAP_LANE_LLE_RST	0x40
352*2ed98337SAymeric Wibo 	uint16_t		lle_enable;
353*2ed98337SAymeric Wibo } __packed;
354*2ed98337SAymeric Wibo 
355*2ed98337SAymeric Wibo /* Config space path registers 8.2.3.1 */
356*2ed98337SAymeric Wibo struct tb_cfg_path {
357*2ed98337SAymeric Wibo } __packed;
358*2ed98337SAymeric Wibo 
359*2ed98337SAymeric Wibo /* Config space counter registers 8.2.4 */
360*2ed98337SAymeric Wibo struct tb_cfg_counters {
361*2ed98337SAymeric Wibo } __packed;
362*2ed98337SAymeric Wibo 
363*2ed98337SAymeric Wibo #endif /* _TBCFG_REG_H */
364