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> 40e9dcd831SSlava Shwartsman 41e9dcd831SSlava Shwartsman #define MLX5_FPGA_ACCESS_REG_SZ (MLX5_ST_SZ_DW(fpga_access_reg) + \ 42e9dcd831SSlava Shwartsman MLX5_FPGA_ACCESS_REG_SIZE_MAX) 43e9dcd831SSlava Shwartsman 44e9dcd831SSlava Shwartsman int mlx5_fpga_access_reg(struct mlx5_core_dev *dev, u8 size, u64 addr, 45e9dcd831SSlava Shwartsman void *buf, bool write) 46e9dcd831SSlava Shwartsman { 47e9dcd831SSlava Shwartsman u32 in[MLX5_FPGA_ACCESS_REG_SZ] = {0}; 48e9dcd831SSlava Shwartsman u32 out[MLX5_FPGA_ACCESS_REG_SZ]; 49e9dcd831SSlava Shwartsman int err; 50e9dcd831SSlava Shwartsman 51e9dcd831SSlava Shwartsman if (size & 3) 52e9dcd831SSlava Shwartsman return -EINVAL; 53e9dcd831SSlava Shwartsman if (addr & 3) 54e9dcd831SSlava Shwartsman return -EINVAL; 55e9dcd831SSlava Shwartsman if (size > MLX5_FPGA_ACCESS_REG_SIZE_MAX) 56e9dcd831SSlava Shwartsman return -EINVAL; 57e9dcd831SSlava Shwartsman 58e9dcd831SSlava Shwartsman MLX5_SET(fpga_access_reg, in, size, size); 59e9dcd831SSlava Shwartsman MLX5_SET64(fpga_access_reg, in, address, addr); 60e9dcd831SSlava Shwartsman if (write) 61e9dcd831SSlava Shwartsman memcpy(MLX5_ADDR_OF(fpga_access_reg, in, data), buf, size); 62e9dcd831SSlava Shwartsman 63e9dcd831SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 64e9dcd831SSlava Shwartsman MLX5_REG_FPGA_ACCESS_REG, 0, write); 65e9dcd831SSlava Shwartsman if (err) 66e9dcd831SSlava Shwartsman return err; 67e9dcd831SSlava Shwartsman 68e9dcd831SSlava Shwartsman if (!write) 69e9dcd831SSlava Shwartsman memcpy(buf, MLX5_ADDR_OF(fpga_access_reg, out, data), size); 70e9dcd831SSlava Shwartsman 71e9dcd831SSlava Shwartsman return 0; 72e9dcd831SSlava Shwartsman } 73e9dcd831SSlava Shwartsman 74e9dcd831SSlava Shwartsman int mlx5_fpga_caps(struct mlx5_core_dev *dev) 75e9dcd831SSlava Shwartsman { 76e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_cap)] = {0}; 77e9dcd831SSlava Shwartsman 78e9dcd831SSlava Shwartsman return mlx5_core_access_reg(dev, in, sizeof(in), dev->caps.fpga, 79e9dcd831SSlava Shwartsman MLX5_ST_SZ_BYTES(fpga_cap), 80e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CAP, 0, 0); 81e9dcd831SSlava Shwartsman } 82e9dcd831SSlava Shwartsman 83e9dcd831SSlava Shwartsman int mlx5_fpga_ctrl_op(struct mlx5_core_dev *dev, u8 op) 84e9dcd831SSlava Shwartsman { 85e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 86e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 87e9dcd831SSlava Shwartsman 88e9dcd831SSlava Shwartsman MLX5_SET(fpga_ctrl, in, operation, op); 89e9dcd831SSlava Shwartsman 90e9dcd831SSlava Shwartsman return mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 91e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CTRL, 0, true); 92e9dcd831SSlava Shwartsman } 93e9dcd831SSlava Shwartsman 94e9dcd831SSlava Shwartsman int mlx5_fpga_sbu_caps(struct mlx5_core_dev *dev, void *caps, int size) 95e9dcd831SSlava Shwartsman { 96e9dcd831SSlava Shwartsman unsigned int cap_size = MLX5_CAP_FPGA(dev, sandbox_extended_caps_len); 97e9dcd831SSlava Shwartsman u64 addr = MLX5_CAP64_FPGA(dev, sandbox_extended_caps_addr); 98e9dcd831SSlava Shwartsman unsigned int read; 99e9dcd831SSlava Shwartsman int ret = 0; 100e9dcd831SSlava Shwartsman 101e9dcd831SSlava Shwartsman if (cap_size > size) { 102e9dcd831SSlava Shwartsman mlx5_core_warn(dev, "Not enough buffer %u for FPGA SBU caps %u", 103e9dcd831SSlava Shwartsman size, cap_size); 104e9dcd831SSlava Shwartsman return -EINVAL; 105e9dcd831SSlava Shwartsman } 106e9dcd831SSlava Shwartsman 107e9dcd831SSlava Shwartsman while (cap_size > 0) { 108e9dcd831SSlava Shwartsman read = min_t(unsigned int, cap_size, 109e9dcd831SSlava Shwartsman MLX5_FPGA_ACCESS_REG_SIZE_MAX); 110e9dcd831SSlava Shwartsman 111e9dcd831SSlava Shwartsman ret = mlx5_fpga_access_reg(dev, read, addr, caps, false); 112e9dcd831SSlava Shwartsman if (ret) { 113e9dcd831SSlava Shwartsman mlx5_core_warn(dev, "Error reading FPGA SBU caps %u bytes at address %#jx: %d", 114e9dcd831SSlava Shwartsman read, (uintmax_t)addr, ret); 115e9dcd831SSlava Shwartsman return ret; 116e9dcd831SSlava Shwartsman } 117e9dcd831SSlava Shwartsman 118e9dcd831SSlava Shwartsman cap_size -= read; 119e9dcd831SSlava Shwartsman addr += read; 120e9dcd831SSlava Shwartsman caps += read; 121e9dcd831SSlava Shwartsman } 122e9dcd831SSlava Shwartsman 123e9dcd831SSlava Shwartsman return ret; 124e9dcd831SSlava Shwartsman } 125e9dcd831SSlava Shwartsman 126e9dcd831SSlava Shwartsman static int mlx5_fpga_ctrl_write(struct mlx5_core_dev *dev, u8 op, 127e9dcd831SSlava Shwartsman enum mlx5_fpga_image image) 128e9dcd831SSlava Shwartsman { 129e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 130e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 131e9dcd831SSlava Shwartsman 132e9dcd831SSlava Shwartsman MLX5_SET(fpga_ctrl, in, operation, op); 133e9dcd831SSlava Shwartsman MLX5_SET(fpga_ctrl, in, flash_select_admin, image); 134e9dcd831SSlava Shwartsman 135e9dcd831SSlava Shwartsman return mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 136e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CTRL, 0, true); 137e9dcd831SSlava Shwartsman } 138e9dcd831SSlava Shwartsman 139e9dcd831SSlava Shwartsman int mlx5_fpga_load(struct mlx5_core_dev *dev, enum mlx5_fpga_image image) 140e9dcd831SSlava Shwartsman { 141e9dcd831SSlava Shwartsman return mlx5_fpga_ctrl_write(dev, MLX5_FPGA_CTRL_OPERATION_LOAD, image); 142e9dcd831SSlava Shwartsman } 143e9dcd831SSlava Shwartsman 144e9dcd831SSlava Shwartsman int mlx5_fpga_image_select(struct mlx5_core_dev *dev, 145e9dcd831SSlava Shwartsman enum mlx5_fpga_image image) 146e9dcd831SSlava Shwartsman { 147e9dcd831SSlava Shwartsman return mlx5_fpga_ctrl_write(dev, MLX5_FPGA_CTRL_OPERATION_FLASH_SELECT, image); 148e9dcd831SSlava Shwartsman } 149e9dcd831SSlava Shwartsman 150e9dcd831SSlava Shwartsman int mlx5_fpga_query(struct mlx5_core_dev *dev, struct mlx5_fpga_query *query) 151e9dcd831SSlava Shwartsman { 152e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_ctrl)] = {0}; 153e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_ctrl)]; 154e9dcd831SSlava Shwartsman int err; 155e9dcd831SSlava Shwartsman 156e9dcd831SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 157e9dcd831SSlava Shwartsman MLX5_REG_FPGA_CTRL, 0, false); 158e9dcd831SSlava Shwartsman if (err) 159e9dcd831SSlava Shwartsman return err; 160e9dcd831SSlava Shwartsman 161e9dcd831SSlava Shwartsman query->image_status = MLX5_GET(fpga_ctrl, out, status); 162e9dcd831SSlava Shwartsman query->admin_image = MLX5_GET(fpga_ctrl, out, flash_select_admin); 163e9dcd831SSlava Shwartsman query->oper_image = MLX5_GET(fpga_ctrl, out, flash_select_oper); 164e9dcd831SSlava Shwartsman return 0; 165e9dcd831SSlava Shwartsman } 166e9dcd831SSlava Shwartsman 167*085b35bbSSlava Shwartsman int mlx5_fpga_query_mtmp(struct mlx5_core_dev *dev, 168*085b35bbSSlava Shwartsman struct mlx5_fpga_temperature *temp) 169*085b35bbSSlava Shwartsman { 170*085b35bbSSlava Shwartsman u32 in[MLX5_ST_SZ_DW(mtmp_reg)] = {0}; 171*085b35bbSSlava Shwartsman u32 out[MLX5_ST_SZ_DW(mtmp_reg)] = {0}; 172*085b35bbSSlava Shwartsman int err; 173*085b35bbSSlava Shwartsman 174*085b35bbSSlava Shwartsman MLX5_SET(mtmp_reg, in, sensor_index, temp->index); 175*085b35bbSSlava Shwartsman MLX5_SET(mtmp_reg, in, i, 176*085b35bbSSlava Shwartsman ((temp->index < MLX5_FPGA_INTERNAL_SENSORS_LOW) || 177*085b35bbSSlava Shwartsman (temp->index > MLX5_FPGA_INTERNAL_SENSORS_HIGH)) ? 1 : 0); 178*085b35bbSSlava Shwartsman 179*085b35bbSSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 180*085b35bbSSlava Shwartsman MLX5_REG_MTMP, 0, false); 181*085b35bbSSlava Shwartsman if (err) 182*085b35bbSSlava Shwartsman return err; 183*085b35bbSSlava Shwartsman 184*085b35bbSSlava Shwartsman temp->index = MLX5_GET(mtmp_reg, out, sensor_index); 185*085b35bbSSlava Shwartsman temp->temperature = MLX5_GET(mtmp_reg, out, temperature); 186*085b35bbSSlava Shwartsman temp->mte = MLX5_GET(mtmp_reg, out, mte); 187*085b35bbSSlava Shwartsman temp->max_temperature = MLX5_GET(mtmp_reg, out, max_temperature); 188*085b35bbSSlava Shwartsman temp->tee = MLX5_GET(mtmp_reg, out, tee); 189*085b35bbSSlava Shwartsman temp->temperature_threshold_hi = MLX5_GET(mtmp_reg, out, 190*085b35bbSSlava Shwartsman temperature_threshold_hi); 191*085b35bbSSlava Shwartsman temp->temperature_threshold_lo = MLX5_GET(mtmp_reg, out, 192*085b35bbSSlava Shwartsman temperature_threshold_lo); 193*085b35bbSSlava Shwartsman memcpy(temp->sensor_name, MLX5_ADDR_OF(mtmp_reg, out, sensor_name), 194*085b35bbSSlava Shwartsman MLX5_FLD_SZ_BYTES(mtmp_reg, sensor_name)); 195*085b35bbSSlava Shwartsman 196*085b35bbSSlava Shwartsman return 0; 197*085b35bbSSlava Shwartsman } 198*085b35bbSSlava Shwartsman 199e9dcd831SSlava Shwartsman int mlx5_fpga_create_qp(struct mlx5_core_dev *dev, void *fpga_qpc, 200e9dcd831SSlava Shwartsman u32 *fpga_qpn) 201e9dcd831SSlava Shwartsman { 202e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_create_qp_in)] = {0}; 203e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_create_qp_out)]; 204e9dcd831SSlava Shwartsman int ret; 205e9dcd831SSlava Shwartsman 206e9dcd831SSlava Shwartsman MLX5_SET(fpga_create_qp_in, in, opcode, MLX5_CMD_OP_FPGA_CREATE_QP); 207e9dcd831SSlava Shwartsman memcpy(MLX5_ADDR_OF(fpga_create_qp_in, in, fpga_qpc), fpga_qpc, 208e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_create_qp_in, fpga_qpc)); 209e9dcd831SSlava Shwartsman 210e9dcd831SSlava Shwartsman ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 211e9dcd831SSlava Shwartsman if (ret) 212e9dcd831SSlava Shwartsman return ret; 213e9dcd831SSlava Shwartsman 214e9dcd831SSlava Shwartsman memcpy(fpga_qpc, MLX5_ADDR_OF(fpga_create_qp_out, out, fpga_qpc), 215e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_create_qp_out, fpga_qpc)); 216e9dcd831SSlava Shwartsman *fpga_qpn = MLX5_GET(fpga_create_qp_out, out, fpga_qpn); 217e9dcd831SSlava Shwartsman return ret; 218e9dcd831SSlava Shwartsman } 219e9dcd831SSlava Shwartsman 220e9dcd831SSlava Shwartsman int mlx5_fpga_modify_qp(struct mlx5_core_dev *dev, u32 fpga_qpn, 221e9dcd831SSlava Shwartsman enum mlx5_fpga_qpc_field_select fields, 222e9dcd831SSlava Shwartsman void *fpga_qpc) 223e9dcd831SSlava Shwartsman { 224e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_modify_qp_in)] = {0}; 225e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_modify_qp_out)]; 226e9dcd831SSlava Shwartsman 227e9dcd831SSlava Shwartsman MLX5_SET(fpga_modify_qp_in, in, opcode, MLX5_CMD_OP_FPGA_MODIFY_QP); 228e9dcd831SSlava Shwartsman MLX5_SET(fpga_modify_qp_in, in, field_select, fields); 229e9dcd831SSlava Shwartsman MLX5_SET(fpga_modify_qp_in, in, fpga_qpn, fpga_qpn); 230e9dcd831SSlava Shwartsman memcpy(MLX5_ADDR_OF(fpga_modify_qp_in, in, fpga_qpc), fpga_qpc, 231e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_modify_qp_in, fpga_qpc)); 232e9dcd831SSlava Shwartsman 233e9dcd831SSlava Shwartsman return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 234e9dcd831SSlava Shwartsman } 235e9dcd831SSlava Shwartsman 236e9dcd831SSlava Shwartsman int mlx5_fpga_query_qp(struct mlx5_core_dev *dev, 237e9dcd831SSlava Shwartsman u32 fpga_qpn, void *fpga_qpc) 238e9dcd831SSlava Shwartsman { 239e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_query_qp_in)] = {0}; 240e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_query_qp_out)]; 241e9dcd831SSlava Shwartsman int ret; 242e9dcd831SSlava Shwartsman 243e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_in, in, opcode, MLX5_CMD_OP_FPGA_QUERY_QP); 244e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_in, in, fpga_qpn, fpga_qpn); 245e9dcd831SSlava Shwartsman 246e9dcd831SSlava Shwartsman ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 247e9dcd831SSlava Shwartsman if (ret) 248e9dcd831SSlava Shwartsman return ret; 249e9dcd831SSlava Shwartsman 250e9dcd831SSlava Shwartsman memcpy(fpga_qpc, MLX5_ADDR_OF(fpga_query_qp_out, out, fpga_qpc), 251e9dcd831SSlava Shwartsman MLX5_FLD_SZ_BYTES(fpga_query_qp_out, fpga_qpc)); 252e9dcd831SSlava Shwartsman return ret; 253e9dcd831SSlava Shwartsman } 254e9dcd831SSlava Shwartsman 255e9dcd831SSlava Shwartsman int mlx5_fpga_destroy_qp(struct mlx5_core_dev *dev, u32 fpga_qpn) 256e9dcd831SSlava Shwartsman { 257e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_destroy_qp_in)] = {0}; 258e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_destroy_qp_out)]; 259e9dcd831SSlava Shwartsman 260e9dcd831SSlava Shwartsman MLX5_SET(fpga_destroy_qp_in, in, opcode, MLX5_CMD_OP_FPGA_DESTROY_QP); 261e9dcd831SSlava Shwartsman MLX5_SET(fpga_destroy_qp_in, in, fpga_qpn, fpga_qpn); 262e9dcd831SSlava Shwartsman 263e9dcd831SSlava Shwartsman return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 264e9dcd831SSlava Shwartsman } 265e9dcd831SSlava Shwartsman 266e9dcd831SSlava Shwartsman int mlx5_fpga_query_qp_counters(struct mlx5_core_dev *dev, u32 fpga_qpn, 267e9dcd831SSlava Shwartsman bool clear, struct mlx5_fpga_qp_counters *data) 268e9dcd831SSlava Shwartsman { 269e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_query_qp_counters_in)] = {0}; 270e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_query_qp_counters_out)]; 271e9dcd831SSlava Shwartsman int ret; 272e9dcd831SSlava Shwartsman 273e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_counters_in, in, opcode, 274e9dcd831SSlava Shwartsman MLX5_CMD_OP_FPGA_QUERY_QP_COUNTERS); 275e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_counters_in, in, clear, clear); 276e9dcd831SSlava Shwartsman MLX5_SET(fpga_query_qp_counters_in, in, fpga_qpn, fpga_qpn); 277e9dcd831SSlava Shwartsman 278e9dcd831SSlava Shwartsman ret = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out)); 279e9dcd831SSlava Shwartsman if (ret) 280e9dcd831SSlava Shwartsman return ret; 281e9dcd831SSlava Shwartsman 282e9dcd831SSlava Shwartsman data->rx_ack_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 283e9dcd831SSlava Shwartsman rx_ack_packets); 284e9dcd831SSlava Shwartsman data->rx_send_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 285e9dcd831SSlava Shwartsman rx_send_packets); 286e9dcd831SSlava Shwartsman data->tx_ack_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 287e9dcd831SSlava Shwartsman tx_ack_packets); 288e9dcd831SSlava Shwartsman data->tx_send_packets = MLX5_GET64(fpga_query_qp_counters_out, out, 289e9dcd831SSlava Shwartsman tx_send_packets); 290e9dcd831SSlava Shwartsman data->rx_total_drop = MLX5_GET64(fpga_query_qp_counters_out, out, 291e9dcd831SSlava Shwartsman rx_total_drop); 292e9dcd831SSlava Shwartsman 293e9dcd831SSlava Shwartsman return ret; 294e9dcd831SSlava Shwartsman } 295e9dcd831SSlava Shwartsman 296e9dcd831SSlava Shwartsman int mlx5_fpga_shell_counters(struct mlx5_core_dev *dev, bool clear, 297e9dcd831SSlava Shwartsman struct mlx5_fpga_shell_counters *data) 298e9dcd831SSlava Shwartsman { 299e9dcd831SSlava Shwartsman u32 in[MLX5_ST_SZ_DW(fpga_shell_counters)] = {0}; 300e9dcd831SSlava Shwartsman u32 out[MLX5_ST_SZ_DW(fpga_shell_counters)]; 301e9dcd831SSlava Shwartsman int err; 302e9dcd831SSlava Shwartsman 303e9dcd831SSlava Shwartsman MLX5_SET(fpga_shell_counters, in, clear, clear); 304e9dcd831SSlava Shwartsman err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 305e9dcd831SSlava Shwartsman MLX5_REG_FPGA_SHELL_CNTR, 0, false); 306e9dcd831SSlava Shwartsman if (err) 307e9dcd831SSlava Shwartsman goto out; 308e9dcd831SSlava Shwartsman if (data) { 309e9dcd831SSlava Shwartsman data->ddr_read_requests = MLX5_GET64(fpga_shell_counters, out, 310e9dcd831SSlava Shwartsman ddr_read_requests); 311e9dcd831SSlava Shwartsman data->ddr_write_requests = MLX5_GET64(fpga_shell_counters, out, 312e9dcd831SSlava Shwartsman ddr_write_requests); 313e9dcd831SSlava Shwartsman data->ddr_read_bytes = MLX5_GET64(fpga_shell_counters, out, 314e9dcd831SSlava Shwartsman ddr_read_bytes); 315e9dcd831SSlava Shwartsman data->ddr_write_bytes = MLX5_GET64(fpga_shell_counters, out, 316e9dcd831SSlava Shwartsman ddr_write_bytes); 317e9dcd831SSlava Shwartsman } 318e9dcd831SSlava Shwartsman 319e9dcd831SSlava Shwartsman out: 320e9dcd831SSlava Shwartsman return err; 321e9dcd831SSlava Shwartsman } 322