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