/* * Copyright (c) 2018, Mellanox Technologies. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include "port_buffer.h" int mlx5e_port_query_buffer(struct mlx5e_priv *priv, struct mlx5e_port_buffer *port_buffer) { … } struct mlx5e_buffer_pool { … }; static int mlx5e_port_query_pool(struct mlx5_core_dev *mdev, struct mlx5e_buffer_pool *buffer_pool, u32 desc, u8 dir, u8 pool_idx) { … } enum { … }; enum { … }; /* No limit on usage of shared buffer pool (max_buff=0) */ #define MLX5_SB_POOL_NO_THRESHOLD … /* Shared buffer pool usage threshold when calculated * dynamically in alpha units. alpha=13 is equivalent to * HW_alpha of [(1/128) * 2 ^ (alpha-1)] = 32, where HW_alpha * equates to the following portion of the shared buffer pool: * [32 / (1 + n * 32)] While *n* is the number of buffers * that are using the shared buffer pool. */ #define MLX5_SB_POOL_THRESHOLD … /* Shared buffer class management parameters */ struct mlx5_sbcm_params { … }; static const struct mlx5_sbcm_params sbcm_default = …; static const struct mlx5_sbcm_params sbcm_lossy = …; static const struct mlx5_sbcm_params sbcm_lossless = …; static const struct mlx5_sbcm_params sbcm_lossless_no_threshold = …; /** * select_sbcm_params() - selects the shared buffer pool configuration * * @buffer: <input> port buffer to retrieve params of * @lossless_buff_count: <input> number of lossless buffers in total * * The selection is based on the following rules: * 1. If buffer size is 0, no shared buffer pool is used. * 2. If buffer is lossy, use lossy shared buffer pool. * 3. If there are more than 1 lossless buffers, use lossless shared buffer pool * with threshold. * 4. If there is only 1 lossless buffer, use lossless shared buffer pool * without threshold. * * @return const struct mlx5_sbcm_params* selected values */ static const struct mlx5_sbcm_params * select_sbcm_params(struct mlx5e_bufferx_reg *buffer, u8 lossless_buff_count) { … } static int port_update_pool_cfg(struct mlx5_core_dev *mdev, struct mlx5e_port_buffer *port_buffer) { … } static int port_update_shared_buffer(struct mlx5_core_dev *mdev, u32 current_headroom_size, u32 new_headroom_size) { … } static int port_set_buffer(struct mlx5e_priv *priv, struct mlx5e_port_buffer *port_buffer) { … } /* xoff = ((301+2.16 * len [m]) * speed [Gbps] + 2.72 MTU [B]) * minimum speed value is 40Gbps */ static u32 calculate_xoff(struct mlx5e_priv *priv, unsigned int mtu) { … } static int update_xoff_threshold(struct mlx5e_port_buffer *port_buffer, u32 xoff, unsigned int max_mtu, u16 port_buff_cell_sz) { … } /** * update_buffer_lossy - Update buffer configuration based on pfc * @mdev: port function core device * @max_mtu: netdev's max_mtu * @pfc_en: <input> current pfc configuration * @buffer: <input> current prio to buffer mapping * @xoff: <input> xoff value * @port_buff_cell_sz: <input> port buffer cell_size * @port_buffer: <output> port receive buffer configuration * @change: <output> * * Update buffer configuration based on pfc configuration and * priority to buffer mapping. * Buffer's lossy bit is changed to: * lossless if there is at least one PFC enabled priority * mapped to this buffer lossy if all priorities mapped to * this buffer are PFC disabled * * @return: 0 if no error, * sets change to true if buffer configuration was modified. */ static int update_buffer_lossy(struct mlx5_core_dev *mdev, unsigned int max_mtu, u8 pfc_en, u8 *buffer, u32 xoff, u16 port_buff_cell_sz, struct mlx5e_port_buffer *port_buffer, bool *change) { … } static int fill_pfc_en(struct mlx5_core_dev *mdev, u8 *pfc_en) { … } #define MINIMUM_MAX_MTU … int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv, u32 change, unsigned int mtu, struct ieee_pfc *pfc, u32 *buffer_size, u8 *prio2buffer) { … }