1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /******************************************************************************* 3*4882a593Smuzhiyun STMMAC Common Header File 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun Copyright (C) 2007-2009 STMicroelectronics Ltd 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> 9*4882a593Smuzhiyun *******************************************************************************/ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef __COMMON_H__ 12*4882a593Smuzhiyun #define __COMMON_H__ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/etherdevice.h> 15*4882a593Smuzhiyun #include <linux/netdevice.h> 16*4882a593Smuzhiyun #include <linux/stmmac.h> 17*4882a593Smuzhiyun #include <linux/phy.h> 18*4882a593Smuzhiyun #include <linux/pcs/pcs-xpcs.h> 19*4882a593Smuzhiyun #include <linux/module.h> 20*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_VLAN_8021Q) 21*4882a593Smuzhiyun #define STMMAC_VLAN_TAG_USED 22*4882a593Smuzhiyun #include <linux/if_vlan.h> 23*4882a593Smuzhiyun #endif 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #include "descs.h" 26*4882a593Smuzhiyun #include "hwif.h" 27*4882a593Smuzhiyun #include "mmc.h" 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* Synopsys Core versions */ 30*4882a593Smuzhiyun #define DWMAC_CORE_3_40 0x34 31*4882a593Smuzhiyun #define DWMAC_CORE_3_50 0x35 32*4882a593Smuzhiyun #define DWMAC_CORE_4_00 0x40 33*4882a593Smuzhiyun #define DWMAC_CORE_4_10 0x41 34*4882a593Smuzhiyun #define DWMAC_CORE_5_00 0x50 35*4882a593Smuzhiyun #define DWMAC_CORE_5_10 0x51 36*4882a593Smuzhiyun #define DWXGMAC_CORE_2_10 0x21 37*4882a593Smuzhiyun #define DWXLGMAC_CORE_2_00 0x20 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Device ID */ 40*4882a593Smuzhiyun #define DWXGMAC_ID 0x76 41*4882a593Smuzhiyun #define DWXLGMAC_ID 0x27 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define STMMAC_CHAN0 0 /* Always supported and default for all chips */ 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* TX and RX Descriptor Length, these need to be power of two. 46*4882a593Smuzhiyun * TX descriptor length less than 64 may cause transmit queue timed out error. 47*4882a593Smuzhiyun * RX descriptor length less than 64 may cause inconsistent Rx chain error. 48*4882a593Smuzhiyun */ 49*4882a593Smuzhiyun #define DMA_MIN_TX_SIZE 64 50*4882a593Smuzhiyun #define DMA_MAX_TX_SIZE 1024 51*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_STMMAC_UIO) 52*4882a593Smuzhiyun #define DMA_DEFAULT_TX_SIZE 1024 53*4882a593Smuzhiyun #else 54*4882a593Smuzhiyun #define DMA_DEFAULT_TX_SIZE 512 55*4882a593Smuzhiyun #endif 56*4882a593Smuzhiyun #define DMA_MIN_RX_SIZE 64 57*4882a593Smuzhiyun #define DMA_MAX_RX_SIZE 1024 58*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_STMMAC_UIO) 59*4882a593Smuzhiyun #define DMA_DEFAULT_RX_SIZE 1024 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun #define DMA_DEFAULT_RX_SIZE 512 62*4882a593Smuzhiyun #endif 63*4882a593Smuzhiyun #define STMMAC_GET_ENTRY(x, size) ((x + 1) & (size - 1)) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun #undef FRAME_FILTER_DEBUG 66*4882a593Smuzhiyun /* #define FRAME_FILTER_DEBUG */ 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* Extra statistic and debug information exposed by ethtool */ 69*4882a593Smuzhiyun struct stmmac_extra_stats { 70*4882a593Smuzhiyun /* Transmit errors */ 71*4882a593Smuzhiyun unsigned long tx_underflow ____cacheline_aligned; 72*4882a593Smuzhiyun unsigned long tx_carrier; 73*4882a593Smuzhiyun unsigned long tx_losscarrier; 74*4882a593Smuzhiyun unsigned long vlan_tag; 75*4882a593Smuzhiyun unsigned long tx_deferred; 76*4882a593Smuzhiyun unsigned long tx_vlan; 77*4882a593Smuzhiyun unsigned long tx_jabber; 78*4882a593Smuzhiyun unsigned long tx_frame_flushed; 79*4882a593Smuzhiyun unsigned long tx_payload_error; 80*4882a593Smuzhiyun unsigned long tx_ip_header_error; 81*4882a593Smuzhiyun /* Receive errors */ 82*4882a593Smuzhiyun unsigned long rx_desc; 83*4882a593Smuzhiyun unsigned long sa_filter_fail; 84*4882a593Smuzhiyun unsigned long overflow_error; 85*4882a593Smuzhiyun unsigned long ipc_csum_error; 86*4882a593Smuzhiyun unsigned long rx_collision; 87*4882a593Smuzhiyun unsigned long rx_crc_errors; 88*4882a593Smuzhiyun unsigned long dribbling_bit; 89*4882a593Smuzhiyun unsigned long rx_length; 90*4882a593Smuzhiyun unsigned long rx_mii; 91*4882a593Smuzhiyun unsigned long rx_multicast; 92*4882a593Smuzhiyun unsigned long rx_gmac_overflow; 93*4882a593Smuzhiyun unsigned long rx_watchdog; 94*4882a593Smuzhiyun unsigned long da_rx_filter_fail; 95*4882a593Smuzhiyun unsigned long sa_rx_filter_fail; 96*4882a593Smuzhiyun unsigned long rx_missed_cntr; 97*4882a593Smuzhiyun unsigned long rx_overflow_cntr; 98*4882a593Smuzhiyun unsigned long rx_vlan; 99*4882a593Smuzhiyun unsigned long rx_split_hdr_pkt_n; 100*4882a593Smuzhiyun /* Tx/Rx IRQ error info */ 101*4882a593Smuzhiyun unsigned long tx_undeflow_irq; 102*4882a593Smuzhiyun unsigned long tx_process_stopped_irq; 103*4882a593Smuzhiyun unsigned long tx_jabber_irq; 104*4882a593Smuzhiyun unsigned long rx_overflow_irq; 105*4882a593Smuzhiyun unsigned long rx_buf_unav_irq; 106*4882a593Smuzhiyun unsigned long rx_process_stopped_irq; 107*4882a593Smuzhiyun unsigned long rx_watchdog_irq; 108*4882a593Smuzhiyun unsigned long tx_early_irq; 109*4882a593Smuzhiyun unsigned long fatal_bus_error_irq; 110*4882a593Smuzhiyun /* Tx/Rx IRQ Events */ 111*4882a593Smuzhiyun unsigned long rx_early_irq; 112*4882a593Smuzhiyun unsigned long threshold; 113*4882a593Smuzhiyun unsigned long tx_pkt_n; 114*4882a593Smuzhiyun unsigned long rx_pkt_n; 115*4882a593Smuzhiyun unsigned long normal_irq_n; 116*4882a593Smuzhiyun unsigned long rx_normal_irq_n; 117*4882a593Smuzhiyun unsigned long napi_poll; 118*4882a593Smuzhiyun unsigned long tx_normal_irq_n; 119*4882a593Smuzhiyun unsigned long tx_clean; 120*4882a593Smuzhiyun unsigned long tx_set_ic_bit; 121*4882a593Smuzhiyun unsigned long irq_receive_pmt_irq_n; 122*4882a593Smuzhiyun /* MMC info */ 123*4882a593Smuzhiyun unsigned long mmc_tx_irq_n; 124*4882a593Smuzhiyun unsigned long mmc_rx_irq_n; 125*4882a593Smuzhiyun unsigned long mmc_rx_csum_offload_irq_n; 126*4882a593Smuzhiyun /* EEE */ 127*4882a593Smuzhiyun unsigned long irq_tx_path_in_lpi_mode_n; 128*4882a593Smuzhiyun unsigned long irq_tx_path_exit_lpi_mode_n; 129*4882a593Smuzhiyun unsigned long irq_rx_path_in_lpi_mode_n; 130*4882a593Smuzhiyun unsigned long irq_rx_path_exit_lpi_mode_n; 131*4882a593Smuzhiyun unsigned long phy_eee_wakeup_error_n; 132*4882a593Smuzhiyun /* Extended RDES status */ 133*4882a593Smuzhiyun unsigned long ip_hdr_err; 134*4882a593Smuzhiyun unsigned long ip_payload_err; 135*4882a593Smuzhiyun unsigned long ip_csum_bypassed; 136*4882a593Smuzhiyun unsigned long ipv4_pkt_rcvd; 137*4882a593Smuzhiyun unsigned long ipv6_pkt_rcvd; 138*4882a593Smuzhiyun unsigned long no_ptp_rx_msg_type_ext; 139*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_sync; 140*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_follow_up; 141*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_delay_req; 142*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_delay_resp; 143*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_pdelay_req; 144*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_pdelay_resp; 145*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_pdelay_follow_up; 146*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_announce; 147*4882a593Smuzhiyun unsigned long ptp_rx_msg_type_management; 148*4882a593Smuzhiyun unsigned long ptp_rx_msg_pkt_reserved_type; 149*4882a593Smuzhiyun unsigned long ptp_frame_type; 150*4882a593Smuzhiyun unsigned long ptp_ver; 151*4882a593Smuzhiyun unsigned long timestamp_dropped; 152*4882a593Smuzhiyun unsigned long av_pkt_rcvd; 153*4882a593Smuzhiyun unsigned long av_tagged_pkt_rcvd; 154*4882a593Smuzhiyun unsigned long vlan_tag_priority_val; 155*4882a593Smuzhiyun unsigned long l3_filter_match; 156*4882a593Smuzhiyun unsigned long l4_filter_match; 157*4882a593Smuzhiyun unsigned long l3_l4_filter_no_match; 158*4882a593Smuzhiyun /* PCS */ 159*4882a593Smuzhiyun unsigned long irq_pcs_ane_n; 160*4882a593Smuzhiyun unsigned long irq_pcs_link_n; 161*4882a593Smuzhiyun unsigned long irq_rgmii_n; 162*4882a593Smuzhiyun unsigned long pcs_link; 163*4882a593Smuzhiyun unsigned long pcs_duplex; 164*4882a593Smuzhiyun unsigned long pcs_speed; 165*4882a593Smuzhiyun /* debug register */ 166*4882a593Smuzhiyun unsigned long mtl_tx_status_fifo_full; 167*4882a593Smuzhiyun unsigned long mtl_tx_fifo_not_empty; 168*4882a593Smuzhiyun unsigned long mmtl_fifo_ctrl; 169*4882a593Smuzhiyun unsigned long mtl_tx_fifo_read_ctrl_write; 170*4882a593Smuzhiyun unsigned long mtl_tx_fifo_read_ctrl_wait; 171*4882a593Smuzhiyun unsigned long mtl_tx_fifo_read_ctrl_read; 172*4882a593Smuzhiyun unsigned long mtl_tx_fifo_read_ctrl_idle; 173*4882a593Smuzhiyun unsigned long mac_tx_in_pause; 174*4882a593Smuzhiyun unsigned long mac_tx_frame_ctrl_xfer; 175*4882a593Smuzhiyun unsigned long mac_tx_frame_ctrl_idle; 176*4882a593Smuzhiyun unsigned long mac_tx_frame_ctrl_wait; 177*4882a593Smuzhiyun unsigned long mac_tx_frame_ctrl_pause; 178*4882a593Smuzhiyun unsigned long mac_gmii_tx_proto_engine; 179*4882a593Smuzhiyun unsigned long mtl_rx_fifo_fill_level_full; 180*4882a593Smuzhiyun unsigned long mtl_rx_fifo_fill_above_thresh; 181*4882a593Smuzhiyun unsigned long mtl_rx_fifo_fill_below_thresh; 182*4882a593Smuzhiyun unsigned long mtl_rx_fifo_fill_level_empty; 183*4882a593Smuzhiyun unsigned long mtl_rx_fifo_read_ctrl_flush; 184*4882a593Smuzhiyun unsigned long mtl_rx_fifo_read_ctrl_read_data; 185*4882a593Smuzhiyun unsigned long mtl_rx_fifo_read_ctrl_status; 186*4882a593Smuzhiyun unsigned long mtl_rx_fifo_read_ctrl_idle; 187*4882a593Smuzhiyun unsigned long mtl_rx_fifo_ctrl_active; 188*4882a593Smuzhiyun unsigned long mac_rx_frame_ctrl_fifo; 189*4882a593Smuzhiyun unsigned long mac_gmii_rx_proto_engine; 190*4882a593Smuzhiyun /* TSO */ 191*4882a593Smuzhiyun unsigned long tx_tso_frames; 192*4882a593Smuzhiyun unsigned long tx_tso_nfrags; 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun /* Safety Feature statistics exposed by ethtool */ 196*4882a593Smuzhiyun struct stmmac_safety_stats { 197*4882a593Smuzhiyun unsigned long mac_errors[32]; 198*4882a593Smuzhiyun unsigned long mtl_errors[32]; 199*4882a593Smuzhiyun unsigned long dma_errors[32]; 200*4882a593Smuzhiyun }; 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun /* Number of fields in Safety Stats */ 203*4882a593Smuzhiyun #define STMMAC_SAFETY_FEAT_SIZE \ 204*4882a593Smuzhiyun (sizeof(struct stmmac_safety_stats) / sizeof(unsigned long)) 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* CSR Frequency Access Defines*/ 207*4882a593Smuzhiyun #define CSR_F_35M 35000000 208*4882a593Smuzhiyun #define CSR_F_60M 60000000 209*4882a593Smuzhiyun #define CSR_F_100M 100000000 210*4882a593Smuzhiyun #define CSR_F_150M 150000000 211*4882a593Smuzhiyun #define CSR_F_250M 250000000 212*4882a593Smuzhiyun #define CSR_F_300M 300000000 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #define MAC_CSR_H_FRQ_MASK 0x20 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun #define HASH_TABLE_SIZE 64 217*4882a593Smuzhiyun #define PAUSE_TIME 0xffff 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* Flow Control defines */ 220*4882a593Smuzhiyun #define FLOW_OFF 0 221*4882a593Smuzhiyun #define FLOW_RX 1 222*4882a593Smuzhiyun #define FLOW_TX 2 223*4882a593Smuzhiyun #define FLOW_AUTO (FLOW_TX | FLOW_RX) 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun /* PCS defines */ 226*4882a593Smuzhiyun #define STMMAC_PCS_RGMII (1 << 0) 227*4882a593Smuzhiyun #define STMMAC_PCS_SGMII (1 << 1) 228*4882a593Smuzhiyun #define STMMAC_PCS_TBI (1 << 2) 229*4882a593Smuzhiyun #define STMMAC_PCS_RTBI (1 << 3) 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun #define SF_DMA_MODE 1 /* DMA STORE-AND-FORWARD Operation Mode */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun /* DAM HW feature register fields */ 234*4882a593Smuzhiyun #define DMA_HW_FEAT_MIISEL 0x00000001 /* 10/100 Mbps Support */ 235*4882a593Smuzhiyun #define DMA_HW_FEAT_GMIISEL 0x00000002 /* 1000 Mbps Support */ 236*4882a593Smuzhiyun #define DMA_HW_FEAT_HDSEL 0x00000004 /* Half-Duplex Support */ 237*4882a593Smuzhiyun #define DMA_HW_FEAT_EXTHASHEN 0x00000008 /* Expanded DA Hash Filter */ 238*4882a593Smuzhiyun #define DMA_HW_FEAT_HASHSEL 0x00000010 /* HASH Filter */ 239*4882a593Smuzhiyun #define DMA_HW_FEAT_ADDMAC 0x00000020 /* Multiple MAC Addr Reg */ 240*4882a593Smuzhiyun #define DMA_HW_FEAT_PCSSEL 0x00000040 /* PCS registers */ 241*4882a593Smuzhiyun #define DMA_HW_FEAT_L3L4FLTREN 0x00000080 /* Layer 3 & Layer 4 Feature */ 242*4882a593Smuzhiyun #define DMA_HW_FEAT_SMASEL 0x00000100 /* SMA(MDIO) Interface */ 243*4882a593Smuzhiyun #define DMA_HW_FEAT_RWKSEL 0x00000200 /* PMT Remote Wakeup */ 244*4882a593Smuzhiyun #define DMA_HW_FEAT_MGKSEL 0x00000400 /* PMT Magic Packet */ 245*4882a593Smuzhiyun #define DMA_HW_FEAT_MMCSEL 0x00000800 /* RMON Module */ 246*4882a593Smuzhiyun #define DMA_HW_FEAT_TSVER1SEL 0x00001000 /* Only IEEE 1588-2002 */ 247*4882a593Smuzhiyun #define DMA_HW_FEAT_TSVER2SEL 0x00002000 /* IEEE 1588-2008 PTPv2 */ 248*4882a593Smuzhiyun #define DMA_HW_FEAT_EEESEL 0x00004000 /* Energy Efficient Ethernet */ 249*4882a593Smuzhiyun #define DMA_HW_FEAT_AVSEL 0x00008000 /* AV Feature */ 250*4882a593Smuzhiyun #define DMA_HW_FEAT_TXCOESEL 0x00010000 /* Checksum Offload in Tx */ 251*4882a593Smuzhiyun #define DMA_HW_FEAT_RXTYP1COE 0x00020000 /* IP COE (Type 1) in Rx */ 252*4882a593Smuzhiyun #define DMA_HW_FEAT_RXTYP2COE 0x00040000 /* IP COE (Type 2) in Rx */ 253*4882a593Smuzhiyun #define DMA_HW_FEAT_RXFIFOSIZE 0x00080000 /* Rx FIFO > 2048 Bytes */ 254*4882a593Smuzhiyun #define DMA_HW_FEAT_RXCHCNT 0x00300000 /* No. additional Rx Channels */ 255*4882a593Smuzhiyun #define DMA_HW_FEAT_TXCHCNT 0x00c00000 /* No. additional Tx Channels */ 256*4882a593Smuzhiyun #define DMA_HW_FEAT_ENHDESSEL 0x01000000 /* Alternate Descriptor */ 257*4882a593Smuzhiyun /* Timestamping with Internal System Time */ 258*4882a593Smuzhiyun #define DMA_HW_FEAT_INTTSEN 0x02000000 259*4882a593Smuzhiyun #define DMA_HW_FEAT_FLEXIPPSEN 0x04000000 /* Flexible PPS Output */ 260*4882a593Smuzhiyun #define DMA_HW_FEAT_SAVLANINS 0x08000000 /* Source Addr or VLAN */ 261*4882a593Smuzhiyun #define DMA_HW_FEAT_ACTPHYIF 0x70000000 /* Active/selected PHY iface */ 262*4882a593Smuzhiyun #define DEFAULT_DMA_PBL 8 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun /* PCS status and mask defines */ 265*4882a593Smuzhiyun #define PCS_ANE_IRQ BIT(2) /* PCS Auto-Negotiation */ 266*4882a593Smuzhiyun #define PCS_LINK_IRQ BIT(1) /* PCS Link */ 267*4882a593Smuzhiyun #define PCS_RGSMIIIS_IRQ BIT(0) /* RGMII or SMII Interrupt */ 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /* Max/Min RI Watchdog Timer count value */ 270*4882a593Smuzhiyun #define MAX_DMA_RIWT 0xff 271*4882a593Smuzhiyun #define MIN_DMA_RIWT 0x10 272*4882a593Smuzhiyun #define DEF_DMA_RIWT 0xa0 273*4882a593Smuzhiyun /* Tx coalesce parameters */ 274*4882a593Smuzhiyun #define STMMAC_COAL_TX_TIMER 1000 275*4882a593Smuzhiyun #define STMMAC_MAX_COAL_TX_TICK 100000 276*4882a593Smuzhiyun #define STMMAC_TX_MAX_FRAMES 256 277*4882a593Smuzhiyun #define STMMAC_TX_FRAMES 25 278*4882a593Smuzhiyun #define STMMAC_RX_FRAMES 0 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* Packets types */ 281*4882a593Smuzhiyun enum packets_types { 282*4882a593Smuzhiyun PACKET_AVCPQ = 0x1, /* AV Untagged Control packets */ 283*4882a593Smuzhiyun PACKET_PTPQ = 0x2, /* PTP Packets */ 284*4882a593Smuzhiyun PACKET_DCBCPQ = 0x3, /* DCB Control Packets */ 285*4882a593Smuzhiyun PACKET_UPQ = 0x4, /* Untagged Packets */ 286*4882a593Smuzhiyun PACKET_MCBCQ = 0x5, /* Multicast & Broadcast Packets */ 287*4882a593Smuzhiyun }; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* Rx IPC status */ 290*4882a593Smuzhiyun enum rx_frame_status { 291*4882a593Smuzhiyun good_frame = 0x0, 292*4882a593Smuzhiyun discard_frame = 0x1, 293*4882a593Smuzhiyun csum_none = 0x2, 294*4882a593Smuzhiyun llc_snap = 0x4, 295*4882a593Smuzhiyun dma_own = 0x8, 296*4882a593Smuzhiyun rx_not_ls = 0x10, 297*4882a593Smuzhiyun }; 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun /* Tx status */ 300*4882a593Smuzhiyun enum tx_frame_status { 301*4882a593Smuzhiyun tx_done = 0x0, 302*4882a593Smuzhiyun tx_not_ls = 0x1, 303*4882a593Smuzhiyun tx_err = 0x2, 304*4882a593Smuzhiyun tx_dma_own = 0x4, 305*4882a593Smuzhiyun }; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun enum dma_irq_status { 308*4882a593Smuzhiyun tx_hard_error = 0x1, 309*4882a593Smuzhiyun tx_hard_error_bump_tc = 0x2, 310*4882a593Smuzhiyun handle_rx = 0x4, 311*4882a593Smuzhiyun handle_tx = 0x8, 312*4882a593Smuzhiyun }; 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* EEE and LPI defines */ 315*4882a593Smuzhiyun #define CORE_IRQ_TX_PATH_IN_LPI_MODE (1 << 0) 316*4882a593Smuzhiyun #define CORE_IRQ_TX_PATH_EXIT_LPI_MODE (1 << 1) 317*4882a593Smuzhiyun #define CORE_IRQ_RX_PATH_IN_LPI_MODE (1 << 2) 318*4882a593Smuzhiyun #define CORE_IRQ_RX_PATH_EXIT_LPI_MODE (1 << 3) 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun #define CORE_IRQ_MTL_RX_OVERFLOW BIT(8) 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun /* Physical Coding Sublayer */ 323*4882a593Smuzhiyun struct rgmii_adv { 324*4882a593Smuzhiyun unsigned int pause; 325*4882a593Smuzhiyun unsigned int duplex; 326*4882a593Smuzhiyun unsigned int lp_pause; 327*4882a593Smuzhiyun unsigned int lp_duplex; 328*4882a593Smuzhiyun }; 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #define STMMAC_PCS_PAUSE 1 331*4882a593Smuzhiyun #define STMMAC_PCS_ASYM_PAUSE 2 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* DMA HW capabilities */ 334*4882a593Smuzhiyun struct dma_features { 335*4882a593Smuzhiyun unsigned int mbps_10_100; 336*4882a593Smuzhiyun unsigned int mbps_1000; 337*4882a593Smuzhiyun unsigned int half_duplex; 338*4882a593Smuzhiyun unsigned int hash_filter; 339*4882a593Smuzhiyun unsigned int multi_addr; 340*4882a593Smuzhiyun unsigned int pcs; 341*4882a593Smuzhiyun unsigned int sma_mdio; 342*4882a593Smuzhiyun unsigned int pmt_remote_wake_up; 343*4882a593Smuzhiyun unsigned int pmt_magic_frame; 344*4882a593Smuzhiyun unsigned int rmon; 345*4882a593Smuzhiyun /* IEEE 1588-2002 */ 346*4882a593Smuzhiyun unsigned int time_stamp; 347*4882a593Smuzhiyun /* IEEE 1588-2008 */ 348*4882a593Smuzhiyun unsigned int atime_stamp; 349*4882a593Smuzhiyun /* 802.3az - Energy-Efficient Ethernet (EEE) */ 350*4882a593Smuzhiyun unsigned int eee; 351*4882a593Smuzhiyun unsigned int av; 352*4882a593Smuzhiyun unsigned int hash_tb_sz; 353*4882a593Smuzhiyun unsigned int tsoen; 354*4882a593Smuzhiyun /* TX and RX csum */ 355*4882a593Smuzhiyun unsigned int tx_coe; 356*4882a593Smuzhiyun unsigned int rx_coe; 357*4882a593Smuzhiyun unsigned int rx_coe_type1; 358*4882a593Smuzhiyun unsigned int rx_coe_type2; 359*4882a593Smuzhiyun unsigned int rxfifo_over_2048; 360*4882a593Smuzhiyun /* TX and RX number of channels */ 361*4882a593Smuzhiyun unsigned int number_rx_channel; 362*4882a593Smuzhiyun unsigned int number_tx_channel; 363*4882a593Smuzhiyun /* TX and RX number of queues */ 364*4882a593Smuzhiyun unsigned int number_rx_queues; 365*4882a593Smuzhiyun unsigned int number_tx_queues; 366*4882a593Smuzhiyun /* PPS output */ 367*4882a593Smuzhiyun unsigned int pps_out_num; 368*4882a593Smuzhiyun /* Alternate (enhanced) DESC mode */ 369*4882a593Smuzhiyun unsigned int enh_desc; 370*4882a593Smuzhiyun /* TX and RX FIFO sizes */ 371*4882a593Smuzhiyun unsigned int tx_fifo_size; 372*4882a593Smuzhiyun unsigned int rx_fifo_size; 373*4882a593Smuzhiyun /* Automotive Safety Package */ 374*4882a593Smuzhiyun unsigned int asp; 375*4882a593Smuzhiyun /* RX Parser */ 376*4882a593Smuzhiyun unsigned int frpsel; 377*4882a593Smuzhiyun unsigned int frpbs; 378*4882a593Smuzhiyun unsigned int frpes; 379*4882a593Smuzhiyun unsigned int addr64; 380*4882a593Smuzhiyun unsigned int rssen; 381*4882a593Smuzhiyun unsigned int vlhash; 382*4882a593Smuzhiyun unsigned int sphen; 383*4882a593Smuzhiyun unsigned int vlins; 384*4882a593Smuzhiyun unsigned int dvlan; 385*4882a593Smuzhiyun unsigned int l3l4fnum; 386*4882a593Smuzhiyun unsigned int arpoffsel; 387*4882a593Smuzhiyun /* TSN Features */ 388*4882a593Smuzhiyun unsigned int estwid; 389*4882a593Smuzhiyun unsigned int estdep; 390*4882a593Smuzhiyun unsigned int estsel; 391*4882a593Smuzhiyun unsigned int fpesel; 392*4882a593Smuzhiyun unsigned int tbssel; 393*4882a593Smuzhiyun }; 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* RX Buffer size must be multiple of 4/8/16 bytes */ 396*4882a593Smuzhiyun #define BUF_SIZE_16KiB 16368 397*4882a593Smuzhiyun #define BUF_SIZE_8KiB 8188 398*4882a593Smuzhiyun #define BUF_SIZE_4KiB 4096 399*4882a593Smuzhiyun #define BUF_SIZE_2KiB 2048 400*4882a593Smuzhiyun 401*4882a593Smuzhiyun /* Power Down and WOL */ 402*4882a593Smuzhiyun #define PMT_NOT_SUPPORTED 0 403*4882a593Smuzhiyun #define PMT_SUPPORTED 1 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun /* Common MAC defines */ 406*4882a593Smuzhiyun #define MAC_CTRL_REG 0x00000000 /* MAC Control */ 407*4882a593Smuzhiyun #define MAC_ENABLE_TX 0x00000008 /* Transmitter Enable */ 408*4882a593Smuzhiyun #define MAC_ENABLE_RX 0x00000004 /* Receiver Enable */ 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun /* Default LPI timers */ 411*4882a593Smuzhiyun #define STMMAC_DEFAULT_LIT_LS 0x3E8 412*4882a593Smuzhiyun #define STMMAC_DEFAULT_TWT_LS 0x1E 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun #define STMMAC_CHAIN_MODE 0x1 415*4882a593Smuzhiyun #define STMMAC_RING_MODE 0x2 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun #define JUMBO_LEN 9000 418*4882a593Smuzhiyun 419*4882a593Smuzhiyun /* Receive Side Scaling */ 420*4882a593Smuzhiyun #define STMMAC_RSS_HASH_KEY_SIZE 40 421*4882a593Smuzhiyun #define STMMAC_RSS_MAX_TABLE_SIZE 256 422*4882a593Smuzhiyun 423*4882a593Smuzhiyun /* VLAN */ 424*4882a593Smuzhiyun #define STMMAC_VLAN_NONE 0x0 425*4882a593Smuzhiyun #define STMMAC_VLAN_REMOVE 0x1 426*4882a593Smuzhiyun #define STMMAC_VLAN_INSERT 0x2 427*4882a593Smuzhiyun #define STMMAC_VLAN_REPLACE 0x3 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun extern const struct stmmac_desc_ops enh_desc_ops; 430*4882a593Smuzhiyun extern const struct stmmac_desc_ops ndesc_ops; 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun struct mac_device_info; 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun extern const struct stmmac_hwtimestamp stmmac_ptp; 435*4882a593Smuzhiyun extern const struct stmmac_mode_ops dwmac4_ring_mode_ops; 436*4882a593Smuzhiyun 437*4882a593Smuzhiyun struct mac_link { 438*4882a593Smuzhiyun u32 speed_mask; 439*4882a593Smuzhiyun u32 speed10; 440*4882a593Smuzhiyun u32 speed100; 441*4882a593Smuzhiyun u32 speed1000; 442*4882a593Smuzhiyun u32 speed2500; 443*4882a593Smuzhiyun u32 duplex; 444*4882a593Smuzhiyun struct { 445*4882a593Smuzhiyun u32 speed2500; 446*4882a593Smuzhiyun u32 speed5000; 447*4882a593Smuzhiyun u32 speed10000; 448*4882a593Smuzhiyun } xgmii; 449*4882a593Smuzhiyun struct { 450*4882a593Smuzhiyun u32 speed25000; 451*4882a593Smuzhiyun u32 speed40000; 452*4882a593Smuzhiyun u32 speed50000; 453*4882a593Smuzhiyun u32 speed100000; 454*4882a593Smuzhiyun } xlgmii; 455*4882a593Smuzhiyun }; 456*4882a593Smuzhiyun 457*4882a593Smuzhiyun struct mii_regs { 458*4882a593Smuzhiyun unsigned int addr; /* MII Address */ 459*4882a593Smuzhiyun unsigned int data; /* MII Data */ 460*4882a593Smuzhiyun unsigned int addr_shift; /* MII address shift */ 461*4882a593Smuzhiyun unsigned int reg_shift; /* MII reg shift */ 462*4882a593Smuzhiyun unsigned int addr_mask; /* MII address mask */ 463*4882a593Smuzhiyun unsigned int reg_mask; /* MII reg mask */ 464*4882a593Smuzhiyun unsigned int clk_csr_shift; 465*4882a593Smuzhiyun unsigned int clk_csr_mask; 466*4882a593Smuzhiyun }; 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun struct mac_device_info { 469*4882a593Smuzhiyun const struct stmmac_ops *mac; 470*4882a593Smuzhiyun const struct stmmac_desc_ops *desc; 471*4882a593Smuzhiyun const struct stmmac_dma_ops *dma; 472*4882a593Smuzhiyun const struct stmmac_mode_ops *mode; 473*4882a593Smuzhiyun const struct stmmac_hwtimestamp *ptp; 474*4882a593Smuzhiyun const struct stmmac_tc_ops *tc; 475*4882a593Smuzhiyun const struct stmmac_mmc_ops *mmc; 476*4882a593Smuzhiyun const struct mdio_xpcs_ops *xpcs; 477*4882a593Smuzhiyun struct mdio_xpcs_args xpcs_args; 478*4882a593Smuzhiyun struct mii_regs mii; /* MII register Addresses */ 479*4882a593Smuzhiyun struct mac_link link; 480*4882a593Smuzhiyun void __iomem *pcsr; /* vpointer to device CSRs */ 481*4882a593Smuzhiyun unsigned int multicast_filter_bins; 482*4882a593Smuzhiyun unsigned int unicast_filter_entries; 483*4882a593Smuzhiyun unsigned int mcast_bits_log2; 484*4882a593Smuzhiyun unsigned int rx_csum; 485*4882a593Smuzhiyun unsigned int pcs; 486*4882a593Smuzhiyun unsigned int pmt; 487*4882a593Smuzhiyun unsigned int ps; 488*4882a593Smuzhiyun unsigned int xlgmac; 489*4882a593Smuzhiyun unsigned int num_vlan; 490*4882a593Smuzhiyun u32 vlan_filter[32]; 491*4882a593Smuzhiyun unsigned int promisc; 492*4882a593Smuzhiyun bool vlan_fail_q_en; 493*4882a593Smuzhiyun u8 vlan_fail_q; 494*4882a593Smuzhiyun }; 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun struct stmmac_rx_routing { 497*4882a593Smuzhiyun u32 reg_mask; 498*4882a593Smuzhiyun u32 reg_shift; 499*4882a593Smuzhiyun }; 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun int dwmac100_setup(struct stmmac_priv *priv); 502*4882a593Smuzhiyun int dwmac1000_setup(struct stmmac_priv *priv); 503*4882a593Smuzhiyun int dwmac4_setup(struct stmmac_priv *priv); 504*4882a593Smuzhiyun int dwxgmac2_setup(struct stmmac_priv *priv); 505*4882a593Smuzhiyun int dwxlgmac2_setup(struct stmmac_priv *priv); 506*4882a593Smuzhiyun 507*4882a593Smuzhiyun void stmmac_set_mac_addr(void __iomem *ioaddr, u8 addr[6], 508*4882a593Smuzhiyun unsigned int high, unsigned int low); 509*4882a593Smuzhiyun void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr, 510*4882a593Smuzhiyun unsigned int high, unsigned int low); 511*4882a593Smuzhiyun void stmmac_set_mac(void __iomem *ioaddr, bool enable); 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun void stmmac_dwmac4_set_mac_addr(void __iomem *ioaddr, u8 addr[6], 514*4882a593Smuzhiyun unsigned int high, unsigned int low); 515*4882a593Smuzhiyun void stmmac_dwmac4_get_mac_addr(void __iomem *ioaddr, unsigned char *addr, 516*4882a593Smuzhiyun unsigned int high, unsigned int low); 517*4882a593Smuzhiyun void stmmac_dwmac4_set_mac(void __iomem *ioaddr, bool enable); 518*4882a593Smuzhiyun 519*4882a593Smuzhiyun void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); 520*4882a593Smuzhiyun 521*4882a593Smuzhiyun extern const struct stmmac_mode_ops ring_mode_ops; 522*4882a593Smuzhiyun extern const struct stmmac_mode_ops chain_mode_ops; 523*4882a593Smuzhiyun extern const struct stmmac_desc_ops dwmac4_desc_ops; 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun #endif /* __COMMON_H__ */ 526