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"
34fe298bdfSJianbo Liu #include "lib/crypto.h"
35b50d292bSHadar Hen Zion 
36b50d292bSHadar Hen Zion /* mlx5e global resources should be placed in this file.
3739c538d6SCai Huoqing  * Global resources are common to all the netdevices created on the same nic.
38b50d292bSHadar Hen Zion  */
39b50d292bSHadar Hen Zion 
mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev * mdev,void * mkc)4017347d54SAya Levin void mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev *mdev, void *mkc)
4117347d54SAya Levin {
4217347d54SAya Levin 	bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write);
43bd4ba605SAvihai Horon 	bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read) ||
44bd4ba605SAvihai Horon 		       (pcie_relaxed_ordering_enabled(mdev->pdev) &&
45bd4ba605SAvihai Horon 			MLX5_CAP_GEN(mdev, relaxed_ordering_read_pci_enabled));
4617347d54SAya Levin 
47bd4ba605SAvihai Horon 	MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_read);
48ed4b0661SAvihai Horon 	MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_write);
4917347d54SAya Levin }
5017347d54SAya Levin 
mlx5e_create_mkey(struct mlx5_core_dev * mdev,u32 pdn,u32 * mkey)510e1e03c0SEmeel Hakim int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey)
52b50d292bSHadar Hen Zion {
53ec22eb53SSaeed Mahameed 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
54ec22eb53SSaeed Mahameed 	void *mkc;
55ec22eb53SSaeed Mahameed 	u32 *in;
56b50d292bSHadar Hen Zion 	int err;
57b50d292bSHadar Hen Zion 
581b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
59b50d292bSHadar Hen Zion 	if (!in)
60b50d292bSHadar Hen Zion 		return -ENOMEM;
61b50d292bSHadar Hen Zion 
62ec22eb53SSaeed Mahameed 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
63cdbd0d2bSAriel Levkovich 	MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
64ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lw, 1);
65ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lr, 1);
6617347d54SAya Levin 	mlx5e_mkey_set_relaxed_ordering(mdev, mkc);
67ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, pd, pdn);
68ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, length64, 1);
69ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
70ec22eb53SSaeed Mahameed 
71ec22eb53SSaeed Mahameed 	err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
72b50d292bSHadar Hen Zion 
73b50d292bSHadar Hen Zion 	kvfree(in);
74b50d292bSHadar Hen Zion 	return err;
75b50d292bSHadar Hen Zion }
76b50d292bSHadar Hen Zion 
mlx5e_create_mdev_resources(struct mlx5_core_dev * mdev)77b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
78b50d292bSHadar Hen Zion {
79c276aae8SRoi Dayan 	struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;
80b50d292bSHadar Hen Zion 	int err;
81b50d292bSHadar Hen Zion 
82b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_pd(mdev, &res->pdn);
83b50d292bSHadar Hen Zion 	if (err) {
84b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
8530aa60b3SEli Cohen 		return err;
86b50d292bSHadar Hen Zion 	}
87b50d292bSHadar Hen Zion 
88b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
89b50d292bSHadar Hen Zion 	if (err) {
90b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc td failed, %d\n", err);
91b50d292bSHadar Hen Zion 		goto err_dealloc_pd;
92b50d292bSHadar Hen Zion 	}
93b50d292bSHadar Hen Zion 
94b50d292bSHadar Hen Zion 	err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey);
95b50d292bSHadar Hen Zion 	if (err) {
96b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "create mkey failed, %d\n", err);
97b50d292bSHadar Hen Zion 		goto err_dealloc_transport_domain;
98b50d292bSHadar Hen Zion 	}
99b50d292bSHadar Hen Zion 
100aff26157SSaeed Mahameed 	err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false);
101aff26157SSaeed Mahameed 	if (err) {
102aff26157SSaeed Mahameed 		mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err);
103aff26157SSaeed Mahameed 		goto err_destroy_mkey;
104aff26157SSaeed Mahameed 	}
105aff26157SSaeed Mahameed 
106c276aae8SRoi Dayan 	INIT_LIST_HEAD(&res->td.tirs_list);
107c276aae8SRoi Dayan 	mutex_init(&res->td.list_lock);
108724b2aa1SHadar Hen Zion 
109fe298bdfSJianbo Liu 	mdev->mlx5e_res.dek_priv = mlx5_crypto_dek_init(mdev);
110fe298bdfSJianbo Liu 	if (IS_ERR(mdev->mlx5e_res.dek_priv)) {
111fe298bdfSJianbo Liu 		mlx5_core_err(mdev, "crypto dek init failed, %ld\n",
112fe298bdfSJianbo Liu 			      PTR_ERR(mdev->mlx5e_res.dek_priv));
113fe298bdfSJianbo Liu 		mdev->mlx5e_res.dek_priv = NULL;
114fe298bdfSJianbo Liu 	}
115fe298bdfSJianbo Liu 
116b50d292bSHadar Hen Zion 	return 0;
117b50d292bSHadar Hen Zion 
118aff26157SSaeed Mahameed err_destroy_mkey:
11983fec3f1SAharon Landau 	mlx5_core_destroy_mkey(mdev, res->mkey);
120b50d292bSHadar Hen Zion err_dealloc_transport_domain:
121b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
122b50d292bSHadar Hen Zion err_dealloc_pd:
123b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
124b50d292bSHadar Hen Zion 	return err;
125b50d292bSHadar Hen Zion }
126b50d292bSHadar Hen Zion 
mlx5e_destroy_mdev_resources(struct mlx5_core_dev * mdev)127b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
128b50d292bSHadar Hen Zion {
129c276aae8SRoi Dayan 	struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;
130b50d292bSHadar Hen Zion 
131fe298bdfSJianbo Liu 	mlx5_crypto_dek_cleanup(mdev->mlx5e_res.dek_priv);
132fe298bdfSJianbo Liu 	mdev->mlx5e_res.dek_priv = NULL;
133aff26157SSaeed Mahameed 	mlx5_free_bfreg(mdev, &res->bfreg);
13483fec3f1SAharon Landau 	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);
137b5ae5777SAlex Vesker 	memset(res, 0, sizeof(*res));
138b50d292bSHadar Hen Zion }
139724b2aa1SHadar Hen Zion 
mlx5e_refresh_tirs(struct mlx5e_priv * priv,bool enable_uc_lb,bool enable_mc_lb)14080639b19SErez Shitrit int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
14180639b19SErez Shitrit 		       bool enable_mc_lb)
142724b2aa1SHadar Hen Zion {
143b676f653SSaeed Mahameed 	struct mlx5_core_dev *mdev = priv->mdev;
144724b2aa1SHadar Hen Zion 	struct mlx5e_tir *tir;
14580639b19SErez Shitrit 	u8 lb_flags = 0;
146bc87a003SGavi Teitz 	int err  = 0;
147b676f653SSaeed Mahameed 	u32 tirn = 0;
148724b2aa1SHadar Hen Zion 	int inlen;
149b676f653SSaeed Mahameed 	void *in;
150b676f653SSaeed Mahameed 
151724b2aa1SHadar Hen Zion 	inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
1521b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
153*b6193d70SSaeed Mahameed 	if (!in)
154*b6193d70SSaeed Mahameed 		return -ENOMEM;
155724b2aa1SHadar Hen Zion 
1560952da79SSaeed Mahameed 	if (enable_uc_lb)
15780639b19SErez Shitrit 		lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
15880639b19SErez Shitrit 
15980639b19SErez Shitrit 	if (enable_mc_lb)
16080639b19SErez Shitrit 		lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
16180639b19SErez Shitrit 
16280639b19SErez Shitrit 	if (lb_flags)
16380639b19SErez Shitrit 		MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags);
1640952da79SSaeed Mahameed 
165724b2aa1SHadar Hen Zion 	MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
166724b2aa1SHadar Hen Zion 
167c276aae8SRoi Dayan 	mutex_lock(&mdev->mlx5e_res.hw_objs.td.list_lock);
168c276aae8SRoi Dayan 	list_for_each_entry(tir, &mdev->mlx5e_res.hw_objs.td.tirs_list, list) {
169b676f653SSaeed Mahameed 		tirn = tir->tirn;
170e0b4b472SLeon Romanovsky 		err = mlx5_core_modify_tir(mdev, tirn, in);
171724b2aa1SHadar Hen Zion 		if (err)
172*b6193d70SSaeed Mahameed 			break;
173724b2aa1SHadar Hen Zion 	}
174*b6193d70SSaeed Mahameed 	mutex_unlock(&mdev->mlx5e_res.hw_objs.td.list_lock);
175724b2aa1SHadar Hen Zion 
176724b2aa1SHadar Hen Zion 	kvfree(in);
177b676f653SSaeed Mahameed 	if (err)
178b676f653SSaeed Mahameed 		netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err);
179724b2aa1SHadar Hen Zion 
180bf50082cSKamal Heib 	return err;
181724b2aa1SHadar Hen Zion }
182