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