if_bwfm_pci.h revision 1.2 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 (at) 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