xref: /freebsd/sys/dev/mlx5/mlx5_core/mlx5_fc_cmd.c (revision 35bbcf09)
135bbcf09SRaed Salem /*-
235bbcf09SRaed Salem  * Copyright (c) 2022 NVIDIA corporation & affiliates.
335bbcf09SRaed Salem  *
435bbcf09SRaed Salem  * Redistribution and use in source and binary forms, with or without
535bbcf09SRaed Salem  * modification, are permitted provided that the following conditions
635bbcf09SRaed Salem  * are met:
735bbcf09SRaed Salem  * 1. Redistributions of source code must retain the above copyright
835bbcf09SRaed Salem  *    notice, this list of conditions and the following disclaimer.
935bbcf09SRaed Salem  * 2. Redistributions in binary form must reproduce the above copyright
1035bbcf09SRaed Salem  *    notice, this list of conditions and the following disclaimer in the
1135bbcf09SRaed Salem  *    documentation and/or other materials provided with the distribution.
1235bbcf09SRaed Salem  *
1335bbcf09SRaed Salem  * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS `AS IS' AND
1435bbcf09SRaed Salem  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1535bbcf09SRaed Salem  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1635bbcf09SRaed Salem  * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
1735bbcf09SRaed Salem  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1835bbcf09SRaed Salem  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1935bbcf09SRaed Salem  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2035bbcf09SRaed Salem  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2135bbcf09SRaed Salem  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2235bbcf09SRaed Salem  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2335bbcf09SRaed Salem  * SUCH DAMAGE.
2435bbcf09SRaed Salem  *
2535bbcf09SRaed Salem  * $FreeBSD$
2635bbcf09SRaed Salem  */
2735bbcf09SRaed Salem 
2835bbcf09SRaed Salem #include <dev/mlx5/driver.h>
2935bbcf09SRaed Salem #include <dev/mlx5/device.h>
3035bbcf09SRaed Salem #include <dev/mlx5/mlx5_ifc.h>
3135bbcf09SRaed Salem #include <dev/mlx5/mlx5_core/mlx5_fc_cmd.h>
3235bbcf09SRaed Salem #include <dev/mlx5/mlx5_core/mlx5_core.h>
3335bbcf09SRaed Salem 
mlx5_cmd_fc_bulk_alloc(struct mlx5_core_dev * dev,enum mlx5_fc_bulk_alloc_bitmask alloc_bitmask,u32 * id)3435bbcf09SRaed Salem int mlx5_cmd_fc_bulk_alloc(struct mlx5_core_dev *dev,
3535bbcf09SRaed Salem 			   enum mlx5_fc_bulk_alloc_bitmask alloc_bitmask,
3635bbcf09SRaed Salem 			   u32 *id)
3735bbcf09SRaed Salem {
3835bbcf09SRaed Salem 	u32 out[MLX5_ST_SZ_DW(alloc_flow_counter_out)] = {};
3935bbcf09SRaed Salem 	u32 in[MLX5_ST_SZ_DW(alloc_flow_counter_in)] = {};
4035bbcf09SRaed Salem 	int err;
4135bbcf09SRaed Salem 
4235bbcf09SRaed Salem 	MLX5_SET(alloc_flow_counter_in, in, opcode,
4335bbcf09SRaed Salem 		 MLX5_CMD_OP_ALLOC_FLOW_COUNTER);
4435bbcf09SRaed Salem 	MLX5_SET(alloc_flow_counter_in, in, flow_counter_bulk, alloc_bitmask);
4535bbcf09SRaed Salem 
4635bbcf09SRaed Salem 	err = mlx5_cmd_exec_inout(dev, alloc_flow_counter, in, out);
4735bbcf09SRaed Salem 	if (!err)
4835bbcf09SRaed Salem 		*id = MLX5_GET(alloc_flow_counter_out, out, flow_counter_id);
4935bbcf09SRaed Salem 	return err;
5035bbcf09SRaed Salem }
5135bbcf09SRaed Salem 
mlx5_cmd_fc_alloc(struct mlx5_core_dev * dev,u32 * id)5235bbcf09SRaed Salem int mlx5_cmd_fc_alloc(struct mlx5_core_dev *dev, u32 *id)
5335bbcf09SRaed Salem {
5435bbcf09SRaed Salem 	return mlx5_cmd_fc_bulk_alloc(dev, 0, id);
5535bbcf09SRaed Salem }
5635bbcf09SRaed Salem 
mlx5_cmd_fc_free(struct mlx5_core_dev * dev,u32 id)5735bbcf09SRaed Salem int mlx5_cmd_fc_free(struct mlx5_core_dev *dev, u32 id)
5835bbcf09SRaed Salem {
5935bbcf09SRaed Salem 	u32 in[MLX5_ST_SZ_DW(dealloc_flow_counter_in)] = {};
6035bbcf09SRaed Salem 
6135bbcf09SRaed Salem 	MLX5_SET(dealloc_flow_counter_in, in, opcode,
6235bbcf09SRaed Salem 		 MLX5_CMD_OP_DEALLOC_FLOW_COUNTER);
6335bbcf09SRaed Salem 	MLX5_SET(dealloc_flow_counter_in, in, flow_counter_id, id);
6435bbcf09SRaed Salem 	return mlx5_cmd_exec_in(dev, dealloc_flow_counter, in);
6535bbcf09SRaed Salem }
6635bbcf09SRaed Salem 
mlx5_cmd_fc_query(struct mlx5_core_dev * dev,u32 id,u64 * packets,u64 * bytes)6735bbcf09SRaed Salem int mlx5_cmd_fc_query(struct mlx5_core_dev *dev, u32 id,
6835bbcf09SRaed Salem 		      u64 *packets, u64 *bytes)
6935bbcf09SRaed Salem {
7035bbcf09SRaed Salem 	u32 out[MLX5_ST_SZ_BYTES(query_flow_counter_out) +
7135bbcf09SRaed Salem 		MLX5_ST_SZ_BYTES(traffic_counter)] = {};
7235bbcf09SRaed Salem 	u32 in[MLX5_ST_SZ_DW(query_flow_counter_in)] = {};
7335bbcf09SRaed Salem 	void *stats;
7435bbcf09SRaed Salem 	int err = 0;
7535bbcf09SRaed Salem 
7635bbcf09SRaed Salem 	MLX5_SET(query_flow_counter_in, in, opcode,
7735bbcf09SRaed Salem 		 MLX5_CMD_OP_QUERY_FLOW_COUNTER);
7835bbcf09SRaed Salem 	MLX5_SET(query_flow_counter_in, in, op_mod, 0);
7935bbcf09SRaed Salem 	MLX5_SET(query_flow_counter_in, in, flow_counter_id, id);
8035bbcf09SRaed Salem 	err = mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
8135bbcf09SRaed Salem 	if (err)
8235bbcf09SRaed Salem 		return err;
8335bbcf09SRaed Salem 
8435bbcf09SRaed Salem 	stats = MLX5_ADDR_OF(query_flow_counter_out, out, flow_statistics);
8535bbcf09SRaed Salem 	*packets = MLX5_GET64(traffic_counter, stats, packets);
8635bbcf09SRaed Salem 	*bytes = MLX5_GET64(traffic_counter, stats, octets);
8735bbcf09SRaed Salem 	return 0;
8835bbcf09SRaed Salem }
8935bbcf09SRaed Salem 
mlx5_cmd_fc_bulk_query(struct mlx5_core_dev * dev,u32 base_id,int bulk_len,u32 * out)9035bbcf09SRaed Salem int mlx5_cmd_fc_bulk_query(struct mlx5_core_dev *dev, u32 base_id, int bulk_len,
9135bbcf09SRaed Salem 			   u32 *out)
9235bbcf09SRaed Salem {
9335bbcf09SRaed Salem 	int outlen = mlx5_cmd_fc_get_bulk_query_out_len(bulk_len);
9435bbcf09SRaed Salem 	u32 in[MLX5_ST_SZ_DW(query_flow_counter_in)] = {};
9535bbcf09SRaed Salem 
9635bbcf09SRaed Salem 	MLX5_SET(query_flow_counter_in, in, opcode,
9735bbcf09SRaed Salem 		 MLX5_CMD_OP_QUERY_FLOW_COUNTER);
9835bbcf09SRaed Salem 	MLX5_SET(query_flow_counter_in, in, flow_counter_id, base_id);
9935bbcf09SRaed Salem 	MLX5_SET(query_flow_counter_in, in, num_of_counters, bulk_len);
10035bbcf09SRaed Salem 	return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen);
10135bbcf09SRaed Salem }
10235bbcf09SRaed Salem 
103