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 63b50d292bSHadar Hen Zion static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, 64b50d292bSHadar Hen Zion struct mlx5_core_mkey *mkey) 65b50d292bSHadar Hen Zion { 66ec22eb53SSaeed Mahameed int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 67ec22eb53SSaeed Mahameed void *mkc; 68ec22eb53SSaeed Mahameed u32 *in; 69b50d292bSHadar Hen Zion int err; 70b50d292bSHadar Hen Zion 711b9a07eeSLeon Romanovsky in = kvzalloc(inlen, GFP_KERNEL); 72b50d292bSHadar Hen Zion if (!in) 73b50d292bSHadar Hen Zion return -ENOMEM; 74b50d292bSHadar Hen Zion 75ec22eb53SSaeed Mahameed mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 76cdbd0d2bSAriel Levkovich MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA); 77ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, lw, 1); 78ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, lr, 1); 79b50d292bSHadar Hen Zion 80ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, pd, pdn); 81ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, length64, 1); 82ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, qpn, 0xffffff); 83ec22eb53SSaeed Mahameed 84ec22eb53SSaeed Mahameed err = mlx5_core_create_mkey(mdev, mkey, in, inlen); 85b50d292bSHadar Hen Zion 86b50d292bSHadar Hen Zion kvfree(in); 87b50d292bSHadar Hen Zion return err; 88b50d292bSHadar Hen Zion } 89b50d292bSHadar Hen Zion 90b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev) 91b50d292bSHadar Hen Zion { 92b50d292bSHadar Hen Zion struct mlx5e_resources *res = &mdev->mlx5e_res; 93b50d292bSHadar Hen Zion int err; 94b50d292bSHadar Hen Zion 95b50d292bSHadar Hen Zion err = mlx5_core_alloc_pd(mdev, &res->pdn); 96b50d292bSHadar Hen Zion if (err) { 97b50d292bSHadar Hen Zion mlx5_core_err(mdev, "alloc pd failed, %d\n", err); 9830aa60b3SEli Cohen return err; 99b50d292bSHadar Hen Zion } 100b50d292bSHadar Hen Zion 101b50d292bSHadar Hen Zion err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn); 102b50d292bSHadar Hen Zion if (err) { 103b50d292bSHadar Hen Zion mlx5_core_err(mdev, "alloc td failed, %d\n", err); 104b50d292bSHadar Hen Zion goto err_dealloc_pd; 105b50d292bSHadar Hen Zion } 106b50d292bSHadar Hen Zion 107b50d292bSHadar Hen Zion err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey); 108b50d292bSHadar Hen Zion if (err) { 109b50d292bSHadar Hen Zion mlx5_core_err(mdev, "create mkey failed, %d\n", err); 110b50d292bSHadar Hen Zion goto err_dealloc_transport_domain; 111b50d292bSHadar Hen Zion } 112b50d292bSHadar Hen Zion 113aff26157SSaeed Mahameed err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false); 114aff26157SSaeed Mahameed if (err) { 115aff26157SSaeed Mahameed mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err); 116aff26157SSaeed Mahameed goto err_destroy_mkey; 117aff26157SSaeed Mahameed } 118aff26157SSaeed Mahameed 119724b2aa1SHadar Hen Zion INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list); 12080a2a902SYuval Avnery mutex_init(&mdev->mlx5e_res.td.list_lock); 121724b2aa1SHadar Hen Zion 122b50d292bSHadar Hen Zion return 0; 123b50d292bSHadar Hen Zion 124aff26157SSaeed Mahameed err_destroy_mkey: 125aff26157SSaeed Mahameed mlx5_core_destroy_mkey(mdev, &res->mkey); 126b50d292bSHadar Hen Zion err_dealloc_transport_domain: 127b50d292bSHadar Hen Zion mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 128b50d292bSHadar Hen Zion err_dealloc_pd: 129b50d292bSHadar Hen Zion mlx5_core_dealloc_pd(mdev, res->pdn); 130b50d292bSHadar Hen Zion return err; 131b50d292bSHadar Hen Zion } 132b50d292bSHadar Hen Zion 133b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev) 134b50d292bSHadar Hen Zion { 135b50d292bSHadar Hen Zion struct mlx5e_resources *res = &mdev->mlx5e_res; 136b50d292bSHadar Hen Zion 137aff26157SSaeed Mahameed mlx5_free_bfreg(mdev, &res->bfreg); 138b50d292bSHadar Hen Zion mlx5_core_destroy_mkey(mdev, &res->mkey); 139b50d292bSHadar Hen Zion mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 140b50d292bSHadar Hen Zion mlx5_core_dealloc_pd(mdev, res->pdn); 141b5ae5777SAlex Vesker memset(res, 0, sizeof(*res)); 142b50d292bSHadar Hen Zion } 143724b2aa1SHadar Hen Zion 14480639b19SErez Shitrit int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb, 14580639b19SErez Shitrit bool enable_mc_lb) 146724b2aa1SHadar Hen Zion { 147b676f653SSaeed Mahameed struct mlx5_core_dev *mdev = priv->mdev; 148724b2aa1SHadar Hen Zion struct mlx5e_tir *tir; 14980639b19SErez Shitrit u8 lb_flags = 0; 150bc87a003SGavi Teitz int err = 0; 151b676f653SSaeed Mahameed u32 tirn = 0; 152724b2aa1SHadar Hen Zion int inlen; 153b676f653SSaeed Mahameed void *in; 154b676f653SSaeed Mahameed 155724b2aa1SHadar Hen Zion inlen = MLX5_ST_SZ_BYTES(modify_tir_in); 1561b9a07eeSLeon Romanovsky in = kvzalloc(inlen, GFP_KERNEL); 157bc87a003SGavi Teitz if (!in) { 158bc87a003SGavi Teitz err = -ENOMEM; 159b676f653SSaeed Mahameed goto out; 160bc87a003SGavi Teitz } 161724b2aa1SHadar Hen Zion 1620952da79SSaeed Mahameed if (enable_uc_lb) 16380639b19SErez Shitrit lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST; 16480639b19SErez Shitrit 16580639b19SErez Shitrit if (enable_mc_lb) 16680639b19SErez Shitrit lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST; 16780639b19SErez Shitrit 16880639b19SErez Shitrit if (lb_flags) 16980639b19SErez Shitrit MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags); 1700952da79SSaeed Mahameed 171724b2aa1SHadar Hen Zion MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1); 172724b2aa1SHadar Hen Zion 17380a2a902SYuval Avnery mutex_lock(&mdev->mlx5e_res.td.list_lock); 174724b2aa1SHadar Hen Zion list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) { 175b676f653SSaeed Mahameed tirn = tir->tirn; 176e0b4b472SLeon Romanovsky err = mlx5_core_modify_tir(mdev, tirn, in); 177724b2aa1SHadar Hen Zion if (err) 178bf50082cSKamal Heib goto out; 179724b2aa1SHadar Hen Zion } 180724b2aa1SHadar Hen Zion 181bf50082cSKamal Heib out: 182724b2aa1SHadar Hen Zion kvfree(in); 183b676f653SSaeed Mahameed if (err) 184b676f653SSaeed Mahameed netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err); 18580a2a902SYuval Avnery mutex_unlock(&mdev->mlx5e_res.td.list_lock); 186724b2aa1SHadar Hen Zion 187bf50082cSKamal Heib return err; 188724b2aa1SHadar Hen Zion } 189