These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / linux / mlx5 / driver.h
index 9a90e75..af3efd9 100644 (file)
@@ -44,7 +44,6 @@
 
 #include <linux/mlx5/device.h>
 #include <linux/mlx5/doorbell.h>
-#include <linux/mlx5/mlx5_ifc.h>
 
 enum {
        MLX5_BOARD_ID_LEN = 64,
@@ -85,7 +84,7 @@ enum {
 };
 
 enum {
-       MLX5_MAX_EQ_NAME        = 32
+       MLX5_MAX_IRQ_NAME       = 32
 };
 
 enum {
@@ -104,10 +103,13 @@ enum {
        MLX5_REG_PMTU            = 0x5003,
        MLX5_REG_PTYS            = 0x5004,
        MLX5_REG_PAOS            = 0x5006,
+       MLX5_REG_PFCC            = 0x5007,
+       MLX5_REG_PPCNT           = 0x5008,
        MLX5_REG_PMAOS           = 0x5012,
        MLX5_REG_PUDE            = 0x5009,
        MLX5_REG_PMPE            = 0x5010,
        MLX5_REG_PELC            = 0x500e,
+       MLX5_REG_PVLC            = 0x500f,
        MLX5_REG_PMLP            = 0, /* TBD */
        MLX5_REG_NODE_DESC       = 0x6001,
        MLX5_REG_HOST_ENDIANNESS = 0x7004,
@@ -150,6 +152,11 @@ enum mlx5_dev_event {
        MLX5_DEV_EVENT_CLIENT_REREG,
 };
 
+enum mlx5_port_status {
+       MLX5_PORT_UP        = 1,
+       MLX5_PORT_DOWN      = 2,
+};
+
 struct mlx5_uuar_info {
        struct mlx5_uar        *uars;
        int                     num_uars;
@@ -269,56 +276,7 @@ struct mlx5_cmd {
 struct mlx5_port_caps {
        int     gid_table_len;
        int     pkey_table_len;
-};
-
-struct mlx5_general_caps {
-       u8      log_max_eq;
-       u8      log_max_cq;
-       u8      log_max_qp;
-       u8      log_max_mkey;
-       u8      log_max_pd;
-       u8      log_max_srq;
-       u8      log_max_strq;
-       u8      log_max_mrw_sz;
-       u8      log_max_bsf_list_size;
-       u8      log_max_klm_list_size;
-       u32     max_cqes;
-       int     max_wqes;
-       u32     max_eqes;
-       u32     max_indirection;
-       int     max_sq_desc_sz;
-       int     max_rq_desc_sz;
-       int     max_dc_sq_desc_sz;
-       u64     flags;
-       u16     stat_rate_support;
-       int     log_max_msg;
-       int     num_ports;
-       u8      log_max_ra_res_qp;
-       u8      log_max_ra_req_qp;
-       int     max_srq_wqes;
-       int     bf_reg_size;
-       int     bf_regs_per_page;
-       struct mlx5_port_caps   port[MLX5_MAX_PORTS];
-       u8                      ext_port_cap[MLX5_MAX_PORTS];
-       int     max_vf;
-       u32     reserved_lkey;
-       u8      local_ca_ack_delay;
-       u8      log_max_mcg;
-       u32     max_qp_mcg;
-       int     min_page_sz;
-       int     pd_cap;
-       u32     max_qp_counters;
-       u32     pkey_table_size;
-       u8      log_max_ra_req_dc;
-       u8      log_max_ra_res_dc;
-       u32     uar_sz;
-       u8      min_log_pg_sz;
-       u8      log_max_xrcd;
-       u16     log_uar_page_sz;
-};
-
-struct mlx5_caps {
-       struct mlx5_general_caps gen;
+       u8      ext_port_cap;
 };
 
 struct mlx5_cmd_mailbox {
@@ -334,8 +292,6 @@ struct mlx5_buf_list {
 
 struct mlx5_buf {
        struct mlx5_buf_list    direct;
-       struct mlx5_buf_list   *page_list;
-       int                     nbufs;
        int                     npages;
        int                     size;
        u8                      page_shift;
@@ -347,11 +303,10 @@ struct mlx5_eq {
        u32                     cons_index;
        struct mlx5_buf         buf;
        int                     size;
-       u8                      irqn;
+       unsigned int            irqn;
        u8                      eqn;
        int                     nent;
        u64                     mask;
-       char                    name[MLX5_MAX_EQ_NAME];
        struct list_head        list;
        int                     index;
        struct mlx5_rsc_debug   *dbg;
@@ -387,6 +342,8 @@ struct mlx5_core_mr {
 
 enum mlx5_res_type {
        MLX5_RES_QP,
+       MLX5_RES_SRQ,
+       MLX5_RES_XSRQ,
 };
 
 struct mlx5_core_rsc_common {
@@ -396,6 +353,7 @@ struct mlx5_core_rsc_common {
 };
 
 struct mlx5_core_srq {
+       struct mlx5_core_rsc_common     common; /* must be first */
        u32             srqn;
        int             max;
        int             max_gs;
@@ -414,7 +372,6 @@ struct mlx5_eq_table {
        struct mlx5_eq          pages_eq;
        struct mlx5_eq          async_eq;
        struct mlx5_eq          cmd_eq;
-       struct msix_entry       *msix_arr;
        int                     num_comp_vectors;
        /* protect EQs list
         */
@@ -425,7 +382,7 @@ struct mlx5_uar {
        u32                     index;
        struct list_head        bf_list;
        unsigned                free_bf_bmap;
-       void __iomem           *wc_map;
+       void __iomem           *bf_map;
        void __iomem           *map;
 };
 
@@ -434,9 +391,11 @@ struct mlx5_core_health {
        struct health_buffer __iomem   *health;
        __be32 __iomem                 *health_counter;
        struct timer_list               timer;
-       struct list_head                list;
        u32                             prev;
        int                             miss_counter;
+       bool                            sick;
+       struct workqueue_struct        *wq;
+       struct work_struct              work;
 };
 
 struct mlx5_cq_table {
@@ -467,12 +426,21 @@ struct mlx5_mr_table {
        struct radix_tree_root  tree;
 };
 
+struct mlx5_irq_info {
+       cpumask_var_t mask;
+       char name[MLX5_MAX_IRQ_NAME];
+};
+
 struct mlx5_priv {
        char                    name[MLX5_MAX_NAME_LEN];
        struct mlx5_eq_table    eq_table;
+       struct msix_entry       *msix_arr;
+       struct mlx5_irq_info    *irq_info;
        struct mlx5_uuar_info   uuari;
        MLX5_DECLARE_DOORBELL_LOCK(cq_uar_lock);
 
+       struct io_mapping       *bf_mapping;
+
        /* pages stuff */
        struct workqueue_struct *pg_wq;
        struct rb_root          page_root;
@@ -501,6 +469,10 @@ struct mlx5_priv {
        /* end: mr staff */
 
        /* start: alloc staff */
+       /* protect buffer alocation according to numa node */
+       struct mutex            alloc_mutex;
+       int                     numa_node;
+
        struct mutex            pgdir_mutex;
        struct list_head        pgdir_list;
        /* end: alloc staff */
@@ -515,20 +487,45 @@ struct mlx5_priv {
        spinlock_t              ctx_lock;
 };
 
+enum mlx5_device_state {
+       MLX5_DEVICE_STATE_UP,
+       MLX5_DEVICE_STATE_INTERNAL_ERROR,
+};
+
+enum mlx5_interface_state {
+       MLX5_INTERFACE_STATE_DOWN,
+       MLX5_INTERFACE_STATE_UP,
+};
+
+enum mlx5_pci_status {
+       MLX5_PCI_STATUS_DISABLED,
+       MLX5_PCI_STATUS_ENABLED,
+};
+
 struct mlx5_core_dev {
        struct pci_dev         *pdev;
+       /* sync pci state */
+       struct mutex            pci_status_mutex;
+       enum mlx5_pci_status    pci_status;
        u8                      rev_id;
        char                    board_id[MLX5_BOARD_ID_LEN];
        struct mlx5_cmd         cmd;
-       struct mlx5_caps        caps;
+       struct mlx5_port_caps   port_caps[MLX5_MAX_PORTS];
+       u32 hca_caps_cur[MLX5_CAP_NUM][MLX5_UN_SZ_DW(hca_cap_union)];
+       u32 hca_caps_max[MLX5_CAP_NUM][MLX5_UN_SZ_DW(hca_cap_union)];
        phys_addr_t             iseg_base;
        struct mlx5_init_seg __iomem *iseg;
+       enum mlx5_device_state  state;
+       /* sync interface state */
+       struct mutex            intf_state_mutex;
+       enum mlx5_interface_state interface_state;
        void                    (*event) (struct mlx5_core_dev *dev,
                                          enum mlx5_dev_event event,
                                          unsigned long param);
        struct mlx5_priv        priv;
        struct mlx5_profile     *profile;
        atomic_t                num_qps;
+       u32                     issi;
 };
 
 struct mlx5_db {
@@ -549,6 +546,11 @@ enum {
        MLX5_COMP_EQ_SIZE = 1024,
 };
 
+enum {
+       MLX5_PTYS_IB = 1 << 0,
+       MLX5_PTYS_EN = 1 << 2,
+};
+
 struct mlx5_db_pgdir {
        struct list_head        list;
        DECLARE_BITMAP(bitmap, MLX5_DB_PER_PAGE);
@@ -584,13 +586,44 @@ struct mlx5_pas {
        u8      log_sz;
 };
 
+enum port_state_policy {
+       MLX5_AAA_000
+};
+
+enum phy_port_state {
+       MLX5_AAA_111
+};
+
+struct mlx5_hca_vport_context {
+       u32                     field_select;
+       bool                    sm_virt_aware;
+       bool                    has_smi;
+       bool                    has_raw;
+       enum port_state_policy  policy;
+       enum phy_port_state     phys_state;
+       enum ib_port_state      vport_state;
+       u8                      port_physical_state;
+       u64                     sys_image_guid;
+       u64                     port_guid;
+       u64                     node_guid;
+       u32                     cap_mask1;
+       u32                     cap_mask1_perm;
+       u32                     cap_mask2;
+       u32                     cap_mask2_perm;
+       u16                     lid;
+       u8                      init_type_reply; /* bitmask: see ib spec 14.2.5.6 InitTypeReply */
+       u8                      lmc;
+       u8                      subnet_timeout;
+       u16                     sm_lid;
+       u8                      sm_sl;
+       u16                     qkey_violation_counter;
+       u16                     pkey_violation_counter;
+       bool                    grh_required;
+};
+
 static inline void *mlx5_buf_offset(struct mlx5_buf *buf, int offset)
 {
-       if (likely(BITS_PER_LONG == 64 || buf->nbufs == 1))
                return buf->direct.buf + offset;
-       else
-               return buf->page_list[offset >> PAGE_SHIFT].buf +
-                       (offset & (PAGE_SIZE - 1));
 }
 
 extern struct workqueue_struct *mlx5_core_wq;
@@ -654,8 +687,8 @@ void mlx5_cmd_use_events(struct mlx5_core_dev *dev);
 void mlx5_cmd_use_polling(struct mlx5_core_dev *dev);
 int mlx5_cmd_status_to_err(struct mlx5_outbox_hdr *hdr);
 int mlx5_cmd_status_to_err_v2(void *ptr);
-int mlx5_core_get_caps(struct mlx5_core_dev *dev, struct mlx5_caps *caps,
-                      u16 opmod);
+int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type,
+                      enum mlx5_cap_mode cap_mode);
 int mlx5_cmd_exec(struct mlx5_core_dev *dev, void *in, int in_size, void *out,
                  int out_size);
 int mlx5_cmd_exec_cb(struct mlx5_core_dev *dev, void *in, int in_size,
@@ -665,19 +698,23 @@ int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn);
 int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn);
 int mlx5_alloc_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari);
 int mlx5_free_uuars(struct mlx5_core_dev *dev, struct mlx5_uuar_info *uuari);
-void mlx5_health_cleanup(void);
-void  __init mlx5_health_init(void);
+int mlx5_alloc_map_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar);
+void mlx5_unmap_free_uar(struct mlx5_core_dev *mdev, struct mlx5_uar *uar);
+void mlx5_health_cleanup(struct mlx5_core_dev *dev);
+int mlx5_health_init(struct mlx5_core_dev *dev);
 void mlx5_start_health_poll(struct mlx5_core_dev *dev);
 void mlx5_stop_health_poll(struct mlx5_core_dev *dev);
-int mlx5_buf_alloc(struct mlx5_core_dev *dev, int size, int max_direct,
-                  struct mlx5_buf *buf);
+int mlx5_buf_alloc_node(struct mlx5_core_dev *dev, int size,
+                       struct mlx5_buf *buf, int node);
+int mlx5_buf_alloc(struct mlx5_core_dev *dev, int size, struct mlx5_buf *buf);
 void mlx5_buf_free(struct mlx5_core_dev *dev, struct mlx5_buf *buf);
 struct mlx5_cmd_mailbox *mlx5_alloc_cmd_mailbox_chain(struct mlx5_core_dev *dev,
                                                      gfp_t flags, int npages);
 void mlx5_free_cmd_mailbox_chain(struct mlx5_core_dev *dev,
                                 struct mlx5_cmd_mailbox *head);
 int mlx5_core_create_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
-                        struct mlx5_create_srq_mbox_in *in, int inlen);
+                        struct mlx5_create_srq_mbox_in *in, int inlen,
+                        int is_xrc);
 int mlx5_core_destroy_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq);
 int mlx5_core_query_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq,
                        struct mlx5_query_srq_mbox_out *out);
@@ -696,7 +733,7 @@ int mlx5_core_dump_fill_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr,
                             u32 *mkey);
 int mlx5_core_alloc_pd(struct mlx5_core_dev *dev, u32 *pdn);
 int mlx5_core_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn);
-int mlx5_core_mad_ifc(struct mlx5_core_dev *dev, void *inb, void *outb,
+int mlx5_core_mad_ifc(struct mlx5_core_dev *dev, const void *inb, void *outb,
                      u16 opmod, u8 port);
 void mlx5_pagealloc_init(struct mlx5_core_dev *dev);
 void mlx5_pagealloc_cleanup(struct mlx5_core_dev *dev);
@@ -718,14 +755,15 @@ void mlx5_eq_pagefault(struct mlx5_core_dev *dev, struct mlx5_eqe *eqe);
 #endif
 void mlx5_srq_event(struct mlx5_core_dev *dev, u32 srqn, int event_type);
 struct mlx5_core_srq *mlx5_core_get_srq(struct mlx5_core_dev *dev, u32 srqn);
-void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, unsigned long vector);
+void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec);
 void mlx5_cq_event(struct mlx5_core_dev *dev, u32 cqn, int event_type);
 int mlx5_create_map_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq, u8 vecidx,
                       int nent, u64 mask, const char *name, struct mlx5_uar *uar);
 int mlx5_destroy_unmap_eq(struct mlx5_core_dev *dev, struct mlx5_eq *eq);
 int mlx5_start_eqs(struct mlx5_core_dev *dev);
 int mlx5_stop_eqs(struct mlx5_core_dev *dev);
-int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int *irqn);
+int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,
+                   unsigned int *irqn);
 int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
 int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
 
@@ -734,7 +772,37 @@ void mlx5_qp_debugfs_cleanup(struct mlx5_core_dev *dev);
 int mlx5_core_access_reg(struct mlx5_core_dev *dev, void *data_in,
                         int size_in, void *data_out, int size_out,
                         u16 reg_num, int arg, int write);
+
 int mlx5_set_port_caps(struct mlx5_core_dev *dev, u8 port_num, u32 caps);
+int mlx5_query_port_ptys(struct mlx5_core_dev *dev, u32 *ptys,
+                        int ptys_size, int proto_mask, u8 local_port);
+int mlx5_query_port_proto_cap(struct mlx5_core_dev *dev,
+                             u32 *proto_cap, int proto_mask);
+int mlx5_query_port_proto_admin(struct mlx5_core_dev *dev,
+                               u32 *proto_admin, int proto_mask);
+int mlx5_query_port_link_width_oper(struct mlx5_core_dev *dev,
+                                   u8 *link_width_oper, u8 local_port);
+int mlx5_query_port_proto_oper(struct mlx5_core_dev *dev,
+                              u8 *proto_oper, int proto_mask,
+                              u8 local_port);
+int mlx5_set_port_proto(struct mlx5_core_dev *dev, u32 proto_admin,
+                       int proto_mask);
+int mlx5_set_port_admin_status(struct mlx5_core_dev *dev,
+                              enum mlx5_port_status status);
+int mlx5_query_port_admin_status(struct mlx5_core_dev *dev,
+                                enum mlx5_port_status *status);
+
+int mlx5_set_port_mtu(struct mlx5_core_dev *dev, int mtu, u8 port);
+void mlx5_query_port_max_mtu(struct mlx5_core_dev *dev, int *max_mtu, u8 port);
+void mlx5_query_port_oper_mtu(struct mlx5_core_dev *dev, int *oper_mtu,
+                             u8 port);
+
+int mlx5_query_port_vl_hw_cap(struct mlx5_core_dev *dev,
+                             u8 *vl_hw_cap, u8 local_port);
+
+int mlx5_set_port_pause(struct mlx5_core_dev *dev, u32 rx_pause, u32 tx_pause);
+int mlx5_query_port_pause(struct mlx5_core_dev *dev,
+                         u32 *rx_pause, u32 *tx_pause);
 
 int mlx5_debug_eq_add(struct mlx5_core_dev *dev, struct mlx5_eq *eq);
 void mlx5_debug_eq_remove(struct mlx5_core_dev *dev, struct mlx5_eq *eq);
@@ -745,6 +813,8 @@ void mlx5_eq_debugfs_cleanup(struct mlx5_core_dev *dev);
 int mlx5_cq_debugfs_init(struct mlx5_core_dev *dev);
 void mlx5_cq_debugfs_cleanup(struct mlx5_core_dev *dev);
 int mlx5_db_alloc(struct mlx5_core_dev *dev, struct mlx5_db *db);
+int mlx5_db_alloc_node(struct mlx5_core_dev *dev, struct mlx5_db *db,
+                      int node);
 void mlx5_db_free(struct mlx5_core_dev *dev, struct mlx5_db *db);
 
 const char *mlx5_command_str(int command);
@@ -757,6 +827,11 @@ void mlx5_core_put_rsc(struct mlx5_core_rsc_common *common);
 int mlx5_query_odp_caps(struct mlx5_core_dev *dev,
                        struct mlx5_odp_caps *odp_caps);
 
+static inline int fw_initializing(struct mlx5_core_dev *dev)
+{
+       return ioread32be(&dev->iseg->initializing) >> 31;
+}
+
 static inline u32 mlx5_mkey_to_idx(u32 mkey)
 {
        return mkey >> 8;
@@ -799,6 +874,7 @@ struct mlx5_interface {
 void *mlx5_get_protocol_dev(struct mlx5_core_dev *mdev, int protocol);
 int mlx5_register_interface(struct mlx5_interface *intf);
 void mlx5_unregister_interface(struct mlx5_interface *intf);
+int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id);
 
 struct mlx5_profile {
        u64     mask;
@@ -809,4 +885,18 @@ struct mlx5_profile {
        } mr_cache[MAX_MR_CACHE_ENTRIES];
 };
 
+static inline int mlx5_get_gid_table_len(u16 param)
+{
+       if (param > 4) {
+               pr_warn("gid table length is zero\n");
+               return 0;
+       }
+
+       return 8 * (1 << param);
+}
+
+enum {
+       MLX5_TRIGGERED_CMD_COMP = (u64)1 << 32,
+};
+
 #endif /* MLX5_DRIVER_H */