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 6317347d54SAya Levin void mlx5e_mkey_set_relaxed_ordering(struct mlx5_core_dev *mdev, void *mkc) 6417347d54SAya Levin { 6517347d54SAya Levin bool ro_pci_enable = pcie_relaxed_ordering_enabled(mdev->pdev); 6617347d54SAya Levin bool ro_write = MLX5_CAP_GEN(mdev, relaxed_ordering_write); 6717347d54SAya Levin bool ro_read = MLX5_CAP_GEN(mdev, relaxed_ordering_read); 6817347d54SAya Levin 6917347d54SAya Levin MLX5_SET(mkc, mkc, relaxed_ordering_read, ro_pci_enable && ro_read); 7017347d54SAya Levin MLX5_SET(mkc, mkc, relaxed_ordering_write, ro_pci_enable && ro_write); 7117347d54SAya Levin } 7217347d54SAya Levin 73b50d292bSHadar Hen Zion static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, 74b50d292bSHadar Hen Zion struct mlx5_core_mkey *mkey) 75b50d292bSHadar Hen Zion { 76ec22eb53SSaeed Mahameed int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 77ec22eb53SSaeed Mahameed void *mkc; 78ec22eb53SSaeed Mahameed u32 *in; 79b50d292bSHadar Hen Zion int err; 80b50d292bSHadar Hen Zion 811b9a07eeSLeon Romanovsky in = kvzalloc(inlen, GFP_KERNEL); 82b50d292bSHadar Hen Zion if (!in) 83b50d292bSHadar Hen Zion return -ENOMEM; 84b50d292bSHadar Hen Zion 85ec22eb53SSaeed Mahameed mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 86cdbd0d2bSAriel Levkovich MLX5_SET(mkc, mkc, access_mode_1_0, MLX5_MKC_ACCESS_MODE_PA); 87ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, lw, 1); 88ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, lr, 1); 8917347d54SAya Levin mlx5e_mkey_set_relaxed_ordering(mdev, mkc); 90ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, pd, pdn); 91ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, length64, 1); 92ec22eb53SSaeed Mahameed MLX5_SET(mkc, mkc, qpn, 0xffffff); 93ec22eb53SSaeed Mahameed 94ec22eb53SSaeed Mahameed err = mlx5_core_create_mkey(mdev, mkey, in, inlen); 95b50d292bSHadar Hen Zion 96b50d292bSHadar Hen Zion kvfree(in); 97b50d292bSHadar Hen Zion return err; 98b50d292bSHadar Hen Zion } 99b50d292bSHadar Hen Zion 100b50d292bSHadar Hen Zion int mlx5e_create_mdev_resources(struct mlx5_core_dev *mdev) 101b50d292bSHadar Hen Zion { 102b50d292bSHadar Hen Zion struct mlx5e_resources *res = &mdev->mlx5e_res; 103b50d292bSHadar Hen Zion int err; 104b50d292bSHadar Hen Zion 105b50d292bSHadar Hen Zion err = mlx5_core_alloc_pd(mdev, &res->pdn); 106b50d292bSHadar Hen Zion if (err) { 107b50d292bSHadar Hen Zion mlx5_core_err(mdev, "alloc pd failed, %d\n", err); 10830aa60b3SEli Cohen return err; 109b50d292bSHadar Hen Zion } 110b50d292bSHadar Hen Zion 111b50d292bSHadar Hen Zion err = mlx5_core_alloc_transport_domain(mdev, &res->td.tdn); 112b50d292bSHadar Hen Zion if (err) { 113b50d292bSHadar Hen Zion mlx5_core_err(mdev, "alloc td failed, %d\n", err); 114b50d292bSHadar Hen Zion goto err_dealloc_pd; 115b50d292bSHadar Hen Zion } 116b50d292bSHadar Hen Zion 117b50d292bSHadar Hen Zion err = mlx5e_create_mkey(mdev, res->pdn, &res->mkey); 118b50d292bSHadar Hen Zion if (err) { 119b50d292bSHadar Hen Zion mlx5_core_err(mdev, "create mkey failed, %d\n", err); 120b50d292bSHadar Hen Zion goto err_dealloc_transport_domain; 121b50d292bSHadar Hen Zion } 122b50d292bSHadar Hen Zion 123aff26157SSaeed Mahameed err = mlx5_alloc_bfreg(mdev, &res->bfreg, false, false); 124aff26157SSaeed Mahameed if (err) { 125aff26157SSaeed Mahameed mlx5_core_err(mdev, "alloc bfreg failed, %d\n", err); 126aff26157SSaeed Mahameed goto err_destroy_mkey; 127aff26157SSaeed Mahameed } 128aff26157SSaeed Mahameed 129724b2aa1SHadar Hen Zion INIT_LIST_HEAD(&mdev->mlx5e_res.td.tirs_list); 13080a2a902SYuval Avnery mutex_init(&mdev->mlx5e_res.td.list_lock); 131724b2aa1SHadar Hen Zion 132b50d292bSHadar Hen Zion return 0; 133b50d292bSHadar Hen Zion 134aff26157SSaeed Mahameed err_destroy_mkey: 135aff26157SSaeed Mahameed mlx5_core_destroy_mkey(mdev, &res->mkey); 136b50d292bSHadar Hen Zion err_dealloc_transport_domain: 137b50d292bSHadar Hen Zion mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 138b50d292bSHadar Hen Zion err_dealloc_pd: 139b50d292bSHadar Hen Zion mlx5_core_dealloc_pd(mdev, res->pdn); 140b50d292bSHadar Hen Zion return err; 141b50d292bSHadar Hen Zion } 142b50d292bSHadar Hen Zion 143b50d292bSHadar Hen Zion void mlx5e_destroy_mdev_resources(struct mlx5_core_dev *mdev) 144b50d292bSHadar Hen Zion { 145b50d292bSHadar Hen Zion struct mlx5e_resources *res = &mdev->mlx5e_res; 146b50d292bSHadar Hen Zion 147aff26157SSaeed Mahameed mlx5_free_bfreg(mdev, &res->bfreg); 148b50d292bSHadar Hen Zion mlx5_core_destroy_mkey(mdev, &res->mkey); 149b50d292bSHadar Hen Zion mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 150b50d292bSHadar Hen Zion mlx5_core_dealloc_pd(mdev, res->pdn); 151b5ae5777SAlex Vesker memset(res, 0, sizeof(*res)); 152b50d292bSHadar Hen Zion } 153724b2aa1SHadar Hen Zion 15480639b19SErez Shitrit int mlx5e_refresh_tirs(struct mlx5e_priv *priv, bool enable_uc_lb, 15580639b19SErez Shitrit bool enable_mc_lb) 156724b2aa1SHadar Hen Zion { 157b676f653SSaeed Mahameed struct mlx5_core_dev *mdev = priv->mdev; 158724b2aa1SHadar Hen Zion struct mlx5e_tir *tir; 15980639b19SErez Shitrit u8 lb_flags = 0; 160bc87a003SGavi Teitz int err = 0; 161b676f653SSaeed Mahameed u32 tirn = 0; 162724b2aa1SHadar Hen Zion int inlen; 163b676f653SSaeed Mahameed void *in; 164b676f653SSaeed Mahameed 165724b2aa1SHadar Hen Zion inlen = MLX5_ST_SZ_BYTES(modify_tir_in); 1661b9a07eeSLeon Romanovsky in = kvzalloc(inlen, GFP_KERNEL); 167bc87a003SGavi Teitz if (!in) { 168bc87a003SGavi Teitz err = -ENOMEM; 169b676f653SSaeed Mahameed goto out; 170bc87a003SGavi Teitz } 171724b2aa1SHadar Hen Zion 1720952da79SSaeed Mahameed if (enable_uc_lb) 17380639b19SErez Shitrit lb_flags = MLX5_TIRC_SELF_LB_BLOCK_BLOCK_UNICAST; 17480639b19SErez Shitrit 17580639b19SErez Shitrit if (enable_mc_lb) 17680639b19SErez Shitrit lb_flags |= MLX5_TIRC_SELF_LB_BLOCK_BLOCK_MULTICAST; 17780639b19SErez Shitrit 17880639b19SErez Shitrit if (lb_flags) 17980639b19SErez Shitrit MLX5_SET(modify_tir_in, in, ctx.self_lb_block, lb_flags); 1800952da79SSaeed Mahameed 181724b2aa1SHadar Hen Zion MLX5_SET(modify_tir_in, in, bitmask.self_lb_en, 1); 182724b2aa1SHadar Hen Zion 18380a2a902SYuval Avnery mutex_lock(&mdev->mlx5e_res.td.list_lock); 184724b2aa1SHadar Hen Zion list_for_each_entry(tir, &mdev->mlx5e_res.td.tirs_list, list) { 185b676f653SSaeed Mahameed tirn = tir->tirn; 186e0b4b472SLeon Romanovsky err = mlx5_core_modify_tir(mdev, tirn, in); 187724b2aa1SHadar Hen Zion if (err) 188bf50082cSKamal Heib goto out; 189724b2aa1SHadar Hen Zion } 190724b2aa1SHadar Hen Zion 191bf50082cSKamal Heib out: 192724b2aa1SHadar Hen Zion kvfree(in); 193b676f653SSaeed Mahameed if (err) 194b676f653SSaeed Mahameed netdev_err(priv->netdev, "refresh tir(0x%x) failed, %d\n", tirn, err); 19580a2a902SYuval Avnery mutex_unlock(&mdev->mlx5e_res.td.list_lock); 196724b2aa1SHadar Hen Zion 197bf50082cSKamal Heib return err; 198724b2aa1SHadar Hen Zion } 199