xref: /netbsd-src/sys/dev/pci/if_bwfm_pci.h (revision 0b5c63bcba7623c87cd64ea67fc7df7bed23e33a)
1 /*	$NetBSD: if_bwfm_pci.h,v 1.2 2021/08/26 21:33:36 andvar Exp $	*/
2 /*	$OpenBSD: if_bwfm_pci.h,v 1.2 2018/01/05 23:30:16 patrick Exp $	*/
3 /*
4  * Copyright (c) 2010-2016 Broadcom Corporation
5  * Copyright (c) 2017 Patrick Wildt <patrick@blueri.se>
6  *
7  * Permission to use, copy, modify, and/or distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /* Registers */
21 #define BWFM_PCI_BAR0_WINDOW			0x80
22 #define BWFM_PCI_BAR0_REG_SIZE			0x1000
23 
24 #define BWFM_PCI_ARMCR4REG_BANKIDX		0x40
25 #define BWFM_PCI_ARMCR4REG_BANKPDA		0x4C
26 
27 #define BWFM_PCI_PCIE2REG_INTMASK		0x24
28 #define BWFM_PCI_PCIE2REG_MAILBOXINT		0x48
29 #define BWFM_PCI_PCIE2REG_MAILBOXMASK		0x4C
30 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_FN0_0	0x0100
31 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_FN0_1	0x0200
32 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB0	0x10000
33 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB1	0x20000
34 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB0	0x40000
35 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB1	0x80000
36 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB0	0x100000
37 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB1	0x200000
38 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB0	0x400000
39 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB1	0x800000
40 #define  BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H_DB		\
41 		(BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB0 |	\
42 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB1 |	\
43 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB0 |	\
44 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB1 |	\
45 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB0 |	\
46 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB1 |	\
47 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB0 |	\
48 		 BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB1)
49 
50 #define BWFM_PCI_PCIE2REG_CONFIGADDR		0x120
51 #define BWFM_PCI_PCIE2REG_CONFIGDATA		0x124
52 #define BWFM_PCI_PCIE2REG_H2D_MAILBOX		0x140
53 
54 #define BWFM_PCI_CFGREG_STATUS_CMD		0x004
55 #define BWFM_PCI_CFGREG_PM_CSR			0x04C
56 #define BWFM_PCI_CFGREG_MSI_CAP			0x058
57 #define BWFM_PCI_CFGREG_MSI_ADDR_L		0x05C
58 #define BWFM_PCI_CFGREG_MSI_ADDR_H		0x060
59 #define BWFM_PCI_CFGREG_MSI_DATA		0x064
60 #define BWFM_PCI_CFGREG_LINK_STATUS_CTRL	0x0BC
61 #define  BWFM_PCI_CFGREG_LINK_STATUS_CTRL_ASPM_ENAB	0x3
62 #define BWFM_PCI_CFGREG_LINK_STATUS_CTRL2	0x0DC
63 #define BWFM_PCI_CFGREG_RBAR_CTRL		0x228
64 #define BWFM_PCI_CFGREG_PML1_SUB_CTRL1		0x248
65 #define BWFM_PCI_CFGREG_REG_BAR2_CONFIG		0x4E0
66 #define BWFM_PCI_CFGREG_REG_BAR3_CONFIG		0x4F4
67 
68 #define BWFM_RAMSIZE				0x6c
69 #define  BWFM_RAMSIZE_MAGIC			0x534d4152	/* SMAR */
70 
71 #define BWFM_SHARED_INFO			0x000
72 #define  BWFM_SHARED_INFO_MIN_VERSION			5
73 #define  BWFM_SHARED_INFO_MAX_VERSION			6
74 #define  BWFM_SHARED_INFO_VERSION_MASK			0x00FF
75 #define  BWFM_SHARED_INFO_DMA_INDEX			0x10000
76 #define  BWFM_SHARED_INFO_DMA_2B_IDX			0x100000
77 #define BWFM_SHARED_CONSOLE_ADDR		0x14
78 #define BWFM_SHARED_MAX_RXBUFPOST		0x22
79 #define  BWFM_SHARED_MAX_RXBUFPOST_DEFAULT		255
80 #define BWFM_SHARED_RX_DATAOFFSET		0x24
81 #define BWFM_SHARED_HTOD_MB_DATA_ADDR		0x28
82 #define BWFM_SHARED_DTOH_MB_DATA_ADDR		0x2c
83 #define BWFM_SHARED_RING_INFO_ADDR		0x30
84 #define BWFM_SHARED_DMA_SCRATCH_LEN		0x34
85 #define BWFM_SHARED_DMA_SCRATCH_ADDR_LOW	0x38
86 #define BWFM_SHARED_DMA_SCRATCH_ADDR_HIGH	0x3c
87 #define BWFM_SHARED_DMA_RINGUPD_LEN		0x40
88 #define BWFM_SHARED_DMA_RINGUPD_ADDR_LOW	0x44
89 #define BWFM_SHARED_DMA_RINGUPD_ADDR_HIGH	0x48
90 
91 #define BWFM_RING_MAX_ITEM			0x04
92 #define BWFM_RING_LEN_ITEMS			0x06
93 #define BWFM_RING_MEM_BASE_ADDR_LOW		0x08
94 #define BWFM_RING_MEM_BASE_ADDR_HIGH		0x0c
95 #define BWFM_RING_MEM_SZ			16
96 
97 #define BWFM_CONSOLE_BUFADDR			0x08
98 #define BWFM_CONSOLE_BUFSIZE			0x0c
99 #define BWFM_CONSOLE_WRITEIDX			0x10
100 
101 struct bwfm_pci_ringinfo {
102 	uint32_t		ringmem;
103 	uint32_t		h2d_w_idx_ptr;
104 	uint32_t		h2d_r_idx_ptr;
105 	uint32_t		d2h_w_idx_ptr;
106 	uint32_t		d2h_r_idx_ptr;
107 	uint32_t		h2d_w_idx_hostaddr_low;
108 	uint32_t		h2d_w_idx_hostaddr_high;
109 	uint32_t		h2d_r_idx_hostaddr_low;
110 	uint32_t		h2d_r_idx_hostaddr_high;
111 	uint32_t		d2h_w_idx_hostaddr_low;
112 	uint32_t		d2h_w_idx_hostaddr_high;
113 	uint32_t		d2h_r_idx_hostaddr_low;
114 	uint32_t		d2h_r_idx_hostaddr_high;
115 	uint16_t		max_flowrings;
116 	uint16_t		max_submissionrings;
117 	uint16_t		max_completionrings;
118 };
119 
120 /* Msgbuf defines */
121 #define MSGBUF_IOCTL_RESP_TIMEOUT		2000 /* msecs */
122 #define MSGBUF_IOCTL_REQ_PKTID			0xFFFE
123 #define MSGBUF_MAX_PKT_SIZE			2048
124 
125 #define MSGBUF_TYPE_GEN_STATUS			0x1
126 #define MSGBUF_TYPE_RING_STATUS			0x2
127 #define MSGBUF_TYPE_FLOW_RING_CREATE		0x3
128 #define MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT	0x4
129 #define MSGBUF_TYPE_FLOW_RING_DELETE		0x5
130 #define MSGBUF_TYPE_FLOW_RING_DELETE_CMPLT	0x6
131 #define MSGBUF_TYPE_FLOW_RING_FLUSH		0x7
132 #define MSGBUF_TYPE_FLOW_RING_FLUSH_CMPLT	0x8
133 #define MSGBUF_TYPE_IOCTLPTR_REQ		0x9
134 #define MSGBUF_TYPE_IOCTLPTR_REQ_ACK		0xA
135 #define MSGBUF_TYPE_IOCTLRESP_BUF_POST		0xB
136 #define MSGBUF_TYPE_IOCTL_CMPLT			0xC
137 #define MSGBUF_TYPE_EVENT_BUF_POST		0xD
138 #define MSGBUF_TYPE_WL_EVENT			0xE
139 #define MSGBUF_TYPE_TX_POST			0xF
140 #define MSGBUF_TYPE_TX_STATUS			0x10
141 #define MSGBUF_TYPE_RXBUF_POST			0x11
142 #define MSGBUF_TYPE_RX_CMPLT			0x12
143 #define MSGBUF_TYPE_LPBK_DMAXFER		0x13
144 #define MSGBUF_TYPE_LPBK_DMAXFER_CMPLT		0x14
145 
146 struct msgbuf_common_hdr {
147 	uint8_t			msgtype;
148 	uint8_t			ifidx;
149 	uint8_t			flags;
150 	uint8_t			rsvd0;
151 	uint32_t		request_id;
152 };
153 
154 struct msgbuf_buf_addr {
155 	uint32_t		low_addr;
156 	uint32_t		high_addr;
157 };
158 
159 struct msgbuf_ioctl_req_hdr {
160 	struct msgbuf_common_hdr	msg;
161 	uint32_t			cmd;
162 	uint16_t			trans_id;
163 	uint16_t			input_buf_len;
164 	uint16_t			output_buf_len;
165 	uint16_t			rsvd0[3];
166 	struct msgbuf_buf_addr		req_buf_addr;
167 	uint32_t			rsvd1[2];
168 };
169 
170 struct msgbuf_tx_msghdr {
171 	struct msgbuf_common_hdr	msg;
172 	uint8_t				txhdr[ETHER_HDR_LEN];
173 	uint8_t				flags;
174 #define BWFM_MSGBUF_PKT_FLAGS_FRAME_802_3	(1 << 0)
175 #define BWFM_MSGBUF_PKT_FLAGS_PRIO_SHIFT	5
176 	uint8_t				seg_cnt;
177 	struct msgbuf_buf_addr		metadata_buf_addr;
178 	struct msgbuf_buf_addr		data_buf_addr;
179 	uint16_t			metadata_buf_len;
180 	uint16_t			data_len;
181 	uint32_t			rsvd0;
182 };
183 
184 struct msgbuf_rx_bufpost {
185 	struct msgbuf_common_hdr	msg;
186 	uint16_t			metadata_buf_len;
187 	uint16_t			data_buf_len;
188 	uint32_t			rsvd0;
189 	struct msgbuf_buf_addr		metadata_buf_addr;
190 	struct msgbuf_buf_addr		data_buf_addr;
191 };
192 
193 struct msgbuf_rx_ioctl_resp_or_event {
194 	struct msgbuf_common_hdr	msg;
195 	uint16_t			host_buf_len;
196 	uint16_t			rsvd0[3];
197 	struct msgbuf_buf_addr		host_buf_addr;
198 	uint32_t			rsvd1[4];
199 };
200 
201 struct msgbuf_completion_hdr {
202 	uint16_t			status;
203 	uint16_t			flow_ring_id;
204 };
205 
206 struct msgbuf_rx_event {
207 	struct msgbuf_common_hdr	msg;
208 	struct msgbuf_completion_hdr	compl_hdr;
209 	uint16_t			event_data_len;
210 	uint16_t			seqnum;
211 	uint16_t			rsvd0[4];
212 };
213 
214 struct msgbuf_ioctl_resp_hdr {
215 	struct msgbuf_common_hdr	msg;
216 	struct msgbuf_completion_hdr	compl_hdr;
217 	uint16_t			resp_len;
218 	uint16_t			trans_id;
219 	uint32_t			cmd;
220 	uint32_t			rsvd0;
221 };
222 
223 struct msgbuf_tx_status {
224 	struct msgbuf_common_hdr	msg;
225 	struct msgbuf_completion_hdr	compl_hdr;
226 	uint16_t			metadata_len;
227 	uint16_t			tx_status;
228 };
229 
230 struct msgbuf_rx_complete {
231 	struct msgbuf_common_hdr	msg;
232 	struct msgbuf_completion_hdr	compl_hdr;
233 	uint16_t			metadata_len;
234 	uint16_t			data_len;
235 	uint16_t			data_offset;
236 	uint16_t			flags;
237 	uint32_t			rx_status_0;
238 	uint32_t			rx_status_1;
239 	uint32_t			rsvd0;
240 };
241 
242 struct msgbuf_tx_flowring_create_req {
243 	struct msgbuf_common_hdr	msg;
244 	uint8_t				da[ETHER_ADDR_LEN];
245 	uint8_t				sa[ETHER_ADDR_LEN];
246 	uint8_t				tid;
247 	uint8_t				if_flags;
248 	uint16_t			flow_ring_id;
249 	uint8_t				tc;
250 	uint8_t				priority;
251 	uint16_t			int_vector;
252 	uint16_t			max_items;
253 	uint16_t			len_item;
254 	struct msgbuf_buf_addr		flow_ring_addr;
255 };
256 
257 struct msgbuf_tx_flowring_delete_req {
258 	struct msgbuf_common_hdr	msg;
259 	uint16_t			flow_ring_id;
260 	uint16_t			reason;
261 	uint32_t			rsvd0[7];
262 };
263 
264 struct msgbuf_flowring_create_resp {
265 	struct msgbuf_common_hdr	msg;
266 	struct msgbuf_completion_hdr	compl_hdr;
267 	uint32_t			rsvd0[3];
268 };
269 
270 struct msgbuf_flowring_delete_resp {
271 	struct msgbuf_common_hdr	msg;
272 	struct msgbuf_completion_hdr	compl_hdr;
273 	uint32_t			rsvd0[3];
274 };
275 
276 struct msgbuf_flowring_flush_resp {
277 	struct msgbuf_common_hdr	msg;
278 	struct msgbuf_completion_hdr	compl_hdr;
279 	uint32_t			rsvd0[3];
280 };
281