• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  */
32 
33 #include <linux/mlx5/driver.h>
34 #include <linux/mlx5/cmd.h>
35 #include <linux/module.h>
36 #include "mlx5_core.h"
37 
mlx5_cmd_query_adapter(struct mlx5_core_dev * dev,u32 * out,int outlen)38 static int mlx5_cmd_query_adapter(struct mlx5_core_dev *dev, u32 *out,
39 				  int outlen)
40 {
41 	u32 in[MLX5_ST_SZ_DW(query_adapter_in)];
42 
43 	memset(in, 0, sizeof(in));
44 
45 	MLX5_SET(query_adapter_in, in, opcode, MLX5_CMD_OP_QUERY_ADAPTER);
46 
47 	return mlx5_cmd_exec_check_status(dev, in, sizeof(in), out, outlen);
48 }
49 
mlx5_query_board_id(struct mlx5_core_dev * dev)50 int mlx5_query_board_id(struct mlx5_core_dev *dev)
51 {
52 	u32 *out;
53 	int outlen = MLX5_ST_SZ_BYTES(query_adapter_out);
54 	int err;
55 
56 	out = kzalloc(outlen, GFP_KERNEL);
57 	if (!out)
58 		return -ENOMEM;
59 
60 	err = mlx5_cmd_query_adapter(dev, out, outlen);
61 	if (err)
62 		goto out;
63 
64 	memcpy(dev->board_id,
65 	       MLX5_ADDR_OF(query_adapter_out, out,
66 			    query_adapter_struct.vsd_contd_psid),
67 	       MLX5_FLD_SZ_BYTES(query_adapter_out,
68 				 query_adapter_struct.vsd_contd_psid));
69 
70 out:
71 	kfree(out);
72 	return err;
73 }
74 
mlx5_core_query_vendor_id(struct mlx5_core_dev * mdev,u32 * vendor_id)75 int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id)
76 {
77 	u32 *out;
78 	int outlen = MLX5_ST_SZ_BYTES(query_adapter_out);
79 	int err;
80 
81 	out = kzalloc(outlen, GFP_KERNEL);
82 	if (!out)
83 		return -ENOMEM;
84 
85 	err = mlx5_cmd_query_adapter(mdev, out, outlen);
86 	if (err)
87 		goto out;
88 
89 	*vendor_id = MLX5_GET(query_adapter_out, out,
90 			      query_adapter_struct.ieee_vendor_id);
91 out:
92 	kfree(out);
93 	return err;
94 }
95 EXPORT_SYMBOL(mlx5_core_query_vendor_id);
96 
mlx5_query_hca_caps(struct mlx5_core_dev * dev)97 int mlx5_query_hca_caps(struct mlx5_core_dev *dev)
98 {
99 	int err;
100 
101 	err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL, HCA_CAP_OPMOD_GET_CUR);
102 	if (err)
103 		return err;
104 
105 	err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL, HCA_CAP_OPMOD_GET_MAX);
106 	if (err)
107 		return err;
108 
109 	if (MLX5_CAP_GEN(dev, eth_net_offloads)) {
110 		err = mlx5_core_get_caps(dev, MLX5_CAP_ETHERNET_OFFLOADS,
111 					 HCA_CAP_OPMOD_GET_CUR);
112 		if (err)
113 			return err;
114 		err = mlx5_core_get_caps(dev, MLX5_CAP_ETHERNET_OFFLOADS,
115 					 HCA_CAP_OPMOD_GET_MAX);
116 		if (err)
117 			return err;
118 	}
119 
120 	if (MLX5_CAP_GEN(dev, pg)) {
121 		err = mlx5_core_get_caps(dev, MLX5_CAP_ODP,
122 					 HCA_CAP_OPMOD_GET_CUR);
123 		if (err)
124 			return err;
125 		err = mlx5_core_get_caps(dev, MLX5_CAP_ODP,
126 					 HCA_CAP_OPMOD_GET_MAX);
127 		if (err)
128 			return err;
129 	}
130 
131 	if (MLX5_CAP_GEN(dev, atomic)) {
132 		err = mlx5_core_get_caps(dev, MLX5_CAP_ATOMIC,
133 					 HCA_CAP_OPMOD_GET_CUR);
134 		if (err)
135 			return err;
136 		err = mlx5_core_get_caps(dev, MLX5_CAP_ATOMIC,
137 					 HCA_CAP_OPMOD_GET_MAX);
138 		if (err)
139 			return err;
140 	}
141 
142 	if (MLX5_CAP_GEN(dev, roce)) {
143 		err = mlx5_core_get_caps(dev, MLX5_CAP_ROCE,
144 					 HCA_CAP_OPMOD_GET_CUR);
145 		if (err)
146 			return err;
147 		err = mlx5_core_get_caps(dev, MLX5_CAP_ROCE,
148 					 HCA_CAP_OPMOD_GET_MAX);
149 		if (err)
150 			return err;
151 	}
152 
153 	if (MLX5_CAP_GEN(dev, nic_flow_table)) {
154 		err = mlx5_core_get_caps(dev, MLX5_CAP_FLOW_TABLE,
155 					 HCA_CAP_OPMOD_GET_CUR);
156 		if (err)
157 			return err;
158 		err = mlx5_core_get_caps(dev, MLX5_CAP_FLOW_TABLE,
159 					 HCA_CAP_OPMOD_GET_MAX);
160 		if (err)
161 			return err;
162 	}
163 	return 0;
164 }
165 
mlx5_cmd_init_hca(struct mlx5_core_dev * dev)166 int mlx5_cmd_init_hca(struct mlx5_core_dev *dev)
167 {
168 	struct mlx5_cmd_init_hca_mbox_in in;
169 	struct mlx5_cmd_init_hca_mbox_out out;
170 	int err;
171 
172 	memset(&in, 0, sizeof(in));
173 	memset(&out, 0, sizeof(out));
174 	in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_INIT_HCA);
175 	err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
176 	if (err)
177 		return err;
178 
179 	if (out.hdr.status)
180 		err = mlx5_cmd_status_to_err(&out.hdr);
181 
182 	return err;
183 }
184 
mlx5_cmd_teardown_hca(struct mlx5_core_dev * dev)185 int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev)
186 {
187 	struct mlx5_cmd_teardown_hca_mbox_in in;
188 	struct mlx5_cmd_teardown_hca_mbox_out out;
189 	int err;
190 
191 	memset(&in, 0, sizeof(in));
192 	memset(&out, 0, sizeof(out));
193 	in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_TEARDOWN_HCA);
194 	err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
195 	if (err)
196 		return err;
197 
198 	if (out.hdr.status)
199 		err = mlx5_cmd_status_to_err(&out.hdr);
200 
201 	return err;
202 }
203