X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fvdpa%2Fmlx5%2Fmlx5_vdpa.h;h=a27f3fdadbf0d39003fcbf9bfc66f14d877db007;hb=250e2ed8d85d038ce864052ebd6f9af51db40df2;hp=80b4c4bda9075239627edd745e14d93a2be88087;hpb=7de66d823e993fd0394a5604d03564a10f2be8e8;p=dpdk.git diff --git a/drivers/vdpa/mlx5/mlx5_vdpa.h b/drivers/vdpa/mlx5/mlx5_vdpa.h index 80b4c4bda9..a27f3fdadb 100644 --- a/drivers/vdpa/mlx5/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/mlx5_vdpa.h @@ -12,6 +12,7 @@ #pragma GCC diagnostic ignored "-Wpedantic" #endif #include +#include #include #ifdef PEDANTIC #pragma GCC diagnostic error "-Wpedantic" @@ -21,6 +22,7 @@ #include #include +#include #include @@ -35,29 +37,24 @@ #define VIRTIO_F_RING_PACKED 34 #endif +#define MLX5_VDPA_DEFAULT_TIMER_DELAY_US 0u +#define MLX5_VDPA_DEFAULT_TIMER_STEP_US 1u + struct mlx5_vdpa_cq { uint16_t log_desc_n; uint32_t cq_ci:24; uint32_t arm_sn:2; + uint32_t armed:1; int callfd; rte_spinlock_t sl; - struct mlx5_devx_obj *cq; - struct mlx5dv_devx_umem *umem_obj; - union { - volatile void *umem_buf; - volatile struct mlx5_cqe *cqes; - }; - volatile uint32_t *db_rec; + struct mlx5_devx_cq cq_obj; uint64_t errors; }; struct mlx5_vdpa_event_qp { struct mlx5_vdpa_cq cq; struct mlx5_devx_obj *fw_qp; - struct mlx5_devx_obj *sw_qp; - struct mlx5dv_devx_umem *umem_obj; - void *umem_buf; - volatile uint32_t *db_rec; + struct mlx5_devx_qp sw_qp; }; struct mlx5_vdpa_query_mr { @@ -69,11 +66,20 @@ struct mlx5_vdpa_query_mr { int is_indirect; }; +enum { + MLX5_VDPA_NOTIFIER_STATE_DISABLED, + MLX5_VDPA_NOTIFIER_STATE_ENABLED, + MLX5_VDPA_NOTIFIER_STATE_ERR +}; + struct mlx5_vdpa_virtq { SLIST_ENTRY(mlx5_vdpa_virtq) next; uint8_t enable; uint16_t index; uint16_t vq_size; + uint8_t notifier_state; + bool stopped; + uint32_t version; struct mlx5_vdpa_priv *priv; struct mlx5_devx_obj *virtq; struct mlx5_devx_obj *counters; @@ -84,6 +90,8 @@ struct mlx5_vdpa_virtq { uint32_t size; } umems[3]; struct rte_intr_handle intr_handle; + uint64_t err_time[3]; /* RDTSC time of recent errors. */ + uint32_t n_retry; struct mlx5_devx_virtio_q_couners_attr reset; }; @@ -99,27 +107,44 @@ struct mlx5_vdpa_steer { } rss[7]; }; +enum { + MLX5_VDPA_EVENT_MODE_DYNAMIC_TIMER, + MLX5_VDPA_EVENT_MODE_FIXED_TIMER, + MLX5_VDPA_EVENT_MODE_ONLY_INTERRUPT +}; + struct mlx5_vdpa_priv { TAILQ_ENTRY(mlx5_vdpa_priv) next; uint8_t configured; - uint8_t direct_notifier; /* Whether direct notifier is on or off. */ - int id; /* vDPA device id. */ + pthread_mutex_t vq_config_lock; + uint64_t no_traffic_counter; + pthread_t timer_tid; + int event_mode; + int event_core; /* Event thread cpu affinity core. */ + uint32_t event_us; + uint32_t timer_delay_us; + uint32_t no_traffic_max; + uint8_t hw_latency_mode; /* Hardware CQ moderation mode. */ + uint16_t hw_max_latency_us; /* Hardware CQ moderation period in usec. */ + uint16_t hw_max_pending_comp; /* Hardware CQ moderation counter. */ + struct rte_vdpa_device *vdev; /* vDPA device. */ int vid; /* vhost device id. */ struct ibv_context *ctx; /* Device context. */ - struct rte_vdpa_dev_addr dev_addr; struct mlx5_hca_vdpa_attr caps; uint32_t pdn; /* Protection Domain number. */ struct ibv_pd *pd; uint32_t gpa_mkey_index; struct ibv_mr *null_mr; struct rte_vhost_memory *vmem; - uint32_t eqn; struct mlx5dv_devx_event_channel *eventc; + struct mlx5dv_devx_event_channel *err_chnl; struct mlx5dv_devx_uar *uar; - struct rte_intr_handle intr_handle; + struct rte_intr_handle err_intr_handle; struct mlx5_devx_obj *td; - struct mlx5_devx_obj *tis; + struct mlx5_devx_obj *tiss[16]; /* TIS list for each LAG port. */ uint16_t nr_virtqs; + uint8_t num_lag_ports; + uint8_t qp_ts_format; uint64_t features; /* Negotiated features. */ uint16_t log_max_rqt_size; struct mlx5_vdpa_steer steer; @@ -231,6 +256,25 @@ int mlx5_vdpa_cqe_event_setup(struct mlx5_vdpa_priv *priv); */ void mlx5_vdpa_cqe_event_unset(struct mlx5_vdpa_priv *priv); +/** + * Setup error interrupt handler. + * + * @param[in] priv + * The vdpa driver private structure. + * + * @return + * 0 on success, a negative errno value otherwise and rte_errno is set. + */ +int mlx5_vdpa_err_event_setup(struct mlx5_vdpa_priv *priv); + +/** + * Unset error event handler. + * + * @param[in] priv + * The vdpa driver private structure. + */ +void mlx5_vdpa_err_event_unset(struct mlx5_vdpa_priv *priv); + /** * Release a virtq and all its related resources. * @@ -364,6 +408,19 @@ int mlx5_vdpa_virtq_modify(struct mlx5_vdpa_virtq *virtq, int state); */ int mlx5_vdpa_virtq_stop(struct mlx5_vdpa_priv *priv, int index); +/** + * Query virtq information. + * + * @param[in] priv + * The vdpa driver private structure. + * @param[in] index + * The virtq index. + * + * @return + * 0 on success, a negative value otherwise. + */ +int mlx5_vdpa_virtq_query(struct mlx5_vdpa_priv *priv, int index); + /** * Get virtq statistics. *