1e9dcd831SSlava Shwartsman /*- 2e9dcd831SSlava Shwartsman * Copyright (c) 2017, Mellanox Technologies. All rights reserved. 3e9dcd831SSlava Shwartsman * 4e9dcd831SSlava Shwartsman * This software is available to you under a choice of one of two 5e9dcd831SSlava Shwartsman * licenses. You may choose to be licensed under the terms of the GNU 6e9dcd831SSlava Shwartsman * General Public License (GPL) Version 2, available from the file 7e9dcd831SSlava Shwartsman * COPYING in the main directory of this source tree, or the 8e9dcd831SSlava Shwartsman * OpenIB.org BSD license below: 9e9dcd831SSlava Shwartsman * 10e9dcd831SSlava Shwartsman * Redistribution and use in source and binary forms, with or 11e9dcd831SSlava Shwartsman * without modification, are permitted provided that the following 12e9dcd831SSlava Shwartsman * conditions are met: 13e9dcd831SSlava Shwartsman * 14e9dcd831SSlava Shwartsman * - Redistributions of source code must retain the above 15e9dcd831SSlava Shwartsman * copyright notice, this list of conditions and the following 16e9dcd831SSlava Shwartsman * disclaimer. 17e9dcd831SSlava Shwartsman * 18e9dcd831SSlava Shwartsman * - Redistributions in binary form must reproduce the above 19e9dcd831SSlava Shwartsman * copyright notice, this list of conditions and the following 20e9dcd831SSlava Shwartsman * disclaimer in the documentation and/or other materials 21e9dcd831SSlava Shwartsman * provided with the distribution. 22e9dcd831SSlava Shwartsman * 23e9dcd831SSlava Shwartsman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24e9dcd831SSlava Shwartsman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25e9dcd831SSlava Shwartsman * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26e9dcd831SSlava Shwartsman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27e9dcd831SSlava Shwartsman * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28e9dcd831SSlava Shwartsman * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29e9dcd831SSlava Shwartsman * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30e9dcd831SSlava Shwartsman * SOFTWARE. 31e9dcd831SSlava Shwartsman * 32e9dcd831SSlava Shwartsman * $FreeBSD$ 33e9dcd831SSlava Shwartsman */ 34e9dcd831SSlava Shwartsman 35e9dcd831SSlava Shwartsman #include <dev/mlx5/cmd.h> 36e9dcd831SSlava Shwartsman #include <dev/mlx5/driver.h> 37e9dcd831SSlava Shwartsman #include <dev/mlx5/device.h> 38e9dcd831SSlava Shwartsman #include <dev/mlx5/mlx5_core/mlx5_core.h> 39e9dcd831SSlava Shwartsman #include <dev/mlx5/mlx5_fpga/cmd.h> 40*d82f1c13SSlava Shwartsman #include <dev/mlx5/mlx5_fpga/core.h> 41e9dcd831SSlava Shwartsman 42e9dcd831SSlava Shwartsman #define MLX5_FPGA_ACCESS_REG_SZ (MLX5_ST_SZ_DW(fpga_access_reg) + \ 43e9dcd831SSlava Shwartsman MLX5_FPGA_ACCESS_REG_SIZE_MAX) 44e9dcd831SSlava Shwartsman 45e9dcd831SSlava Shwartsman int mlx5_fpga_access_reg(struct mlx5_core_dev *dev, u8 size, u64 addr, 46e9dcd831SSlava Shwartsman void *buf, bool write) 47e9dcd831SSlava Shwartsman { 48e9dcd831SSlava Shwartsman u32 in[MLX5_FPGA_ACCESS_REG_SZ] = {0}; 49e9dcd831SSlava Shwartsman u32 out[MLX5_FPGA_ACCESS_REG_SZ]; 50e9dcd831SSlava Shwartsman int err; 51e9dcd831SSlava Shwartsman 52e9dcd831SSlava Shwartsman if (size & 3) 53e9dcd831SSlava Shwartsman return -EINVAL; 54e9dcd831SSlava Shwartsman if (addr & 3) 55e9dcd831SSlava Shwartsman return -EINVAL; 56e9dcd831SSlava Shwartsman if (size > MLX5_FPGA_ACCESS_REG_SIZE_MAX) 57e9dcd831SSlava Shwartsman return -EINVAL; 58e9dcd831SSlava Shwartsman 59e9dcd831SSlava Shwartsman MLX5_SET(fpga_access_reg, in, size, size); 60e9dcd831SSlava Shwartsman MLX5_SET64(fpga_access_reg, in, address, addr); 61e9dcd831SSlava Shwartsman if (write) 62e9dcd831SSlava Shwartsman memcpy(MLX5_ADDR_OF(fpga_access_reg, in, data), buf, size); 63e9dcd831SSlava Shwartsman 64e9dcd831SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 65e9dcd831SSlava Shwartsman MLX5_REG_FPGA_ACCESS_REG, 0, write); 66e9dcd831SSlava Shwartsman if (err) 67e9dcd831SSlava Shwartsman return err; 68e9dcd831SSlava Shwartsman 69e9dcd831SSlava Shwartsman if (!write) 70e9dcd831SSlava Shwartsman memcpy(buf, MLX5_ADDR_OF(fpga_access_reg, out, data), size); 71e9dcd831SSlava Shwartsman 72e9dcd831SSlava Shwartsman return 0; 73e9dcd831SSlava Shwartsman } 74e9dcd831SSlava Shwartsman 75e9dcd831SSlava Shwartsman int mlx5_fpga_caps(struct mlx5_core_dev *dev) 76e9dcd831SSlava Shwartsman { 77e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_cap)] = {0}; 78e9dcd831SSlava Shwartsman 79e9dcd831SSlava Shwartsman return mlx5_core_access_reg(dev, in, sizeof(in), dev->caps.fpga, 80e9dcd831SSlava Shwartsman MLX5_ST_SZ_BYTES(fpga_cap), 81e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CAP, 0, 0); 82e9dcd831SSlava Shwartsman } 83e9dcd831SSlava Shwartsman 84e9dcd831SSlava Shwartsman int mlx5_fpga_ctrl_op(struct mlx5_core_dev *dev, u8 op) 85e9dcd831SSlava Shwartsman { 86e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 87e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 88e9dcd831SSlava Shwartsman 89e9dcd831SSlava Shwartsman MLX5_SET(fpga_ctrl, in, operation, op); 90e9dcd831SSlava Shwartsman 91e9dcd831SSlava Shwartsman return mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 92e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CTRL, 0, true); 93e9dcd831SSlava Shwartsman } 94e9dcd831SSlava Shwartsman 95e9dcd831SSlava Shwartsman int mlx5_fpga_sbu_caps(struct mlx5_core_dev *dev, void *caps, int size) 96e9dcd831SSlava Shwartsman { 97e9dcd831SSlava Shwartsman unsigned int cap_size = MLX5_CAP_FPGA(dev, sandbox_extended_caps_len); 98e9dcd831SSlava Shwartsman u64 addr = MLX5_CAP64_FPGA(dev, sandbox_extended_caps_addr); 99e9dcd831SSlava Shwartsman unsigned int read; 100e9dcd831SSlava Shwartsman int ret = 0; 101e9dcd831SSlava Shwartsman 102e9dcd831SSlava Shwartsman if (cap_size > size) { 103e9dcd831SSlava Shwartsman mlx5_core_warn(dev, "Not enough buffer %u for FPGA SBU caps %u", 104e9dcd831SSlava Shwartsman size, cap_size); 105e9dcd831SSlava Shwartsman return -EINVAL; 106e9dcd831SSlava Shwartsman } 107e9dcd831SSlava Shwartsman 108e9dcd831SSlava Shwartsman while (cap_size > 0) { 109e9dcd831SSlava Shwartsman read = min_t(unsigned int, cap_size, 110e9dcd831SSlava Shwartsman MLX5_FPGA_ACCESS_REG_SIZE_MAX); 111e9dcd831SSlava Shwartsman 112e9dcd831SSlava Shwartsman ret = mlx5_fpga_access_reg(dev, read, addr, caps, false); 113e9dcd831SSlava Shwartsman if (ret) { 114e9dcd831SSlava Shwartsman mlx5_core_warn(dev, "Error reading FPGA SBU caps %u bytes at address %#jx: %d", 115e9dcd831SSlava Shwartsman read, (uintmax_t)addr, ret); 116e9dcd831SSlava Shwartsman return ret; 117e9dcd831SSlava Shwartsman } 118e9dcd831SSlava Shwartsman 119e9dcd831SSlava Shwartsman cap_size -= read; 120e9dcd831SSlava Shwartsman addr += read; 121e9dcd831SSlava Shwartsman caps += read; 122e9dcd831SSlava Shwartsman } 123e9dcd831SSlava Shwartsman 124e9dcd831SSlava Shwartsman return ret; 125e9dcd831SSlava Shwartsman } 126e9dcd831SSlava Shwartsman 127e9dcd831SSlava Shwartsman static int mlx5_fpga_ctrl_write(struct mlx5_core_dev *dev, u8 op, 128e9dcd831SSlava Shwartsman enum mlx5_fpga_image image) 129e9dcd831SSlava Shwartsman { 130e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 131e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 132e9dcd831SSlava Shwartsman 133e9dcd831SSlava Shwartsman MLX5_SET(fpga_ctrl, in, operation, op); 134e9dcd831SSlava Shwartsman MLX5_SET(fpga_ctrl, in, flash_select_admin, image); 135e9dcd831SSlava Shwartsman 136e9dcd831SSlava Shwartsman return mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 137e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CTRL, 0, true); 138e9dcd831SSlava Shwartsman } 139e9dcd831SSlava Shwartsman 140e9dcd831SSlava Shwartsman int mlx5_fpga_load(struct mlx5_core_dev *dev, enum mlx5_fpga_image image) 141e9dcd831SSlava Shwartsman { 142e9dcd831SSlava Shwartsman return mlx5_fpga_ctrl_write(dev, MLX5_FPGA_CTRL_OPERATION_LOAD, image); 143e9dcd831SSlava Shwartsman } 144e9dcd831SSlava Shwartsman 145e9dcd831SSlava Shwartsman int mlx5_fpga_image_select(struct mlx5_core_dev *dev, 146e9dcd831SSlava Shwartsman enum mlx5_fpga_image image) 147e9dcd831SSlava Shwartsman { 148e9dcd831SSlava Shwartsman return mlx5_fpga_ctrl_write(dev, MLX5_FPGA_CTRL_OPERATION_FLASH_SELECT, image); 149e9dcd831SSlava Shwartsman } 150e9dcd831SSlava Shwartsman 151e9dcd831SSlava Shwartsman int mlx5_fpga_query(struct mlx5_core_dev *dev, struct mlx5_fpga_query *query) 152e9dcd831SSlava Shwartsman { 153e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 154e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 155e9dcd831SSlava Shwartsman int err; 156e9dcd831SSlava Shwartsman 157e9dcd831SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 158e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CTRL, 0, false); 159e9dcd831SSlava Shwartsman if (err) 160e9dcd831SSlava Shwartsman return err; 161e9dcd831SSlava Shwartsman 162e9dcd831SSlava Shwartsman query->image_status = MLX5_GET(fpga_ctrl, out, status); 163e9dcd831SSlava Shwartsman query->admin_image = MLX5_GET(fpga_ctrl, out, flash_select_admin); 164e9dcd831SSlava Shwartsman query->oper_image = MLX5_GET(fpga_ctrl, out, flash_select_oper); 165e9dcd831SSlava Shwartsman return 0; 166e9dcd831SSlava Shwartsman } 167e9dcd831SSlava Shwartsman 168*d82f1c13SSlava Shwartsman int mlx5_fpga_ctrl_connect(struct mlx5_core_dev *dev, 169*d82f1c13SSlava Shwartsman enum mlx5_fpga_connect *connect) 170*d82f1c13SSlava Shwartsman { 171*d82f1c13SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 172*d82f1c13SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 173*d82f1c13SSlava Shwartsman int status; 174*d82f1c13SSlava Shwartsman int err; 175*d82f1c13SSlava Shwartsman 176*d82f1c13SSlava Shwartsman if (*connect == MLX5_FPGA_CONNECT_QUERY) { 177*d82f1c13SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, 178*d82f1c13SSlava Shwartsman sizeof(out), MLX5_REG_FPGA_CTRL, 179*d82f1c13SSlava Shwartsman 0, false); 180*d82f1c13SSlava Shwartsman if (err) 181*d82f1c13SSlava Shwartsman return err; 182*d82f1c13SSlava Shwartsman status = MLX5_GET(fpga_ctrl, out, status); 183*d82f1c13SSlava Shwartsman *connect = (status == MLX5_FDEV_STATE_DISCONNECTED) ? 184*d82f1c13SSlava Shwartsman MLX5_FPGA_CONNECT_DISCONNECT : 185*d82f1c13SSlava Shwartsman MLX5_FPGA_CONNECT_CONNECT; 186*d82f1c13SSlava Shwartsman } else { 187*d82f1c13SSlava Shwartsman MLX5_SET(fpga_ctrl, in, operation, *connect); 188*d82f1c13SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, 189*d82f1c13SSlava Shwartsman sizeof(out), MLX5_REG_FPGA_CTRL, 190*d82f1c13SSlava Shwartsman 0, true); 191*d82f1c13SSlava Shwartsman } 192*d82f1c13SSlava Shwartsman return err; 193*d82f1c13SSlava Shwartsman } 194*d82f1c13SSlava Shwartsman 195085b35bbSSlava Shwartsman int mlx5_fpga_query_mtmp(struct mlx5_core_dev *dev, 196085b35bbSSlava Shwartsman struct mlx5_fpga_temperature *temp) 197085b35bbSSlava Shwartsman { 198085b35bbSSlava Shwartsman u32 in[MLX5_ST_SZ_DW(mtmp_reg)] = {0}; 199085b35bbSSlava Shwartsman u32 out[MLX5_ST_SZ_DW(mtmp_reg)] = {0}; 200085b35bbSSlava Shwartsman int err; 201085b35bbSSlava Shwartsman 202085b35bbSSlava Shwartsman MLX5_SET(mtmp_reg, in, sensor_index, temp->index); 203085b35bbSSlava Shwartsman MLX5_SET(mtmp_reg, in, i, 204085b35bbSSlava Shwartsman ((temp->index < MLX5_FPGA_INTERNAL_SENSORS_LOW) || 205085b35bbSSlava Shwartsman (temp->index > MLX5_FPGA_INTERNAL_SENSORS_HIGH)) ? 1 : 0); 206085b35bbSSlava Shwartsman 207085b35bbSSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 208085b35bbSSlava Shwartsman MLX5_REG_MTMP, 0, false); 209085b35bbSSlava Shwartsman if (err) 210085b35bbSSlava Shwartsman return err; 211085b35bbSSlava Shwartsman 212085b35bbSSlava Shwartsman temp->index = MLX5_GET(mtmp_reg, out, sensor_index); 213085b35bbSSlava Shwartsman temp->temperature = MLX5_GET(mtmp_reg, out, temperature); 214085b35bbSSlava Shwartsman temp->mte = MLX5_GET(mtmp_reg, out, mte); 215085b35bbSSlava Shwartsman temp->max_temperature = MLX5_GET(mtmp_reg, out, max_temperature); 216085b35bbSSlava Shwartsman temp->tee = MLX5_GET(mtmp_reg, out, tee); 217085b35bbSSlava Shwartsman temp->temperature_threshold_hi = MLX5_GET(mtmp_reg, out, 218085b35bbSSlava Shwartsman temperature_threshold_hi); 219085b35bbSSlava Shwartsman temp->temperature_threshold_lo = MLX5_GET(mtmp_reg, out, 220085b35bbSSlava Shwartsman temperature_threshold_lo); 221085b35bbSSlava Shwartsman memcpy(temp->sensor_name, MLX5_ADDR_OF(mtmp_reg, out, sensor_name), 222085b35bbSSlava Shwartsman MLX5_FLD_SZ_BYTES(mtmp_reg, sensor_name)); 223085b35bbSSlava Shwartsman 224085b35bbSSlava Shwartsman return 0; 225085b35bbSSlava Shwartsman } 226085b35bbSSlava Shwartsman 227e9dcd831SSlava Shwartsman int mlx5_fpga_create_qp(struct mlx5_core_dev *dev, void *fpga_qpc, 228e9dcd831SSlava Shwartsman u32 *fpga_qpn) 229e9dcd831SSlava Shwartsman { 230e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_create_qp_in)] = {0}; 231e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_create_qp_out)]; 232e9dcd831SSlava Shwartsman int ret; 233e9dcd831SSlava Shwartsman 234e9dcd831SSlava Shwartsman MLX5_SET(fpga_create_qp_in, in, opcode, MLX5_CMD_OP_FPGA_CREATE_QP); 235e9dcd831SSlava Shwartsman memcpy(MLX5_ADDR_OF(fpga_create_qp_in, in, fpga_qpc), fpga_qpc, 236e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_create_qp_in, fpga_qpc)); 237e9dcd831SSlava Shwartsman 238e9dcd831SSlava Shwartsman ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 239e9dcd831SSlava Shwartsman if (ret) 240e9dcd831SSlava Shwartsman return ret; 241e9dcd831SSlava Shwartsman 242e9dcd831SSlava Shwartsman memcpy(fpga_qpc, MLX5_ADDR_OF(fpga_create_qp_out, out, fpga_qpc), 243e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_create_qp_out, fpga_qpc)); 244e9dcd831SSlava Shwartsman *fpga_qpn = MLX5_GET(fpga_create_qp_out, out, fpga_qpn); 245e9dcd831SSlava Shwartsman return ret; 246e9dcd831SSlava Shwartsman } 247e9dcd831SSlava Shwartsman 248e9dcd831SSlava Shwartsman int mlx5_fpga_modify_qp(struct mlx5_core_dev *dev, u32 fpga_qpn, 249e9dcd831SSlava Shwartsman enum mlx5_fpga_qpc_field_select fields, 250e9dcd831SSlava Shwartsman void *fpga_qpc) 251e9dcd831SSlava Shwartsman { 252e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_modify_qp_in)] = {0}; 253e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_modify_qp_out)]; 254e9dcd831SSlava Shwartsman 255e9dcd831SSlava Shwartsman MLX5_SET(fpga_modify_qp_in, in, opcode, MLX5_CMD_OP_FPGA_MODIFY_QP); 256e9dcd831SSlava Shwartsman MLX5_SET(fpga_modify_qp_in, in, field_select, fields); 257e9dcd831SSlava Shwartsman MLX5_SET(fpga_modify_qp_in, in, fpga_qpn, fpga_qpn); 258e9dcd831SSlava Shwartsman memcpy(MLX5_ADDR_OF(fpga_modify_qp_in, in, fpga_qpc), fpga_qpc, 259e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_modify_qp_in, fpga_qpc)); 260e9dcd831SSlava Shwartsman 261e9dcd831SSlava Shwartsman return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 262e9dcd831SSlava Shwartsman } 263e9dcd831SSlava Shwartsman 264e9dcd831SSlava Shwartsman int mlx5_fpga_query_qp(struct mlx5_core_dev *dev, 265e9dcd831SSlava Shwartsman u32 fpga_qpn, void *fpga_qpc) 266e9dcd831SSlava Shwartsman { 267e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_query_qp_in)] = {0}; 268e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_query_qp_out)]; 269e9dcd831SSlava Shwartsman int ret; 270e9dcd831SSlava Shwartsman 271e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_in, in, opcode, MLX5_CMD_OP_FPGA_QUERY_QP); 272e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_in, in, fpga_qpn, fpga_qpn); 273e9dcd831SSlava Shwartsman 274e9dcd831SSlava Shwartsman ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 275e9dcd831SSlava Shwartsman if (ret) 276e9dcd831SSlava Shwartsman return ret; 277e9dcd831SSlava Shwartsman 278e9dcd831SSlava Shwartsman memcpy(fpga_qpc, MLX5_ADDR_OF(fpga_query_qp_out, out, fpga_qpc), 279e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_query_qp_out, fpga_qpc)); 280e9dcd831SSlava Shwartsman return ret; 281e9dcd831SSlava Shwartsman } 282e9dcd831SSlava Shwartsman 283e9dcd831SSlava Shwartsman int mlx5_fpga_destroy_qp(struct mlx5_core_dev *dev, u32 fpga_qpn) 284e9dcd831SSlava Shwartsman { 285e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_destroy_qp_in)] = {0}; 286e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_destroy_qp_out)]; 287e9dcd831SSlava Shwartsman 288e9dcd831SSlava Shwartsman MLX5_SET(fpga_destroy_qp_in, in, opcode, MLX5_CMD_OP_FPGA_DESTROY_QP); 289e9dcd831SSlava Shwartsman MLX5_SET(fpga_destroy_qp_in, in, fpga_qpn, fpga_qpn); 290e9dcd831SSlava Shwartsman 291e9dcd831SSlava Shwartsman return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 292e9dcd831SSlava Shwartsman } 293e9dcd831SSlava Shwartsman 294e9dcd831SSlava Shwartsman int mlx5_fpga_query_qp_counters(struct mlx5_core_dev *dev, u32 fpga_qpn, 295e9dcd831SSlava Shwartsman bool clear, struct mlx5_fpga_qp_counters *data) 296e9dcd831SSlava Shwartsman { 297e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_query_qp_counters_in)] = {0}; 298e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_query_qp_counters_out)]; 299e9dcd831SSlava Shwartsman int ret; 300e9dcd831SSlava Shwartsman 301e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_counters_in, in, opcode, 302e9dcd831SSlava Shwartsman MLX5_CMD_OP_FPGA_QUERY_QP_COUNTERS); 303e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_counters_in, in, clear, clear); 304e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_counters_in, in, fpga_qpn, fpga_qpn); 305e9dcd831SSlava Shwartsman 306e9dcd831SSlava Shwartsman ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 307e9dcd831SSlava Shwartsman if (ret) 308e9dcd831SSlava Shwartsman return ret; 309e9dcd831SSlava Shwartsman 310e9dcd831SSlava Shwartsman data->rx_ack_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 311e9dcd831SSlava Shwartsman rx_ack_packets); 312e9dcd831SSlava Shwartsman data->rx_send_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 313e9dcd831SSlava Shwartsman rx_send_packets); 314e9dcd831SSlava Shwartsman data->tx_ack_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 315e9dcd831SSlava Shwartsman tx_ack_packets); 316e9dcd831SSlava Shwartsman data->tx_send_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 317e9dcd831SSlava Shwartsman tx_send_packets); 318e9dcd831SSlava Shwartsman data->rx_total_drop = MLX5_GET64(fpga_query_qp_counters_out, out, 319e9dcd831SSlava Shwartsman rx_total_drop); 320e9dcd831SSlava Shwartsman 321e9dcd831SSlava Shwartsman return ret; 322e9dcd831SSlava Shwartsman } 323e9dcd831SSlava Shwartsman 324e9dcd831SSlava Shwartsman int mlx5_fpga_shell_counters(struct mlx5_core_dev *dev, bool clear, 325e9dcd831SSlava Shwartsman struct mlx5_fpga_shell_counters *data) 326e9dcd831SSlava Shwartsman { 327e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_shell_counters)] = {0}; 328e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_shell_counters)]; 329e9dcd831SSlava Shwartsman int err; 330e9dcd831SSlava Shwartsman 331e9dcd831SSlava Shwartsman MLX5_SET(fpga_shell_counters, in, clear, clear); 332e9dcd831SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 333e9dcd831SSlava Shwartsman MLX5_REG_FPGA_SHELL_CNTR, 0, false); 334e9dcd831SSlava Shwartsman if (err) 335e9dcd831SSlava Shwartsman goto out; 336e9dcd831SSlava Shwartsman if (data) { 337e9dcd831SSlava Shwartsman data->ddr_read_requests = MLX5_GET64(fpga_shell_counters, out, 338e9dcd831SSlava Shwartsman ddr_read_requests); 339e9dcd831SSlava Shwartsman data->ddr_write_requests = MLX5_GET64(fpga_shell_counters, out, 340e9dcd831SSlava Shwartsman ddr_write_requests); 341e9dcd831SSlava Shwartsman data->ddr_read_bytes = MLX5_GET64(fpga_shell_counters, out, 342e9dcd831SSlava Shwartsman ddr_read_bytes); 343e9dcd831SSlava Shwartsman data->ddr_write_bytes = MLX5_GET64(fpga_shell_counters, out, 344e9dcd831SSlava Shwartsman ddr_write_bytes); 345e9dcd831SSlava Shwartsman } 346e9dcd831SSlava Shwartsman 347e9dcd831SSlava Shwartsman out: 348e9dcd831SSlava Shwartsman return err; 349e9dcd831SSlava Shwartsman } 350