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