2 * Copyright (c) 2015, Mellanox Technologies inc. All rights reserved.
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:
10 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
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.
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
33 #include <linux/module.h>
34 #include <linux/configfs.h>
35 #include <rdma/ib_verbs.h>
36 #include <rdma/rdma_cm.h>
38 #include "core_priv.h"
45 struct cma_dev_port_group
{
46 unsigned int port_num
;
47 struct cma_dev_group
*cma_dev_group
;
48 struct config_group group
;
51 struct cma_dev_group
{
52 char name
[IB_DEVICE_NAME_MAX
];
53 struct config_group device_group
;
54 struct config_group ports_group
;
55 struct cma_dev_port_group
*ports
;
58 static struct cma_dev_port_group
*to_dev_port_group(struct config_item
*item
)
60 struct config_group
*group
;
65 group
= container_of(item
, struct config_group
, cg_item
);
66 return container_of(group
, struct cma_dev_port_group
, group
);
69 static bool filter_by_name(struct ib_device
*ib_dev
, void *cookie
)
71 return !strcmp(dev_name(&ib_dev
->dev
), cookie
);
74 static int cma_configfs_params_get(struct config_item
*item
,
75 struct cma_device
**pcma_dev
,
76 struct cma_dev_port_group
**pgroup
)
78 struct cma_dev_port_group
*group
= to_dev_port_group(item
);
79 struct cma_device
*cma_dev
;
84 cma_dev
= cma_enum_devices_by_ibdev(filter_by_name
,
85 group
->cma_dev_group
->name
);
95 static void cma_configfs_params_put(struct cma_device
*cma_dev
)
97 cma_deref_dev(cma_dev
);
100 static ssize_t
default_roce_mode_show(struct config_item
*item
,
103 struct cma_device
*cma_dev
;
104 struct cma_dev_port_group
*group
;
108 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
112 gid_type
= cma_get_default_gid_type(cma_dev
, group
->port_num
);
113 cma_configfs_params_put(cma_dev
);
118 return sprintf(buf
, "%s\n", ib_cache_gid_type_str(gid_type
));
121 static ssize_t
default_roce_mode_store(struct config_item
*item
,
122 const char *buf
, size_t count
)
124 struct cma_device
*cma_dev
;
125 struct cma_dev_port_group
*group
;
126 int gid_type
= ib_cache_gid_parse_type_str(buf
);
132 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
136 ret
= cma_set_default_gid_type(cma_dev
, group
->port_num
, gid_type
);
138 cma_configfs_params_put(cma_dev
);
140 return !ret
? strnlen(buf
, count
) : ret
;
143 CONFIGFS_ATTR(, default_roce_mode
);
145 static ssize_t
default_roce_tos_show(struct config_item
*item
, char *buf
)
147 struct cma_device
*cma_dev
;
148 struct cma_dev_port_group
*group
;
152 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
156 tos
= cma_get_default_roce_tos(cma_dev
, group
->port_num
);
157 cma_configfs_params_put(cma_dev
);
159 return sprintf(buf
, "%u\n", tos
);
162 static ssize_t
default_roce_tos_store(struct config_item
*item
,
163 const char *buf
, size_t count
)
165 struct cma_device
*cma_dev
;
166 struct cma_dev_port_group
*group
;
170 ret
= kstrtou8(buf
, 0, &tos
);
174 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
178 ret
= cma_set_default_roce_tos(cma_dev
, group
->port_num
, tos
);
179 cma_configfs_params_put(cma_dev
);
181 return ret
? ret
: strnlen(buf
, count
);
184 CONFIGFS_ATTR(, default_roce_tos
);
186 static struct configfs_attribute
*cma_configfs_attributes
[] = {
187 &attr_default_roce_mode
,
188 &attr_default_roce_tos
,
192 static const struct config_item_type cma_port_group_type
= {
193 .ct_attrs
= cma_configfs_attributes
,
194 .ct_owner
= THIS_MODULE
197 static int make_cma_ports(struct cma_dev_group
*cma_dev_group
,
198 struct cma_device
*cma_dev
)
200 struct ib_device
*ibdev
;
202 unsigned int ports_num
;
203 struct cma_dev_port_group
*ports
;
206 ibdev
= cma_get_ib_dev(cma_dev
);
211 ports_num
= ibdev
->phys_port_cnt
;
212 ports
= kcalloc(ports_num
, sizeof(*cma_dev_group
->ports
),
220 for (i
= 0; i
< ports_num
; i
++) {
223 ports
[i
].port_num
= i
+ 1;
224 snprintf(port_str
, sizeof(port_str
), "%u", i
+ 1);
225 ports
[i
].cma_dev_group
= cma_dev_group
;
226 config_group_init_type_name(&ports
[i
].group
,
228 &cma_port_group_type
);
229 configfs_add_default_group(&ports
[i
].group
,
230 &cma_dev_group
->ports_group
);
233 cma_dev_group
->ports
= ports
;
238 cma_dev_group
->ports
= NULL
;
242 static void release_cma_dev(struct config_item
*item
)
244 struct config_group
*group
= container_of(item
, struct config_group
,
246 struct cma_dev_group
*cma_dev_group
= container_of(group
,
247 struct cma_dev_group
,
250 kfree(cma_dev_group
);
253 static void release_cma_ports_group(struct config_item
*item
)
255 struct config_group
*group
= container_of(item
, struct config_group
,
257 struct cma_dev_group
*cma_dev_group
= container_of(group
,
258 struct cma_dev_group
,
261 kfree(cma_dev_group
->ports
);
262 cma_dev_group
->ports
= NULL
;
265 static struct configfs_item_operations cma_ports_item_ops
= {
266 .release
= release_cma_ports_group
269 static const struct config_item_type cma_ports_group_type
= {
270 .ct_item_ops
= &cma_ports_item_ops
,
271 .ct_owner
= THIS_MODULE
274 static struct configfs_item_operations cma_device_item_ops
= {
275 .release
= release_cma_dev
278 static const struct config_item_type cma_device_group_type
= {
279 .ct_item_ops
= &cma_device_item_ops
,
280 .ct_owner
= THIS_MODULE
283 static struct config_group
*make_cma_dev(struct config_group
*group
,
287 struct cma_device
*cma_dev
= cma_enum_devices_by_ibdev(filter_by_name
,
289 struct cma_dev_group
*cma_dev_group
= NULL
;
294 cma_dev_group
= kzalloc(sizeof(*cma_dev_group
), GFP_KERNEL
);
296 if (!cma_dev_group
) {
301 strlcpy(cma_dev_group
->name
, name
, sizeof(cma_dev_group
->name
));
303 config_group_init_type_name(&cma_dev_group
->ports_group
, "ports",
304 &cma_ports_group_type
);
306 err
= make_cma_ports(cma_dev_group
, cma_dev
);
310 config_group_init_type_name(&cma_dev_group
->device_group
, name
,
311 &cma_device_group_type
);
312 configfs_add_default_group(&cma_dev_group
->ports_group
,
313 &cma_dev_group
->device_group
);
315 cma_deref_dev(cma_dev
);
316 return &cma_dev_group
->device_group
;
320 cma_deref_dev(cma_dev
);
321 kfree(cma_dev_group
);
325 static struct configfs_group_operations cma_subsys_group_ops
= {
326 .make_group
= make_cma_dev
,
329 static const struct config_item_type cma_subsys_type
= {
330 .ct_group_ops
= &cma_subsys_group_ops
,
331 .ct_owner
= THIS_MODULE
,
334 static struct configfs_subsystem cma_subsys
= {
337 .ci_namebuf
= "rdma_cm",
338 .ci_type
= &cma_subsys_type
,
343 int __init
cma_configfs_init(void)
347 config_group_init(&cma_subsys
.su_group
);
348 mutex_init(&cma_subsys
.su_mutex
);
349 ret
= configfs_register_subsystem(&cma_subsys
);
351 mutex_destroy(&cma_subsys
.su_mutex
);
355 void __exit
cma_configfs_exit(void)
357 configfs_unregister_subsystem(&cma_subsys
);
358 mutex_destroy(&cma_subsys
.su_mutex
);