mirror of https://gitee.com/openkylin/linux.git
net/mlx5: FPGA, Use async events chain
Remove the explicit call to mlx5_fpga_event on MLX5_EVENT_TYPE_FPGA_ERROR or MLX5_EVENT_TYPE_FPGA_QP_ERROR let fpga core to register its own handler when its ready. Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
720a936d40
commit
a52a7d01fd
|
@ -421,11 +421,6 @@ static irqreturn_t mlx5_eq_async_int(int irq, void *eq_ptr)
|
||||||
mlx5_pps_event(dev, eqe);
|
mlx5_pps_event(dev, eqe);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MLX5_EVENT_TYPE_FPGA_ERROR:
|
|
||||||
case MLX5_EVENT_TYPE_FPGA_QP_ERROR:
|
|
||||||
mlx5_fpga_event(dev, eqe->type, &eqe->data.raw);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MLX5_EVENT_TYPE_TEMP_WARN_EVENT:
|
case MLX5_EVENT_TYPE_TEMP_WARN_EVENT:
|
||||||
mlx5_temp_warning_event(dev, eqe);
|
mlx5_temp_warning_event(dev, eqe);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
|
|
||||||
#include "mlx5_core.h"
|
#include "mlx5_core.h"
|
||||||
#include "lib/mlx5.h"
|
#include "lib/mlx5.h"
|
||||||
|
#include "lib/eq.h"
|
||||||
#include "fpga/core.h"
|
#include "fpga/core.h"
|
||||||
#include "fpga/conn.h"
|
#include "fpga/conn.h"
|
||||||
|
|
||||||
|
@ -145,6 +146,22 @@ static int mlx5_fpga_device_brb(struct mlx5_fpga_device *fdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mlx5_fpga_event(struct mlx5_fpga_device *, unsigned long, void *);
|
||||||
|
|
||||||
|
static int fpga_err_event(struct notifier_block *nb, unsigned long event, void *eqe)
|
||||||
|
{
|
||||||
|
struct mlx5_fpga_device *fdev = mlx5_nb_cof(nb, struct mlx5_fpga_device, fpga_err_nb);
|
||||||
|
|
||||||
|
return mlx5_fpga_event(fdev, event, eqe);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fpga_qp_err_event(struct notifier_block *nb, unsigned long event, void *eqe)
|
||||||
|
{
|
||||||
|
struct mlx5_fpga_device *fdev = mlx5_nb_cof(nb, struct mlx5_fpga_device, fpga_qp_err_nb);
|
||||||
|
|
||||||
|
return mlx5_fpga_event(fdev, event, eqe);
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
@ -185,6 +202,11 @@ int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
MLX5_NB_INIT(&fdev->fpga_err_nb, fpga_err_event, FPGA_ERROR);
|
||||||
|
MLX5_NB_INIT(&fdev->fpga_qp_err_nb, fpga_qp_err_event, FPGA_QP_ERROR);
|
||||||
|
mlx5_eq_notifier_register(fdev->mdev, &fdev->fpga_err_nb);
|
||||||
|
mlx5_eq_notifier_register(fdev->mdev, &fdev->fpga_qp_err_nb);
|
||||||
|
|
||||||
err = mlx5_fpga_conn_device_init(fdev);
|
err = mlx5_fpga_conn_device_init(fdev);
|
||||||
if (err)
|
if (err)
|
||||||
goto err_rsvd_gid;
|
goto err_rsvd_gid;
|
||||||
|
@ -201,6 +223,8 @@ int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)
|
||||||
mlx5_fpga_conn_device_cleanup(fdev);
|
mlx5_fpga_conn_device_cleanup(fdev);
|
||||||
|
|
||||||
err_rsvd_gid:
|
err_rsvd_gid:
|
||||||
|
mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_err_nb);
|
||||||
|
mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_qp_err_nb);
|
||||||
mlx5_core_unreserve_gids(mdev, max_num_qps);
|
mlx5_core_unreserve_gids(mdev, max_num_qps);
|
||||||
out:
|
out:
|
||||||
spin_lock_irqsave(&fdev->state_lock, flags);
|
spin_lock_irqsave(&fdev->state_lock, flags);
|
||||||
|
@ -256,6 +280,9 @@ void mlx5_fpga_device_stop(struct mlx5_core_dev *mdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
mlx5_fpga_conn_device_cleanup(fdev);
|
mlx5_fpga_conn_device_cleanup(fdev);
|
||||||
|
mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_err_nb);
|
||||||
|
mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_qp_err_nb);
|
||||||
|
|
||||||
max_num_qps = MLX5_CAP_FPGA(mdev, shell_caps.max_num_qps);
|
max_num_qps = MLX5_CAP_FPGA(mdev, shell_caps.max_num_qps);
|
||||||
mlx5_core_unreserve_gids(mdev, max_num_qps);
|
mlx5_core_unreserve_gids(mdev, max_num_qps);
|
||||||
}
|
}
|
||||||
|
@ -283,9 +310,10 @@ static const char *mlx5_fpga_qp_syndrome_to_string(u8 syndrome)
|
||||||
return "Unknown";
|
return "Unknown";
|
||||||
}
|
}
|
||||||
|
|
||||||
void mlx5_fpga_event(struct mlx5_core_dev *mdev, u8 event, void *data)
|
static int mlx5_fpga_event(struct mlx5_fpga_device *fdev,
|
||||||
|
unsigned long event, void *eqe)
|
||||||
{
|
{
|
||||||
struct mlx5_fpga_device *fdev = mdev->fpga;
|
void *data = ((struct mlx5_eqe *)eqe)->data.raw;
|
||||||
const char *event_name;
|
const char *event_name;
|
||||||
bool teardown = false;
|
bool teardown = false;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
@ -303,9 +331,7 @@ void mlx5_fpga_event(struct mlx5_core_dev *mdev, u8 event, void *data)
|
||||||
fpga_qpn = MLX5_GET(fpga_qp_error_event, data, fpga_qpn);
|
fpga_qpn = MLX5_GET(fpga_qp_error_event, data, fpga_qpn);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mlx5_fpga_warn_ratelimited(fdev, "Unexpected event %u\n",
|
return NOTIFY_DONE;
|
||||||
event);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&fdev->state_lock, flags);
|
spin_lock_irqsave(&fdev->state_lock, flags);
|
||||||
|
@ -326,4 +352,6 @@ void mlx5_fpga_event(struct mlx5_core_dev *mdev, u8 event, void *data)
|
||||||
*/
|
*/
|
||||||
if (teardown)
|
if (teardown)
|
||||||
mlx5_trigger_health_work(fdev->mdev);
|
mlx5_trigger_health_work(fdev->mdev);
|
||||||
|
|
||||||
|
return NOTIFY_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,11 +35,16 @@
|
||||||
|
|
||||||
#ifdef CONFIG_MLX5_FPGA
|
#ifdef CONFIG_MLX5_FPGA
|
||||||
|
|
||||||
|
#include <linux/mlx5/eq.h>
|
||||||
|
|
||||||
|
#include "lib/eq.h"
|
||||||
#include "fpga/cmd.h"
|
#include "fpga/cmd.h"
|
||||||
|
|
||||||
/* Represents an Innova device */
|
/* Represents an Innova device */
|
||||||
struct mlx5_fpga_device {
|
struct mlx5_fpga_device {
|
||||||
struct mlx5_core_dev *mdev;
|
struct mlx5_core_dev *mdev;
|
||||||
|
struct mlx5_nb fpga_err_nb;
|
||||||
|
struct mlx5_nb fpga_qp_err_nb;
|
||||||
spinlock_t state_lock; /* Protects state transitions */
|
spinlock_t state_lock; /* Protects state transitions */
|
||||||
enum mlx5_fpga_status state;
|
enum mlx5_fpga_status state;
|
||||||
enum mlx5_fpga_image last_admin_image;
|
enum mlx5_fpga_image last_admin_image;
|
||||||
|
@ -82,7 +87,6 @@ int mlx5_fpga_init(struct mlx5_core_dev *mdev);
|
||||||
void mlx5_fpga_cleanup(struct mlx5_core_dev *mdev);
|
void mlx5_fpga_cleanup(struct mlx5_core_dev *mdev);
|
||||||
int mlx5_fpga_device_start(struct mlx5_core_dev *mdev);
|
int mlx5_fpga_device_start(struct mlx5_core_dev *mdev);
|
||||||
void mlx5_fpga_device_stop(struct mlx5_core_dev *mdev);
|
void mlx5_fpga_device_stop(struct mlx5_core_dev *mdev);
|
||||||
void mlx5_fpga_event(struct mlx5_core_dev *mdev, u8 event, void *data);
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
@ -104,11 +108,6 @@ static inline void mlx5_fpga_device_stop(struct mlx5_core_dev *mdev)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void mlx5_fpga_event(struct mlx5_core_dev *mdev, u8 event,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __MLX5_FPGA_CORE_H__ */
|
#endif /* __MLX5_FPGA_CORE_H__ */
|
||||||
|
|
Loading…
Reference in New Issue