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 39724b2aa1SHadar Hen Zion int mlx5e_create_tir(struct mlx5_core_dev *mdev, 40724b2aa1SHadar Hen Zion struct mlx5e_tir *tir, u32 *in, int inlen) 41724b2aa1SHadar Hen Zion { 42724b2aa1SHadar Hen Zion int err; 43724b2aa1SHadar Hen Zion 44724b2aa1SHadar Hen Zion err = mlx5_core_create_tir(mdev, in, inlen, &tir->tirn); 45724b2aa1SHadar Hen Zion if (err) 46724b2aa1SHadar Hen Zion return err; 47724b2aa1SHadar Hen Zion 48724b2aa1SHadar Hen Zion list_add(&tir->list, &mdev->mlx5e_res.td.tirs_list); 49724b2aa1SHadar Hen Zion 50724b2aa1SHadar Hen Zion return 0; 51724b2aa1SHadar Hen Zion } 52724b2aa1SHadar Hen Zion 53724b2aa1SHadar Hen Zion void mlx5e_destroy_tir(struct mlx5_core_dev *mdev, 54724b2aa1SHadar Hen Zion struct mlx5e_tir *tir) 55724b2aa1SHadar Hen Zion { 56724b2aa1SHadar Hen Zion mlx5_core_destroy_tir(mdev, tir->tirn); 57724b2aa1SHadar Hen Zion list_del(&tir->list); 58724b2aa1SHadar Hen Zion } 59724b2aa1SHadar Hen Zion 60b50d292bSHadar Hen Zion static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, 61b50d292bSHadar Hen Zion struct mlx5_core_mkey *mkey) 62b50d292bSHadar Hen Zion { 63ec22eb53SSaeed Mahameed int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 64ec22eb53SSaeed Mahameed void *mkc; 65ec22eb53SSaeed Mahameed u32 *in; 66b50d292bSHadar Hen Zion int err; 67b50d292bSHadar Hen Zion 681b9a07eeSLeon Romanovsky in = kvzalloc(inlen, GFP_KERNEL); 69b50d292bSHadar Hen Zion if (!in) 70b50d292bSHadar Hen Zion return -ENOMEM; 71b50d292bSHadar Hen Zion 72ec22eb53SSaeed Mahameed mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 73ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, access_mode, MLX5_MKC_ACCESS_MODE_PA); 74ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, lw, 1); 75ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, lr, 1); 76b50d292bSHadar Hen Zion 77ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, pd, pdn); 78ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, length64, 1); 79ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, qpn, 0xffffff); 80ec22eb53SSaeed Mahameed 81ec22eb53SSaeed Mahameed err = mlx5_core_create_mkey(mdev, mkey, in, inlen); 82b50d292bSHadar Hen Zion 83b50d292bSHadar Hen Zion kvfree(in); 84b50d292bSHadar Hen Zion return err; 85b50d292bSHadar Hen Zion } 86b50d292bSHadar Hen Zion 87b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev) 88b50d292bSHadar Hen Zion { 89b50d292bSHadar Hen Zion struct mlx5e_resources *res = &mdev->mlx5e_res; 90b50d292bSHadar Hen Zion int err; 91b50d292bSHadar Hen Zion 92b50d292bSHadar Hen Zion err = mlx5_core_alloc_pd(mdev, &res->pdn); 93b50d292bSHadar Hen Zion if (err) { 94b50d292bSHadar Hen Zion mlx5_core_err(mdev, "alloc pd failed, %d\n", err); 9530aa60b3SEli Cohen return err; 96b50d292bSHadar Hen Zion } 97b50d292bSHadar Hen Zion 98b50d292bSHadar Hen Zion err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn); 99b50d292bSHadar Hen Zion if (err) { 100b50d292bSHadar Hen Zion mlx5_core_err(mdev, "alloc td failed, %d\n", err); 101b50d292bSHadar Hen Zion goto err_dealloc_pd; 102b50d292bSHadar Hen Zion } 103b50d292bSHadar Hen Zion 104b50d292bSHadar Hen Zion err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey); 105b50d292bSHadar Hen Zion if (err) { 106b50d292bSHadar Hen Zion mlx5_core_err(mdev, "create mkey failed, %d\n", err); 107b50d292bSHadar Hen Zion goto err_dealloc_transport_domain; 108b50d292bSHadar Hen Zion } 109b50d292bSHadar Hen Zion 110aff26157SSaeed Mahameed err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false); 111aff26157SSaeed Mahameed if (err) { 112aff26157SSaeed Mahameed mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err); 113aff26157SSaeed Mahameed goto err_destroy_mkey; 114aff26157SSaeed Mahameed } 115aff26157SSaeed Mahameed 116724b2aa1SHadar Hen Zion INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list); 117724b2aa1SHadar Hen Zion 118b50d292bSHadar Hen Zion return 0; 119b50d292bSHadar Hen Zion 120aff26157SSaeed Mahameed err_destroy_mkey: 121aff26157SSaeed Mahameed mlx5_core_destroy_mkey(mdev, &res->mkey); 122b50d292bSHadar Hen Zion err_dealloc_transport_domain: 123b50d292bSHadar Hen Zion mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 124b50d292bSHadar Hen Zion err_dealloc_pd: 125b50d292bSHadar Hen Zion mlx5_core_dealloc_pd(mdev, res->pdn); 126b50d292bSHadar Hen Zion return err; 127b50d292bSHadar Hen Zion } 128b50d292bSHadar Hen Zion 129b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev) 130b50d292bSHadar Hen Zion { 131b50d292bSHadar Hen Zion struct mlx5e_resources *res = &mdev->mlx5e_res; 132b50d292bSHadar Hen Zion 133aff26157SSaeed Mahameed mlx5_free_bfreg(mdev, &res->bfreg); 134b50d292bSHadar Hen Zion 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 140b676f653SSaeed Mahameed int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb) 141724b2aa1SHadar Hen Zion { 142b676f653SSaeed Mahameed struct mlx5_core_dev *mdev = priv->mdev; 143724b2aa1SHadar Hen Zion struct mlx5e_tir *tir; 144b676f653SSaeed Mahameed int err = -ENOMEM; 145b676f653SSaeed Mahameed u32 tirn = 0; 146724b2aa1SHadar Hen Zion int inlen; 147b676f653SSaeed Mahameed void *in; 148b676f653SSaeed Mahameed 149724b2aa1SHadar Hen Zion inlen = MLX5_ST_SZ_BYTES(modify_tir_in); 1501b9a07eeSLeon Romanovsky in = kvzalloc(inlen, GFP_KERNEL); 151724b2aa1SHadar Hen Zion if (!in) 152b676f653SSaeed Mahameed goto out; 153724b2aa1SHadar Hen Zion 1540952da79SSaeed Mahameed if (enable_uc_lb) 1550952da79SSaeed Mahameed MLX5_SET(modify_tir_in, in, ctx.self_lb_block, 1560952da79SSaeed Mahameed MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST_); 1570952da79SSaeed Mahameed 158724b2aa1SHadar Hen Zion MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1); 159724b2aa1SHadar Hen Zion 160724b2aa1SHadar Hen Zion list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) { 161b676f653SSaeed Mahameed tirn = tir->tirn; 162b676f653SSaeed Mahameed err = mlx5_core_modify_tir(mdev, tirn, in, inlen); 163724b2aa1SHadar Hen Zion if (err) 164bf50082cSKamal Heib goto out; 165724b2aa1SHadar Hen Zion } 166724b2aa1SHadar Hen Zion 167bf50082cSKamal Heib out: 168724b2aa1SHadar Hen Zion kvfree(in); 169b676f653SSaeed Mahameed if (err) 170b676f653SSaeed Mahameed netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err); 171724b2aa1SHadar Hen Zion 172bf50082cSKamal Heib return err; 173724b2aa1SHadar Hen Zion } 174