1b50d292bSHadar Hen Zion /*
2b50d292bSHadar Hen Zion  * Copyright (c) 2016, Mellanox Technologies. All rights reserved.
3b50d292bSHadar Hen Zion  *
4b50d292bSHadar Hen Zion  * This software is available to you under a choice of one of two
5b50d292bSHadar Hen Zion  * licenses.  You may choose to be licensed under the terms of the GNU
6b50d292bSHadar Hen Zion  * General Public License (GPL) Version 2, available from the file
7b50d292bSHadar Hen Zion  * COPYING in the main directory of this source tree, or the
8b50d292bSHadar Hen Zion  * OpenIB.org BSD license below:
9b50d292bSHadar Hen Zion  *
10b50d292bSHadar Hen Zion  *     Redistribution and use in source and binary forms, with or
11b50d292bSHadar Hen Zion  *     without modification, are permitted provided that the following
12b50d292bSHadar Hen Zion  *     conditions are met:
13b50d292bSHadar Hen Zion  *
14b50d292bSHadar Hen Zion  *      - Redistributions of source code must retain the above
15b50d292bSHadar Hen Zion  *        copyright notice, this list of conditions and the following
16b50d292bSHadar Hen Zion  *        disclaimer.
17b50d292bSHadar Hen Zion  *
18b50d292bSHadar Hen Zion  *      - Redistributions in binary form must reproduce the above
19b50d292bSHadar Hen Zion  *        copyright notice, this list of conditions and the following
20b50d292bSHadar Hen Zion  *        disclaimer in the documentation and/or other materials
21b50d292bSHadar Hen Zion  *        provided with the distribution.
22b50d292bSHadar Hen Zion  *
23b50d292bSHadar Hen Zion  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24b50d292bSHadar Hen Zion  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25b50d292bSHadar Hen Zion  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26b50d292bSHadar Hen Zion  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27b50d292bSHadar Hen Zion  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28b50d292bSHadar Hen Zion  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29b50d292bSHadar Hen Zion  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30b50d292bSHadar Hen Zion  * SOFTWARE.
31b50d292bSHadar Hen Zion  */
32b50d292bSHadar Hen Zion 
33b50d292bSHadar Hen Zion #include "en.h"
34b50d292bSHadar Hen Zion 
35b50d292bSHadar Hen Zion /* mlx5e global resources should be placed in this file.
36b50d292bSHadar Hen Zion  * Global resources are common to all the netdevices crated on the same nic.
37b50d292bSHadar Hen Zion  */
38b50d292bSHadar Hen Zion 
39724b2aa1SHadar Hen Zion int mlx5e_create_tir(struct mlx5_core_dev *mdev,
40724b2aa1SHadar Hen Zion 		     struct mlx5e_tir *tir, u32 *in, int inlen)
41724b2aa1SHadar Hen Zion {
42724b2aa1SHadar Hen Zion 	int err;
43724b2aa1SHadar Hen Zion 
44724b2aa1SHadar Hen Zion 	err = mlx5_core_create_tir(mdev, in, inlen, &tir->tirn);
45724b2aa1SHadar Hen Zion 	if (err)
46724b2aa1SHadar Hen Zion 		return err;
47724b2aa1SHadar Hen Zion 
48724b2aa1SHadar Hen Zion 	list_add(&tir->list, &mdev->mlx5e_res.td.tirs_list);
49724b2aa1SHadar Hen Zion 
50724b2aa1SHadar Hen Zion 	return 0;
51724b2aa1SHadar Hen Zion }
52724b2aa1SHadar Hen Zion 
53724b2aa1SHadar Hen Zion void mlx5e_destroy_tir(struct mlx5_core_dev *mdev,
54724b2aa1SHadar Hen Zion 		       struct mlx5e_tir *tir)
55724b2aa1SHadar Hen Zion {
56724b2aa1SHadar Hen Zion 	mlx5_core_destroy_tir(mdev, tir->tirn);
57724b2aa1SHadar Hen Zion 	list_del(&tir->list);
58724b2aa1SHadar Hen Zion }
59724b2aa1SHadar Hen Zion 
60b50d292bSHadar Hen Zion static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
61b50d292bSHadar Hen Zion 			     struct mlx5_core_mkey *mkey)
62b50d292bSHadar Hen Zion {
63ec22eb53SSaeed Mahameed 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
64ec22eb53SSaeed Mahameed 	void *mkc;
65ec22eb53SSaeed Mahameed 	u32 *in;
66b50d292bSHadar Hen Zion 	int err;
67b50d292bSHadar Hen Zion 
68ec22eb53SSaeed Mahameed 	in = mlx5_vzalloc(inlen);
69b50d292bSHadar Hen Zion 	if (!in)
70b50d292bSHadar Hen Zion 		return -ENOMEM;
71b50d292bSHadar Hen Zion 
72ec22eb53SSaeed Mahameed 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
73ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_PA);
74ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lw, 1);
75ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lr, 1);
76b50d292bSHadar Hen Zion 
77ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, pd, pdn);
78ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, length64, 1);
79ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
80ec22eb53SSaeed Mahameed 
81ec22eb53SSaeed Mahameed 	err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
82b50d292bSHadar Hen Zion 
83b50d292bSHadar Hen Zion 	kvfree(in);
84b50d292bSHadar Hen Zion 	return err;
85b50d292bSHadar Hen Zion }
86b50d292bSHadar Hen Zion 
87b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
88b50d292bSHadar Hen Zion {
89b50d292bSHadar Hen Zion 	struct mlx5e_resources *res = &mdev->mlx5e_res;
90b50d292bSHadar Hen Zion 	int err;
91b50d292bSHadar Hen Zion 
92b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_pd(mdev, &res->pdn);
93b50d292bSHadar Hen Zion 	if (err) {
94b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
9530aa60b3SEli Cohen 		return err;
96b50d292bSHadar Hen Zion 	}
97b50d292bSHadar Hen Zion 
98b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
99b50d292bSHadar Hen Zion 	if (err) {
100b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc td failed, %d\n", err);
101b50d292bSHadar Hen Zion 		goto err_dealloc_pd;
102b50d292bSHadar Hen Zion 	}
103b50d292bSHadar Hen Zion 
104b50d292bSHadar Hen Zion 	err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey);
105b50d292bSHadar Hen Zion 	if (err) {
106b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "create mkey failed, %d\n", err);
107b50d292bSHadar Hen Zion 		goto err_dealloc_transport_domain;
108b50d292bSHadar Hen Zion 	}
109b50d292bSHadar Hen Zion 
110aff26157SSaeed Mahameed 	err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false);
111aff26157SSaeed Mahameed 	if (err) {
112aff26157SSaeed Mahameed 		mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err);
113aff26157SSaeed Mahameed 		goto err_destroy_mkey;
114aff26157SSaeed Mahameed 	}
115aff26157SSaeed Mahameed 
116724b2aa1SHadar Hen Zion 	INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list);
117724b2aa1SHadar Hen Zion 
118b50d292bSHadar Hen Zion 	return 0;
119b50d292bSHadar Hen Zion 
120aff26157SSaeed Mahameed err_destroy_mkey:
121aff26157SSaeed Mahameed 	mlx5_core_destroy_mkey(mdev, &res->mkey);
122b50d292bSHadar Hen Zion err_dealloc_transport_domain:
123b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
124b50d292bSHadar Hen Zion err_dealloc_pd:
125b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
126b50d292bSHadar Hen Zion 	return err;
127b50d292bSHadar Hen Zion }
128b50d292bSHadar Hen Zion 
129b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
130b50d292bSHadar Hen Zion {
131b50d292bSHadar Hen Zion 	struct mlx5e_resources *res = &mdev->mlx5e_res;
132b50d292bSHadar Hen Zion 
133aff26157SSaeed Mahameed 	mlx5_free_bfreg(mdev, &res->bfreg);
134b50d292bSHadar Hen Zion 	mlx5_core_destroy_mkey(mdev, &res->mkey);
135b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
136b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
137b50d292bSHadar Hen Zion }
138724b2aa1SHadar Hen Zion 
1390952da79SSaeed Mahameed int mlx5e_refresh_tirs_self_loopback(struct mlx5_core_dev *mdev,
1400952da79SSaeed Mahameed 				     bool enable_uc_lb)
141724b2aa1SHadar Hen Zion {
142724b2aa1SHadar Hen Zion 	struct mlx5e_tir *tir;
143724b2aa1SHadar Hen Zion 	void *in;
144724b2aa1SHadar Hen Zion 	int inlen;
145bf50082cSKamal Heib 	int err = 0;
146724b2aa1SHadar Hen Zion 
147724b2aa1SHadar Hen Zion 	inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
148724b2aa1SHadar Hen Zion 	in = mlx5_vzalloc(inlen);
149724b2aa1SHadar Hen Zion 	if (!in)
150724b2aa1SHadar Hen Zion 		return -ENOMEM;
151724b2aa1SHadar Hen Zion 
1520952da79SSaeed Mahameed 	if (enable_uc_lb)
1530952da79SSaeed Mahameed 		MLX5_SET(modify_tir_in, in, ctx.self_lb_block,
1540952da79SSaeed Mahameed 			 MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_);
1550952da79SSaeed Mahameed 
156724b2aa1SHadar Hen Zion 	MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
157724b2aa1SHadar Hen Zion 
158724b2aa1SHadar Hen Zion 	list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) {
159724b2aa1SHadar Hen Zion 		err = mlx5_core_modify_tir(mdev, tir->tirn, in, inlen);
160724b2aa1SHadar Hen Zion 		if (err)
161bf50082cSKamal Heib 			goto out;
162724b2aa1SHadar Hen Zion 	}
163724b2aa1SHadar Hen Zion 
164bf50082cSKamal Heib out:
165724b2aa1SHadar Hen Zion 	kvfree(in);
166724b2aa1SHadar Hen Zion 
167bf50082cSKamal Heib 	return err;
168724b2aa1SHadar Hen Zion }
169