hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/net/ethernet/mellanox/mlx5/core/fpga/core.c
....@@ -36,6 +36,7 @@
3636
3737 #include "mlx5_core.h"
3838 #include "lib/mlx5.h"
39
+#include "lib/eq.h"
3940 #include "fpga/core.h"
4041 #include "fpga/conn.h"
4142
....@@ -80,19 +81,28 @@
8081 }
8182 }
8283
83
-static const char *mlx5_fpga_device_name(u32 device)
84
+static const char *mlx5_fpga_name(u32 fpga_id)
8485 {
85
- switch (device) {
86
- case MLX5_FPGA_DEVICE_KU040:
87
- return "ku040";
88
- case MLX5_FPGA_DEVICE_KU060:
89
- return "ku060";
90
- case MLX5_FPGA_DEVICE_KU060_2:
91
- return "ku060_2";
92
- case MLX5_FPGA_DEVICE_UNKNOWN:
93
- default:
94
- return "unknown";
86
+ static char ret[32];
87
+
88
+ switch (fpga_id) {
89
+ case MLX5_FPGA_NEWTON:
90
+ return "Newton";
91
+ case MLX5_FPGA_EDISON:
92
+ return "Edison";
93
+ case MLX5_FPGA_MORSE:
94
+ return "Morse";
95
+ case MLX5_FPGA_MORSEQ:
96
+ return "MorseQ";
9597 }
98
+
99
+ snprintf(ret, sizeof(ret), "Unknown %d", fpga_id);
100
+ return ret;
101
+}
102
+
103
+static int mlx5_is_fpga_lookaside(u32 fpga_id)
104
+{
105
+ return fpga_id != MLX5_FPGA_NEWTON && fpga_id != MLX5_FPGA_EDISON;
96106 }
97107
98108 static int mlx5_fpga_device_load_check(struct mlx5_fpga_device *fdev)
....@@ -109,8 +119,12 @@
109119 fdev->last_admin_image = query.admin_image;
110120 fdev->last_oper_image = query.oper_image;
111121
112
- mlx5_fpga_dbg(fdev, "Status %u; Admin image %u; Oper image %u\n",
113
- query.status, query.admin_image, query.oper_image);
122
+ mlx5_fpga_info(fdev, "Status %u; Admin image %u; Oper image %u\n",
123
+ query.status, query.admin_image, query.oper_image);
124
+
125
+ /* for FPGA lookaside projects FPGA load status is not important */
126
+ if (mlx5_is_fpga_lookaside(MLX5_CAP_FPGA(fdev->mdev, fpga_id)))
127
+ return 0;
114128
115129 if (query.status != MLX5_FPGA_STATUS_SUCCESS) {
116130 mlx5_fpga_err(fdev, "%s image failed to load; status %u\n",
....@@ -145,30 +159,51 @@
145159 return 0;
146160 }
147161
162
+static int mlx5_fpga_event(struct mlx5_fpga_device *, unsigned long, void *);
163
+
164
+static int fpga_err_event(struct notifier_block *nb, unsigned long event, void *eqe)
165
+{
166
+ struct mlx5_fpga_device *fdev = mlx5_nb_cof(nb, struct mlx5_fpga_device, fpga_err_nb);
167
+
168
+ return mlx5_fpga_event(fdev, event, eqe);
169
+}
170
+
171
+static int fpga_qp_err_event(struct notifier_block *nb, unsigned long event, void *eqe)
172
+{
173
+ struct mlx5_fpga_device *fdev = mlx5_nb_cof(nb, struct mlx5_fpga_device, fpga_qp_err_nb);
174
+
175
+ return mlx5_fpga_event(fdev, event, eqe);
176
+}
177
+
148178 int mlx5_fpga_device_start(struct mlx5_core_dev *mdev)
149179 {
150180 struct mlx5_fpga_device *fdev = mdev->fpga;
151181 unsigned int max_num_qps;
152182 unsigned long flags;
153
- u32 fpga_device_id;
183
+ u32 fpga_id;
154184 int err;
155185
156186 if (!fdev)
157187 return 0;
158188
159
- err = mlx5_fpga_device_load_check(fdev);
160
- if (err)
161
- goto out;
162
-
163189 err = mlx5_fpga_caps(fdev->mdev);
164190 if (err)
165191 goto out;
166192
167
- fpga_device_id = MLX5_CAP_FPGA(fdev->mdev, fpga_device);
168
- mlx5_fpga_info(fdev, "%s:%u; %s image, version %u; SBU %06x:%04x version %d\n",
169
- mlx5_fpga_device_name(fpga_device_id),
170
- fpga_device_id,
193
+ err = mlx5_fpga_device_load_check(fdev);
194
+ if (err)
195
+ goto out;
196
+
197
+ fpga_id = MLX5_CAP_FPGA(fdev->mdev, fpga_id);
198
+ mlx5_fpga_info(fdev, "FPGA card %s:%u\n", mlx5_fpga_name(fpga_id), fpga_id);
199
+
200
+ /* No QPs if FPGA does not participate in net processing */
201
+ if (mlx5_is_fpga_lookaside(fpga_id))
202
+ goto out;
203
+
204
+ mlx5_fpga_info(fdev, "%s(%d): image, version %u; SBU %06x:%04x version %d\n",
171205 mlx5_fpga_image_name(fdev->last_oper_image),
206
+ fdev->last_oper_image,
172207 MLX5_CAP_FPGA(fdev->mdev, image_version),
173208 MLX5_CAP_FPGA(fdev->mdev, ieee_vendor_id),
174209 MLX5_CAP_FPGA(fdev->mdev, sandbox_product_id),
....@@ -184,6 +219,11 @@
184219 err = mlx5_core_reserve_gids(mdev, max_num_qps);
185220 if (err)
186221 goto out;
222
+
223
+ MLX5_NB_INIT(&fdev->fpga_err_nb, fpga_err_event, FPGA_ERROR);
224
+ MLX5_NB_INIT(&fdev->fpga_qp_err_nb, fpga_qp_err_event, FPGA_QP_ERROR);
225
+ mlx5_eq_notifier_register(fdev->mdev, &fdev->fpga_err_nb);
226
+ mlx5_eq_notifier_register(fdev->mdev, &fdev->fpga_qp_err_nb);
187227
188228 err = mlx5_fpga_conn_device_init(fdev);
189229 if (err)
....@@ -201,6 +241,8 @@
201241 mlx5_fpga_conn_device_cleanup(fdev);
202242
203243 err_rsvd_gid:
244
+ mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_err_nb);
245
+ mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_qp_err_nb);
204246 mlx5_core_unreserve_gids(mdev, max_num_qps);
205247 out:
206248 spin_lock_irqsave(&fdev->state_lock, flags);
....@@ -240,6 +282,9 @@
240282 if (!fdev)
241283 return;
242284
285
+ if (mlx5_is_fpga_lookaside(MLX5_CAP_FPGA(fdev->mdev, fpga_id)))
286
+ return;
287
+
243288 spin_lock_irqsave(&fdev->state_lock, flags);
244289 if (fdev->state != MLX5_FPGA_STATUS_SUCCESS) {
245290 spin_unlock_irqrestore(&fdev->state_lock, flags);
....@@ -256,6 +301,9 @@
256301 }
257302
258303 mlx5_fpga_conn_device_cleanup(fdev);
304
+ mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_err_nb);
305
+ mlx5_eq_notifier_unregister(fdev->mdev, &fdev->fpga_qp_err_nb);
306
+
259307 max_num_qps = MLX5_CAP_FPGA(mdev, shell_caps.max_num_qps);
260308 mlx5_core_unreserve_gids(mdev, max_num_qps);
261309 }
....@@ -283,9 +331,10 @@
283331 return "Unknown";
284332 }
285333
286
-void mlx5_fpga_event(struct mlx5_core_dev *mdev, u8 event, void *data)
334
+static int mlx5_fpga_event(struct mlx5_fpga_device *fdev,
335
+ unsigned long event, void *eqe)
287336 {
288
- struct mlx5_fpga_device *fdev = mdev->fpga;
337
+ void *data = ((struct mlx5_eqe *)eqe)->data.raw;
289338 const char *event_name;
290339 bool teardown = false;
291340 unsigned long flags;
....@@ -301,9 +350,7 @@
301350 event_name = mlx5_fpga_qp_syndrome_to_string(syndrome);
302351 break;
303352 default:
304
- mlx5_fpga_warn_ratelimited(fdev, "Unexpected event %u\n",
305
- event);
306
- return;
353
+ return NOTIFY_DONE;
307354 }
308355
309356 spin_lock_irqsave(&fdev->state_lock, flags);
....@@ -324,4 +371,6 @@
324371 */
325372 if (teardown)
326373 mlx5_trigger_health_work(fdev->mdev);
374
+
375
+ return NOTIFY_OK;
327376 }