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 38int mlx5_cmd_query_adapter(struct mlx5_core_dev *dev) 39{ 40 struct mlx5_cmd_query_adapter_mbox_out *out; 41 struct mlx5_cmd_query_adapter_mbox_in in; 42 int err; 43 44 out = kzalloc(sizeof(*out), GFP_KERNEL); 45 if (!out) 46 return -ENOMEM; 47 48 memset(&in, 0, sizeof(in)); 49 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_QUERY_ADAPTER); 50 err = mlx5_cmd_exec(dev, &in, sizeof(in), out, sizeof(*out)); 51 if (err) 52 goto out_out; 53 54 if (out->hdr.status) { 55 err = mlx5_cmd_status_to_err(&out->hdr); 56 goto out_out; 57 } 58 59 memcpy(dev->board_id, out->vsd_psid, sizeof(out->vsd_psid)); 60 61out_out: 62 kfree(out); 63 64 return err; 65} 66 67int mlx5_cmd_query_hca_cap(struct mlx5_core_dev *dev, struct mlx5_caps *caps) 68{ 69 return mlx5_core_get_caps(dev, caps, HCA_CAP_OPMOD_GET_CUR); 70} 71 72int mlx5_query_odp_caps(struct mlx5_core_dev *dev, struct mlx5_odp_caps *caps) 73{ 74 u8 in[MLX5_ST_SZ_BYTES(query_hca_cap_in)]; 75 int out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out); 76 void *out; 77 int err; 78 79 if (!(dev->caps.gen.flags & MLX5_DEV_CAP_FLAG_ON_DMND_PG)) 80 return -ENOTSUPP; 81 82 memset(in, 0, sizeof(in)); 83 out = kzalloc(out_sz, GFP_KERNEL); 84 if (!out) 85 return -ENOMEM; 86 MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP); 87 MLX5_SET(query_hca_cap_in, in, op_mod, HCA_CAP_OPMOD_GET_ODP_CUR); 88 err = mlx5_cmd_exec(dev, in, sizeof(in), out, out_sz); 89 if (err) 90 goto out; 91 92 err = mlx5_cmd_status_to_err_v2(out); 93 if (err) { 94 mlx5_core_warn(dev, "query cur hca ODP caps failed, %d\n", err); 95 goto out; 96 } 97 98 memcpy(caps, MLX5_ADDR_OF(query_hca_cap_out, out, capability_struct), 99 sizeof(*caps)); 100 101 mlx5_core_dbg(dev, "on-demand paging capabilities:\nrc: %08x\nuc: %08x\nud: %08x\n", 102 be32_to_cpu(caps->per_transport_caps.rc_odp_caps), 103 be32_to_cpu(caps->per_transport_caps.uc_odp_caps), 104 be32_to_cpu(caps->per_transport_caps.ud_odp_caps)); 105 106out: 107 kfree(out); 108 return err; 109} 110EXPORT_SYMBOL(mlx5_query_odp_caps); 111 112int mlx5_cmd_init_hca(struct mlx5_core_dev *dev) 113{ 114 struct mlx5_cmd_init_hca_mbox_in in; 115 struct mlx5_cmd_init_hca_mbox_out out; 116 int err; 117 118 memset(&in, 0, sizeof(in)); 119 memset(&out, 0, sizeof(out)); 120 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_INIT_HCA); 121 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); 122 if (err) 123 return err; 124 125 if (out.hdr.status) 126 err = mlx5_cmd_status_to_err(&out.hdr); 127 128 return err; 129} 130 131int mlx5_cmd_teardown_hca(struct mlx5_core_dev *dev) 132{ 133 struct mlx5_cmd_teardown_hca_mbox_in in; 134 struct mlx5_cmd_teardown_hca_mbox_out out; 135 int err; 136 137 memset(&in, 0, sizeof(in)); 138 memset(&out, 0, sizeof(out)); 139 in.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_TEARDOWN_HCA); 140 err = mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out)); 141 if (err) 142 return err; 143 144 if (out.hdr.status) 145 err = mlx5_cmd_status_to_err(&out.hdr); 146 147 return err; 148} 149