New upstream version 18.08
[deb_dpdk.git] / drivers / net / qede / base / ecore_sriov.h
index 3471e5c..50c7d2c 100644 (file)
@@ -1,9 +1,7 @@
-/*
- * Copyright (c) 2016 QLogic Corporation.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2016 - 2018 Cavium Inc.
  * All rights reserved.
- * www.qlogic.com
- *
- * See LICENSE.qede_pmd for copyright and licensing details.
+ * www.cavium.com
  */
 
 #ifndef __ECORE_SRIOV_H__
 #include "ecore_vfpf_if.h"
 #include "ecore_iov_api.h"
 #include "ecore_hsi_common.h"
-
-#define ECORE_ETH_VF_NUM_VLAN_FILTERS 2
+#include "ecore_l2.h"
 
 #define ECORE_ETH_MAX_VF_NUM_VLAN_FILTERS \
-       (MAX_NUM_VFS * ECORE_ETH_VF_NUM_VLAN_FILTERS)
+       (MAX_NUM_VFS_E4 * ECORE_ETH_VF_NUM_VLAN_FILTERS)
 
 /* Represents a full message. Both the request filled by VF
  * and the response filled by the PF. The VF needs one copy
@@ -33,37 +30,21 @@ struct ecore_vf_mbx_msg {
        union pfvf_tlvs resp;
 };
 
-/* This data is held in the ecore_hwfn structure for VFs only. */
-struct ecore_vf_iov {
-       union vfpf_tlvs *vf2pf_request;
-       dma_addr_t vf2pf_request_phys;
-       union pfvf_tlvs *pf2vf_reply;
-       dma_addr_t pf2vf_reply_phys;
-
-       /* Should be taken whenever the mailbox buffers are accessed */
-       osal_mutex_t mutex;
-       u8 *offset;
-
-       /* Bulletin Board */
-       struct ecore_bulletin bulletin;
-       struct ecore_bulletin_content bulletin_shadow;
-
-       /* we set aside a copy of the acquire response */
-       struct pfvf_acquire_resp_tlv acquire_resp;
-};
-
 /* This mailbox is maintained per VF in its PF
  * contains all information required for sending / receiving
  * a message
  */
 struct ecore_iov_vf_mbx {
-       union vfpf_tlvs *req_virt;
-       dma_addr_t req_phys;
-       union pfvf_tlvs *reply_virt;
-       dma_addr_t reply_phys;
+       union vfpf_tlvs         *req_virt;
+       dma_addr_t              req_phys;
+       union pfvf_tlvs         *reply_virt;
+       dma_addr_t              reply_phys;
 
        /* Address in VF where a pending message is located */
-       dma_addr_t pending_req;
+       dma_addr_t              pending_req;
+
+       /* Message from VF awaits handling */
+       bool                    b_pending_msg;
 
        u8 *offset;
 
@@ -72,40 +53,41 @@ struct ecore_iov_vf_mbx {
 #endif
 
        /* VF GPA address */
-       u32 vf_addr_lo;
-       u32 vf_addr_hi;
+       u32                     vf_addr_lo;
+       u32                     vf_addr_hi;
 
-       struct vfpf_first_tlv first_tlv;        /* saved VF request header */
+       struct vfpf_first_tlv   first_tlv;      /* saved VF request header */
 
-       u8 flags;
+       u8                      flags;
 #define VF_MSG_INPROCESS       0x1     /* failsafe - the FW should prevent
                                         * more then one pending msg
                                         */
 };
 
-struct ecore_vf_q_info {
+#define ECORE_IOV_LEGACY_QID_RX (0)
+#define ECORE_IOV_LEGACY_QID_TX (1)
+#define ECORE_IOV_QID_INVALID (0xFE)
+
+struct ecore_vf_queue_cid {
+       bool b_is_tx;
+       struct ecore_queue_cid *p_cid;
+};
+
+/* Describes a qzone associated with the VF */
+struct ecore_vf_queue {
+       /* Input from upper-layer, mapping relateive queue to queue-zone */
        u16 fw_rx_qid;
        u16 fw_tx_qid;
-       u8 fw_cid;
-       u8 rxq_active;
-       u8 txq_active;
-};
 
-enum int_mod {
-       VPORT_INT_MOD_UNDEFINED = 0,
-       VPORT_INT_MOD_ADAPTIVE = 1,
-       VPORT_INT_MOD_OFF = 2,
-       VPORT_INT_MOD_LOW = 100,
-       VPORT_INT_MOD_MEDIUM = 200,
-       VPORT_INT_MOD_HIGH = 300
+       struct ecore_vf_queue_cid cids[MAX_QUEUES_PER_QZONE];
 };
 
 enum vf_state {
-       VF_FREE = 0,            /* VF ready to be acquired holds no resc */
-       VF_ACQUIRED = 1,        /* VF, acquired, but not initalized */
-       VF_ENABLED = 2,         /* VF, Enabled */
-       VF_RESET = 3,           /* VF, FLR'd, pending cleanup */
-       VF_STOPPED = 4          /* VF, Stopped */
+       VF_FREE         = 0,    /* VF ready to be acquired holds no resc */
+       VF_ACQUIRED     = 1,    /* VF, acquired, but not initalized */
+       VF_ENABLED      = 2,    /* VF, Enabled */
+       VF_RESET        = 3,    /* VF, FLR'd, pending cleanup */
+       VF_STOPPED      = 4     /* VF, Stopped */
 };
 
 struct ecore_vf_vlan_shadow {
@@ -117,6 +99,8 @@ struct ecore_vf_shadow_config {
        /* Shadow copy of all guest vlans */
        struct ecore_vf_vlan_shadow vlans[ECORE_ETH_VF_NUM_VLAN_FILTERS + 1];
 
+       /* Shadow copy of all configured MACs; Empty if forcing MACs */
+       u8 macs[ECORE_ETH_VF_NUM_MAC_FILTERS][ETH_ALEN];
        u8 inner_vlan_removal;
 };
 
@@ -124,34 +108,47 @@ struct ecore_vf_shadow_config {
 struct ecore_vf_info {
        struct ecore_iov_vf_mbx vf_mbx;
        enum vf_state state;
-       u8 to_disable;
+       bool b_init;
+       bool b_malicious;
+       u8                      to_disable;
 
-       struct ecore_bulletin bulletin;
-       dma_addr_t vf_bulletin;
+       struct ecore_bulletin   bulletin;
+       dma_addr_t              vf_bulletin;
 
-       u32 concrete_fid;
-       u16 opaque_fid;
-       u16 mtu;
+#ifdef CONFIG_ECORE_SW_CHANNEL
+       /* Determine whether PF communicate with VF using HW/SW channel */
+       bool    b_hw_channel;
+#endif
 
-       u8 vport_id;
-       u8 relative_vf_id;
-       u8 abs_vf_id;
+       /* PF saves a copy of the last VF acquire message */
+       struct vfpf_acquire_tlv acquire;
+
+       u32                     concrete_fid;
+       u16                     opaque_fid;
+       u16                     mtu;
+
+       u8                      vport_id;
+       u8                      rss_eng_id;
+       u8                      relative_vf_id;
+       u8                      abs_vf_id;
 #define ECORE_VF_ABS_ID(p_hwfn, p_vf)  (ECORE_PATH_ID(p_hwfn) ? \
                                         (p_vf)->abs_vf_id + MAX_NUM_VFS_BB : \
                                         (p_vf)->abs_vf_id)
 
-       u8 vport_instance;      /* Number of active vports */
-       u8 num_rxqs;
-       u8 num_txqs;
+       u8                      vport_instance; /* Number of active vports */
+       u8                      num_rxqs;
+       u8                      num_txqs;
 
-       u8 num_sbs;
+       u16                     rx_coal;
+       u16                     tx_coal;
 
-       u8 num_mac_filters;
-       u8 num_vlan_filters;
-       u8 num_mc_filters;
+       u8                      num_sbs;
 
-       struct ecore_vf_q_info vf_queues[ECORE_MAX_VF_CHAINS_PER_PF];
-       u16 igu_sbs[ECORE_MAX_VF_CHAINS_PER_PF];
+       u8                      num_mac_filters;
+       u8                      num_vlan_filters;
+
+       struct ecore_vf_queue   vf_queues[ECORE_MAX_VF_CHAINS_PER_PF];
+       u16                     igu_sbs[ECORE_MAX_VF_CHAINS_PER_PF];
 
        /* TODO - Only windows is using it - should be removed */
        u8 was_malicious;
@@ -159,7 +156,7 @@ struct ecore_vf_info {
        void *ctx;
        struct ecore_public_vf_info p_vf_info;
        bool spoof_chk;         /* Current configured on HW */
-       bool req_spoofchk_val;  /* Requested value */
+       bool req_spoofchk_val;  /* Requested value */
 
        /* Stores the configuration requested by VF */
        struct ecore_vf_shadow_config shadow_config;
@@ -176,49 +173,49 @@ struct ecore_vf_info {
  * capability enabled.
  */
 struct ecore_pf_iov {
-       struct ecore_vf_info vfs_array[MAX_NUM_VFS];
-       u64 pending_events[ECORE_VF_ARRAY_LENGTH];
-       u64 pending_flr[ECORE_VF_ARRAY_LENGTH];
-       u16 base_vport_id;
+       struct ecore_vf_info    vfs_array[MAX_NUM_VFS_E4];
+       u64                     pending_flr[ECORE_VF_ARRAY_LENGTH];
+
+#ifndef REMOVE_DBG
+       /* This doesn't serve anything functionally, but it makes windows
+        * debugging of IOV related issues easier.
+        */
+       u64                     active_vfs[ECORE_VF_ARRAY_LENGTH];
+#endif
 
        /* Allocate message address continuosuly and split to each VF */
-       void *mbx_msg_virt_addr;
-       dma_addr_t mbx_msg_phys_addr;
-       u32 mbx_msg_size;
-       void *mbx_reply_virt_addr;
-       dma_addr_t mbx_reply_phys_addr;
-       u32 mbx_reply_size;
-       void *p_bulletins;
-       dma_addr_t bulletins_phys;
-       u32 bulletins_size;
+       void                    *mbx_msg_virt_addr;
+       dma_addr_t              mbx_msg_phys_addr;
+       u32                     mbx_msg_size;
+       void                    *mbx_reply_virt_addr;
+       dma_addr_t              mbx_reply_phys_addr;
+       u32                     mbx_reply_size;
+       void                    *p_bulletins;
+       dma_addr_t              bulletins_phys;
+       u32                     bulletins_size;
 };
 
 #ifdef CONFIG_ECORE_SRIOV
 /**
  * @brief Read sriov related information and allocated resources
- *  reads from configuraiton space, shmem, and allocates the VF
- *  database in the PF.
+ *  reads from configuraiton space, shmem, etc.
  *
  * @param p_hwfn
- * @param p_ptt
  *
  * @return enum _ecore_status_t
  */
-enum _ecore_status_t ecore_iov_hw_info(struct ecore_hwfn *p_hwfn,
-                                      struct ecore_ptt *p_ptt);
+enum _ecore_status_t ecore_iov_hw_info(struct ecore_hwfn *p_hwfn);
 
 /**
  * @brief ecore_add_tlv - place a given tlv on the tlv buffer at next offset
  *
- * @param p_hwfn
- * @param p_iov
+ * @param offset
  * @param type
  * @param length
  *
  * @return pointer to the newly placed tlv
  */
-void *ecore_add_tlv(struct ecore_hwfn *p_hwfn,
-                   u8 **offset, u16 type, u16 length);
+void *ecore_add_tlv(u8 **offset, u16 type, u16 length);
 
 /**
  * @brief list the types and lengths of the tlvs on the buffer
@@ -226,7 +223,8 @@ void *ecore_add_tlv(struct ecore_hwfn *p_hwfn,
  * @param p_hwfn
  * @param tlvs_list
  */
-void ecore_dp_tlv_list(struct ecore_hwfn *p_hwfn, void *tlvs_list);
+void ecore_dp_tlv_list(struct ecore_hwfn *p_hwfn,
+                      void *tlvs_list);
 
 /**
  * @brief ecore_iov_alloc - allocate sriov related resources
@@ -241,9 +239,8 @@ enum _ecore_status_t ecore_iov_alloc(struct ecore_hwfn *p_hwfn);
  * @brief ecore_iov_setup - setup sriov related resources
  *
  * @param p_hwfn
- * @param p_ptt
  */
-void ecore_iov_setup(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
+void ecore_iov_setup(struct ecore_hwfn *p_hwfn);
 
 /**
  * @brief ecore_iov_free - free sriov related resources
@@ -253,28 +250,11 @@ void ecore_iov_setup(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
 void ecore_iov_free(struct ecore_hwfn *p_hwfn);
 
 /**
- * @brief ecore_sriov_eqe_event - handle async sriov event arrived on eqe.
+ * @brief free sriov related memory that was allocated during hw_prepare
  *
- * @param p_hwfn
- * @param opcode
- * @param echo
- * @param data
+ * @param p_dev
  */
-enum _ecore_status_t ecore_sriov_eqe_event(struct ecore_hwfn *p_hwfn,
-                                          u8 opcode,
-                                          __le16 echo,
-                                          union event_ring_data *data);
-
-/**
- * @brief calculate CRC for bulletin board validation
- *
- * @param basic crc seed
- * @param ptr to beginning of buffer
- * @length in bytes of buffer
- *
- * @return calculated crc over buffer [with respect to seed].
- */
-u32 ecore_crc32(u32 crc, u8 *ptr, u32 length);
+void ecore_iov_free_hw_info(struct ecore_dev *p_dev);
 
 /**
  * @brief Mark structs of vfs that have been FLR-ed.
@@ -282,9 +262,10 @@ u32 ecore_crc32(u32 crc, u8 *ptr, u32 length);
  * @param p_hwfn
  * @param disabled_vfs - bitmask of all VFs on path that were FLRed
  *
- * @return 1 iff one of the PF's vfs got FLRed. 0 otherwise.
+ * @return true iff one of the PF's vfs got FLRed. false otherwise.
  */
-int ecore_iov_mark_vf_flr(struct ecore_hwfn *p_hwfn, u32 *disabled_vfs);
+bool ecore_iov_mark_vf_flr(struct ecore_hwfn *p_hwfn,
+                          u32 *disabled_vfs);
 
 /**
  * @brief Search extended TLVs in request/reply buffer.
@@ -312,79 +293,5 @@ void *ecore_iov_search_list_tlvs(struct ecore_hwfn *p_hwfn,
 struct ecore_vf_info *ecore_iov_get_vf_info(struct ecore_hwfn *p_hwfn,
                                            u16 relative_vf_id,
                                            bool b_enabled_only);
-#else
-static OSAL_INLINE enum _ecore_status_t ecore_iov_hw_info(struct ecore_hwfn
-                                                         *p_hwfn,
-                                                         struct ecore_ptt
-                                                         *p_ptt)
-{
-       return ECORE_SUCCESS;
-}
-
-static OSAL_INLINE void *ecore_add_tlv(struct ecore_hwfn *p_hwfn, u8 **offset,
-                                      u16 type, u16 length)
-{
-       return OSAL_NULL;
-}
-
-static OSAL_INLINE void ecore_dp_tlv_list(struct ecore_hwfn *p_hwfn,
-                                         void *tlvs_list)
-{
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_alloc(struct ecore_hwfn
-                                                       *p_hwfn)
-{
-       return ECORE_SUCCESS;
-}
-
-static OSAL_INLINE void ecore_iov_setup(struct ecore_hwfn *p_hwfn,
-                                       struct ecore_ptt *p_ptt)
-{
-}
-
-static OSAL_INLINE void ecore_iov_free(struct ecore_hwfn *p_hwfn)
-{
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_sriov_eqe_event(struct ecore_hwfn
-                                                             *p_hwfn,
-                                                             u8 opcode,
-                                                             __le16 echo,
-                                                             union
-                                                             event_ring_data
-                                                             * data)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE u32 ecore_crc32(u32 crc, u8 *ptr, u32 length)
-{
-       return 0;
-}
-
-static OSAL_INLINE int ecore_iov_mark_vf_flr(struct ecore_hwfn *p_hwfn,
-                                            u32 *disabled_vfs)
-{
-       return 0;
-}
-
-static OSAL_INLINE void *ecore_iov_search_list_tlvs(struct ecore_hwfn *p_hwfn,
-                                                   void *p_tlvs_list,
-                                                   u16 req_type)
-{
-       return OSAL_NULL;
-}
-
-static OSAL_INLINE struct ecore_vf_info *ecore_iov_get_vf_info(struct ecore_hwfn
-                                                              *p_hwfn,
-                                                              u16
-                                                              relative_vf_id,
-                                                              bool
-                                                              b_enabled_only)
-{
-       return OSAL_NULL;
-}
-
 #endif
 #endif /* __ECORE_SRIOV_H__ */