1*bfec6d7fSVivian Wang /* SPDX-License-Identifier: GPL-2.0 */ 2*bfec6d7fSVivian Wang /* 3*bfec6d7fSVivian Wang * SpacemiT K1 Ethernet hardware definitions 4*bfec6d7fSVivian Wang * 5*bfec6d7fSVivian Wang * Copyright (C) 2023-2025 SpacemiT (Hangzhou) Technology Co. Ltd 6*bfec6d7fSVivian Wang * Copyright (C) 2025 Vivian Wang <wangruikang@iscas.ac.cn> 7*bfec6d7fSVivian Wang */ 8*bfec6d7fSVivian Wang 9*bfec6d7fSVivian Wang #ifndef _K1_EMAC_H_ 10*bfec6d7fSVivian Wang #define _K1_EMAC_H_ 11*bfec6d7fSVivian Wang 12*bfec6d7fSVivian Wang #include <linux/stddef.h> 13*bfec6d7fSVivian Wang 14*bfec6d7fSVivian Wang /* APMU syscon registers */ 15*bfec6d7fSVivian Wang 16*bfec6d7fSVivian Wang #define APMU_EMAC_CTRL_REG 0x0 17*bfec6d7fSVivian Wang 18*bfec6d7fSVivian Wang #define PHY_INTF_RGMII BIT(2) 19*bfec6d7fSVivian Wang 20*bfec6d7fSVivian Wang /* 21*bfec6d7fSVivian Wang * Only valid for RMII mode 22*bfec6d7fSVivian Wang * 0: Ref clock from External PHY 23*bfec6d7fSVivian Wang * 1: Ref clock from SoC 24*bfec6d7fSVivian Wang */ 25*bfec6d7fSVivian Wang #define REF_CLK_SEL BIT(3) 26*bfec6d7fSVivian Wang 27*bfec6d7fSVivian Wang /* 28*bfec6d7fSVivian Wang * Function clock select 29*bfec6d7fSVivian Wang * 0: 208 MHz 30*bfec6d7fSVivian Wang * 1: 312 MHz 31*bfec6d7fSVivian Wang */ 32*bfec6d7fSVivian Wang #define FUNC_CLK_SEL BIT(4) 33*bfec6d7fSVivian Wang 34*bfec6d7fSVivian Wang /* Only valid for RMII, invert TX clk */ 35*bfec6d7fSVivian Wang #define RMII_TX_CLK_SEL BIT(6) 36*bfec6d7fSVivian Wang 37*bfec6d7fSVivian Wang /* Only valid for RMII, invert RX clk */ 38*bfec6d7fSVivian Wang #define RMII_RX_CLK_SEL BIT(7) 39*bfec6d7fSVivian Wang 40*bfec6d7fSVivian Wang /* 41*bfec6d7fSVivian Wang * Only valid for RGMII 42*bfec6d7fSVivian Wang * 0: TX clk from RX clk 43*bfec6d7fSVivian Wang * 1: TX clk from SoC 44*bfec6d7fSVivian Wang */ 45*bfec6d7fSVivian Wang #define RGMII_TX_CLK_SEL BIT(8) 46*bfec6d7fSVivian Wang 47*bfec6d7fSVivian Wang #define PHY_IRQ_EN BIT(12) 48*bfec6d7fSVivian Wang #define AXI_SINGLE_ID BIT(13) 49*bfec6d7fSVivian Wang 50*bfec6d7fSVivian Wang #define APMU_EMAC_DLINE_REG 0x4 51*bfec6d7fSVivian Wang 52*bfec6d7fSVivian Wang #define EMAC_RX_DLINE_EN BIT(0) 53*bfec6d7fSVivian Wang #define EMAC_RX_DLINE_STEP_MASK GENMASK(5, 4) 54*bfec6d7fSVivian Wang #define EMAC_RX_DLINE_CODE_MASK GENMASK(15, 8) 55*bfec6d7fSVivian Wang 56*bfec6d7fSVivian Wang #define EMAC_TX_DLINE_EN BIT(16) 57*bfec6d7fSVivian Wang #define EMAC_TX_DLINE_STEP_MASK GENMASK(21, 20) 58*bfec6d7fSVivian Wang #define EMAC_TX_DLINE_CODE_MASK GENMASK(31, 24) 59*bfec6d7fSVivian Wang 60*bfec6d7fSVivian Wang #define EMAC_DLINE_STEP_15P6 0 /* 15.6 ps/step */ 61*bfec6d7fSVivian Wang #define EMAC_DLINE_STEP_24P4 1 /* 24.4 ps/step */ 62*bfec6d7fSVivian Wang #define EMAC_DLINE_STEP_29P7 2 /* 29.7 ps/step */ 63*bfec6d7fSVivian Wang #define EMAC_DLINE_STEP_35P1 3 /* 35.1 ps/step */ 64*bfec6d7fSVivian Wang 65*bfec6d7fSVivian Wang /* DMA register set */ 66*bfec6d7fSVivian Wang #define DMA_CONFIGURATION 0x0000 67*bfec6d7fSVivian Wang #define DMA_CONTROL 0x0004 68*bfec6d7fSVivian Wang #define DMA_STATUS_IRQ 0x0008 69*bfec6d7fSVivian Wang #define DMA_INTERRUPT_ENABLE 0x000c 70*bfec6d7fSVivian Wang 71*bfec6d7fSVivian Wang #define DMA_TRANSMIT_AUTO_POLL_COUNTER 0x0010 72*bfec6d7fSVivian Wang #define DMA_TRANSMIT_POLL_DEMAND 0x0014 73*bfec6d7fSVivian Wang #define DMA_RECEIVE_POLL_DEMAND 0x0018 74*bfec6d7fSVivian Wang 75*bfec6d7fSVivian Wang #define DMA_TRANSMIT_BASE_ADDRESS 0x001c 76*bfec6d7fSVivian Wang #define DMA_RECEIVE_BASE_ADDRESS 0x0020 77*bfec6d7fSVivian Wang #define DMA_MISSED_FRAME_COUNTER 0x0024 78*bfec6d7fSVivian Wang #define DMA_STOP_FLUSH_COUNTER 0x0028 79*bfec6d7fSVivian Wang 80*bfec6d7fSVivian Wang #define DMA_RECEIVE_IRQ_MITIGATION_CTRL 0x002c 81*bfec6d7fSVivian Wang 82*bfec6d7fSVivian Wang #define DMA_CURRENT_TRANSMIT_DESCRIPTOR_POINTER 0x0030 83*bfec6d7fSVivian Wang #define DMA_CURRENT_TRANSMIT_BUFFER_POINTER 0x0034 84*bfec6d7fSVivian Wang #define DMA_CURRENT_RECEIVE_DESCRIPTOR_POINTER 0x0038 85*bfec6d7fSVivian Wang #define DMA_CURRENT_RECEIVE_BUFFER_POINTER 0x003c 86*bfec6d7fSVivian Wang 87*bfec6d7fSVivian Wang /* MAC Register set */ 88*bfec6d7fSVivian Wang #define MAC_GLOBAL_CONTROL 0x0100 89*bfec6d7fSVivian Wang #define MAC_TRANSMIT_CONTROL 0x0104 90*bfec6d7fSVivian Wang #define MAC_RECEIVE_CONTROL 0x0108 91*bfec6d7fSVivian Wang #define MAC_MAXIMUM_FRAME_SIZE 0x010c 92*bfec6d7fSVivian Wang #define MAC_TRANSMIT_JABBER_SIZE 0x0110 93*bfec6d7fSVivian Wang #define MAC_RECEIVE_JABBER_SIZE 0x0114 94*bfec6d7fSVivian Wang #define MAC_ADDRESS_CONTROL 0x0118 95*bfec6d7fSVivian Wang #define MAC_MDIO_CLK_DIV 0x011c 96*bfec6d7fSVivian Wang #define MAC_ADDRESS1_HIGH 0x0120 97*bfec6d7fSVivian Wang #define MAC_ADDRESS1_MED 0x0124 98*bfec6d7fSVivian Wang #define MAC_ADDRESS1_LOW 0x0128 99*bfec6d7fSVivian Wang #define MAC_ADDRESS2_HIGH 0x012c 100*bfec6d7fSVivian Wang #define MAC_ADDRESS2_MED 0x0130 101*bfec6d7fSVivian Wang #define MAC_ADDRESS2_LOW 0x0134 102*bfec6d7fSVivian Wang #define MAC_ADDRESS3_HIGH 0x0138 103*bfec6d7fSVivian Wang #define MAC_ADDRESS3_MED 0x013c 104*bfec6d7fSVivian Wang #define MAC_ADDRESS3_LOW 0x0140 105*bfec6d7fSVivian Wang #define MAC_ADDRESS4_HIGH 0x0144 106*bfec6d7fSVivian Wang #define MAC_ADDRESS4_MED 0x0148 107*bfec6d7fSVivian Wang #define MAC_ADDRESS4_LOW 0x014c 108*bfec6d7fSVivian Wang #define MAC_MULTICAST_HASH_TABLE1 0x0150 109*bfec6d7fSVivian Wang #define MAC_MULTICAST_HASH_TABLE2 0x0154 110*bfec6d7fSVivian Wang #define MAC_MULTICAST_HASH_TABLE3 0x0158 111*bfec6d7fSVivian Wang #define MAC_MULTICAST_HASH_TABLE4 0x015c 112*bfec6d7fSVivian Wang #define MAC_FC_CONTROL 0x0160 113*bfec6d7fSVivian Wang #define MAC_FC_PAUSE_FRAME_GENERATE 0x0164 114*bfec6d7fSVivian Wang #define MAC_FC_SOURCE_ADDRESS_HIGH 0x0168 115*bfec6d7fSVivian Wang #define MAC_FC_SOURCE_ADDRESS_MED 0x016c 116*bfec6d7fSVivian Wang #define MAC_FC_SOURCE_ADDRESS_LOW 0x0170 117*bfec6d7fSVivian Wang #define MAC_FC_DESTINATION_ADDRESS_HIGH 0x0174 118*bfec6d7fSVivian Wang #define MAC_FC_DESTINATION_ADDRESS_MED 0x0178 119*bfec6d7fSVivian Wang #define MAC_FC_DESTINATION_ADDRESS_LOW 0x017c 120*bfec6d7fSVivian Wang #define MAC_FC_PAUSE_TIME_VALUE 0x0180 121*bfec6d7fSVivian Wang #define MAC_FC_HIGH_PAUSE_TIME 0x0184 122*bfec6d7fSVivian Wang #define MAC_FC_LOW_PAUSE_TIME 0x0188 123*bfec6d7fSVivian Wang #define MAC_FC_PAUSE_HIGH_THRESHOLD 0x018c 124*bfec6d7fSVivian Wang #define MAC_FC_PAUSE_LOW_THRESHOLD 0x0190 125*bfec6d7fSVivian Wang #define MAC_MDIO_CONTROL 0x01a0 126*bfec6d7fSVivian Wang #define MAC_MDIO_DATA 0x01a4 127*bfec6d7fSVivian Wang #define MAC_RX_STATCTR_CONTROL 0x01a8 128*bfec6d7fSVivian Wang #define MAC_RX_STATCTR_DATA_HIGH 0x01ac 129*bfec6d7fSVivian Wang #define MAC_RX_STATCTR_DATA_LOW 0x01b0 130*bfec6d7fSVivian Wang #define MAC_TX_STATCTR_CONTROL 0x01b4 131*bfec6d7fSVivian Wang #define MAC_TX_STATCTR_DATA_HIGH 0x01b8 132*bfec6d7fSVivian Wang #define MAC_TX_STATCTR_DATA_LOW 0x01bc 133*bfec6d7fSVivian Wang #define MAC_TRANSMIT_FIFO_ALMOST_FULL 0x01c0 134*bfec6d7fSVivian Wang #define MAC_TRANSMIT_PACKET_START_THRESHOLD 0x01c4 135*bfec6d7fSVivian Wang #define MAC_RECEIVE_PACKET_START_THRESHOLD 0x01c8 136*bfec6d7fSVivian Wang #define MAC_STATUS_IRQ 0x01e0 137*bfec6d7fSVivian Wang #define MAC_INTERRUPT_ENABLE 0x01e4 138*bfec6d7fSVivian Wang 139*bfec6d7fSVivian Wang /* Used for register dump */ 140*bfec6d7fSVivian Wang #define EMAC_DMA_REG_CNT 16 141*bfec6d7fSVivian Wang #define EMAC_MAC_REG_CNT 124 142*bfec6d7fSVivian Wang 143*bfec6d7fSVivian Wang /* DMA_CONFIGURATION (0x0000) */ 144*bfec6d7fSVivian Wang 145*bfec6d7fSVivian Wang /* 146*bfec6d7fSVivian Wang * 0-DMA controller in normal operation mode, 147*bfec6d7fSVivian Wang * 1-DMA controller reset to default state, 148*bfec6d7fSVivian Wang * clearing all internal state information 149*bfec6d7fSVivian Wang */ 150*bfec6d7fSVivian Wang #define MREGBIT_SOFTWARE_RESET BIT(0) 151*bfec6d7fSVivian Wang 152*bfec6d7fSVivian Wang #define MREGBIT_BURST_1WORD BIT(1) 153*bfec6d7fSVivian Wang #define MREGBIT_BURST_2WORD BIT(2) 154*bfec6d7fSVivian Wang #define MREGBIT_BURST_4WORD BIT(3) 155*bfec6d7fSVivian Wang #define MREGBIT_BURST_8WORD BIT(4) 156*bfec6d7fSVivian Wang #define MREGBIT_BURST_16WORD BIT(5) 157*bfec6d7fSVivian Wang #define MREGBIT_BURST_32WORD BIT(6) 158*bfec6d7fSVivian Wang #define MREGBIT_BURST_64WORD BIT(7) 159*bfec6d7fSVivian Wang #define MREGBIT_BURST_LENGTH GENMASK(7, 1) 160*bfec6d7fSVivian Wang #define MREGBIT_DESCRIPTOR_SKIP_LENGTH GENMASK(12, 8) 161*bfec6d7fSVivian Wang 162*bfec6d7fSVivian Wang /* For Receive and Transmit DMA operate in Big-Endian mode for Descriptors. */ 163*bfec6d7fSVivian Wang #define MREGBIT_DESCRIPTOR_BYTE_ORDERING BIT(13) 164*bfec6d7fSVivian Wang 165*bfec6d7fSVivian Wang #define MREGBIT_BIG_LITLE_ENDIAN BIT(14) 166*bfec6d7fSVivian Wang #define MREGBIT_TX_RX_ARBITRATION BIT(15) 167*bfec6d7fSVivian Wang #define MREGBIT_WAIT_FOR_DONE BIT(16) 168*bfec6d7fSVivian Wang #define MREGBIT_STRICT_BURST BIT(17) 169*bfec6d7fSVivian Wang #define MREGBIT_DMA_64BIT_MODE BIT(18) 170*bfec6d7fSVivian Wang 171*bfec6d7fSVivian Wang /* DMA_CONTROL (0x0004) */ 172*bfec6d7fSVivian Wang #define MREGBIT_START_STOP_TRANSMIT_DMA BIT(0) 173*bfec6d7fSVivian Wang #define MREGBIT_START_STOP_RECEIVE_DMA BIT(1) 174*bfec6d7fSVivian Wang 175*bfec6d7fSVivian Wang /* DMA_STATUS_IRQ (0x0008) */ 176*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_TRANSFER_DONE_IRQ BIT(0) 177*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_DES_UNAVAILABLE_IRQ BIT(1) 178*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_DMA_STOPPED_IRQ BIT(2) 179*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_TRANSFER_DONE_IRQ BIT(4) 180*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_DES_UNAVAILABLE_IRQ BIT(5) 181*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_DMA_STOPPED_IRQ BIT(6) 182*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_MISSED_FRAME_IRQ BIT(7) 183*bfec6d7fSVivian Wang #define MREGBIT_MAC_IRQ BIT(8) 184*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_DMA_STATE GENMASK(18, 16) 185*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_DMA_STATE GENMASK(23, 20) 186*bfec6d7fSVivian Wang 187*bfec6d7fSVivian Wang /* DMA_INTERRUPT_ENABLE (0x000c) */ 188*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_TRANSFER_DONE_INTR_ENABLE BIT(0) 189*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_DES_UNAVAILABLE_INTR_ENABLE BIT(1) 190*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_DMA_STOPPED_INTR_ENABLE BIT(2) 191*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_TRANSFER_DONE_INTR_ENABLE BIT(4) 192*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_DES_UNAVAILABLE_INTR_ENABLE BIT(5) 193*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_DMA_STOPPED_INTR_ENABLE BIT(6) 194*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_MISSED_FRAME_INTR_ENABLE BIT(7) 195*bfec6d7fSVivian Wang #define MREGBIT_MAC_INTR_ENABLE BIT(8) 196*bfec6d7fSVivian Wang 197*bfec6d7fSVivian Wang /* DMA_RECEIVE_IRQ_MITIGATION_CTRL (0x002c) */ 198*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_IRQ_FRAME_COUNTER_MASK GENMASK(7, 0) 199*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_IRQ_TIMEOUT_COUNTER_MASK GENMASK(27, 8) 200*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_IRQ_FRAME_COUNTER_MODE BIT(30) 201*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_IRQ_MITIGATION_ENABLE BIT(31) 202*bfec6d7fSVivian Wang 203*bfec6d7fSVivian Wang /* MAC_GLOBAL_CONTROL (0x0100) */ 204*bfec6d7fSVivian Wang #define MREGBIT_SPEED GENMASK(1, 0) 205*bfec6d7fSVivian Wang #define MREGBIT_SPEED_10M 0x0 206*bfec6d7fSVivian Wang #define MREGBIT_SPEED_100M BIT(0) 207*bfec6d7fSVivian Wang #define MREGBIT_SPEED_1000M BIT(1) 208*bfec6d7fSVivian Wang #define MREGBIT_FULL_DUPLEX_MODE BIT(2) 209*bfec6d7fSVivian Wang #define MREGBIT_RESET_RX_STAT_COUNTERS BIT(3) 210*bfec6d7fSVivian Wang #define MREGBIT_RESET_TX_STAT_COUNTERS BIT(4) 211*bfec6d7fSVivian Wang #define MREGBIT_UNICAST_WAKEUP_MODE BIT(8) 212*bfec6d7fSVivian Wang #define MREGBIT_MAGIC_PACKET_WAKEUP_MODE BIT(9) 213*bfec6d7fSVivian Wang 214*bfec6d7fSVivian Wang /* MAC_TRANSMIT_CONTROL (0x0104) */ 215*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_ENABLE BIT(0) 216*bfec6d7fSVivian Wang #define MREGBIT_INVERT_FCS BIT(1) 217*bfec6d7fSVivian Wang #define MREGBIT_DISABLE_FCS_INSERT BIT(2) 218*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_AUTO_RETRY BIT(3) 219*bfec6d7fSVivian Wang #define MREGBIT_IFG_LEN GENMASK(6, 4) 220*bfec6d7fSVivian Wang #define MREGBIT_PREAMBLE_LENGTH GENMASK(9, 7) 221*bfec6d7fSVivian Wang 222*bfec6d7fSVivian Wang /* MAC_RECEIVE_CONTROL (0x0108) */ 223*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_ENABLE BIT(0) 224*bfec6d7fSVivian Wang #define MREGBIT_DISABLE_FCS_CHECK BIT(1) 225*bfec6d7fSVivian Wang #define MREGBIT_STRIP_FCS BIT(2) 226*bfec6d7fSVivian Wang #define MREGBIT_STORE_FORWARD BIT(3) 227*bfec6d7fSVivian Wang #define MREGBIT_STATUS_FIRST BIT(4) 228*bfec6d7fSVivian Wang #define MREGBIT_PASS_BAD_FRAMES BIT(5) 229*bfec6d7fSVivian Wang #define MREGBIT_ACOOUNT_VLAN BIT(6) 230*bfec6d7fSVivian Wang 231*bfec6d7fSVivian Wang /* MAC_MAXIMUM_FRAME_SIZE (0x010c) */ 232*bfec6d7fSVivian Wang #define MREGBIT_MAX_FRAME_SIZE GENMASK(13, 0) 233*bfec6d7fSVivian Wang 234*bfec6d7fSVivian Wang /* MAC_TRANSMIT_JABBER_SIZE (0x0110) */ 235*bfec6d7fSVivian Wang #define MREGBIT_TRANSMIT_JABBER_SIZE GENMASK(15, 0) 236*bfec6d7fSVivian Wang 237*bfec6d7fSVivian Wang /* MAC_RECEIVE_JABBER_SIZE (0x0114) */ 238*bfec6d7fSVivian Wang #define MREGBIT_RECEIVE_JABBER_SIZE GENMASK(15, 0) 239*bfec6d7fSVivian Wang 240*bfec6d7fSVivian Wang /* MAC_ADDRESS_CONTROL (0x0118) */ 241*bfec6d7fSVivian Wang #define MREGBIT_MAC_ADDRESS1_ENABLE BIT(0) 242*bfec6d7fSVivian Wang #define MREGBIT_MAC_ADDRESS2_ENABLE BIT(1) 243*bfec6d7fSVivian Wang #define MREGBIT_MAC_ADDRESS3_ENABLE BIT(2) 244*bfec6d7fSVivian Wang #define MREGBIT_MAC_ADDRESS4_ENABLE BIT(3) 245*bfec6d7fSVivian Wang #define MREGBIT_INVERSE_MAC_ADDRESS1_ENABLE BIT(4) 246*bfec6d7fSVivian Wang #define MREGBIT_INVERSE_MAC_ADDRESS2_ENABLE BIT(5) 247*bfec6d7fSVivian Wang #define MREGBIT_INVERSE_MAC_ADDRESS3_ENABLE BIT(6) 248*bfec6d7fSVivian Wang #define MREGBIT_INVERSE_MAC_ADDRESS4_ENABLE BIT(7) 249*bfec6d7fSVivian Wang #define MREGBIT_PROMISCUOUS_MODE BIT(8) 250*bfec6d7fSVivian Wang 251*bfec6d7fSVivian Wang /* MAC_FC_CONTROL (0x0160) */ 252*bfec6d7fSVivian Wang #define MREGBIT_FC_DECODE_ENABLE BIT(0) 253*bfec6d7fSVivian Wang #define MREGBIT_FC_GENERATION_ENABLE BIT(1) 254*bfec6d7fSVivian Wang #define MREGBIT_AUTO_FC_GENERATION_ENABLE BIT(2) 255*bfec6d7fSVivian Wang #define MREGBIT_MULTICAST_MODE BIT(3) 256*bfec6d7fSVivian Wang #define MREGBIT_BLOCK_PAUSE_FRAMES BIT(4) 257*bfec6d7fSVivian Wang 258*bfec6d7fSVivian Wang /* MAC_FC_PAUSE_FRAME_GENERATE (0x0164) */ 259*bfec6d7fSVivian Wang #define MREGBIT_GENERATE_PAUSE_FRAME BIT(0) 260*bfec6d7fSVivian Wang 261*bfec6d7fSVivian Wang /* MAC_FC_PAUSE_TIME_VALUE (0x0180) */ 262*bfec6d7fSVivian Wang #define MREGBIT_MAC_FC_PAUSE_TIME GENMASK(15, 0) 263*bfec6d7fSVivian Wang 264*bfec6d7fSVivian Wang /* MAC_MDIO_CONTROL (0x01a0) */ 265*bfec6d7fSVivian Wang #define MREGBIT_PHY_ADDRESS GENMASK(4, 0) 266*bfec6d7fSVivian Wang #define MREGBIT_REGISTER_ADDRESS GENMASK(9, 5) 267*bfec6d7fSVivian Wang #define MREGBIT_MDIO_READ_WRITE BIT(10) 268*bfec6d7fSVivian Wang #define MREGBIT_START_MDIO_TRANS BIT(15) 269*bfec6d7fSVivian Wang 270*bfec6d7fSVivian Wang /* MAC_MDIO_DATA (0x01a4) */ 271*bfec6d7fSVivian Wang #define MREGBIT_MDIO_DATA GENMASK(15, 0) 272*bfec6d7fSVivian Wang 273*bfec6d7fSVivian Wang /* MAC_RX_STATCTR_CONTROL (0x01a8) */ 274*bfec6d7fSVivian Wang #define MREGBIT_RX_COUNTER_NUMBER GENMASK(4, 0) 275*bfec6d7fSVivian Wang #define MREGBIT_START_RX_COUNTER_READ BIT(15) 276*bfec6d7fSVivian Wang 277*bfec6d7fSVivian Wang /* MAC_RX_STATCTR_DATA_HIGH (0x01ac) */ 278*bfec6d7fSVivian Wang #define MREGBIT_RX_STATCTR_DATA_HIGH GENMASK(15, 0) 279*bfec6d7fSVivian Wang /* MAC_RX_STATCTR_DATA_LOW (0x01b0) */ 280*bfec6d7fSVivian Wang #define MREGBIT_RX_STATCTR_DATA_LOW GENMASK(15, 0) 281*bfec6d7fSVivian Wang 282*bfec6d7fSVivian Wang /* MAC_TX_STATCTR_CONTROL (0x01b4) */ 283*bfec6d7fSVivian Wang #define MREGBIT_TX_COUNTER_NUMBER GENMASK(4, 0) 284*bfec6d7fSVivian Wang #define MREGBIT_START_TX_COUNTER_READ BIT(15) 285*bfec6d7fSVivian Wang 286*bfec6d7fSVivian Wang /* MAC_TX_STATCTR_DATA_HIGH (0x01b8) */ 287*bfec6d7fSVivian Wang #define MREGBIT_TX_STATCTR_DATA_HIGH GENMASK(15, 0) 288*bfec6d7fSVivian Wang /* MAC_TX_STATCTR_DATA_LOW (0x01bc) */ 289*bfec6d7fSVivian Wang #define MREGBIT_TX_STATCTR_DATA_LOW GENMASK(15, 0) 290*bfec6d7fSVivian Wang 291*bfec6d7fSVivian Wang /* MAC_TRANSMIT_FIFO_ALMOST_FULL (0x01c0) */ 292*bfec6d7fSVivian Wang #define MREGBIT_TX_FIFO_AF GENMASK(13, 0) 293*bfec6d7fSVivian Wang 294*bfec6d7fSVivian Wang /* MAC_TRANSMIT_PACKET_START_THRESHOLD (0x01c4) */ 295*bfec6d7fSVivian Wang #define MREGBIT_TX_PACKET_START_THRESHOLD GENMASK(13, 0) 296*bfec6d7fSVivian Wang 297*bfec6d7fSVivian Wang /* MAC_RECEIVE_PACKET_START_THRESHOLD (0x01c8) */ 298*bfec6d7fSVivian Wang #define MREGBIT_RX_PACKET_START_THRESHOLD GENMASK(13, 0) 299*bfec6d7fSVivian Wang 300*bfec6d7fSVivian Wang /* MAC_STATUS_IRQ (0x01e0) */ 301*bfec6d7fSVivian Wang #define MREGBIT_MAC_UNDERRUN_IRQ BIT(0) 302*bfec6d7fSVivian Wang #define MREGBIT_MAC_JABBER_IRQ BIT(1) 303*bfec6d7fSVivian Wang 304*bfec6d7fSVivian Wang /* MAC_INTERRUPT_ENABLE (0x01e4) */ 305*bfec6d7fSVivian Wang #define MREGBIT_MAC_UNDERRUN_INTERRUPT_ENABLE BIT(0) 306*bfec6d7fSVivian Wang #define MREGBIT_JABBER_INTERRUPT_ENABLE BIT(1) 307*bfec6d7fSVivian Wang 308*bfec6d7fSVivian Wang /* RX DMA descriptor */ 309*bfec6d7fSVivian Wang 310*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_PACKET_LENGTH_MASK GENMASK(13, 0) 311*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_ALIGN_ERR BIT(14) 312*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_RUNT BIT(15) 313*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_ETHERNET_TYPE BIT(16) 314*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_VLAN BIT(17) 315*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_MULTICAST BIT(18) 316*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_BROADCAST BIT(19) 317*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_CRC_ERR BIT(20) 318*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_MAX_LEN_ERR BIT(21) 319*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_JABBER_ERR BIT(22) 320*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_LENGTH_ERR BIT(23) 321*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_MAC_ADDR1_MATCH BIT(24) 322*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_MAC_ADDR2_MATCH BIT(25) 323*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_MAC_ADDR3_MATCH BIT(26) 324*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_MAC_ADDR4_MATCH BIT(27) 325*bfec6d7fSVivian Wang #define RX_DESC_0_FRAME_PAUSE_CTRL BIT(28) 326*bfec6d7fSVivian Wang #define RX_DESC_0_LAST_DESCRIPTOR BIT(29) 327*bfec6d7fSVivian Wang #define RX_DESC_0_FIRST_DESCRIPTOR BIT(30) 328*bfec6d7fSVivian Wang #define RX_DESC_0_OWN BIT(31) 329*bfec6d7fSVivian Wang 330*bfec6d7fSVivian Wang #define RX_DESC_1_BUFFER_SIZE_1_MASK GENMASK(11, 0) 331*bfec6d7fSVivian Wang #define RX_DESC_1_BUFFER_SIZE_2_MASK GENMASK(23, 12) 332*bfec6d7fSVivian Wang /* [24] reserved */ 333*bfec6d7fSVivian Wang #define RX_DESC_1_SECOND_ADDRESS_CHAINED BIT(25) 334*bfec6d7fSVivian Wang #define RX_DESC_1_END_RING BIT(26) 335*bfec6d7fSVivian Wang /* [29:27] reserved */ 336*bfec6d7fSVivian Wang #define RX_DESC_1_RX_TIMESTAMP BIT(30) 337*bfec6d7fSVivian Wang #define RX_DESC_1_PTP_PKT BIT(31) 338*bfec6d7fSVivian Wang 339*bfec6d7fSVivian Wang /* TX DMA descriptor */ 340*bfec6d7fSVivian Wang 341*bfec6d7fSVivian Wang /* [29:0] unused */ 342*bfec6d7fSVivian Wang #define TX_DESC_0_TX_TIMESTAMP BIT(30) 343*bfec6d7fSVivian Wang #define TX_DESC_0_OWN BIT(31) 344*bfec6d7fSVivian Wang 345*bfec6d7fSVivian Wang #define TX_DESC_1_BUFFER_SIZE_1_MASK GENMASK(11, 0) 346*bfec6d7fSVivian Wang #define TX_DESC_1_BUFFER_SIZE_2_MASK GENMASK(23, 12) 347*bfec6d7fSVivian Wang #define TX_DESC_1_FORCE_EOP_ERROR BIT(24) 348*bfec6d7fSVivian Wang #define TX_DESC_1_SECOND_ADDRESS_CHAINED BIT(25) 349*bfec6d7fSVivian Wang #define TX_DESC_1_END_RING BIT(26) 350*bfec6d7fSVivian Wang #define TX_DESC_1_DISABLE_PADDING BIT(27) 351*bfec6d7fSVivian Wang #define TX_DESC_1_ADD_CRC_DISABLE BIT(28) 352*bfec6d7fSVivian Wang #define TX_DESC_1_FIRST_SEGMENT BIT(29) 353*bfec6d7fSVivian Wang #define TX_DESC_1_LAST_SEGMENT BIT(30) 354*bfec6d7fSVivian Wang #define TX_DESC_1_INTERRUPT_ON_COMPLETION BIT(31) 355*bfec6d7fSVivian Wang 356*bfec6d7fSVivian Wang struct emac_desc { 357*bfec6d7fSVivian Wang u32 desc0; 358*bfec6d7fSVivian Wang u32 desc1; 359*bfec6d7fSVivian Wang u32 buffer_addr_1; 360*bfec6d7fSVivian Wang u32 buffer_addr_2; 361*bfec6d7fSVivian Wang }; 362*bfec6d7fSVivian Wang 363*bfec6d7fSVivian Wang /* Keep stats in this order, index used for accessing hardware */ 364*bfec6d7fSVivian Wang 365*bfec6d7fSVivian Wang union emac_hw_tx_stats { 366*bfec6d7fSVivian Wang struct { 367*bfec6d7fSVivian Wang u64 tx_ok_pkts; 368*bfec6d7fSVivian Wang u64 tx_total_pkts; 369*bfec6d7fSVivian Wang u64 tx_ok_bytes; 370*bfec6d7fSVivian Wang u64 tx_err_pkts; 371*bfec6d7fSVivian Wang u64 tx_singleclsn_pkts; 372*bfec6d7fSVivian Wang u64 tx_multiclsn_pkts; 373*bfec6d7fSVivian Wang u64 tx_lateclsn_pkts; 374*bfec6d7fSVivian Wang u64 tx_excessclsn_pkts; 375*bfec6d7fSVivian Wang u64 tx_unicast_pkts; 376*bfec6d7fSVivian Wang u64 tx_multicast_pkts; 377*bfec6d7fSVivian Wang u64 tx_broadcast_pkts; 378*bfec6d7fSVivian Wang u64 tx_pause_pkts; 379*bfec6d7fSVivian Wang } stats; 380*bfec6d7fSVivian Wang 381*bfec6d7fSVivian Wang DECLARE_FLEX_ARRAY(u64, array); 382*bfec6d7fSVivian Wang }; 383*bfec6d7fSVivian Wang 384*bfec6d7fSVivian Wang union emac_hw_rx_stats { 385*bfec6d7fSVivian Wang struct { 386*bfec6d7fSVivian Wang u64 rx_ok_pkts; 387*bfec6d7fSVivian Wang u64 rx_total_pkts; 388*bfec6d7fSVivian Wang u64 rx_crc_err_pkts; 389*bfec6d7fSVivian Wang u64 rx_align_err_pkts; 390*bfec6d7fSVivian Wang u64 rx_err_total_pkts; 391*bfec6d7fSVivian Wang u64 rx_ok_bytes; 392*bfec6d7fSVivian Wang u64 rx_total_bytes; 393*bfec6d7fSVivian Wang u64 rx_unicast_pkts; 394*bfec6d7fSVivian Wang u64 rx_multicast_pkts; 395*bfec6d7fSVivian Wang u64 rx_broadcast_pkts; 396*bfec6d7fSVivian Wang u64 rx_pause_pkts; 397*bfec6d7fSVivian Wang u64 rx_len_err_pkts; 398*bfec6d7fSVivian Wang u64 rx_len_undersize_pkts; 399*bfec6d7fSVivian Wang u64 rx_len_oversize_pkts; 400*bfec6d7fSVivian Wang u64 rx_len_fragment_pkts; 401*bfec6d7fSVivian Wang u64 rx_len_jabber_pkts; 402*bfec6d7fSVivian Wang u64 rx_64_pkts; 403*bfec6d7fSVivian Wang u64 rx_65_127_pkts; 404*bfec6d7fSVivian Wang u64 rx_128_255_pkts; 405*bfec6d7fSVivian Wang u64 rx_256_511_pkts; 406*bfec6d7fSVivian Wang u64 rx_512_1023_pkts; 407*bfec6d7fSVivian Wang u64 rx_1024_1518_pkts; 408*bfec6d7fSVivian Wang u64 rx_1519_plus_pkts; 409*bfec6d7fSVivian Wang u64 rx_drp_fifo_full_pkts; 410*bfec6d7fSVivian Wang u64 rx_truncate_fifo_full_pkts; 411*bfec6d7fSVivian Wang } stats; 412*bfec6d7fSVivian Wang 413*bfec6d7fSVivian Wang DECLARE_FLEX_ARRAY(u64, array); 414*bfec6d7fSVivian Wang }; 415*bfec6d7fSVivian Wang 416*bfec6d7fSVivian Wang #endif /* _K1_EMAC_H_ */ 417