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