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