132a47e72SYuval Mintz /* QLogic qed NIC Driver 232a47e72SYuval Mintz * Copyright (c) 2015 QLogic Corporation 332a47e72SYuval Mintz * 432a47e72SYuval Mintz * This software is available under the terms of the GNU General Public License 532a47e72SYuval Mintz * (GPL) Version 2, available from the file COPYING in the main directory of 632a47e72SYuval Mintz * this source tree. 732a47e72SYuval Mintz */ 832a47e72SYuval Mintz 932a47e72SYuval Mintz #ifndef _QED_VF_H 1032a47e72SYuval Mintz #define _QED_VF_H 1132a47e72SYuval Mintz 121408cc1fSYuval Mintz struct vf_pf_resc_request { 131408cc1fSYuval Mintz u8 num_rxqs; 141408cc1fSYuval Mintz u8 num_txqs; 151408cc1fSYuval Mintz u8 num_sbs; 161408cc1fSYuval Mintz u8 num_mac_filters; 171408cc1fSYuval Mintz u8 num_vlan_filters; 181408cc1fSYuval Mintz u8 num_mc_filters; 191408cc1fSYuval Mintz u16 padding; 201408cc1fSYuval Mintz }; 211408cc1fSYuval Mintz 221408cc1fSYuval Mintz struct hw_sb_info { 231408cc1fSYuval Mintz u16 hw_sb_id; 241408cc1fSYuval Mintz u8 sb_qid; 251408cc1fSYuval Mintz u8 padding[5]; 261408cc1fSYuval Mintz }; 271408cc1fSYuval Mintz 2837bff2b9SYuval Mintz enum { 2937bff2b9SYuval Mintz PFVF_STATUS_WAITING, 3037bff2b9SYuval Mintz PFVF_STATUS_SUCCESS, 3137bff2b9SYuval Mintz PFVF_STATUS_FAILURE, 3237bff2b9SYuval Mintz PFVF_STATUS_NOT_SUPPORTED, 3337bff2b9SYuval Mintz PFVF_STATUS_NO_RESOURCE, 3437bff2b9SYuval Mintz PFVF_STATUS_FORCED, 3537bff2b9SYuval Mintz }; 3637bff2b9SYuval Mintz 3737bff2b9SYuval Mintz /* vf pf channel tlvs */ 3837bff2b9SYuval Mintz /* general tlv header (used for both vf->pf request and pf->vf response) */ 3937bff2b9SYuval Mintz struct channel_tlv { 4037bff2b9SYuval Mintz u16 type; 4137bff2b9SYuval Mintz u16 length; 4237bff2b9SYuval Mintz }; 4337bff2b9SYuval Mintz 4437bff2b9SYuval Mintz /* header of first vf->pf tlv carries the offset used to calculate reponse 4537bff2b9SYuval Mintz * buffer address 4637bff2b9SYuval Mintz */ 4737bff2b9SYuval Mintz struct vfpf_first_tlv { 4837bff2b9SYuval Mintz struct channel_tlv tl; 4937bff2b9SYuval Mintz u32 padding; 5037bff2b9SYuval Mintz u64 reply_address; 5137bff2b9SYuval Mintz }; 5237bff2b9SYuval Mintz 5337bff2b9SYuval Mintz /* header of pf->vf tlvs, carries the status of handling the request */ 5437bff2b9SYuval Mintz struct pfvf_tlv { 5537bff2b9SYuval Mintz struct channel_tlv tl; 5637bff2b9SYuval Mintz u8 status; 5737bff2b9SYuval Mintz u8 padding[3]; 5837bff2b9SYuval Mintz }; 5937bff2b9SYuval Mintz 6037bff2b9SYuval Mintz /* response tlv used for most tlvs */ 6137bff2b9SYuval Mintz struct pfvf_def_resp_tlv { 6237bff2b9SYuval Mintz struct pfvf_tlv hdr; 6337bff2b9SYuval Mintz }; 6437bff2b9SYuval Mintz 6537bff2b9SYuval Mintz /* used to terminate and pad a tlv list */ 6637bff2b9SYuval Mintz struct channel_list_end_tlv { 6737bff2b9SYuval Mintz struct channel_tlv tl; 6837bff2b9SYuval Mintz u8 padding[4]; 6937bff2b9SYuval Mintz }; 7037bff2b9SYuval Mintz 711408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_LINUX (0) 721408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_WINDOWS (1) 731408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_ESX (2) 741408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_SOLARIS (3) 751408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_LINUX_USERSPACE (4) 761408cc1fSYuval Mintz 771408cc1fSYuval Mintz struct vfpf_acquire_tlv { 781408cc1fSYuval Mintz struct vfpf_first_tlv first_tlv; 791408cc1fSYuval Mintz 801408cc1fSYuval Mintz struct vf_pf_vfdev_info { 811408cc1fSYuval Mintz #define VFPF_ACQUIRE_CAP_OBSOLETE (1 << 0) 821408cc1fSYuval Mintz #define VFPF_ACQUIRE_CAP_100G (1 << 1) /* VF can support 100g */ 831408cc1fSYuval Mintz u64 capabilities; 841408cc1fSYuval Mintz u8 fw_major; 851408cc1fSYuval Mintz u8 fw_minor; 861408cc1fSYuval Mintz u8 fw_revision; 871408cc1fSYuval Mintz u8 fw_engineering; 881408cc1fSYuval Mintz u32 driver_version; 891408cc1fSYuval Mintz u16 opaque_fid; /* ME register value */ 901408cc1fSYuval Mintz u8 os_type; /* VFPF_ACQUIRE_OS_* value */ 911408cc1fSYuval Mintz u8 padding[5]; 921408cc1fSYuval Mintz } vfdev_info; 931408cc1fSYuval Mintz 941408cc1fSYuval Mintz struct vf_pf_resc_request resc_request; 951408cc1fSYuval Mintz 961408cc1fSYuval Mintz u64 bulletin_addr; 971408cc1fSYuval Mintz u32 bulletin_size; 981408cc1fSYuval Mintz u32 padding; 991408cc1fSYuval Mintz }; 1001408cc1fSYuval Mintz 1011408cc1fSYuval Mintz struct pfvf_storm_stats { 1021408cc1fSYuval Mintz u32 address; 1031408cc1fSYuval Mintz u32 len; 1041408cc1fSYuval Mintz }; 1051408cc1fSYuval Mintz 1061408cc1fSYuval Mintz struct pfvf_stats_info { 1071408cc1fSYuval Mintz struct pfvf_storm_stats mstats; 1081408cc1fSYuval Mintz struct pfvf_storm_stats pstats; 1091408cc1fSYuval Mintz struct pfvf_storm_stats tstats; 1101408cc1fSYuval Mintz struct pfvf_storm_stats ustats; 1111408cc1fSYuval Mintz }; 1121408cc1fSYuval Mintz 1131408cc1fSYuval Mintz struct pfvf_acquire_resp_tlv { 1141408cc1fSYuval Mintz struct pfvf_tlv hdr; 1151408cc1fSYuval Mintz 1161408cc1fSYuval Mintz struct pf_vf_pfdev_info { 1171408cc1fSYuval Mintz u32 chip_num; 1181408cc1fSYuval Mintz u32 mfw_ver; 1191408cc1fSYuval Mintz 1201408cc1fSYuval Mintz u16 fw_major; 1211408cc1fSYuval Mintz u16 fw_minor; 1221408cc1fSYuval Mintz u16 fw_rev; 1231408cc1fSYuval Mintz u16 fw_eng; 1241408cc1fSYuval Mintz 1251408cc1fSYuval Mintz u64 capabilities; 1261408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED BIT(0) 1271408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_100G BIT(1) /* If set, 100g PF */ 1281408cc1fSYuval Mintz /* There are old PF versions where the PF might mistakenly override the sanity 1291408cc1fSYuval Mintz * mechanism [version-based] and allow a VF that can't be supported to pass 1301408cc1fSYuval Mintz * the acquisition phase. 1311408cc1fSYuval Mintz * To overcome this, PFs now indicate that they're past that point and the new 1321408cc1fSYuval Mintz * VFs would fail probe on the older PFs that fail to do so. 1331408cc1fSYuval Mintz */ 1341408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE BIT(2) 1351408cc1fSYuval Mintz 1361408cc1fSYuval Mintz u16 db_size; 1371408cc1fSYuval Mintz u8 indices_per_sb; 1381408cc1fSYuval Mintz u8 os_type; 1391408cc1fSYuval Mintz 1401408cc1fSYuval Mintz /* These should match the PF's qed_dev values */ 1411408cc1fSYuval Mintz u16 chip_rev; 1421408cc1fSYuval Mintz u8 dev_type; 1431408cc1fSYuval Mintz 1441408cc1fSYuval Mintz u8 padding; 1451408cc1fSYuval Mintz 1461408cc1fSYuval Mintz struct pfvf_stats_info stats_info; 1471408cc1fSYuval Mintz 1481408cc1fSYuval Mintz u8 port_mac[ETH_ALEN]; 1491408cc1fSYuval Mintz u8 padding2[2]; 1501408cc1fSYuval Mintz } pfdev_info; 1511408cc1fSYuval Mintz 1521408cc1fSYuval Mintz struct pf_vf_resc { 1531408cc1fSYuval Mintz #define PFVF_MAX_QUEUES_PER_VF 16 1541408cc1fSYuval Mintz #define PFVF_MAX_SBS_PER_VF 16 1551408cc1fSYuval Mintz struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF]; 1561408cc1fSYuval Mintz u8 hw_qid[PFVF_MAX_QUEUES_PER_VF]; 1571408cc1fSYuval Mintz u8 cid[PFVF_MAX_QUEUES_PER_VF]; 1581408cc1fSYuval Mintz 1591408cc1fSYuval Mintz u8 num_rxqs; 1601408cc1fSYuval Mintz u8 num_txqs; 1611408cc1fSYuval Mintz u8 num_sbs; 1621408cc1fSYuval Mintz u8 num_mac_filters; 1631408cc1fSYuval Mintz u8 num_vlan_filters; 1641408cc1fSYuval Mintz u8 num_mc_filters; 1651408cc1fSYuval Mintz u8 padding[2]; 1661408cc1fSYuval Mintz } resc; 1671408cc1fSYuval Mintz 1681408cc1fSYuval Mintz u32 bulletin_size; 1691408cc1fSYuval Mintz u32 padding; 1701408cc1fSYuval Mintz }; 1711408cc1fSYuval Mintz 17232a47e72SYuval Mintz #define TLV_BUFFER_SIZE 1024 17332a47e72SYuval Mintz struct tlv_buffer_size { 17432a47e72SYuval Mintz u8 tlv_buffer[TLV_BUFFER_SIZE]; 17532a47e72SYuval Mintz }; 17632a47e72SYuval Mintz 17732a47e72SYuval Mintz union vfpf_tlvs { 17837bff2b9SYuval Mintz struct vfpf_first_tlv first_tlv; 1791408cc1fSYuval Mintz struct vfpf_acquire_tlv acquire; 18037bff2b9SYuval Mintz struct channel_list_end_tlv list_end; 18132a47e72SYuval Mintz struct tlv_buffer_size tlv_buf_size; 18232a47e72SYuval Mintz }; 18332a47e72SYuval Mintz 18432a47e72SYuval Mintz union pfvf_tlvs { 18537bff2b9SYuval Mintz struct pfvf_def_resp_tlv default_resp; 1861408cc1fSYuval Mintz struct pfvf_acquire_resp_tlv acquire_resp; 18732a47e72SYuval Mintz struct tlv_buffer_size tlv_buf_size; 18832a47e72SYuval Mintz }; 18932a47e72SYuval Mintz 19032a47e72SYuval Mintz struct qed_bulletin_content { 19132a47e72SYuval Mintz /* crc of structure to ensure is not in mid-update */ 19232a47e72SYuval Mintz u32 crc; 19332a47e72SYuval Mintz 19432a47e72SYuval Mintz u32 version; 19532a47e72SYuval Mintz 19632a47e72SYuval Mintz /* bitmap indicating which fields hold valid values */ 19732a47e72SYuval Mintz u64 valid_bitmap; 19832a47e72SYuval Mintz }; 19932a47e72SYuval Mintz 20032a47e72SYuval Mintz struct qed_bulletin { 20132a47e72SYuval Mintz dma_addr_t phys; 20232a47e72SYuval Mintz struct qed_bulletin_content *p_virt; 20332a47e72SYuval Mintz u32 size; 20432a47e72SYuval Mintz }; 20532a47e72SYuval Mintz 20637bff2b9SYuval Mintz enum { 20737bff2b9SYuval Mintz CHANNEL_TLV_NONE, /* ends tlv sequence */ 2081408cc1fSYuval Mintz CHANNEL_TLV_ACQUIRE, 20937bff2b9SYuval Mintz CHANNEL_TLV_LIST_END, 21037bff2b9SYuval Mintz CHANNEL_TLV_MAX 21137bff2b9SYuval Mintz }; 21237bff2b9SYuval Mintz 2131408cc1fSYuval Mintz /* This data is held in the qed_hwfn structure for VFs only. */ 2141408cc1fSYuval Mintz struct qed_vf_iov { 2151408cc1fSYuval Mintz union vfpf_tlvs *vf2pf_request; 2161408cc1fSYuval Mintz dma_addr_t vf2pf_request_phys; 2171408cc1fSYuval Mintz union pfvf_tlvs *pf2vf_reply; 2181408cc1fSYuval Mintz dma_addr_t pf2vf_reply_phys; 2191408cc1fSYuval Mintz 2201408cc1fSYuval Mintz /* Should be taken whenever the mailbox buffers are accessed */ 2211408cc1fSYuval Mintz struct mutex mutex; 2221408cc1fSYuval Mintz u8 *offset; 2231408cc1fSYuval Mintz 2241408cc1fSYuval Mintz /* Bulletin Board */ 2251408cc1fSYuval Mintz struct qed_bulletin bulletin; 2261408cc1fSYuval Mintz struct qed_bulletin_content bulletin_shadow; 2271408cc1fSYuval Mintz 2281408cc1fSYuval Mintz /* we set aside a copy of the acquire response */ 2291408cc1fSYuval Mintz struct pfvf_acquire_resp_tlv acquire_resp; 2301408cc1fSYuval Mintz }; 2311408cc1fSYuval Mintz 2321408cc1fSYuval Mintz #ifdef CONFIG_QED_SRIOV 2331408cc1fSYuval Mintz /** 2341408cc1fSYuval Mintz * @brief Get number of Rx queues allocated for VF by qed 2351408cc1fSYuval Mintz * 2361408cc1fSYuval Mintz * @param p_hwfn 2371408cc1fSYuval Mintz * @param num_rxqs - allocated RX queues 2381408cc1fSYuval Mintz */ 2391408cc1fSYuval Mintz void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs); 2401408cc1fSYuval Mintz 2411408cc1fSYuval Mintz /** 2421408cc1fSYuval Mintz * @brief Get port mac address for VF 2431408cc1fSYuval Mintz * 2441408cc1fSYuval Mintz * @param p_hwfn 2451408cc1fSYuval Mintz * @param port_mac - destination location for port mac 2461408cc1fSYuval Mintz */ 2471408cc1fSYuval Mintz void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac); 2481408cc1fSYuval Mintz 2491408cc1fSYuval Mintz /** 2501408cc1fSYuval Mintz * @brief Get number of VLAN filters allocated for VF by qed 2511408cc1fSYuval Mintz * 2521408cc1fSYuval Mintz * @param p_hwfn 2531408cc1fSYuval Mintz * @param num_rxqs - allocated VLAN filters 2541408cc1fSYuval Mintz */ 2551408cc1fSYuval Mintz void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn, 2561408cc1fSYuval Mintz u8 *num_vlan_filters); 2571408cc1fSYuval Mintz 2581408cc1fSYuval Mintz /** 2591408cc1fSYuval Mintz * @brief Set firmware version information in dev_info from VFs acquire response tlv 2601408cc1fSYuval Mintz * 2611408cc1fSYuval Mintz * @param p_hwfn 2621408cc1fSYuval Mintz * @param fw_major 2631408cc1fSYuval Mintz * @param fw_minor 2641408cc1fSYuval Mintz * @param fw_rev 2651408cc1fSYuval Mintz * @param fw_eng 2661408cc1fSYuval Mintz */ 2671408cc1fSYuval Mintz void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn, 2681408cc1fSYuval Mintz u16 *fw_major, u16 *fw_minor, 2691408cc1fSYuval Mintz u16 *fw_rev, u16 *fw_eng); 2701408cc1fSYuval Mintz 2711408cc1fSYuval Mintz /** 2721408cc1fSYuval Mintz * @brief hw preparation for VF 2731408cc1fSYuval Mintz * sends ACQUIRE message 2741408cc1fSYuval Mintz * 2751408cc1fSYuval Mintz * @param p_hwfn 2761408cc1fSYuval Mintz * 2771408cc1fSYuval Mintz * @return int 2781408cc1fSYuval Mintz */ 2791408cc1fSYuval Mintz int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn); 2801408cc1fSYuval Mintz 2811408cc1fSYuval Mintz /** 2821408cc1fSYuval Mintz * @brief qed_vf_get_igu_sb_id - Get the IGU SB ID for a given 2831408cc1fSYuval Mintz * sb_id. For VFs igu sbs don't have to be contiguous 2841408cc1fSYuval Mintz * 2851408cc1fSYuval Mintz * @param p_hwfn 2861408cc1fSYuval Mintz * @param sb_id 2871408cc1fSYuval Mintz * 2881408cc1fSYuval Mintz * @return INLINE u16 2891408cc1fSYuval Mintz */ 2901408cc1fSYuval Mintz u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id); 2911408cc1fSYuval Mintz #else 2921408cc1fSYuval Mintz static inline void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs) 2931408cc1fSYuval Mintz { 2941408cc1fSYuval Mintz } 2951408cc1fSYuval Mintz 2961408cc1fSYuval Mintz static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac) 2971408cc1fSYuval Mintz { 2981408cc1fSYuval Mintz } 2991408cc1fSYuval Mintz 3001408cc1fSYuval Mintz static inline void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn, 3011408cc1fSYuval Mintz u8 *num_vlan_filters) 3021408cc1fSYuval Mintz { 3031408cc1fSYuval Mintz } 3041408cc1fSYuval Mintz 3051408cc1fSYuval Mintz static inline void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn, 3061408cc1fSYuval Mintz u16 *fw_major, u16 *fw_minor, 3071408cc1fSYuval Mintz u16 *fw_rev, u16 *fw_eng) 3081408cc1fSYuval Mintz { 3091408cc1fSYuval Mintz } 3101408cc1fSYuval Mintz 3111408cc1fSYuval Mintz static inline int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn) 3121408cc1fSYuval Mintz { 3131408cc1fSYuval Mintz return -EINVAL; 3141408cc1fSYuval Mintz } 3151408cc1fSYuval Mintz 3161408cc1fSYuval Mintz static inline u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id) 3171408cc1fSYuval Mintz { 3181408cc1fSYuval Mintz return 0; 3191408cc1fSYuval Mintz } 3201408cc1fSYuval Mintz #endif 3211408cc1fSYuval Mintz 32232a47e72SYuval Mintz #endif 323