Merge remote-tracking branch 'origin/dev/t264-ethernet' into dev-t264

Bug 4687787

Change-Id: Ie3411c626b31d1ed4b536954c7e5a875aab29e86
Signed-off-by: Bhadram Varka <vbhadram@nvidia.com>
This commit is contained in:
Bhadram Varka
2024-06-07 15:11:49 +00:00
25 changed files with 2512 additions and 516 deletions

View File

@@ -47,4 +47,5 @@ endif
#NV_COMPONENT_CFLAGS += -DMACSEC_KEY_PROGRAM #NV_COMPONENT_CFLAGS += -DMACSEC_KEY_PROGRAM
HSI_SUPPORT := 1 HSI_SUPPORT := 1
MACSEC_SUPPORT := 1 MACSEC_SUPPORT := 1
#MACSEC_KEY_PROGRAM := 1
ccflags-y += $(NV_COMPONENT_CFLAGS) ccflags-y += $(NV_COMPONENT_CFLAGS)

View File

@@ -60,6 +60,8 @@ struct osi_macsec_mmc_counters {
/** This counter provides the number of octets after IVC passing /** This counter provides the number of octets after IVC passing
* valid values are between 0 and UINT64_MAX */ * valid values are between 0 and UINT64_MAX */
nveul64_t rx_octets_validated; nveul64_t rx_octets_validated;
/** This counter provides the number of octets after decryption */
nveul64_t rx_octets_decrypted;
/** This counter provides the number not valid packets /** This counter provides the number not valid packets
* valid values are between 0 and UINT64_MAX */ * valid values are between 0 and UINT64_MAX */
nveul64_t rx_pkts_not_valid[OSI_MACSEC_SC_INDEX_MAX]; nveul64_t rx_pkts_not_valid[OSI_MACSEC_SC_INDEX_MAX];
@@ -84,9 +86,13 @@ struct osi_macsec_mmc_counters {
/** This counter provides the number of out packets protected /** This counter provides the number of out packets protected
* valid values are between 0 and UINT64_MAX */ * valid values are between 0 and UINT64_MAX */
nveul64_t tx_pkts_protected[OSI_MACSEC_SC_INDEX_MAX]; nveul64_t tx_pkts_protected[OSI_MACSEC_SC_INDEX_MAX];
/** This counter provides the number of out packets encrypted */
nveul64_t tx_pkts_encrypted[OSI_MACSEC_SC_INDEX_MAX];
/** This counter provides the number of out octets protected/ /** This counter provides the number of out octets protected/
* valid values are between 0 and UINT64_MAX */ * valid values are between 0 and UINT64_MAX */
nveul64_t tx_octets_protected; nveul64_t tx_octets_protected;
/** This counter provides the number of out octets encrypted */
nveul64_t tx_octets_encrypted;
}; };
#endif /* MACSEC_SUPPORT */ #endif /* MACSEC_SUPPORT */
#endif /* INCLUDED_MMC_H */ #endif /* INCLUDED_MMC_H */

View File

@@ -137,7 +137,9 @@ struct osi_core_frp_cmd {
* Bit[0] - DMA channel 0 * Bit[0] - DMA channel 0
* .. * ..
* Bit [N] - DMA channel N] */ * Bit [N] - DMA channel N] */
nveu32_t dma_sel; nveu64_t dma_sel;
/** OSD DCHT */
nveu8_t dcht;
}; };
/** /**

View File

@@ -47,6 +47,9 @@ struct osi_l3_l4_filter {
nveu32_t is_udp; nveu32_t is_udp;
/** ipv6 (OSI_L3L4_ENABLE) or ipv4 (OSI_L3L4_DISABLE) */ /** ipv6 (OSI_L3L4_ENABLE) or ipv4 (OSI_L3L4_DISABLE) */
nveu32_t is_ipv6; nveu32_t is_ipv6;
/** match combined L3, L4 filters (OSI_TRUE) or ignore L3,L4
* combined filter match (OSI_FALSE) */
nveu32_t is_l3l4_match_en;
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
struct { struct {
/** ipv4 address /** ipv4 address

View File

@@ -51,6 +51,8 @@
#define OSI_LOCKED 0x1U #define OSI_LOCKED 0x1U
/** @brief Number of Nano seconds per second */ /** @brief Number of Nano seconds per second */
#define OSI_NSEC_PER_SEC 1000000000ULL #define OSI_NSEC_PER_SEC 1000000000ULL
#define OSI_MGBE_MAX_RX_RIIT_NSEC 17500U
#define OSI_MGBE_MIN_RX_RIIT_NSEC 535U
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
#define OSI_MAX_RX_COALESCE_USEC 1020U #define OSI_MAX_RX_COALESCE_USEC 1020U
#define OSI_EQOS_MIN_RX_COALESCE_USEC 5U #define OSI_EQOS_MIN_RX_COALESCE_USEC 5U
@@ -208,11 +210,14 @@
#define OSI_EQOS_MAX_NUM_QUEUES 8U #define OSI_EQOS_MAX_NUM_QUEUES 8U
/** @brief Maximum number of L3L4 filters supported */ /** @brief Maximum number of L3L4 filters supported */
#define OSI_MGBE_MAX_L3_L4_FILTER 8U #define OSI_MGBE_MAX_L3_L4_FILTER 8U
/** @brief Maximum number of L3L4 filters supported for T264 */
#define OSI_MGBE_MAX_L3_L4_FILTER_T264 48U
/** /**
* @brief Maximum number of channels in MGBE * @brief Maximum number of channels in MGBE
*/ */
//TBD: T264, NET04 supports only 10 VDMA //TBD: T264, NET05 supports only 20 VDMA, change to 48 later
#define OSI_MGBE_MAX_NUM_CHANS 10U #define OSI_MGBE_MAX_NUM_CHANS 20U
#define OSI_MGBE_T23X_MAX_NUM_CHANS 10U
/** /**
* @brief Maximum number of PDMA channels in MGBE * @brief Maximum number of PDMA channels in MGBE
*/ */
@@ -220,6 +225,8 @@
/** @brief Maximum number of queues in MGBE */ /** @brief Maximum number of queues in MGBE */
#define OSI_MGBE_MAX_NUM_QUEUES 10U #define OSI_MGBE_MAX_NUM_QUEUES 10U
#define OSI_EQOS_XP_MAX_CHANS 4U #define OSI_EQOS_XP_MAX_CHANS 4U
/* max riit DT configs for supported speeds */
#define OSI_MGBE_MAX_NUM_RIIT 4U
/** /**
* @brief Maximum number of Secure Channels supported * @brief Maximum number of Secure Channels supported
@@ -241,6 +248,15 @@
/** @brief flag indicating MGBE MAC on T26X */ /** @brief flag indicating MGBE MAC on T26X */
#define OSI_MAC_HW_MGBE_T26X 2U #define OSI_MAC_HW_MGBE_T26X 2U
/** MAC version type for EQOS version previous to 5.30 */
#define MAC_CORE_VER_TYPE_EQOS 0U
/** MAC version type for EQOS version 5.30 */
#define MAC_CORE_VER_TYPE_EQOS_5_30 1U
/** MAC version type for MGBE IP */
#define MAC_CORE_VER_TYPE_MGBE 2U
/** MAC version type for T26x EQOS version 5.40 */
#define MAC_CORE_VER_TYPE_EQOS_5_40 3U
#define OSI_NULL ((void *)0) #define OSI_NULL ((void *)0)
/** Enable Flag */ /** Enable Flag */
#define OSI_ENABLE 1U #define OSI_ENABLE 1U
@@ -252,6 +268,7 @@
#define OSI_H_ENABLE (~OSI_H_DISABLE) #define OSI_H_ENABLE (~OSI_H_DISABLE)
#define OSI_BIT(nr) ((nveu32_t)1 << (((nveu32_t)nr) & 0x1FU)) #define OSI_BIT(nr) ((nveu32_t)1 << (((nveu32_t)nr) & 0x1FU))
#define OSI_BIT_64(nr) ((nveu64_t)1 << (nr))
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
#define OSI_MGBE_MAC_3_00 0x30U #define OSI_MGBE_MAC_3_00 0x30U
@@ -264,10 +281,11 @@
#define OSI_EQOS_MAC_5_00 0x50U #define OSI_EQOS_MAC_5_00 0x50U
/** @brief EQOS MAC version Orin */ /** @brief EQOS MAC version Orin */
#define OSI_EQOS_MAC_5_30 0x53U #define OSI_EQOS_MAC_5_30 0x53U
#define OSI_EQOS_MAC_5_40 0x54U
/** @brief MGBE MAC version Orin */ /** @brief MGBE MAC version Orin */
#define OSI_MGBE_MAC_3_10 0x31U #define OSI_MGBE_MAC_3_10 0x31U
//TBD: T264 NET04 version, update it later
#define OSI_MGBE_MAC_3_20 0x32U #define OSI_MGBE_MAC_3_20 0x32U
#define OSI_MGBE_MAC_4_20 0x42U
/** /**
* @brief Maximum number of VM IRQs * @brief Maximum number of VM IRQs

View File

@@ -217,6 +217,7 @@ typedef my_lint_64 nvel64_t;
#define EQOS_MAX_MAC_5_3_ADDRESS_FILTER 32U #define EQOS_MAX_MAC_5_3_ADDRESS_FILTER 32U
#define EQOS_MAX_L3_L4_FILTER 8U #define EQOS_MAX_L3_L4_FILTER 8U
#define OSI_MGBE_MAX_MAC_ADDRESS_FILTER 32U #define OSI_MGBE_MAX_MAC_ADDRESS_FILTER 32U
#define OSI_MGBE_MAX_MAC_ADDRESS_FILTER_T26X 48U
#define OSI_DA_MATCH 0U #define OSI_DA_MATCH 0U
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
#define OSI_INV_MATCH 1U #define OSI_INV_MATCH 1U
@@ -287,6 +288,15 @@ typedef my_lint_64 nvel64_t;
#define OSI_XFI_MODE_5G 1U #define OSI_XFI_MODE_5G 1U
#define OSI_USXGMII_MODE_10G 2U #define OSI_USXGMII_MODE_10G 2U
#define OSI_USXGMII_MODE_5G 3U #define OSI_USXGMII_MODE_5G 3U
#define OSI_XAUI_MODE_25G 4U
/**
* @brief Ethernet UPHY GBE Modes
*/
#define OSI_GBE_MODE_5G 0U
#define OSI_GBE_MODE_10G 1U
#define OSI_UPHY_GBE_MODE_25G 2U
#define OSI_GBE_MODE_1G 3U
#define OSI_GBE_MODE_2_5G 4U
/** /**
* @addtogroup IOCTL OPS MACROS * @addtogroup IOCTL OPS MACROS
@@ -502,7 +512,8 @@ typedef my_lint_64 nvel64_t;
#define VLAN_NUM_VID 4096U #define VLAN_NUM_VID 4096U
#define OSI_DELAY_1000US 1000U #define OSI_DELAY_1000US 1000U
#define OSI_DELAY_1US 1U
#define RCHLIST_SIZE 48U
/** /**
* @addtogroup PTP PTP related information * @addtogroup PTP PTP related information
* *
@@ -740,7 +751,18 @@ struct osi_filter {
/** src_dest: SA(1) or DA(0) */ /** src_dest: SA(1) or DA(0) */
nveu32_t src_dest; nveu32_t src_dest;
/** indicates one hot encoded DMA receive channels to program */ /** indicates one hot encoded DMA receive channels to program */
nveu32_t dma_chansel; nveu64_t dma_chansel;
/** Indicates packet duplication enable(1) disable (0) */
nveu32_t pkt_dup;
};
/**
* @brief OSI core structure for RCHlist
*/
struct rchlist_index {
nveu8_t mac_address[OSI_ETH_ALEN];
nveu32_t in_use;
nveu64_t dch;
}; };
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
@@ -1300,6 +1322,17 @@ struct osi_macsec_sc_info {
/** flag indicating the prosition of vlan tag /** flag indicating the prosition of vlan tag
* valid values are either 0(vlan not in clear) or 1(vlan in clear) */ * valid values are either 0(vlan not in clear) or 1(vlan in clear) */
nveu8_t vlan_in_clear; nveu8_t vlan_in_clear;
/** Indicates 1 bit for encription configuration
0: Indicates disabled
1: Indicates enabled
*/
nveu8_t encrypt;
/** Indicates 2 bit for confidentiality offset configuration
0: Indicates offset as 0
1: Indicates offset as 30
2: Indicates offset as 50
*/
nveu8_t conf_offset;
}; };
/** /**
@@ -1408,8 +1441,12 @@ struct osi_core_frp_data {
/** Entry OK Index - Next Instruction /** Entry OK Index - Next Instruction
* valid values are from 0 to 0xFF */ * valid values are from 0 to 0xFF */
nveu8_t ok_index; nveu8_t ok_index;
/** Entry dcht */
nveu8_t dcht;
/** Entry DMA Channel selection (1-bit for each channel) */ /** Entry DMA Channel selection (1-bit for each channel) */
nveu32_t dma_chsel; nveu64_t dma_chsel;
/** Entry RChlist index */
nve32_t rchlist_indx;
}; };
/** /**
@@ -1435,6 +1472,8 @@ struct osi_core_tx_ts {
/** Packet ID for corresponding timestamp /** Packet ID for corresponding timestamp
* valid values are from 1 to 0x3FF*/ * valid values are from 1 to 0x3FF*/
nveu32_t pkt_id; nveu32_t pkt_id;
/** vdma ID for corresponding timestamp */
nveu32_t vdma_id;
/** Time in seconds*/ /** Time in seconds*/
nveu32_t sec; nveu32_t sec;
/** Time in nano seconds */ /** Time in nano seconds */
@@ -1656,6 +1695,8 @@ struct osi_core_priv_data {
* valid values are NVETHERNETRM_PIF$OSI_MAC_HW_EQOS and * valid values are NVETHERNETRM_PIF$OSI_MAC_HW_EQOS and
* NVETHERNETRM_PIF$OSI_MAC_HW_MGBE*/ * NVETHERNETRM_PIF$OSI_MAC_HW_MGBE*/
nveu32_t mac; nveu32_t mac;
/** MACSEC HW type based on DT compatible */
nveu32_t macsec;
/** MAC version /** MAC version
* valid values are NVETHERNETRM_PIF$OSI_EQOS_MAC_5_00, * valid values are NVETHERNETRM_PIF$OSI_EQOS_MAC_5_00,
* NVETHERNETRM_PIF$OSI_EQOS_MAC_5_30 * NVETHERNETRM_PIF$OSI_EQOS_MAC_5_30
@@ -1731,7 +1772,7 @@ struct osi_core_priv_data {
#if !defined(L3L4_WILDCARD_FILTER) #if !defined(L3L4_WILDCARD_FILTER)
/** L3L4 filter bit bask, set index corresponding bit for /** L3L4 filter bit bask, set index corresponding bit for
* filter if filter enabled */ * filter if filter enabled */
nveu32_t l3l4_filter_bitmask; nveu64_t l3l4_filter_bitmask;
#endif /* !L3L4_WILDCARD_FILTER */ #endif /* !L3L4_WILDCARD_FILTER */
/** Flag which decides virtualization is enabled(1) or disabled(0) */ /** Flag which decides virtualization is enabled(1) or disabled(0) */
nveu32_t use_virtualization; nveu32_t use_virtualization;
@@ -1739,7 +1780,7 @@ struct osi_core_priv_data {
struct osi_hw_features *hw_feature; struct osi_hw_features *hw_feature;
/** MC packets Multiple DMA channel selection flags */ /** MC packets Multiple DMA channel selection flags */
nveu32_t mc_dmasel; nveu32_t mc_dmasel;
/** UPHY GBE mode (1 for 10G, 0 for 5G) */ /** UPHY GBE mode (2 for 25F, 1 for 10G, 0 for 5G) */
nveu32_t uphy_gbe_mode; nveu32_t uphy_gbe_mode;
/** number of PDMA's */ /** number of PDMA's */
nveu32_t num_of_pdma; nveu32_t num_of_pdma;
@@ -1754,7 +1795,8 @@ struct osi_core_priv_data {
/** number of VM IRQ's /** number of VM IRQ's
* Fixed value filled by NvEthernet unit as 4*/ * Fixed value filled by NvEthernet unit as 4*/
nveu32_t num_vm_irqs; nveu32_t num_vm_irqs;
/** PHY interface mode (0/1 for XFI 10/5G, 2/3 for USXGMII 10/5) */ /** PHY interface mode (0/1 for XFI 10/5G, 2/3 for USXGMII 10/5)
* (4 for XFI 25G) (5 for USXGMII 25G */
nveu32_t phy_iface_mode; nveu32_t phy_iface_mode;
/** MGBE MAC instance ID's /** MGBE MAC instance ID's
* valid values are from 0 to 4 * valid values are from 0 to 4
@@ -1774,6 +1816,8 @@ struct osi_core_priv_data {
#endif #endif
/** pre-silicon flag */ /** pre-silicon flag */
nveu32_t pre_sil; nveu32_t pre_sil;
/** rCHlist bookkeeping **/
struct rchlist_index rch_index[RCHLIST_SIZE];
}; };
/** /**

View File

@@ -59,6 +59,7 @@
#define OSI_ONE_MEGA_HZ 1000000U #define OSI_ONE_MEGA_HZ 1000000U
/** @brief MAX ULLONG value */ /** @brief MAX ULLONG value */
#define OSI_ULLONG_MAX (~0ULL) #define OSI_ULLONG_MAX (~0ULL)
#define OSI_MSEC_PER_SEC 1000U
/* Compiler hints for branch prediction */ /* Compiler hints for branch prediction */
#define osi_likely(x) __builtin_expect(!!(x), 1) #define osi_likely(x) __builtin_expect(!!(x), 1)
@@ -141,6 +142,9 @@
#define OSI_PKT_CX_IP_CSUM OSI_BIT(12) #define OSI_PKT_CX_IP_CSUM OSI_BIT(12)
/** @} */ /** @} */
/** VDMA ID in TDESC0 **/
#define OSI_PTP_VDMA_SHIFT 10U
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
/** /**
* @addtogroup SLOT function context fields * @addtogroup SLOT function context fields
@@ -265,6 +269,7 @@
#define OSI_DMA_IOCTL_CMD_STRUCTS_DUMP 2U #define OSI_DMA_IOCTL_CMD_STRUCTS_DUMP 2U
#define OSI_DMA_IOCTL_CMD_DEBUG_INTR_CONFIG 3U #define OSI_DMA_IOCTL_CMD_DEBUG_INTR_CONFIG 3U
#endif /* OSI_DEBUG */ #endif /* OSI_DEBUG */
#define OSI_DMA_IOCTL_CMD_RX_RIIT_CONFIG 4U
/** @} */ /** @} */
/** /**
@@ -318,6 +323,16 @@ struct osi_pkt_err_stats {
}; };
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
/**
* @brief RX RIIT value for speed
*/
struct osi_rx_riit {
/** speed */
nveu32_t speed;
/** riit value */
nveu32_t riit;
};
/** /**
* @brief Receive Descriptor * @brief Receive Descriptor
*/ */
@@ -452,6 +467,8 @@ struct osi_tx_swcx {
* Max value is NVETHERNETCL_PIF$UINT_MAX * Max value is NVETHERNETCL_PIF$UINT_MAX
*/ */
nveu32_t pktid; nveu32_t pktid;
/** VDMA id of packet for which TX packet sent for timestamp needed */
nveu32_t vdmaid;
/** dma channel number for osd use. /** dma channel number for osd use.
* Max value is NVETHERNETCL_PIF$OSI_EQOS_MAX_NUM_CHANS or * Max value is NVETHERNETCL_PIF$OSI_EQOS_MAX_NUM_CHANS or
* NVETHERNETCL_PIF$OSI_MGBE_MAX_NUM_CHANS * NVETHERNETCL_PIF$OSI_MGBE_MAX_NUM_CHANS
@@ -539,6 +556,8 @@ struct osi_txdone_pkt_cx {
* Max value is NVETHERNETCL_PIF$UINT_MAX * Max value is NVETHERNETCL_PIF$UINT_MAX
*/ */
nveu32_t pktid; nveu32_t pktid;
/** Passing vdma id to map TX time to packet */
nveu32_t vdmaid;
}; };
/** /**
@@ -606,12 +625,12 @@ struct osi_tx_ring {
* @brief osi_xtra_dma_stat_counters - OSI DMA extra stats counters * @brief osi_xtra_dma_stat_counters - OSI DMA extra stats counters
*/ */
struct osi_xtra_dma_stat_counters { struct osi_xtra_dma_stat_counters {
/** Per Q TX packet count */ /** Per chan TX packet count */
nveu64_t q_tx_pkt_n[OSI_MGBE_MAX_NUM_QUEUES]; nveu64_t chan_tx_pkt_n[OSI_MGBE_MAX_NUM_CHANS];
/** Per Q RX packet count */ /** Per chan RX packet count */
nveu64_t q_rx_pkt_n[OSI_MGBE_MAX_NUM_QUEUES]; nveu64_t chan_rx_pkt_n[OSI_MGBE_MAX_NUM_CHANS];
/** Per Q TX complete call count */ /** Per chan TX complete call count */
nveu64_t tx_clean_n[OSI_MGBE_MAX_NUM_QUEUES]; nveu64_t tx_clean_n[OSI_MGBE_MAX_NUM_CHANS];
/** Total number of tx packets count */ /** Total number of tx packets count */
nveu64_t tx_pkt_n; nveu64_t tx_pkt_n;
/** Total number of rx packet count */ /** Total number of rx packet count */
@@ -657,7 +676,7 @@ struct osd_dma_ops {
#endif /* OSI_DEBUG */ #endif /* OSI_DEBUG */
}; };
#ifdef OSI_DEBUG //#ifdef OSI_DEBUG
/** /**
* @brief The OSI DMA IOCTL data structure. * @brief The OSI DMA IOCTL data structure.
*/ */
@@ -667,7 +686,7 @@ struct osi_dma_ioctl_data {
/** IOCTL command argument */ /** IOCTL command argument */
nveu32_t arg_u32; nveu32_t arg_u32;
}; };
#endif /* OSI_DEBUG */ //#endif /* OSI_DEBUG */
/** /**
* @brief The OSI DMA private data structure. * @brief The OSI DMA private data structure.
@@ -721,6 +740,12 @@ struct osi_dma_priv_data {
* NVETHERNETCL_PIF$OSI_DISABLE * NVETHERNETCL_PIF$OSI_DISABLE
*/ */
nveu32_t use_riwt; nveu32_t use_riwt;
/** Receive Interrupt Idle Timer in nsec */
struct osi_rx_riit rx_riit[OSI_MGBE_MAX_NUM_RIIT];
/** num of rx riit configs for different speeds */
nveu32_t num_of_riit;
/** Flag which decides riit is enabled(1) or disabled(0) */
nveu32_t use_riit;
/** Max no of pkts to be received before triggering Rx interrupt. /** Max no of pkts to be received before triggering Rx interrupt.
* Max value is NVETHERNETCL_PIF$UINT_MAX * Max value is NVETHERNETCL_PIF$UINT_MAX
*/ */
@@ -772,9 +797,9 @@ struct osi_dma_priv_data {
* NVETHENETCL_PIF$OSI_PTP_SYNC_TWOSTEP - two step mode * NVETHENETCL_PIF$OSI_PTP_SYNC_TWOSTEP - two step mode
*/ */
nveu32_t ptp_flag; nveu32_t ptp_flag;
#ifdef OSI_DEBUG
/** OSI DMA IOCTL data */ /** OSI DMA IOCTL data */
struct osi_dma_ioctl_data ioctl_data; struct osi_dma_ioctl_data ioctl_data;
#ifdef OSI_DEBUG
/** Flag to enable/disable descriptor dump */ /** Flag to enable/disable descriptor dump */
nveu32_t enable_desc_dump; nveu32_t enable_desc_dump;
#endif /* OSI_DEBUG */ #endif /* OSI_DEBUG */
@@ -1444,7 +1469,7 @@ nveu32_t osi_is_mac_enabled(struct osi_dma_priv_data *const osi_dma);
nve32_t osi_handle_dma_intr(struct osi_dma_priv_data *osi_dma, nve32_t osi_handle_dma_intr(struct osi_dma_priv_data *osi_dma,
nveu32_t chan, nveu32_t tx_rx, nveu32_t en_dis); nveu32_t chan, nveu32_t tx_rx, nveu32_t en_dis);
#ifdef OSI_DEBUG //#ifdef OSI_DEBUG
/** /**
* @brief * @brief
* Description: OSI DMA IOCTL * Description: OSI DMA IOCTL
@@ -1468,7 +1493,7 @@ nve32_t osi_handle_dma_intr(struct osi_dma_priv_data *osi_dma,
* @retval -1 on failure - invalid ioctl command within osi data structure * @retval -1 on failure - invalid ioctl command within osi data structure
*/ */
nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma); nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma);
#endif /* OSI_DEBUG */ //#endif /* OSI_DEBUG */
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
/** /**
* @brief * @brief

View File

@@ -26,6 +26,7 @@
#include <osi_core.h> #include <osi_core.h>
#ifdef MACSEC_SUPPORT #ifdef MACSEC_SUPPORT
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
/* MACSEC OSI data structures */ /* MACSEC OSI data structures */
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
@@ -51,6 +52,7 @@
#endif /* DEBUG_MACSEC */ #endif /* DEBUG_MACSEC */
/** @brief maximum key index */ /** @brief maximum key index */
#define OSI_KEY_INDEX_MAX 31U #define OSI_KEY_INDEX_MAX 31U
#define OSI_KEY_INDEX_MAX_T26X 95U
/** @brief maximum PN by default */ /** @brief maximum PN by default */
#define OSI_PN_MAX_DEFAULT 0xFFFFFFFFU #define OSI_PN_MAX_DEFAULT 0xFFFFFFFFU
/** @brief threshold PN by default */ /** @brief threshold PN by default */
@@ -59,6 +61,8 @@
#define OSI_TCI_DEFAULT 0x1 #define OSI_TCI_DEFAULT 0x1
/** @brief maximum SCs index */ /** @brief maximum SCs index */
#define OSI_SC_INDEX_MAX 15U #define OSI_SC_INDEX_MAX 15U
/** @brief maximum SCs index for T26X */
#define OSI_SC_INDEX_MAX_T26X 47U
/** /**
* @brief Length of ethernet type field * @brief Length of ethernet type field
*/ */
@@ -127,6 +131,10 @@
* @brief Helper macros for generic table CONFIG register programming * @brief Helper macros for generic table CONFIG register programming
* @{ * @{
*/ */
/** @brief MACSEC max ip types */
#define MAX_MACSEC_IP_TYPES 2
#define OSI_MACSEC_T23X 0U
#define OSI_MACSEC_T26X 1U
/** @brief TX MACSEC controller */ /** @brief TX MACSEC controller */
#define OSI_CTLR_SEL_TX 0U #define OSI_CTLR_SEL_TX 0U
/** @brief RX MACSEC controller */ /** @brief RX MACSEC controller */
@@ -137,13 +145,15 @@
/** @brief LUT write operation */ /** @brief LUT write operation */
#define OSI_LUT_WRITE 1U #define OSI_LUT_WRITE 1U
#define OSI_RW_MAX 1U #define OSI_RW_MAX 1U
/** @brief Maximum table index */
#define OSI_TABLE_INDEX_MAX 31U
/** @brief Maximum bypass lut table index */ /** @brief Maximum bypass lut table index */
#define OSI_BYP_LUT_MAX_INDEX OSI_TABLE_INDEX_MAX #define OSI_BYP_LUT_MAX_INDEX 31U
/** @brief Maximum number of SCs */ /** @brief Maximum bypass lut table index for T26X */
#define OSI_SC_LUT_MAX_INDEX 15U #define OSI_BYP_LUT_MAX_INDEX_T26X 47U
#define OSI_SA_LUT_MAX_INDEX OSI_TABLE_INDEX_MAX /** @brief Maximum number of SAs */
#define OSI_SA_LUT_MAX_INDEX 31U
/** @brief Maximum number of SAs for T26X */
#define OSI_SA_LUT_MAX_INDEX_T26X 95U
/** @} */ /** @} */
#ifdef DEBUG_MACSEC #ifdef DEBUG_MACSEC
@@ -242,6 +252,10 @@ struct osi_sc_param_outputs {
/** Indicates 1 bit VLAN IN CLEAR config /** Indicates 1 bit VLAN IN CLEAR config
* vlaid values are 0(vlan not in clear) and 1(vlan in clear) */ * vlaid values are 0(vlan not in clear) and 1(vlan in clear) */
nveu8_t vlan_in_clear; nveu8_t vlan_in_clear;
/** Indicates 1 bit Encription config */
nveu8_t encrypt;
/** Indicates 2 bit confidentiality offset config */
nveu8_t conf_offset;
}; };
/** /**

View File

@@ -37,13 +37,6 @@
#define RETRY_DELAY 1U #define RETRY_DELAY 1U
/** @} */ /** @} */
/** MAC version type for EQOS version previous to 5.30 */
#define MAC_CORE_VER_TYPE_EQOS 0U
/** MAC version type for EQOS version 5.30 */
#define MAC_CORE_VER_TYPE_EQOS_5_30 1U
/** MAC version type for MGBE IP */
#define MAC_CORE_VER_TYPE_MGBE 2U
/** /**
* @addtogroup MGBE PBL settings. * @addtogroup MGBE PBL settings.
* *
@@ -54,13 +47,24 @@
#define MGBE_TXQ_SIZE 131072U #define MGBE_TXQ_SIZE 131072U
/* Rx Queue size is 192KB */ /* Rx Queue size is 192KB */
#define MGBE_RXQ_SIZE 196608U #define MGBE_RXQ_SIZE 196608U
/* MAX PBL value */ /* uFPGA config Tx Queue size is 64KB */
#define MGBE_DMA_CHX_MAX_PBL 256U #define MGBE_TXQ_SIZE_UFPGA 65536U
#define MGBE_DMA_CHX_MAX_PBL_VAL 0x200000U
/* PBL values */
#define MGBE_DMA_CHX_MAX_PBL 32U
#define MGBE_DMA_CHX_PBL_16 16U
#define MGBE_DMA_CHX_PBL_8 8U
#define MGBE_DMA_CHX_PBL_4 4U
#define MGBE_DMA_CHX_PBL_1 1U
/* AXI Data width */ /* AXI Data width */
#define MGBE_AXI_DATAWIDTH 128U #define MGBE_AXI_DATAWIDTH 128U
/** @} */ /** @} */
/**
* @brief MTL Q size depth helper macro
*/
#define Q_SZ_DEPTH(x) (((x) * 1024U) / (MGBE_AXI_DATAWIDTH / 8U))
/** /**
* @brief osi_readl_poll_timeout - Periodically poll an address until * @brief osi_readl_poll_timeout - Periodically poll an address until
* a condition is met or a timeout occurs * a condition is met or a timeout occurs
@@ -254,6 +258,7 @@ static inline void osi_writela(OSI_UNUSED void *priv, nveu32_t val, void *addr)
/** /**
* @brief validate_mac_ver_update_chans - Validates mac version and update chan * @brief validate_mac_ver_update_chans - Validates mac version and update chan
* *
* @param[in] mac: MAC HW type.
* @param[in] mac_ver: MAC version read. * @param[in] mac_ver: MAC version read.
* @param[out] num_max_chans: Maximum channel number. * @param[out] num_max_chans: Maximum channel number.
* @param[out] l_mac_ver: local mac version. * @param[out] l_mac_ver: local mac version.
@@ -269,10 +274,16 @@ static inline void osi_writela(OSI_UNUSED void *priv, nveu32_t val, void *addr)
* @retval 0 - for not Valid MAC * @retval 0 - for not Valid MAC
* @retval 1 - for Valid MAC * @retval 1 - for Valid MAC
*/ */
static inline nve32_t validate_mac_ver_update_chans(nveu32_t mac_ver, static inline nve32_t validate_mac_ver_update_chans(nveu32_t mac,
nveu32_t mac_ver,
nveu32_t *num_max_chans, nveu32_t *num_max_chans,
nveu32_t *l_mac_ver) nveu32_t *l_mac_ver)
{ {
const nveu32_t max_dma_chan[OSI_MAX_MAC_IP_TYPES] = {
OSI_EQOS_MAX_NUM_CHANS,
OSI_MGBE_T23X_MAX_NUM_CHANS,
OSI_MGBE_MAX_NUM_CHANS
};
nve32_t ret; nve32_t ret;
switch (mac_ver) { switch (mac_ver) {
@@ -288,14 +299,20 @@ static inline nve32_t validate_mac_ver_update_chans(nveu32_t mac_ver,
*l_mac_ver = MAC_CORE_VER_TYPE_EQOS_5_30; *l_mac_ver = MAC_CORE_VER_TYPE_EQOS_5_30;
ret = 1; ret = 1;
break; break;
case OSI_EQOS_MAC_5_40:
*num_max_chans = OSI_EQOS_MAX_NUM_CHANS;
*l_mac_ver = MAC_CORE_VER_TYPE_EQOS_5_40;
ret = 1;
break;
case OSI_MGBE_MAC_3_10: case OSI_MGBE_MAC_3_10:
//TBD: T264 uFPGA reports mac version 3.2 //TBD: T264 uFPGA reports mac version 3.2
case OSI_MGBE_MAC_3_20: case OSI_MGBE_MAC_3_20:
case OSI_MGBE_MAC_4_20:
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
case OSI_MGBE_MAC_4_00: case OSI_MGBE_MAC_4_00:
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
//TBD: T264 number of dma channels? //TBD: T264 number of dma channels?
*num_max_chans = OSI_MGBE_MAX_NUM_CHANS; *num_max_chans = max_dma_chan[mac];
*l_mac_ver = MAC_CORE_VER_TYPE_MGBE; *l_mac_ver = MAC_CORE_VER_TYPE_MGBE;
ret = 1; ret = 1;
break; break;
@@ -375,4 +392,46 @@ static inline nve32_t osi_memcmp(const void *dest, const void *src, nve32_t n)
fail: fail:
return ret; return ret;
} }
/**
* @brief osi_valid_pbl_value - returns the allowed pbl value.
* @note
* Algorithm:
* - Check the pbl range and return allowed pbl value
*
* @param[in] pbl: Calculated PBL value
*
* @note Input parameter should be only nveu32_t type
*
* @note
* API Group:
* - Initialization: No
* - Run time: Yes
* - De-initialization: No
*
* @retval allowed pbl value
*/
static inline nveu32_t osi_valid_pbl_value(nveu32_t pbl_value)
{
nveu32_t allowed_pbl;
nveu32_t pbl;
/* 8xPBL mode is set */
pbl = pbl_value / 8U;
if (pbl >= MGBE_DMA_CHX_MAX_PBL) {
allowed_pbl = MGBE_DMA_CHX_MAX_PBL;
} else if (pbl >= MGBE_DMA_CHX_PBL_16) {
allowed_pbl = MGBE_DMA_CHX_PBL_16;
} else if (pbl >= MGBE_DMA_CHX_PBL_8) {
allowed_pbl = MGBE_DMA_CHX_PBL_8;
} else if (pbl >= MGBE_DMA_CHX_PBL_4) {
allowed_pbl = MGBE_DMA_CHX_PBL_4;
} else {
allowed_pbl = MGBE_DMA_CHX_PBL_1;
}
return allowed_pbl;
}
#endif #endif

View File

@@ -26,6 +26,7 @@
#include "eqos_core.h" #include "eqos_core.h"
#include "xpcs.h" #include "xpcs.h"
#include "macsec.h" #include "macsec.h"
#include "osi_macsec.h"
nve32_t poll_check(struct osi_core_priv_data *const osi_core, nveu8_t *addr, nve32_t poll_check(struct osi_core_priv_data *const osi_core, nveu8_t *addr,
nveu32_t bit_check, nveu32_t *value) nveu32_t bit_check, nveu32_t *value)
@@ -172,6 +173,7 @@ fail:
return ret; return ret;
} }
#if 0
static nve32_t xpcs_init_start(struct osi_core_priv_data *const osi_core) static nve32_t xpcs_init_start(struct osi_core_priv_data *const osi_core)
{ {
nve32_t ret = 0; nve32_t ret = 0;
@@ -203,6 +205,7 @@ static nve32_t xpcs_init_start(struct osi_core_priv_data *const osi_core)
fail: fail:
return ret; return ret;
} }
#endif
nve32_t hw_set_speed(struct osi_core_priv_data *const osi_core, const nve32_t speed) nve32_t hw_set_speed(struct osi_core_priv_data *const osi_core, const nve32_t speed)
{ {
@@ -261,8 +264,39 @@ nve32_t hw_set_speed(struct osi_core_priv_data *const osi_core, const nve32_t sp
if (ret != -1) { if (ret != -1) {
osi_writela(osi_core, value, ((nveu8_t *)osi_core->base + mac_mcr[osi_core->mac])); osi_writela(osi_core, value, ((nveu8_t *)osi_core->base + mac_mcr[osi_core->mac]));
/* Validate PCS initialization */ if (osi_core->mac != OSI_MAC_HW_EQOS) {
ret = xpcs_init_start(osi_core); if (speed == OSI_SPEED_25000) {
ret = xlgpcs_init(osi_core);
if (ret < 0) {
goto fail;
}
ret = xlgpcs_start(osi_core);
if (ret < 0) {
goto fail;
}
} else {
ret = xpcs_init(osi_core);
if (ret < 0) {
goto fail;
}
ret = xpcs_start(osi_core);
if (ret < 0) {
goto fail;
}
}
value = osi_readla(osi_core, (nveu8_t *)osi_core->base + MGBE_MAC_IER);
/* Enable Link Status interrupt only after lane bring up success */
value |= MGBE_IMR_RGSMIIIE;
osi_writela(osi_core, value, (nveu8_t *)osi_core->base + MGBE_MAC_IER);
} else if (osi_core->mac_ver == MAC_CORE_VER_TYPE_EQOS_5_40) {
//TDB: eqos sgmii pcs changes
// ret = eqos_xpcs_init(osi_core);
// if (ret < 0) {
// goto fail;
// }
}
} }
fail: fail:
return ret; return ret;
@@ -496,7 +530,7 @@ void hw_config_tscr(struct osi_core_priv_data *const osi_core, OSI_UNUSED const
const nveu32_t mac_pps[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t mac_pps[OSI_MAX_MAC_IP_TYPES] = {
EQOS_MAC_PPS_CTL, EQOS_MAC_PPS_CTL,
MGBE_MAC_PPS_CTL, MGBE_MAC_PPS_CTL,
MGBE_MAC_TCR MGBE_MAC_PPS_CTL
}; };
(void)ptp_filter; // unused (void)ptp_filter; // unused
@@ -656,11 +690,6 @@ nve32_t hw_config_mac_pkt_filter_reg(struct osi_core_priv_data *const osi_core,
value = osi_readla(osi_core, ((nveu8_t *)osi_core->base + MAC_PKT_FILTER_REG)); value = osi_readla(osi_core, ((nveu8_t *)osi_core->base + MAC_PKT_FILTER_REG));
/*Retain all other values */
value &= (MAC_PFR_DAIF | MAC_PFR_DBF | MAC_PFR_SAIF |
MAC_PFR_SAF | MAC_PFR_PCF | MAC_PFR_VTFE |
MAC_PFR_IPFE | MAC_PFR_DNTU | MAC_PFR_RA);
if ((filter->oper_mode & OSI_OPER_EN_PERFECT) != OSI_DISABLE) { if ((filter->oper_mode & OSI_OPER_EN_PERFECT) != OSI_DISABLE) {
value |= MAC_PFR_HPF; value |= MAC_PFR_HPF;
} }
@@ -1324,7 +1353,7 @@ static nve32_t hw_config_fpe_pec_enable(struct osi_core_priv_data *const osi_cor
osi_writela(osi_core, val, (nveu8_t *)osi_core->base + osi_writela(osi_core, val, (nveu8_t *)osi_core->base +
MAC_RQC1R[osi_core->mac & 0x1U]); MAC_RQC1R[osi_core->mac & 0x1U]);
if (osi_core->mac == OSI_MAC_HW_MGBE) { if (osi_core->mac != OSI_MAC_HW_EQOS) {
val = osi_readla(osi_core, (nveu8_t *)osi_core->base + val = osi_readla(osi_core, (nveu8_t *)osi_core->base +
MGBE_MAC_RQC4R); MGBE_MAC_RQC4R);
val &= ~MGBE_MAC_RQC4R_PMCBCQ; val &= ~MGBE_MAC_RQC4R_PMCBCQ;
@@ -1402,10 +1431,11 @@ nve32_t hw_config_fpe(struct osi_core_priv_data *const osi_core,
goto error; goto error;
} }
if (osi_core->mac == OSI_MAC_HW_MGBE) { if (osi_core->mac != OSI_MAC_HW_EQOS) {
#ifdef MACSEC_SUPPORT #ifdef MACSEC_SUPPORT
osi_lock_irq_enabled(&osi_core->macsec_fpe_lock); osi_lock_irq_enabled(&osi_core->macsec_fpe_lock);
/* MACSEC and FPE cannot coexist on MGBE refer bug 3484034 */ /* MACSEC and FPE cannot coexist on MGBE of T234 refer bug 3484034
* Both EQOS and MGBE of T264 cannot have macsec and fpe enabled simultaneously */
if (osi_core->is_macsec_enabled == OSI_ENABLE) { if (osi_core->is_macsec_enabled == OSI_ENABLE) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_INVALID, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_INVALID,
"FPE and MACSEC cannot co-exist\n", 0ULL); "FPE and MACSEC cannot co-exist\n", 0ULL);
@@ -1431,7 +1461,7 @@ nve32_t hw_config_fpe(struct osi_core_priv_data *const osi_core,
osi_writela(osi_core, val, (nveu8_t *)osi_core->base + osi_writela(osi_core, val, (nveu8_t *)osi_core->base +
MAC_FPE_CTS[osi_core->mac & 0x1U]); MAC_FPE_CTS[osi_core->mac & 0x1U]);
if (osi_core->mac == OSI_MAC_HW_MGBE) { if (osi_core->mac != OSI_MAC_HW_EQOS) {
#ifdef MACSEC_SUPPORT #ifdef MACSEC_SUPPORT
osi_core->is_fpe_enabled = OSI_DISABLE; osi_core->is_fpe_enabled = OSI_DISABLE;
#endif /* MACSEC_SUPPORT */ #endif /* MACSEC_SUPPORT */
@@ -1445,7 +1475,7 @@ nve32_t hw_config_fpe(struct osi_core_priv_data *const osi_core,
} }
done: done:
if (osi_core->mac == OSI_MAC_HW_MGBE) { if (osi_core->mac != OSI_MAC_HW_EQOS) {
#ifdef MACSEC_SUPPORT #ifdef MACSEC_SUPPORT
osi_unlock_irq_enabled(&osi_core->macsec_fpe_lock); osi_unlock_irq_enabled(&osi_core->macsec_fpe_lock);
#endif /* MACSEC_SUPPORT */ #endif /* MACSEC_SUPPORT */
@@ -1701,7 +1731,7 @@ void hw_tsn_init(struct osi_core_priv_data *osi_core)
osi_writela(osi_core, val, (nveu8_t *)osi_core->base + osi_writela(osi_core, val, (nveu8_t *)osi_core->base +
MAC_RQC1R[osi_core->mac & 0x1U]); MAC_RQC1R[osi_core->mac & 0x1U]);
if (osi_core->mac == OSI_MAC_HW_MGBE) { if (osi_core->mac != OSI_MAC_HW_EQOS) {
val = osi_readla(osi_core, (nveu8_t *)osi_core->base + val = osi_readla(osi_core, (nveu8_t *)osi_core->base +
MGBE_MAC_RQC4R); MGBE_MAC_RQC4R);
val &= ~MGBE_MAC_RQC4R_PMCBCQ; val &= ~MGBE_MAC_RQC4R_PMCBCQ;
@@ -1741,6 +1771,12 @@ nve32_t hsi_common_error_inject(struct osi_core_priv_data *osi_core,
nveu32_t error_code) nveu32_t error_code)
{ {
nve32_t ret = 0; nve32_t ret = 0;
const nveu32_t rx_isr_set[MAX_MACSEC_IP_TYPES] = {
MACSEC_RX_ISR_SET,
MACSEC_RX_ISR_SET_T26X};
const nveu32_t common_isr_set[MAX_MACSEC_IP_TYPES] = {
MACSEC_COMMON_ISR_SET,
MACSEC_COMMON_ISR_SET_T26X};
switch (error_code) { switch (error_code) {
case OSI_INBOUND_BUS_CRC_ERR: case OSI_INBOUND_BUS_CRC_ERR:
@@ -1756,7 +1792,7 @@ nve32_t hsi_common_error_inject(struct osi_core_priv_data *osi_core,
case OSI_MACSEC_RX_CRC_ERR: case OSI_MACSEC_RX_CRC_ERR:
osi_writela(osi_core, MACSEC_RX_MAC_CRC_ERROR, osi_writela(osi_core, MACSEC_RX_MAC_CRC_ERROR,
(nveu8_t *)osi_core->macsec_base + (nveu8_t *)osi_core->macsec_base +
MACSEC_RX_ISR_SET); rx_isr_set[osi_core->macsec]);
break; break;
case OSI_MACSEC_TX_CRC_ERR: case OSI_MACSEC_TX_CRC_ERR:
osi_writela(osi_core, MACSEC_TX_MAC_CRC_ERROR, osi_writela(osi_core, MACSEC_TX_MAC_CRC_ERROR,
@@ -1766,12 +1802,12 @@ nve32_t hsi_common_error_inject(struct osi_core_priv_data *osi_core,
case OSI_MACSEC_RX_ICV_ERR: case OSI_MACSEC_RX_ICV_ERR:
osi_writela(osi_core, MACSEC_RX_ICV_ERROR, osi_writela(osi_core, MACSEC_RX_ICV_ERROR,
(nveu8_t *)osi_core->macsec_base + (nveu8_t *)osi_core->macsec_base +
MACSEC_RX_ISR_SET); rx_isr_set[osi_core->macsec]);
break; break;
case OSI_MACSEC_REG_VIOL_ERR: case OSI_MACSEC_REG_VIOL_ERR:
osi_writela(osi_core, MACSEC_SECURE_REG_VIOL, osi_writela(osi_core, MACSEC_SECURE_REG_VIOL,
(nveu8_t *)osi_core->macsec_base + (nveu8_t *)osi_core->macsec_base +
MACSEC_COMMON_ISR_SET); common_isr_set[osi_core->macsec]);
break; break;
case OSI_PHY_WRITE_VERIFY_ERR: case OSI_PHY_WRITE_VERIFY_ERR:
osi_core->hsi.err_code[PHY_WRITE_VERIFY_FAIL_IDX] = OSI_PHY_WRITE_VERIFY_ERR; osi_core->hsi.err_code[PHY_WRITE_VERIFY_FAIL_IDX] = OSI_PHY_WRITE_VERIFY_ERR;
@@ -1971,7 +2007,10 @@ static void prepare_l3l4_ctr_reg(const struct osi_core_priv_data *const osi_core
/* Enable L4 filters for SOURCE Port No matching */ /* Enable L4 filters for SOURCE Port No matching */
value |= (l3_l4->data.src.port_match << MAC_L3L4_CTR_L4SPM_SHIFT) | value |= (l3_l4->data.src.port_match << MAC_L3L4_CTR_L4SPM_SHIFT) |
(l3_l4->data.src.port_match_inv << MAC_L3L4_CTR_L4SPIM_SHIFT); (l3_l4->data.src.port_match_inv << MAC_L3L4_CTR_L4SPIM_SHIFT);
if (osi_core->mac == OSI_MAC_HW_MGBE_T26X) {
/* Enable combined L3 and L4 filters */
value |= l3_l4->data.is_l3l4_match_en << MAC_L3L4_CTR_L5TEN_SHIFT;
}
/* set udp / tcp port matching bit (for l4) */ /* set udp / tcp port matching bit (for l4) */
value |= l3_l4->data.is_udp << MAC_L3L4_CTR_L4PEN_SHIFT; value |= l3_l4->data.is_udp << MAC_L3L4_CTR_L4PEN_SHIFT;

View File

@@ -110,6 +110,7 @@
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
#define MAC_L3L4_CTR_L3DAIM_SHIFT 5 #define MAC_L3L4_CTR_L3DAIM_SHIFT 5
#define MAC_L3L4_CTR_L4PEN_SHIFT 16 #define MAC_L3L4_CTR_L4PEN_SHIFT 16
#define MAC_L3L4_CTR_L5TEN_SHIFT 17
#define MAC_L3L4_CTR_L4SPM_SHIFT 18 #define MAC_L3L4_CTR_L4SPM_SHIFT 18
#define MAC_L3L4_CTR_L4SPIM_SHIFT 19 #define MAC_L3L4_CTR_L4SPIM_SHIFT 19
#define MAC_L3L4_CTR_L4DPM_SHIFT 20 #define MAC_L3L4_CTR_L4DPM_SHIFT 20

View File

@@ -229,6 +229,12 @@ struct core_ops {
struct osi_core_frp_data *const data); struct osi_core_frp_data *const data);
/** Called to update FRP NVE and */ /** Called to update FRP NVE and */
void (*update_frp_nve)(struct osi_core_priv_data *const osi_core, const nveu32_t nve); void (*update_frp_nve)(struct osi_core_priv_data *const osi_core, const nveu32_t nve);
/** Called to get RCHList index */
nve32_t (*get_rchlist_index)(struct osi_core_priv_data *const osi_core,
nveu8_t const *mac_addr);
/** Called to free RCHLIST index */
void (*free_rchlist_index)(struct osi_core_priv_data *const osi_core,
const nve32_t rch_indx);
#ifdef HSI_SUPPORT #ifdef HSI_SUPPORT
/** Interface function called to initialize HSI */ /** Interface function called to initialize HSI */
nve32_t (*core_hsi_configure)(struct osi_core_priv_data *const osi_core, nve32_t (*core_hsi_configure)(struct osi_core_priv_data *const osi_core,
@@ -316,7 +322,7 @@ struct core_l2 {
struct dynamic_cfg { struct dynamic_cfg {
nveu32_t flags; nveu32_t flags;
/** L3_L4 filters */ /** L3_L4 filters */
struct osi_l3_l4_filter l3_l4[OSI_MGBE_MAX_L3_L4_FILTER]; struct osi_l3_l4_filter l3_l4[OSI_MGBE_MAX_L3_L4_FILTER_T264];
/** flow control */ /** flow control */
nveu32_t flow_ctrl; nveu32_t flow_ctrl;
/** AVB */ /** AVB */

View File

@@ -2072,7 +2072,7 @@ static nve32_t eqos_update_mac_addr_low_high_reg(
nveu32_t idx = filter->index; nveu32_t idx = filter->index;
nveu32_t dma_routing_enable = filter->dma_routing; nveu32_t dma_routing_enable = filter->dma_routing;
nveu32_t dma_chan = filter->dma_chan; nveu32_t dma_chan = filter->dma_chan;
nveu32_t dma_chansel = filter->dma_chansel; nveu64_t dma_chansel = filter->dma_chansel;
nveu32_t addr_mask = filter->addr_mask; nveu32_t addr_mask = filter->addr_mask;
nveu32_t src_dest = filter->src_dest; nveu32_t src_dest = filter->src_dest;
nveu32_t value = OSI_DISABLE; nveu32_t value = OSI_DISABLE;
@@ -4022,6 +4022,43 @@ static nve32_t eqos_post_pad_calibrate(
return ret; return ret;
} }
/**
* @brief eqos_free_rchlist_index - Free index.
*
* Algorithm: This function just free the Receive channel index.
*
* @param[in] osi_core: OSI core private data structure.
* @param[in] rch_idx: Receive channel index.
*
*/
static void eqos_free_rchlist_index(struct osi_core_priv_data *osi_core,
const nve32_t rch_idx) {
(void) osi_core;
(void) rch_idx;
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Free RCHLIST not supported by EQOS\n", 0ULL);
}
/**
* @brief eqos_rchlist_get_index - find free index
*
* Algorithm: This function gets free index for receive channel list.
*
* @param[in] osi_core: OSI core private data structure.
* @param[in] mac_addr: Mac address.
*
* @retval -1 on failure.
**/
static nve32_t eqos_get_rchlist_index(struct osi_core_priv_data *osi_core,
nveu8_t const *mac_addr) {
(void) osi_core;
(void) mac_addr;
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"RCHLIST not supported by EQOS\n", 0ULL);
return -1;
}
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
/** /**
* @brief eqos_config_rss - Configure RSS * @brief eqos_config_rss - Configure RSS
@@ -4151,6 +4188,8 @@ void eqos_init_core_ops(struct core_ops *ops)
ops->config_frp = eqos_config_frp; ops->config_frp = eqos_config_frp;
ops->update_frp_entry = eqos_update_frp_entry; ops->update_frp_entry = eqos_update_frp_entry;
ops->update_frp_nve = eqos_update_frp_nve; ops->update_frp_nve = eqos_update_frp_nve;
ops->get_rchlist_index = eqos_get_rchlist_index;
ops->free_rchlist_index = eqos_free_rchlist_index;
#if defined MACSEC_SUPPORT && !defined OSI_STRIPPED_LIB #if defined MACSEC_SUPPORT && !defined OSI_STRIPPED_LIB
ops->read_macsec_reg = eqos_read_macsec_reg; ops->read_macsec_reg = eqos_read_macsec_reg;
ops->write_macsec_reg = eqos_write_macsec_reg; ops->write_macsec_reg = eqos_write_macsec_reg;

View File

@@ -200,7 +200,7 @@ static nve32_t validate_frp_args(struct osi_core_priv_data *const osi_core,
OSI_UNUSED nveu8_t pos, OSI_UNUSED nveu8_t pos,
nveu32_t *req_entries) nveu32_t *req_entries)
{ {
nveu32_t dma_sel_val[OSI_MAX_MAC_IP_TYPES] = {0xFFU, 0x3FFU, 0x3FFU}; nveu64_t dma_sel_val[OSI_MAX_MAC_IP_TYPES] = {0xFFU, 0x3FFU, 0xFFFFFFFFFFFFU};
nve32_t ret = 0; nve32_t ret = 0;
(void)pos; (void)pos;
@@ -253,7 +253,9 @@ done:
* @param[in] offset: Actual match data offset position. * @param[in] offset: Actual match data offset position.
* @param[in] filter_mode: Filter mode from FRP command. * @param[in] filter_mode: Filter mode from FRP command.
* @param[in] next_frp_id: FRP ID to link this ID. * @param[in] next_frp_id: FRP ID to link this ID.
* @param[in] dma_sel: Indicate the DMA Channel Number (1-bit for each). * @param[in] dcht: DMA Channel Selection Type.
* @param[in] rchlist_indx: Receive Channel list index.
*
* *
* @retval 0 on success. * @retval 0 on success.
* @retval -1 on failure. * @retval -1 on failure.
@@ -266,7 +268,9 @@ static nve32_t frp_entry_add(struct osi_core_priv_data *const osi_core,
nveu8_t offset, nveu8_t offset,
nveu8_t filter_mode, nveu8_t filter_mode,
nve32_t next_frp_id, nve32_t next_frp_id,
nveu32_t dma_sel) nveu32_t dma_sel,
nveu8_t dcht,
nve32_t rchlist_indx)
{ {
struct osi_core_frp_entry *entry = OSI_NULL; struct osi_core_frp_entry *entry = OSI_NULL;
struct osi_core_frp_data *data = OSI_NULL; struct osi_core_frp_data *data = OSI_NULL;
@@ -340,6 +344,9 @@ static nve32_t frp_entry_add(struct osi_core_priv_data *const osi_core,
/* Fill DCH */ /* Fill DCH */
data->dma_chsel = dma_sel; data->dma_chsel = dma_sel;
/* Fill dcht & rchlist_indx */
data->rchlist_indx = rchlist_indx;
data->dcht = dcht;
/* Check for the remain data and update FRP flags */ /* Check for the remain data and update FRP flags */
if (md_pos < length) { if (md_pos < length) {
/* Reset AF, RF and set NIC, OKI */ /* Reset AF, RF and set NIC, OKI */
@@ -456,13 +463,15 @@ frp_hw_write_error:
* @param[in] osi_core: OSI core private data structure. * @param[in] osi_core: OSI core private data structure.
* @param[in] cmd: OSI FRP command structure. * @param[in] cmd: OSI FRP command structure.
* @param[in] pos: Pointer to the FRP entry position. * @param[in] pos: Pointer to the FRP entry position.
* @param[in] rchlist_indx: Index to the rchlist.
* *
* @retval 0 on success. * @retval 0 on success.
* @retval -1 on failure. * @retval -1 on failure.
*/ */
static nve32_t frp_add_proto(struct osi_core_priv_data *const osi_core, static nve32_t frp_add_proto(struct osi_core_priv_data *const osi_core,
struct osi_core_frp_cmd *const cmd, struct osi_core_frp_cmd *const cmd,
nveu8_t *pos) nveu8_t *pos,
nve32_t rchlist_indx)
{ {
nve32_t ret, proto_oki; nve32_t ret, proto_oki;
nveu8_t proto_entry = OSI_DISABLE; nveu8_t proto_entry = OSI_DISABLE;
@@ -538,7 +547,8 @@ static nve32_t frp_add_proto(struct osi_core_priv_data *const osi_core,
ret = frp_entry_add(osi_core, cmd->frp_id, *pos, ret = frp_entry_add(osi_core, cmd->frp_id, *pos,
proto_match, proto_lendth, proto_match, proto_lendth,
proto_offset, OSI_FRP_MODE_LINK, proto_offset, OSI_FRP_MODE_LINK,
proto_oki, cmd->dma_sel); proto_oki, cmd->dma_sel, cmd->dcht,
rchlist_indx);
if (ret < 0) { if (ret < 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Fail add FRP protocol entry\n", "Fail add FRP protocol entry\n",
@@ -627,6 +637,7 @@ static nve32_t frp_delete(struct osi_core_priv_data *const osi_core,
nveu8_t i = 0U, pos = 0U, count = 0U; nveu8_t i = 0U, pos = 0U, count = 0U;
nve32_t frp_id = cmd->frp_id; nve32_t frp_id = cmd->frp_id;
nveu32_t frp_cnt = osi_core->frp_cnt; nveu32_t frp_cnt = osi_core->frp_cnt;
struct osi_core_frp_entry *entry = OSI_NULL;
/* Check for FRP entries */ /* Check for FRP entries */
if (frp_cnt == 0U) { if (frp_cnt == 0U) {
@@ -646,6 +657,11 @@ static nve32_t frp_delete(struct osi_core_priv_data *const osi_core,
goto done; goto done;
} }
/* Free the RCHLIST index */
entry = &osi_core->frp_table[frp_id];
ops_p->free_rchlist_index(osi_core,
entry->data.rchlist_indx);
/* Update the frp_table entry */ /* Update the frp_table entry */
osi_memset(&osi_core->frp_table[pos], 0U, osi_memset(&osi_core->frp_table[pos], 0U,
(sizeof(struct osi_core_frp_entry) * count)); (sizeof(struct osi_core_frp_entry) * count));
@@ -692,6 +708,8 @@ static nve32_t frp_update(struct osi_core_priv_data *const osi_core,
nveu8_t pos = 0U, count = 0U, req = 0U; nveu8_t pos = 0U, count = 0U, req = 0U;
nveu16_t req_16bit = 0U; nveu16_t req_16bit = 0U;
nve32_t frp_id = cmd->frp_id; nve32_t frp_id = cmd->frp_id;
struct osi_core_frp_entry *entry = OSI_NULL;
nve32_t rchlist_indx = 0;
/* Validate given frp_id */ /* Validate given frp_id */
if (frp_entry_find(osi_core, frp_id, &pos, &count) < 0) { if (frp_entry_find(osi_core, frp_id, &pos, &count) < 0) {
@@ -702,6 +720,9 @@ static nve32_t frp_update(struct osi_core_priv_data *const osi_core,
goto done; goto done;
} }
entry = &osi_core->frp_table[frp_id];
rchlist_indx = entry->data.rchlist_indx;
/* Parse match type and update command offset */ /* Parse match type and update command offset */
frp_parse_mtype(cmd); frp_parse_mtype(cmd);
@@ -732,8 +753,8 @@ static nve32_t frp_update(struct osi_core_priv_data *const osi_core,
goto done; goto done;
} }
/* Process and update FRP Command Protocal Entry */ /* Process and update FRP Command Protocol Entry */
ret = frp_add_proto(osi_core, cmd, &pos); ret = frp_add_proto(osi_core, cmd, &pos, rchlist_indx);
if (ret < 0) { if (ret < 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Fail to parse match type\n", "Fail to parse match type\n",
@@ -745,7 +766,8 @@ static nve32_t frp_update(struct osi_core_priv_data *const osi_core,
ret = frp_entry_add(osi_core, frp_id, pos, ret = frp_entry_add(osi_core, frp_id, pos,
cmd->match, cmd->match_length, cmd->match, cmd->match_length,
cmd->offset, cmd->filter_mode, cmd->offset, cmd->filter_mode,
cmd->next_frp_id, cmd->dma_sel); cmd->next_frp_id, cmd->dma_sel,
cmd->dcht, rchlist_indx);
if (ret < 0) { if (ret < 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Fail to update FRP entry\n", "Fail to update FRP entry\n",
@@ -784,6 +806,7 @@ static nve32_t frp_add(struct osi_core_priv_data *const osi_core,
nve32_t ret; nve32_t ret;
nveu8_t pos = 0U, count = 0U; nveu8_t pos = 0U, count = 0U;
nve32_t frp_id = cmd->frp_id; nve32_t frp_id = cmd->frp_id;
nve32_t rchlist_indx = 0;
/* Check for MAX FRP entries */ /* Check for MAX FRP entries */
if (osi_core->frp_cnt >= OSI_FRP_MAX_ENTRY) { if (osi_core->frp_cnt >= OSI_FRP_MAX_ENTRY) {
@@ -807,8 +830,20 @@ static nve32_t frp_add(struct osi_core_priv_data *const osi_core,
/* Parse match type and update command offset */ /* Parse match type and update command offset */
frp_parse_mtype(cmd); frp_parse_mtype(cmd);
if (cmd->dcht == OSI_ENABLE) {
/* Find rchlist Free index */
rchlist_indx = ops_p->get_rchlist_index(osi_core, OSI_NULL);
if (rchlist_indx < 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Fail to get rchlist index\n",
OSI_NONE);
goto done;
}
osi_core->rch_index[rchlist_indx/*ret*/].in_use = OSI_ENABLE;
}
/* Process and add FRP Command Protocal Entry */ /* Process and add FRP Command Protocal Entry */
ret = frp_add_proto(osi_core, cmd, (nveu8_t *)&osi_core->frp_cnt); ret = frp_add_proto(osi_core, cmd, (nveu8_t *)&osi_core->frp_cnt, rchlist_indx);
if (ret < 0) { if (ret < 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Fail to parse match type\n", "Fail to parse match type\n",
@@ -820,7 +855,8 @@ static nve32_t frp_add(struct osi_core_priv_data *const osi_core,
ret = frp_entry_add(osi_core, frp_id, (nveu8_t)(osi_core->frp_cnt & 0xFFU), ret = frp_entry_add(osi_core, frp_id, (nveu8_t)(osi_core->frp_cnt & 0xFFU),
cmd->match, cmd->match_length, cmd->match, cmd->match_length,
cmd->offset, cmd->filter_mode, cmd->offset, cmd->filter_mode,
cmd->next_frp_id, cmd->dma_sel); cmd->next_frp_id, cmd->dma_sel,
cmd->dcht, rchlist_indx);
if (ret < 0) { if (ret < 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Fail to add FRP entry\n", "Fail to add FRP entry\n",

View File

File diff suppressed because it is too large Load Diff

View File

@@ -46,55 +46,89 @@
#define MACSEC_TX_IMR 0x4008 #define MACSEC_TX_IMR 0x4008
#define MACSEC_TX_ISR 0x400C #define MACSEC_TX_ISR 0x400C
#define MACSEC_RX_IMR 0x4048 #define MACSEC_RX_IMR 0x4048
#define MACSEC_RX_IMR_T26X 0x4050
#define MACSEC_RX_ISR 0x404C #define MACSEC_RX_ISR 0x404C
#define MACSEC_RX_ISR_T26X 0x4054
#define MACSEC_TX_SC_PN_THRESHOLD_STATUS0_0 0x4018 #define MACSEC_TX_SC_PN_THRESHOLD_STATUS0_0 0x4018
#define MACSEC_TX_SC_PN_THRESHOLD_STATUS1_0 0x401C #define MACSEC_TX_SC_PN_THRESHOLD_STATUS0_0_T26X 0x4018
#define MACSEC_TX_SC_PN_EXHAUSTED_STATUS0_0 0x4024 #define MACSEC_TX_SC_PN_EXHAUSTED_STATUS0_0 0x4024
#define MACSEC_TX_SC_PN_EXHAUSTED_STATUS1_0 0x4028 #define MACSEC_TX_SC_PN_EXHAUSTED_STATUS0_0_T26X 0x4030
#define MACSEC_TX_SC_ERROR_INTERRUPT_STATUS_0 0x402C #define MACSEC_TX_SC_ERROR_INTERRUPT_STATUS_0 0x402C
#define MACSEC_TX_SC_ERROR_INTERRUPT_STATUS0_0_T26X 0x4048
#define MACSEC_RX_SC_PN_EXHAUSTED_STATUS0_0 0x405C #define MACSEC_RX_SC_PN_EXHAUSTED_STATUS0_0 0x405C
#define MACSEC_RX_SC_PN_EXHAUSTED_STATUS1_0 0x4060 #define MACSEC_RX_SC_PN_EXHAUSTED_STATUS0_0_T26X 0x4064
#define MACSEC_RX_SC_REPLAY_ERROR_STATUS0_0 0x4090 #define MACSEC_RX_SC_REPLAY_ERROR_STATUS0_0 0x4090
#define MACSEC_RX_SC_REPLAY_ERROR_STATUS1_0 0x4094 #define MACSEC_RX_SC_REPLAY_ERROR_STATUS0_0_T26X 0x4084
#define MACSEC_STATS_CONTROL_0 0x900C #define MACSEC_STATS_CONTROL_0 0x900C
#define MACSEC_TX_PKTS_UNTG_LO_0 0x9010 #define MACSEC_TX_PKTS_UNTG_LO_0 0x9010
#define MACSEC_TX_OCTETS_PRTCTD_LO_0 0x9018 #define MACSEC_TX_OCTETS_PRTCTD_LO_0 0x9018
#define MACSEC_TX_OCTETS_ENCRYPTED_LO_0 0x91A8
#define MACSEC_TX_PKTS_TOO_LONG_LO_0 0x9020 #define MACSEC_TX_PKTS_TOO_LONG_LO_0 0x9020
#define MACSEC_TX_PKTS_PROTECTED_SCx_LO_0(x) ((0x9028UL) + ((x) * 8UL)) #define MACSEC_TX_PKTS_PROTECTED_SCx_LO_0(x) ((0x9028UL) + ((x) * 8UL))
#define MACSEC_TX_PKTS_ENCRYPTED_SCx_LO_0(x) ((0x91B0UL) + ((x) * 8UL))
#define MACSEC_RX_PKTS_NOTG_LO_0 0x90B0 #define MACSEC_RX_PKTS_NOTG_LO_0 0x90B0
#define MACSEC_RX_PKTS_NOTG_LO_0_T26X 0x9338
#define MACSEC_RX_PKTS_UNTG_LO_0 0x90A8 #define MACSEC_RX_PKTS_UNTG_LO_0 0x90A8
#define MACSEC_RX_PKTS_UNTG_LO_0_T26X 0x9330
#define MACSEC_RX_PKTS_BADTAG_LO_0 0x90B8 #define MACSEC_RX_PKTS_BADTAG_LO_0 0x90B8
#define MACSEC_RX_PKTS_BADTAG_LO_0_T26X 0x9040
#define MACSEC_RX_PKTS_NOSA_LO_0 0x90C0 #define MACSEC_RX_PKTS_NOSA_LO_0 0x90C0
#define MACSEC_RX_PKTS_NOSA_LO_0_T26X 0x9348
#define MACSEC_RX_PKTS_NOSAERROR_LO_0 0x90C8 #define MACSEC_RX_PKTS_NOSAERROR_LO_0 0x90C8
#define MACSEC_RX_PKTS_NOSAERROR_LO_0_T26X 0x9350
#define MACSEC_RX_PKTS_OVRRUN_LO_0 0x90D0 #define MACSEC_RX_PKTS_OVRRUN_LO_0 0x90D0
#define MACSEC_RX_PKTS_OVRRUN_LO_0_T26X 0x9358
#define MACSEC_RX_OCTETS_VLDTD_LO_0 0x90D8 #define MACSEC_RX_OCTETS_VLDTD_LO_0 0x90D8
#define MACSEC_RX_PKTS_LATE_SCx_LO_0(x) ((0x90E0UL) + ((x) * 8UL)) #define MACSEC_RX_OCTETS_DECRYPD_LO_0 0x9368
#define MACSEC_RX_PKTS_NOTVALID_SCx_LO_0(x) ((0x9160UL) + ((x) * 8UL)) #define MACSEC_RX_OCTETS_VLDTD_LO_0_T26X 0x9360
#define MACSEC_RX_PKTS_OK_SCx_LO_0(x) ((0x91E0UL) + ((x) * 8UL)) #define MACSEC_RX_PKTS_LATE_SCx_LO_0(x) ((0x90E0U) + ((x) * 8U))
#define MACSEC_RX_PKTS_LATE_SCx_LO_0_T26X(x) ((0x9370U) + ((x) * 8U))
#define MACSEC_RX_PKTS_NOTVALID_SCx_LO_0(x) ((0x9160U) + ((x) * 8U))
#define MACSEC_RX_PKTS_NOTVALID_SCx_LO_0_T26X(x) ((0x94F0U) + ((x) * 8U))
#define MACSEC_RX_PKTS_OK_SCx_LO_0(x) ((0x91E0U) + ((x) * 8U))
#define MACSEC_RX_PKTS_OK_SCx_LO_0_T26X(x) ((0x9670U) + ((x) * 8U))
#define MACSEC_CONTROL0 0xD000 #define MACSEC_CONTROL0 0xD000
#define MACSEC_LUT_CONFIG 0xD004 #define MACSEC_LUT_CONFIG 0xD004
#define MACSEC_LUT_DATA(x) ((0xD008U) + ((x) * 4U)) #define MACSEC_LUT_DATA(x) ((0xD008U) + ((x) * 4U))
#define MACSEC_TX_BYP_LUT_VALID 0xD024 #define MACSEC_TX_BYP_LUT_VALID 0xD024
#define MACSEC_TX_BYP_LUT_VALID0_T26X 0xD024U
#define MACSEC_TX_BYP_LUT_VALID1_T26X 0xD028U
#define MACSEC_TX_SCI_LUT_VALID 0xD028 #define MACSEC_TX_SCI_LUT_VALID 0xD028
#define MACSEC_TX_SCI_LUT_VALID0_T26X 0xD02CU
#define MACSEC_TX_SCI_LUT_VALID1_T26X 0xD030U
#define MACSEC_RX_BYP_LUT_VALID 0xD02C #define MACSEC_RX_BYP_LUT_VALID 0xD02C
#define MACSEC_RX_BYP_LUT_VALID0_T26X 0xD034U
#define MACSEC_RX_BYP_LUT_VALID1_T26X 0xD038U
#define MACSEC_RX_SCI_LUT_VALID 0xD030 #define MACSEC_RX_SCI_LUT_VALID 0xD030
#define MACSEC_RX_SCI_LUT_VALID0_T26X 0xD03CU
#define MACSEC_RX_SCI_LUT_VALID1_T26X 0xD040U
#define MACSEC_COMMON_IMR 0xD054 #define MACSEC_COMMON_IMR 0xD054
#define MACSEC_COMMON_IMR_T26X 0xD064
#define MACSEC_COMMON_ISR 0xD058 #define MACSEC_COMMON_ISR 0xD058
#define MACSEC_COMMON_ISR_T26X 0xD068
#define MACSEC_TX_SC_KEY_INVALID_STS0_0 0xD064 #define MACSEC_TX_SC_KEY_INVALID_STS0_0 0xD064
#define MACSEC_TX_SC_KEY_INVALID_STS1_0 0xD068 #define MACSEC_TX_SC_KEY_INVALID_STS0_0_T26X 0xD074
#define MACSEC_RX_SC_KEY_INVALID_STS0_0 0xD080 #define MACSEC_RX_SC_KEY_INVALID_STS0_0 0xD080
#define MACSEC_RX_SC_KEY_INVALID_STS1_0 0xD084 #define MACSEC_RX_SC_KEY_INVALID_STS0_0_T26X 0xD08C
#define MACSEC_TX_DEBUG_STATUS_0 0xD0C4 #define MACSEC_TX_DEBUG_STATUS_0 0xD0C4
#define MACSEC_TX_DEBUG_STATUS_0_T26X 0xD0D0
#define MACSEC_TX_DEBUG_TRIGGER_EN_0 0xD09C #define MACSEC_TX_DEBUG_TRIGGER_EN_0 0xD09C
#define MACSEC_TX_DEBUG_TRIGGER_EN_0_T26X 0xD0A8
#define MACSEC_RX_DEBUG_STATUS_0 0xD0F8 #define MACSEC_RX_DEBUG_STATUS_0 0xD0F8
#define MACSEC_RX_DEBUG_STATUS_0_T26X 0xD104
#define MACSEC_RX_DEBUG_TRIGGER_EN_0 0xD0E0 #define MACSEC_RX_DEBUG_TRIGGER_EN_0 0xD0E0
#define MACSEC_RX_DEBUG_TRIGGER_EN_0_T26X 0xD0EC
#ifdef DEBUG_MACSEC #ifdef DEBUG_MACSEC
#define MACSEC_TX_DEBUG_CONTROL_0 0xD098 #define MACSEC_TX_DEBUG_CONTROL_0 0xD098
#define MACSEC_TX_DEBUG_CONTROL_0_T26X 0xD0A4
#define MACSEC_DEBUG_BUF_CONFIG_0 0xD0C8 #define MACSEC_DEBUG_BUF_CONFIG_0 0xD0C8
#define MACSEC_DEBUG_BUF_CONFIG_0_T26X 0xD0D4
#define MACSEC_DEBUG_BUF_DATA_0(x) ((0xD0CCU) + ((x) * 4U)) #define MACSEC_DEBUG_BUF_DATA_0(x) ((0xD0CCU) + ((x) * 4U))
#define MACSEC_DEBUG_BUF_DATA_0_T26X(x) ((0xD0D8U) + ((x) * 4U))
#define MACSEC_RX_DEBUG_CONTROL_0 0xD0DC #define MACSEC_RX_DEBUG_CONTROL_0 0xD0DC
#define MACSEC_RX_DEBUG_CONTROL_0_T26X 0xD0E8
#endif /* DEBUG_MACSEC */ #endif /* DEBUG_MACSEC */
#define MACSEC_CONTROL1 0xE000 #define MACSEC_CONTROL1 0xE000
@@ -115,7 +149,8 @@
#define MACSEC_KT_CONFIG_UPDATE OSI_BIT(31) #define MACSEC_KT_CONFIG_UPDATE OSI_BIT(31)
#define MACSEC_KT_CONFIG_CTLR_SEL OSI_BIT(25) #define MACSEC_KT_CONFIG_CTLR_SEL OSI_BIT(25)
#define MACSEC_KT_CONFIG_RW OSI_BIT(24) #define MACSEC_KT_CONFIG_RW OSI_BIT(24)
#define MACSEC_KT_CONFIG_INDEX_MASK (OSI_BIT(4) | OSI_BIT(3) | OSI_BIT(2) |\ #define MACSEC_KT_CONFIG_INDEX_MASK (OSI_BIT(6) | OSI_BIT(5) |\
OSI_BIT(4) | OSI_BIT(3) | OSI_BIT(2) |\
OSI_BIT(1) | OSI_BIT(0)) OSI_BIT(1) | OSI_BIT(0))
#define MACSEC_KT_ENTRY_VALID OSI_BIT(0) #define MACSEC_KT_ENTRY_VALID OSI_BIT(0)
/** @} */ /** @} */
@@ -144,7 +179,8 @@
#define MACSEC_LUT_CONFIG_LUT_SEL_MASK (OSI_BIT(18) | OSI_BIT(17) |\ #define MACSEC_LUT_CONFIG_LUT_SEL_MASK (OSI_BIT(18) | OSI_BIT(17) |\
OSI_BIT(16)) OSI_BIT(16))
#define MACSEC_LUT_CONFIG_LUT_SEL_SHIFT 16 #define MACSEC_LUT_CONFIG_LUT_SEL_SHIFT 16
#define MACSEC_LUT_CONFIG_INDEX_MASK (OSI_BIT(4) | OSI_BIT(3) | OSI_BIT(2) |\ #define MACSEC_LUT_CONFIG_INDEX_MASK (OSI_BIT(6) | OSI_BIT(5) |\
OSI_BIT(4) | OSI_BIT(3) | OSI_BIT(2) |\
OSI_BIT(1) | OSI_BIT(0)) OSI_BIT(1) | OSI_BIT(0))
/** @} */ /** @} */
/** /**
@@ -464,8 +500,12 @@
#define MACSEC_LUT_AN3_VALID OSI_BIT(16) #define MACSEC_LUT_AN3_VALID OSI_BIT(16)
/* DVLAN packet in LUT_DATA[6] register */ /* DVLAN packet in LUT_DATA[6] register */
#define MACSEC_TX_SCI_LUT_DVLAN_PKT OSI_BIT(21) #define MACSEC_TX_SCI_LUT_DVLAN_PKT OSI_BIT(21)
#define MACSEC_TX_SCI_LUT_DVLAN_PKT_T26X OSI_BIT(23)
/* DVLAN outer/inner tag select in LUT_DATA[6] register */ /* DVLAN outer/inner tag select in LUT_DATA[6] register */
#define MACSEC_TX_SCI_LUT_DVLAN_OUTER_INNER_TAG_SEL OSI_BIT(22) #define MACSEC_TX_SCI_LUT_DVLAN_OUTER_INNER_TAG_SEL OSI_BIT(22)
#define MACSEC_TX_SCI_LUT_DVLAN_OUTER_INNER_TAG_SEL_T26X OSI_BIT(24)
/* SA State LUT entry valid in LUT_DATA[0] register */ /* SA State LUT entry valid in LUT_DATA[0] register */
#define MACSEC_SA_STATE_LUT_ENTRY_VALID OSI_BIT(0) #define MACSEC_SA_STATE_LUT_ENTRY_VALID OSI_BIT(0)
@@ -486,10 +526,12 @@
#ifdef HSI_SUPPORT #ifdef HSI_SUPPORT
/* Set RX ISR set interrupt status bit */ /* Set RX ISR set interrupt status bit */
#define MACSEC_RX_ISR_SET 0x4050U #define MACSEC_RX_ISR_SET 0x4050U
#define MACSEC_RX_ISR_SET_T26X 0x4058U
/* Set TX ISR set interrupt status bit */ /* Set TX ISR set interrupt status bit */
#define MACSEC_TX_ISR_SET 0x4010U #define MACSEC_TX_ISR_SET 0x4010U
/* Set Common ISR set interrupt status bit */ /* Set Common ISR set interrupt status bit */
#define MACSEC_COMMON_ISR_SET 0xd05cU #define MACSEC_COMMON_ISR_SET 0xD05cU
#define MACSEC_COMMON_ISR_SET_T26X 0xD06cU
#endif #endif
#endif /* INCLUDED_MACSEC_H */ #endif /* INCLUDED_MACSEC_H */

View File

File diff suppressed because it is too large Load Diff

View File

@@ -25,7 +25,6 @@
#define INCLUDED_MGBE_CORE_H_ #define INCLUDED_MGBE_CORE_H_
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
#define MGBE_MAC_PFR 0x0008
#define MGBE_MAC_RX_FLW_CTRL 0x0090 #define MGBE_MAC_RX_FLW_CTRL 0x0090
#define MGBE_MAC_RQC2R 0x00A8 #define MGBE_MAC_RQC2R 0x00A8
#define MGBE_MAC_QX_TX_FLW_CTRL(x) ((0x0004U * (x)) + 0x0070U) #define MGBE_MAC_QX_TX_FLW_CTRL(x) ((0x0004U * (x)) + 0x0070U)
@@ -45,6 +44,8 @@
#define MGBE_WRAP_AXI_ASID0_CTRL 0x8400 #define MGBE_WRAP_AXI_ASID0_CTRL 0x8400
#define MGBE_WRAP_AXI_ASID1_CTRL 0x8404 #define MGBE_WRAP_AXI_ASID1_CTRL 0x8404
#define MGBE_WRAP_AXI_ASID2_CTRL 0x8408 #define MGBE_WRAP_AXI_ASID2_CTRL 0x8408
#define MGBE_MAC_PFR_DHLFRS OSI_BIT(12)
#define MGBE_MAC_PFR_DHLFRS_MASK (OSI_BIT(12) | OSI_BIT(11))
#define MGBE_MAC_PFR_VTFE OSI_BIT(16) #define MGBE_MAC_PFR_VTFE OSI_BIT(16)
#define MGBE_MAC_PFR_IPFE OSI_BIT(20) #define MGBE_MAC_PFR_IPFE OSI_BIT(20)
#define MGBE_MAC_PFR_IPFE_SHIFT 20 #define MGBE_MAC_PFR_IPFE_SHIFT 20
@@ -58,6 +59,10 @@
#define MGBE1_SID ((nveu32_t)0x49U) #define MGBE1_SID ((nveu32_t)0x49U)
#define MGBE2_SID ((nveu32_t)0x4AU) #define MGBE2_SID ((nveu32_t)0x4AU)
#define MGBE3_SID ((nveu32_t)0x4BU) #define MGBE3_SID ((nveu32_t)0x4BU)
#define MGBE0_SID_T264 ((nveu32_t)0x0U)
#define MGBE1_SID_T264 ((nveu32_t)0x0U)
#define MGBE2_SID_T264 ((nveu32_t)0x0U)
#define MGBE3_SID_T264 ((nveu32_t)0x0U)
#define MGBE_MAC_PAUSE_TIME 0xFFFF0000U #define MGBE_MAC_PAUSE_TIME 0xFFFF0000U
#define MGBE_MAC_PAUSE_TIME_MASK 0xFFFF0000U #define MGBE_MAC_PAUSE_TIME_MASK 0xFFFF0000U
#define MGBE_MAC_VLAN_TR_VTHM OSI_BIT(25) #define MGBE_MAC_VLAN_TR_VTHM OSI_BIT(25)
@@ -80,9 +85,21 @@
#define MGBE_MAC_RQC1R_PTPQ_SHIFT 24U #define MGBE_MAC_RQC1R_PTPQ_SHIFT 24U
#define MGBE_MAC_RQC1R_PTPQ (OSI_BIT(27) | OSI_BIT(26) | \ #define MGBE_MAC_RQC1R_PTPQ (OSI_BIT(27) | OSI_BIT(26) | \
OSI_BIT(25) | OSI_BIT(24)) OSI_BIT(25) | OSI_BIT(24))
#define MGBE_PKTID_MASK (OSI_BIT(9) | OSI_BIT(8) | \
OSI_BIT(7) | OSI_BIT(6) | \
OSI_BIT(5) | OSI_BIT(4) | \
OSI_BIT(3) | OSI_BIT(2) | \
OSI_BIT(1) | OSI_BIT(0))
/* T264 VDMA ID bits */
#define MGBE_VDMAID_MASK (OSI_BIT(23) | OSI_BIT(22) | \
OSI_BIT(21) | OSI_BIT(20) | \
OSI_BIT(19) | OSI_BIT(18) | \
OSI_BIT(17) | OSI_BIT(16))
#define MGBE_MAC_RMCR_LM OSI_BIT(10) #define MGBE_MAC_RMCR_LM OSI_BIT(10)
#define MGBE_MAC_RMCR_ARPEN OSI_BIT(31) #define MGBE_MAC_RMCR_ARPEN OSI_BIT(31)
#define MGBE_MAC_QX_TX_FLW_CTRL_TFE OSI_BIT(1) #define MGBE_MAC_QX_TX_FLW_CTRL_TFE OSI_BIT(1)
#define MGBE_MAC_TMCR_IFP OSI_BIT(11)
#define MGBE_MAC_TMCR_IPG OSI_BIT(8) | OSI_BIT(9)
#define MGBE_MAC_RQC1R_TPQC0 OSI_BIT(21) #define MGBE_MAC_RQC1R_TPQC0 OSI_BIT(21)
#define MGBE_MAC_RQC1R_OMCBCQ OSI_BIT(20) #define MGBE_MAC_RQC1R_OMCBCQ OSI_BIT(20)
#define MGBE_MAC_RSS_CTRL_RSSE OSI_BIT(0) #define MGBE_MAC_RSS_CTRL_RSSE OSI_BIT(0)
@@ -150,11 +167,26 @@
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
#define MGBE_PKTID_MASK (OSI_BIT(9) | OSI_BIT(8) | \
OSI_BIT(7) | OSI_BIT(6) | \
OSI_BIT(5) | OSI_BIT(4) | \
OSI_BIT(3) | OSI_BIT(2) | \
OSI_BIT(1) | OSI_BIT(0))
/* T264 VDMA ID bits */
#define MGBE_VDMAID_MASK (OSI_BIT(23) | OSI_BIT(22) | \
OSI_BIT(21) | OSI_BIT(20) | \
OSI_BIT(19) | OSI_BIT(18) | \
OSI_BIT(17) | OSI_BIT(16))
#define MGBE_MAC_PFR_DHLFRS OSI_BIT(12)
#define MGBE_MAC_PFR_DHLFRS_MASK (OSI_BIT(12) | OSI_BIT(11))
#define MGBE_CORE_MAC_STSR 0x0D08 #define MGBE_CORE_MAC_STSR 0x0D08
#define MGBE_CORE_MAC_STNSR 0x0D0C #define MGBE_CORE_MAC_STNSR 0x0D0C
#define MGBE_CORE_MAC_STNSR_TSSS_MASK 0x7FFFFFFFU #define MGBE_CORE_MAC_STNSR_TSSS_MASK 0x7FFFFFFFU
#define MGBE_MAC_TMCR_IPG_MASK 0x700U #define MGBE_MAC_TMCR_IPG_MASK 0x700U
#define MGBE_MAC_TMCR_IFP OSI_BIT(11) #define MGBE_MAC_TMCR_IFP OSI_BIT(11)
#define MGBE_MAC_TMCR_IPG OSI_BIT(8) | OSI_BIT(9)
#define MGBE_MAC_RX_TX_STS 0x00B8 #define MGBE_MAC_RX_TX_STS 0x00B8
#define MGBE_MTL_EST_CONTROL 0x1050 #define MGBE_MTL_EST_CONTROL 0x1050
#define MGBE_MTL_EST_OVERHEAD 0x1054 #define MGBE_MTL_EST_OVERHEAD 0x1054
@@ -268,6 +300,10 @@
OSI_BIT(5) | OSI_BIT(4) | \ OSI_BIT(5) | OSI_BIT(4) | \
OSI_BIT(3) | OSI_BIT(2) | \ OSI_BIT(3) | OSI_BIT(2) | \
OSI_BIT(1) | OSI_BIT(0)) OSI_BIT(1) | OSI_BIT(0))
#define MGBE_MTL_RCHlist_READ_UDELAY 1U
#define MGBE_MTL_RCHlist_READ_RETRY 1000U
/* FRP Interrupt Control and Status register */ /* FRP Interrupt Control and Status register */
#define MGBE_MTL_RXP_INTR_CS_PDRFIE OSI_BIT(19) #define MGBE_MTL_RXP_INTR_CS_PDRFIE OSI_BIT(19)
#define MGBE_MTL_RXP_INTR_CS_FOOVIE OSI_BIT(18) #define MGBE_MTL_RXP_INTR_CS_FOOVIE OSI_BIT(18)
@@ -296,6 +332,7 @@
OSI_BIT(11) | OSI_BIT(10) | \ OSI_BIT(11) | OSI_BIT(10) | \
OSI_BIT(9) | OSI_BIT(8)) OSI_BIT(9) | OSI_BIT(8))
#define MGBE_MTL_FRP_IE2_FO_SHIFT 8U #define MGBE_MTL_FRP_IE2_FO_SHIFT 8U
#define MGBE_MTL_FRP_IE2_DCHT OSI_BIT(7)
#define MGBE_MTL_FRP_IE2_NC OSI_BIT(3) #define MGBE_MTL_FRP_IE2_NC OSI_BIT(3)
#define MGBE_MTL_FRP_IE2_IM OSI_BIT(2) #define MGBE_MTL_FRP_IE2_IM OSI_BIT(2)
#define MGBE_MTL_FRP_IE2_RF OSI_BIT(1) #define MGBE_MTL_FRP_IE2_RF OSI_BIT(1)
@@ -303,7 +340,10 @@
#define MGBE_MTL_FRP_IE3_DCH_MASK 0xFFFFU #define MGBE_MTL_FRP_IE3_DCH_MASK 0xFFFFU
/* Indirect register defines */ /* Indirect register defines */
#define MGBE_MTL_RXP_IND_CS_BUSY OSI_BIT(31) #define MGBE_MTL_RXP_IND_CS_BUSY OSI_BIT(31)
#define MGBE_MTL_RXP_IND_RCH_ACCSEL OSI_BIT(25)
#define MGBE_MTL_RXP_IND_CS_ACCSEL OSI_BIT(24) #define MGBE_MTL_RXP_IND_CS_ACCSEL OSI_BIT(24)
#define MGBE_MTL_RXP_IND_CS_CRWEN OSI_BIT(18)
#define MGBE_MTL_RXP_IND_CS_CRWSEL OSI_BIT(17)
#define MGBE_MTL_RXP_IND_CS_WRRDN OSI_BIT(16) #define MGBE_MTL_RXP_IND_CS_WRRDN OSI_BIT(16)
#define MGBE_MTL_RXP_IND_CS_ADDR (OSI_BIT(9) | OSI_BIT(8) | \ #define MGBE_MTL_RXP_IND_CS_ADDR (OSI_BIT(9) | OSI_BIT(8) | \
OSI_BIT(7) | OSI_BIT(6) | \ OSI_BIT(7) | OSI_BIT(6) | \
@@ -346,6 +386,7 @@
#define MGBE_MMC_TX_INTR_EN 0x0810 #define MGBE_MMC_TX_INTR_EN 0x0810
#define MGBE_MMC_RX_INTR_EN 0x080C #define MGBE_MMC_RX_INTR_EN 0x080C
#define MGBE_MMC_CNTRL 0x0800 #define MGBE_MMC_CNTRL 0x0800
#define MGBE_MMC_IPC_RX_INT_MASK 0x0A5C
#define MGBE_MAC_L3L4_ADDR_CTR 0x0C00 #define MGBE_MAC_L3L4_ADDR_CTR 0x0C00
#define MGBE_MAC_L3L4_DATA 0x0C04 #define MGBE_MAC_L3L4_DATA 0x0C04
#define MGBE_MAC_TCR 0x0D00 #define MGBE_MAC_TCR 0x0D00
@@ -367,6 +408,7 @@
* @{ * @{
*/ */
#define MGBE_WRAP_COMMON_INTR_ENABLE 0x8704 #define MGBE_WRAP_COMMON_INTR_ENABLE 0x8704
#define MGBE_T26X_WRAP_COMMON_INTR_ENABLE 0x880C
#ifdef HSI_SUPPORT #ifdef HSI_SUPPORT
#define MGBE_REGISTER_PARITY_ERR OSI_BIT(5) #define MGBE_REGISTER_PARITY_ERR OSI_BIT(5)
@@ -383,6 +425,7 @@
#endif #endif
#define MGBE_MAC_SBD_INTR OSI_BIT(2) #define MGBE_MAC_SBD_INTR OSI_BIT(2)
#define MGBE_WRAP_COMMON_INTR_STATUS 0x8708 #define MGBE_WRAP_COMMON_INTR_STATUS 0x8708
#define MGBE_T26X_WRAP_COMMON_INTR_STATUS 0x8810
#define MGBE_VIRT_INTR_APB_CHX_CNTRL(x) (0x8200U + ((x) * 4U)) #define MGBE_VIRT_INTR_APB_CHX_CNTRL(x) (0x8200U + ((x) * 4U))
#define MGBE_VIRTUAL_APB_ERR_CTRL 0x8300 #define MGBE_VIRTUAL_APB_ERR_CTRL 0x8300
/** @} */ /** @} */
@@ -396,15 +439,22 @@
* @{ * @{
*/ */
#define MGBE_MAC_XDCS_DMA_MAX 0x3FFU #define MGBE_MAC_XDCS_DMA_MAX 0x3FFU
#define MGBE_MAC_XDCS_DMA_MAX_T26X 0xFFFFFFFFFFFFU
#define MGBE_MAC_XDCST_DMA_MAX OSI_BIT(16)
#define MGBE_MAC_INDIR_AC_OB_WAIT 10U #define MGBE_MAC_INDIR_AC_OB_WAIT 10U
#define MGBE_MAC_INDIR_AC_OB_RETRY 10U #define MGBE_MAC_INDIR_AC_OB_RETRY 10U
#define MGBE_MAC_INDIR_AC_MSEL_T26X (OSI_BIT(26) | OSI_BIT(27) | \
OSI_BIT(28) | OSI_BIT(29))
#define MGBE_MAC_DCHSEL 0U #define MGBE_MAC_DCHSEL 0U
#define MGBE_MAC_DPCSEL 0x3U
#define MGBE_MAC_DPCSEL_DDS OSI_BIT(1)
/* MGBE_MAC_INDIR_AC register defines */ /* MGBE_MAC_INDIR_AC register defines */
#define MGBE_MAC_INDIR_AC_MSEL (OSI_BIT(19) | OSI_BIT(18) | \ #define MGBE_MAC_INDIR_AC_MSEL (OSI_BIT(19) | OSI_BIT(18) | \
OSI_BIT(17) | OSI_BIT(16)) OSI_BIT(17) | OSI_BIT(16))
#define MGBE_MAC_INDIR_AC_MSEL_SHIFT 16U #define MGBE_MAC_INDIR_AC_MSEL_SHIFT 16U
#define MGBE_MAC_INDIR_AC_MSEL_SHIFT_T264 26U
#define MGBE_MAC_INDIR_AC_AOFF (OSI_BIT(15) | OSI_BIT(14) | \ #define MGBE_MAC_INDIR_AC_AOFF (OSI_BIT(15) | OSI_BIT(14) | \
OSI_BIT(13) | OSI_BIT(12) | \ OSI_BIT(13) | OSI_BIT(12) | \
OSI_BIT(11) | OSI_BIT(10) | \ OSI_BIT(11) | OSI_BIT(10) | \
@@ -514,6 +564,7 @@
#define MGBE_MMC_CNTRL_RSTONRD OSI_BIT(2) #define MGBE_MMC_CNTRL_RSTONRD OSI_BIT(2)
#define MGBE_MMC_CNTRL_CNTMCT (OSI_BIT(4) | OSI_BIT(5)) #define MGBE_MMC_CNTRL_CNTMCT (OSI_BIT(4) | OSI_BIT(5))
#define MGBE_MMC_CNTRL_CNTPRST OSI_BIT(7) #define MGBE_MMC_CNTRL_CNTPRST OSI_BIT(7)
#define MGBE_MMC_IPC_RX_INT_MASK_VALUE 0x3FFF3FFFU
#define MGBE_MAC_RQC1R_MCBCQEN OSI_BIT(15) #define MGBE_MAC_RQC1R_MCBCQEN OSI_BIT(15)
#define MGBE_MAC_RQC1R_MCBCQ (OSI_BIT(11) | OSI_BIT(10) | \ #define MGBE_MAC_RQC1R_MCBCQ (OSI_BIT(11) | OSI_BIT(10) | \
OSI_BIT(9) | OSI_BIT(8)) OSI_BIT(9) | OSI_BIT(8))
@@ -539,6 +590,9 @@
OSI_BIT(19) | OSI_BIT(18) | \ OSI_BIT(19) | OSI_BIT(18) | \
OSI_BIT(17) | OSI_BIT(16)) OSI_BIT(17) | OSI_BIT(16))
#define MGBE_MAC_ADDRH_DCS_SHIFT 16 #define MGBE_MAC_ADDRH_DCS_SHIFT 16
#define MGBE_MAC_L3L4_ADDR_CTR_IDDR_FNUM_T264 (OSI_BIT(12) | OSI_BIT(13) | \
OSI_BIT(14) | OSI_BIT(15) | \
OSI_BIT(16) | OSI_BIT(17))
#define MGBE_MAC_L3L4_ADDR_CTR_IDDR_FNUM (OSI_BIT(12) | OSI_BIT(13) | \ #define MGBE_MAC_L3L4_ADDR_CTR_IDDR_FNUM (OSI_BIT(12) | OSI_BIT(13) | \
OSI_BIT(14) | OSI_BIT(15)) OSI_BIT(14) | OSI_BIT(15))
#define MGBE_MAC_L3L4_ADDR_CTR_IDDR_FNUM_SHIFT 12 #define MGBE_MAC_L3L4_ADDR_CTR_IDDR_FNUM_SHIFT 12
@@ -572,12 +626,12 @@
#define MGBE_MAC_RMCR_RE OSI_BIT(0) #define MGBE_MAC_RMCR_RE OSI_BIT(0)
#define MGBE_MTL_TXQ_SIZE_SHIFT 16U #define MGBE_MTL_TXQ_SIZE_SHIFT 16U
#define MGBE_MTL_RXQ_SIZE_SHIFT 16U #define MGBE_MTL_RXQ_SIZE_SHIFT 16U
#define MGBE_MTL_Q_SIZE_MASK (OSI_BIT(21) | OSI_BIT(20) | OSI_BIT(19) | \
OSI_BIT(18) | OSI_BIT(17) | OSI_BIT(16))
#define MGBE_RXQ_TO_DMA_CHAN_MAP0 0x03020100U #define MGBE_RXQ_TO_DMA_CHAN_MAP0 0x03020100U
#define MGBE_RXQ_TO_DMA_CHAN_MAP1 0x07060504U #define MGBE_RXQ_TO_DMA_CHAN_MAP1 0x07060504U
#define MGBE_RXQ_TO_DMA_CHAN_MAP2 0x0B0A0908U #define MGBE_RXQ_TO_DMA_CHAN_MAP2 0x0B0A0908U
#define MGBE_RXQ_TO_DMA_MAP_DDMACH 0x80808080U #define MGBE_RXQ_TO_DMA_MAP_DDMACH 0x80808080U
#define MGBE_MTL_TXQ_SIZE_SHIFT 16U
#define MGBE_MTL_RXQ_SIZE_SHIFT 16U
#define MGBE_MAC_RMCR_GPSL_MSK 0x3FFF0000U #define MGBE_MAC_RMCR_GPSL_MSK 0x3FFF0000U
#define MGBE_MAC_TCR_TSUPDT OSI_BIT(3) #define MGBE_MAC_TCR_TSUPDT OSI_BIT(3)
#define MGBE_MAC_STNSUR_ADDSUB_SHIFT 31U #define MGBE_MAC_STNSUR_ADDSUB_SHIFT 31U
@@ -586,6 +640,7 @@
#define MGBE_MTL_RXQ_OP_MODE_RFA_MASK 0x0000007EU #define MGBE_MTL_RXQ_OP_MODE_RFA_MASK 0x0000007EU
#define MGBE_MTL_RXQ_OP_MODE_RFD_SHIFT 17U #define MGBE_MTL_RXQ_OP_MODE_RFD_SHIFT 17U
#define MGBE_MTL_RXQ_OP_MODE_RFD_MASK 0x007E0000U #define MGBE_MTL_RXQ_OP_MODE_RFD_MASK 0x007E0000U
#define MGBE_DMA_MODE_DSCB OSI_BIT(16)
#if defined(MACSEC_SUPPORT) #if defined(MACSEC_SUPPORT)
/** /**
* MACSEC Recommended value * MACSEC Recommended value
@@ -623,7 +678,8 @@
#define MGBE_MAC_TSS_TXTSC OSI_BIT(15) #define MGBE_MAC_TSS_TXTSC OSI_BIT(15)
/* MGBE DMA IND CTRL register field masks */ /* MGBE DMA IND CTRL register field masks */
#define MGBE_DMA_INDIR_CTRL_MSEL_MASK (OSI_BIT(24) | OSI_BIT(25) | \ #define MGBE_DMA_INDIR_CTRL_MSEL_MASK (OSI_BIT(24) | OSI_BIT(25) | \
OSI_BIT(26) | OSI_BIT(27)) OSI_BIT(26) | OSI_BIT(27) | \
OSI_BIT(28))
#define MGBE_DMA_INDIR_CTRL_MSEL_SHIFT 24 #define MGBE_DMA_INDIR_CTRL_MSEL_SHIFT 24
#define MGBE_DMA_INDIR_CTRL_AOFF_MASK (OSI_BIT(8) | OSI_BIT(9) | \ #define MGBE_DMA_INDIR_CTRL_AOFF_MASK (OSI_BIT(8) | OSI_BIT(9) | \
OSI_BIT(10) | OSI_BIT(11) | \ OSI_BIT(10) | OSI_BIT(11) | \
@@ -640,23 +696,21 @@
#define MGBE_PDMA_CHX_TXRX_EXTCFG_P2TCMP_MASK (OSI_BIT(16) | \ #define MGBE_PDMA_CHX_TXRX_EXTCFG_P2TCMP_MASK (OSI_BIT(16) | \
OSI_BIT(17) | OSI_BIT(18)) OSI_BIT(17) | OSI_BIT(18))
#define MGBE_PDMA_CHX_TXRX_EXTCFG_PBLX8 OSI_BIT(19) #define MGBE_PDMA_CHX_TXRX_EXTCFG_PBLX8 OSI_BIT(19)
#define MGBE_PDMA_CHX_TXRX_EXTCFG_PBL_MASK (OSI_BIT(24) | OSI_BIT(25) | \ #define MGBE_PDMA_CHX_EXTCFG_PBL_SHIFT 24U
OSI_BIT(26) | OSI_BIT(27) | \
OSI_BIT(28) | OSI_BIT(29)) #define MGBE_PDMA_CHX_RX_EXTCFG_RXPEN OSI_BIT(31)
#define MGBE_PDMA_CHX_TXRX_EXTCFG_PBL_SHIFT 24
#define MGBE_PDMA_CHX_EXTCFG_MAX_PBL 256U
#define MGBE_PDMA_CHX_EXTCFG_MAX_PBL_VAL 0x20000000U
/* MGBE PDMA_CH(#i)_Tx/RxDescCtrl register field masks */ /* MGBE PDMA_CH(#i)_Tx/RxDescCtrl register field masks */
#define MGBE_VDMA_CHX_TX_DESC_CTRL 4U #define MGBE_VDMA_CHX_TX_DESC_CTRL 4U
#define MGBE_VDMA_CHX_RX_DESC_CTRL 5U #define MGBE_VDMA_CHX_RX_DESC_CTRL 5U
#define MGBE_XDMA_CHX_TXRX_DESC_CTRL_DCSZ 3U #define MGBE_VDMA_CHX_TXRX_DESC_CTRL_DCSZ 5U
#define MGBE_XDMA_CHX_TXRX_DESC_CTRL_DCSZ_MASK (OSI_BIT(0) | OSI_BIT(1) | \ #define MGBE_VDMA_CHX_TXRX_DESC_CTRL_DCSZ_UFPGA 3U
#define MGBE_VDMA_CHX_TXRX_DESC_CTRL_DCSZ_MASK (OSI_BIT(0) | OSI_BIT(1) | \
OSI_BIT(2)) OSI_BIT(2))
#define MGBE_XDMA_CHX_TXRX_DESC_CTRL_DPS 4U #define MGBE_VDMA_CHX_TXRX_DESC_CTRL_DPS 3U
#define MGBE_XDMA_CHX_TXRX_DESC_CTRL_DPS_MASK (OSI_BIT(3) | OSI_BIT(4) | \ #define MGBE_VDMA_CHX_TXRX_DESC_CTRL_DPS_MASK (OSI_BIT(3) | OSI_BIT(4) | \
OSI_BIT(5)) OSI_BIT(5))
#define MGBE_XDMA_CHX_TXRX_DESC_CTRL_DPS_SHIFT 3 #define MGBE_VDMA_CHX_TXRX_DESC_CTRL_DPS_SHIFT 3
/** @} */ /** @} */
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
@@ -785,7 +839,9 @@
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
/* TXQ Size 128KB is divided equally across 10 MTL Queues*/ /* TXQ Size 128KB is divided equally across 10 MTL Queues*/
#define TX_FIFO_SZ (((((128U * 1024U)/OSI_MGBE_MAX_NUM_QUEUES)) / 256U) - 1U) #define TX_FIFO_SZ (((((MGBE_TXQ_SIZE)/OSI_MGBE_MAX_NUM_QUEUES)) / 256U) - 1U)
#define TX_FIFO_SZ_UFPGA (((((MGBE_TXQ_SIZE_UFPGA)/OSI_MGBE_MAX_NUM_QUEUES)) / 256U) - 1U)
/** /**
* @addtogroup MGBE-MAC-HWFR MGBE MAC HW feature registers * @addtogroup MGBE-MAC-HWFR MGBE MAC HW feature registers
@@ -854,7 +910,9 @@
#define MGBE_MAC_HFR0_RXCOESEL_SHIFT 16U #define MGBE_MAC_HFR0_RXCOESEL_SHIFT 16U
#define MGBE_MAC_HFR0_ADDMACADRSEL_MASK 0x1FU #define MGBE_MAC_HFR0_ADDMACADRSEL_MASK 0x1FU
#define MGBE_T26X_MAC_HFR0_ADDMACADRSEL_MASK 0x3FU
#define MGBE_MAC_HFR0_ADDMACADRSEL_SHIFT 18U #define MGBE_MAC_HFR0_ADDMACADRSEL_SHIFT 18U
#define MGBE_T26X_MAC_HFR0_ADDMACADRSEL_SHIFT 17U
#define MGBE_MAC_HFR0_PHYSEL_MASK 0x3U #define MGBE_MAC_HFR0_PHYSEL_MASK 0x3U
#define MGBE_MAC_HFR0_PHYSEL_SHIFT 23U #define MGBE_MAC_HFR0_PHYSEL_SHIFT 23U

View File

@@ -522,7 +522,7 @@ static nve32_t osi_get_mac_version(struct osi_core_priv_data *const osi_core, nv
*mac_ver = osi_readla(osi_core, ((nveu8_t *)osi_core->base + (nve32_t)MAC_VERSION)) & *mac_ver = osi_readla(osi_core, ((nveu8_t *)osi_core->base + (nve32_t)MAC_VERSION)) &
MAC_VERSION_SNVER_MASK; MAC_VERSION_SNVER_MASK;
if (validate_mac_ver_update_chans(*mac_ver, &l_core->num_max_chans, if (validate_mac_ver_update_chans(osi_core->mac, *mac_ver, &l_core->num_max_chans,
&l_core->l_mac_ver) == 0) { &l_core->l_mac_ver) == 0) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_INVALID, OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_INVALID,
"Invalid MAC version\n", (nveu64_t)*mac_ver) "Invalid MAC version\n", (nveu64_t)*mac_ver)
@@ -885,15 +885,11 @@ static nve32_t l3l4_find_match(const struct core_local *const l_core,
static nve32_t configure_l3l4_filter_valid_params(const struct osi_core_priv_data *const osi_core, static nve32_t configure_l3l4_filter_valid_params(const struct osi_core_priv_data *const osi_core,
const struct osi_l3_l4_filter *const l3_l4) const struct osi_l3_l4_filter *const l3_l4)
{ {
const nveu32_t max_dma_chan[OSI_MAX_MAC_IP_TYPES] = { struct core_local *l_core = (struct core_local *)(void *)osi_core;
OSI_EQOS_MAX_NUM_CHANS,
OSI_MGBE_MAX_NUM_CHANS,
OSI_MGBE_MAX_NUM_CHANS
};
nve32_t ret = -1; nve32_t ret = -1;
/* validate dma channel */ /* validate dma channel */
if (l3_l4->dma_chan > max_dma_chan[osi_core->mac]) { if (l3_l4->dma_chan > l_core->num_max_chans) {
OSI_CORE_ERR((osi_core->osd), (OSI_LOG_ARG_OUTOFBOUND), OSI_CORE_ERR((osi_core->osd), (OSI_LOG_ARG_OUTOFBOUND),
("L3L4: Wrong DMA channel: "), (l3_l4->dma_chan)); ("L3L4: Wrong DMA channel: "), (l3_l4->dma_chan));
goto exit_func; goto exit_func;
@@ -973,6 +969,7 @@ static nve32_t configure_l3l4_filter_helper(struct osi_core_priv_data *const osi
{ {
struct osi_l3_l4_filter *cfg_l3_l4; struct osi_l3_l4_filter *cfg_l3_l4;
struct core_local *const l_core = (struct core_local *)(void *)osi_core; struct core_local *const l_core = (struct core_local *)(void *)osi_core;
const nveu32_t filter_mask[OSI_MAX_MAC_IP_TYPES] = { 0x1F, 0x1F, 0x3F };
nve32_t ret; nve32_t ret;
ret = l_core->ops_p->config_l3l4_filters(osi_core, filter_no, l3_l4); ret = l_core->ops_p->config_l3l4_filters(osi_core, filter_no, l3_l4);
@@ -994,7 +991,8 @@ static nve32_t configure_l3l4_filter_helper(struct osi_core_priv_data *const osi
#if !defined(L3L4_WILDCARD_FILTER) #if !defined(L3L4_WILDCARD_FILTER)
/* update filter mask bit */ /* update filter mask bit */
osi_core->l3l4_filter_bitmask |= ((nveu32_t)1U << (filter_no & 0x1FU)); osi_core->l3l4_filter_bitmask |= ((nveu64_t)1U <<
(filter_no & filter_mask[osi_core->mac]));
#endif /* !L3L4_WILDCARD_FILTER */ #endif /* !L3L4_WILDCARD_FILTER */
} else { } else {
/* Clear the filter data. /* Clear the filter data.
@@ -1007,7 +1005,8 @@ static nve32_t configure_l3l4_filter_helper(struct osi_core_priv_data *const osi
#if !defined(L3L4_WILDCARD_FILTER) #if !defined(L3L4_WILDCARD_FILTER)
/* update filter mask bit */ /* update filter mask bit */
osi_core->l3l4_filter_bitmask &= ~((nveu32_t)1U << (filter_no & 0x1FU)); osi_core->l3l4_filter_bitmask &= ~((nveu64_t)1U <<
(filter_no & filter_mask[osi_core->mac]));
#endif /* !L3L4_WILDCARD_FILTER */ #endif /* !L3L4_WILDCARD_FILTER */
} }
@@ -1120,7 +1119,7 @@ static nve32_t configure_l3l4_filter(struct osi_core_priv_data *const osi_core,
const nveu32_t max_filter_no[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t max_filter_no[OSI_MAX_MAC_IP_TYPES] = {
EQOS_MAX_L3_L4_FILTER - 1U, EQOS_MAX_L3_L4_FILTER - 1U,
OSI_MGBE_MAX_L3_L4_FILTER - 1U, OSI_MGBE_MAX_L3_L4_FILTER - 1U,
OSI_MGBE_MAX_L3_L4_FILTER - 1U, OSI_MGBE_MAX_L3_L4_FILTER_T264 - 1U,
}; };
nve32_t ret = -1; nve32_t ret = -1;
@@ -1748,12 +1747,21 @@ static inline void free_tx_ts(struct osi_core_priv_data *osi_core,
nveu32_t count = 0U; nveu32_t count = 0U;
while ((temp != head) && (count < MAX_TX_TS_CNT)) { while ((temp != head) && (count < MAX_TX_TS_CNT)) {
if (osi_core->mac != OSI_MAC_HW_MGBE_T26X) {
if (((temp->pkt_id >> CHAN_START_POSITION) & chan) == chan) { if (((temp->pkt_id >> CHAN_START_POSITION) & chan) == chan) {
temp->next->prev = temp->prev; temp->next->prev = temp->prev;
temp->prev->next = temp->next; temp->prev->next = temp->next;
/* reset in_use for temp node from the link */ /* reset in_use for temp node from the link */
temp->in_use = OSI_DISABLE; temp->in_use = OSI_DISABLE;
} }
} else {
if (temp->vdma_id == chan) {
temp->next->prev = temp->prev;
temp->prev->next = temp->next;
/* reset in_use for temp node from the link */
temp->in_use = OSI_DISABLE;
}
}
count++; count++;
temp = temp->next; temp = temp->next;
} }
@@ -1842,6 +1850,7 @@ static inline nve32_t get_tx_ts(struct osi_core_priv_data *osi_core,
temp = temp->next; temp = temp->next;
continue; continue;
} else if ((temp->pkt_id == ts->pkt_id) && } else if ((temp->pkt_id == ts->pkt_id) &&
(temp->vdma_id == ts->vdma_id) &&
(temp->in_use != OSI_NONE)) { (temp->in_use != OSI_NONE)) {
ts->sec = temp->sec; ts->sec = temp->sec;
ts->nsec = temp->nsec; ts->nsec = temp->nsec;
@@ -2222,8 +2231,13 @@ fail:
static void cfg_l3_l4_filter(struct core_local *l_core) static void cfg_l3_l4_filter(struct core_local *l_core)
{ {
nveu32_t i = 0U; nveu32_t i = 0U;
const nveu32_t max_filter_no[OSI_MAX_MAC_IP_TYPES] = {
EQOS_MAX_L3_L4_FILTER,
OSI_MGBE_MAX_L3_L4_FILTER,
OSI_MGBE_MAX_L3_L4_FILTER_T264,
};
for (i = 0U; i < OSI_MGBE_MAX_L3_L4_FILTER; i++) { for (i = 0U; i < max_filter_no[l_core->osi_core.mac]; i++) {
if (l_core->cfg.l3_l4[i].filter_enb_dis == OSI_L3L4_DISABLE) { if (l_core->cfg.l3_l4[i].filter_enb_dis == OSI_L3L4_DISABLE) {
/* filter not enabled */ /* filter not enabled */
continue; continue;

View File

@@ -263,6 +263,91 @@ fail:
return ret; return ret;
} }
/**
* @brief xlgpcs_start - Start XLGPCS
*
* Algorithm: This routine enables AN and set speed based on AN status
*
* @param[in] osi_core: OSI core data structure.
*
* @retval 0 on success
* @retval -1 on failure.
*/
nve32_t xlgpcs_start(struct osi_core_priv_data *osi_core)
{
void *xpcs_base = osi_core->xpcs_base;
nveu32_t retry = RETRY_COUNT;
nveu32_t count = 0;
nveu32_t ctrl = 0;
nve32_t ret = 0;
nve32_t cond = COND_NOT_MET;
if (xpcs_base == OSI_NULL) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"XLGPCS base is NULL", 0ULL);
ret = -1;
goto fail;
}
/* * XLGPCS programming guideline IAS section 7.1.3.2.2.2
*/
/* 4 Poll SR_PCS_CTRL1 reg RST bit */
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
ctrl |= XLGPCS_SR_PCS_CTRL1_RST;
xpcs_write(xpcs_base, XLGPCS_SR_PCS_CTRL1, ctrl);
count = 0;
while (cond == 1) {
if (count > retry) {
ret = -1;
goto fail;
}
count++;
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
if ((ctrl & XLGPCS_SR_PCS_CTRL1_RST) == 0U) {
cond = 0;
} else {
/* Maximum wait delay as per HW team is 10msec.
* So add a loop for 1000 iterations with 1usec delay,
* so that if check get satisfies before 1msec will come
* out of loop and it can save some boot time
*/
osi_core->osd_ops.udelay(10U);
}
}
/* 5 Program SR_AN_CTRL reg AN_EN bit to disable auto-neg */
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_AN_CTRL);
ctrl &= ~XLGPCS_SR_AN_CTRL_AN_EN;
ret = xpcs_write_safety(osi_core, XLGPCS_SR_AN_CTRL, ctrl);
if (ret != 0) {
goto fail;
}
/* 6 Wait for SR_PCS_STS1 reg RLU bit to set */
cond = COND_NOT_MET;
count = 0;
while (cond == COND_NOT_MET) {
if (count > retry) {
ret = -1;
break;
}
count++;
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_STS1);
if ((ctrl & XLGPCS_SR_PCS_STS1_RLU) ==
XLGPCS_SR_PCS_STS1_RLU) {
cond = COND_MET;
} else {
/* Maximum wait delay as per HW team is 10msec.
* So add a loop for 1000 iterations with 1usec delay,
* so that if check get satisfies before 1msec will come
* out of loop and it can save some boot time
*/
osi_core->osd_ops.udelay(10U);
}
}
fail:
return ret;
}
/** /**
* @brief xpcs_uphy_lane_bring_up - Bring up UPHY Tx/Rx lanes * @brief xpcs_uphy_lane_bring_up - Bring up UPHY Tx/Rx lanes
* *
@@ -697,7 +782,7 @@ nve32_t xpcs_init(struct osi_core_priv_data *osi_core)
ctrl = xpcs_read(xpcs_base, XPCS_VR_XS_PCS_KR_CTRL); ctrl = xpcs_read(xpcs_base, XPCS_VR_XS_PCS_KR_CTRL);
ctrl &= ~(XPCS_VR_XS_PCS_KR_CTRL_USXG_MODE_MASK); ctrl &= ~(XPCS_VR_XS_PCS_KR_CTRL_USXG_MODE_MASK);
if (osi_core->uphy_gbe_mode == OSI_DISABLE) { if (osi_core->uphy_gbe_mode == OSI_GBE_MODE_5G) {
ctrl |= XPCS_VR_XS_PCS_KR_CTRL_USXG_MODE_5G; ctrl |= XPCS_VR_XS_PCS_KR_CTRL_USXG_MODE_5G;
} }
} }
@@ -717,6 +802,129 @@ fail:
return ret; return ret;
} }
/**
* @brief xlgpcs_init - XLGPCS initialization
*
* Algorithm: This routine initialize XLGPCS in USXMII mode.
*
* @param[in] osi_core: OSI core data structure.
*
* @retval 0 on success
* @retval -1 on failure.
*/
nve32_t xlgpcs_init(struct osi_core_priv_data *osi_core)
{
void *xpcs_base = osi_core->xpcs_base;
nveu32_t retry = 1000;
nveu32_t count;
nveu32_t ctrl = 0;
nve32_t cond = COND_NOT_MET;
nve32_t ret = 0;
nveu32_t value = 0;
if (osi_core->xpcs_base == OSI_NULL) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"XLGPCS base is NULL", 0ULL);
ret = -1;
goto fail;
}
if (osi_core->pre_sil == 0x1U) {
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"Pre-silicon, skipping lane bring up", 0ULL);
} else {
/* Select XLGPCS in wrapper register */
if ((osi_core->mac == OSI_MAC_HW_MGBE_T26X) &&
(osi_core->uphy_gbe_mode == OSI_UPHY_GBE_MODE_25G)) {
value = osi_readla(osi_core, (nveu8_t *)osi_core->xpcs_base +
T26X_XPCS_WRAP_CONFIG_0);
value |= OSI_BIT(0);
osi_writela(osi_core, value, (nveu8_t *)osi_core->xpcs_base +
T26X_XPCS_WRAP_CONFIG_0);
}
if (xpcs_lane_bring_up(osi_core) < 0) {
ret = -1;
goto fail;
}
}
/* Switching to USXGMII Mode to 25G based on
* XLGPCS programming guideline IAS section 7.1.3.2.2.1
*/
/* 1.Program SR_PCS_CTRL1 reg SS_5_2 bits */
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL1);
ctrl &= ~XLGPCS_SR_PCS_CTRL1_SS5_2_MASK;
ctrl |= XLGPCS_SR_PCS_CTRL1_SS5_2;
ret = xpcs_write_safety(osi_core, XLGPCS_SR_PCS_CTRL1, ctrl);
if (ret != 0) {
goto fail;
}
/* 2.Program SR_PCS_CTRL2 reg PCS_TYPE_SEL bits */
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PCS_CTRL2);
ctrl &= ~XLGPCS_SR_PCS_CTRL2_PCS_TYPE_SEL_MASK;
ctrl |= XLGPCS_SR_PCS_CTRL2_PCS_TYPE_SEL;
ret = xpcs_write_safety(osi_core, XLGPCS_SR_PCS_CTRL2, ctrl);
if (ret != 0) {
goto fail;
}
/* 3.Program SR_PMA_CTRL2 reg PMA_TYPE bits */
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PMA_CTRL2);
ctrl &= ~XLGPCS_SR_PMA_CTRL2_PMA_TYPE_MASK;
ctrl |= XLGPCS_SR_PMA_CTRL2_PMA_TYPE;
ret = xpcs_write_safety(osi_core, XLGPCS_SR_PMA_CTRL2, ctrl);
if (ret != 0) {
goto fail;
}
/* 4.NA [Program VR_PCS_MMD Digital Control3 reg EN_50G bit
* to disable 50G] 25G mode selected for T264 */
/* 5.Program VR_PCS_MMD Digital Control3 reg CNS_EN bit to 1 to
* enable 25G as per manual */
ctrl = xpcs_read(xpcs_base, XLGPCS_VR_PCS_DIG_CTRL3);
ctrl |= XLGPCS_VR_PCS_DIG_CTRL3_CNS_EN;
ret = xpcs_write_safety(osi_core, XLGPCS_VR_PCS_DIG_CTRL3, ctrl);
if (ret != 0) {
goto fail;
}
/* 6.NA. Enable RS FEC */
/* 7. Enable BASE-R FEC */
ctrl = xpcs_read(xpcs_base, XLGPCS_SR_PMA_KR_FEC_CTRL);
ctrl |= XLGPCS_SR_PMA_KR_FEC_CTRL_FEC_EN;
ret = xpcs_write_safety(osi_core, XLGPCS_SR_PMA_KR_FEC_CTRL, ctrl);
if (ret != 0) {
goto fail;
}
/* 8.NA, Configure PHY to 25G rate */
/* 9.Program VR_PCS_DIG_CTRL1 reg VR_RST bit */
ctrl = xpcs_read(xpcs_base, XLGPCS_VR_PCS_DIG_CTRL1);
ctrl |= XLGPCS_VR_PCS_DIG_CTRL1_VR_RST;
xpcs_write(xpcs_base, XLGPCS_VR_PCS_DIG_CTRL1, ctrl);
/* 10.Wait for VR_PCS_DIG_CTRL1 reg VR_RST bit to self clear */
count = 0;
while (cond == COND_NOT_MET) {
if (count > retry) {
ret = -1;
goto fail;
}
count++;
ctrl = xpcs_read(xpcs_base, XLGPCS_VR_PCS_DIG_CTRL1);
if ((ctrl & XLGPCS_VR_PCS_DIG_CTRL1_VR_RST) == 0U) {
cond = 0;
} else {
/* Maximum wait delay as per HW team is 10msec.
* So add a loop for 1000 iterations with 1usec delay,
* so that if check get satisfies before 1msec will come
* out of loop and it can save some boot time
*/
osi_core->osd_ops.udelay(10U);
}
}
fail:
return ret;
}
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
/** /**
* @brief xpcs_eee - XPCS enable/disable EEE * @brief xpcs_eee - XPCS enable/disable EEE
@@ -781,4 +989,93 @@ nve32_t xpcs_eee(struct osi_core_priv_data *osi_core, nveu32_t en_dis)
fail: fail:
return ret; return ret;
} }
/**
* @brief xlgpcs_eee - XLGPCS enable/disable EEE
*
* Algorithm: This routine update register related to EEE
* for XLGPCS.
*
* @param[in] osi_core: OSI core data structure.
* @param[in] en_dis: enable - 1 or disable - 0
*
* @retval 0 on success
* @retval -1 on failure.
*/
nve32_t xlgpcs_eee(struct osi_core_priv_data *osi_core, nveu32_t en_dis)
{
void *xpcs_base = osi_core->xpcs_base;
nveu32_t val = 0x0U;
nve32_t ret = 0;
nveu32_t retry = 1000U;
nveu32_t count = 0;
nve32_t cond = COND_NOT_MET;
if ((en_dis != OSI_ENABLE) && (en_dis != OSI_DISABLE)) {
ret = -1;
goto fail;
}
if (xpcs_base == OSI_NULL) {
ret = -1;
goto fail;
}
if (en_dis == OSI_DISABLE) {
val = xpcs_read(xpcs_base, XLGPCS_VR_PCS_EEE_MCTRL);
val &= ~XPCS_VR_XS_PCS_EEE_MCTRL0_LTX_EN;
val &= ~XPCS_VR_XS_PCS_EEE_MCTRL0_LRX_EN;
ret = xpcs_write_safety(osi_core, XLGPCS_VR_PCS_EEE_MCTRL, val);
/* To disable EEE on TX side, the software must wait for
* TX LPI to enter TX_ACTIVE state by reading
* VR_PCS_DIG_STS Register
*/
while (cond == COND_NOT_MET) {
if (count > retry) {
ret = -1;
OSI_CORE_ERR(osi_core->osd, OSI_LOG_ARG_HW_FAIL,
"EEE active state timeout!", 0ULL);
goto fail;
}
count++;
val = xpcs_read(xpcs_base, XLGPCS_VR_PCS_DIG_STS);
if ((val & XLGPCS_VR_PCS_DIG_STSLTXRX_STATE) == 0U) {
cond = 0;
} else {
osi_core->osd_ops.udelay(100U);
}
}
} else {
/* 1. Check if DWC_xlgpcs supports the EEE feature
* by reading the SR_PCS_EEE_ABL reg. For 25G always enabled
* by default
*/
/* 2. Program various timers used in the EEE mode depending on
* the clk_eee_i clock frequency. default timers are same as
* IEEE std clk_eee_i() is 108MHz. MULT_FACT_100NS = 9
* because 9.2ns*10 = 92 which is between 80 and 120 this
* leads to default setting match.
*/
/* 3. NA. [If FEC is enabled in the KR mode] */
/* 4. NA. [Enable fast_sim mode] */
/* 5. NA [If RS FEC is enabled, program AM interval and RS FEC]
*/
/* 6. NA [Fast wake is not enabled default] */
/* 7. Enable the EEE feature on Tx and Rx path */
val = xpcs_read(xpcs_base, XLGPCS_VR_PCS_EEE_MCTRL);
val |= (XPCS_VR_XS_PCS_EEE_MCTRL0_LTX_EN |
XPCS_VR_XS_PCS_EEE_MCTRL0_LRX_EN);
ret = xpcs_write_safety(osi_core, XLGPCS_VR_PCS_EEE_MCTRL, val);
if (ret != 0) {
goto fail;
}
/* 8. NA [If PMA service interface is XLAUI or CAUI] */
}
fail:
return ret;
}
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */

View File

@@ -48,16 +48,65 @@
#define T26X_XPCS_WRAP_UPHY_HW_INIT_CTRL 0x8034 #define T26X_XPCS_WRAP_UPHY_HW_INIT_CTRL 0x8034
#define T26X_XPCS_WRAP_UPHY_STATUS 0x8074 #define T26X_XPCS_WRAP_UPHY_STATUS 0x8074
#define T26X_XPCS_WRAP_INTERRUPT_STATUS 0x8080 #define T26X_XPCS_WRAP_INTERRUPT_STATUS 0x8080
#define T26X_XPCS_WRAP_CONFIG_0 0x8094
/** @} */
/**
* @addtogroup XLGPCS Register offsets
*
* @brief XLGPCS register offsets
* @{
*/
#define XLGPCS_SR_PMA_CTRL2 0x4001c
#define XLGPCS_SR_PMA_KR_FEC_CTRL 0x402ac
#define XLGPCS_SR_PCS_CTRL1 0xc0000
#define XLGPCS_SR_PCS_STS1 0xc0004
#define XLGPCS_SR_PCS_CTRL2 0xc001c
#define XLGPCS_VR_PCS_DIG_CTRL1 0xe0000
#define XLGPCS_VR_PCS_DIG_CTRL3 0xe000c
#define XLGPCS_SR_AN_CTRL 0x1c0000
/** @} */
/**
* @addtogroup XLGPCS-BIT Register bit fileds
*
* @brief XLGPCS register bit fields and values
* @{
*/
#define XLGPCS_SR_PCS_CTRL1_RST OSI_BIT(15)
#define XLGPCS_SR_AN_CTRL_AN_EN OSI_BIT(12)
#define XLGPCS_SR_PCS_STS1_RLU OSI_BIT(2)
#define XLGPCS_SR_PCS_CTRL1_SS5_2 OSI_BIT(2) | OSI_BIT(4)
#define XLGPCS_SR_PCS_CTRL1_SS5_2_MASK OSI_BIT(5) | OSI_BIT(4) | \
OSI_BIT(3) | OSI_BIT(2)
#define XLGPCS_SR_PCS_CTRL2_PCS_TYPE_SEL OSI_BIT(2) | OSI_BIT(1) | \
OSI_BIT(0)
#define XLGPCS_SR_PCS_CTRL2_PCS_TYPE_SEL_MASK OSI_BIT(3) | OSI_BIT(2) | \
OSI_BIT(1) | OSI_BIT(0)
#define XLGPCS_SR_PMA_CTRL2_PMA_TYPE OSI_BIT(5) | OSI_BIT(4) | \
OSI_BIT(3) | OSI_BIT(0)
#define XLGPCS_SR_PMA_CTRL2_PMA_TYPE_MASK 0x7F
#define XLGPCS_VR_PCS_DIG_CTRL3_CNS_EN OSI_BIT(0)
#define XLGPCS_VR_PCS_DIG_CTRL1_VR_RST OSI_BIT(15)
#define XLGPCS_SR_PMA_KR_FEC_CTRL_FEC_EN OSI_BIT(0)
/** @} */ /** @} */
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
#define XPCS_VR_XS_PCS_EEE_MCTRL0 0xE0018 #define XPCS_VR_XS_PCS_EEE_MCTRL0 0xE0018
#define XPCS_VR_XS_PCS_EEE_MCTRL1 0xE002C #define XPCS_VR_XS_PCS_EEE_MCTRL1 0xE002C
#define XLGPCS_VR_PCS_EEE_MCTRL 0xe0018
#define XLGPCS_VR_PCS_DIG_STS 0xe0040
#define XPCS_VR_XS_PCS_EEE_MCTRL1_TRN_LPI OSI_BIT(0) #define XPCS_VR_XS_PCS_EEE_MCTRL1_TRN_LPI OSI_BIT(0)
#define XPCS_VR_XS_PCS_EEE_MCTRL0_LTX_EN OSI_BIT(0) #define XPCS_VR_XS_PCS_EEE_MCTRL0_LTX_EN OSI_BIT(0)
#define XPCS_VR_XS_PCS_EEE_MCTRL0_LRX_EN OSI_BIT(1) #define XPCS_VR_XS_PCS_EEE_MCTRL0_LRX_EN OSI_BIT(1)
#define XLGPCS_VR_PCS_DIG_STSLTXRX_STATE (OSI_BIT(15) | OSI_BIT(14) | \
OSI_BIT(13) | OSI_BIT(12) | \
OSI_BIT(11) | OSI_BIT(10))
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
/** /**
@@ -124,8 +173,11 @@
nve32_t xpcs_init(struct osi_core_priv_data *osi_core); nve32_t xpcs_init(struct osi_core_priv_data *osi_core);
nve32_t xpcs_start(struct osi_core_priv_data *osi_core); nve32_t xpcs_start(struct osi_core_priv_data *osi_core);
nve32_t xlgpcs_init(struct osi_core_priv_data *osi_core);
nve32_t xlgpcs_start(struct osi_core_priv_data *osi_core);
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
nve32_t xpcs_eee(struct osi_core_priv_data *osi_core, nveu32_t en_dis); nve32_t xpcs_eee(struct osi_core_priv_data *osi_core, nveu32_t en_dis);
nve32_t xlgpcs_eee(struct osi_core_priv_data *osi_core, nveu32_t en_dis);
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
/** /**

View File

@@ -41,6 +41,7 @@
/** /**
* @brief validate_dma_mac_ver_update_chans - Validates mac version and update chan * @brief validate_dma_mac_ver_update_chans - Validates mac version and update chan
* *
* @param[in] mac: MAC HW type.
* @param[in] mac_ver: MAC version read. * @param[in] mac_ver: MAC version read.
* @param[out] num_max_chans: Maximum channel number. * @param[out] num_max_chans: Maximum channel number.
* @param[out] l_mac_ver: local mac version. * @param[out] l_mac_ver: local mac version.
@@ -56,10 +57,16 @@
* @retval 0 - for not Valid MAC * @retval 0 - for not Valid MAC
* @retval 1 - for Valid MAC * @retval 1 - for Valid MAC
*/ */
static inline nve32_t validate_dma_mac_ver_update_chans(nveu32_t mac_ver, static inline nve32_t validate_dma_mac_ver_update_chans(nveu32_t mac,
nveu32_t mac_ver,
nveu32_t *num_max_chans, nveu32_t *num_max_chans,
nveu32_t *l_mac_ver) nveu32_t *l_mac_ver)
{ {
const nveu32_t max_dma_chan[OSI_MAX_MAC_IP_TYPES] = {
OSI_EQOS_MAX_NUM_CHANS,
OSI_MGBE_T23X_MAX_NUM_CHANS,
OSI_MGBE_MAX_NUM_CHANS
};
nve32_t ret; nve32_t ret;
switch (mac_ver) { switch (mac_ver) {
@@ -69,17 +76,21 @@ static inline nve32_t validate_dma_mac_ver_update_chans(nveu32_t mac_ver,
*l_mac_ver = MAC_CORE_VER_TYPE_EQOS; *l_mac_ver = MAC_CORE_VER_TYPE_EQOS;
ret = 1; ret = 1;
break; break;
#endif #endif /* !OSI_STRIPPED_LIB */
case OSI_EQOS_MAC_5_30: case OSI_EQOS_MAC_5_30:
*num_max_chans = OSI_EQOS_MAX_NUM_CHANS; *num_max_chans = OSI_EQOS_MAX_NUM_CHANS;
*l_mac_ver = MAC_CORE_VER_TYPE_EQOS_5_30; *l_mac_ver = MAC_CORE_VER_TYPE_EQOS_5_30;
ret = 1; ret = 1;
break; break;
case OSI_MGBE_MAC_3_10: case OSI_MGBE_MAC_3_10:
//TBD: T264 uFPGA reports mac version 3.2
case OSI_MGBE_MAC_3_20:
case OSI_MGBE_MAC_4_20:
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
case OSI_MGBE_MAC_4_00: case OSI_MGBE_MAC_4_00:
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
*num_max_chans = OSI_MGBE_MAX_NUM_CHANS; //TBD: T264 number of dma channels?
*num_max_chans = max_dma_chan[mac];
*l_mac_ver = MAC_CORE_VER_TYPE_MGBE; *l_mac_ver = MAC_CORE_VER_TYPE_MGBE;
ret = 1; ret = 1;
break; break;
@@ -135,10 +146,13 @@ static inline void osi_dma_writel(nveu32_t val, void *addr)
*/ */
#define CHAN_START_POSITION 6U #define CHAN_START_POSITION 6U
#define PKT_ID_CNT ((nveu32_t)1 << CHAN_START_POSITION) #define PKT_ID_CNT ((nveu32_t)1 << CHAN_START_POSITION)
#define PKT_ID_CNT_T264 ((nveu32_t)1 << 10)
/* First 6 bytes of idx and last 4 bytes of chan(+1 to avoid pkt_id to be 0) */ /* First 6 bytes of idx and last 4 bytes of chan(+1 to avoid pkt_id to be 0) */
#define INC_TX_TS_PKTID(idx) ((idx) = (((idx) & 0x7FFFFFFFU) + 1U)) #define INC_TX_TS_PKTID(idx) ((idx) = (((idx) & 0x7FFFFFFFU) + 1U))
#define GET_TX_TS_PKTID(idx, c) (((idx) & (PKT_ID_CNT - 1U)) | \ #define GET_TX_TS_PKTID(idx, c) (((idx) & (PKT_ID_CNT - 1U)) | \
(((c) + 1U) << CHAN_START_POSITION)) (((c) + 1U) << CHAN_START_POSITION))
/* T264 has saperate logic to tell vdma number so we can use all 10 bits for pktid */
#define GET_TX_TS_PKTID_T264(idx) ((++(idx)) & (PKT_ID_CNT_T264 - 1U))
/** @} */ /** @} */
/** /**
@@ -210,8 +224,11 @@ struct dma_local {
* PacketID for PTP TS. * PacketID for PTP TS.
* MSB 4-bits of channel number and LSB 6-bits of local * MSB 4-bits of channel number and LSB 6-bits of local
* index(PKT_ID_CNT). * index(PKT_ID_CNT).
* In T264, it is 9 bits PKTID
*/ */
nveu32_t pkt_id; nveu32_t pkt_id;
/** VDMA number for T264 */
nveu32_t vdma_id;
/** Flag to represent OSI DMA software init done */ /** Flag to represent OSI DMA software init done */
nveu32_t init_done; nveu32_t init_done;
/** Holds the MAC version of MAC controller */ /** Holds the MAC version of MAC controller */
@@ -329,7 +346,9 @@ static inline void update_rx_tail_ptr(const struct osi_dma_priv_data *const osi_
nveu32_t dma_chan, nveu32_t dma_chan,
nveu64_t tailptr) nveu64_t tailptr)
{ {
nveu32_t chan = dma_chan & 0xFU; const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
const nveu32_t tail_ptr_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t tail_ptr_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_RDTP(chan), EQOS_DMA_CHX_RDTP(chan),
MGBE_DMA_CHX_RDTLP(chan), MGBE_DMA_CHX_RDTLP(chan),

View File

@@ -57,6 +57,8 @@
#define MGBE_DMA_CHX_RDLH(x) ((0x0080U * (x)) + 0x3118U) #define MGBE_DMA_CHX_RDLH(x) ((0x0080U * (x)) + 0x3118U)
#define MGBE_DMA_CHX_RDLA(x) ((0x0080U * (x)) + 0x311CU) #define MGBE_DMA_CHX_RDLA(x) ((0x0080U * (x)) + 0x311CU)
#define MGBE_DMA_CHX_RDTLP(x) ((0x0080U * (x)) + 0x312CU) #define MGBE_DMA_CHX_RDTLP(x) ((0x0080U * (x)) + 0x312CU)
#define MGBE_DMA_CHX_RX_DESC_WR_RNG_OFFSET(x) ((0x0080U * (x)) + 0x317CU)
/** @} */ /** @} */
/** @} */ /** @} */
@@ -71,6 +73,12 @@
#define MGBE_DMA_CHX_RX_WDT_RWTU 2048U #define MGBE_DMA_CHX_RX_WDT_RWTU 2048U
#define MGBE_DMA_CHX_RX_WDT_RWTU_2048_CYCLE 0x3000U #define MGBE_DMA_CHX_RX_WDT_RWTU_2048_CYCLE 0x3000U
#define MGBE_DMA_CHX_RX_WDT_RWTU_MASK 0x3000U #define MGBE_DMA_CHX_RX_WDT_RWTU_MASK 0x3000U
#define MGBE_DMA_CHX_RX_WDT_ITW_MASK 0x7C000000U
#define MGBE_DMA_CHX_RX_WDT_ITW_SHIFT 26U
#define MGBE_DMA_CHX_RX_WDT_ITW_MAX 0x1FU
#define MGBE_DMA_CHX_RX_WDT_ITW_DEFAULT 1100U
#define MGBE_DMA_CHX_RX_WDT_ITCU 256U
#ifdef OSI_DEBUG #ifdef OSI_DEBUG
#define MGBE_DMA_CHX_INTR_TBUE OSI_BIT(2) #define MGBE_DMA_CHX_INTR_TBUE OSI_BIT(2)
#define MGBE_DMA_CHX_INTR_RBUE OSI_BIT(7) #define MGBE_DMA_CHX_INTR_RBUE OSI_BIT(7)
@@ -92,6 +100,8 @@
#define MGBE_TX_VDMA_TC_SHIFT 4 #define MGBE_TX_VDMA_TC_SHIFT 4
#define MGBE_RX_VDMA_TC_MASK (OSI_BIT(28) | OSI_BIT(29) | OSI_BIT(30)) #define MGBE_RX_VDMA_TC_MASK (OSI_BIT(28) | OSI_BIT(29) | OSI_BIT(30))
#define MGBE_RX_VDMA_TC_SHIFT 28 #define MGBE_RX_VDMA_TC_SHIFT 28
#define MGBE_RX_DESC_WR_RNG_RWDC_SHIFT 16
/** @} */ /** @} */
/** /**

View File

@@ -33,6 +33,44 @@
#endif /* OSI_DEBUG */ #endif /* OSI_DEBUG */
#include "hw_common.h" #include "hw_common.h"
#if 1 // copied from osi/core/common.h
/**
* @brief MTL Q size depth helper macro
*/
#define Q_SZ_DEPTH(x) (((x) * 1024U) / (MGBE_AXI_DATAWIDTH / 8U))
/* PBL values */
//redefined #define MGBE_DMA_CHX_MAX_PBL 32U
#define MGBE_DMA_CHX_PBL_16 16U
#define MGBE_DMA_CHX_PBL_8 8U
#define MGBE_DMA_CHX_PBL_4 4U
#define MGBE_DMA_CHX_PBL_1 1U
static inline nveu32_t osi_valid_pbl_value(nveu32_t pbl_value)
{
nveu32_t allowed_pbl;
nveu32_t pbl;
/* 8xPBL mode is set */
pbl = pbl_value / 8U;
if (pbl >= MGBE_DMA_CHX_MAX_PBL) {
allowed_pbl = MGBE_DMA_CHX_MAX_PBL;
} else if (pbl >= MGBE_DMA_CHX_PBL_16) {
allowed_pbl = MGBE_DMA_CHX_PBL_16;
} else if (pbl >= MGBE_DMA_CHX_PBL_8) {
allowed_pbl = MGBE_DMA_CHX_PBL_8;
} else if (pbl >= MGBE_DMA_CHX_PBL_4) {
allowed_pbl = MGBE_DMA_CHX_PBL_4;
} else {
allowed_pbl = MGBE_DMA_CHX_PBL_1;
}
return allowed_pbl;
}
#endif
/** /**
* @brief g_dma - DMA local data array. * @brief g_dma - DMA local data array.
*/ */
@@ -470,7 +508,8 @@ done:
} }
static inline void start_dma(const struct osi_dma_priv_data *const osi_dma, nveu32_t dma_chan) static inline void start_dma(const struct osi_dma_priv_data *const osi_dma, nveu32_t dma_chan)
{ {
nveu32_t chan = dma_chan & 0xFU; const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
const nveu32_t tx_dma_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t tx_dma_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_TX_CTRL(chan), EQOS_DMA_CHX_TX_CTRL(chan),
MGBE_DMA_CHX_TX_CTRL(chan), MGBE_DMA_CHX_TX_CTRL(chan),
@@ -498,8 +537,10 @@ static inline void start_dma(const struct osi_dma_priv_data *const osi_dma, nveu
static nve32_t init_dma_channel(const struct osi_dma_priv_data *const osi_dma, static nve32_t init_dma_channel(const struct osi_dma_priv_data *const osi_dma,
nveu32_t dma_chan) nveu32_t dma_chan)
{ {
const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
nveu32_t pbl = 0;
nveu32_t pdma_chan = 0xFFU; nveu32_t pdma_chan = 0xFFU;
nveu32_t chan = dma_chan & 0xFU; nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
nveu32_t riwt = osi_dma->rx_riwt & 0xFFFU; nveu32_t riwt = osi_dma->rx_riwt & 0xFFFU;
const nveu32_t intr_en_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t intr_en_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_INTR_ENA(chan), EQOS_DMA_CHX_INTR_ENA(chan),
@@ -532,7 +573,8 @@ static nve32_t init_dma_channel(const struct osi_dma_priv_data *const osi_dma,
}; };
const nveu32_t rx_pbl[2] = { const nveu32_t rx_pbl[2] = {
EQOS_DMA_CHX_RX_CTRL_RXPBL_RECOMMENDED, EQOS_DMA_CHX_RX_CTRL_RXPBL_RECOMMENDED,
((MGBE_RXQ_SIZE / osi_dma->num_dma_chans) / 2U) ((Q_SZ_DEPTH(MGBE_RXQ_SIZE/OSI_MGBE_MAX_NUM_QUEUES) /
osi_dma->num_dma_chans) / 2U)
}; };
const nveu32_t rwt_val[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t rwt_val[OSI_MAX_MAC_IP_TYPES] = {
(((riwt * (EQOS_AXI_CLK_FREQ / OSI_ONE_MEGA_HZ)) / (((riwt * (EQOS_AXI_CLK_FREQ / OSI_ONE_MEGA_HZ)) /
@@ -558,8 +600,7 @@ static nve32_t init_dma_channel(const struct osi_dma_priv_data *const osi_dma,
DMA_CHX_TX_CTRL_TSE DMA_CHX_TX_CTRL_TSE
}; };
const nveu32_t owrq = (MGBE_DMA_CHX_RX_CNTRL2_OWRQ_MCHAN / osi_dma->num_dma_chans); const nveu32_t owrq = (MGBE_DMA_CHX_RX_CNTRL2_OWRQ_MCHAN / osi_dma->num_dma_chans);
//TBD: owrq_arr add more entries for T264? const nveu32_t owrq_arr[OSI_MGBE_T23X_MAX_NUM_CHANS] = {
const nveu32_t owrq_arr[OSI_MGBE_MAX_NUM_CHANS] = {
MGBE_DMA_CHX_RX_CNTRL2_OWRQ_SCHAN, owrq, owrq, owrq, MGBE_DMA_CHX_RX_CNTRL2_OWRQ_SCHAN, owrq, owrq, owrq,
owrq, owrq, owrq, owrq, owrq, owrq owrq, owrq, owrq, owrq, owrq, owrq
}; };
@@ -620,12 +661,8 @@ static nve32_t init_dma_channel(const struct osi_dma_priv_data *const osi_dma,
* as the TxPBL else we should be using the value whcih we get after * as the TxPBL else we should be using the value whcih we get after
* calculation by using above formula * calculation by using above formula
*/ */
if (tx_pbl[osi_dma->mac] >= MGBE_DMA_CHX_MAX_PBL) { pbl = osi_valid_pbl_value(tx_pbl[osi_dma->mac]);
val |= MGBE_DMA_CHX_MAX_PBL_VAL; val |= (pbl << MGBE_DMA_CHX_CTRL_PBL_SHIFT);
} else {
val |= ((tx_pbl[osi_dma->mac] / 8U) <<
MGBE_DMA_CHX_CTRL_PBL_SHIFT);
}
} else if (osi_dma->mac == OSI_MAC_HW_MGBE_T26X) { } else if (osi_dma->mac == OSI_MAC_HW_MGBE_T26X) {
/* Map Tx VDMA's to TC. TC and PDMA mapped 1 to 1 */ /* Map Tx VDMA's to TC. TC and PDMA mapped 1 to 1 */
val &= ~MGBE_TX_VDMA_TC_MASK; val &= ~MGBE_TX_VDMA_TC_MASK;
@@ -648,12 +685,8 @@ static nve32_t init_dma_channel(const struct osi_dma_priv_data *const osi_dma,
if (osi_dma->mac == OSI_MAC_HW_EQOS) { if (osi_dma->mac == OSI_MAC_HW_EQOS) {
val |= rx_pbl[osi_dma->mac]; val |= rx_pbl[osi_dma->mac];
} else if (osi_dma->mac == OSI_MAC_HW_MGBE){ } else if (osi_dma->mac == OSI_MAC_HW_MGBE){
if (rx_pbl[osi_dma->mac] >= MGBE_DMA_CHX_MAX_PBL) { pbl = osi_valid_pbl_value(rx_pbl[osi_dma->mac]);
val |= MGBE_DMA_CHX_MAX_PBL_VAL; val |= (pbl << MGBE_DMA_CHX_CTRL_PBL_SHIFT);
} else {
val |= ((rx_pbl[osi_dma->mac] / 8U) <<
MGBE_DMA_CHX_CTRL_PBL_SHIFT);
}
} else if (osi_dma->mac == OSI_MAC_HW_MGBE_T26X) { } else if (osi_dma->mac == OSI_MAC_HW_MGBE_T26X) {
/* Map Rx VDMA's to TC. TC and PDMA mapped 1 to 1 */ /* Map Rx VDMA's to TC. TC and PDMA mapped 1 to 1 */
val &= ~MGBE_RX_VDMA_TC_MASK; val &= ~MGBE_RX_VDMA_TC_MASK;
@@ -777,7 +810,7 @@ nve32_t osi_hw_dma_init(struct osi_dma_priv_data *osi_dma)
l_dma->mac_ver = osi_dma_readl((nveu8_t *)osi_dma->base + MAC_VERSION) & l_dma->mac_ver = osi_dma_readl((nveu8_t *)osi_dma->base + MAC_VERSION) &
MAC_VERSION_SNVER_MASK; MAC_VERSION_SNVER_MASK;
if (validate_dma_mac_ver_update_chans(l_dma->mac_ver, if (validate_dma_mac_ver_update_chans(osi_dma->mac, l_dma->mac_ver,
&l_dma->num_max_chans, &l_dma->num_max_chans,
&l_dma->l_mac_ver) == 0) { &l_dma->l_mac_ver) == 0) {
OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID, OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID,
@@ -825,7 +858,8 @@ fail:
static inline void stop_dma(const struct osi_dma_priv_data *const osi_dma, static inline void stop_dma(const struct osi_dma_priv_data *const osi_dma,
nveu32_t dma_chan) nveu32_t dma_chan)
{ {
nveu32_t chan = dma_chan & 0xFU; const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
const nveu32_t dma_tx_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t dma_tx_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_TX_CTRL(chan), EQOS_DMA_CHX_TX_CTRL(chan),
MGBE_DMA_CHX_TX_CTRL(chan), MGBE_DMA_CHX_TX_CTRL(chan),
@@ -850,6 +884,71 @@ static inline void stop_dma(const struct osi_dma_priv_data *const osi_dma,
osi_dma_writel(val, (nveu8_t *)osi_dma->base + dma_rx_reg[osi_dma->mac]); osi_dma_writel(val, (nveu8_t *)osi_dma->base + dma_rx_reg[osi_dma->mac]);
} }
static inline void set_rx_riit_dma(
const struct osi_dma_priv_data *const osi_dma,
nveu32_t chan, nveu32_t riit)
{
const nveu32_t rx_wdt_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_RX_WDT(chan),
MGBE_DMA_CHX_RX_WDT(chan),
MGBE_DMA_CHX_RX_WDT(chan)
};
/* riit is in ns */
const nveu32_t itw_val = {
(((riit * ((nveu32_t)MGBE_AXI_CLK_FREQ / OSI_ONE_MEGA_HZ)) /
(MGBE_DMA_CHX_RX_WDT_ITCU * OSI_MSEC_PER_SEC))
& MGBE_DMA_CHX_RX_WDT_ITW_MAX)
};
nveu32_t val;
if (osi_dma->use_riit != OSI_DISABLE &&
osi_dma->mac == OSI_MAC_HW_MGBE_T26X) {
val = osi_dma_readl((nveu8_t *)osi_dma->base +
rx_wdt_reg[osi_dma->mac]);
val &= ~MGBE_DMA_CHX_RX_WDT_ITW_MASK;
val |= (itw_val << MGBE_DMA_CHX_RX_WDT_ITW_SHIFT);
osi_dma_writel(val, (nveu8_t *)osi_dma->base +
rx_wdt_reg[osi_dma->mac]);
}
return;
}
static inline void set_rx_riit(
const struct osi_dma_priv_data *const osi_dma, nveu32_t speed)
{
nveu32_t i, chan, riit;
nveu32_t found =OSI_DISABLE;
for (i = 0; i < osi_dma->num_of_riit; i++) {
if (osi_dma->rx_riit[i].speed == speed) {
riit = osi_dma->rx_riit[i].riit;
found = OSI_ENABLE;
break;
}
}
if (found != OSI_ENABLE) {
/* use default ~1us value */
riit = MGBE_DMA_CHX_RX_WDT_ITW_DEFAULT;
OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID,
"Invalid speed value, using default riit 1us\n",
speed);
}
/* riit is in nsec */
if ((riit > (osi_dma->rx_riwt * OSI_MSEC_PER_SEC))) {
OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID,
"Invalid riit value, using default 1us\n", riit);
}
for (i = 0; i < osi_dma->num_dma_chans; i++) {
chan = osi_dma->dma_chans[i];
set_rx_riit_dma(osi_dma, chan, riit);
}
return;
}
nve32_t osi_hw_dma_deinit(struct osi_dma_priv_data *osi_dma) nve32_t osi_hw_dma_deinit(struct osi_dma_priv_data *osi_dma)
{ {
struct dma_local *l_dma = (struct dma_local *)(void *)osi_dma; struct dma_local *l_dma = (struct dma_local *)(void *)osi_dma;
@@ -1331,7 +1430,7 @@ fail:
return ret; return ret;
} }
#ifdef OSI_DEBUG
nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma) nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma)
{ {
struct dma_local *l_dma = (struct dma_local *)osi_dma; struct dma_local *l_dma = (struct dma_local *)osi_dma;
@@ -1347,6 +1446,7 @@ nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma)
data = &osi_dma->ioctl_data; data = &osi_dma->ioctl_data;
switch (data->cmd) { switch (data->cmd) {
#ifdef OSI_DEBUG
case OSI_DMA_IOCTL_CMD_REG_DUMP: case OSI_DMA_IOCTL_CMD_REG_DUMP:
reg_dump(osi_dma); reg_dump(osi_dma);
break; break;
@@ -1356,6 +1456,10 @@ nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma)
case OSI_DMA_IOCTL_CMD_DEBUG_INTR_CONFIG: case OSI_DMA_IOCTL_CMD_DEBUG_INTR_CONFIG:
l_dma->ops_p->debug_intr_config(osi_dma); l_dma->ops_p->debug_intr_config(osi_dma);
break; break;
#endif /* OSI_DEBUG */
case OSI_DMA_IOCTL_CMD_RX_RIIT_CONFIG:
set_rx_riit(osi_dma, data->arg_u32);
break;
default: default:
OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID, OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID,
"DMA: Invalid IOCTL command", 0ULL); "DMA: Invalid IOCTL command", 0ULL);
@@ -1367,7 +1471,6 @@ nve32_t osi_dma_ioctl(struct osi_dma_priv_data *osi_dma)
#endif /* OSI_CL_FTRACE */ #endif /* OSI_CL_FTRACE */
return 0; return 0;
} }
#endif /* OSI_DEBUG */
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB

View File

@@ -194,6 +194,42 @@ static inline void check_for_more_data_avail(struct osi_rx_ring *rx_ring, nve32_
#ifdef OSI_CL_FTRACE #ifdef OSI_CL_FTRACE
nveu32_t osi_process_rx_completions_cnt = 0; nveu32_t osi_process_rx_completions_cnt = 0;
#endif /* OSI_CL_FTRACE */ #endif /* OSI_CL_FTRACE */
/**
* @brief compltd_rxdesc_cnt - number of Rx descriptors completed by HW
*
* @note
* Algorithm:
* - This routine will be invoked by OSI layer internally to get the
* available Rx descriptor to process by SW.
*
* @note
* API Group:
* - Initialization: No
* - Run time: Yes
* - De-initialization: No
*
* @param[in, out] osi_dma: Pointer to OSI DMA private data structure.
* @param[in] chan: DMA channel number for which stats should be incremented.
*/
static inline nveu32_t compltd_rx_desc_cnt(struct osi_dma_priv_data *osi_dma,
nveu32_t chan)
{
struct osi_rx_ring *rx_ring = osi_dma->rx_ring[chan];
nveu32_t value, rx_desc_wr_idx, descr_compltd;
value = osi_dma_readl((nveu8_t *)osi_dma->base +
MGBE_DMA_CHX_RX_DESC_WR_RNG_OFFSET(chan));
/* completed desc write back offset */
rx_desc_wr_idx = ((value >> MGBE_RX_DESC_WR_RNG_RWDC_SHIFT ) &
(osi_dma->rx_ring_sz - 1));
descr_compltd = (rx_desc_wr_idx - rx_ring->cur_rx_idx) &
(osi_dma->rx_ring_sz - 1U);
/* offset/index start from 0, so add 1 to get final count */
descr_compltd += 1U;
return descr_compltd;
}
nve32_t osi_process_rx_completions(struct osi_dma_priv_data *osi_dma, nve32_t osi_process_rx_completions(struct osi_dma_priv_data *osi_dma,
nveu32_t chan, nve32_t budget, nveu32_t chan, nve32_t budget,
nveu32_t *more_data_avail) nveu32_t *more_data_avail)
@@ -209,6 +245,7 @@ nve32_t osi_process_rx_completions(struct osi_dma_priv_data *osi_dma,
nve32_t received_resv = 0; nve32_t received_resv = 0;
#endif /* !OSI_STRIPPED_LIB */ #endif /* !OSI_STRIPPED_LIB */
nve32_t ret = 0; nve32_t ret = 0;
nveu32_t rx_desc_compltd;
#ifdef OSI_CL_FTRACE #ifdef OSI_CL_FTRACE
if ((osi_process_rx_completions_cnt % 1000) == 0) if ((osi_process_rx_completions_cnt % 1000) == 0)
@@ -229,6 +266,11 @@ nve32_t osi_process_rx_completions(struct osi_dma_priv_data *osi_dma,
/* Reset flag to indicate if more Rx frames available to OSD layer */ /* Reset flag to indicate if more Rx frames available to OSD layer */
*more_data_avail = OSI_NONE; *more_data_avail = OSI_NONE;
if (osi_dma->mac == OSI_MAC_HW_MGBE_T26X) {
rx_desc_compltd = compltd_rx_desc_cnt(osi_dma, chan);
budget = (budget > ((nve32_t)rx_desc_compltd)? ((nve32_t)rx_desc_compltd): budget);
}
while ((received < budget) while ((received < budget)
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
&& (received_resv < budget) && (received_resv < budget)
@@ -298,9 +340,9 @@ nve32_t osi_process_rx_completions(struct osi_dma_priv_data *osi_dma,
process_rx_desc(osi_dma, rx_ring, rx_desc, rx_swcx, rx_pkt_cx, chan, rx_ring_mask); process_rx_desc(osi_dma, rx_ring, rx_desc, rx_swcx, rx_pkt_cx, chan, rx_ring_mask);
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
osi_dma->dstats.q_rx_pkt_n[chan] = osi_dma->dstats.chan_rx_pkt_n[chan] =
dma_update_stats_counter( dma_update_stats_counter(
osi_dma->dstats.q_rx_pkt_n[chan], osi_dma->dstats.chan_rx_pkt_n[chan],
1UL); 1UL);
osi_dma->dstats.rx_pkt_n = osi_dma->dstats.rx_pkt_n =
dma_update_stats_counter(osi_dma->dstats.rx_pkt_n, 1UL); dma_update_stats_counter(osi_dma->dstats.rx_pkt_n, 1UL);
@@ -341,8 +383,8 @@ fail:
static inline void inc_tx_pkt_stats(struct osi_dma_priv_data *osi_dma, static inline void inc_tx_pkt_stats(struct osi_dma_priv_data *osi_dma,
nveu32_t chan) nveu32_t chan)
{ {
osi_dma->dstats.q_tx_pkt_n[chan] = osi_dma->dstats.chan_tx_pkt_n[chan] =
dma_update_stats_counter(osi_dma->dstats.q_tx_pkt_n[chan], 1UL); dma_update_stats_counter(osi_dma->dstats.chan_tx_pkt_n[chan], 1UL);
osi_dma->dstats.tx_pkt_n = osi_dma->dstats.tx_pkt_n =
dma_update_stats_counter(osi_dma->dstats.tx_pkt_n, 1UL); dma_update_stats_counter(osi_dma->dstats.tx_pkt_n, 1UL);
} }
@@ -549,7 +591,7 @@ static inline nve32_t process_last_desc(struct osi_dma_priv_data *osi_dma,
/* check for Last Descriptor */ /* check for Last Descriptor */
if ((tx_desc->tdes3 & TDES3_LD) == TDES3_LD) { if ((tx_desc->tdes3 & TDES3_LD) == TDES3_LD) {
if (((tx_desc->tdes3 & TDES3_ES_BITS) != 0U) && if (((tx_desc->tdes3 & TDES3_ES_BITS) != 0U) &&
(osi_dma->mac != OSI_MAC_HW_MGBE)) { (osi_dma->mac == OSI_MAC_HW_EQOS)) {
txdone_pkt_cx->flags |= OSI_TXDONE_CX_ERROR; txdone_pkt_cx->flags |= OSI_TXDONE_CX_ERROR;
#ifndef OSI_STRIPPED_LIB #ifndef OSI_STRIPPED_LIB
/* fill packet error stats */ /* fill packet error stats */
@@ -633,7 +675,7 @@ nve32_t osi_process_tx_completions(struct osi_dma_priv_data *osi_dma,
processed = process_last_desc(osi_dma, tx_desc, txdone_pkt_cx, processed); processed = process_last_desc(osi_dma, tx_desc, txdone_pkt_cx, processed);
#endif #endif
if (osi_dma->mac != OSI_MAC_HW_MGBE) { if (osi_dma->mac == OSI_MAC_HW_EQOS) {
update_tx_done_ts(tx_desc, txdone_pkt_cx); update_tx_done_ts(tx_desc, txdone_pkt_cx);
} else if (((tx_swcx->flags & OSI_PKT_CX_PTP) == OSI_PKT_CX_PTP) && } else if (((tx_swcx->flags & OSI_PKT_CX_PTP) == OSI_PKT_CX_PTP) &&
// if not master in onestep mode // if not master in onestep mode
@@ -642,6 +684,9 @@ nve32_t osi_process_tx_completions(struct osi_dma_priv_data *osi_dma,
OSI_ENABLE) && OSI_ENABLE) &&
((tx_desc->tdes3 & TDES3_CTXT) == 0U)) { ((tx_desc->tdes3 & TDES3_CTXT) == 0U)) {
txdone_pkt_cx->pktid = tx_swcx->pktid; txdone_pkt_cx->pktid = tx_swcx->pktid;
if (osi_dma->mac == OSI_MAC_HW_MGBE_T26X) {
txdone_pkt_cx->vdmaid = tx_swcx->vdmaid;
}
txdone_pkt_cx->flags |= OSI_TXDONE_CX_TS_DELAYED; txdone_pkt_cx->flags |= OSI_TXDONE_CX_TS_DELAYED;
} else { } else {
/* Do nothing here */ /* Do nothing here */
@@ -1073,6 +1118,7 @@ nve32_t hw_transmit(struct osi_dma_priv_data *osi_dma,
struct osi_tx_ring *tx_ring, struct osi_tx_ring *tx_ring,
nveu32_t dma_chan) nveu32_t dma_chan)
{ {
const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
struct dma_local *l_dma = (struct dma_local *)(void *)osi_dma; struct dma_local *l_dma = (struct dma_local *)(void *)osi_dma;
struct osi_tx_pkt_cx *tx_pkt_cx = OSI_NULL; struct osi_tx_pkt_cx *tx_pkt_cx = OSI_NULL;
struct osi_tx_desc *first_desc = OSI_NULL; struct osi_tx_desc *first_desc = OSI_NULL;
@@ -1084,7 +1130,7 @@ nve32_t hw_transmit(struct osi_dma_priv_data *osi_dma,
#ifdef OSI_DEBUG #ifdef OSI_DEBUG
nveu32_t f_idx = tx_ring->cur_tx_idx; nveu32_t f_idx = tx_ring->cur_tx_idx;
#endif /* OSI_DEBUG */ #endif /* OSI_DEBUG */
nveu32_t chan = dma_chan & 0xFU; nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
const nveu32_t tail_ptr_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t tail_ptr_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_TDTP(chan), EQOS_DMA_CHX_TDTP(chan),
MGBE_DMA_CHX_TDTLP(chan), MGBE_DMA_CHX_TDTLP(chan),
@@ -1092,6 +1138,7 @@ nve32_t hw_transmit(struct osi_dma_priv_data *osi_dma,
}; };
nve32_t cntx_desc_consumed; nve32_t cntx_desc_consumed;
nveu32_t pkt_id = 0x0U; nveu32_t pkt_id = 0x0U;
nveu32_t vdma_id = 0x0U;
nveu32_t desc_cnt = 0U; nveu32_t desc_cnt = 0U;
nveu64_t tailptr; nveu64_t tailptr;
nveu32_t entry = 0U; nveu32_t entry = 0U;
@@ -1140,11 +1187,16 @@ nve32_t hw_transmit(struct osi_dma_priv_data *osi_dma,
/* packet ID for Onestep is 0x0 always */ /* packet ID for Onestep is 0x0 always */
pkt_id = OSI_NONE; pkt_id = OSI_NONE;
} else { } else {
INC_TX_TS_PKTID(l_dma->pkt_id); if (osi_dma->mac != OSI_MAC_HW_MGBE_T26X) {
pkt_id = GET_TX_TS_PKTID(l_dma->pkt_id, chan); pkt_id = GET_TX_TS_PKTID(l_dma->pkt_id, chan);
} else {
pkt_id = GET_TX_TS_PKTID_T264(l_dma->pkt_id);
vdma_id = chan;
tx_desc->tdes0 = (vdma_id << OSI_PTP_VDMA_SHIFT);
}
} }
/* update packet id */ /* update packet id */
tx_desc->tdes0 = pkt_id; tx_desc->tdes0 |= pkt_id;
} }
INCR_TX_DESC_INDEX(entry, osi_dma->tx_ring_sz); INCR_TX_DESC_INDEX(entry, osi_dma->tx_ring_sz);
@@ -1254,7 +1306,8 @@ fail:
static nve32_t rx_dma_desc_initialization(const struct osi_dma_priv_data *const osi_dma, static nve32_t rx_dma_desc_initialization(const struct osi_dma_priv_data *const osi_dma,
nveu32_t dma_chan) nveu32_t dma_chan)
{ {
nveu32_t chan = dma_chan & 0xFU; const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
const nveu32_t start_addr_high_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t start_addr_high_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_RDLH(chan), EQOS_DMA_CHX_RDLH(chan),
MGBE_DMA_CHX_RDLH(chan), MGBE_DMA_CHX_RDLH(chan),
@@ -1399,7 +1452,8 @@ static inline void set_tx_ring_len_and_start_addr(const struct osi_dma_priv_data
nveu32_t dma_chan, nveu32_t dma_chan,
nveu32_t len) nveu32_t len)
{ {
nveu32_t chan = dma_chan & 0xFU; const nveu32_t chan_mask[OSI_MAX_MAC_IP_TYPES] = {0xFU, 0xFU, 0x3FU};
nveu32_t chan = dma_chan & chan_mask[osi_dma->mac];
const nveu32_t ring_len_reg[OSI_MAX_MAC_IP_TYPES] = { const nveu32_t ring_len_reg[OSI_MAX_MAC_IP_TYPES] = {
EQOS_DMA_CHX_TDRL(chan), EQOS_DMA_CHX_TDRL(chan),
MGBE_DMA_CHX_TX_CNTRL2(chan), MGBE_DMA_CHX_TX_CNTRL2(chan),