Commit 8e8b332b authored by David S. Miller's avatar David S. Miller

Merge tag 'mlx5e-updates-2018-05-29' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux

Saeed Mahameed says:

====================
mlx5e-updates-2018-05-29

This series includes mlx5 FPGA and mlx5e netdevice updates:

1) Print FPGA info such as device name, vendor id, etc.., from Ilan Tayari.
2) Abort FPGA if some essential capabilities are not supported, from Yevgeny Kliteynik.
3) Two FPGA dma related minor fixes, from Ilya Lesokhin.
4) Use the right table to report offloaded TC rules, from Or Gerlitz.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 4341f830 01252a27
...@@ -2876,3 +2876,10 @@ void mlx5e_tc_esw_cleanup(struct rhashtable *tc_ht) ...@@ -2876,3 +2876,10 @@ void mlx5e_tc_esw_cleanup(struct rhashtable *tc_ht)
{ {
rhashtable_free_and_destroy(tc_ht, _mlx5e_tc_del_flow, NULL); rhashtable_free_and_destroy(tc_ht, _mlx5e_tc_del_flow, NULL);
} }
int mlx5e_tc_num_filters(struct mlx5e_priv *priv)
{
struct rhashtable *tc_ht = get_tc_ht(priv);
return atomic_read(&tc_ht->nelems);
}
...@@ -68,10 +68,7 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv, ...@@ -68,10 +68,7 @@ void mlx5e_tc_encap_flows_del(struct mlx5e_priv *priv,
struct mlx5e_neigh_hash_entry; struct mlx5e_neigh_hash_entry;
void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe); void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe);
static inline int mlx5e_tc_num_filters(struct mlx5e_priv *priv) int mlx5e_tc_num_filters(struct mlx5e_priv *priv);
{
return atomic_read(&priv->fs.tc.ht.nelems);
}
#else /* CONFIG_MLX5_ESWITCH */ #else /* CONFIG_MLX5_ESWITCH */
static inline int mlx5e_tc_nic_init(struct mlx5e_priv *priv) { return 0; } static inline int mlx5e_tc_nic_init(struct mlx5e_priv *priv) { return 0; }
......
...@@ -35,6 +35,13 @@ ...@@ -35,6 +35,13 @@
#include <linux/mlx5/driver.h> #include <linux/mlx5/driver.h>
enum mlx5_fpga_device_id {
MLX5_FPGA_DEVICE_UNKNOWN = 0,
MLX5_FPGA_DEVICE_KU040 = 1,
MLX5_FPGA_DEVICE_KU060 = 2,
MLX5_FPGA_DEVICE_KU060_2 = 3,
};
enum mlx5_fpga_image { enum mlx5_fpga_image {
MLX5_FPGA_IMAGE_USER = 0, MLX5_FPGA_IMAGE_USER = 0,
MLX5_FPGA_IMAGE_FACTORY, MLX5_FPGA_IMAGE_FACTORY,
......
...@@ -181,6 +181,7 @@ int mlx5_fpga_conn_send(struct mlx5_fpga_conn *conn, ...@@ -181,6 +181,7 @@ int mlx5_fpga_conn_send(struct mlx5_fpga_conn *conn,
if (!conn->qp.active) if (!conn->qp.active)
return -ENOTCONN; return -ENOTCONN;
buf->dma_dir = DMA_TO_DEVICE;
err = mlx5_fpga_conn_map_buf(conn, buf); err = mlx5_fpga_conn_map_buf(conn, buf);
if (err) if (err)
return err; return err;
...@@ -255,8 +256,6 @@ static void mlx5_fpga_conn_rq_cqe(struct mlx5_fpga_conn *conn, ...@@ -255,8 +256,6 @@ static void mlx5_fpga_conn_rq_cqe(struct mlx5_fpga_conn *conn,
ix = be16_to_cpu(cqe->wqe_counter) & (conn->qp.rq.size - 1); ix = be16_to_cpu(cqe->wqe_counter) & (conn->qp.rq.size - 1);
buf = conn->qp.rq.bufs[ix]; buf = conn->qp.rq.bufs[ix];
conn->qp.rq.bufs[ix] = NULL; conn->qp.rq.bufs[ix] = NULL;
if (!status)
buf->sg[0].size = be32_to_cpu(cqe->byte_cnt);
conn->qp.rq.cc++; conn->qp.rq.cc++;
if (unlikely(status && (status != MLX5_CQE_SYNDROME_WR_FLUSH_ERR))) if (unlikely(status && (status != MLX5_CQE_SYNDROME_WR_FLUSH_ERR)))
...@@ -274,6 +273,7 @@ static void mlx5_fpga_conn_rq_cqe(struct mlx5_fpga_conn *conn, ...@@ -274,6 +273,7 @@ static void mlx5_fpga_conn_rq_cqe(struct mlx5_fpga_conn *conn,
return; return;
} }
buf->sg[0].size = be32_to_cpu(cqe->byte_cnt);
mlx5_fpga_dbg(conn->fdev, "Message with %u bytes received successfully\n", mlx5_fpga_dbg(conn->fdev, "Message with %u bytes received successfully\n",
buf->sg[0].size); buf->sg[0].size);
conn->recv_cb(conn->cb_arg, buf); conn->recv_cb(conn->cb_arg, buf);
......
...@@ -75,6 +75,21 @@ static const char *mlx5_fpga_image_name(enum mlx5_fpga_image image) ...@@ -75,6 +75,21 @@ static const char *mlx5_fpga_image_name(enum mlx5_fpga_image image)
} }
} }
static const char *mlx5_fpga_device_name(u32 device)
{
switch (device) {
case MLX5_FPGA_DEVICE_KU040:
return "ku040";
case MLX5_FPGA_DEVICE_KU060:
return "ku060";
case MLX5_FPGA_DEVICE_KU060_2:
return "ku060_2";
case MLX5_FPGA_DEVICE_UNKNOWN:
default:
return "unknown";
}
}
static int mlx5_fpga_device_load_check(struct mlx5_fpga_device *fdev) static int mlx5_fpga_device_load_check(struct mlx5_fpga_device *fdev)
{ {
struct mlx5_fpga_query query; struct mlx5_fpga_query query;
...@@ -128,8 +143,9 @@ static int mlx5_fpga_device_brb(struct mlx5_fpga_device *fdev) ...@@ -128,8 +143,9 @@ static int mlx5_fpga_device_brb(struct mlx5_fpga_device *fdev)
int mlx5_fpga_device_start(struct mlx5_core_dev *mdev) int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)
{ {
struct mlx5_fpga_device *fdev = mdev->fpga; struct mlx5_fpga_device *fdev = mdev->fpga;
unsigned long flags;
unsigned int max_num_qps; unsigned int max_num_qps;
unsigned long flags;
u32 fpga_device_id;
int err; int err;
if (!fdev) if (!fdev)
...@@ -143,12 +159,23 @@ int mlx5_fpga_device_start(struct mlx5_core_dev *mdev) ...@@ -143,12 +159,23 @@ int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)
if (err) if (err)
goto out; goto out;
mlx5_fpga_info(fdev, "device %u; %s image, version %u\n", fpga_device_id = MLX5_CAP_FPGA(fdev->mdev, fpga_device);
MLX5_CAP_FPGA(fdev->mdev, fpga_device), mlx5_fpga_info(fdev, "%s:%u; %s image, version %u; SBU %06x:%04x version %d\n",
mlx5_fpga_device_name(fpga_device_id),
fpga_device_id,
mlx5_fpga_image_name(fdev->last_oper_image), mlx5_fpga_image_name(fdev->last_oper_image),
MLX5_CAP_FPGA(fdev->mdev, image_version)); MLX5_CAP_FPGA(fdev->mdev, image_version),
MLX5_CAP_FPGA(fdev->mdev, ieee_vendor_id),
MLX5_CAP_FPGA(fdev->mdev, sandbox_product_id),
MLX5_CAP_FPGA(fdev->mdev, sandbox_product_version));
max_num_qps = MLX5_CAP_FPGA(mdev, shell_caps.max_num_qps); max_num_qps = MLX5_CAP_FPGA(mdev, shell_caps.max_num_qps);
if (!max_num_qps) {
mlx5_fpga_err(fdev, "FPGA reports 0 QPs in SHELL_CAPS\n");
err = -ENOTSUPP;
goto out;
}
err = mlx5_core_reserve_gids(mdev, max_num_qps); err = mlx5_core_reserve_gids(mdev, max_num_qps);
if (err) if (err)
goto out; goto out;
......
...@@ -44,8 +44,14 @@ ...@@ -44,8 +44,14 @@
#define SBU_QP_QUEUE_SIZE 8 #define SBU_QP_QUEUE_SIZE 8
#define MLX5_FPGA_CMD_TIMEOUT_MSEC (60 * 1000) #define MLX5_FPGA_CMD_TIMEOUT_MSEC (60 * 1000)
/**
* enum mlx5_fpga_access_type - Enumerated the different methods possible for
* accessing the device memory address space
*/
enum mlx5_fpga_access_type { enum mlx5_fpga_access_type {
/** Use the slow CX-FPGA I2C bus */
MLX5_FPGA_ACCESS_TYPE_I2C = 0x0, MLX5_FPGA_ACCESS_TYPE_I2C = 0x0,
/** Use the fastest available method */
MLX5_FPGA_ACCESS_TYPE_DONTCARE = 0x0, MLX5_FPGA_ACCESS_TYPE_DONTCARE = 0x0,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment