xref: /linux/drivers/net/ethernet/spacemit/k1_emac.h (revision 4f38da1f027ea2c9f01bb71daa7a299c191b6940)
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