11f4d4ed6SAlexander Lobakin /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
232a47e72SYuval Mintz /* QLogic qed NIC Driver
3e8f1cb50SMintz, Yuval  * Copyright (c) 2015-2017  QLogic Corporation
4663eacd8SAlexander Lobakin  * Copyright (c) 2019-2020 Marvell International Ltd.
532a47e72SYuval Mintz  */
632a47e72SYuval Mintz 
732a47e72SYuval Mintz #ifndef _QED_SRIOV_H
832a47e72SYuval Mintz #define _QED_SRIOV_H
932a47e72SYuval Mintz #include <linux/types.h>
1032a47e72SYuval Mintz #include "qed_vf.h"
111cf2b1a9SYuval Mintz 
121cf2b1a9SYuval Mintz #define QED_ETH_VF_NUM_MAC_FILTERS 1
131cf2b1a9SYuval Mintz #define QED_ETH_VF_NUM_VLAN_FILTERS 2
1432a47e72SYuval Mintz #define QED_VF_ARRAY_LENGTH (3)
1532a47e72SYuval Mintz 
1614b84e86SArnd Bergmann #ifdef CONFIG_QED_SRIOV
176da95b52SAlok Prasad #define IS_VF(cdev)             ((cdev)->b_is_vf)
186da95b52SAlok Prasad #define IS_PF(cdev)             (!((cdev)->b_is_vf))
196da95b52SAlok Prasad #define IS_PF_SRIOV(p_hwfn)     (!!((p_hwfn)->cdev->p_iov_info))
2032a47e72SYuval Mintz #else
2114b84e86SArnd Bergmann #define IS_VF(cdev)             (0)
2214b84e86SArnd Bergmann #define IS_PF(cdev)             (1)
2332a47e72SYuval Mintz #define IS_PF_SRIOV(p_hwfn)     (0)
2432a47e72SYuval Mintz #endif
2532a47e72SYuval Mintz #define IS_PF_SRIOV_ALLOC(p_hwfn)       (!!((p_hwfn)->pf_iov_info))
2632a47e72SYuval Mintz 
271408cc1fSYuval Mintz #define QED_MAX_VF_CHAINS_PER_PF 16
281408cc1fSYuval Mintz 
2908feecd7SYuval Mintz #define QED_ETH_MAX_VF_NUM_VLAN_FILTERS	\
3008feecd7SYuval Mintz 	(MAX_NUM_VFS * QED_ETH_VF_NUM_VLAN_FILTERS)
3108feecd7SYuval Mintz 
32dacd88d6SYuval Mintz enum qed_iov_vport_update_flag {
33dacd88d6SYuval Mintz 	QED_IOV_VP_UPDATE_ACTIVATE,
3417b235c1SYuval Mintz 	QED_IOV_VP_UPDATE_VLAN_STRIP,
3517b235c1SYuval Mintz 	QED_IOV_VP_UPDATE_TX_SWITCH,
36dacd88d6SYuval Mintz 	QED_IOV_VP_UPDATE_MCAST,
37dacd88d6SYuval Mintz 	QED_IOV_VP_UPDATE_ACCEPT_PARAM,
38dacd88d6SYuval Mintz 	QED_IOV_VP_UPDATE_RSS,
3917b235c1SYuval Mintz 	QED_IOV_VP_UPDATE_ACCEPT_ANY_VLAN,
4017b235c1SYuval Mintz 	QED_IOV_VP_UPDATE_SGE_TPA,
41dacd88d6SYuval Mintz 	QED_IOV_VP_UPDATE_MAX,
42dacd88d6SYuval Mintz };
43dacd88d6SYuval Mintz 
440b55e27dSYuval Mintz struct qed_public_vf_info {
450b55e27dSYuval Mintz 	/* These copies will later be reflected in the bulletin board,
460b55e27dSYuval Mintz 	 * but this copy should be newer.
470b55e27dSYuval Mintz 	 */
48eff16960SYuval Mintz 	u8 forced_mac[ETH_ALEN];
4908feecd7SYuval Mintz 	u16 forced_vlan;
500b55e27dSYuval Mintz 	u8 mac[ETH_ALEN];
51733def6aSYuval Mintz 
52733def6aSYuval Mintz 	/* IFLA_VF_LINK_STATE_<X> */
53733def6aSYuval Mintz 	int link_state;
54733def6aSYuval Mintz 
55733def6aSYuval Mintz 	/* Currently configured Tx rate in MB/sec. 0 if unconfigured */
56733def6aSYuval Mintz 	int tx_rate;
57f990c82cSMintz, Yuval 
58f990c82cSMintz, Yuval 	/* Trusted VFs can configure promiscuous mode.
59f990c82cSMintz, Yuval 	 * Also store shadow promisc configuration if needed.
60f990c82cSMintz, Yuval 	 */
61f990c82cSMintz, Yuval 	bool is_trusted_configured;
62f990c82cSMintz, Yuval 	bool is_trusted_request;
63f990c82cSMintz, Yuval 	u8 rx_accept_mode;
64f990c82cSMintz, Yuval 	u8 tx_accept_mode;
65*cbcc44dbSManish Chopra 	bool accept_any_vlan;
660b55e27dSYuval Mintz };
670b55e27dSYuval Mintz 
683da7a37aSMintz, Yuval struct qed_iov_vf_init_params {
693da7a37aSMintz, Yuval 	u16 rel_vf_id;
703da7a37aSMintz, Yuval 
713da7a37aSMintz, Yuval 	/* Number of requested Queues; Currently, don't support different
723da7a37aSMintz, Yuval 	 * number of Rx/Tx queues.
733da7a37aSMintz, Yuval 	 */
743da7a37aSMintz, Yuval 
753da7a37aSMintz, Yuval 	u16 num_queues;
763da7a37aSMintz, Yuval 
773da7a37aSMintz, Yuval 	/* Allow the client to choose which qzones to use for Rx/Tx,
783da7a37aSMintz, Yuval 	 * and which queue_base to use for Tx queues on a per-queue basis.
793da7a37aSMintz, Yuval 	 * Notice values should be relative to the PF resources.
803da7a37aSMintz, Yuval 	 */
813da7a37aSMintz, Yuval 	u16 req_rx_queue[QED_MAX_VF_CHAINS_PER_PF];
823da7a37aSMintz, Yuval 	u16 req_tx_queue[QED_MAX_VF_CHAINS_PER_PF];
833da7a37aSMintz, Yuval };
843da7a37aSMintz, Yuval 
8532a47e72SYuval Mintz /* This struct is part of qed_dev and contains data relevant to all hwfns;
8632a47e72SYuval Mintz  * Initialized only if SR-IOV cpabability is exposed in PCIe config space.
8732a47e72SYuval Mintz  */
8832a47e72SYuval Mintz struct qed_hw_sriov_info {
8932a47e72SYuval Mintz 	int pos;		/* capability position */
9032a47e72SYuval Mintz 	int nres;		/* number of resources */
9132a47e72SYuval Mintz 	u32 cap;		/* SR-IOV Capabilities */
9232a47e72SYuval Mintz 	u16 ctrl;		/* SR-IOV Control */
9332a47e72SYuval Mintz 	u16 total_vfs;		/* total VFs associated with the PF */
9432a47e72SYuval Mintz 	u16 num_vfs;		/* number of vfs that have been started */
9532a47e72SYuval Mintz 	u16 initial_vfs;	/* initial VFs associated with the PF */
9632a47e72SYuval Mintz 	u16 nr_virtfn;		/* number of VFs available */
9732a47e72SYuval Mintz 	u16 offset;		/* first VF Routing ID offset */
9832a47e72SYuval Mintz 	u16 stride;		/* following VF stride */
9932a47e72SYuval Mintz 	u16 vf_device_id;	/* VF device id */
10032a47e72SYuval Mintz 	u32 pgsz;		/* page size for BAR alignment */
10132a47e72SYuval Mintz 	u8 link;		/* Function Dependency Link */
10232a47e72SYuval Mintz 
10332a47e72SYuval Mintz 	u32 first_vf_in_pf;
10432a47e72SYuval Mintz };
10532a47e72SYuval Mintz 
10632a47e72SYuval Mintz /* This mailbox is maintained per VF in its PF contains all information
10732a47e72SYuval Mintz  * required for sending / receiving a message.
10832a47e72SYuval Mintz  */
10932a47e72SYuval Mintz struct qed_iov_vf_mbx {
11032a47e72SYuval Mintz 	union vfpf_tlvs *req_virt;
11132a47e72SYuval Mintz 	dma_addr_t req_phys;
11232a47e72SYuval Mintz 	union pfvf_tlvs *reply_virt;
11332a47e72SYuval Mintz 	dma_addr_t reply_phys;
11437bff2b9SYuval Mintz 
11537bff2b9SYuval Mintz 	/* Address in VF where a pending message is located */
11637bff2b9SYuval Mintz 	dma_addr_t pending_req;
11737bff2b9SYuval Mintz 
118fd3c615aSMintz, Yuval 	/* Message from VF awaits handling */
119fd3c615aSMintz, Yuval 	bool b_pending_msg;
120fd3c615aSMintz, Yuval 
12137bff2b9SYuval Mintz 	u8 *offset;
12237bff2b9SYuval Mintz 
12337bff2b9SYuval Mintz 	/* saved VF request header */
12437bff2b9SYuval Mintz 	struct vfpf_first_tlv first_tlv;
12532a47e72SYuval Mintz };
12632a47e72SYuval Mintz 
127bbe3f233SMintz, Yuval #define QED_IOV_LEGACY_QID_RX (0)
128bbe3f233SMintz, Yuval #define QED_IOV_LEGACY_QID_TX (1)
12908bc8f15SMintz, Yuval #define QED_IOV_QID_INVALID (0xFE)
130bbe3f233SMintz, Yuval 
131007bc371SMintz, Yuval struct qed_vf_queue_cid {
132007bc371SMintz, Yuval 	bool b_is_tx;
133007bc371SMintz, Yuval 	struct qed_queue_cid *p_cid;
134007bc371SMintz, Yuval };
135007bc371SMintz, Yuval 
136007bc371SMintz, Yuval /* Describes a qzone associated with the VF */
137007bc371SMintz, Yuval struct qed_vf_queue {
1381408cc1fSYuval Mintz 	u16 fw_rx_qid;
1391408cc1fSYuval Mintz 	u16 fw_tx_qid;
140007bc371SMintz, Yuval 
141007bc371SMintz, Yuval 	struct qed_vf_queue_cid cids[MAX_QUEUES_PER_QZONE];
1421408cc1fSYuval Mintz };
1431408cc1fSYuval Mintz 
14432a47e72SYuval Mintz enum vf_state {
1451408cc1fSYuval Mintz 	VF_FREE = 0,		/* VF ready to be acquired holds no resc */
146fe40a830SPrabhakar Kushwaha 	VF_ACQUIRED,		/* VF, acquired, but not initialized */
147dacd88d6SYuval Mintz 	VF_ENABLED,		/* VF, Enabled */
1480b55e27dSYuval Mintz 	VF_RESET,		/* VF, FLR'd, pending cleanup */
14932a47e72SYuval Mintz 	VF_STOPPED		/* VF, Stopped */
15032a47e72SYuval Mintz };
15132a47e72SYuval Mintz 
15208feecd7SYuval Mintz struct qed_vf_vlan_shadow {
15308feecd7SYuval Mintz 	bool used;
15408feecd7SYuval Mintz 	u16 vid;
15508feecd7SYuval Mintz };
15608feecd7SYuval Mintz 
15708feecd7SYuval Mintz struct qed_vf_shadow_config {
15808feecd7SYuval Mintz 	/* Shadow copy of all guest vlans */
15908feecd7SYuval Mintz 	struct qed_vf_vlan_shadow vlans[QED_ETH_VF_NUM_VLAN_FILTERS + 1];
16008feecd7SYuval Mintz 
1618246d0b4SYuval Mintz 	/* Shadow copy of all configured MACs; Empty if forcing MACs */
1628246d0b4SYuval Mintz 	u8 macs[QED_ETH_VF_NUM_MAC_FILTERS][ETH_ALEN];
16308feecd7SYuval Mintz 	u8 inner_vlan_removal;
16408feecd7SYuval Mintz };
16508feecd7SYuval Mintz 
16632a47e72SYuval Mintz /* PFs maintain an array of this structure, per VF */
16732a47e72SYuval Mintz struct qed_vf_info {
16832a47e72SYuval Mintz 	struct qed_iov_vf_mbx vf_mbx;
16932a47e72SYuval Mintz 	enum vf_state state;
17032a47e72SYuval Mintz 	bool b_init;
1717eff82b0SYuval Mintz 	bool b_malicious;
1720b55e27dSYuval Mintz 	u8 to_disable;
17332a47e72SYuval Mintz 
17432a47e72SYuval Mintz 	struct qed_bulletin bulletin;
17532a47e72SYuval Mintz 	dma_addr_t vf_bulletin;
17632a47e72SYuval Mintz 
1771fe614d1SYuval Mintz 	/* PF saves a copy of the last VF acquire message */
1781fe614d1SYuval Mintz 	struct vfpf_acquire_tlv acquire;
1791fe614d1SYuval Mintz 
18032a47e72SYuval Mintz 	u32 concrete_fid;
18132a47e72SYuval Mintz 	u16 opaque_fid;
182dacd88d6SYuval Mintz 	u16 mtu;
18332a47e72SYuval Mintz 
18432a47e72SYuval Mintz 	u8 vport_id;
18532a47e72SYuval Mintz 	u8 relative_vf_id;
18632a47e72SYuval Mintz 	u8 abs_vf_id;
18732a47e72SYuval Mintz #define QED_VF_ABS_ID(p_hwfn, p_vf)	(QED_PATH_ID(p_hwfn) ?		      \
18832a47e72SYuval Mintz 					 (p_vf)->abs_vf_id + MAX_NUM_VFS_BB : \
18932a47e72SYuval Mintz 					 (p_vf)->abs_vf_id)
1901408cc1fSYuval Mintz 
191dacd88d6SYuval Mintz 	u8 vport_instance;
1921408cc1fSYuval Mintz 	u8 num_rxqs;
1931408cc1fSYuval Mintz 	u8 num_txqs;
1941408cc1fSYuval Mintz 
195bf5a94bfSRahul Verma 	u16 rx_coal;
196bf5a94bfSRahul Verma 	u16 tx_coal;
197bf5a94bfSRahul Verma 
1981408cc1fSYuval Mintz 	u8 num_sbs;
1991408cc1fSYuval Mintz 
2001408cc1fSYuval Mintz 	u8 num_mac_filters;
2011408cc1fSYuval Mintz 	u8 num_vlan_filters;
202007bc371SMintz, Yuval 
203007bc371SMintz, Yuval 	struct qed_vf_queue vf_queues[QED_MAX_VF_CHAINS_PER_PF];
2041408cc1fSYuval Mintz 	u16 igu_sbs[QED_MAX_VF_CHAINS_PER_PF];
205dacd88d6SYuval Mintz 	u8 num_active_rxqs;
2060b55e27dSYuval Mintz 	struct qed_public_vf_info p_vf_info;
2076ddc7608SYuval Mintz 	bool spoof_chk;
2086ddc7608SYuval Mintz 	bool req_spoofchk_val;
20908feecd7SYuval Mintz 
21008feecd7SYuval Mintz 	/* Stores the configuration requested by VF */
21108feecd7SYuval Mintz 	struct qed_vf_shadow_config shadow_config;
21208feecd7SYuval Mintz 
21308feecd7SYuval Mintz 	/* A bitfield using bulletin's valid-map bits, used to indicate
21408feecd7SYuval Mintz 	 * which of the bulletin board features have been configured.
21508feecd7SYuval Mintz 	 */
21608feecd7SYuval Mintz 	u64 configured_features;
21708feecd7SYuval Mintz #define QED_IOV_CONFIGURED_FEATURES_MASK        ((1 << MAC_ADDR_FORCED) | \
21808feecd7SYuval Mintz 						 (1 << VLAN_ADDR_FORCED))
21932a47e72SYuval Mintz };
22032a47e72SYuval Mintz 
22132a47e72SYuval Mintz /* This structure is part of qed_hwfn and used only for PFs that have sriov
22232a47e72SYuval Mintz  * capability enabled.
22332a47e72SYuval Mintz  */
22432a47e72SYuval Mintz struct qed_pf_iov {
22532a47e72SYuval Mintz 	struct qed_vf_info vfs_array[MAX_NUM_VFS];
22632a47e72SYuval Mintz 	u64 pending_flr[QED_VF_ARRAY_LENGTH];
22732a47e72SYuval Mintz 
22832a47e72SYuval Mintz 	/* Allocate message address continuosuly and split to each VF */
22932a47e72SYuval Mintz 	void *mbx_msg_virt_addr;
23032a47e72SYuval Mintz 	dma_addr_t mbx_msg_phys_addr;
23132a47e72SYuval Mintz 	u32 mbx_msg_size;
23232a47e72SYuval Mintz 	void *mbx_reply_virt_addr;
23332a47e72SYuval Mintz 	dma_addr_t mbx_reply_phys_addr;
23432a47e72SYuval Mintz 	u32 mbx_reply_size;
23532a47e72SYuval Mintz 	void *p_bulletins;
23632a47e72SYuval Mintz 	dma_addr_t bulletins_phys;
23732a47e72SYuval Mintz 	u32 bulletins_size;
23832a47e72SYuval Mintz };
23932a47e72SYuval Mintz 
24037bff2b9SYuval Mintz enum qed_iov_wq_flag {
24137bff2b9SYuval Mintz 	QED_IOV_WQ_MSG_FLAG,
24237bff2b9SYuval Mintz 	QED_IOV_WQ_SET_UNICAST_FILTER_FLAG,
24337bff2b9SYuval Mintz 	QED_IOV_WQ_BULLETIN_UPDATE_FLAG,
24437bff2b9SYuval Mintz 	QED_IOV_WQ_STOP_WQ_FLAG,
24537bff2b9SYuval Mintz 	QED_IOV_WQ_FLR_FLAG,
246f990c82cSMintz, Yuval 	QED_IOV_WQ_TRUST_FLAG,
24765ed2ffdSMintz, Yuval 	QED_IOV_WQ_VF_FORCE_LINK_QUERY_FLAG,
24837bff2b9SYuval Mintz };
24937bff2b9SYuval Mintz 
250c6b7314dSAlexander Lobakin extern const struct qed_iov_hv_ops qed_iov_ops_pass;
251c6b7314dSAlexander Lobakin 
25232a47e72SYuval Mintz #ifdef CONFIG_QED_SRIOV
25332a47e72SYuval Mintz /**
25419198e4eSPrabhakar Kushwaha  * qed_iov_is_valid_vfid(): Check if given VF ID @vfid is valid
255da090917STomer Tayar  *                          w.r.t. @b_enabled_only value
25619198e4eSPrabhakar Kushwaha  *                          if b_enabled_only = true - only enabled
25719198e4eSPrabhakar Kushwaha  *                          VF id is valid.
25819198e4eSPrabhakar Kushwaha  *                          else any VF id less than max_vfs is valid.
259da090917STomer Tayar  *
26019198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
26119198e4eSPrabhakar Kushwaha  * @rel_vf_id: Relative VF ID.
26219198e4eSPrabhakar Kushwaha  * @b_enabled_only: consider only enabled VF.
26319198e4eSPrabhakar Kushwaha  * @b_non_malicious: true iff we want to validate vf isn't malicious.
264da090917STomer Tayar  *
26519198e4eSPrabhakar Kushwaha  * Return: bool - true for valid VF ID
266da090917STomer Tayar  */
267da090917STomer Tayar bool qed_iov_is_valid_vfid(struct qed_hwfn *p_hwfn,
268da090917STomer Tayar 			   int rel_vf_id,
269da090917STomer Tayar 			   bool b_enabled_only, bool b_non_malicious);
270da090917STomer Tayar 
271da090917STomer Tayar /**
27219198e4eSPrabhakar Kushwaha  * qed_iov_get_next_active_vf(): Given a VF index, return index of
27319198e4eSPrabhakar Kushwaha  *                               next [including that] active VF.
27432a47e72SYuval Mintz  *
27519198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
27619198e4eSPrabhakar Kushwaha  * @rel_vf_id: VF ID.
27732a47e72SYuval Mintz  *
27819198e4eSPrabhakar Kushwaha  * Return: MAX_NUM_VFS in case no further active VFs, otherwise index.
27932a47e72SYuval Mintz  */
28032a47e72SYuval Mintz u16 qed_iov_get_next_active_vf(struct qed_hwfn *p_hwfn, u16 rel_vf_id);
28132a47e72SYuval Mintz 
28297379f15SChopra, Manish void qed_iov_bulletin_set_udp_ports(struct qed_hwfn *p_hwfn,
28397379f15SChopra, Manish 				    int vfid, u16 vxlan_port, u16 geneve_port);
28497379f15SChopra, Manish 
28532a47e72SYuval Mintz /**
28619198e4eSPrabhakar Kushwaha  * qed_iov_hw_info(): Read sriov related information and allocated resources
287c199ce4fSGeert Uytterhoeven  *                    reads from configuration space, shmem, etc.
28832a47e72SYuval Mintz  *
28919198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
29032a47e72SYuval Mintz  *
29119198e4eSPrabhakar Kushwaha  * Return: Int.
29232a47e72SYuval Mintz  */
29332a47e72SYuval Mintz int qed_iov_hw_info(struct qed_hwfn *p_hwfn);
29432a47e72SYuval Mintz 
29532a47e72SYuval Mintz /**
29619198e4eSPrabhakar Kushwaha  * qed_add_tlv(): place a given tlv on the tlv buffer at next offset
2971408cc1fSYuval Mintz  *
29819198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
29919198e4eSPrabhakar Kushwaha  * @offset: offset.
30019198e4eSPrabhakar Kushwaha  * @type: Type
30119198e4eSPrabhakar Kushwaha  * @length: Length.
3021408cc1fSYuval Mintz  *
30319198e4eSPrabhakar Kushwaha  * Return: pointer to the newly placed tlv
3041408cc1fSYuval Mintz  */
3051408cc1fSYuval Mintz void *qed_add_tlv(struct qed_hwfn *p_hwfn, u8 **offset, u16 type, u16 length);
3061408cc1fSYuval Mintz 
3071408cc1fSYuval Mintz /**
30819198e4eSPrabhakar Kushwaha  * qed_dp_tlv_list(): list the types and lengths of the tlvs on the buffer
3091408cc1fSYuval Mintz  *
31019198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
31119198e4eSPrabhakar Kushwaha  * @tlvs_list: Tlvs_list.
31219198e4eSPrabhakar Kushwaha  *
31319198e4eSPrabhakar Kushwaha  * Return: Void.
3141408cc1fSYuval Mintz  */
3151408cc1fSYuval Mintz void qed_dp_tlv_list(struct qed_hwfn *p_hwfn, void *tlvs_list);
3161408cc1fSYuval Mintz 
3171408cc1fSYuval Mintz /**
318fe40a830SPrabhakar Kushwaha  * qed_sriov_vfpf_malicious(): Handle malicious VF/PF.
319fe40a830SPrabhakar Kushwaha  *
320fe40a830SPrabhakar Kushwaha  * @p_hwfn: HW device data.
321fe40a830SPrabhakar Kushwaha  * @p_data: Pointer to data.
322fe40a830SPrabhakar Kushwaha  *
323fe40a830SPrabhakar Kushwaha  * Return: Void.
324fe40a830SPrabhakar Kushwaha  */
325fe40a830SPrabhakar Kushwaha void qed_sriov_vfpf_malicious(struct qed_hwfn *p_hwfn,
326fe40a830SPrabhakar Kushwaha 			      struct fw_err_data *p_data);
327fe40a830SPrabhakar Kushwaha 
328fe40a830SPrabhakar Kushwaha /**
329fe40a830SPrabhakar Kushwaha  * qed_sriov_eqe_event(): Callback for SRIOV events.
330fe40a830SPrabhakar Kushwaha  *
331fe40a830SPrabhakar Kushwaha  * @p_hwfn: HW device data.
332fe40a830SPrabhakar Kushwaha  * @opcode: Opcode.
333fe40a830SPrabhakar Kushwaha  * @echo: Echo.
334fe40a830SPrabhakar Kushwaha  * @data: data
335fe40a830SPrabhakar Kushwaha  * @fw_return_code: FW return code.
336fe40a830SPrabhakar Kushwaha  *
337fe40a830SPrabhakar Kushwaha  * Return: Int.
338fe40a830SPrabhakar Kushwaha  */
339fe40a830SPrabhakar Kushwaha int qed_sriov_eqe_event(struct qed_hwfn *p_hwfn, u8 opcode, __le16 echo,
340fe40a830SPrabhakar Kushwaha 			union event_ring_data *data, u8  fw_return_code);
341fe40a830SPrabhakar Kushwaha 
342fe40a830SPrabhakar Kushwaha /**
34319198e4eSPrabhakar Kushwaha  * qed_iov_alloc(): allocate sriov related resources
34432a47e72SYuval Mintz  *
34519198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
34632a47e72SYuval Mintz  *
34719198e4eSPrabhakar Kushwaha  * Return: Int.
34832a47e72SYuval Mintz  */
34932a47e72SYuval Mintz int qed_iov_alloc(struct qed_hwfn *p_hwfn);
35032a47e72SYuval Mintz 
35132a47e72SYuval Mintz /**
35219198e4eSPrabhakar Kushwaha  * qed_iov_setup(): setup sriov related resources
35332a47e72SYuval Mintz  *
35419198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
35519198e4eSPrabhakar Kushwaha  *
35619198e4eSPrabhakar Kushwaha  * Return: Void.
35732a47e72SYuval Mintz  */
3581ee240e3SMintz, Yuval void qed_iov_setup(struct qed_hwfn *p_hwfn);
35932a47e72SYuval Mintz 
36032a47e72SYuval Mintz /**
36119198e4eSPrabhakar Kushwaha  * qed_iov_free(): free sriov related resources
36232a47e72SYuval Mintz  *
36319198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
36419198e4eSPrabhakar Kushwaha  *
36519198e4eSPrabhakar Kushwaha  * Return: Void.
36632a47e72SYuval Mintz  */
36732a47e72SYuval Mintz void qed_iov_free(struct qed_hwfn *p_hwfn);
36832a47e72SYuval Mintz 
36932a47e72SYuval Mintz /**
37019198e4eSPrabhakar Kushwaha  * qed_iov_free_hw_info(): free sriov related memory that was
37119198e4eSPrabhakar Kushwaha  *                          allocated during hw_prepare
37232a47e72SYuval Mintz  *
37319198e4eSPrabhakar Kushwaha  * @cdev: Qed dev pointer.
37419198e4eSPrabhakar Kushwaha  *
37519198e4eSPrabhakar Kushwaha  * Return: Void.
37632a47e72SYuval Mintz  */
37732a47e72SYuval Mintz void qed_iov_free_hw_info(struct qed_dev *cdev);
37837bff2b9SYuval Mintz 
37937bff2b9SYuval Mintz /**
38019198e4eSPrabhakar Kushwaha  * qed_iov_mark_vf_flr(): Mark structs of vfs that have been FLR-ed.
3810b55e27dSYuval Mintz  *
38219198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
38319198e4eSPrabhakar Kushwaha  * @disabled_vfs: bitmask of all VFs on path that were FLRed
3840b55e27dSYuval Mintz  *
38519198e4eSPrabhakar Kushwaha  * Return: true iff one of the PF's vfs got FLRed. false otherwise.
3860b55e27dSYuval Mintz  */
387cccf6f5cSMintz, Yuval bool qed_iov_mark_vf_flr(struct qed_hwfn *p_hwfn, u32 *disabled_vfs);
3880b55e27dSYuval Mintz 
389dacd88d6SYuval Mintz /**
39019198e4eSPrabhakar Kushwaha  * qed_iov_search_list_tlvs(): Search extended TLVs in request/reply buffer.
391dacd88d6SYuval Mintz  *
39219198e4eSPrabhakar Kushwaha  * @p_hwfn: HW device data.
39319198e4eSPrabhakar Kushwaha  * @p_tlvs_list: Pointer to tlvs list
39419198e4eSPrabhakar Kushwaha  * @req_type: Type of TLV
395dacd88d6SYuval Mintz  *
39619198e4eSPrabhakar Kushwaha  * Return: pointer to tlv type if found, otherwise returns NULL.
397dacd88d6SYuval Mintz  */
398dacd88d6SYuval Mintz void *qed_iov_search_list_tlvs(struct qed_hwfn *p_hwfn,
399dacd88d6SYuval Mintz 			       void *p_tlvs_list, u16 req_type);
400dacd88d6SYuval Mintz 
40137bff2b9SYuval Mintz void qed_iov_wq_stop(struct qed_dev *cdev, bool schedule_first);
40237bff2b9SYuval Mintz int qed_iov_wq_start(struct qed_dev *cdev);
40337bff2b9SYuval Mintz 
40437bff2b9SYuval Mintz void qed_schedule_iov(struct qed_hwfn *hwfn, enum qed_iov_wq_flag flag);
4051408cc1fSYuval Mintz void qed_vf_start_iov_wq(struct qed_dev *cdev);
4060b55e27dSYuval Mintz int qed_sriov_disable(struct qed_dev *cdev, bool pci_enabled);
40736558c3dSYuval Mintz void qed_inform_vf_link_state(struct qed_hwfn *hwfn);
40832a47e72SYuval Mintz #else
409da090917STomer Tayar static inline bool
qed_iov_is_valid_vfid(struct qed_hwfn * p_hwfn,int rel_vf_id,bool b_enabled_only,bool b_non_malicious)410da090917STomer Tayar qed_iov_is_valid_vfid(struct qed_hwfn *p_hwfn,
411da090917STomer Tayar 		      int rel_vf_id, bool b_enabled_only, bool b_non_malicious)
412da090917STomer Tayar {
413da090917STomer Tayar 	return false;
414da090917STomer Tayar }
415da090917STomer Tayar 
qed_iov_get_next_active_vf(struct qed_hwfn * p_hwfn,u16 rel_vf_id)41632a47e72SYuval Mintz static inline u16 qed_iov_get_next_active_vf(struct qed_hwfn *p_hwfn,
41732a47e72SYuval Mintz 					     u16 rel_vf_id)
41832a47e72SYuval Mintz {
41932a47e72SYuval Mintz 	return MAX_NUM_VFS;
42032a47e72SYuval Mintz }
42132a47e72SYuval Mintz 
42297379f15SChopra, Manish static inline void
qed_iov_bulletin_set_udp_ports(struct qed_hwfn * p_hwfn,int vfid,u16 vxlan_port,u16 geneve_port)42397379f15SChopra, Manish qed_iov_bulletin_set_udp_ports(struct qed_hwfn *p_hwfn, int vfid,
42497379f15SChopra, Manish 			       u16 vxlan_port, u16 geneve_port)
42597379f15SChopra, Manish {
42697379f15SChopra, Manish }
42797379f15SChopra, Manish 
qed_iov_hw_info(struct qed_hwfn * p_hwfn)42832a47e72SYuval Mintz static inline int qed_iov_hw_info(struct qed_hwfn *p_hwfn)
42932a47e72SYuval Mintz {
43032a47e72SYuval Mintz 	return 0;
43132a47e72SYuval Mintz }
43232a47e72SYuval Mintz 
qed_iov_alloc(struct qed_hwfn * p_hwfn)43332a47e72SYuval Mintz static inline int qed_iov_alloc(struct qed_hwfn *p_hwfn)
43432a47e72SYuval Mintz {
43532a47e72SYuval Mintz 	return 0;
43632a47e72SYuval Mintz }
43732a47e72SYuval Mintz 
qed_iov_setup(struct qed_hwfn * p_hwfn)4381ee240e3SMintz, Yuval static inline void qed_iov_setup(struct qed_hwfn *p_hwfn)
43932a47e72SYuval Mintz {
44032a47e72SYuval Mintz }
44132a47e72SYuval Mintz 
qed_iov_free(struct qed_hwfn * p_hwfn)44232a47e72SYuval Mintz static inline void qed_iov_free(struct qed_hwfn *p_hwfn)
44332a47e72SYuval Mintz {
44432a47e72SYuval Mintz }
44532a47e72SYuval Mintz 
qed_iov_free_hw_info(struct qed_dev * cdev)44632a47e72SYuval Mintz static inline void qed_iov_free_hw_info(struct qed_dev *cdev)
44732a47e72SYuval Mintz {
44832a47e72SYuval Mintz }
44937bff2b9SYuval Mintz 
qed_iov_mark_vf_flr(struct qed_hwfn * p_hwfn,u32 * disabled_vfs)450cccf6f5cSMintz, Yuval static inline bool qed_iov_mark_vf_flr(struct qed_hwfn *p_hwfn,
4510b55e27dSYuval Mintz 				       u32 *disabled_vfs)
4520b55e27dSYuval Mintz {
453cccf6f5cSMintz, Yuval 	return false;
4540b55e27dSYuval Mintz }
4550b55e27dSYuval Mintz 
qed_iov_wq_stop(struct qed_dev * cdev,bool schedule_first)45637bff2b9SYuval Mintz static inline void qed_iov_wq_stop(struct qed_dev *cdev, bool schedule_first)
45737bff2b9SYuval Mintz {
45837bff2b9SYuval Mintz }
45937bff2b9SYuval Mintz 
qed_iov_wq_start(struct qed_dev * cdev)46037bff2b9SYuval Mintz static inline int qed_iov_wq_start(struct qed_dev *cdev)
46137bff2b9SYuval Mintz {
46237bff2b9SYuval Mintz 	return 0;
46337bff2b9SYuval Mintz }
46437bff2b9SYuval Mintz 
qed_schedule_iov(struct qed_hwfn * hwfn,enum qed_iov_wq_flag flag)46537bff2b9SYuval Mintz static inline void qed_schedule_iov(struct qed_hwfn *hwfn,
46637bff2b9SYuval Mintz 				    enum qed_iov_wq_flag flag)
46737bff2b9SYuval Mintz {
46837bff2b9SYuval Mintz }
4691408cc1fSYuval Mintz 
qed_vf_start_iov_wq(struct qed_dev * cdev)4701408cc1fSYuval Mintz static inline void qed_vf_start_iov_wq(struct qed_dev *cdev)
4711408cc1fSYuval Mintz {
4721408cc1fSYuval Mintz }
4730b55e27dSYuval Mintz 
qed_sriov_disable(struct qed_dev * cdev,bool pci_enabled)4740b55e27dSYuval Mintz static inline int qed_sriov_disable(struct qed_dev *cdev, bool pci_enabled)
4750b55e27dSYuval Mintz {
4760b55e27dSYuval Mintz 	return 0;
4770b55e27dSYuval Mintz }
47836558c3dSYuval Mintz 
qed_inform_vf_link_state(struct qed_hwfn * hwfn)47936558c3dSYuval Mintz static inline void qed_inform_vf_link_state(struct qed_hwfn *hwfn)
48036558c3dSYuval Mintz {
48136558c3dSYuval Mintz }
482e761523dSPrabhakar Kushwaha 
qed_sriov_vfpf_malicious(struct qed_hwfn * p_hwfn,struct fw_err_data * p_data)483e761523dSPrabhakar Kushwaha static inline void qed_sriov_vfpf_malicious(struct qed_hwfn *p_hwfn,
484e761523dSPrabhakar Kushwaha 					    struct fw_err_data *p_data)
485e761523dSPrabhakar Kushwaha {
486e761523dSPrabhakar Kushwaha }
487e761523dSPrabhakar Kushwaha 
qed_sriov_eqe_event(struct qed_hwfn * p_hwfn,u8 opcode,__le16 echo,union event_ring_data * data,u8 fw_return_code)488e761523dSPrabhakar Kushwaha static inline int qed_sriov_eqe_event(struct qed_hwfn *p_hwfn, u8 opcode,
489e761523dSPrabhakar Kushwaha 				      __le16 echo, union event_ring_data *data,
490e761523dSPrabhakar Kushwaha 				      u8  fw_return_code)
491e761523dSPrabhakar Kushwaha {
492e761523dSPrabhakar Kushwaha 	return 0;
493e761523dSPrabhakar Kushwaha }
49432a47e72SYuval Mintz #endif
49532a47e72SYuval Mintz 
49632a47e72SYuval Mintz #define qed_for_each_vf(_p_hwfn, _i)			  \
49732a47e72SYuval Mintz 	for (_i = qed_iov_get_next_active_vf(_p_hwfn, 0); \
49832a47e72SYuval Mintz 	     _i < MAX_NUM_VFS;				  \
49932a47e72SYuval Mintz 	     _i = qed_iov_get_next_active_vf(_p_hwfn, _i + 1))
50032a47e72SYuval Mintz 
50132a47e72SYuval Mintz #endif
502