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