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 
6317347d54SAya Levin void mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev *mdev, void *mkc)
6417347d54SAya Levin {
6517347d54SAya Levin 	bool ro_pci_enable = pcie_relaxed_ordering_enabled(mdev->pdev);
6617347d54SAya Levin 	bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write);
6717347d54SAya Levin 	bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read);
6817347d54SAya Levin 
6917347d54SAya Levin 	MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_pci_enable && ro_read);
7017347d54SAya Levin 	MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_pci_enable && ro_write);
7117347d54SAya Levin }
7217347d54SAya Levin 
73b50d292bSHadar Hen Zion static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn,
74b50d292bSHadar Hen Zion 			     struct mlx5_core_mkey *mkey)
75b50d292bSHadar Hen Zion {
76ec22eb53SSaeed Mahameed 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
77ec22eb53SSaeed Mahameed 	void *mkc;
78ec22eb53SSaeed Mahameed 	u32 *in;
79b50d292bSHadar Hen Zion 	int err;
80b50d292bSHadar Hen Zion 
811b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
82b50d292bSHadar Hen Zion 	if (!in)
83b50d292bSHadar Hen Zion 		return -ENOMEM;
84b50d292bSHadar Hen Zion 
85ec22eb53SSaeed Mahameed 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
86cdbd0d2bSAriel Levkovich 	MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
87ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lw, 1);
88ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lr, 1);
8917347d54SAya Levin 	mlx5e_mkey_set_relaxed_ordering(mdev, mkc);
90ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, pd, pdn);
91ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, length64, 1);
92ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
93ec22eb53SSaeed Mahameed 
94ec22eb53SSaeed Mahameed 	err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
95b50d292bSHadar Hen Zion 
96b50d292bSHadar Hen Zion 	kvfree(in);
97b50d292bSHadar Hen Zion 	return err;
98b50d292bSHadar Hen Zion }
99b50d292bSHadar Hen Zion 
100b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
101b50d292bSHadar Hen Zion {
102b50d292bSHadar Hen Zion 	struct mlx5e_resources *res = &mdev->mlx5e_res;
103b50d292bSHadar Hen Zion 	int err;
104b50d292bSHadar Hen Zion 
105b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_pd(mdev, &res->pdn);
106b50d292bSHadar Hen Zion 	if (err) {
107b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
10830aa60b3SEli Cohen 		return err;
109b50d292bSHadar Hen Zion 	}
110b50d292bSHadar Hen Zion 
111b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
112b50d292bSHadar Hen Zion 	if (err) {
113b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc td failed, %d\n", err);
114b50d292bSHadar Hen Zion 		goto err_dealloc_pd;
115b50d292bSHadar Hen Zion 	}
116b50d292bSHadar Hen Zion 
117b50d292bSHadar Hen Zion 	err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey);
118b50d292bSHadar Hen Zion 	if (err) {
119b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "create mkey failed, %d\n", err);
120b50d292bSHadar Hen Zion 		goto err_dealloc_transport_domain;
121b50d292bSHadar Hen Zion 	}
122b50d292bSHadar Hen Zion 
123aff26157SSaeed Mahameed 	err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false);
124aff26157SSaeed Mahameed 	if (err) {
125aff26157SSaeed Mahameed 		mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err);
126aff26157SSaeed Mahameed 		goto err_destroy_mkey;
127aff26157SSaeed Mahameed 	}
128aff26157SSaeed Mahameed 
129724b2aa1SHadar Hen Zion 	INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list);
13080a2a902SYuval Avnery 	mutex_init(&mdev->mlx5e_res.td.list_lock);
131724b2aa1SHadar Hen Zion 
132b50d292bSHadar Hen Zion 	return 0;
133b50d292bSHadar Hen Zion 
134aff26157SSaeed Mahameed err_destroy_mkey:
135aff26157SSaeed Mahameed 	mlx5_core_destroy_mkey(mdev, &res->mkey);
136b50d292bSHadar Hen Zion err_dealloc_transport_domain:
137b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
138b50d292bSHadar Hen Zion err_dealloc_pd:
139b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
140b50d292bSHadar Hen Zion 	return err;
141b50d292bSHadar Hen Zion }
142b50d292bSHadar Hen Zion 
143b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
144b50d292bSHadar Hen Zion {
145b50d292bSHadar Hen Zion 	struct mlx5e_resources *res = &mdev->mlx5e_res;
146b50d292bSHadar Hen Zion 
147aff26157SSaeed Mahameed 	mlx5_free_bfreg(mdev, &res->bfreg);
148b50d292bSHadar Hen Zion 	mlx5_core_destroy_mkey(mdev, &res->mkey);
149b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
150b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
151b5ae5777SAlex Vesker 	memset(res, 0, sizeof(*res));
152b50d292bSHadar Hen Zion }
153724b2aa1SHadar Hen Zion 
15480639b19SErez Shitrit int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
15580639b19SErez Shitrit 		       bool enable_mc_lb)
156724b2aa1SHadar Hen Zion {
157b676f653SSaeed Mahameed 	struct mlx5_core_dev *mdev = priv->mdev;
158724b2aa1SHadar Hen Zion 	struct mlx5e_tir *tir;
15980639b19SErez Shitrit 	u8 lb_flags = 0;
160bc87a003SGavi Teitz 	int err  = 0;
161b676f653SSaeed Mahameed 	u32 tirn = 0;
162724b2aa1SHadar Hen Zion 	int inlen;
163b676f653SSaeed Mahameed 	void *in;
164b676f653SSaeed Mahameed 
165724b2aa1SHadar Hen Zion 	inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
1661b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
167bc87a003SGavi Teitz 	if (!in) {
168bc87a003SGavi Teitz 		err = -ENOMEM;
169b676f653SSaeed Mahameed 		goto out;
170bc87a003SGavi Teitz 	}
171724b2aa1SHadar Hen Zion 
1720952da79SSaeed Mahameed 	if (enable_uc_lb)
17380639b19SErez Shitrit 		lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
17480639b19SErez Shitrit 
17580639b19SErez Shitrit 	if (enable_mc_lb)
17680639b19SErez Shitrit 		lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
17780639b19SErez Shitrit 
17880639b19SErez Shitrit 	if (lb_flags)
17980639b19SErez Shitrit 		MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags);
1800952da79SSaeed Mahameed 
181724b2aa1SHadar Hen Zion 	MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
182724b2aa1SHadar Hen Zion 
18380a2a902SYuval Avnery 	mutex_lock(&mdev->mlx5e_res.td.list_lock);
184724b2aa1SHadar Hen Zion 	list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) {
185b676f653SSaeed Mahameed 		tirn = tir->tirn;
186e0b4b472SLeon Romanovsky 		err = mlx5_core_modify_tir(mdev, tirn, in);
187724b2aa1SHadar Hen Zion 		if (err)
188bf50082cSKamal Heib 			goto out;
189724b2aa1SHadar Hen Zion 	}
190724b2aa1SHadar Hen Zion 
191bf50082cSKamal Heib out:
192724b2aa1SHadar Hen Zion 	kvfree(in);
193b676f653SSaeed Mahameed 	if (err)
194b676f653SSaeed Mahameed 		netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err);
19580a2a902SYuval Avnery 	mutex_unlock(&mdev->mlx5e_res.td.list_lock);
196724b2aa1SHadar Hen Zion 
197bf50082cSKamal Heib 	return err;
198724b2aa1SHadar Hen Zion }
199