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