Home | History | Annotate | Line # | Download | only in pci
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