13126df22SRasesh Mody /* SPDX-License-Identifier: BSD-3-Clause 29adde217SRasesh Mody * Copyright (c) 2016 - 2018 Cavium Inc. 386a2265eSRasesh Mody * All rights reserved. 49adde217SRasesh Mody * www.cavium.com 586a2265eSRasesh Mody */ 686a2265eSRasesh Mody 786a2265eSRasesh Mody #ifndef __ECORE_SRIOV_H__ 886a2265eSRasesh Mody #define __ECORE_SRIOV_H__ 986a2265eSRasesh Mody 1086a2265eSRasesh Mody #include "ecore_status.h" 1186a2265eSRasesh Mody #include "ecore_vfpf_if.h" 1286a2265eSRasesh Mody #include "ecore_iov_api.h" 1386a2265eSRasesh Mody #include "ecore_hsi_common.h" 14eb8e81adSRasesh Mody #include "ecore_l2.h" 1586a2265eSRasesh Mody 1686a2265eSRasesh Mody #define ECORE_ETH_MAX_VF_NUM_VLAN_FILTERS \ 17*52fa735cSRasesh Mody (MAX_NUM_VFS_K2 * ECORE_ETH_VF_NUM_VLAN_FILTERS) 1886a2265eSRasesh Mody 1986a2265eSRasesh Mody /* Represents a full message. Both the request filled by VF 2086a2265eSRasesh Mody * and the response filled by the PF. The VF needs one copy 2186a2265eSRasesh Mody * of this message, it fills the request part and sends it to 2286a2265eSRasesh Mody * the PF. The PF will copy the response to the response part for 2386a2265eSRasesh Mody * the VF to later read it. The PF needs to hold a message like this 2486a2265eSRasesh Mody * per VF, the request that is copied to the PF is placed in the 2586a2265eSRasesh Mody * request size, and the response is filled by the PF before sending 2686a2265eSRasesh Mody * it to the VF. 2786a2265eSRasesh Mody */ 2886a2265eSRasesh Mody struct ecore_vf_mbx_msg { 2986a2265eSRasesh Mody union vfpf_tlvs req; 3086a2265eSRasesh Mody union pfvf_tlvs resp; 3186a2265eSRasesh Mody }; 3286a2265eSRasesh Mody 3386a2265eSRasesh Mody /* This mailbox is maintained per VF in its PF 3486a2265eSRasesh Mody * contains all information required for sending / receiving 3586a2265eSRasesh Mody * a message 3686a2265eSRasesh Mody */ 3786a2265eSRasesh Mody struct ecore_iov_vf_mbx { 3886a2265eSRasesh Mody union vfpf_tlvs *req_virt; 3986a2265eSRasesh Mody dma_addr_t req_phys; 4086a2265eSRasesh Mody union pfvf_tlvs *reply_virt; 4186a2265eSRasesh Mody dma_addr_t reply_phys; 4286a2265eSRasesh Mody 4386a2265eSRasesh Mody /* Address in VF where a pending message is located */ 4486a2265eSRasesh Mody dma_addr_t pending_req; 4586a2265eSRasesh Mody 464be18885SRasesh Mody /* Message from VF awaits handling */ 474be18885SRasesh Mody bool b_pending_msg; 484be18885SRasesh Mody 4986a2265eSRasesh Mody u8 *offset; 5086a2265eSRasesh Mody 5186a2265eSRasesh Mody #ifdef CONFIG_ECORE_SW_CHANNEL 5286a2265eSRasesh Mody struct ecore_iov_sw_mbx sw_mbx; 5386a2265eSRasesh Mody #endif 5486a2265eSRasesh Mody 5586a2265eSRasesh Mody /* VF GPA address */ 5686a2265eSRasesh Mody u32 vf_addr_lo; 5786a2265eSRasesh Mody u32 vf_addr_hi; 5886a2265eSRasesh Mody 5986a2265eSRasesh Mody struct vfpf_first_tlv first_tlv; /* saved VF request header */ 6086a2265eSRasesh Mody 6186a2265eSRasesh Mody u8 flags; 6286a2265eSRasesh Mody #define VF_MSG_INPROCESS 0x1 /* failsafe - the FW should prevent 6386a2265eSRasesh Mody * more then one pending msg 6486a2265eSRasesh Mody */ 6586a2265eSRasesh Mody }; 6686a2265eSRasesh Mody 67a90c566fSRasesh Mody #define ECORE_IOV_LEGACY_QID_RX (0) 68a90c566fSRasesh Mody #define ECORE_IOV_LEGACY_QID_TX (1) 69a90c566fSRasesh Mody #define ECORE_IOV_QID_INVALID (0xFE) 70a90c566fSRasesh Mody 71eb8e81adSRasesh Mody struct ecore_vf_queue_cid { 72eb8e81adSRasesh Mody bool b_is_tx; 73eb8e81adSRasesh Mody struct ecore_queue_cid *p_cid; 74eb8e81adSRasesh Mody }; 75eb8e81adSRasesh Mody 76eb8e81adSRasesh Mody /* Describes a qzone associated with the VF */ 77eb8e81adSRasesh Mody struct ecore_vf_queue { 78eb8e81adSRasesh Mody /* Input from upper-layer, mapping relateive queue to queue-zone */ 7986a2265eSRasesh Mody u16 fw_rx_qid; 8086a2265eSRasesh Mody u16 fw_tx_qid; 81eb8e81adSRasesh Mody 82eb8e81adSRasesh Mody struct ecore_vf_queue_cid cids[MAX_QUEUES_PER_QZONE]; 8386a2265eSRasesh Mody }; 8486a2265eSRasesh Mody 8586a2265eSRasesh Mody enum vf_state { 8686a2265eSRasesh Mody VF_FREE = 0, /* VF ready to be acquired holds no resc */ 8786a2265eSRasesh Mody VF_ACQUIRED = 1, /* VF, acquired, but not initalized */ 8886a2265eSRasesh Mody VF_ENABLED = 2, /* VF, Enabled */ 8986a2265eSRasesh Mody VF_RESET = 3, /* VF, FLR'd, pending cleanup */ 9086a2265eSRasesh Mody VF_STOPPED = 4 /* VF, Stopped */ 9186a2265eSRasesh Mody }; 9286a2265eSRasesh Mody 9386a2265eSRasesh Mody struct ecore_vf_vlan_shadow { 9486a2265eSRasesh Mody bool used; 9586a2265eSRasesh Mody u16 vid; 9686a2265eSRasesh Mody }; 9786a2265eSRasesh Mody 9886a2265eSRasesh Mody struct ecore_vf_shadow_config { 9986a2265eSRasesh Mody /* Shadow copy of all guest vlans */ 10086a2265eSRasesh Mody struct ecore_vf_vlan_shadow vlans[ECORE_ETH_VF_NUM_VLAN_FILTERS + 1]; 10186a2265eSRasesh Mody 10222d07d93SRasesh Mody /* Shadow copy of all configured MACs; Empty if forcing MACs */ 10322d07d93SRasesh Mody u8 macs[ECORE_ETH_VF_NUM_MAC_FILTERS][ETH_ALEN]; 10486a2265eSRasesh Mody u8 inner_vlan_removal; 10586a2265eSRasesh Mody }; 10686a2265eSRasesh Mody 10786a2265eSRasesh Mody /* PFs maintain an array of this structure, per VF */ 10886a2265eSRasesh Mody struct ecore_vf_info { 10986a2265eSRasesh Mody struct ecore_iov_vf_mbx vf_mbx; 11086a2265eSRasesh Mody enum vf_state state; 11122d07d93SRasesh Mody bool b_init; 11247b302d6SRasesh Mody bool b_malicious; 11386a2265eSRasesh Mody u8 to_disable; 11486a2265eSRasesh Mody 11586a2265eSRasesh Mody struct ecore_bulletin bulletin; 11686a2265eSRasesh Mody dma_addr_t vf_bulletin; 11786a2265eSRasesh Mody 11801491d29SRasesh Mody #ifdef CONFIG_ECORE_SW_CHANNEL 11901491d29SRasesh Mody /* Determine whether PF communicate with VF using HW/SW channel */ 12001491d29SRasesh Mody bool b_hw_channel; 12101491d29SRasesh Mody #endif 12201491d29SRasesh Mody 12322d07d93SRasesh Mody /* PF saves a copy of the last VF acquire message */ 12422d07d93SRasesh Mody struct vfpf_acquire_tlv acquire; 12522d07d93SRasesh Mody 12686a2265eSRasesh Mody u32 concrete_fid; 12786a2265eSRasesh Mody u16 opaque_fid; 12886a2265eSRasesh Mody u16 mtu; 12986a2265eSRasesh Mody 13086a2265eSRasesh Mody u8 vport_id; 13135da9596SRasesh Mody u8 rss_eng_id; 13286a2265eSRasesh Mody u8 relative_vf_id; 13386a2265eSRasesh Mody u8 abs_vf_id; 13486a2265eSRasesh Mody #define ECORE_VF_ABS_ID(p_hwfn, p_vf) (ECORE_PATH_ID(p_hwfn) ? \ 13586a2265eSRasesh Mody (p_vf)->abs_vf_id + MAX_NUM_VFS_BB : \ 13686a2265eSRasesh Mody (p_vf)->abs_vf_id) 13786a2265eSRasesh Mody 13886a2265eSRasesh Mody u8 vport_instance; /* Number of active vports */ 13986a2265eSRasesh Mody u8 num_rxqs; 14086a2265eSRasesh Mody u8 num_txqs; 14186a2265eSRasesh Mody 142be973769SRasesh Mody u16 rx_coal; 143be973769SRasesh Mody u16 tx_coal; 144be973769SRasesh Mody 14586a2265eSRasesh Mody u8 num_sbs; 14686a2265eSRasesh Mody 14786a2265eSRasesh Mody u8 num_mac_filters; 14886a2265eSRasesh Mody u8 num_vlan_filters; 14986a2265eSRasesh Mody 150eb8e81adSRasesh Mody struct ecore_vf_queue vf_queues[ECORE_MAX_VF_CHAINS_PER_PF]; 15186a2265eSRasesh Mody u16 igu_sbs[ECORE_MAX_VF_CHAINS_PER_PF]; 15286a2265eSRasesh Mody 15386a2265eSRasesh Mody /* TODO - Only windows is using it - should be removed */ 15486a2265eSRasesh Mody u8 was_malicious; 15586a2265eSRasesh Mody u8 num_active_rxqs; 15686a2265eSRasesh Mody void *ctx; 15786a2265eSRasesh Mody struct ecore_public_vf_info p_vf_info; 15886a2265eSRasesh Mody bool spoof_chk; /* Current configured on HW */ 15986a2265eSRasesh Mody bool req_spoofchk_val; /* Requested value */ 16086a2265eSRasesh Mody 16186a2265eSRasesh Mody /* Stores the configuration requested by VF */ 16286a2265eSRasesh Mody struct ecore_vf_shadow_config shadow_config; 16386a2265eSRasesh Mody 16486a2265eSRasesh Mody /* A bitfield using bulletin's valid-map bits, used to indicate 16586a2265eSRasesh Mody * which of the bulletin board features have been configured. 16686a2265eSRasesh Mody */ 16786a2265eSRasesh Mody u64 configured_features; 16886a2265eSRasesh Mody #define ECORE_IOV_CONFIGURED_FEATURES_MASK ((1 << MAC_ADDR_FORCED) | \ 16986a2265eSRasesh Mody (1 << VLAN_ADDR_FORCED)) 17086a2265eSRasesh Mody }; 17186a2265eSRasesh Mody 17286a2265eSRasesh Mody /* This structure is part of ecore_hwfn and used only for PFs that have sriov 17386a2265eSRasesh Mody * capability enabled. 17486a2265eSRasesh Mody */ 17586a2265eSRasesh Mody struct ecore_pf_iov { 176*52fa735cSRasesh Mody struct ecore_vf_info vfs_array[MAX_NUM_VFS_K2]; 17786a2265eSRasesh Mody u64 pending_flr[ECORE_VF_ARRAY_LENGTH]; 17886a2265eSRasesh Mody 17922d07d93SRasesh Mody #ifndef REMOVE_DBG 18022d07d93SRasesh Mody /* This doesn't serve anything functionally, but it makes windows 18122d07d93SRasesh Mody * debugging of IOV related issues easier. 18222d07d93SRasesh Mody */ 18322d07d93SRasesh Mody u64 active_vfs[ECORE_VF_ARRAY_LENGTH]; 18422d07d93SRasesh Mody #endif 18522d07d93SRasesh Mody 18686a2265eSRasesh Mody /* Allocate message address continuosuly and split to each VF */ 18786a2265eSRasesh Mody void *mbx_msg_virt_addr; 18886a2265eSRasesh Mody dma_addr_t mbx_msg_phys_addr; 18986a2265eSRasesh Mody u32 mbx_msg_size; 19086a2265eSRasesh Mody void *mbx_reply_virt_addr; 19186a2265eSRasesh Mody dma_addr_t mbx_reply_phys_addr; 19286a2265eSRasesh Mody u32 mbx_reply_size; 19386a2265eSRasesh Mody void *p_bulletins; 19486a2265eSRasesh Mody dma_addr_t bulletins_phys; 19586a2265eSRasesh Mody u32 bulletins_size; 19686a2265eSRasesh Mody }; 19786a2265eSRasesh Mody 19886a2265eSRasesh Mody #ifdef CONFIG_ECORE_SRIOV 19986a2265eSRasesh Mody /** 20086a2265eSRasesh Mody * @brief Read sriov related information and allocated resources 20122d07d93SRasesh Mody * reads from configuraiton space, shmem, etc. 20286a2265eSRasesh Mody * 20386a2265eSRasesh Mody * @param p_hwfn 20486a2265eSRasesh Mody * 20586a2265eSRasesh Mody * @return enum _ecore_status_t 20686a2265eSRasesh Mody */ 20722d07d93SRasesh Mody enum _ecore_status_t ecore_iov_hw_info(struct ecore_hwfn *p_hwfn); 20886a2265eSRasesh Mody 20986a2265eSRasesh Mody /** 21086a2265eSRasesh Mody * @brief ecore_add_tlv - place a given tlv on the tlv buffer at next offset 21186a2265eSRasesh Mody * 21230ecf673SRasesh Mody * @param offset 21386a2265eSRasesh Mody * @param type 21486a2265eSRasesh Mody * @param length 21586a2265eSRasesh Mody * 21686a2265eSRasesh Mody * @return pointer to the newly placed tlv 21786a2265eSRasesh Mody */ 21830ecf673SRasesh Mody void *ecore_add_tlv(u8 **offset, u16 type, u16 length); 21986a2265eSRasesh Mody 22086a2265eSRasesh Mody /** 22186a2265eSRasesh Mody * @brief list the types and lengths of the tlvs on the buffer 22286a2265eSRasesh Mody * 22386a2265eSRasesh Mody * @param p_hwfn 22486a2265eSRasesh Mody * @param tlvs_list 22586a2265eSRasesh Mody */ 22622d07d93SRasesh Mody void ecore_dp_tlv_list(struct ecore_hwfn *p_hwfn, 22722d07d93SRasesh Mody void *tlvs_list); 22886a2265eSRasesh Mody 22986a2265eSRasesh Mody /** 23086a2265eSRasesh Mody * @brief ecore_iov_alloc - allocate sriov related resources 23186a2265eSRasesh Mody * 23286a2265eSRasesh Mody * @param p_hwfn 23386a2265eSRasesh Mody * 23486a2265eSRasesh Mody * @return enum _ecore_status_t 23586a2265eSRasesh Mody */ 23686a2265eSRasesh Mody enum _ecore_status_t ecore_iov_alloc(struct ecore_hwfn *p_hwfn); 23786a2265eSRasesh Mody 23886a2265eSRasesh Mody /** 23986a2265eSRasesh Mody * @brief ecore_iov_setup - setup sriov related resources 24086a2265eSRasesh Mody * 24186a2265eSRasesh Mody * @param p_hwfn 24286a2265eSRasesh Mody */ 243739a5b2fSRasesh Mody void ecore_iov_setup(struct ecore_hwfn *p_hwfn); 24486a2265eSRasesh Mody 24586a2265eSRasesh Mody /** 24686a2265eSRasesh Mody * @brief ecore_iov_free - free sriov related resources 24786a2265eSRasesh Mody * 24886a2265eSRasesh Mody * @param p_hwfn 24986a2265eSRasesh Mody */ 25086a2265eSRasesh Mody void ecore_iov_free(struct ecore_hwfn *p_hwfn); 25186a2265eSRasesh Mody 25286a2265eSRasesh Mody /** 25322d07d93SRasesh Mody * @brief free sriov related memory that was allocated during hw_prepare 25422d07d93SRasesh Mody * 25522d07d93SRasesh Mody * @param p_dev 25622d07d93SRasesh Mody */ 25722d07d93SRasesh Mody void ecore_iov_free_hw_info(struct ecore_dev *p_dev); 25822d07d93SRasesh Mody 25922d07d93SRasesh Mody /** 26086a2265eSRasesh Mody * @brief Mark structs of vfs that have been FLR-ed. 26186a2265eSRasesh Mody * 26286a2265eSRasesh Mody * @param p_hwfn 26386a2265eSRasesh Mody * @param disabled_vfs - bitmask of all VFs on path that were FLRed 26486a2265eSRasesh Mody * 265aa96bcbdSRasesh Mody * @return true iff one of the PF's vfs got FLRed. false otherwise. 26686a2265eSRasesh Mody */ 26793fce904SRasesh Mody bool ecore_iov_mark_vf_flr(struct ecore_hwfn *p_hwfn, 26822d07d93SRasesh Mody u32 *disabled_vfs); 26986a2265eSRasesh Mody 27086a2265eSRasesh Mody /** 27186a2265eSRasesh Mody * @brief Search extended TLVs in request/reply buffer. 27286a2265eSRasesh Mody * 27386a2265eSRasesh Mody * @param p_hwfn 27486a2265eSRasesh Mody * @param p_tlvs_list - Pointer to tlvs list 27586a2265eSRasesh Mody * @param req_type - Type of TLV 27686a2265eSRasesh Mody * 27786a2265eSRasesh Mody * @return pointer to tlv type if found, otherwise returns NULL. 27886a2265eSRasesh Mody */ 27986a2265eSRasesh Mody void *ecore_iov_search_list_tlvs(struct ecore_hwfn *p_hwfn, 28086a2265eSRasesh Mody void *p_tlvs_list, u16 req_type); 28186a2265eSRasesh Mody 28286a2265eSRasesh Mody /** 28386a2265eSRasesh Mody * @brief ecore_iov_get_vf_info - return the database of a 28486a2265eSRasesh Mody * specific VF 28586a2265eSRasesh Mody * 28686a2265eSRasesh Mody * @param p_hwfn 28786a2265eSRasesh Mody * @param relative_vf_id - relative id of the VF for which info 28886a2265eSRasesh Mody * is requested 28986a2265eSRasesh Mody * @param b_enabled_only - false iff want to access even if vf is disabled 29086a2265eSRasesh Mody * 29186a2265eSRasesh Mody * @return struct ecore_vf_info* 29286a2265eSRasesh Mody */ 29386a2265eSRasesh Mody struct ecore_vf_info *ecore_iov_get_vf_info(struct ecore_hwfn *p_hwfn, 29486a2265eSRasesh Mody u16 relative_vf_id, 29586a2265eSRasesh Mody bool b_enabled_only); 29686a2265eSRasesh Mody #endif 29786a2265eSRasesh Mody #endif /* __ECORE_SRIOV_H__ */ 298