xref: /freebsd/sys/dev/bnxt/bnxt_en/bnxt_sriov.h (revision 7c450d1127c7f08361f848c0ac57189910da8d3b)
1 #ifndef _BNXT_SRIOV_H_
2 #define _BNXT_SRIOV_H_
3 
4 #include <sys/iov_schema.h>
5 #include <linux/pci.h>
6 #include <dev/pci/pci_iov.h>
7 
8 #include "opt_global.h"
9 #include "bnxt.h"
10 
11 #ifndef PCI_IOV
12 #define PCI_IOV 1
13 #endif
14 
15 /* macro definations */
16 
17 #define BNXT_MAX_VFS 4
18 #define BNXT_HWRM_REQ_MAX_SIZE	128
19 #define BNXT_MAX_VF_CMD_FWD_PAGES  4
20 #define BNXT_VF_QOS		0x1
21 #define BNXT_VF_SPOOFCHK	0x2
22 #define BNXT_VF_LINK_FORCED	0x4
23 #define BNXT_VF_LINK_UP		0x8
24 #define BNXT_VF_TRUST		0x10
25 #define BNXT_VLAN_VID_MASK	0x0fff
26 
27 #define BNXT_EXEC_FWD_RESP_SIZE_ERR(n)					\
28 	((offsetof(struct hwrm_exec_fwd_resp_input, encap_request) + n) >\
29 	 offsetof(struct hwrm_exec_fwd_resp_input, encap_resp_target_id))
30 
31 #define BNXT_VF_RESV_STRATEGY_MAXIMAL   0
32 #define BNXT_VF_RESV_STRATEGY_MINIMAL   1
33 #define BNXT_VF_RESV_STRATEGY_MINIMAL_STATIC    2
34 #define FUNC_RESOURCE_QCAPS_RESP_FLAGS_MIN_GUARANTEED     0x1UL
35 
36 #define BNXT_SRIOV_LOCK_INIT(sc, _name)	\
37 	mtx_init(&(sc)->sriov_lock, _name, "sriov_lock", MTX_DEF | MTX_NOWITNESS)
38 #define BNXT_SRIOV_LOCK(sc)		mtx_lock(&(sc)->sriov_lock)
39 #define BNXT_SRIOV_UNLOCK(sc)		mtx_unlock(&(sc)->sriov_lock)
40 #define BNXT_SRIOV_LOCK_DESTROY(sc)				\
41 	do {							\
42 		if (mtx_initialized(&(sc)->sriov_lock))		\
43 			mtx_destroy(&(sc)->sriov_lock);		\
44 } while (0)
45 
46 
47 /* structure declartions/definations */
48 
49 struct bnxt_softc;
50 
51 struct bnxt_vf_info {
52 	uint8_t		vfnum;
53 	uint16_t	fw_fid;
54 	uint8_t		mac_addr[ETHER_ADDR_LEN];
55 	uint8_t		vf_mac_addr[ETHER_ADDR_LEN];
56 	uint32_t	vlan;
57 	uint32_t	flags;
58 	uint32_t	func_qcfg_flags;
59 	uint32_t	min_tx_rate;
60 	uint32_t	max_tx_rate;
61 	uint16_t	min_tx_rings;
62 	uint16_t	max_tx_rings;
63 	uint16_t	min_rx_rings;
64 	uint16_t	max_rx_rings;
65 	uint16_t	min_cp_rings;
66 	uint16_t	max_cp_rings;
67 	uint16_t	min_rsscos_ctxs;
68 	uint16_t	max_rsscos_ctxs;
69 	uint16_t	min_stat_ctxs;
70 	uint16_t	max_stat_ctxs;
71 	uint16_t	min_ring_grps;
72 	uint16_t	max_hw_ring_grps;
73 	uint16_t	min_vnics;
74 	uint16_t	max_vnics;
75 	uint16_t	min_irqs;
76 	uint16_t	max_irqs;
77 	uint16_t	min_l2_ctxs;
78 	uint16_t	max_l2_ctxs;
79 	void		*hwrm_cmd_req_addr;
80 	bus_addr_t	hwrm_cmd_req_dma_addr;
81 	struct		iflib_dma_info	hwrm_cmd_req;
82 	uint16_t	trusted;
83 	bool		spoofchk;
84 };
85 
86 struct bnxt_resc_map {
87 	uint16_t *min_field;
88 	uint16_t *max_field;
89 	uint16_t hw_max;
90 	uint16_t pf_alloc;
91 };
92 
93 /* function prototypes */
94 
95 void bnxt_sriov_attach(struct bnxt_softc *softc);
96 int bnxt_iov_init(if_ctx_t ctx, uint16_t num_vfs, const nvlist_t *params);
97 void bnxt_iov_uninit(if_ctx_t ctx);
98 int bnxt_iov_vf_add(if_ctx_t ctx, uint16_t vfnum, const nvlist_t *params);
99 int bnxt_hwrm_func_vf_resource_free(struct bnxt_softc *softc, int num_vfs);
100 void bnxt_free_vf_resources(struct bnxt_softc *softc);
101 int bnxt_create_trusted_vf_sysctls(struct bnxt_softc *softc, uint16_t num_vfs);
102 int bnxt_create_spoofchk_vf_sysctls(struct bnxt_softc *softc, uint16_t num_vfs);
103 bool bnxt_is_trusted_vf(struct bnxt_softc *bp, struct bnxt_vf_info *vf);
104 void bnxt_hwrm_exec_fwd_req(struct bnxt_softc *bp);
105 void bnxt_destroy_trusted_vf_sysctls(struct bnxt_softc *softc);
106 int bnxt_set_vf_trust(struct bnxt_softc *softc, int vf_id, bool trusted);
107 int bnxt_approve_mac(struct bnxt_softc *sc);
108 void bnxt_update_vf_mac(struct bnxt_softc *sc);
109 bool bnxt_promisc_ok(struct bnxt_softc *softc);
110 int bnxt_set_vf_spoofchk(struct bnxt_softc *sc, int vf_id, bool enable);
111 int bnxt_cfg_hw_sriov(struct bnxt_softc *softc, uint16_t *num_vfs, bool reset);
112 void bnxt_reenable_sriov(struct bnxt_softc *bp);
113 
114 
115 #endif /* _BNXT_SRIOV_H_ */
116