net/mlx5: Add wrappers for HyperV PCIe operations

Add wrapper functions for HyperV PCIe read / write /
block_invalidate_register operations.  This will be used as an
infrastructure in the downstream patch for software communication.

This will be enabled by default if CONFIG_PCI_HYPERV_INTERFACE is set.

Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Eran Ben Elisha 2019-08-22 05:05:47 +00:00 committed by David S. Miller
parent 348dd93e40
commit 913d14e866
3 changed files with 87 additions and 0 deletions

View File

@ -45,6 +45,7 @@ mlx5_core-$(CONFIG_MLX5_ESWITCH) += eswitch.o eswitch_offloads.o eswitch_offlo
mlx5_core-$(CONFIG_MLX5_MPFS) += lib/mpfs.o
mlx5_core-$(CONFIG_VXLAN) += lib/vxlan.o
mlx5_core-$(CONFIG_PTP_1588_CLOCK) += lib/clock.o
mlx5_core-$(CONFIG_PCI_HYPERV_INTERFACE) += lib/hv.o
#
# Ipoib netdev

View File

@ -0,0 +1,64 @@
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
// Copyright (c) 2018 Mellanox Technologies
#include <linux/hyperv.h>
#include "mlx5_core.h"
#include "lib/hv.h"
static int mlx5_hv_config_common(struct mlx5_core_dev *dev, void *buf, int len,
int offset, bool read)
{
int rc = -EOPNOTSUPP;
int bytes_returned;
int block_id;
if (offset % HV_CONFIG_BLOCK_SIZE_MAX || len % HV_CONFIG_BLOCK_SIZE_MAX)
return -EINVAL;
block_id = offset / HV_CONFIG_BLOCK_SIZE_MAX;
rc = read ?
hyperv_read_cfg_blk(dev->pdev, buf,
HV_CONFIG_BLOCK_SIZE_MAX, block_id,
&bytes_returned) :
hyperv_write_cfg_blk(dev->pdev, buf,
HV_CONFIG_BLOCK_SIZE_MAX, block_id);
/* Make sure len bytes were read successfully */
if (read)
rc |= !(len == bytes_returned);
if (rc) {
mlx5_core_err(dev, "Failed to %s hv config, err = %d, len = %d, offset = %d\n",
read ? "read" : "write", rc, len,
offset);
return rc;
}
return 0;
}
int mlx5_hv_read_config(struct mlx5_core_dev *dev, void *buf, int len,
int offset)
{
return mlx5_hv_config_common(dev, buf, len, offset, true);
}
int mlx5_hv_write_config(struct mlx5_core_dev *dev, void *buf, int len,
int offset)
{
return mlx5_hv_config_common(dev, buf, len, offset, false);
}
int mlx5_hv_register_invalidate(struct mlx5_core_dev *dev, void *context,
void (*block_invalidate)(void *context,
u64 block_mask))
{
return hyperv_reg_block_invalidate(dev->pdev, context,
block_invalidate);
}
void mlx5_hv_unregister_invalidate(struct mlx5_core_dev *dev)
{
hyperv_reg_block_invalidate(dev->pdev, NULL, NULL);
}

View File

@ -0,0 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
/* Copyright (c) 2019 Mellanox Technologies. */
#ifndef __LIB_HV_H__
#define __LIB_HV_H__
#if IS_ENABLED(CONFIG_PCI_HYPERV_INTERFACE)
#include <linux/hyperv.h>
#include <linux/mlx5/driver.h>
int mlx5_hv_read_config(struct mlx5_core_dev *dev, void *buf, int len,
int offset);
int mlx5_hv_write_config(struct mlx5_core_dev *dev, void *buf, int len,
int offset);
int mlx5_hv_register_invalidate(struct mlx5_core_dev *dev, void *context,
void (*block_invalidate)(void *context,
u64 block_mask));
void mlx5_hv_unregister_invalidate(struct mlx5_core_dev *dev);
#endif
#endif /* __LIB_HV_H__ */