xref: /freebsd-src/sys/dev/mlx5/mlx5_fpga_tools/mlx5fpga_tools_main.c (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1d50c55f1SSlava Shwartsman /*-
2d50c55f1SSlava Shwartsman  * Copyright (c) 2017 Mellanox Technologies. All rights reserved.
3d50c55f1SSlava Shwartsman  *
4d50c55f1SSlava Shwartsman  * This software is available to you under a choice of one of two
5d50c55f1SSlava Shwartsman  * licenses.  You may choose to be licensed under the terms of the GNU
6d50c55f1SSlava Shwartsman  * General Public License (GPL) Version 2, available from the file
7d50c55f1SSlava Shwartsman  * COPYING in the main directory of this source tree, or the
8d50c55f1SSlava Shwartsman  * OpenIB.org BSD license below:
9d50c55f1SSlava Shwartsman  *
10d50c55f1SSlava Shwartsman  *     Redistribution and use in source and binary forms, with or
11d50c55f1SSlava Shwartsman  *     without modification, are permitted provided that the following
12d50c55f1SSlava Shwartsman  *     conditions are met:
13d50c55f1SSlava Shwartsman  *
14d50c55f1SSlava Shwartsman  *      - Redistributions of source code must retain the above
15d50c55f1SSlava Shwartsman  *        copyright notice, this list of conditions and the following
16d50c55f1SSlava Shwartsman  *        disclaimer.
17d50c55f1SSlava Shwartsman  *
18d50c55f1SSlava Shwartsman  *      - Redistributions in binary form must reproduce the above
19d50c55f1SSlava Shwartsman  *        copyright notice, this list of conditions and the following
20d50c55f1SSlava Shwartsman  *        disclaimer in the documentation and/or other materials
21d50c55f1SSlava Shwartsman  *        provided with the distribution.
22d50c55f1SSlava Shwartsman  *
23d50c55f1SSlava Shwartsman  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24d50c55f1SSlava Shwartsman  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25d50c55f1SSlava Shwartsman  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26d50c55f1SSlava Shwartsman  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27d50c55f1SSlava Shwartsman  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28d50c55f1SSlava Shwartsman  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29d50c55f1SSlava Shwartsman  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30d50c55f1SSlava Shwartsman  * SOFTWARE.
31d50c55f1SSlava Shwartsman  */
32d50c55f1SSlava Shwartsman 
33d50c55f1SSlava Shwartsman #include <linux/module.h>
34d50c55f1SSlava Shwartsman #include <dev/mlx5/mlx5_fpga_tools/tools.h>
35d50c55f1SSlava Shwartsman #include <dev/mlx5/mlx5_fpga_tools/tools_char.h>
36d50c55f1SSlava Shwartsman 
37d50c55f1SSlava Shwartsman MODULE_DEPEND(mlx5fpga_tools, linuxkpi, 1, 1, 1);
38d50c55f1SSlava Shwartsman MODULE_DEPEND(mlx5fpga_tools, mlx5, 1, 1, 1);
39d50c55f1SSlava Shwartsman MODULE_DEPEND(mlx5fpga_tools, mlx5fpga, 1, 1, 1);
40d50c55f1SSlava Shwartsman MODULE_VERSION(mlx5fpga_tools, 1);
41d50c55f1SSlava Shwartsman 
42d50c55f1SSlava Shwartsman static void mlx5_fpga_tools_create(struct mlx5_fpga_device *fdev);
43d50c55f1SSlava Shwartsman static int mlx5_fpga_tools_add(struct mlx5_fpga_device *fdev, u32 vid, u16 pid);
44d50c55f1SSlava Shwartsman static void mlx5_fpga_tools_remove(struct mlx5_fpga_device *fdev);
45d50c55f1SSlava Shwartsman static void mlx5_fpga_tools_destroy(struct mlx5_fpga_device *fdev);
46d50c55f1SSlava Shwartsman 
47d50c55f1SSlava Shwartsman struct mlx5_fpga_tools_dev *mlx5_fpga_tools_alloc(struct mlx5_fpga_device *fdev);
48d50c55f1SSlava Shwartsman void mlx5_fpga_tools_free(struct mlx5_fpga_tools_dev *tdev);
49d50c55f1SSlava Shwartsman 
50d50c55f1SSlava Shwartsman static struct mlx5_fpga_client mlx5_fpga_tools_client = {
51d50c55f1SSlava Shwartsman 	.name = MLX5_FPGA_TOOLS_DRIVER_NAME,
52d50c55f1SSlava Shwartsman 	.create = mlx5_fpga_tools_create,
53d50c55f1SSlava Shwartsman 	.add = mlx5_fpga_tools_add,
54d50c55f1SSlava Shwartsman 	.remove = mlx5_fpga_tools_remove,
55d50c55f1SSlava Shwartsman 	.destroy = mlx5_fpga_tools_destroy,
56d50c55f1SSlava Shwartsman };
57d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_alloc(struct mlx5_fpga_device * fdev)58d50c55f1SSlava Shwartsman struct mlx5_fpga_tools_dev *mlx5_fpga_tools_alloc(struct mlx5_fpga_device *fdev)
59d50c55f1SSlava Shwartsman {
60d50c55f1SSlava Shwartsman 	int ret;
61d50c55f1SSlava Shwartsman 	struct mlx5_fpga_tools_dev *tdev;
62d50c55f1SSlava Shwartsman 
63d50c55f1SSlava Shwartsman 	tdev = kzalloc(sizeof(*tdev), GFP_KERNEL);
64d50c55f1SSlava Shwartsman 	if (!tdev)
65d50c55f1SSlava Shwartsman 		goto out;
66d50c55f1SSlava Shwartsman 
67d50c55f1SSlava Shwartsman 	tdev->fdev = fdev;
68d50c55f1SSlava Shwartsman 	sx_init(&tdev->lock, "mlx5fpgat");
69d50c55f1SSlava Shwartsman 	ret = mlx5_fpga_tools_char_add_one(tdev);
70d50c55f1SSlava Shwartsman 	if (ret)
71d50c55f1SSlava Shwartsman 		goto err_free;
72d50c55f1SSlava Shwartsman 
73d50c55f1SSlava Shwartsman 	goto out;
74d50c55f1SSlava Shwartsman 
75d50c55f1SSlava Shwartsman err_free:
76d50c55f1SSlava Shwartsman 	kfree(tdev);
77d50c55f1SSlava Shwartsman 	tdev = NULL;
78d50c55f1SSlava Shwartsman 
79d50c55f1SSlava Shwartsman out:
80d50c55f1SSlava Shwartsman 	return tdev;
81d50c55f1SSlava Shwartsman }
82d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_free(struct mlx5_fpga_tools_dev * tdev)83d50c55f1SSlava Shwartsman void mlx5_fpga_tools_free(struct mlx5_fpga_tools_dev *tdev)
84d50c55f1SSlava Shwartsman {
85d50c55f1SSlava Shwartsman 	mlx5_fpga_tools_char_remove_one(tdev);
86d50c55f1SSlava Shwartsman 	kfree(tdev);
87d50c55f1SSlava Shwartsman }
88d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_create(struct mlx5_fpga_device * fdev)89d50c55f1SSlava Shwartsman static void mlx5_fpga_tools_create(struct mlx5_fpga_device *fdev)
90d50c55f1SSlava Shwartsman {
91d50c55f1SSlava Shwartsman 	struct mlx5_fpga_tools_dev *dev = NULL;
92d50c55f1SSlava Shwartsman 
93d50c55f1SSlava Shwartsman 	dev_dbg(mlx5_fpga_dev(fdev), "tools_create\n");
94d50c55f1SSlava Shwartsman 
95d50c55f1SSlava Shwartsman 	dev = mlx5_fpga_tools_alloc(fdev);
96d50c55f1SSlava Shwartsman 	if (!dev)
97d50c55f1SSlava Shwartsman 		return;
98d50c55f1SSlava Shwartsman 
99d50c55f1SSlava Shwartsman 	mlx5_fpga_client_data_set(fdev, &mlx5_fpga_tools_client, dev);
100d50c55f1SSlava Shwartsman }
101d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_add(struct mlx5_fpga_device * fdev,u32 vid,u16 pid)102d50c55f1SSlava Shwartsman static int mlx5_fpga_tools_add(struct mlx5_fpga_device *fdev, u32 vid, u16 pid)
103d50c55f1SSlava Shwartsman {
104d50c55f1SSlava Shwartsman 	return 0;
105d50c55f1SSlava Shwartsman }
106d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_remove(struct mlx5_fpga_device * fdev)107d50c55f1SSlava Shwartsman static void mlx5_fpga_tools_remove(struct mlx5_fpga_device *fdev)
108d50c55f1SSlava Shwartsman {
109d50c55f1SSlava Shwartsman }
110d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_destroy(struct mlx5_fpga_device * fdev)111d50c55f1SSlava Shwartsman static void mlx5_fpga_tools_destroy(struct mlx5_fpga_device *fdev)
112d50c55f1SSlava Shwartsman {
113d50c55f1SSlava Shwartsman 	struct mlx5_fpga_tools_dev *dev;
114d50c55f1SSlava Shwartsman 
115d50c55f1SSlava Shwartsman 	dev_dbg(mlx5_fpga_dev(fdev), "tools_destroy\n");
116d50c55f1SSlava Shwartsman 
117d50c55f1SSlava Shwartsman 	dev = mlx5_fpga_client_data_get(fdev, &mlx5_fpga_tools_client);
118d50c55f1SSlava Shwartsman 	if (dev)
119d50c55f1SSlava Shwartsman 		mlx5_fpga_tools_free(dev);
120d50c55f1SSlava Shwartsman }
121d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_init(void)122d50c55f1SSlava Shwartsman static int __init mlx5_fpga_tools_init(void)
123d50c55f1SSlava Shwartsman {
124d50c55f1SSlava Shwartsman 	int ret = mlx5_fpga_tools_char_init();
125d50c55f1SSlava Shwartsman 
126d50c55f1SSlava Shwartsman 	if (ret)
127d50c55f1SSlava Shwartsman 		return ret;
128d50c55f1SSlava Shwartsman 	mlx5_fpga_client_register(&mlx5_fpga_tools_client);
129d50c55f1SSlava Shwartsman 	return 0;
130d50c55f1SSlava Shwartsman }
131d50c55f1SSlava Shwartsman 
mlx5_fpga_tools_exit(void)132d50c55f1SSlava Shwartsman static void __exit mlx5_fpga_tools_exit(void)
133d50c55f1SSlava Shwartsman {
134d50c55f1SSlava Shwartsman 	mlx5_fpga_client_unregister(&mlx5_fpga_tools_client);
135d50c55f1SSlava Shwartsman 	mlx5_fpga_tools_char_deinit();
136d50c55f1SSlava Shwartsman }
137d50c55f1SSlava Shwartsman 
138*1866c98eSHans Petter Selasky module_init_order(mlx5_fpga_tools_init, SI_ORDER_SECOND);
139*1866c98eSHans Petter Selasky module_exit_order(mlx5_fpga_tools_exit, SI_ORDER_SECOND);
140