/* * TC956X ethernet driver. * * tc956xmac.h * * Copyright (C) 2007-2009 STMicroelectronics Ltd * Copyright (C) 2023 Toshiba Electronic Devices & Storage Corporation * * This file has been derived from the STMicro Linux driver, * and developed or modified for TC956X. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ /*! History: * 20 Jan 2021 : Initial Version * VERSION : 00-01 * * 15 Mar 2021 : Base lined * VERSION : 01-00 * * 05 Jul 2021 : 1. Used Systick handler instead of Driver kernel timer to process transmitted Tx descriptors. * 2. XFI interface support and module parameters for selection of Port0 and Port1 interface * VERSION : 01-00-01 * 15 Jul 2021 : 1. USXGMII/XFI/SGMII/RGMII interface supported without module parameter * VERSION : 01-00-02 * 20 Jul 2021 : 1. Version update * 2. Default Port1 interface selected as SGMII * VERSION : 01-00-03 * 22 Jul 2021 : 1. Version update * 2. USXGMII/XFI/SGMII/RGMII interface supported with module parameters * VERSION : 01-00-04 * 22 Jul 2021 : 1. Dynamic CM3 TAMAP configuration * VERSION : 01-00-05 * 23 Jul 2021 : 1. Add support for contiguous allocation of memory * VERSION : 01-00-06 * 29 Jul 2021 : 1. Add support to set MAC Address register * VERSION : 01-00-07 * 05 Aug 2021 : 1. Store and use Port0 pci_dev for all DMA allocation/mapping for IPA path * : 2. Register Port0 as only PCIe device, incase its PHY is not found * VERSION : 01-00-08 * 16 Aug 2021 : 1. PHY interrupt mode supported through .config_intr and .ack_interrupt API * VERSION : 01-00-09 * 24 Aug 2021 : 1. Disable TC956X_PCIE_GEN3_SETTING and TC956X_LOAD_FW_HEADER macros and provide support via Makefile * : 2. Platform API supported * VERSION : 01-00-10 * 02 Sep 2021 : 1. Configuration of Link state L0 and L1 transaction delay for PCIe switch ports & Endpoint. * VERSION : 01-00-11 * 09 Sep 2021 : Reverted changes related to usage of Port-0 pci_dev for all DMA allocation/mapping for IPA path * VERSION : 01-00-12 * 14 Sep 2021 : 1. Version update * VERSION : 01-00-13 * 23 Sep 2021 : 1. Version update * VERSION : 01-00-14 * 29 Sep 2021 : 1. Version update * VERSION : 01-00-15 * 14 Oct 2021 : 1. Version update * VERSION : 01-00-16 * 19 Oct 2021 : 1. Adding M3 SRAM Debug counters to ethtool statistics * : 2. Adding MTL RX Overflow/packet miss count, TX underflow counts,Rx Watchdog value to ethtool statistics. * : 3. Version update * VERSION : 01-00-17 * 21 Oct 2021 : 1. Added support for GPIO configuration API * : 2. Version update * VERSION : 01-00-18 * 26 Oct 2021 : 1. Updated Driver Module Version. : 2. Added variable for port-wise suspend status. : 3. Added macro to control EEE MAC Control. * VERSION : 01-00-19 * 04 Nov 2021 : 1. Version update * VERSION : 01-00-20 * 08 Nov 2021 : 1. Version update * VERSION : 01-00-21 * 24 Nov 2021 : 1. Version update 2. Private member used instead of global for wol interrupt indication * VERSION : 01-00-22 * 24 Nov 2021 : 1. Version update * VERSION : 01-00-23 * 24 Nov 2021 : 1. EEE macro enabled by default. 2. Module param support for EEE configuration 3. Version update * VERSION : 01-00-24 * 30 Nov 2021 : 1. Version update * VERSION : 01-00-25 * 30 Nov 2021 : 1. Version update * VERSION : 01-00-26 * 01 Dec 2021 : 1. Version update * VERSION : 01-00-27 * 01 Dec 2021 : 1. Version update * VERSION : 01-00-28 * 03 Dec 2021 : 1. Version update * VERSION : 01-00-29 * 08 Dec 2021 : 1. Version update * VERSION : 01-00-30 * 10 Dec 2021 : 1. Version update * VERSION : 01-00-31 * 27 Dec 2021 : 1. Support for eMAC Reset and unused clock disable during Suspend and restoring it back during resume. 2. Version update. * VERSION : 01-00-32 * 06 Jan 2022 : 1. Version update * VERSION : 01-00-33 * 07 Jan 2022 : 1. Version update * VERSION : 01-00-34 * 11 Jan 2022 : 1. Version update * VERSION : 01-00-35 * 18 Jan 2022 : 1. IRQ device name change * 2. Version update * VERSION : 01-00-36 * 20 Jan 2022 : 1. Version update * VERSION : 01-00-37 * 24 Jan 2022 : 1. Version update * VERSION : 01-00-38 * 31 Jan 2022 : 1. Debug dump API and structures added to dump registers during crash. * 2. Version update. * VERSION : 01-00-39 * 02 Feb 2022 : 1. Version update * VERSION : 01-00-40 * 04 Feb 2022 : 1. Version update * VERSION : 01-00-41 * 14 Feb 2022 : 1. Reset assert and clock disable support during Link Down. * 2. Version update. * VERSION : 01-00-42 * 22 Feb 2022 : 1. Supported GPIO configuration save and restoration * 2. Version update. * VERSION : 01-00-43 * 25 Feb 2022 : 1. Version update. * VERSION : 01-00-44 * 09 Mar 2022 : 1. Version update * VERSION : 01-00-45 * 22 Mar 2022 : 1. Version update * VERSION : 01-00-46 * 05 Apr 2022 : 1. Version update * VERSION : 01-00-47 * 06 Apr 2022 : 1. Version update * VERSION : 01-00-48 * 14 Apr 2022 : 1. Version update * VERSION : 01-00-49 * 25 Apr 2022 : 1. Version update * VERSION : 01-00-50 * 29 Apr 2022 : 1. Added variable for tracking port release status and Lock for syncing linkdown, port rlease and release of offloaded DMA channels * 2. Version update. * VERSION : 01-00-51 * 15 Jun 2022 : 1. Added debugfs support for module specific register dump * 2. Version update. * VERSION : 01-00-52 * 08 Aug 2022 : 1. Version update * VERSION : 01-00-53 * 31 Aug 2022 : 1. Added Fix for configuring Rx Parser when EEE is enabled and RGMII Interface is used * 2. Version update. * VERSION : 01-00-54 * 02 Sep 2022 : 1. 2500Base-X support for line speeds 2.5Gbps, 1Gbps, 100Mbps. * 2. Version update * VERSION : 01-00-55 * 21 Oct 2022 : 1. Version update * VERSION : 01-00-56 * 09 Nov 2022 : 1. Version update * VERSION : 01-00-57 * 22 Dec 2022 : 1. Support for SW reset during link down. * 2. Version update * VERSION : 01-00-58 * 09 May 2023 : 1. Version update * VERSION : 01-00-59 * 10 Nov 2023 : 1. DSP Cascade related modifications * 2. Kernel 6.1 Porting changes * 3. Version update * VERSION : 01-02-59 * * 26 Dec 2023 : 1. Kernel 6.6 Porting changes * 2. Added the support for TC commands taprio and flower * 3. Version update * VERSION : 01-03-59 */ #ifndef __TC956XMAC_H__ #define __TC956XMAC_H__ #include #include #include "tc956xmac_inc.h" #ifndef TC956X_SRIOV_VF #include #endif #include #include "common.h" #include #include #include #include #if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 6, 0)) #include #else #include #endif #ifdef TC956X_SRIOV_PF #include "tc956x_pf_rsc_mng.h" #endif #ifndef TC956X_SRIOV_VF //#define TC956X_LOAD_FW_HEADER #endif #define PF_DRIVER 4 /* Uncomment EEE_MAC_CONTROLLED_MODE macro for MAC controlled EEE Mode & comment for PHY controlled EEE mode */ #define EEE_MAC_CONTROLLED_MODE /* Uncomment TC956X_5_G_2_5_G_EEE_SUPPORT macro for enabling EEE support for 5G and 2.5G */ #define TC956X_5_G_2_5_G_EEE_SUPPORT // #define CONFIG_TC956XMAC_SELFTESTS /*Enable this macro to test Feature selftest*/ #ifdef TC956X #define VENDOR_ID 0x1179 #ifndef TC956X_SRIOV_VF #define DEVICE_ID 0x0220 /* PF - 0x0220, VF - 0x0221 */ #elif (defined TC956X_SRIOV_VF) #define DEVICE_ID 0x0221 /* PF - 0x0220, VF - 0x0221 */ #endif #endif #define SUB_SYS_VENDOR_ID 0x1179 #define SUB_SYS_DEVICE_ID 0x0001 #define PCI_ETHC_CLASS_CODE 0x020000 #define PCI_ETHC_CLASS_MASK 0xFFFFFF #define MOD_PARAM_ACCESS 0444 #define TC956X_PCI_DMA_WIDTH 64 #define TC956X_TX_QUEUES 8 #define TC956X_RX_QUEUES 8 #ifndef FIRMWARE_NAME #define FIRMWARE_NAME "TC956X_Firmware_PCIeBridge.bin" #endif #define TC956X_TOTAL_VFS 3 #ifdef TC956X #ifndef TC956X_SRIOV_VF #define TC956X_RESOURCE_NAME "tc956x_pci-eth" #define IRQ_DEV_NAME(x) (((x) == RM_PF0_ID) ? ("eth0") : ("eth1")) #define WOL_IRQ_DEV_NAME(x) (((x) == RM_PF0_ID) ? ("eth0_wol") : ("eth1_wol")) #define DRV_MODULE_VERSION "V_01-03-59" #define TC956X_FW_MAX_SIZE (64*1024) #elif (defined TC956X_SRIOV_VF) #define TC956X_RESOURCE_NAME "tc956x_vf_pci-eth" #define DRV_MODULE_VERSION "V_01-01-59" #endif #define ATR_AXI4_SLV_BASE 0x0800 #define ATR_AXI4_SLAVE_OFFSET 0x0100 #define ATR_AXI4_TABLE_OFFSET 0x20 #define TC956X_AXI4_SLV(ch, tid) (ATR_AXI4_SLV_BASE +\ (ch * ATR_AXI4_SLAVE_OFFSET) +\ (tid * ATR_AXI4_TABLE_OFFSET)) #define SRC_ADDR_LO_OFFSET 0x00 #define SRC_ADDR_HI_OFFSET 0x04 #define TRSL_ADDR_LO_OFFSET 0x08 #define TRSL_ADDR_HI_OFFSET 0x0C #define TRSL_PARAM_OFFSET 0x10 #define TRSL_MASK_OFFSET1 0x18 #define TRSL_MASK_OFFSET2 0x1C #define TC956X_AXI4_SLV_SRC_ADDR_LO(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ SRC_ADDR_LO_OFFSET) #define TC956X_AXI4_SLV_SRC_ADDR_HI(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ SRC_ADDR_HI_OFFSET) #define TC956X_AXI4_SLV_TRSL_ADDR_LO(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ TRSL_ADDR_LO_OFFSET) #define TC956X_AXI4_SLV_TRSL_ADDR_HI(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ TRSL_ADDR_HI_OFFSET) #define TC956X_AXI4_SLV_TRSL_PARAM(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ TRSL_PARAM_OFFSET) #define TC956X_AXI4_SLV_TRSL_MASK1(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ TRSL_MASK_OFFSET1) #define TC956X_AXI4_SLV_TRSL_MASK2(ch, tid) (TC956X_AXI4_SLV(ch, tid) +\ TRSL_MASK_OFFSET2) #define TC956X_ATR_IMPL 1U #define TC956X_ATR_SIZE(size) ((size - 1U) << 1U) #define TC956X_ATR_SIZE_MASK GENMASK(6, 1) #define TC956x_ATR_SIZE_SHIFT 1 #define TC956X_SRC_LO_MASK GENMASK(31, 12) #define TC956X_SRC_LO_SHIFT 12 #define TC956X_AXI4_SLV00_ATR_SIZE 36U #define TC956X_AXI4_SLV00_SRC_ADDR_LO_VAL (0x00000000U) #define TC956X_AXI4_SLV00_SRC_ADDR_HI_VAL (0x00000010U) #define TC956X_AXI4_SLV00_TRSL_ADDR_LO_VAL (0x00000000U) #define TC956X_AXI4_SLV00_TRSL_ADDR_HI_VAL (0x00000000U) #define TC956X_AXI4_SLV00_TRSL_PARAM_VAL (0x00000000U) #define TC956X_AXI4_SLV00_SRC_ADDR_LO_VAL_DEFAULT (0x0000007FU) #ifdef TC956X_DMA_OFFLOAD_ENABLE #define TC956X_AXI4_SLV01_ATR_SIZE 28U /* 28 bit DMA Mask */ #define TC956X_AXI4_SLV01_SRC_ADDR_LO_VAL (0x60000000U) #define TC956X_AXI4_SLV01_SRC_ADDR_HI_VAL (0x00000000U) #define TC956X_AXI4_SLV01_TRSL_ADDR_LO_VAL (0x00000000U) #define TC956X_AXI4_SLV01_TRSL_ADDR_HI_VAL (0x00000000U) #define TC956X_AXI4_SLV01_TRSL_PARAM_VAL (0x00000000U) #endif #define TC956X_M3_SRAM_FW_VER_OFFSET 0x4F900 /* DMEM addrs 0x2000F900 */ /* M3 Debug Counters in SRAM*/ #define TC956X_M3_SRAM_DEBUG_CNTS_OFFSET 0x4F800 /* DMEM addrs 0x2000F800 */ #define DB_CNT_LEN 4 /* Size of each debug counter in bytes */ #define DB_CNT0 0 /* reserved0 */ #define DB_CNT1 1 /* reserved1 */ #define DB_CNT2 2 /* reserved2 */ #define DB_CNT3 3 /* reserved3 */ #define DB_CNT4 4 /* reserved4 */ #define DB_CNT5 5 /* reserved5 */ #define DB_CNT6 6 /* reserved6 */ #define DB_CNT7 7 /* reserved7 */ #define DB_CNT8 8 /* reserved8 */ #define DB_CNT9 9 /* reserved9 */ #define DB_CNT10 10 /* reserved10 */ #define DB_CNT11 11 /* m3 watchdog expiry count*/ #define DB_CNT12 12 /* m3 watchdog monitor value */ #define DB_CNT13 13 /* reserved13 */ #define DB_CNT14 14 /* reserved14 */ #define DB_CNT15 15 /* m3 systick counter lower 32bits */ #define DB_CNT16 16 /* m3 systick counter upper 32bits */ #define DB_CNT17 17 /* m3 transmission timeout indication for port0 */ #define DB_CNT18 18 /* m3 transmission timeout indication for port1 */ #define DB_CNT19 19 /* reserved19 */ #define SIXTEEN 16 #define TWENTY 20 #define TWENTY_FOUR 24 #define SIXTY_FOUR 64 #define ONE_TWENTY_EIGHT 128 #define TWO_FIFTY_SIX 256 #define FIVE_HUNDRED_TWELVE 512 #define THOUSAND_TWENTY_FOUR 1024 #define SPD_DIV_10G 10000000 #define SPD_DIV_5G 5000000 #define SPD_DIV_2_5G 2500000 #define SPD_DIV_1G 1000000 #define SPD_DIV_100M 100000 #define NRSTCTRL0_RST_ASRT 0x1 #define NRSTCTRL0_RST_DE_ASRT 0x3 #define TC956X_OFFSET_TAMAP 0x00000010 #define TC956X_MASK_TAMAP 0xFFFFF000 #define TC956X_SHIFT_TAMAP 32 #define TC956X_OFFSET_OW 28 #define TC956X_OFFSET_OW_MAX 53 #define TC956X_HEX_ZERO 0x00000000 #define TC956X_BAR0 0 #define TC956X_BAR2 2 #define TC956X_BAR4 4 #define NMODESTS 0x0004 #define NMODESTS_MODE 0x200 #define NMODESTS_MODE2 0x400 #define NMODESTS_MODE2_SHIFT 10 #define TC956X_PCIE_SETTING_A 0 /* x4x1x1 mode */ #define TC956X_PCIE_SETTING_B 1 /* x2x2x1 mode */ #define TC9563_CFG_NEMACTXCDLY 0x1050U #define TC9563_CFG_NEMACIOCTL 0x107CU #define NEMACTXCDLY_DEFAULT 0x00000000U #define NEMACIOCTL_DEFAULT 0xF300F300 /* Systick count SRAM address DMEM addrs 0x2000F83C, Check this value for any change */ #define SYSTCIK_SRAM_OFFSET 0x4F83C /* Tx Timer count SRAM address DMEM addrs 0x2000F844, Check this value for any change */ #define TX_TIMER_SRAM_OFFSET_0 0x4F844 /* Tx Timer count SRAM address DMEM addrs 0x2000F848, Check this value for any change */ #define TX_TIMER_SRAM_OFFSET_1 0x4F848 #define TX_TIMER_SRAM_OFFSET(t) (((t) == RM_PF0_ID) ? (TX_TIMER_SRAM_OFFSET_0) : (TX_TIMER_SRAM_OFFSET_1)) #define TC956X_M3_SRAM_EEPROM_MAC_ADDR 0x47000 /* DMEM addrs 0x20007000U */ #define TC956X_M3_SRAM_EEPROM_OFFSET_ADDR 0x47050 /* DMEM addrs 0x20007050U */ #define TC956X_M3_SRAM_EEPROM_MAC_COUNT 0x47051 /* DMEM addrs 0x20007051U */ #define TC956X_M3_INIT_DONE 0x47054 /* DMEM addrs 0x20007054U */ #define TC956X_M3_FW_EXIT 0x47058 /* DMEM addrs 0x20007058U */ #define TC956X_M3_DBG_VER_START 0x4F900 #define ENABLE_USXGMII_INTERFACE 0 #define ENABLE_XFI_INTERFACE 1 /* XFI/SFI, this is same as USXGMII, except XPCS autoneg disabled */ #define ENABLE_RGMII_INTERFACE 2 #define ENABLE_SGMII_INTERFACE 3 #define ENABLE_2500BASE_X_INTERFACE 4 #define MTL_FPE_AFSZ_64 0 #define MTL_FPE_AFSZ_128 1 #define MTL_FPE_AFSZ_192 2 #define MTL_FPE_AFSZ_256 3 #ifdef TC956X_SRIOV_PF #define TC956X_DISABLE_CHNL 0 #define TC956X_ENABLE_CHNL 1 #define TC956X_DISABLE_QUEUE 0 #define TC956X_ENABLE_QUEUE 1 #endif #define MMC_XGMAC_TX_FPE_FRAG 0x208 #define MMC_XGMAC_RX_PKT_ASSEMBLY_OK 0x230 #define MMC_XGMAC_RX_FPE_FRAG 0x234 #endif #define MAX_CM3_TAMAP_ENTRIES 3 #define CM3_TAMAP_ATR_SIZE 28 /* ATR Size = 2 ^ (28 + 1) = 512MB */ #define CM3_TAMAP_SIZE (1 << (CM3_TAMAP_ATR_SIZE + 1)) #define CM3_TAMAP_MASK (CM3_TAMAP_SIZE - 1) #define CM3_TAMAP_SRC_ADDR_START 0x60000000 #define TC956XMAC_ALIGN(x) ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16) #define TC956X_MAX_LINK_DELAY 800 #define XDP_PACKET_HEADROOM 256 #define TC956X_MAX_RX_BUF_SIZE(num) (((num) * PAGE_SIZE) - XDP_PACKET_HEADROOM) #ifdef TC956X_DMA_OFFLOAD_ENABLE struct tc956xmac_cm3_tamap { u32 trsl_addr_hi; u32 trsl_addr_low; u32 src_addr_hi; u32 src_addr_low; /* Only [31:12] bits will be considered */ u32 atr_size; bool valid; }; #endif struct tc956xmac_resources { void __iomem *addr; #ifdef TC956X_SRIOV_PF #ifdef CONFIG_PCI_IOV u32 sriov_enabled; #endif #endif void __iomem *tc956x_BRIDGE_CFG_pci_base_addr; void __iomem *tc956x_SRAM_pci_base_addr; void __iomem *tc956x_SFR_pci_base_addr; const char *mac; int wol_irq; int lpi_irq; int irq; #ifdef TC956X unsigned int port_num; unsigned int port_interface; /* Kernel module parameter variable for interface */ unsigned int eee_enabled; /* Parameter to store kernel module parameter to enable/disable EEE */ unsigned int tx_lpi_timer; /* Parameter to store kernel module parameter for LPI Auto Entry Timer */ #endif }; struct tc956xmac_tx_info { dma_addr_t buf; bool map_as_page; unsigned int len; bool last_segment; bool is_jumbo; }; #define TC956XMAC_TBS_AVAIL BIT(0) #define TC956XMAC_TBS_EN BIT(1) /* Frequently used values are kept adjacent for cache effect */ struct tc956xmac_tx_queue { u32 tx_count_frames; int tbs; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 11, 0)) struct hrtimer txtimer; #else struct timer_list txtimer; #endif u32 queue_index; struct tc956xmac_priv *priv_data; struct dma_extended_desc *dma_etx ____cacheline_aligned_in_smp; struct dma_edesc *dma_entx; struct dma_desc *dma_tx; struct sk_buff **tx_skbuff; struct tc956xmac_tx_info *tx_skbuff_dma; unsigned int cur_tx; unsigned int dirty_tx; dma_addr_t dma_tx_phy; u32 tx_tail_addr; u32 mss; #ifdef TC956X_DMA_OFFLOAD_ENABLE struct sk_buff **tx_offload_skbuff; dma_addr_t *tx_offload_skbuff_dma; dma_addr_t buff_tx_phy; void *buffer_tx_va_addr; #endif }; struct tc956xmac_rx_buffer { struct page *page; struct page *sec_page; dma_addr_t addr; dma_addr_t sec_addr; }; struct tc956xmac_rx_queue { u32 rx_count_frames; u32 queue_index; struct page_pool *page_pool; struct tc956xmac_rx_buffer *buf_pool; struct tc956xmac_priv *priv_data; struct dma_extended_desc *dma_erx; struct dma_desc *dma_rx ____cacheline_aligned_in_smp; unsigned int cur_rx; unsigned int dirty_rx; u32 rx_zeroc_thresh; dma_addr_t dma_rx_phy; u32 rx_tail_addr; unsigned int state_saved; struct { struct sk_buff *skb; unsigned int len; unsigned int error; } state; #ifdef TC956X_DMA_OFFLOAD_ENABLE struct sk_buff **rx_offload_skbuff; dma_addr_t *rx_offload_skbuff_dma; dma_addr_t buff_rx_phy; void *buffer_rx_va_addr; #endif }; struct tc956xmac_channel { struct napi_struct rx_napi ____cacheline_aligned_in_smp; struct napi_struct tx_napi ____cacheline_aligned_in_smp; struct tc956xmac_priv *priv_data; spinlock_t lock; u32 index; }; struct tc956xmac_tc_entry { bool in_use; bool in_hw; bool is_last; bool is_frag; void *frag_ptr; unsigned int table_pos; u32 handle; u32 prio; struct { u32 match_data; u32 match_en; u8 af:1; u8 rf:1; u8 im:1; u8 nc:1; u8 res1:4; u8 frame_offset:6; u8 res2:2; u8 ok_index; u8 res3; u16 dma_ch_no; u16 res4; } __packed val; }; #ifdef TC956X #define TC956XMAC_PPS_MAX 3 /* Two are for output signal generation and one is internal use for eMAC */ #else #define TC956XMAC_PPS_MAX 4 #endif struct tc956xmac_pps_cfg { bool available; struct timespec64 start; struct timespec64 period; }; struct tc956xmac_rss { int enable; u8 key[TC956XMAC_RSS_HASH_KEY_SIZE]; u32 table[TC956XMAC_RSS_MAX_TABLE_SIZE]; }; #define TC956XMAC_FLOW_ACTION_DROP BIT(0) struct tc956xmac_flow_entry { unsigned long cookie; unsigned long action; u8 ip_proto; int in_use; int idx; int is_l4; }; struct tc956xmac_rfs_entry { unsigned long cookie; u16 etype; int in_use; int type; int tc; }; struct tc956x_cbs_params { u32 send_slope; u32 idle_slope; u32 high_credit; u32 low_credit; u32 percentage; }; struct tc956x_gpio_config { u8 config; /* 1: configured, 0: not configured*/ u8 out_val; /* 0 or 1 */ }; struct drv_cap { u8 csum_en; u8 crc_en; u8 tso_en; u8 jumbo_en; }; #if defined(TC956X_SRIOV_PF) && defined(TC956X_SRIOV_LOCK) struct sync_locks { spinlock_t mac_filter; spinlock_t vlan_filter; spinlock_t est; spinlock_t fpe; spinlock_t frp; spinlock_t cbs; }; #endif #ifdef TC956X_SRIOV_PF struct work_queue_param { struct ethtool_pauseparam pause; struct ifreq rq; u16 val_out[MAX_NO_OF_VFS]; u32 queue_no; u8 fn_id; u8 vf_no; }; #endif /* Rx Frame Steering */ enum tc956x_rfs_type { TC956X_RFS_T_VLAN, TC956X_RFS_T_LLDP, TC956X_RFS_T_1588, TC956X_RFS_T_MAX, }; struct tc956xmac_priv { /* Frequently used values are kept adjacent for cache effect */ #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0)) u32 tx_coal_frames[MTL_MAX_TX_QUEUES]; u32 tx_coal_timer[MTL_MAX_TX_QUEUES]; u32 rx_coal_frames[MTL_MAX_TX_QUEUES]; #else u32 tx_coal_frames; u32 tx_coal_timer; u32 rx_coal_frames; #endif int tx_coalesce; int hwts_tx_en; bool tx_path_in_lpi_mode; bool tso; int sph; u32 sarc_type; unsigned int dma_buf_sz; unsigned int rx_copybreak; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 13, 0)) u32 rx_riwt[MTL_MAX_RX_QUEUES]; #else u32 rx_riwt; #endif int hwts_rx_en; void __iomem *ioaddr; #ifdef TC956X_SRIOV_PF #ifdef CONFIG_PCI_IOV s32 sriov_enabled; #endif #endif void __iomem *tc956x_BRIDGE_CFG_pci_base_addr; void __iomem *tc956x_SRAM_pci_base_addr; void __iomem *tc956x_SFR_pci_base_addr; #if defined(TC956X_SRIOV_PF) | defined(TC956X_SRIOV_VF) void __iomem *tc956x_SRAM_mailbox_base_addr; #endif #ifdef TC956X_SRIOV_PF unsigned char clear_to_send[MAX_NO_OF_VFS]; #endif struct net_device *dev; struct device *device; struct mac_device_info *hw; int (*hwif_quirks)(struct tc956xmac_priv *priv); struct mutex lock; /* RX Queue */ struct tc956xmac_rx_queue rx_queue[MTL_MAX_RX_QUEUES]; /* TX Queue */ struct tc956xmac_tx_queue tx_queue[MTL_MAX_TX_QUEUES]; /* Generic channel for NAPI */ struct tc956xmac_channel channel[TC956XMAC_CH_MAX]; unsigned int l2_filtering_mode; /* 0 - if perfect and 1 - if hash filtering */ unsigned int vlan_hash_filtering; struct tc956x_mac_addr *mac_table; struct tc956x_vlan_id *vlan_table; u32 sa_vlan_ins_via_reg; unsigned char ins_mac_addr[ETH_ALEN]; /* RX Parser */ bool rxp_enabled; /* Phy Link State */ u32 link; int speed; u32 duplex; bool oldlink; int oldduplex; unsigned int flow_ctrl; unsigned int pause; struct mii_bus *mii; int mii_irq[PHY_MAX_ADDR]; #ifndef TC956X_SRIOV_VF struct phylink_config phylink_config; struct phylink *phylink; #endif struct tc956xmac_extra_stats xstats ____cacheline_aligned_in_smp; struct tc956xmac_safety_stats sstats; struct plat_tc956xmacenet_data *plat; struct dma_features dma_cap; struct tc956xmac_counters mmc; #ifdef TC956X_SRIOV_VF struct tc956x_sw_counters sw_stats; #endif int hw_cap_support; int synopsys_id; u32 msg_enable; int wolopts; int wol_irq; int clk_csr; int lpi_irq; unsigned int eee_enabled; int eee_active; unsigned int tx_lpi_timer; unsigned int mode; unsigned int chain_mode; int extend_desc; struct hwtstamp_config tstamp_config; struct ptp_clock *ptp_clock; struct ptp_clock_info ptp_clock_ops; unsigned int default_addend; u32 sub_second_inc; u32 systime_flags; u32 adv_ts; int use_riwt; int irq_wake; spinlock_t ptp_lock; void __iomem *mmcaddr; void __iomem *ptpaddr; #ifdef TC956X void __iomem *xpcsaddr; void __iomem *pmaaddr; #endif unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)]; #ifdef CONFIG_DEBUG_FS struct dentry *dbgfs_dir; #endif unsigned long state; struct workqueue_struct *wq; struct work_struct service_task; #ifdef TC956X_SRIOV_PF struct workqueue_struct *mbx_wq; struct work_struct service_mbx_task; struct work_queue_param mbx_wq_param; #endif spinlock_t wq_lock; #ifdef TC956X_SRIOV_VF struct workqueue_struct *mbx_wq; struct work_struct mbx_service_task; unsigned char flag; #endif /* CBS configurations */ struct tc956x_cbs_params cbs_speed100_cfg[8]; struct tc956x_cbs_params cbs_speed1000_cfg[8]; struct tc956x_cbs_params cbs_speed2500_cfg[8]; struct tc956x_cbs_params cbs_speed5000_cfg[8]; struct tc956x_cbs_params cbs_speed10000_cfg[8]; /* TC Handling */ unsigned int tc_entries_max; unsigned int tc_off_max; struct tc956xmac_tc_entry *tc_entries; unsigned int flow_entries_max; struct tc956xmac_flow_entry *flow_entries; unsigned int rfs_entries_max[TC956X_RFS_T_MAX]; unsigned int rfs_entries_cnt[TC956X_RFS_T_MAX]; unsigned int rfs_entries_total; struct tc956xmac_rfs_entry *rfs_entries; /* Pulse Per Second output */ struct tc956xmac_pps_cfg pps[TC956XMAC_PPS_MAX]; /* Receive Side Scaling */ struct tc956xmac_rss rss; #ifdef TC956X_SRIOV_PF u8 dma_vf_map[TC956XMAC_CH_MAX]; u8 pf_queue_dma_map[MTL_MAX_TX_QUEUES]; /* Features enabled in PF */ struct drv_cap pf_drv_cap; #endif /* Function ID information */ struct fn_id fn_id_info; #ifdef TC956X_SRIOV_VF /* Features enabled in PF */ struct drv_cap pf_drv_cap; #endif /* Tx Checksum Insertion */ u32 csum_insertion; #if defined(TC956X_SRIOV_PF) | defined(TC956X_SRIOV_VF) u32 rx_csum_state; #endif /* CRC Tx Rx Configuraion */ u32 tx_crc_pad_state; u32 rx_crc_pad_state; #ifdef TC956X_SRIOV_PF u8 rsc_dma_ch_alloc[MAX_FUNCTIONS_PER_PF]; #endif /* eMAC port number */ #ifdef TC956X u32 port_num; u32 mac_loopback_mode; u32 phy_loopback_mode; bool is_sgmii_2p5g; /* For 2.5G SGMI, XPCS doesn't support AN. This flag is to identify 2.5G Speed for SGMII interface. */ u32 port_interface; /* Kernel module parameter variable for interface */ bool tc956x_port_pm_suspend; /* Port Suspend Status; True : port suspended, False : port resume */ bool tc956xmac_pm_wol_interrupt; /* Port-wise flag for clearing interrupt after resume. */ #endif /* set to 1 when ptp offload is enabled, else 0. */ u32 ptp_offload; /* *ptp offloading mode - ORDINARY_SLAVE, ORDINARY_MASTER, * TRANSPARENT_SLAVE, TRANSPARENT_MASTER, PTOP_TRANSPERENT. */ u32 ptp_offloading_mode; /* set to 1 when onestep timestamp is enabled, else 0. */ u32 ost_en; /* Private data store for platform layer */ void *plat_priv; #ifdef TC956X_DMA_OFFLOAD_ENABLE void *client_priv; struct tc956xmac_cm3_tamap cm3_tamap[MAX_CM3_TAMAP_ENTRIES]; #endif /* Work struct for handling phy interrupt */ struct work_struct emac_phy_work; u32 pm_saved_emac_rst; /* Save and restore EMAC Resets during suspend-resume sequence */ u32 pm_saved_emac_clk; /* Save and restore EMAC Clocks during suspend-resume sequence */ #ifdef TC956X_SRIOV_PF #ifdef TC956X_MAGIC_PACKET_WOL_CONF bool wol_config_enabled; /* Flag to indicate SerDes configuration for SGMII, 1Gbps for WOL */ #endif /* #ifdef TC956X_MAGIC_PACKET_WOL_CONF */ u32 pm_saved_linkdown_rst; /* Save and restore Resets during link-down sequence */ u32 pm_saved_linkdown_clk; /* Save and restore Clocks during link-down sequence */ bool port_link_down; /* Flag to save per port link down state */ bool port_release; /* Flag to notify appropriate sequence of link down & up */ struct mutex port_ld_release_lock; /* Mutex lock to handle (set and clear) flag to notify appropriate sequence of link down & up */ #endif struct tc956x_gpio_config saved_gpio_config[GPIO_12 + 1]; /* Only GPIO0- GPIO06, GPI010-GPIO12 are used */ #ifdef CONFIG_DEBUG_FS struct dentry *debugfs_dir; /* debugfs structure pointer for port specific */ #endif #ifdef TC956X_ENABLE_MAC2MAC_BRIDGE void *pbridge_buffaddr; dma_addr_t pbridge_handle; size_t pbridge_buffsize; #endif #if defined(TC956X_SRIOV_PF) && defined(TC956X_SRIOV_LOCK) struct sync_locks spn_lock; #endif unsigned long link_state; bool link_down_rst; /* For light-weight release and open during link-down */ }; struct tc956x_version { unsigned char rel_dbg; /* 'R' for release, 'D' for debug */ unsigned char major; unsigned char minor; unsigned char sub_minor; unsigned char patch_rel_major; unsigned char patch_rel_minor; }; enum tc956xmac_state { TC956XMAC_DOWN, TC956XMAC_RESET_REQUESTED, TC956XMAC_RESETING, TC956XMAC_SERVICE_SCHED, }; struct tc956x_regs_config { u32 ncid; u32 nclkctrl0; u32 nrstctrl0; u32 nclkctrl1; u32 nrstctrl1; u32 nemac0ctl; u32 nemac1ctl; u32 nemacsts; u32 gpioi0; u32 gpioi1; u32 gpioe0; u32 gpioe1; }; struct tc956x_regs_pcie { u32 rsc_mng_id; }; struct tc956x_regs_msi { u32 msi_out_en; u32 msi_mask_set; u32 msi_mask_clr; u32 int_sts; u32 int_raw_sts; u32 msi_sts; u32 cnt_int0; u32 cnt_int1; u32 cnt_int2; u32 cnt_int3; u32 cnt_int4; u32 cnt_int11; u32 cnt_int12; u32 cnt_int20; u32 cnt_int24; }; struct tc956x_regs_intc { u32 intmcumask0; u32 intmcumask1; u32 intmcumask2; }; struct tc956x_regs_dma_ch { u32 control; u32 list_haddr; u32 list_laddr; u32 ring_len; u32 curr_haddr; u32 curr_laddr; u32 tail_ptr; u32 buf_haddr; u32 buf_laddr; }; struct tx956x_tx_desc_buf_addrs { dma_addr_t desc_phy_addr; struct dma_desc *desc_va_addr; #ifdef TC956X_DMA_OFFLOAD_ENABLE dma_addr_t buff_phy_addr; void *buff_va_addr; #endif struct sk_buff **tx_skbuff; struct tc956xmac_tx_info *tx_skbuff_dma; }; struct tx956x_rx_desc_buf_addrs { dma_addr_t desc_phy_addr; struct dma_desc *desc_va_addr; #ifdef TC956X_DMA_OFFLOAD_ENABLE dma_addr_t buff_phy_addr; void *buff_va_addr; #endif struct tc956xmac_rx_buffer *buf_pool; }; struct tc956x_regs_dma { u32 debug_sts0; u32 ch_control[TC956XMAC_CH_MAX]; u32 interrupt_enable[TC956XMAC_CH_MAX]; u32 ch_status[TC956XMAC_CH_MAX]; u32 debug_status[TC956XMAC_CH_MAX]; u32 rxch_watchdog_timer[TC956XMAC_CH_MAX]; struct tc956x_regs_dma_ch tx_ch[TC956XMAC_CH_MAX]; struct tc956x_regs_dma_ch rx_ch[TC956XMAC_CH_MAX]; /* RX Channels */ struct tx956x_rx_desc_buf_addrs rx_queue[MTL_MAX_RX_QUEUES]; /* TX Channels */ struct tx956x_tx_desc_buf_addrs tx_queue[MTL_MAX_TX_QUEUES]; }; struct tc956x_regs_mac { u32 mac_tx_config; u32 mac_rx_config; u32 mac_pkt_filter; u32 mac_tx_rx_status; u32 mac_debug; }; struct tc956x_regs_mtl_tx { u32 op_mode; u32 underflow; u32 debug; }; struct tc956x_regs_mtl_rx { u32 op_mode; u32 miss_pkt_overflow; u32 debug; u32 flow_control; }; struct tc956x_regs_mtl { u32 op_mode; u32 mtl_rxq_dma_map0; u32 mtl_rxq_dma_map1; struct tc956x_regs_mtl_tx tx_info[MTL_MAX_TX_QUEUES]; struct tc956x_regs_mtl_rx rx_info[MTL_MAX_RX_QUEUES]; }; struct tc956x_regs_m3 { u32 sram_tx_pcie_addr[TC956XMAC_CH_MAX]; u32 sram_rx_pcie_addr[TC956XMAC_CH_MAX]; u32 m3_fw_init_done; u32 m3_fw_exit; u32 m3_debug_cnt0; u32 m3_debug_cnt1; u32 m3_debug_cnt2; u32 m3_debug_cnt3; u32 m3_debug_cnt4; u32 m3_debug_cnt5; u32 m3_debug_cnt6; u32 m3_debug_cnt7; u32 m3_debug_cnt8; u32 m3_debug_cnt9; u32 m3_debug_cnt10; u32 m3_watchdog_exp_cnt; u32 m3_watchdog_monitor_cnt; u32 m3_debug_cnt13; u32 m3_debug_cnt14; u32 m3_systick_cnt_upper_value; u32 m3_systick_cnt_lower_value; u32 m3_tx_timeout_port0; u32 m3_tx_timeout_port1; u32 m3_debug_cnt19; }; struct tc956x_tamap { u32 trsl_addr_hi; u32 trsl_addr_low; u32 src_addr_hi; u32 src_addr_low; /* Only [31:12] bits will be considered */ u32 atr_size; u32 atr_impl; }; struct tx956x_driver_info { u8 driver[32]; u8 version[32]; u8 fw_version[32]; }; struct tc956x_statistics { u64 rx_buf_unav_irq[TC956XMAC_CH_MAX]; u64 tx_pkt_n[TC956XMAC_CH_MAX]; u64 tx_pkt_errors_n[TC956XMAC_CH_MAX]; u64 rx_pkt_n[TC956XMAC_CH_MAX]; u64 mmc_tx_broadcastframe_g; u64 mmc_tx_multicastframe_g; u64 mmc_tx_64_octets_gb; u64 mmc_tx_framecount_gb; u64 mmc_tx_65_to_127_octets_gb; u64 mmc_tx_128_to_255_octets_gb; u64 mmc_tx_256_to_511_octets_gb; u64 mmc_tx_512_to_1023_octets_gb; u64 mmc_tx_1024_to_max_octets_gb; u64 mmc_tx_unicast_gb; u64 mmc_tx_underflow_error; u64 mmc_tx_framecount_g; u64 mmc_tx_pause_frame; u64 mmc_tx_vlan_frame_g; u64 mmc_tx_lpi_us_cntr; u64 mmc_tx_lpi_tran_cntr; /* MMC RX counter registers */ u64 mmc_rx_framecount_gb; u64 mmc_rx_broadcastframe_g; u64 mmc_rx_multicastframe_g; u64 mmc_rx_crc_error; u64 mmc_rx_jabber_error; u64 mmc_rx_undersize_g; u64 mmc_rx_oversize_g; u64 mmc_rx_64_octets_gb; u64 mmc_rx_65_to_127_octets_gb; u64 mmc_rx_128_to_255_octets_gb; u64 mmc_rx_256_to_511_octets_gb; u64 mmc_rx_512_to_1023_octets_gb; u64 mmc_rx_1024_to_max_octets_gb; u64 mmc_rx_unicast_g; u64 mmc_rx_length_error; u64 mmc_rx_pause_frames; u64 mmc_rx_fifo_overflow; u64 mmc_rx_lpi_us_cntr; u64 mmc_rx_lpi_tran_cntr; }; struct tc956x_regs { /*PCIe register*/ struct tc956x_regs_pcie pcie_reg; /*Configuration register*/ struct tc956x_regs_config config_reg; /*MSI register*/ struct tc956x_regs_msi msi_reg; /*INTC register*/ struct tc956x_regs_intc intc_reg; /*DMA Descriptor stats*/ struct tc956x_regs_dma dma_reg; /*MAC debug stats*/ struct tc956x_regs_mac mac_reg; /*MTL debug stats*/ struct tc956x_regs_mtl mtl_reg; /*M3 stats*/ struct tc956x_regs_m3 m3_reg; /*FRP Table*/ struct tc956xmac_rx_parser_cfg *rxp_cfg; /* TAMAP */ struct tc956x_tamap tamap[MAX_CM3_TAMAP_ENTRIES + 1]; /*0th for PCIe-eMAC 1,2,3 for IPA*/ /*Driver & FW Information */ struct tx956x_driver_info info; /* Statistics counters*/ struct tc956x_statistics stats; }; int tc956x_dump_regs(struct net_device *net_device, struct tc956x_regs *regs); int tc956x_print_debug_regs(struct net_device *net_device, struct tc956x_regs *regs); int tc956xmac_mdio_unregister(struct net_device *ndev); int tc956xmac_mdio_register(struct net_device *ndev); int tc956xmac_mdio_reset(struct mii_bus *mii); void tc956xmac_set_ethtool_ops(struct net_device *netdev); void tc956xmac_ptp_register(struct tc956xmac_priv *priv); void tc956xmac_ptp_unregister(struct tc956xmac_priv *priv); #ifdef TC956X_SRIOV_PF int tc956xmac_resume(struct device *dev); int tc956xmac_suspend(struct device *dev); int tc956xmac_dvr_remove(struct device *dev); int tc956xmac_dvr_probe(struct device *device, struct plat_tc956xmacenet_data *plat_dat, struct tc956xmac_resources *res); #elif defined TC956X_SRIOV_VF int tc956xmac_vf_resume(struct device *dev); int tc956xmac_vf_suspend(struct device *dev); int tc956xmac_vf_dvr_remove(struct device *dev); int tc956xmac_vf_dvr_probe(struct device *device, struct plat_tc956xmacenet_data *plat_dat, struct tc956xmac_resources *res); #endif void tc956xmac_disable_eee_mode(struct tc956xmac_priv *priv); bool tc956xmac_eee_init(struct tc956xmac_priv *priv); #ifdef CONFIG_TC956XMAC_SELFTESTS void tc956xmac_selftest_run(struct net_device *dev, struct ethtool_test *etest, u64 *buf); void tc956xmac_selftest_get_strings(struct tc956xmac_priv *priv, u8 *data); int tc956xmac_selftest_get_count(struct tc956xmac_priv *priv); #else static inline void tc956xmac_selftest_run(struct net_device *dev, struct ethtool_test *etest, u64 *buf) { /* Not enabled */ } static inline void tc956xmac_selftest_get_strings(struct tc956xmac_priv *priv, u8 *data) { /* Not enabled */ } static inline int tc956xmac_selftest_get_count(struct tc956xmac_priv *priv) { return -EOPNOTSUPP; } #endif /* CONFIG_TC956XMAC_SELFTESTS */ /* Function Prototypes */ #ifndef TC956X_SRIOV_VF s32 tc956x_load_firmware(struct device *dev, struct tc956xmac_resources *res); #endif extern int tc956xmac_pm_usage_counter; #if defined(TC956X_SRIOV_PF) && !defined(TC956X_AUTOMOTIVE_CONFIG) && !defined(TC956X_ENABLE_MAC2MAC_BRIDGE) int tc956x_pf_get_fn_idx_from_int_sts(struct tc956xmac_priv *priv, struct fn_id *fn_id_info); void tc956x_pf_parse_mbx(struct tc956xmac_priv *priv, enum mbx_msg_fns msg_src); #endif #ifdef CONFIG_TC956X_PLATFORM_SUPPORT int tc956x_platform_probe(struct tc956xmac_priv *priv, struct tc956xmac_resources *res); int tc956x_platform_remove(struct tc956xmac_priv *priv); int tc956x_platform_suspend(struct tc956xmac_priv *priv); int tc956x_platform_resume(struct tc956xmac_priv *priv); #else static inline int tc956x_platform_probe(struct tc956xmac_priv *priv, struct tc956xmac_resources *res) { return 0; } static inline int tc956x_platform_remove(struct tc956xmac_priv *priv) { return 0; } static inline int tc956x_platform_suspend(struct tc956xmac_priv *priv) { return 0; } static inline int tc956x_platform_resume(struct tc956xmac_priv *priv) { return 0; } #endif int tc956x_GPIO_OutputConfigPin(struct tc956xmac_priv *priv, u32 gpio_pin, u8 out_value); int tc956x_gpio_restore_configuration(struct tc956xmac_priv *priv); #ifdef TC956X_SRIOV_VF int tc956x_vf_get_fn_idx_from_int_sts(struct tc956xmac_priv *priv, struct fn_id *fn_id_info); void tc956x_vf_parse_mbx(struct tc956xmac_priv *priv, enum mbx_msg_fns msg_src); int tc956x_vf_rsc_mng_get_fn_id(struct tc956xmac_priv *priv, void __iomem *reg_pci_bridge_config_addr, struct fn_id *fn_id_info); #endif int tc956x_set_pci_speed(struct pci_dev *pdev, u32 speed); void tc956xmac_link_change_set_power(struct tc956xmac_priv *priv, enum TC956X_PORT_LINK_CHANGE_STATE state); #endif /* __TC956XMAC_H__ */