* Since we need one CQ per QP, the limit is the minimum number
* between the two values.
*/
- max = RTE_MIN(priv->sh->device_attr.orig_attr.max_cq,
- priv->sh->device_attr.orig_attr.max_qp);
+ max = RTE_MIN(priv->sh->device_attr.max_cq,
+ priv->sh->device_attr.max_qp);
/* max_rx_queues is uint16_t. */
max = RTE_MIN(max, (unsigned int)UINT16_MAX);
info->max_rx_queues = max;
int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size)
{
struct mlx5_priv *priv = dev->data->dev_private;
- struct ibv_device_attr *attr = &priv->sh->device_attr.orig_attr;
+ struct mlx5_dev_attr *attr = &priv->sh->device_attr;
size_t size = strnlen(attr->fw_ver, sizeof(attr->fw_ver)) + 1;
if (fw_size < size)
* Infiniband device shared context.
*/
static void
-mlx5_dev_interrupt_device_fatal(struct mlx5_ibv_shared *sh)
+mlx5_dev_interrupt_device_fatal(struct mlx5_dev_ctx_shared *sh)
{
uint32_t i;
void
mlx5_dev_interrupt_handler(void *cb_arg)
{
- struct mlx5_ibv_shared *sh = cb_arg;
+ struct mlx5_dev_ctx_shared *sh = cb_arg;
struct ibv_async_event event;
/* Read all message from the IB device and acknowledge them. */
(void)cb_arg;
return;
#else
- struct mlx5_ibv_shared *sh = cb_arg;
+ struct mlx5_dev_ctx_shared *sh = cb_arg;
union {
struct mlx5dv_devx_async_cmd_hdr cmd_resp;
uint8_t buf[MLX5_ST_SZ_BYTES(query_flow_counter_out) +
#endif /* HAVE_IBV_DEVX_ASYNC */
}
-/**
- * Uninstall shared asynchronous device events handler.
- * This function is implemented to support event sharing
- * between multiple ports of single IB device.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-static void
-mlx5_dev_shared_handler_uninstall(struct rte_eth_dev *dev)
-{
- struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_ibv_shared *sh = priv->sh;
-
- if (rte_eal_process_type() != RTE_PROC_PRIMARY)
- return;
- pthread_mutex_lock(&sh->intr_mutex);
- MLX5_ASSERT(priv->ibv_port);
- MLX5_ASSERT(priv->ibv_port <= sh->max_port);
- MLX5_ASSERT(dev->data->port_id < RTE_MAX_ETHPORTS);
- if (sh->port[priv->ibv_port - 1].ih_port_id >= RTE_MAX_ETHPORTS)
- goto exit;
- MLX5_ASSERT(sh->port[priv->ibv_port - 1].ih_port_id ==
- (uint32_t)dev->data->port_id);
- MLX5_ASSERT(sh->intr_cnt);
- sh->port[priv->ibv_port - 1].ih_port_id = RTE_MAX_ETHPORTS;
- if (!sh->intr_cnt || --sh->intr_cnt)
- goto exit;
- mlx5_intr_callback_unregister(&sh->intr_handle,
- mlx5_dev_interrupt_handler, sh);
- sh->intr_handle.fd = 0;
- sh->intr_handle.type = RTE_INTR_HANDLE_UNKNOWN;
-exit:
- pthread_mutex_unlock(&sh->intr_mutex);
-}
-
-/**
- * Uninstall devx shared asynchronous device events handler.
- * This function is implemeted to support event sharing
- * between multiple ports of single IB device.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-static void
-mlx5_dev_shared_handler_devx_uninstall(struct rte_eth_dev *dev)
-{
- struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_ibv_shared *sh = priv->sh;
-
- if (rte_eal_process_type() != RTE_PROC_PRIMARY)
- return;
- pthread_mutex_lock(&sh->intr_mutex);
- MLX5_ASSERT(priv->ibv_port);
- MLX5_ASSERT(priv->ibv_port <= sh->max_port);
- MLX5_ASSERT(dev->data->port_id < RTE_MAX_ETHPORTS);
- if (sh->port[priv->ibv_port - 1].devx_ih_port_id >= RTE_MAX_ETHPORTS)
- goto exit;
- MLX5_ASSERT(sh->port[priv->ibv_port - 1].devx_ih_port_id ==
- (uint32_t)dev->data->port_id);
- sh->port[priv->ibv_port - 1].devx_ih_port_id = RTE_MAX_ETHPORTS;
- if (!sh->devx_intr_cnt || --sh->devx_intr_cnt)
- goto exit;
- if (sh->intr_handle_devx.fd) {
- rte_intr_callback_unregister(&sh->intr_handle_devx,
- mlx5_dev_interrupt_handler_devx,
- sh);
- sh->intr_handle_devx.fd = 0;
- sh->intr_handle_devx.type = RTE_INTR_HANDLE_UNKNOWN;
- }
- if (sh->devx_comp) {
- mlx5_glue->devx_destroy_cmd_comp(sh->devx_comp);
- sh->devx_comp = NULL;
- }
-exit:
- pthread_mutex_unlock(&sh->intr_mutex);
-}
-
-/**
- * Install shared asynchronous device events handler.
- * This function is implemented to support event sharing
- * between multiple ports of single IB device.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-static void
-mlx5_dev_shared_handler_install(struct rte_eth_dev *dev)
-{
- struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_ibv_shared *sh = priv->sh;
- int ret;
- int flags;
-
- if (rte_eal_process_type() != RTE_PROC_PRIMARY)
- return;
- pthread_mutex_lock(&sh->intr_mutex);
- MLX5_ASSERT(priv->ibv_port);
- MLX5_ASSERT(priv->ibv_port <= sh->max_port);
- MLX5_ASSERT(dev->data->port_id < RTE_MAX_ETHPORTS);
- if (sh->port[priv->ibv_port - 1].ih_port_id < RTE_MAX_ETHPORTS) {
- /* The handler is already installed for this port. */
- MLX5_ASSERT(sh->intr_cnt);
- goto exit;
- }
- if (sh->intr_cnt) {
- sh->port[priv->ibv_port - 1].ih_port_id =
- (uint32_t)dev->data->port_id;
- sh->intr_cnt++;
- goto exit;
- }
- /* No shared handler installed. */
- MLX5_ASSERT(sh->ctx->async_fd > 0);
- flags = fcntl(sh->ctx->async_fd, F_GETFL);
- ret = fcntl(sh->ctx->async_fd, F_SETFL, flags | O_NONBLOCK);
- if (ret) {
- DRV_LOG(INFO, "failed to change file descriptor async event"
- " queue");
- /* Indicate there will be no interrupts. */
- dev->data->dev_conf.intr_conf.lsc = 0;
- dev->data->dev_conf.intr_conf.rmv = 0;
- } else {
- sh->intr_handle.fd = sh->ctx->async_fd;
- sh->intr_handle.type = RTE_INTR_HANDLE_EXT;
- rte_intr_callback_register(&sh->intr_handle,
- mlx5_dev_interrupt_handler, sh);
- sh->intr_cnt++;
- sh->port[priv->ibv_port - 1].ih_port_id =
- (uint32_t)dev->data->port_id;
- }
-exit:
- pthread_mutex_unlock(&sh->intr_mutex);
-}
-
-/**
- * Install devx shared asyncronous device events handler.
- * This function is implemeted to support event sharing
- * between multiple ports of single IB device.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-static void
-mlx5_dev_shared_handler_devx_install(struct rte_eth_dev *dev)
-{
- struct mlx5_priv *priv = dev->data->dev_private;
- struct mlx5_ibv_shared *sh = priv->sh;
-
- if (rte_eal_process_type() != RTE_PROC_PRIMARY)
- return;
- pthread_mutex_lock(&sh->intr_mutex);
- MLX5_ASSERT(priv->ibv_port);
- MLX5_ASSERT(priv->ibv_port <= sh->max_port);
- MLX5_ASSERT(dev->data->port_id < RTE_MAX_ETHPORTS);
- if (sh->port[priv->ibv_port - 1].devx_ih_port_id < RTE_MAX_ETHPORTS) {
- /* The handler is already installed for this port. */
- MLX5_ASSERT(sh->devx_intr_cnt);
- goto exit;
- }
- if (sh->devx_intr_cnt) {
- sh->devx_intr_cnt++;
- sh->port[priv->ibv_port - 1].devx_ih_port_id =
- (uint32_t)dev->data->port_id;
- goto exit;
- }
- if (priv->config.devx) {
-#ifndef HAVE_IBV_DEVX_ASYNC
- goto exit;
-#else
- sh->devx_comp = mlx5_glue->devx_create_cmd_comp(sh->ctx);
- if (sh->devx_comp) {
- int flags = fcntl(sh->devx_comp->fd, F_GETFL);
- int ret = fcntl(sh->devx_comp->fd, F_SETFL,
- flags | O_NONBLOCK);
-
- if (ret) {
- DRV_LOG(INFO, "failed to change file descriptor"
- " devx async event queue");
- } else {
- sh->intr_handle_devx.fd = sh->devx_comp->fd;
- sh->intr_handle_devx.type = RTE_INTR_HANDLE_EXT;
- rte_intr_callback_register
- (&sh->intr_handle_devx,
- mlx5_dev_interrupt_handler_devx, sh);
- sh->devx_intr_cnt++;
- sh->port[priv->ibv_port - 1].devx_ih_port_id =
- (uint32_t)dev->data->port_id;
- }
- }
-#endif /* HAVE_IBV_DEVX_ASYNC */
- }
-exit:
- pthread_mutex_unlock(&sh->intr_mutex);
-}
-
-/**
- * Uninstall interrupt handler.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-void
-mlx5_dev_interrupt_handler_uninstall(struct rte_eth_dev *dev)
-{
- mlx5_dev_shared_handler_uninstall(dev);
-}
-
-/**
- * Install interrupt handler.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-void
-mlx5_dev_interrupt_handler_install(struct rte_eth_dev *dev)
-{
- mlx5_dev_shared_handler_install(dev);
-}
-
-/**
- * Devx uninstall interrupt handler.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-void
-mlx5_dev_interrupt_handler_devx_uninstall(struct rte_eth_dev *dev)
-{
- mlx5_dev_shared_handler_devx_uninstall(dev);
-}
-
-/**
- * Devx install interrupt handler.
- *
- * @param dev
- * Pointer to Ethernet device.
- */
-void
-mlx5_dev_interrupt_handler_devx_install(struct rte_eth_dev *dev)
-{
- mlx5_dev_shared_handler_devx_install(dev);
-}
-
/**
* DPDK callback to bring the link DOWN.
*