1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2*4882a593Smuzhiyun /* QLogic qed NIC Driver 3*4882a593Smuzhiyun * Copyright (c) 2015-2017 QLogic Corporation 4*4882a593Smuzhiyun * Copyright (c) 2019-2020 Marvell International Ltd. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _QED_ETH_IF_H 8*4882a593Smuzhiyun #define _QED_ETH_IF_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/list.h> 11*4882a593Smuzhiyun #include <linux/if_link.h> 12*4882a593Smuzhiyun #include <linux/qed/eth_common.h> 13*4882a593Smuzhiyun #include <linux/qed/qed_if.h> 14*4882a593Smuzhiyun #include <linux/qed/qed_iov_if.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* 64 max queues * (1 rx + 4 tx-cos + 1 xdp) */ 17*4882a593Smuzhiyun #define QED_MIN_L2_CONS (2 + NUM_PHYS_TCS_4PORT_K2) 18*4882a593Smuzhiyun #define QED_MAX_L2_CONS (64 * (QED_MIN_L2_CONS)) 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun struct qed_queue_start_common_params { 21*4882a593Smuzhiyun /* Should always be relative to entity sending this. */ 22*4882a593Smuzhiyun u8 vport_id; 23*4882a593Smuzhiyun u16 queue_id; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* Relative, but relevant only for PFs */ 26*4882a593Smuzhiyun u8 stats_id; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct qed_sb_info *p_sb; 29*4882a593Smuzhiyun u8 sb_idx; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun u8 tc; 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct qed_rxq_start_ret_params { 35*4882a593Smuzhiyun void __iomem *p_prod; 36*4882a593Smuzhiyun void *p_handle; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct qed_txq_start_ret_params { 40*4882a593Smuzhiyun void __iomem *p_doorbell; 41*4882a593Smuzhiyun void *p_handle; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun enum qed_filter_config_mode { 45*4882a593Smuzhiyun QED_FILTER_CONFIG_MODE_DISABLE, 46*4882a593Smuzhiyun QED_FILTER_CONFIG_MODE_5_TUPLE, 47*4882a593Smuzhiyun QED_FILTER_CONFIG_MODE_L4_PORT, 48*4882a593Smuzhiyun QED_FILTER_CONFIG_MODE_IP_DEST, 49*4882a593Smuzhiyun QED_FILTER_CONFIG_MODE_IP_SRC, 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct qed_ntuple_filter_params { 53*4882a593Smuzhiyun /* Physically mapped address containing header of buffer to be used 54*4882a593Smuzhiyun * as filter. 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun dma_addr_t addr; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Length of header in bytes */ 59*4882a593Smuzhiyun u16 length; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* Relative queue-id to receive classified packet */ 62*4882a593Smuzhiyun #define QED_RFS_NTUPLE_QID_RSS ((u16)-1) 63*4882a593Smuzhiyun u16 qid; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Identifier can either be according to vport-id or vfid */ 66*4882a593Smuzhiyun bool b_is_vf; 67*4882a593Smuzhiyun u8 vport_id; 68*4882a593Smuzhiyun u8 vf_id; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* true iff this filter is to be added. Else to be removed */ 71*4882a593Smuzhiyun bool b_is_add; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* If flow needs to be dropped */ 74*4882a593Smuzhiyun bool b_is_drop; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct qed_dev_eth_info { 78*4882a593Smuzhiyun struct qed_dev_info common; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun u8 num_queues; 81*4882a593Smuzhiyun u8 num_tc; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun u8 port_mac[ETH_ALEN]; 84*4882a593Smuzhiyun u16 num_vlan_filters; 85*4882a593Smuzhiyun u16 num_mac_filters; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Legacy VF - this affects the datapath, so qede has to know */ 88*4882a593Smuzhiyun bool is_legacy; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* Might depend on available resources [in case of VF] */ 91*4882a593Smuzhiyun bool xdp_supported; 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct qed_update_vport_rss_params { 95*4882a593Smuzhiyun void *rss_ind_table[128]; 96*4882a593Smuzhiyun u32 rss_key[10]; 97*4882a593Smuzhiyun u8 rss_caps; 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun struct qed_update_vport_params { 101*4882a593Smuzhiyun u8 vport_id; 102*4882a593Smuzhiyun u8 update_vport_active_flg; 103*4882a593Smuzhiyun u8 vport_active_flg; 104*4882a593Smuzhiyun u8 update_tx_switching_flg; 105*4882a593Smuzhiyun u8 tx_switching_flg; 106*4882a593Smuzhiyun u8 update_accept_any_vlan_flg; 107*4882a593Smuzhiyun u8 accept_any_vlan; 108*4882a593Smuzhiyun u8 update_rss_flg; 109*4882a593Smuzhiyun struct qed_update_vport_rss_params rss_params; 110*4882a593Smuzhiyun }; 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun struct qed_start_vport_params { 113*4882a593Smuzhiyun bool remove_inner_vlan; 114*4882a593Smuzhiyun bool handle_ptp_pkts; 115*4882a593Smuzhiyun bool gro_enable; 116*4882a593Smuzhiyun bool drop_ttl0; 117*4882a593Smuzhiyun u8 vport_id; 118*4882a593Smuzhiyun u16 mtu; 119*4882a593Smuzhiyun bool clear_stats; 120*4882a593Smuzhiyun }; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun enum qed_filter_rx_mode_type { 123*4882a593Smuzhiyun QED_FILTER_RX_MODE_TYPE_REGULAR, 124*4882a593Smuzhiyun QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC, 125*4882a593Smuzhiyun QED_FILTER_RX_MODE_TYPE_PROMISC, 126*4882a593Smuzhiyun }; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun enum qed_filter_xcast_params_type { 129*4882a593Smuzhiyun QED_FILTER_XCAST_TYPE_ADD, 130*4882a593Smuzhiyun QED_FILTER_XCAST_TYPE_DEL, 131*4882a593Smuzhiyun QED_FILTER_XCAST_TYPE_REPLACE, 132*4882a593Smuzhiyun }; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun struct qed_filter_ucast_params { 135*4882a593Smuzhiyun enum qed_filter_xcast_params_type type; 136*4882a593Smuzhiyun u8 vlan_valid; 137*4882a593Smuzhiyun u16 vlan; 138*4882a593Smuzhiyun u8 mac_valid; 139*4882a593Smuzhiyun unsigned char mac[ETH_ALEN]; 140*4882a593Smuzhiyun }; 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun struct qed_filter_mcast_params { 143*4882a593Smuzhiyun enum qed_filter_xcast_params_type type; 144*4882a593Smuzhiyun u8 num; 145*4882a593Smuzhiyun unsigned char mac[64][ETH_ALEN]; 146*4882a593Smuzhiyun }; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun union qed_filter_type_params { 149*4882a593Smuzhiyun enum qed_filter_rx_mode_type accept_flags; 150*4882a593Smuzhiyun struct qed_filter_ucast_params ucast; 151*4882a593Smuzhiyun struct qed_filter_mcast_params mcast; 152*4882a593Smuzhiyun }; 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun enum qed_filter_type { 155*4882a593Smuzhiyun QED_FILTER_TYPE_UCAST, 156*4882a593Smuzhiyun QED_FILTER_TYPE_MCAST, 157*4882a593Smuzhiyun QED_FILTER_TYPE_RX_MODE, 158*4882a593Smuzhiyun QED_MAX_FILTER_TYPES, 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun struct qed_filter_params { 162*4882a593Smuzhiyun enum qed_filter_type type; 163*4882a593Smuzhiyun union qed_filter_type_params filter; 164*4882a593Smuzhiyun }; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun struct qed_tunn_params { 167*4882a593Smuzhiyun u16 vxlan_port; 168*4882a593Smuzhiyun u8 update_vxlan_port; 169*4882a593Smuzhiyun u16 geneve_port; 170*4882a593Smuzhiyun u8 update_geneve_port; 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun struct qed_eth_cb_ops { 174*4882a593Smuzhiyun struct qed_common_cb_ops common; 175*4882a593Smuzhiyun void (*force_mac) (void *dev, u8 *mac, bool forced); 176*4882a593Smuzhiyun void (*ports_update)(void *dev, u16 vxlan_port, u16 geneve_port); 177*4882a593Smuzhiyun }; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #define QED_MAX_PHC_DRIFT_PPB 291666666 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun enum qed_ptp_filter_type { 182*4882a593Smuzhiyun QED_PTP_FILTER_NONE, 183*4882a593Smuzhiyun QED_PTP_FILTER_ALL, 184*4882a593Smuzhiyun QED_PTP_FILTER_V1_L4_EVENT, 185*4882a593Smuzhiyun QED_PTP_FILTER_V1_L4_GEN, 186*4882a593Smuzhiyun QED_PTP_FILTER_V2_L4_EVENT, 187*4882a593Smuzhiyun QED_PTP_FILTER_V2_L4_GEN, 188*4882a593Smuzhiyun QED_PTP_FILTER_V2_L2_EVENT, 189*4882a593Smuzhiyun QED_PTP_FILTER_V2_L2_GEN, 190*4882a593Smuzhiyun QED_PTP_FILTER_V2_EVENT, 191*4882a593Smuzhiyun QED_PTP_FILTER_V2_GEN 192*4882a593Smuzhiyun }; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun enum qed_ptp_hwtstamp_tx_type { 195*4882a593Smuzhiyun QED_PTP_HWTSTAMP_TX_OFF, 196*4882a593Smuzhiyun QED_PTP_HWTSTAMP_TX_ON, 197*4882a593Smuzhiyun }; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #ifdef CONFIG_DCB 200*4882a593Smuzhiyun /* Prototype declaration of qed_eth_dcbnl_ops should match with the declaration 201*4882a593Smuzhiyun * of dcbnl_rtnl_ops structure. 202*4882a593Smuzhiyun */ 203*4882a593Smuzhiyun struct qed_eth_dcbnl_ops { 204*4882a593Smuzhiyun /* IEEE 802.1Qaz std */ 205*4882a593Smuzhiyun int (*ieee_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); 206*4882a593Smuzhiyun int (*ieee_setpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); 207*4882a593Smuzhiyun int (*ieee_getets)(struct qed_dev *cdev, struct ieee_ets *ets); 208*4882a593Smuzhiyun int (*ieee_setets)(struct qed_dev *cdev, struct ieee_ets *ets); 209*4882a593Smuzhiyun int (*ieee_peer_getets)(struct qed_dev *cdev, struct ieee_ets *ets); 210*4882a593Smuzhiyun int (*ieee_peer_getpfc)(struct qed_dev *cdev, struct ieee_pfc *pfc); 211*4882a593Smuzhiyun int (*ieee_getapp)(struct qed_dev *cdev, struct dcb_app *app); 212*4882a593Smuzhiyun int (*ieee_setapp)(struct qed_dev *cdev, struct dcb_app *app); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* CEE std */ 215*4882a593Smuzhiyun u8 (*getstate)(struct qed_dev *cdev); 216*4882a593Smuzhiyun u8 (*setstate)(struct qed_dev *cdev, u8 state); 217*4882a593Smuzhiyun void (*getpgtccfgtx)(struct qed_dev *cdev, int prio, u8 *prio_type, 218*4882a593Smuzhiyun u8 *pgid, u8 *bw_pct, u8 *up_map); 219*4882a593Smuzhiyun void (*getpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 *bw_pct); 220*4882a593Smuzhiyun void (*getpgtccfgrx)(struct qed_dev *cdev, int prio, u8 *prio_type, 221*4882a593Smuzhiyun u8 *pgid, u8 *bw_pct, u8 *up_map); 222*4882a593Smuzhiyun void (*getpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 *bw_pct); 223*4882a593Smuzhiyun void (*getpfccfg)(struct qed_dev *cdev, int prio, u8 *setting); 224*4882a593Smuzhiyun void (*setpfccfg)(struct qed_dev *cdev, int prio, u8 setting); 225*4882a593Smuzhiyun u8 (*getcap)(struct qed_dev *cdev, int capid, u8 *cap); 226*4882a593Smuzhiyun int (*getnumtcs)(struct qed_dev *cdev, int tcid, u8 *num); 227*4882a593Smuzhiyun u8 (*getpfcstate)(struct qed_dev *cdev); 228*4882a593Smuzhiyun int (*getapp)(struct qed_dev *cdev, u8 idtype, u16 id); 229*4882a593Smuzhiyun u8 (*getfeatcfg)(struct qed_dev *cdev, int featid, u8 *flags); 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* DCBX configuration */ 232*4882a593Smuzhiyun u8 (*getdcbx)(struct qed_dev *cdev); 233*4882a593Smuzhiyun void (*setpgtccfgtx)(struct qed_dev *cdev, int prio, 234*4882a593Smuzhiyun u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map); 235*4882a593Smuzhiyun void (*setpgtccfgrx)(struct qed_dev *cdev, int prio, 236*4882a593Smuzhiyun u8 pri_type, u8 pgid, u8 bw_pct, u8 up_map); 237*4882a593Smuzhiyun void (*setpgbwgcfgtx)(struct qed_dev *cdev, int pgid, u8 bw_pct); 238*4882a593Smuzhiyun void (*setpgbwgcfgrx)(struct qed_dev *cdev, int pgid, u8 bw_pct); 239*4882a593Smuzhiyun u8 (*setall)(struct qed_dev *cdev); 240*4882a593Smuzhiyun int (*setnumtcs)(struct qed_dev *cdev, int tcid, u8 num); 241*4882a593Smuzhiyun void (*setpfcstate)(struct qed_dev *cdev, u8 state); 242*4882a593Smuzhiyun int (*setapp)(struct qed_dev *cdev, u8 idtype, u16 idval, u8 up); 243*4882a593Smuzhiyun u8 (*setdcbx)(struct qed_dev *cdev, u8 state); 244*4882a593Smuzhiyun u8 (*setfeatcfg)(struct qed_dev *cdev, int featid, u8 flags); 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun /* Peer apps */ 247*4882a593Smuzhiyun int (*peer_getappinfo)(struct qed_dev *cdev, 248*4882a593Smuzhiyun struct dcb_peer_app_info *info, 249*4882a593Smuzhiyun u16 *app_count); 250*4882a593Smuzhiyun int (*peer_getapptable)(struct qed_dev *cdev, struct dcb_app *table); 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun /* CEE peer */ 253*4882a593Smuzhiyun int (*cee_peer_getpfc)(struct qed_dev *cdev, struct cee_pfc *pfc); 254*4882a593Smuzhiyun int (*cee_peer_getpg)(struct qed_dev *cdev, struct cee_pg *pg); 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun #endif 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun struct qed_eth_ptp_ops { 259*4882a593Smuzhiyun int (*cfg_filters)(struct qed_dev *, enum qed_ptp_filter_type, 260*4882a593Smuzhiyun enum qed_ptp_hwtstamp_tx_type); 261*4882a593Smuzhiyun int (*read_rx_ts)(struct qed_dev *, u64 *); 262*4882a593Smuzhiyun int (*read_tx_ts)(struct qed_dev *, u64 *); 263*4882a593Smuzhiyun int (*read_cc)(struct qed_dev *, u64 *); 264*4882a593Smuzhiyun int (*disable)(struct qed_dev *); 265*4882a593Smuzhiyun int (*adjfreq)(struct qed_dev *, s32); 266*4882a593Smuzhiyun int (*enable)(struct qed_dev *); 267*4882a593Smuzhiyun }; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun struct qed_eth_ops { 270*4882a593Smuzhiyun const struct qed_common_ops *common; 271*4882a593Smuzhiyun #ifdef CONFIG_QED_SRIOV 272*4882a593Smuzhiyun const struct qed_iov_hv_ops *iov; 273*4882a593Smuzhiyun #endif 274*4882a593Smuzhiyun #ifdef CONFIG_DCB 275*4882a593Smuzhiyun const struct qed_eth_dcbnl_ops *dcb; 276*4882a593Smuzhiyun #endif 277*4882a593Smuzhiyun const struct qed_eth_ptp_ops *ptp; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun int (*fill_dev_info)(struct qed_dev *cdev, 280*4882a593Smuzhiyun struct qed_dev_eth_info *info); 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun void (*register_ops)(struct qed_dev *cdev, 283*4882a593Smuzhiyun struct qed_eth_cb_ops *ops, 284*4882a593Smuzhiyun void *cookie); 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun bool(*check_mac) (struct qed_dev *cdev, u8 *mac); 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun int (*vport_start)(struct qed_dev *cdev, 289*4882a593Smuzhiyun struct qed_start_vport_params *params); 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun int (*vport_stop)(struct qed_dev *cdev, 292*4882a593Smuzhiyun u8 vport_id); 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun int (*vport_update)(struct qed_dev *cdev, 295*4882a593Smuzhiyun struct qed_update_vport_params *params); 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun int (*q_rx_start)(struct qed_dev *cdev, 298*4882a593Smuzhiyun u8 rss_num, 299*4882a593Smuzhiyun struct qed_queue_start_common_params *params, 300*4882a593Smuzhiyun u16 bd_max_bytes, 301*4882a593Smuzhiyun dma_addr_t bd_chain_phys_addr, 302*4882a593Smuzhiyun dma_addr_t cqe_pbl_addr, 303*4882a593Smuzhiyun u16 cqe_pbl_size, 304*4882a593Smuzhiyun struct qed_rxq_start_ret_params *ret_params); 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun int (*q_rx_stop)(struct qed_dev *cdev, u8 rss_id, void *handle); 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun int (*q_tx_start)(struct qed_dev *cdev, 309*4882a593Smuzhiyun u8 rss_num, 310*4882a593Smuzhiyun struct qed_queue_start_common_params *params, 311*4882a593Smuzhiyun dma_addr_t pbl_addr, 312*4882a593Smuzhiyun u16 pbl_size, 313*4882a593Smuzhiyun struct qed_txq_start_ret_params *ret_params); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun int (*q_tx_stop)(struct qed_dev *cdev, u8 rss_id, void *handle); 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun int (*filter_config)(struct qed_dev *cdev, 318*4882a593Smuzhiyun struct qed_filter_params *params); 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun int (*fastpath_stop)(struct qed_dev *cdev); 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun int (*eth_cqe_completion)(struct qed_dev *cdev, 323*4882a593Smuzhiyun u8 rss_id, 324*4882a593Smuzhiyun struct eth_slow_path_rx_cqe *cqe); 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun void (*get_vport_stats)(struct qed_dev *cdev, 327*4882a593Smuzhiyun struct qed_eth_stats *stats); 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun int (*tunn_config)(struct qed_dev *cdev, 330*4882a593Smuzhiyun struct qed_tunn_params *params); 331*4882a593Smuzhiyun 332*4882a593Smuzhiyun int (*ntuple_filter_config)(struct qed_dev *cdev, 333*4882a593Smuzhiyun void *cookie, 334*4882a593Smuzhiyun struct qed_ntuple_filter_params *params); 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun int (*configure_arfs_searcher)(struct qed_dev *cdev, 337*4882a593Smuzhiyun enum qed_filter_config_mode mode); 338*4882a593Smuzhiyun int (*get_coalesce)(struct qed_dev *cdev, u16 *coal, void *handle); 339*4882a593Smuzhiyun int (*req_bulletin_update_mac)(struct qed_dev *cdev, u8 *mac); 340*4882a593Smuzhiyun }; 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun const struct qed_eth_ops *qed_get_eth_ops(void); 343*4882a593Smuzhiyun void qed_put_eth_ops(void); 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun #endif 346