New upstream version 17.11-rc3
[deb_dpdk.git] / drivers / net / qede / base / ecore.h
index 0d68a9b..ce5f3a9 100644 (file)
@@ -29,9 +29,9 @@
 #include "mcp_public.h"
 
 #define ECORE_MAJOR_VERSION            8
-#define ECORE_MINOR_VERSION            18
-#define ECORE_REVISION_VERSION         7
-#define ECORE_ENGINEERING_VERSION      1
+#define ECORE_MINOR_VERSION            30
+#define ECORE_REVISION_VERSION         8
+#define ECORE_ENGINEERING_VERSION      0
 
 #define ECORE_VERSION                                                  \
        ((ECORE_MAJOR_VERSION << 24) | (ECORE_MINOR_VERSION << 16) |    \
@@ -50,6 +50,7 @@
 #define FCOE_BDQ_ID(_port_id) (_port_id + 2)
 /* Constants */
 #define ECORE_WID_SIZE         (1024)
+#define ECORE_MIN_WIDS         (4)
 
 /* Configurable */
 #define ECORE_PF_DEMS_SIZE     (4)
@@ -66,6 +67,7 @@ enum ecore_nvm_cmd {
        ECORE_NVM_READ_NVRAM = DRV_MSG_CODE_NVM_READ_NVRAM,
        ECORE_NVM_WRITE_NVRAM = DRV_MSG_CODE_NVM_WRITE_NVRAM,
        ECORE_NVM_DEL_FILE = DRV_MSG_CODE_NVM_DEL_FILE,
+       ECORE_EXT_PHY_FW_UPGRADE = DRV_MSG_CODE_EXT_PHY_FW_UPGRADE,
        ECORE_NVM_SET_SECURE_MODE = DRV_MSG_CODE_SET_SECURE_MODE,
        ECORE_PHY_RAW_READ = DRV_MSG_CODE_PHY_RAW_READ,
        ECORE_PHY_RAW_WRITE = DRV_MSG_CODE_PHY_RAW_WRITE,
@@ -97,16 +99,16 @@ do {                                                                        \
 
 #define GET_FIELD(value, name)                                         \
        (((value) >> (name##_SHIFT)) & name##_MASK)
-#endif
 
-#define ECORE_MFW_GET_FIELD(name, field)                               \
-       (((name) & (field ## _MASK)) >> (field ## _SHIFT))
+#define GET_MFW_FIELD(name, field)                             \
+       (((name) & (field ## _MASK)) >> (field ## _OFFSET))
 
-#define ECORE_MFW_SET_FIELD(name, field, value)                                \
+#define SET_MFW_FIELD(name, field, value)                              \
 do {                                                                   \
-       (name) &= ~(field ## _MASK);                                    \
-       (name) |= (((value) << (field ## _SHIFT)) & (field ## _MASK));  \
+       (name) &= ~((field ## _MASK));          \
+       (name) |= (((value) << (field ## _OFFSET)) & (field ## _MASK)); \
 } while (0)
+#endif
 
 static OSAL_INLINE u32 DB_ADDR(u32 cid, u32 DEMS)
 {
@@ -279,7 +281,6 @@ struct ecore_qm_iids {
  * is received from MFW.
  */
 enum ecore_resources {
-       ECORE_SB,
        ECORE_L2_QUEUE,
        ECORE_VPORT,
        ECORE_RSS_ENG,
@@ -293,7 +294,13 @@ enum ecore_resources {
        ECORE_CMDQS_CQS,
        ECORE_RDMA_STATS_QUEUE,
        ECORE_BDQ,
-       ECORE_MAX_RESC,                 /* must be last */
+
+       /* This is needed only internally for matching against the IGU.
+        * In case of legacy MFW, would be set to `0'.
+        */
+       ECORE_SB,
+
+       ECORE_MAX_RESC,
 };
 
 /* Features that require resources, given as input to the resource management
@@ -345,22 +352,32 @@ enum ecore_hw_err_type {
 };
 #endif
 
+enum ecore_db_rec_exec {
+       DB_REC_DRY_RUN,
+       DB_REC_REAL_DEAL,
+       DB_REC_ONCE,
+};
+
 struct ecore_hw_info {
        /* PCI personality */
        enum ecore_pci_personality personality;
-#define ECORE_IS_RDMA_PERSONALITY(dev)                     \
-       ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE ||  \
+#define ECORE_IS_RDMA_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE || \
         (dev)->hw_info.personality == ECORE_PCI_ETH_IWARP || \
         (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
-#define ECORE_IS_ROCE_PERSONALITY(dev)                    \
+#define ECORE_IS_ROCE_PERSONALITY(dev) \
        ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE || \
         (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
-#define ECORE_IS_IWARP_PERSONALITY(dev)                            \
+#define ECORE_IS_IWARP_PERSONALITY(dev) \
        ((dev)->hw_info.personality == ECORE_PCI_ETH_IWARP || \
         (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
-#define ECORE_IS_L2_PERSONALITY(dev)                 \
+#define ECORE_IS_L2_PERSONALITY(dev) \
        ((dev)->hw_info.personality == ECORE_PCI_ETH || \
         ECORE_IS_RDMA_PERSONALITY(dev))
+#define ECORE_IS_FCOE_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_FCOE)
+#define ECORE_IS_ISCSI_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ISCSI)
 
        /* Resource Allocation scheme results */
        u32 resc_start[ECORE_MAX_RESC];
@@ -473,6 +490,12 @@ struct ecore_qm_info {
        u8                      num_pf_rls;
 };
 
+struct ecore_db_recovery_info {
+       osal_list_t list;
+       osal_spinlock_t lock;
+       u32 db_recovery_counter;
+};
+
 struct storm_stats {
        u32 address;
        u32 len;
@@ -488,14 +511,60 @@ struct ecore_fw_data {
        u32 init_ops_size;
 };
 
+enum ecore_mf_mode_bit {
+       /* Supports PF-classification based on tag */
+       ECORE_MF_OVLAN_CLSS,
+
+       /* Supports PF-classification based on MAC */
+       ECORE_MF_LLH_MAC_CLSS,
+
+       /* Supports PF-classification based on protocol type */
+       ECORE_MF_LLH_PROTO_CLSS,
+
+       /* Requires a default PF to be set */
+       ECORE_MF_NEED_DEF_PF,
+
+       /* Allow LL2 to multicast/broadcast */
+       ECORE_MF_LL2_NON_UNICAST,
+
+       /* Allow Cross-PF [& child VFs] Tx-switching */
+       ECORE_MF_INTER_PF_SWITCH,
+
+       /* TODO - if we ever re-utilize any of this logic, we can rename */
+       ECORE_MF_UFP_SPECIFIC,
+
+       ECORE_MF_DISABLE_ARFS,
+};
+
+enum ecore_ufp_mode {
+       ECORE_UFP_MODE_ETS,
+       ECORE_UFP_MODE_VNIC_BW,
+};
+
+enum ecore_ufp_pri_type {
+       ECORE_UFP_PRI_OS,
+       ECORE_UFP_PRI_VNIC
+};
+
+struct ecore_ufp_info {
+       enum ecore_ufp_pri_type pri_type;
+       enum ecore_ufp_mode mode;
+       u8 tc;
+};
+
+enum BAR_ID {
+       BAR_ID_0,       /* used for GRC */
+       BAR_ID_1        /* Used for doorbells */
+};
+
 struct ecore_hwfn {
        struct ecore_dev                *p_dev;
        u8                              my_id;          /* ID inside the PF */
 #define IS_LEAD_HWFN(edev)             (!((edev)->my_id))
        u8                              rel_pf_id;      /* Relative to engine*/
        u8                              abs_pf_id;
-       #define ECORE_PATH_ID(_p_hwfn) \
-               (ECORE_IS_K2((_p_hwfn)->p_dev) ? 0 : ((_p_hwfn)->abs_pf_id & 1))
+#define ECORE_PATH_ID(_p_hwfn) \
+       (ECORE_IS_BB((_p_hwfn)->p_dev) ? ((_p_hwfn)->abs_pf_id & 1) : 0)
        u8                              port_id;
        bool                            b_active;
 
@@ -556,10 +625,6 @@ struct ecore_hwfn {
        bool                            b_rdma_enabled_in_prs;
        u32                             rdma_prs_search_reg;
 
-       /* Array of sb_info of all status blocks */
-       struct ecore_sb_info            *sbs_info[MAX_SB_PER_PF_MIMD];
-       u16                             num_sbs;
-
        struct ecore_cxt_mngr           *p_cxt_mngr;
 
        /* Flag indicating whether interrupts are enabled or not*/
@@ -573,6 +638,7 @@ struct ecore_hwfn {
        struct ecore_pf_iov             *pf_iov_info;
        struct ecore_mcp_info           *mcp_info;
        struct ecore_dcbx_info          *p_dcbx_info;
+       struct ecore_ufp_info           ufp_info;
 
        struct ecore_dmae_info          dmae_info;
 
@@ -603,17 +669,19 @@ struct ecore_hwfn {
        /* L2-related */
        struct ecore_l2_info            *p_l2_info;
 
+       /* Mechanism for recovering from doorbell drop */
+       struct ecore_db_recovery_info   db_recovery_info;
+
        /* @DPDK */
        struct ecore_ptt                *p_arfs_ptt;
 };
 
-#ifndef __EXTRACT__LINUX__
 enum ecore_mf_mode {
        ECORE_MF_DEFAULT,
        ECORE_MF_OVLAN,
        ECORE_MF_NPAR,
+       ECORE_MF_UFP,
 };
-#endif
 
 /* @DPDK */
 struct ecore_dbg_feature {
@@ -632,15 +700,18 @@ enum qed_dbg_features {
        DBG_FEATURE_NUM
 };
 
+enum ecore_dev_type {
+       ECORE_DEV_TYPE_BB,
+       ECORE_DEV_TYPE_AH,
+};
+
 struct ecore_dev {
        u32                             dp_module;
        u8                              dp_level;
        char                            name[NAME_SIZE];
        void                            *dp_ctx;
 
-       u8                              type;
-#define ECORE_DEV_TYPE_BB      (0 << 0)
-#define ECORE_DEV_TYPE_AH      (1 << 0)
+       enum ecore_dev_type             type;
 /* Translate type/revision combo into the proper conditions */
 #define ECORE_IS_BB(dev)       ((dev)->type == ECORE_DEV_TYPE_BB)
 #define ECORE_IS_BB_A0(dev)    (ECORE_IS_BB(dev) && CHIP_REV_IS_A0(dev))
@@ -653,66 +724,68 @@ struct ecore_dev {
 #define ECORE_IS_AH(dev)       ((dev)->type == ECORE_DEV_TYPE_AH)
 #define ECORE_IS_K2(dev)       ECORE_IS_AH(dev)
 
+       u16 vendor_id;
+       u16 device_id;
 #define ECORE_DEV_ID_MASK      0xff00
 #define ECORE_DEV_ID_MASK_BB   0x1600
 #define ECORE_DEV_ID_MASK_AH   0x8000
 
-       u16 vendor_id;
-       u16 device_id;
-
        u16                             chip_num;
-       #define CHIP_NUM_MASK                   0xffff
-       #define CHIP_NUM_SHIFT                  16
+#define CHIP_NUM_MASK                  0xffff
+#define CHIP_NUM_SHIFT                 0
 
-       u16                             chip_rev;
-       #define CHIP_REV_MASK                   0xf
-       #define CHIP_REV_SHIFT                  12
+       u                             chip_rev;
+#define CHIP_REV_MASK                  0xf
+#define CHIP_REV_SHIFT                 0
 #ifndef ASIC_ONLY
-       #define CHIP_REV_IS_TEDIBEAR(_p_dev) ((_p_dev)->chip_rev == 0x5)
-       #define CHIP_REV_IS_EMUL_A0(_p_dev) ((_p_dev)->chip_rev == 0xe)
-       #define CHIP_REV_IS_EMUL_B0(_p_dev) ((_p_dev)->chip_rev == 0xc)
-       #define CHIP_REV_IS_EMUL(_p_dev) (CHIP_REV_IS_EMUL_A0(_p_dev) || \
-                                         CHIP_REV_IS_EMUL_B0(_p_dev))
-       #define CHIP_REV_IS_FPGA_A0(_p_dev) ((_p_dev)->chip_rev == 0xf)
-       #define CHIP_REV_IS_FPGA_B0(_p_dev) ((_p_dev)->chip_rev == 0xd)
-       #define CHIP_REV_IS_FPGA(_p_dev) (CHIP_REV_IS_FPGA_A0(_p_dev) || \
-                                         CHIP_REV_IS_FPGA_B0(_p_dev))
-       #define CHIP_REV_IS_SLOW(_p_dev) \
-               (CHIP_REV_IS_EMUL(_p_dev) || CHIP_REV_IS_FPGA(_p_dev))
-       #define CHIP_REV_IS_A0(_p_dev) \
-               (CHIP_REV_IS_EMUL_A0(_p_dev) || \
-                CHIP_REV_IS_FPGA_A0(_p_dev) || \
-                !(_p_dev)->chip_rev)
-       #define CHIP_REV_IS_B0(_p_dev) \
-               (CHIP_REV_IS_EMUL_B0(_p_dev) || \
-                CHIP_REV_IS_FPGA_B0(_p_dev) || \
-                (_p_dev)->chip_rev == 1)
-       #define CHIP_REV_IS_ASIC(_p_dev) !CHIP_REV_IS_SLOW(_p_dev)
+#define CHIP_REV_IS_TEDIBEAR(_p_dev)   ((_p_dev)->chip_rev == 0x5)
+#define CHIP_REV_IS_EMUL_A0(_p_dev)    ((_p_dev)->chip_rev == 0xe)
+#define CHIP_REV_IS_EMUL_B0(_p_dev)    ((_p_dev)->chip_rev == 0xc)
+#define CHIP_REV_IS_EMUL(_p_dev) \
+       (CHIP_REV_IS_EMUL_A0(_p_dev) || CHIP_REV_IS_EMUL_B0(_p_dev))
+#define CHIP_REV_IS_FPGA_A0(_p_dev)    ((_p_dev)->chip_rev == 0xf)
+#define CHIP_REV_IS_FPGA_B0(_p_dev)    ((_p_dev)->chip_rev == 0xd)
+#define CHIP_REV_IS_FPGA(_p_dev) \
+       (CHIP_REV_IS_FPGA_A0(_p_dev) || CHIP_REV_IS_FPGA_B0(_p_dev))
+#define CHIP_REV_IS_SLOW(_p_dev) \
+       (CHIP_REV_IS_EMUL(_p_dev) || CHIP_REV_IS_FPGA(_p_dev))
+#define CHIP_REV_IS_A0(_p_dev) \
+       (CHIP_REV_IS_EMUL_A0(_p_dev) || CHIP_REV_IS_FPGA_A0(_p_dev) || \
+        (!(_p_dev)->chip_rev && !(_p_dev)->chip_metal))
+#define CHIP_REV_IS_B0(_p_dev) \
+       (CHIP_REV_IS_EMUL_B0(_p_dev) || CHIP_REV_IS_FPGA_B0(_p_dev) || \
+        ((_p_dev)->chip_rev == 1 && !(_p_dev)->chip_metal))
+#define CHIP_REV_IS_ASIC(_p_dev)       !CHIP_REV_IS_SLOW(_p_dev)
 #else
-       #define CHIP_REV_IS_A0(_p_dev)  (!(_p_dev)->chip_rev)
-       #define CHIP_REV_IS_B0(_p_dev)  ((_p_dev)->chip_rev == 1)
+#define CHIP_REV_IS_A0(_p_dev) \
+       (!(_p_dev)->chip_rev && !(_p_dev)->chip_metal)
+#define CHIP_REV_IS_B0(_p_dev) \
+       ((_p_dev)->chip_rev == 1 && !(_p_dev)->chip_metal)
 #endif
 
-       u16                             chip_metal;
-       #define CHIP_METAL_MASK                 0xff
-       #define CHIP_METAL_SHIFT                4
+       u                             chip_metal;
+#define CHIP_METAL_MASK                        0xff
+#define CHIP_METAL_SHIFT               0
 
-       u16                             chip_bond_id;
-       #define CHIP_BOND_ID_MASK               0xf
-       #define CHIP_BOND_ID_SHIFT              0
+       u                             chip_bond_id;
+#define CHIP_BOND_ID_MASK              0xff
+#define CHIP_BOND_ID_SHIFT             0
 
        u8                              num_engines;
-       u8                              num_ports_in_engines;
+       u8                              num_ports;
+       u8                              num_ports_in_engine;
        u8                              num_funcs_in_port;
 
        u8                              path_id;
+
+       unsigned long                   mf_bits;
        enum ecore_mf_mode              mf_mode;
-       #define IS_MF_DEFAULT(_p_hwfn)  \
-                       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_DEFAULT)
-       #define IS_MF_SI(_p_hwfn)       \
-                       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_NPAR)
-       #define IS_MF_SD(_p_hwfn)       \
-                       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_OVLAN)
+#define IS_MF_DEFAULT(_p_hwfn) \
+       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_DEFAULT)
+#define IS_MF_SI(_p_hwfn)      \
+       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_NPAR)
+#define IS_MF_SD(_p_hwfn)      \
+       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_OVLAN)
 
        int                             pcie_width;
        int                             pcie_speed;
@@ -744,12 +817,14 @@ struct ecore_dev {
        /* HW functions */
        u8                              num_hwfns;
        struct ecore_hwfn               hwfns[MAX_HWFNS_PER_DEVICE];
+#define ECORE_IS_CMT(dev)              ((dev)->num_hwfns > 1)
 
        /* SRIOV */
        struct ecore_hw_sriov_info      *p_iov_info;
 #define IS_ECORE_SRIOV(p_dev)          (!!(p_dev)->p_iov_info)
        struct ecore_tunnel_info        tunnel;
        bool                            b_is_vf;
+       bool                            b_dont_override_vf_msix;
 
        u32                             drv_type;
 
@@ -800,6 +875,8 @@ struct ecore_dev {
 #define NUM_OF_ENG_PFS(dev)    (ECORE_IS_BB(dev) ? MAX_NUM_PFS_BB \
                                                  : MAX_NUM_PFS_K2)
 
+#define CRC8_TABLE_SIZE 256
+
 /**
  * @brief ecore_concrete_to_sw_fid - get the sw function id from
  *        the concrete value.
@@ -808,8 +885,7 @@ struct ecore_dev {
  *
  * @return OSAL_INLINE u8
  */
-static OSAL_INLINE u8
-ecore_concrete_to_sw_fid(__rte_unused struct ecore_dev *p_dev, u32 concrete_fid)
+static OSAL_INLINE u8 ecore_concrete_to_sw_fid(u32 concrete_fid)
 {
        u8 vfid     = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_VFID);
        u8 pfid     = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_PFID);
@@ -824,11 +900,12 @@ ecore_concrete_to_sw_fid(__rte_unused struct ecore_dev *p_dev, u32 concrete_fid)
        return sw_fid;
 }
 
-#define PURE_LB_TC 8
 #define PKT_LB_TC 9
+#define MAX_NUM_VOQS_E4 20
 
 int ecore_configure_vport_wfq(struct ecore_dev *p_dev, u16 vp_id, u32 rate);
 void ecore_configure_vp_wfq_on_link_change(struct ecore_dev *p_dev,
+                                          struct ecore_ptt *p_ptt,
                                           u32 min_pf_rate);
 
 int ecore_configure_pf_max_bandwidth(struct ecore_dev *p_dev, u8 max_bw);
@@ -854,6 +931,13 @@ u16 ecore_get_cm_pq_idx_mcos(struct ecore_hwfn *p_hwfn, u8 tc);
 u16 ecore_get_cm_pq_idx_vf(struct ecore_hwfn *p_hwfn, u16 vf);
 u16 ecore_get_cm_pq_idx_rl(struct ecore_hwfn *p_hwfn, u8 qpid);
 
+const char *ecore_hw_get_resc_name(enum ecore_resources res_id);
+
+/* doorbell recovery mechanism */
+void ecore_db_recovery_dp(struct ecore_hwfn *p_hwfn);
+void ecore_db_recovery_execute(struct ecore_hwfn *p_hwfn,
+                              enum ecore_db_rec_exec);
+
 /* amount of resources used in qm init */
 u8 ecore_init_qm_get_num_tcs(struct ecore_hwfn *p_hwfn);
 u16 ecore_init_qm_get_num_vfs(struct ecore_hwfn *p_hwfn);
@@ -863,6 +947,4 @@ u16 ecore_init_qm_get_num_pqs(struct ecore_hwfn *p_hwfn);
 
 #define ECORE_LEADING_HWFN(dev)        (&dev->hwfns[0])
 
-const char *ecore_hw_get_resc_name(enum ecore_resources res_id);
-
 #endif /* __ECORE_H */