xref: /OK3568_Linux_fs/kernel/drivers/usb/early/xhci-dbc.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * xhci-dbc.h - xHCI debug capability early driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2016 Intel Corporation
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Author: Lu Baolu <baolu.lu@linux.intel.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef __LINUX_XHCI_DBC_H
11*4882a593Smuzhiyun #define __LINUX_XHCI_DBC_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/types.h>
14*4882a593Smuzhiyun #include <linux/usb/ch9.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  * xHCI Debug Capability Register interfaces:
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun struct xdbc_regs {
20*4882a593Smuzhiyun 	__le32	capability;
21*4882a593Smuzhiyun 	__le32	doorbell;
22*4882a593Smuzhiyun 	__le32	ersts;		/* Event Ring Segment Table Size*/
23*4882a593Smuzhiyun 	__le32	__reserved_0;	/* 0c~0f reserved bits */
24*4882a593Smuzhiyun 	__le64	erstba;		/* Event Ring Segment Table Base Address */
25*4882a593Smuzhiyun 	__le64	erdp;		/* Event Ring Dequeue Pointer */
26*4882a593Smuzhiyun 	__le32	control;
27*4882a593Smuzhiyun 	__le32	status;
28*4882a593Smuzhiyun 	__le32	portsc;		/* Port status and control */
29*4882a593Smuzhiyun 	__le32	__reserved_1;	/* 2b~28 reserved bits */
30*4882a593Smuzhiyun 	__le64	dccp;		/* Debug Capability Context Pointer */
31*4882a593Smuzhiyun 	__le32	devinfo1;	/* Device Descriptor Info Register 1 */
32*4882a593Smuzhiyun 	__le32	devinfo2;	/* Device Descriptor Info Register 2 */
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #define DEBUG_MAX_BURST(p)	(((p) >> 16) & 0xff)
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define CTRL_DBC_RUN		BIT(0)
38*4882a593Smuzhiyun #define CTRL_PORT_ENABLE	BIT(1)
39*4882a593Smuzhiyun #define CTRL_HALT_OUT_TR	BIT(2)
40*4882a593Smuzhiyun #define CTRL_HALT_IN_TR		BIT(3)
41*4882a593Smuzhiyun #define CTRL_DBC_RUN_CHANGE	BIT(4)
42*4882a593Smuzhiyun #define CTRL_DBC_ENABLE		BIT(31)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #define DCST_DEBUG_PORT(p)	(((p) >> 24) & 0xff)
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #define PORTSC_CONN_STATUS	BIT(0)
47*4882a593Smuzhiyun #define PORTSC_CONN_CHANGE	BIT(17)
48*4882a593Smuzhiyun #define PORTSC_RESET_CHANGE	BIT(21)
49*4882a593Smuzhiyun #define PORTSC_LINK_CHANGE	BIT(22)
50*4882a593Smuzhiyun #define PORTSC_CONFIG_CHANGE	BIT(23)
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /*
53*4882a593Smuzhiyun  * xHCI Debug Capability data structures:
54*4882a593Smuzhiyun  */
55*4882a593Smuzhiyun struct xdbc_trb {
56*4882a593Smuzhiyun 	__le32 field[4];
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun struct xdbc_erst_entry {
60*4882a593Smuzhiyun 	__le64	seg_addr;
61*4882a593Smuzhiyun 	__le32	seg_size;
62*4882a593Smuzhiyun 	__le32	__reserved_0;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun struct xdbc_info_context {
66*4882a593Smuzhiyun 	__le64	string0;
67*4882a593Smuzhiyun 	__le64	manufacturer;
68*4882a593Smuzhiyun 	__le64	product;
69*4882a593Smuzhiyun 	__le64	serial;
70*4882a593Smuzhiyun 	__le32	length;
71*4882a593Smuzhiyun 	__le32	__reserved_0[7];
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun struct xdbc_ep_context {
75*4882a593Smuzhiyun 	__le32	ep_info1;
76*4882a593Smuzhiyun 	__le32	ep_info2;
77*4882a593Smuzhiyun 	__le64	deq;
78*4882a593Smuzhiyun 	__le32	tx_info;
79*4882a593Smuzhiyun 	__le32	__reserved_0[11];
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun struct xdbc_context {
83*4882a593Smuzhiyun 	struct xdbc_info_context	info;
84*4882a593Smuzhiyun 	struct xdbc_ep_context		out;
85*4882a593Smuzhiyun 	struct xdbc_ep_context		in;
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define XDBC_INFO_CONTEXT_SIZE		48
89*4882a593Smuzhiyun #define XDBC_MAX_STRING_LENGTH		64
90*4882a593Smuzhiyun #define XDBC_STRING_MANUFACTURER	"Linux Foundation"
91*4882a593Smuzhiyun #define XDBC_STRING_PRODUCT		"Linux USB GDB Target"
92*4882a593Smuzhiyun #define XDBC_STRING_SERIAL		"0001"
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun struct xdbc_strings {
95*4882a593Smuzhiyun 	char	string0[XDBC_MAX_STRING_LENGTH];
96*4882a593Smuzhiyun 	char	manufacturer[XDBC_MAX_STRING_LENGTH];
97*4882a593Smuzhiyun 	char	product[XDBC_MAX_STRING_LENGTH];
98*4882a593Smuzhiyun 	char	serial[XDBC_MAX_STRING_LENGTH];
99*4882a593Smuzhiyun };
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define XDBC_PROTOCOL		1	/* GNU Remote Debug Command Set */
102*4882a593Smuzhiyun #define XDBC_VENDOR_ID		0x1d6b	/* Linux Foundation 0x1d6b */
103*4882a593Smuzhiyun #define XDBC_PRODUCT_ID		0x0011	/* __le16 idProduct; device 0011 */
104*4882a593Smuzhiyun #define XDBC_DEVICE_REV		0x0010	/* 0.10 */
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /*
107*4882a593Smuzhiyun  * xHCI Debug Capability software state structures:
108*4882a593Smuzhiyun  */
109*4882a593Smuzhiyun struct xdbc_segment {
110*4882a593Smuzhiyun 	struct xdbc_trb		*trbs;
111*4882a593Smuzhiyun 	dma_addr_t		dma;
112*4882a593Smuzhiyun };
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun #define XDBC_TRBS_PER_SEGMENT	256
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun struct xdbc_ring {
117*4882a593Smuzhiyun 	struct xdbc_segment	*segment;
118*4882a593Smuzhiyun 	struct xdbc_trb		*enqueue;
119*4882a593Smuzhiyun 	struct xdbc_trb		*dequeue;
120*4882a593Smuzhiyun 	u32			cycle_state;
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /*
124*4882a593Smuzhiyun  * These are the "Endpoint ID" (also known as "Context Index") values for the
125*4882a593Smuzhiyun  * OUT Transfer Ring and the IN Transfer Ring of a Debug Capability Context data
126*4882a593Smuzhiyun  * structure.
127*4882a593Smuzhiyun  * According to the "eXtensible Host Controller Interface for Universal Serial
128*4882a593Smuzhiyun  * Bus (xHCI)" specification, section "7.6.3.2 Endpoint Contexts and Transfer
129*4882a593Smuzhiyun  * Rings", these should be 0 and 1, and those are the values AMD machines give
130*4882a593Smuzhiyun  * you; but Intel machines seem to use the formula from section "4.5.1 Device
131*4882a593Smuzhiyun  * Context Index", which is supposed to be used for the Device Context only.
132*4882a593Smuzhiyun  * Luckily the values from Intel don't overlap with those from AMD, so we can
133*4882a593Smuzhiyun  * just test for both.
134*4882a593Smuzhiyun  */
135*4882a593Smuzhiyun #define XDBC_EPID_OUT		0
136*4882a593Smuzhiyun #define XDBC_EPID_IN		1
137*4882a593Smuzhiyun #define XDBC_EPID_OUT_INTEL	2
138*4882a593Smuzhiyun #define XDBC_EPID_IN_INTEL	3
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun struct xdbc_state {
141*4882a593Smuzhiyun 	u16			vendor;
142*4882a593Smuzhiyun 	u16			device;
143*4882a593Smuzhiyun 	u32			bus;
144*4882a593Smuzhiyun 	u32			dev;
145*4882a593Smuzhiyun 	u32			func;
146*4882a593Smuzhiyun 	void __iomem		*xhci_base;
147*4882a593Smuzhiyun 	u64			xhci_start;
148*4882a593Smuzhiyun 	size_t			xhci_length;
149*4882a593Smuzhiyun 	int			port_number;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* DbC register base */
152*4882a593Smuzhiyun 	struct xdbc_regs __iomem *xdbc_reg;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	/* DbC table page */
155*4882a593Smuzhiyun 	dma_addr_t		table_dma;
156*4882a593Smuzhiyun 	void			*table_base;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	/* event ring segment table */
159*4882a593Smuzhiyun 	dma_addr_t		erst_dma;
160*4882a593Smuzhiyun 	size_t			erst_size;
161*4882a593Smuzhiyun 	void			*erst_base;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	/* event ring segments */
164*4882a593Smuzhiyun 	struct xdbc_ring	evt_ring;
165*4882a593Smuzhiyun 	struct xdbc_segment	evt_seg;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun 	/* debug capability contexts */
168*4882a593Smuzhiyun 	dma_addr_t		dbcc_dma;
169*4882a593Smuzhiyun 	size_t			dbcc_size;
170*4882a593Smuzhiyun 	void			*dbcc_base;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	/* descriptor strings */
173*4882a593Smuzhiyun 	dma_addr_t		string_dma;
174*4882a593Smuzhiyun 	size_t			string_size;
175*4882a593Smuzhiyun 	void			*string_base;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	/* bulk OUT endpoint */
178*4882a593Smuzhiyun 	struct xdbc_ring	out_ring;
179*4882a593Smuzhiyun 	struct xdbc_segment	out_seg;
180*4882a593Smuzhiyun 	void			*out_buf;
181*4882a593Smuzhiyun 	dma_addr_t		out_dma;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	/* bulk IN endpoint */
184*4882a593Smuzhiyun 	struct xdbc_ring	in_ring;
185*4882a593Smuzhiyun 	struct xdbc_segment	in_seg;
186*4882a593Smuzhiyun 	void			*in_buf;
187*4882a593Smuzhiyun 	dma_addr_t		in_dma;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	u32			flags;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	/* spinlock for early_xdbc_write() reentrancy */
192*4882a593Smuzhiyun 	raw_spinlock_t		lock;
193*4882a593Smuzhiyun };
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun #define XDBC_PCI_MAX_BUSES	256
196*4882a593Smuzhiyun #define XDBC_PCI_MAX_DEVICES	32
197*4882a593Smuzhiyun #define XDBC_PCI_MAX_FUNCTION	8
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #define XDBC_TABLE_ENTRY_SIZE	64
200*4882a593Smuzhiyun #define XDBC_ERST_ENTRY_NUM	1
201*4882a593Smuzhiyun #define XDBC_DBCC_ENTRY_NUM	3
202*4882a593Smuzhiyun #define XDBC_STRING_ENTRY_NUM	4
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* Bits definitions for xdbc_state.flags: */
205*4882a593Smuzhiyun #define XDBC_FLAGS_INITIALIZED	BIT(0)
206*4882a593Smuzhiyun #define XDBC_FLAGS_IN_STALL	BIT(1)
207*4882a593Smuzhiyun #define XDBC_FLAGS_OUT_STALL	BIT(2)
208*4882a593Smuzhiyun #define XDBC_FLAGS_IN_PROCESS	BIT(3)
209*4882a593Smuzhiyun #define XDBC_FLAGS_OUT_PROCESS	BIT(4)
210*4882a593Smuzhiyun #define XDBC_FLAGS_CONFIGURED	BIT(5)
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun #define XDBC_MAX_PACKET		1024
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun /* Door bell target: */
215*4882a593Smuzhiyun #define OUT_EP_DOORBELL		0
216*4882a593Smuzhiyun #define IN_EP_DOORBELL		1
217*4882a593Smuzhiyun #define DOOR_BELL_TARGET(p)	(((p) & 0xff) << 8)
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun #define xdbc_read64(regs)	xhci_read_64(NULL, (regs))
220*4882a593Smuzhiyun #define xdbc_write64(val, regs)	xhci_write_64(NULL, (val), (regs))
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun #endif /* __LINUX_XHCI_DBC_H */
223