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