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