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 
39e0b4b472SLeon Romanovsky int mlx5e_create_tir(struct mlx5_core_dev *mdev, struct mlx5e_tir *tir, u32 *in)
40724b2aa1SHadar Hen Zion {
41724b2aa1SHadar Hen Zion 	int err;
42724b2aa1SHadar Hen Zion 
43e0b4b472SLeon Romanovsky 	err = mlx5_core_create_tir(mdev, in, &tir->tirn);
44724b2aa1SHadar Hen Zion 	if (err)
45724b2aa1SHadar Hen Zion 		return err;
46724b2aa1SHadar Hen Zion 
4780a2a902SYuval Avnery 	mutex_lock(&mdev->mlx5e_res.td.list_lock);
48724b2aa1SHadar Hen Zion 	list_add(&tir->list, &mdev->mlx5e_res.td.tirs_list);
4980a2a902SYuval Avnery 	mutex_unlock(&mdev->mlx5e_res.td.list_lock);
50724b2aa1SHadar Hen Zion 
51724b2aa1SHadar Hen Zion 	return 0;
52724b2aa1SHadar Hen Zion }
53724b2aa1SHadar Hen Zion 
54724b2aa1SHadar Hen Zion void mlx5e_destroy_tir(struct mlx5_core_dev *mdev,
55724b2aa1SHadar Hen Zion 		       struct mlx5e_tir *tir)
56724b2aa1SHadar Hen Zion {
5780a2a902SYuval Avnery 	mutex_lock(&mdev->mlx5e_res.td.list_lock);
58724b2aa1SHadar Hen Zion 	mlx5_core_destroy_tir(mdev, tir->tirn);
59724b2aa1SHadar Hen Zion 	list_del(&tir->list);
6080a2a902SYuval Avnery 	mutex_unlock(&mdev->mlx5e_res.td.list_lock);
61724b2aa1SHadar Hen Zion }
62724b2aa1SHadar Hen Zion 
63b50d292bSHadar Hen Zion static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
64b50d292bSHadar Hen Zion 			     struct mlx5_core_mkey *mkey)
65b50d292bSHadar Hen Zion {
66ec22eb53SSaeed Mahameed 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
67ec22eb53SSaeed Mahameed 	void *mkc;
68ec22eb53SSaeed Mahameed 	u32 *in;
69b50d292bSHadar Hen Zion 	int err;
70b50d292bSHadar Hen Zion 
711b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
72b50d292bSHadar Hen Zion 	if (!in)
73b50d292bSHadar Hen Zion 		return -ENOMEM;
74b50d292bSHadar Hen Zion 
75ec22eb53SSaeed Mahameed 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
76cdbd0d2bSAriel Levkovich 	MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
77ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lw, 1);
78ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lr, 1);
79b50d292bSHadar Hen Zion 
80ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, pd, pdn);
81ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, length64, 1);
82ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
83ec22eb53SSaeed Mahameed 
84ec22eb53SSaeed Mahameed 	err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
85b50d292bSHadar Hen Zion 
86b50d292bSHadar Hen Zion 	kvfree(in);
87b50d292bSHadar Hen Zion 	return err;
88b50d292bSHadar Hen Zion }
89b50d292bSHadar Hen Zion 
90b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
91b50d292bSHadar Hen Zion {
92b50d292bSHadar Hen Zion 	struct mlx5e_resources *res = &mdev->mlx5e_res;
93b50d292bSHadar Hen Zion 	int err;
94b50d292bSHadar Hen Zion 
95b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_pd(mdev, &res->pdn);
96b50d292bSHadar Hen Zion 	if (err) {
97b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
9830aa60b3SEli Cohen 		return err;
99b50d292bSHadar Hen Zion 	}
100b50d292bSHadar Hen Zion 
101b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
102b50d292bSHadar Hen Zion 	if (err) {
103b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc td failed, %d\n", err);
104b50d292bSHadar Hen Zion 		goto err_dealloc_pd;
105b50d292bSHadar Hen Zion 	}
106b50d292bSHadar Hen Zion 
107b50d292bSHadar Hen Zion 	err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey);
108b50d292bSHadar Hen Zion 	if (err) {
109b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "create mkey failed, %d\n", err);
110b50d292bSHadar Hen Zion 		goto err_dealloc_transport_domain;
111b50d292bSHadar Hen Zion 	}
112b50d292bSHadar Hen Zion 
113aff26157SSaeed Mahameed 	err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false);
114aff26157SSaeed Mahameed 	if (err) {
115aff26157SSaeed Mahameed 		mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err);
116aff26157SSaeed Mahameed 		goto err_destroy_mkey;
117aff26157SSaeed Mahameed 	}
118aff26157SSaeed Mahameed 
119724b2aa1SHadar Hen Zion 	INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list);
12080a2a902SYuval Avnery 	mutex_init(&mdev->mlx5e_res.td.list_lock);
121724b2aa1SHadar Hen Zion 
122b50d292bSHadar Hen Zion 	return 0;
123b50d292bSHadar Hen Zion 
124aff26157SSaeed Mahameed err_destroy_mkey:
125aff26157SSaeed Mahameed 	mlx5_core_destroy_mkey(mdev, &res->mkey);
126b50d292bSHadar Hen Zion err_dealloc_transport_domain:
127b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
128b50d292bSHadar Hen Zion err_dealloc_pd:
129b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
130b50d292bSHadar Hen Zion 	return err;
131b50d292bSHadar Hen Zion }
132b50d292bSHadar Hen Zion 
133b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
134b50d292bSHadar Hen Zion {
135b50d292bSHadar Hen Zion 	struct mlx5e_resources *res = &mdev->mlx5e_res;
136b50d292bSHadar Hen Zion 
137aff26157SSaeed Mahameed 	mlx5_free_bfreg(mdev, &res->bfreg);
138b50d292bSHadar Hen Zion 	mlx5_core_destroy_mkey(mdev, &res->mkey);
139b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
140b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
141b5ae5777SAlex Vesker 	memset(res, 0, sizeof(*res));
142b50d292bSHadar Hen Zion }
143724b2aa1SHadar Hen Zion 
14480639b19SErez Shitrit int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
14580639b19SErez Shitrit 		       bool enable_mc_lb)
146724b2aa1SHadar Hen Zion {
147b676f653SSaeed Mahameed 	struct mlx5_core_dev *mdev = priv->mdev;
148724b2aa1SHadar Hen Zion 	struct mlx5e_tir *tir;
14980639b19SErez Shitrit 	u8 lb_flags = 0;
150bc87a003SGavi Teitz 	int err  = 0;
151b676f653SSaeed Mahameed 	u32 tirn = 0;
152724b2aa1SHadar Hen Zion 	int inlen;
153b676f653SSaeed Mahameed 	void *in;
154b676f653SSaeed Mahameed 
155724b2aa1SHadar Hen Zion 	inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
1561b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
157bc87a003SGavi Teitz 	if (!in) {
158bc87a003SGavi Teitz 		err = -ENOMEM;
159b676f653SSaeed Mahameed 		goto out;
160bc87a003SGavi Teitz 	}
161724b2aa1SHadar Hen Zion 
1620952da79SSaeed Mahameed 	if (enable_uc_lb)
16380639b19SErez Shitrit 		lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
16480639b19SErez Shitrit 
16580639b19SErez Shitrit 	if (enable_mc_lb)
16680639b19SErez Shitrit 		lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
16780639b19SErez Shitrit 
16880639b19SErez Shitrit 	if (lb_flags)
16980639b19SErez Shitrit 		MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags);
1700952da79SSaeed Mahameed 
171724b2aa1SHadar Hen Zion 	MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
172724b2aa1SHadar Hen Zion 
17380a2a902SYuval Avnery 	mutex_lock(&mdev->mlx5e_res.td.list_lock);
174724b2aa1SHadar Hen Zion 	list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) {
175b676f653SSaeed Mahameed 		tirn = tir->tirn;
176e0b4b472SLeon Romanovsky 		err = mlx5_core_modify_tir(mdev, tirn, in);
177724b2aa1SHadar Hen Zion 		if (err)
178bf50082cSKamal Heib 			goto out;
179724b2aa1SHadar Hen Zion 	}
180724b2aa1SHadar Hen Zion 
181bf50082cSKamal Heib out:
182724b2aa1SHadar Hen Zion 	kvfree(in);
183b676f653SSaeed Mahameed 	if (err)
184b676f653SSaeed Mahameed 		netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err);
18580a2a902SYuval Avnery 	mutex_unlock(&mdev->mlx5e_res.td.list_lock);
186724b2aa1SHadar Hen Zion 
187bf50082cSKamal Heib 	return err;
188724b2aa1SHadar Hen Zion }
189