1*5de6c855SPrzemek Kitszel /* SPDX-License-Identifier: GPL-2.0 */ 2*5de6c855SPrzemek Kitszel /* Copyright (C) 2022, Intel Corporation. */ 3*5de6c855SPrzemek Kitszel 4*5de6c855SPrzemek Kitszel #ifndef _ICE_VIRTCHNL_H_ 5*5de6c855SPrzemek Kitszel #define _ICE_VIRTCHNL_H_ 6*5de6c855SPrzemek Kitszel 7*5de6c855SPrzemek Kitszel #include <linux/types.h> 8*5de6c855SPrzemek Kitszel #include <linux/bitops.h> 9*5de6c855SPrzemek Kitszel #include <linux/if_ether.h> 10*5de6c855SPrzemek Kitszel #include <linux/avf/virtchnl.h> 11*5de6c855SPrzemek Kitszel #include "ice_vf_lib.h" 12*5de6c855SPrzemek Kitszel 13*5de6c855SPrzemek Kitszel /* Restrict number of MAC Addr and VLAN that non-trusted VF can programmed */ 14*5de6c855SPrzemek Kitszel #define ICE_MAX_VLAN_PER_VF 8 15*5de6c855SPrzemek Kitszel 16*5de6c855SPrzemek Kitszel #define ICE_DFLT_QUANTA 1024 17*5de6c855SPrzemek Kitszel #define ICE_MAX_QUANTA_SIZE 4096 18*5de6c855SPrzemek Kitszel #define ICE_MIN_QUANTA_SIZE 256 19*5de6c855SPrzemek Kitszel 20*5de6c855SPrzemek Kitszel #define calc_quanta_desc(x) \ 21*5de6c855SPrzemek Kitszel max_t(u16, 12, min_t(u16, 63, (((x) + 66) / 132) * 2 + 4)) 22*5de6c855SPrzemek Kitszel 23*5de6c855SPrzemek Kitszel /* MAC filters: 1 is reserved for the VF's default/perm_addr/LAA MAC, 1 for 24*5de6c855SPrzemek Kitszel * broadcast, and 16 for additional unicast/multicast filters 25*5de6c855SPrzemek Kitszel */ 26*5de6c855SPrzemek Kitszel #define ICE_MAX_MACADDR_PER_VF 18 27*5de6c855SPrzemek Kitszel #define ICE_FLEX_DESC_RXDID_MAX_NUM 64 28*5de6c855SPrzemek Kitszel 29*5de6c855SPrzemek Kitszel /* Priority to be compared against previous priority from the pipe */ 30*5de6c855SPrzemek Kitszel #define ICE_RXDID_PRIO 0x03 31*5de6c855SPrzemek Kitszel 32*5de6c855SPrzemek Kitszel /* VFs only get a single VSI. For ice hardware, the VF does not need to know 33*5de6c855SPrzemek Kitszel * its VSI index. However, the virtchnl interface requires a VSI number, 34*5de6c855SPrzemek Kitszel * mainly due to legacy hardware. 35*5de6c855SPrzemek Kitszel * 36*5de6c855SPrzemek Kitszel * Since the VF doesn't need this information, report a static value to the VF 37*5de6c855SPrzemek Kitszel * instead of leaking any information about the PF or hardware setup. 38*5de6c855SPrzemek Kitszel */ 39*5de6c855SPrzemek Kitszel #define ICE_VF_VSI_ID 1 40*5de6c855SPrzemek Kitszel 41*5de6c855SPrzemek Kitszel struct ice_virtchnl_ops { 42*5de6c855SPrzemek Kitszel int (*get_ver_msg)(struct ice_vf *vf, u8 *msg); 43*5de6c855SPrzemek Kitszel int (*get_vf_res_msg)(struct ice_vf *vf, u8 *msg); 44*5de6c855SPrzemek Kitszel void (*reset_vf)(struct ice_vf *vf); 45*5de6c855SPrzemek Kitszel int (*add_mac_addr_msg)(struct ice_vf *vf, u8 *msg); 46*5de6c855SPrzemek Kitszel int (*del_mac_addr_msg)(struct ice_vf *vf, u8 *msg); 47*5de6c855SPrzemek Kitszel int (*cfg_qs_msg)(struct ice_vf *vf, u8 *msg); 48*5de6c855SPrzemek Kitszel int (*ena_qs_msg)(struct ice_vf *vf, u8 *msg); 49*5de6c855SPrzemek Kitszel int (*dis_qs_msg)(struct ice_vf *vf, u8 *msg); 50*5de6c855SPrzemek Kitszel int (*request_qs_msg)(struct ice_vf *vf, u8 *msg); 51*5de6c855SPrzemek Kitszel int (*cfg_irq_map_msg)(struct ice_vf *vf, u8 *msg); 52*5de6c855SPrzemek Kitszel int (*config_rss_key)(struct ice_vf *vf, u8 *msg); 53*5de6c855SPrzemek Kitszel int (*config_rss_lut)(struct ice_vf *vf, u8 *msg); 54*5de6c855SPrzemek Kitszel int (*config_rss_hfunc)(struct ice_vf *vf, u8 *msg); 55*5de6c855SPrzemek Kitszel int (*get_stats_msg)(struct ice_vf *vf, u8 *msg); 56*5de6c855SPrzemek Kitszel int (*cfg_promiscuous_mode_msg)(struct ice_vf *vf, u8 *msg); 57*5de6c855SPrzemek Kitszel int (*add_vlan_msg)(struct ice_vf *vf, u8 *msg); 58*5de6c855SPrzemek Kitszel int (*remove_vlan_msg)(struct ice_vf *vf, u8 *msg); 59*5de6c855SPrzemek Kitszel int (*query_rxdid)(struct ice_vf *vf); 60*5de6c855SPrzemek Kitszel int (*get_rss_hashcfg)(struct ice_vf *vf); 61*5de6c855SPrzemek Kitszel int (*set_rss_hashcfg)(struct ice_vf *vf, u8 *msg); 62*5de6c855SPrzemek Kitszel int (*ena_vlan_stripping)(struct ice_vf *vf); 63*5de6c855SPrzemek Kitszel int (*dis_vlan_stripping)(struct ice_vf *vf); 64*5de6c855SPrzemek Kitszel int (*handle_rss_cfg_msg)(struct ice_vf *vf, u8 *msg, bool add); 65*5de6c855SPrzemek Kitszel int (*add_fdir_fltr_msg)(struct ice_vf *vf, u8 *msg); 66*5de6c855SPrzemek Kitszel int (*del_fdir_fltr_msg)(struct ice_vf *vf, u8 *msg); 67*5de6c855SPrzemek Kitszel int (*get_offload_vlan_v2_caps)(struct ice_vf *vf); 68*5de6c855SPrzemek Kitszel int (*add_vlan_v2_msg)(struct ice_vf *vf, u8 *msg); 69*5de6c855SPrzemek Kitszel int (*remove_vlan_v2_msg)(struct ice_vf *vf, u8 *msg); 70*5de6c855SPrzemek Kitszel int (*ena_vlan_stripping_v2_msg)(struct ice_vf *vf, u8 *msg); 71*5de6c855SPrzemek Kitszel int (*dis_vlan_stripping_v2_msg)(struct ice_vf *vf, u8 *msg); 72*5de6c855SPrzemek Kitszel int (*ena_vlan_insertion_v2_msg)(struct ice_vf *vf, u8 *msg); 73*5de6c855SPrzemek Kitszel int (*dis_vlan_insertion_v2_msg)(struct ice_vf *vf, u8 *msg); 74*5de6c855SPrzemek Kitszel int (*get_qos_caps)(struct ice_vf *vf); 75*5de6c855SPrzemek Kitszel int (*cfg_q_tc_map)(struct ice_vf *vf, u8 *msg); 76*5de6c855SPrzemek Kitszel int (*cfg_q_bw)(struct ice_vf *vf, u8 *msg); 77*5de6c855SPrzemek Kitszel int (*cfg_q_quanta)(struct ice_vf *vf, u8 *msg); 78*5de6c855SPrzemek Kitszel int (*get_ptp_cap)(struct ice_vf *vf, 79*5de6c855SPrzemek Kitszel const struct virtchnl_ptp_caps *msg); 80*5de6c855SPrzemek Kitszel int (*get_phc_time)(struct ice_vf *vf); 81*5de6c855SPrzemek Kitszel }; 82*5de6c855SPrzemek Kitszel 83*5de6c855SPrzemek Kitszel #ifdef CONFIG_PCI_IOV 84*5de6c855SPrzemek Kitszel void ice_virtchnl_set_dflt_ops(struct ice_vf *vf); 85*5de6c855SPrzemek Kitszel void ice_virtchnl_set_repr_ops(struct ice_vf *vf); 86*5de6c855SPrzemek Kitszel void ice_vc_notify_vf_link_state(struct ice_vf *vf); 87*5de6c855SPrzemek Kitszel void ice_vc_notify_link_state(struct ice_pf *pf); 88*5de6c855SPrzemek Kitszel void ice_vc_notify_reset(struct ice_pf *pf); 89*5de6c855SPrzemek Kitszel int 90*5de6c855SPrzemek Kitszel ice_vc_send_msg_to_vf(struct ice_vf *vf, u32 v_opcode, 91*5de6c855SPrzemek Kitszel enum virtchnl_status_code v_retval, u8 *msg, u16 msglen); 92*5de6c855SPrzemek Kitszel bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id); 93*5de6c855SPrzemek Kitszel void ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event, 94*5de6c855SPrzemek Kitszel struct ice_mbx_data *mbxdata); 95*5de6c855SPrzemek Kitszel void ice_vf_ena_rxq_interrupt(struct ice_vsi *vsi, u32 q_idx); 96*5de6c855SPrzemek Kitszel void ice_vf_ena_txq_interrupt(struct ice_vsi *vsi, u32 q_idx); 97*5de6c855SPrzemek Kitszel int ice_vf_ena_vlan_promisc(struct ice_vf *vf, struct ice_vsi *vsi, 98*5de6c855SPrzemek Kitszel struct ice_vlan *vlan); 99*5de6c855SPrzemek Kitszel bool ice_is_vlan_promisc_allowed(struct ice_vf *vf); 100*5de6c855SPrzemek Kitszel #else /* CONFIG_PCI_IOV */ 101*5de6c855SPrzemek Kitszel static inline void ice_virtchnl_set_dflt_ops(struct ice_vf *vf) { } 102*5de6c855SPrzemek Kitszel static inline void ice_virtchnl_set_repr_ops(struct ice_vf *vf) { } 103*5de6c855SPrzemek Kitszel static inline void ice_vc_notify_vf_link_state(struct ice_vf *vf) { } 104*5de6c855SPrzemek Kitszel static inline void ice_vc_notify_link_state(struct ice_pf *pf) { } 105*5de6c855SPrzemek Kitszel static inline void ice_vc_notify_reset(struct ice_pf *pf) { } 106*5de6c855SPrzemek Kitszel static inline void ice_vf_ena_rxq_interrupt(struct ice_vsi *vsi, u32 q_idx) { } 107*5de6c855SPrzemek Kitszel static inline void ice_vf_ena_txq_interrupt(struct ice_vsi *vsi, u32 q_idx) { } 108*5de6c855SPrzemek Kitszel 109*5de6c855SPrzemek Kitszel static inline int ice_vf_ena_vlan_promisc(struct ice_vf *vf, 110*5de6c855SPrzemek Kitszel struct ice_vsi *vsi, 111*5de6c855SPrzemek Kitszel struct ice_vlan *vlan) 112*5de6c855SPrzemek Kitszel { 113*5de6c855SPrzemek Kitszel return -EOPNOTSUPP; 114*5de6c855SPrzemek Kitszel } 115*5de6c855SPrzemek Kitszel 116*5de6c855SPrzemek Kitszel static inline bool ice_is_vlan_promisc_allowed(struct ice_vf *vf) 117*5de6c855SPrzemek Kitszel { 118*5de6c855SPrzemek Kitszel return false; 119*5de6c855SPrzemek Kitszel } 120*5de6c855SPrzemek Kitszel 121*5de6c855SPrzemek Kitszel static inline int 122*5de6c855SPrzemek Kitszel ice_vc_send_msg_to_vf(struct ice_vf *vf, u32 v_opcode, 123*5de6c855SPrzemek Kitszel enum virtchnl_status_code v_retval, u8 *msg, u16 msglen) 124*5de6c855SPrzemek Kitszel { 125*5de6c855SPrzemek Kitszel return -EOPNOTSUPP; 126*5de6c855SPrzemek Kitszel } 127*5de6c855SPrzemek Kitszel 128*5de6c855SPrzemek Kitszel static inline bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id) 129*5de6c855SPrzemek Kitszel { 130*5de6c855SPrzemek Kitszel return false; 131*5de6c855SPrzemek Kitszel } 132*5de6c855SPrzemek Kitszel 133*5de6c855SPrzemek Kitszel static inline void 134*5de6c855SPrzemek Kitszel ice_vc_process_vf_msg(struct ice_pf *pf, struct ice_rq_event_info *event, 135*5de6c855SPrzemek Kitszel struct ice_mbx_data *mbxdata) 136*5de6c855SPrzemek Kitszel { 137*5de6c855SPrzemek Kitszel } 138*5de6c855SPrzemek Kitszel #endif /* !CONFIG_PCI_IOV */ 139*5de6c855SPrzemek Kitszel 140*5de6c855SPrzemek Kitszel #endif /* _ICE_VIRTCHNL_H_ */ 141