Files
nvethernetrm/include/osi_common.h
Bhadram Varka 606235ffb2 osi: mgbe: configure MTL TXQ size
Issue: Currentlt MTL TXFIFO is divided by 10 for MGBE
since there are 10 MTL TX queues but in Linux maximum
8 channels and in QNX maximum two channels can be used.
On TX, DMA channel to MTL queue is static mapping so
two queues memory in Linux and 8 queues memory in QNX
is not getting used.

Fix: Divide the TXFIFO size based on enabled DMA channels.

Bug 4443026
Bug 4283087
Bug 4266776

Change-Id: I92ac5da644f2df05503ac44979e0d16079cf9231
Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>
Signed-off-by: Revanth Kumar Uppala <ruppala@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/kernel/nvethernetrm/+/3009823
Reviewed-by: Ashutosh Jha <ajha@nvidia.com>
GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
2024-02-26 12:34:40 -08:00

298 lines
8.1 KiB
C

/*
* Copyright (c) 2018-2023, NVIDIA CORPORATION. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* 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.
*/
#ifndef INCLUDED_OSI_COMMON_H
#define INCLUDED_OSI_COMMON_H
#include <nvethernet_type.h>
/**
* @addtogroup FC Flow Control Threshold Macros
*
* @brief These bits control the threshold (fill-level of Rx queue) at which
* the flow control is asserted or de-asserted
* @{
*/
#define FULL_MINUS_1_5K ((nveu32_t)1)
#define FULL_MINUS_16_K ((nveu32_t)30)
#define FULL_MINUS_32_K ((nveu32_t)62)
/** @} */
/**
* @addtogroup OSI-Helper OSI Helper MACROS
* @{
*/
#define OSI_UNLOCKED 0x0U
#define OSI_LOCKED 0x1U
#define OSI_NSEC_PER_SEC 1000000000ULL
#ifndef OSI_STRIPPED_LIB
#define OSI_MAX_RX_COALESCE_USEC 1020U
#define OSI_EQOS_MIN_RX_COALESCE_USEC 5U
#define OSI_MGBE_MIN_RX_COALESCE_USEC 6U
#define OSI_MIN_RX_COALESCE_FRAMES 1U
#define OSI_MAX_TX_COALESCE_USEC 1020U
#define OSI_MIN_TX_COALESCE_USEC 32U
#define OSI_MIN_TX_COALESCE_FRAMES 1U
#define OSI_PAUSE_FRAMES_DISABLE 0U
#define OSI_PAUSE_FRAMES_ENABLE 1U
#endif /* !OSI_STRIPPED_LIB */
/* Compiler hints for branch prediction */
#define osi_unlikely(x) __builtin_expect(!!(x), 0)
/** @} */
/**
* @addtogroup Helper MACROS
*
* @brief EQOS generic helper MACROS.
* @{
*/
#define OSI_MAX_24BITS 0xFFFFFFU
#define OSI_MAX_28BITS 0xFFFFFFFU
#define OSI_MAX_32BITS 0xFFFFFFFFU
#define OSI_MASK_16BITS 0xFFFFU
#define OSI_MASK_20BITS 0xFFFFFU
#define OSI_MASK_24BITS 0xFFFFFFU
#define OSI_GCL_SIZE_64 64U
#define OSI_GCL_SIZE_128 128U
#define OSI_GCL_SIZE_512 512U
#define OSI_GCL_SIZE_1024 1024U
/** @} */
#ifndef OSI_STRIPPED_LIB
/**
* @addtogroup Helper MACROS
*
* @brief EQOS generic helper MACROS.
* @{
*/
#define OSI_PTP_REQ_CLK_FREQ 250000000U
#define OSI_FLOW_CTRL_DISABLE 0U
#define OSI_ADDRESS_32BIT 0
#define OSI_ADDRESS_40BIT 1
#define OSI_ADDRESS_48BIT 2
/** @ } */
/**
* @addtogroup - LPI-Timers LPI configuration macros
*
* @brief LPI timers and config register field masks.
* @{
*/
/* LPI LS timer - minimum time (in milliseconds) for which the link status from
* PHY should be up before the LPI pattern can be transmitted to the PHY.
* Default 1sec.
*/
#define OSI_DEFAULT_LPI_LS_TIMER (nveu32_t)1000
#define OSI_LPI_LS_TIMER_MASK 0x3FFU
#define OSI_LPI_LS_TIMER_SHIFT 16U
/* LPI TW timer - minimum time (in microseconds) for which MAC wait after it
* stops transmitting LPI pattern before resuming normal tx.
* Default 21us
*/
#define OSI_DEFAULT_LPI_TW_TIMER 0x15U
#define OSI_LPI_TW_TIMER_MASK 0xFFFFU
/* LPI entry timer - Time in microseconds that MAC will wait to enter LPI mode
* after all tx is complete.
* Default 1sec.
*/
#define OSI_LPI_ENTRY_TIMER_MASK 0xFFFF8U
/* LPI entry timer - Time in microseconds that MAC will wait to enter LPI mode
* after all tx is complete. Default 1sec.
*/
#define OSI_DEFAULT_TX_LPI_TIMER 0xF4240U
/* Max Tx LPI timer (in usecs) based on the timer value field length in HW
* MAC_LPI_ENTRY_TIMER register */
#define OSI_MAX_TX_LPI_TIMER 0xFFFF8U
/* Min Tx LPI timer (in usecs) based on the timer value field length in HW
* MAC_LPI_ENTRY_TIMER register */
#define OSI_MIN_TX_LPI_TIMER 0x8U
/* Time in 1 microseconds tic counter used as reference for all LPI timers.
* It is clock rate of CSR slave port (APB clock[eqos_pclk] in eqos) minus 1
* Current eqos_pclk is 204MHz
*/
#define OSI_LPI_1US_TIC_COUNTER_DEFAULT 0xCBU
#define OSI_LPI_1US_TIC_COUNTER_MASK 0xFFFU
/** @} */
#endif /* !OSI_STRIPPED_LIB */
#define OSI_POLL_COUNT 1000U
#ifndef UINT_MAX
#define UINT_MAX (~0U)
#endif
#ifndef INT_MAX
#define INT_MAX (0x7FFFFFFF)
#ifndef OSI_LLONG_MAX
#define OSI_LLONG_MAX (0x7FFFFFFFFFFFFFFF)
#endif
#endif
/** @} */
/**
* @addtogroup Generic helper MACROS
*
* @brief These are Generic helper macros used at various places.
* @{
*/
#define OSI_UCHAR_MAX (0xFFU)
/* Logging defines */
/* log levels */
#define OSI_LOG_INFO 1U
#ifndef OSI_STRIPPED_LIB
#define OSI_LOG_WARN 2U
#endif /* OSI_STRIPPED_LIB */
#define OSI_LOG_ERR 3U
/* Error types */
#define OSI_LOG_ARG_OUTOFBOUND 1U
#define OSI_LOG_ARG_INVALID 2U
#define OSI_LOG_ARG_HW_FAIL 4U
#define OSI_LOG_ARG_OPNOTSUPP 3U
/* Default maximum Giant Packet Size Limit is 16K */
#define OSI_MAX_MTU_SIZE 16383U
#ifdef UPDATED_PAD_CAL
/* MAC Tx/Rx Idle retry and delay count */
#define OSI_TXRX_IDLE_RETRY 5000U
#define OSI_DELAY_COUNT 10U
#endif
#define EQOS_DMA_CHX_STATUS(x) ((0x0080U * (x)) + 0x1160U)
#define MGBE_DMA_CHX_STATUS(x) ((0x0080U * (x)) + 0x3160U)
#define EQOS_DMA_CHX_IER(x) ((0x0080U * (x)) + 0x1134U)
#define MGBE_MTL_CHX_TX_OP_MODE(x) ((0x0080U * (x)) + 0x1100U)
/* FIXME add logic based on HW version */
#define OSI_EQOS_MAX_NUM_CHANS 8U
#define OSI_EQOS_MAX_NUM_QUEUES 8U
#define OSI_MGBE_MAX_L3_L4_FILTER 8U
#define OSI_MGBE_MAX_NUM_CHANS 10U
#define OSI_MGBE_MAX_NUM_QUEUES 10U
#define OSI_EQOS_XP_MAX_CHANS 4U
/* MACSEC max SC's supported 16*/
#define OSI_MACSEC_SC_INDEX_MAX 16
#ifndef OSI_STRIPPED_LIB
/* HW supports 8 Hash table regs, but eqos_validate_core_regs only checks 4 */
#define OSI_EQOS_MAX_HASH_REGS 4U
#endif /* OSI_STRIPPED_LIB */
#define MAC_VERSION 0x110
#define MAC_VERSION_SNVER_MASK 0x7FU
#define OSI_MAC_HW_EQOS 0U
#define OSI_MAC_HW_MGBE 1U
#define OSI_MAX_VM_IRQS 5U
#define OSI_NULL ((void *)0)
#define OSI_ENABLE 1U
#define OSI_NONE 0U
#define OSI_NONE_SIGNED 0
#define OSI_DISABLE 0U
#define OSI_H_DISABLE 0x10101010U
#define OSI_H_ENABLE (~OSI_H_DISABLE)
#define OSI_BIT(nr) ((nveu32_t)1 << (nr))
#ifndef OSI_STRIPPED_LIB
#define OSI_MGBE_MAC_3_00 0x30U
#define OSI_EQOS_MAC_4_10 0x41U
#define OSI_EQOS_MAC_5_10 0x51U
#define OSI_MGBE_MAC_4_00 0x40U
#endif /* OSI_STRIPPED_LIB */
#define OSI_EQOS_MAC_5_00 0x50U
#define OSI_EQOS_MAC_5_30 0x53U
#define OSI_MGBE_MAC_3_10 0x31U
#define OSI_MAX_VM_IRQS 5U
#ifndef OSI_STRIPPED_LIB
#define OSI_HASH_FILTER_MODE 1U
#define OSI_L4_FILTER_TCP 0U
#define OSI_L4_FILTER_UDP 1U
#define OSI_PERFECT_FILTER_MODE 0U
#define OSI_INVALID_CHAN_NUM 0xFFU
#endif /* OSI_STRIPPED_LIB */
/** @} */
/**
* @addtogroup OSI-DEBUG helper macros
*
* @brief OSI debug type macros
* @{
*/
#ifdef OSI_DEBUG
#define OSI_DEBUG_TYPE_DESC 1U
#define OSI_DEBUG_TYPE_REG 2U
#define OSI_DEBUG_TYPE_STRUCTS 3U
#endif /* OSI_DEBUG */
/** @} */
/**
* @brief unused function attribute
*/
#define OSI_UNUSED __attribute__((__unused__))
/**
* @brief osi_update_stats_counter - update value by increment passed
* as parameter
* @note
* Algorithm:
* - Check for boundary and return sum
*
* @param[in] last_value: last value of stat counter
* @param[in] incr: increment value
*
* @note Input parameter should be only nveu64_t type
*
* @note
* API Group:
* - Initialization: No
* - Run time: Yes
* - De-initialization: No
*
* @retval 0 on sucess
* @retval -1 on failure
*/
static inline nveu64_t osi_update_stats_counter(nveu64_t last_value,
nveu64_t incr)
{
nveu64_t temp = last_value + incr;
if (temp < last_value) {
/* Stats overflow, so reset it to zero */
temp = 0UL;
}
return temp;
}
#endif /* OSI_COMMON_H */