Skip to content

Commit

Permalink
vdpa/mlx5: Connect mlx5_vdpa to auxiliary bus
Browse files Browse the repository at this point in the history
Change module registration logic to use auxiliary bus instead of custom
made mlx5 register interface.

Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
  • Loading branch information
Leon Romanovsky committed Dec 6, 2020
1 parent a925b5e commit 74c9729
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 109 deletions.
28 changes: 27 additions & 1 deletion drivers/net/ethernet/mellanox/mlx5/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
*/

#include <linux/mlx5/driver.h>
#include <linux/mlx5/mlx5_ifc_vdpa.h>
#include "mlx5_core.h"

static LIST_HEAD(intf_list);
Expand All @@ -51,10 +52,35 @@ enum {
MLX5_INTERFACE_ATTACHED,
};

static bool is_vnet_supported(struct mlx5_core_dev *dev)
{
if (!IS_ENABLED(CONFIG_MLX5_VDPA_NET))
return false;

if (mlx5_core_is_pf(dev))
return false;

if (!(MLX5_CAP_GEN_64(dev, general_obj_types) &
MLX5_GENERAL_OBJ_TYPES_CAP_VIRTIO_NET_Q))
return false;

if (!(MLX5_CAP_DEV_VDPA_EMULATION(dev, event_mode) &
MLX5_VIRTIO_Q_EVENT_MODE_QP_MODE))
return false;

if (!MLX5_CAP_DEV_VDPA_EMULATION(dev, eth_frame_offload_type))
return false;

return true;
}

static const struct mlx5_adev_device {
const char *suffix;
bool (*is_supported)(struct mlx5_core_dev *dev);
} mlx5_adev_devices[1] = {};
} mlx5_adev_devices[] = {
[MLX5_INTERFACE_PROTOCOL_VDPA] = { .suffix = "vnet",
.is_supported = &is_vnet_supported },
};

int mlx5_adev_idx_alloc(void)
{
Expand Down
2 changes: 1 addition & 1 deletion drivers/vdpa/mlx5/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
subdir-ccflags-y += -I$(srctree)/drivers/vdpa/mlx5/core

obj-$(CONFIG_MLX5_VDPA_NET) += mlx5_vdpa.o
mlx5_vdpa-$(CONFIG_MLX5_VDPA_NET) += net/main.o net/mlx5_vnet.o core/resources.o core/mr.o
mlx5_vdpa-$(CONFIG_MLX5_VDPA_NET) += net/mlx5_vnet.o core/resources.o core/mr.o
76 changes: 0 additions & 76 deletions drivers/vdpa/mlx5/net/main.c

This file was deleted.

51 changes: 44 additions & 7 deletions drivers/vdpa/mlx5/net/mlx5_vnet.c
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
/* Copyright (c) 2020 Mellanox Technologies Ltd. */

#include <linux/module.h>
#include <linux/vdpa.h>
#include <linux/vringh.h>
#include <uapi/linux/virtio_net.h>
#include <uapi/linux/virtio_ids.h>
#include <linux/virtio_config.h>
#include <linux/auxiliary_bus.h>
#include <linux/mlx5/cq.h>
#include <linux/mlx5/qp.h>
#include <linux/mlx5/device.h>
#include <linux/mlx5/driver.h>
#include <linux/mlx5/vport.h>
#include <linux/mlx5/fs.h>
#include <linux/mlx5/device.h>
#include <linux/mlx5/mlx5_ifc_vdpa.h>
#include "mlx5_vnet.h"
#include "mlx5_vdpa.h"

MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
MODULE_DESCRIPTION("Mellanox VDPA driver");
MODULE_LICENSE("Dual BSD/GPL");

#define to_mlx5_vdpa_ndev(__mvdev) \
container_of(__mvdev, struct mlx5_vdpa_net, mvdev)
#define to_mvdev(__vdev) container_of((__vdev), struct mlx5_vdpa_dev, vdev)

#define VALID_FEATURES_MASK \
Expand Down Expand Up @@ -159,6 +169,11 @@ static bool mlx5_vdpa_debug;
mlx5_vdpa_info(mvdev, "%s\n", #_status); \
} while (0)

static inline u32 mlx5_vdpa_max_qps(int max_vqs)
{
return max_vqs / 2;
}

static void print_status(struct mlx5_vdpa_dev *mvdev, u8 status, bool set)
{
if (status & ~VALID_STATUS_MASK)
Expand Down Expand Up @@ -1928,8 +1943,11 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)
}
}

void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
static int mlx5v_probe(struct auxiliary_device *adev,
const struct auxiliary_device_id *id)
{
struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
struct mlx5_core_dev *mdev = madev->mdev;
struct virtio_net_config *config;
struct mlx5_vdpa_dev *mvdev;
struct mlx5_vdpa_net *ndev;
Expand All @@ -1943,7 +1961,7 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops,
2 * mlx5_vdpa_max_qps(max_vqs));
if (IS_ERR(ndev))
return ndev;
return PTR_ERR(ndev);

ndev->mvdev.max_vqs = max_vqs;
mvdev = &ndev->mvdev;
Expand Down Expand Up @@ -1972,7 +1990,8 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
if (err)
goto err_reg;

return ndev;
dev_set_drvdata(&adev->dev, ndev);
return 0;

err_reg:
free_resources(ndev);
Expand All @@ -1981,10 +2000,28 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
err_mtu:
mutex_destroy(&ndev->reslock);
put_device(&mvdev->vdev.dev);
return ERR_PTR(err);
return err;
}

void mlx5_vdpa_remove_dev(struct mlx5_vdpa_dev *mvdev)
static void mlx5v_remove(struct auxiliary_device *adev)
{
struct mlx5_vdpa_dev *mvdev = dev_get_drvdata(&adev->dev);

vdpa_unregister_device(&mvdev->vdev);
}

static const struct auxiliary_device_id mlx5v_id_table[] = {
{ .name = MLX5_ADEV_NAME ".vnet", },
{},
};

MODULE_DEVICE_TABLE(auxiliary, mlx5v_id_table);

static struct auxiliary_driver mlx5v_driver = {
.name = "vnet",
.probe = mlx5v_probe,
.remove = mlx5v_remove,
.id_table = mlx5v_id_table,
};

module_auxiliary_driver(mlx5v_driver);
24 changes: 0 additions & 24 deletions drivers/vdpa/mlx5/net/mlx5_vnet.h

This file was deleted.

0 comments on commit 74c9729

Please sign in to comment.