net/mlx5: fix meter statistics
[dpdk.git] / drivers / net / mlx5 / mlx5.h
index 14043b6..d208efb 100644 (file)
@@ -10,7 +10,6 @@
 #include <stdbool.h>
 #include <stdint.h>
 #include <limits.h>
-#include <netinet/in.h>
 #include <sys/queue.h>
 
 #include <rte_pci.h>
@@ -115,6 +114,17 @@ struct mlx5_dev_spawn_data {
        void *phys_dev; /**< Associated physical device. */
        struct rte_eth_dev *eth_dev; /**< Associated Ethernet device. */
        struct rte_pci_device *pci_dev; /**< Backend PCI device. */
+       struct mlx5_bond_info *bond_info;
+};
+
+/** Data associated with socket messages. */
+struct mlx5_flow_dump_req  {
+       uint32_t port_id; /**< There are plans in DPDK to extend port_id. */
+       uint64_t flow_id;
+} __rte_packed;
+
+struct mlx5_flow_dump_ack {
+       int rc; /**< Return code. */
 };
 
 /** Key string for IPC. */
@@ -671,6 +681,21 @@ struct mlx5_flex_parser_profiles {
        void *obj;              /* Flex parser node object. */
 };
 
+/* Max member ports per bonding device. */
+#define MLX5_BOND_MAX_PORTS 2
+
+/* Bonding device information. */
+struct mlx5_bond_info {
+       int n_port; /* Number of bond member ports. */
+       uint32_t ifindex;
+       char ifname[MLX5_NAMESIZE + 1];
+       struct {
+               char ifname[MLX5_NAMESIZE + 1];
+               uint32_t ifindex;
+               struct rte_pci_addr pci_addr;
+       } ports[MLX5_BOND_MAX_PORTS];
+};
+
 /*
  * Shared Infiniband device context for Master/Representors
  * which belong to same IB device with multiple IB ports.
@@ -678,13 +703,13 @@ struct mlx5_flex_parser_profiles {
 struct mlx5_dev_ctx_shared {
        LIST_ENTRY(mlx5_dev_ctx_shared) next;
        uint32_t refcnt;
-       uint16_t bond_dev; /* Bond primary device id. */
        uint32_t devx:1; /* Opened with DV. */
        uint32_t flow_hit_aso_en:1; /* Flow Hit ASO is supported. */
        uint32_t rq_ts_format:2; /* RQ timestamp formats supported. */
        uint32_t sq_ts_format:2; /* SQ timestamp formats supported. */
        uint32_t qp_ts_format:2; /* QP timestamp formats supported. */
        uint32_t max_port; /* Maximal IB device port index. */
+       struct mlx5_bond_info bond; /* Bonding information. */
        void *ctx; /* Verbs/DV/DevX context. */
        void *pd; /* Protection Domain. */
        uint32_t pdn; /* Protection Domain number. */
@@ -713,7 +738,7 @@ struct mlx5_dev_ctx_shared {
        struct mlx5_hlist *flow_tbls;
        struct mlx5_flow_tunnel_hub *tunnel_hub;
        /* Direct Rules tables for FDB, NIC TX+RX */
-       void *esw_drop_action; /* Pointer to DR E-Switch drop action. */
+       void *dr_drop_action; /* Pointer to DR drop action, any domain. */
        void *pop_vlan_action; /* Pointer to DR pop VLAN action. */
        struct mlx5_hlist *encaps_decaps; /* Encap/decap action hash list. */
        struct mlx5_hlist *modify_cmds;
@@ -928,18 +953,16 @@ struct mlx5_priv {
        unsigned int representor:1; /* Device is a port representor. */
        unsigned int master:1; /* Device is a E-Switch master. */
        unsigned int txpp_en:1; /* Tx packet pacing enabled. */
+       unsigned int sampler_en:1; /* Whether support sampler. */
        unsigned int mtr_en:1; /* Whether support meter. */
        unsigned int mtr_reg_share:1; /* Whether support meter REG_C share. */
-       unsigned int sampler_en:1; /* Whether support sampler. */
        uint16_t domain_id; /* Switch domain identifier. */
        uint16_t vport_id; /* Associated VF vport index (if any). */
        uint32_t vport_meta_tag; /* Used for vport index match ove VF LAG. */
        uint32_t vport_meta_mask; /* Used for vport index field match mask. */
-       int32_t representor_id; /* Port representor identifier. */
-       int32_t pf_bond; /* >=0 means PF index in bonding configuration. */
+       int32_t representor_id; /* -1 if not a representor. */
+       int32_t pf_bond; /* >=0, representor owner PF index in bonding. */
        unsigned int if_index; /* Associated kernel network device index. */
-       uint32_t bond_ifindex; /**< Bond interface index. */
-       char bond_name[MLX5_NAMESIZE]; /**< Bond interface name. */
        /* RX/TX queues. */
        unsigned int rxqs_n; /* RX queues array size. */
        unsigned int txqs_n; /* TX queues array size. */
@@ -989,6 +1012,10 @@ struct mlx5_priv {
        uint32_t rss_shared_actions; /* RSS shared actions. */
        struct mlx5_devx_obj *q_counters; /* DevX queue counter object. */
        uint32_t counter_set_id; /* Queue counter ID to set in DevX objects. */
+       uint8_t max_mtr_bits;
+       /* Indicate how many bits are used by meter id at the most. */
+       uint8_t max_mtr_flow_bits;
+       /* Indicate how many bits are used by meter flow id at the most. */
 };
 
 #define PORT_ID(priv) ((priv)->dev_data->port_id)
@@ -1011,6 +1038,7 @@ int mlx5_udp_tunnel_port_add(struct rte_eth_dev *dev,
                              struct rte_eth_udp_tunnel *udp_tunnel);
 uint16_t mlx5_eth_find_next(uint16_t port_id, struct rte_pci_device *pci_dev);
 int mlx5_dev_close(struct rte_eth_dev *dev);
+bool mlx5_is_hpf(struct rte_eth_dev *dev);
 void mlx5_age_event_prepare(struct mlx5_dev_ctx_shared *sh);
 
 /* Macro to iterate over all valid ports for mlx5 driver. */
@@ -1043,6 +1071,16 @@ int mlx5_flow_aso_age_mng_init(struct mlx5_dev_ctx_shared *sh);
 /* mlx5_ethdev.c */
 
 int mlx5_dev_configure(struct rte_eth_dev *dev);
+int mlx5_representor_info_get(struct rte_eth_dev *dev,
+                             struct rte_eth_representor_info *info);
+#define MLX5_REPRESENTOR_ID(pf, type, repr) \
+               (((pf) << 14) + ((type) << 12) + ((repr) & 0xfff))
+#define MLX5_REPRESENTOR_REPR(repr_id) \
+               ((repr_id) & 0xfff)
+#define MLX5_REPRESENTOR_TYPE(repr_id) \
+               (((repr_id) >> 12) & 3)
+uint16_t mlx5_representor_id_encode(const struct mlx5_switch_info *info,
+                                   enum rte_eth_representor_type hpf_type);
 int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver,
                        size_t fw_size);
 int mlx5_dev_infos_get(struct rte_eth_dev *dev,
@@ -1195,10 +1233,7 @@ int mlx5_flow_query(struct rte_eth_dev *dev, struct rte_flow *flow,
                    struct rte_flow_error *error);
 int mlx5_flow_isolate(struct rte_eth_dev *dev, int enable,
                      struct rte_flow_error *error);
-int mlx5_dev_filter_ctrl(struct rte_eth_dev *dev,
-                        enum rte_filter_type filter_type,
-                        enum rte_filter_op filter_op,
-                        void *arg);
+int mlx5_flow_ops_get(struct rte_eth_dev *dev, const struct rte_flow_ops **ops);
 int mlx5_flow_start_default(struct rte_eth_dev *dev);
 void mlx5_flow_stop_default(struct rte_eth_dev *dev);
 int mlx5_flow_verify(struct rte_eth_dev *dev);
@@ -1223,8 +1258,8 @@ uint32_t mlx5_counter_alloc(struct rte_eth_dev *dev);
 void mlx5_counter_free(struct rte_eth_dev *dev, uint32_t cnt);
 int mlx5_counter_query(struct rte_eth_dev *dev, uint32_t cnt,
                       bool clear, uint64_t *pkts, uint64_t *bytes);
-int mlx5_flow_dev_dump(struct rte_eth_dev *dev, FILE *file,
-                      struct rte_flow_error *error);
+int mlx5_flow_dev_dump(struct rte_eth_dev *dev, struct rte_flow *flow,
+                       FILE *file, struct rte_flow_error *error);
 void mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev);
 int mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts,
                        uint32_t nb_contexts, struct rte_flow_error *error);
@@ -1249,11 +1284,10 @@ int mlx5_pmd_socket_init(void);
 int mlx5_flow_meter_ops_get(struct rte_eth_dev *dev, void *arg);
 struct mlx5_flow_meter *mlx5_flow_meter_find(struct mlx5_priv *priv,
                                             uint32_t meter_id);
-struct mlx5_flow_meter *mlx5_flow_meter_attach
-                                       (struct mlx5_priv *priv,
-                                        uint32_t meter_id,
-                                        const struct rte_flow_attr *attr,
-                                        struct rte_flow_error *error);
+int mlx5_flow_meter_attach(struct mlx5_priv *priv,
+                          struct mlx5_flow_meter *fm,
+                          const struct rte_flow_attr *attr,
+                          struct rte_flow_error *error);
 void mlx5_flow_meter_detach(struct mlx5_flow_meter *fm);
 
 /* mlx5_os.c */