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 
4017347d54SAya Levin void mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev *mdev, void *mkc)
4117347d54SAya Levin {
424d995c1bSSaeed Mahameed 	bool ro_pci_enable = pcie_relaxed_ordering_enabled(mdev->pdev);
4317347d54SAya Levin 	bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write);
4417347d54SAya Levin 	bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read);
4517347d54SAya Levin 
464d995c1bSSaeed Mahameed 	MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_pci_enable && ro_read);
47*ed4b0661SAvihai Horon 	MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_write);
4817347d54SAya Levin }
4917347d54SAya Levin 
500e1e03c0SEmeel Hakim int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey)
51b50d292bSHadar Hen Zion {
52ec22eb53SSaeed Mahameed 	int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
53ec22eb53SSaeed Mahameed 	void *mkc;
54ec22eb53SSaeed Mahameed 	u32 *in;
55b50d292bSHadar Hen Zion 	int err;
56b50d292bSHadar Hen Zion 
571b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
58b50d292bSHadar Hen Zion 	if (!in)
59b50d292bSHadar Hen Zion 		return -ENOMEM;
60b50d292bSHadar Hen Zion 
61ec22eb53SSaeed Mahameed 	mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
62cdbd0d2bSAriel Levkovich 	MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA);
63ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lw, 1);
64ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, lr, 1);
6517347d54SAya Levin 	mlx5e_mkey_set_relaxed_ordering(mdev, mkc);
66ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, pd, pdn);
67ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, length64, 1);
68ec22eb53SSaeed Mahameed 	MLX5_SET(mkc, mkc, qpn, 0xffffff);
69ec22eb53SSaeed Mahameed 
70ec22eb53SSaeed Mahameed 	err = mlx5_core_create_mkey(mdev, mkey, in, inlen);
71b50d292bSHadar Hen Zion 
72b50d292bSHadar Hen Zion 	kvfree(in);
73b50d292bSHadar Hen Zion 	return err;
74b50d292bSHadar Hen Zion }
75b50d292bSHadar Hen Zion 
76b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev)
77b50d292bSHadar Hen Zion {
78c276aae8SRoi Dayan 	struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;
79b50d292bSHadar Hen Zion 	int err;
80b50d292bSHadar Hen Zion 
81b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_pd(mdev, &res->pdn);
82b50d292bSHadar Hen Zion 	if (err) {
83b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc pd failed, %d\n", err);
8430aa60b3SEli Cohen 		return err;
85b50d292bSHadar Hen Zion 	}
86b50d292bSHadar Hen Zion 
87b50d292bSHadar Hen Zion 	err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn);
88b50d292bSHadar Hen Zion 	if (err) {
89b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "alloc td failed, %d\n", err);
90b50d292bSHadar Hen Zion 		goto err_dealloc_pd;
91b50d292bSHadar Hen Zion 	}
92b50d292bSHadar Hen Zion 
93b50d292bSHadar Hen Zion 	err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey);
94b50d292bSHadar Hen Zion 	if (err) {
95b50d292bSHadar Hen Zion 		mlx5_core_err(mdev, "create mkey failed, %d\n", err);
96b50d292bSHadar Hen Zion 		goto err_dealloc_transport_domain;
97b50d292bSHadar Hen Zion 	}
98b50d292bSHadar Hen Zion 
99aff26157SSaeed Mahameed 	err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false);
100aff26157SSaeed Mahameed 	if (err) {
101aff26157SSaeed Mahameed 		mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err);
102aff26157SSaeed Mahameed 		goto err_destroy_mkey;
103aff26157SSaeed Mahameed 	}
104aff26157SSaeed Mahameed 
105c276aae8SRoi Dayan 	INIT_LIST_HEAD(&res->td.tirs_list);
106c276aae8SRoi Dayan 	mutex_init(&res->td.list_lock);
107724b2aa1SHadar Hen Zion 
108fe298bdfSJianbo Liu 	mdev->mlx5e_res.dek_priv = mlx5_crypto_dek_init(mdev);
109fe298bdfSJianbo Liu 	if (IS_ERR(mdev->mlx5e_res.dek_priv)) {
110fe298bdfSJianbo Liu 		mlx5_core_err(mdev, "crypto dek init failed, %ld\n",
111fe298bdfSJianbo Liu 			      PTR_ERR(mdev->mlx5e_res.dek_priv));
112fe298bdfSJianbo Liu 		mdev->mlx5e_res.dek_priv = NULL;
113fe298bdfSJianbo Liu 	}
114fe298bdfSJianbo Liu 
115b50d292bSHadar Hen Zion 	return 0;
116b50d292bSHadar Hen Zion 
117aff26157SSaeed Mahameed err_destroy_mkey:
11883fec3f1SAharon Landau 	mlx5_core_destroy_mkey(mdev, res->mkey);
119b50d292bSHadar Hen Zion err_dealloc_transport_domain:
120b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
121b50d292bSHadar Hen Zion err_dealloc_pd:
122b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
123b50d292bSHadar Hen Zion 	return err;
124b50d292bSHadar Hen Zion }
125b50d292bSHadar Hen Zion 
126b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev)
127b50d292bSHadar Hen Zion {
128c276aae8SRoi Dayan 	struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs;
129b50d292bSHadar Hen Zion 
130fe298bdfSJianbo Liu 	mlx5_crypto_dek_cleanup(mdev->mlx5e_res.dek_priv);
131fe298bdfSJianbo Liu 	mdev->mlx5e_res.dek_priv = NULL;
132aff26157SSaeed Mahameed 	mlx5_free_bfreg(mdev, &res->bfreg);
13383fec3f1SAharon Landau 	mlx5_core_destroy_mkey(mdev, res->mkey);
134b50d292bSHadar Hen Zion 	mlx5_core_dealloc_transport_domain(mdev, res->td.tdn);
135b50d292bSHadar Hen Zion 	mlx5_core_dealloc_pd(mdev, res->pdn);
136b5ae5777SAlex Vesker 	memset(res, 0, sizeof(*res));
137b50d292bSHadar Hen Zion }
138724b2aa1SHadar Hen Zion 
13980639b19SErez Shitrit int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb,
14080639b19SErez Shitrit 		       bool enable_mc_lb)
141724b2aa1SHadar Hen Zion {
142b676f653SSaeed Mahameed 	struct mlx5_core_dev *mdev = priv->mdev;
143724b2aa1SHadar Hen Zion 	struct mlx5e_tir *tir;
14480639b19SErez Shitrit 	u8 lb_flags = 0;
145bc87a003SGavi Teitz 	int err  = 0;
146b676f653SSaeed Mahameed 	u32 tirn = 0;
147724b2aa1SHadar Hen Zion 	int inlen;
148b676f653SSaeed Mahameed 	void *in;
149b676f653SSaeed Mahameed 
150724b2aa1SHadar Hen Zion 	inlen = MLX5_ST_SZ_BYTES(modify_tir_in);
1511b9a07eeSLeon Romanovsky 	in = kvzalloc(inlen, GFP_KERNEL);
152bc87a003SGavi Teitz 	if (!in) {
153bc87a003SGavi Teitz 		err = -ENOMEM;
154b676f653SSaeed Mahameed 		goto out;
155bc87a003SGavi Teitz 	}
156724b2aa1SHadar Hen Zion 
1570952da79SSaeed Mahameed 	if (enable_uc_lb)
15880639b19SErez Shitrit 		lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST;
15980639b19SErez Shitrit 
16080639b19SErez Shitrit 	if (enable_mc_lb)
16180639b19SErez Shitrit 		lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST;
16280639b19SErez Shitrit 
16380639b19SErez Shitrit 	if (lb_flags)
16480639b19SErez Shitrit 		MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags);
1650952da79SSaeed Mahameed 
166724b2aa1SHadar Hen Zion 	MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1);
167724b2aa1SHadar Hen Zion 
168c276aae8SRoi Dayan 	mutex_lock(&mdev->mlx5e_res.hw_objs.td.list_lock);
169c276aae8SRoi Dayan 	list_for_each_entry(tir, &mdev->mlx5e_res.hw_objs.td.tirs_list, list) {
170b676f653SSaeed Mahameed 		tirn = tir->tirn;
171e0b4b472SLeon Romanovsky 		err = mlx5_core_modify_tir(mdev, tirn, in);
172724b2aa1SHadar Hen Zion 		if (err)
173bf50082cSKamal Heib 			goto out;
174724b2aa1SHadar Hen Zion 	}
175724b2aa1SHadar Hen Zion 
176bf50082cSKamal Heib out:
177724b2aa1SHadar Hen Zion 	kvfree(in);
178b676f653SSaeed Mahameed 	if (err)
179b676f653SSaeed Mahameed 		netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err);
180c276aae8SRoi Dayan 	mutex_unlock(&mdev->mlx5e_res.hw_objs.td.list_lock);
181724b2aa1SHadar Hen Zion 
182bf50082cSKamal Heib 	return err;
183724b2aa1SHadar Hen Zion }
184