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/configfs.h>
34 #include <rdma/ib_verbs.h>
35 #include <rdma/rdma_cm.h>
37 #include "core_priv.h"
44 struct cma_dev_port_group
{
46 struct cma_dev_group
*cma_dev_group
;
47 struct config_group group
;
50 struct cma_dev_group
{
51 char name
[IB_DEVICE_NAME_MAX
];
52 struct config_group device_group
;
53 struct config_group ports_group
;
54 struct cma_dev_port_group
*ports
;
57 static struct cma_dev_port_group
*to_dev_port_group(struct config_item
*item
)
59 struct config_group
*group
;
64 group
= container_of(item
, struct config_group
, cg_item
);
65 return container_of(group
, struct cma_dev_port_group
, group
);
68 static bool filter_by_name(struct ib_device
*ib_dev
, void *cookie
)
70 return !strcmp(dev_name(&ib_dev
->dev
), cookie
);
73 static int cma_configfs_params_get(struct config_item
*item
,
74 struct cma_device
**pcma_dev
,
75 struct cma_dev_port_group
**pgroup
)
77 struct cma_dev_port_group
*group
= to_dev_port_group(item
);
78 struct cma_device
*cma_dev
;
83 cma_dev
= cma_enum_devices_by_ibdev(filter_by_name
,
84 group
->cma_dev_group
->name
);
94 static void cma_configfs_params_put(struct cma_device
*cma_dev
)
99 static ssize_t
default_roce_mode_show(struct config_item
*item
,
102 struct cma_device
*cma_dev
;
103 struct cma_dev_port_group
*group
;
107 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
111 gid_type
= cma_get_default_gid_type(cma_dev
, group
->port_num
);
112 cma_configfs_params_put(cma_dev
);
117 return sysfs_emit(buf
, "%s\n", ib_cache_gid_type_str(gid_type
));
120 static ssize_t
default_roce_mode_store(struct config_item
*item
,
121 const char *buf
, size_t count
)
123 struct cma_device
*cma_dev
;
124 struct cma_dev_port_group
*group
;
128 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
132 gid_type
= ib_cache_gid_parse_type_str(buf
);
134 cma_configfs_params_put(cma_dev
);
138 ret
= cma_set_default_gid_type(cma_dev
, group
->port_num
, gid_type
);
140 cma_configfs_params_put(cma_dev
);
142 return !ret
? strnlen(buf
, count
) : ret
;
145 CONFIGFS_ATTR(, default_roce_mode
);
147 static ssize_t
default_roce_tos_show(struct config_item
*item
, char *buf
)
149 struct cma_device
*cma_dev
;
150 struct cma_dev_port_group
*group
;
154 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
158 tos
= cma_get_default_roce_tos(cma_dev
, group
->port_num
);
159 cma_configfs_params_put(cma_dev
);
161 return sysfs_emit(buf
, "%u\n", tos
);
164 static ssize_t
default_roce_tos_store(struct config_item
*item
,
165 const char *buf
, size_t count
)
167 struct cma_device
*cma_dev
;
168 struct cma_dev_port_group
*group
;
172 ret
= kstrtou8(buf
, 0, &tos
);
176 ret
= cma_configfs_params_get(item
, &cma_dev
, &group
);
180 ret
= cma_set_default_roce_tos(cma_dev
, group
->port_num
, tos
);
181 cma_configfs_params_put(cma_dev
);
183 return ret
? ret
: strnlen(buf
, count
);
186 CONFIGFS_ATTR(, default_roce_tos
);
188 static struct configfs_attribute
*cma_configfs_attributes
[] = {
189 &attr_default_roce_mode
,
190 &attr_default_roce_tos
,
194 static const struct config_item_type cma_port_group_type
= {
195 .ct_attrs
= cma_configfs_attributes
,
196 .ct_owner
= THIS_MODULE
199 static int make_cma_ports(struct cma_dev_group
*cma_dev_group
,
200 struct cma_device
*cma_dev
)
202 struct cma_dev_port_group
*ports
;
203 struct ib_device
*ibdev
;
207 ibdev
= cma_get_ib_dev(cma_dev
);
212 ports_num
= ibdev
->phys_port_cnt
;
213 ports
= kcalloc(ports_num
, sizeof(*cma_dev_group
->ports
),
219 for (i
= 0; i
< ports_num
; i
++) {
222 ports
[i
].port_num
= i
+ 1;
223 snprintf(port_str
, sizeof(port_str
), "%u", i
+ 1);
224 ports
[i
].cma_dev_group
= cma_dev_group
;
225 config_group_init_type_name(&ports
[i
].group
,
227 &cma_port_group_type
);
228 configfs_add_default_group(&ports
[i
].group
,
229 &cma_dev_group
->ports_group
);
232 cma_dev_group
->ports
= ports
;
236 static void release_cma_dev(struct config_item
*item
)
238 struct config_group
*group
= container_of(item
, struct config_group
,
240 struct cma_dev_group
*cma_dev_group
= container_of(group
,
241 struct cma_dev_group
,
244 kfree(cma_dev_group
);
247 static void release_cma_ports_group(struct config_item
*item
)
249 struct config_group
*group
= container_of(item
, struct config_group
,
251 struct cma_dev_group
*cma_dev_group
= container_of(group
,
252 struct cma_dev_group
,
255 kfree(cma_dev_group
->ports
);
256 cma_dev_group
->ports
= NULL
;
259 static struct configfs_item_operations cma_ports_item_ops
= {
260 .release
= release_cma_ports_group
263 static const struct config_item_type cma_ports_group_type
= {
264 .ct_item_ops
= &cma_ports_item_ops
,
265 .ct_owner
= THIS_MODULE
268 static struct configfs_item_operations cma_device_item_ops
= {
269 .release
= release_cma_dev
272 static const struct config_item_type cma_device_group_type
= {
273 .ct_item_ops
= &cma_device_item_ops
,
274 .ct_owner
= THIS_MODULE
277 static struct config_group
*make_cma_dev(struct config_group
*group
,
281 struct cma_device
*cma_dev
= cma_enum_devices_by_ibdev(filter_by_name
,
283 struct cma_dev_group
*cma_dev_group
= NULL
;
288 cma_dev_group
= kzalloc(sizeof(*cma_dev_group
), GFP_KERNEL
);
290 if (!cma_dev_group
) {
295 strscpy(cma_dev_group
->name
, name
, sizeof(cma_dev_group
->name
));
297 config_group_init_type_name(&cma_dev_group
->ports_group
, "ports",
298 &cma_ports_group_type
);
300 err
= make_cma_ports(cma_dev_group
, cma_dev
);
304 config_group_init_type_name(&cma_dev_group
->device_group
, name
,
305 &cma_device_group_type
);
306 configfs_add_default_group(&cma_dev_group
->ports_group
,
307 &cma_dev_group
->device_group
);
309 cma_dev_put(cma_dev
);
310 return &cma_dev_group
->device_group
;
314 cma_dev_put(cma_dev
);
315 kfree(cma_dev_group
);
319 static void drop_cma_dev(struct config_group
*cgroup
, struct config_item
*item
)
321 struct config_group
*group
=
322 container_of(item
, struct config_group
, cg_item
);
323 struct cma_dev_group
*cma_dev_group
=
324 container_of(group
, struct cma_dev_group
, device_group
);
326 configfs_remove_default_groups(&cma_dev_group
->ports_group
);
327 configfs_remove_default_groups(&cma_dev_group
->device_group
);
328 config_item_put(item
);
331 static struct configfs_group_operations cma_subsys_group_ops
= {
332 .make_group
= make_cma_dev
,
333 .drop_item
= drop_cma_dev
,
336 static const struct config_item_type cma_subsys_type
= {
337 .ct_group_ops
= &cma_subsys_group_ops
,
338 .ct_owner
= THIS_MODULE
,
341 static struct configfs_subsystem cma_subsys
= {
344 .ci_namebuf
= "rdma_cm",
345 .ci_type
= &cma_subsys_type
,
350 int __init
cma_configfs_init(void)
354 config_group_init(&cma_subsys
.su_group
);
355 mutex_init(&cma_subsys
.su_mutex
);
356 ret
= configfs_register_subsystem(&cma_subsys
);
358 mutex_destroy(&cma_subsys
.su_mutex
);
362 void __exit
cma_configfs_exit(void)
364 configfs_unregister_subsystem(&cma_subsys
);
365 mutex_destroy(&cma_subsys
.su_mutex
);