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 { 4217347d54SAya Levin bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write); 43*bd4ba605SAvihai Horon bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read) || 44*bd4ba605SAvihai Horon (pcie_relaxed_ordering_enabled(mdev->pdev) && 45*bd4ba605SAvihai Horon MLX5_CAP_GEN(mdev, relaxed_ordering_read_pci_enabled)); 4617347d54SAya Levin 47*bd4ba605SAvihai 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 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 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 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 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); 153bc87a003SGavi Teitz if (!in) { 154bc87a003SGavi Teitz err = -ENOMEM; 155b676f653SSaeed Mahameed goto out; 156bc87a003SGavi Teitz } 157724b2aa1SHadar Hen Zion 1580952da79SSaeed Mahameed if (enable_uc_lb) 15980639b19SErez Shitrit lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST; 16080639b19SErez Shitrit 16180639b19SErez Shitrit if (enable_mc_lb) 16280639b19SErez Shitrit lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST; 16380639b19SErez Shitrit 16480639b19SErez Shitrit if (lb_flags) 16580639b19SErez Shitrit MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags); 1660952da79SSaeed Mahameed 167724b2aa1SHadar Hen Zion MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1); 168724b2aa1SHadar Hen Zion 169c276aae8SRoi Dayan mutex_lock(&mdev->mlx5e_res.hw_objs.td.list_lock); 170c276aae8SRoi Dayan list_for_each_entry(tir, &mdev->mlx5e_res.hw_objs.td.tirs_list, list) { 171b676f653SSaeed Mahameed tirn = tir->tirn; 172e0b4b472SLeon Romanovsky err = mlx5_core_modify_tir(mdev, tirn, in); 173724b2aa1SHadar Hen Zion if (err) 174bf50082cSKamal Heib goto out; 175724b2aa1SHadar Hen Zion } 176724b2aa1SHadar Hen Zion 177bf50082cSKamal Heib out: 178724b2aa1SHadar Hen Zion kvfree(in); 179b676f653SSaeed Mahameed if (err) 180b676f653SSaeed Mahameed netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err); 181c276aae8SRoi Dayan mutex_unlock(&mdev->mlx5e_res.hw_objs.td.list_lock); 182724b2aa1SHadar Hen Zion 183bf50082cSKamal Heib return err; 184724b2aa1SHadar Hen Zion } 185