xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/aurora/nb8800.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _NB8800_H_
3*4882a593Smuzhiyun #define _NB8800_H_
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/types.h>
6*4882a593Smuzhiyun #include <linux/skbuff.h>
7*4882a593Smuzhiyun #include <linux/phy.h>
8*4882a593Smuzhiyun #include <linux/clk.h>
9*4882a593Smuzhiyun #include <linux/bitops.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #define RX_DESC_COUNT			256
12*4882a593Smuzhiyun #define TX_DESC_COUNT			256
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define NB8800_DESC_LOW			4
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #define RX_BUF_SIZE			1552
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define RX_COPYBREAK			256
19*4882a593Smuzhiyun #define RX_COPYHDR			128
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define MAX_MDC_CLOCK			2500000
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* Stargate Solutions SSN8800 core registers */
24*4882a593Smuzhiyun #define NB8800_TX_CTL1			0x000
25*4882a593Smuzhiyun #define TX_TPD				BIT(5)
26*4882a593Smuzhiyun #define TX_APPEND_FCS			BIT(4)
27*4882a593Smuzhiyun #define TX_PAD_EN			BIT(3)
28*4882a593Smuzhiyun #define TX_RETRY_EN			BIT(2)
29*4882a593Smuzhiyun #define TX_EN				BIT(0)
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define NB8800_TX_CTL2			0x001
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define NB8800_RX_CTL			0x004
34*4882a593Smuzhiyun #define RX_BC_DISABLE			BIT(7)
35*4882a593Smuzhiyun #define RX_RUNT				BIT(6)
36*4882a593Smuzhiyun #define RX_AF_EN			BIT(5)
37*4882a593Smuzhiyun #define RX_PAUSE_EN			BIT(3)
38*4882a593Smuzhiyun #define RX_SEND_CRC			BIT(2)
39*4882a593Smuzhiyun #define RX_PAD_STRIP			BIT(1)
40*4882a593Smuzhiyun #define RX_EN				BIT(0)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define NB8800_RANDOM_SEED		0x008
43*4882a593Smuzhiyun #define NB8800_TX_SDP			0x14
44*4882a593Smuzhiyun #define NB8800_TX_TPDP1			0x18
45*4882a593Smuzhiyun #define NB8800_TX_TPDP2			0x19
46*4882a593Smuzhiyun #define NB8800_SLOT_TIME		0x1c
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define NB8800_MDIO_CMD			0x020
49*4882a593Smuzhiyun #define MDIO_CMD_GO			BIT(31)
50*4882a593Smuzhiyun #define MDIO_CMD_WR			BIT(26)
51*4882a593Smuzhiyun #define MDIO_CMD_ADDR(x)		((x) << 21)
52*4882a593Smuzhiyun #define MDIO_CMD_REG(x)			((x) << 16)
53*4882a593Smuzhiyun #define MDIO_CMD_DATA(x)		((x) <<	 0)
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun #define NB8800_MDIO_STS			0x024
56*4882a593Smuzhiyun #define MDIO_STS_ERR			BIT(31)
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #define NB8800_MC_ADDR(i)		(0x028 + (i))
59*4882a593Smuzhiyun #define NB8800_MC_INIT			0x02e
60*4882a593Smuzhiyun #define NB8800_UC_ADDR(i)		(0x03c + (i))
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define NB8800_MAC_MODE			0x044
63*4882a593Smuzhiyun #define RGMII_MODE			BIT(7)
64*4882a593Smuzhiyun #define HALF_DUPLEX			BIT(4)
65*4882a593Smuzhiyun #define BURST_EN			BIT(3)
66*4882a593Smuzhiyun #define LOOPBACK_EN			BIT(2)
67*4882a593Smuzhiyun #define GMAC_MODE			BIT(0)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define NB8800_IC_THRESHOLD		0x050
70*4882a593Smuzhiyun #define NB8800_PE_THRESHOLD		0x051
71*4882a593Smuzhiyun #define NB8800_PF_THRESHOLD		0x052
72*4882a593Smuzhiyun #define NB8800_TX_BUFSIZE		0x054
73*4882a593Smuzhiyun #define NB8800_FIFO_CTL			0x056
74*4882a593Smuzhiyun #define NB8800_PQ1			0x060
75*4882a593Smuzhiyun #define NB8800_PQ2			0x061
76*4882a593Smuzhiyun #define NB8800_SRC_ADDR(i)		(0x06a + (i))
77*4882a593Smuzhiyun #define NB8800_STAT_DATA		0x078
78*4882a593Smuzhiyun #define NB8800_STAT_INDEX		0x07c
79*4882a593Smuzhiyun #define NB8800_STAT_CLEAR		0x07d
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define NB8800_SLEEP_MODE		0x07e
82*4882a593Smuzhiyun #define SLEEP_MODE			BIT(0)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define NB8800_WAKEUP			0x07f
85*4882a593Smuzhiyun #define WAKEUP				BIT(0)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /* Aurora NB8800 host interface registers */
88*4882a593Smuzhiyun #define NB8800_TXC_CR			0x100
89*4882a593Smuzhiyun #define TCR_LK				BIT(12)
90*4882a593Smuzhiyun #define TCR_DS				BIT(11)
91*4882a593Smuzhiyun #define TCR_BTS(x)			(((x) & 0x7) << 8)
92*4882a593Smuzhiyun #define TCR_DIE				BIT(7)
93*4882a593Smuzhiyun #define TCR_TFI(x)			(((x) & 0x7) << 4)
94*4882a593Smuzhiyun #define TCR_LE				BIT(3)
95*4882a593Smuzhiyun #define TCR_RS				BIT(2)
96*4882a593Smuzhiyun #define TCR_DM				BIT(1)
97*4882a593Smuzhiyun #define TCR_EN				BIT(0)
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun #define NB8800_TXC_SR			0x104
100*4882a593Smuzhiyun #define TSR_DE				BIT(3)
101*4882a593Smuzhiyun #define TSR_DI				BIT(2)
102*4882a593Smuzhiyun #define TSR_TO				BIT(1)
103*4882a593Smuzhiyun #define TSR_TI				BIT(0)
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define NB8800_TX_SAR			0x108
106*4882a593Smuzhiyun #define NB8800_TX_DESC_ADDR		0x10c
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define NB8800_TX_REPORT_ADDR		0x110
109*4882a593Smuzhiyun #define TX_BYTES_TRANSFERRED(x)		(((x) >> 16) & 0xffff)
110*4882a593Smuzhiyun #define TX_FIRST_DEFERRAL		BIT(7)
111*4882a593Smuzhiyun #define TX_EARLY_COLLISIONS(x)		(((x) >> 3) & 0xf)
112*4882a593Smuzhiyun #define TX_LATE_COLLISION		BIT(2)
113*4882a593Smuzhiyun #define TX_PACKET_DROPPED		BIT(1)
114*4882a593Smuzhiyun #define TX_FIFO_UNDERRUN		BIT(0)
115*4882a593Smuzhiyun #define IS_TX_ERROR(r)			((r) & 0x07)
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define NB8800_TX_FIFO_SR		0x114
118*4882a593Smuzhiyun #define NB8800_TX_ITR			0x118
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun #define NB8800_RXC_CR			0x200
121*4882a593Smuzhiyun #define RCR_FL				BIT(13)
122*4882a593Smuzhiyun #define RCR_LK				BIT(12)
123*4882a593Smuzhiyun #define RCR_DS				BIT(11)
124*4882a593Smuzhiyun #define RCR_BTS(x)			(((x) & 7) << 8)
125*4882a593Smuzhiyun #define RCR_DIE				BIT(7)
126*4882a593Smuzhiyun #define RCR_RFI(x)			(((x) & 7) << 4)
127*4882a593Smuzhiyun #define RCR_LE				BIT(3)
128*4882a593Smuzhiyun #define RCR_RS				BIT(2)
129*4882a593Smuzhiyun #define RCR_DM				BIT(1)
130*4882a593Smuzhiyun #define RCR_EN				BIT(0)
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #define NB8800_RXC_SR			0x204
133*4882a593Smuzhiyun #define RSR_DE				BIT(3)
134*4882a593Smuzhiyun #define RSR_DI				BIT(2)
135*4882a593Smuzhiyun #define RSR_RO				BIT(1)
136*4882a593Smuzhiyun #define RSR_RI				BIT(0)
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun #define NB8800_RX_SAR			0x208
139*4882a593Smuzhiyun #define NB8800_RX_DESC_ADDR		0x20c
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun #define NB8800_RX_REPORT_ADDR		0x210
142*4882a593Smuzhiyun #define RX_BYTES_TRANSFERRED(x)		(((x) >> 16) & 0xFFFF)
143*4882a593Smuzhiyun #define RX_MULTICAST_PKT		BIT(9)
144*4882a593Smuzhiyun #define RX_BROADCAST_PKT		BIT(8)
145*4882a593Smuzhiyun #define RX_LENGTH_ERR			BIT(7)
146*4882a593Smuzhiyun #define RX_FCS_ERR			BIT(6)
147*4882a593Smuzhiyun #define RX_RUNT_PKT			BIT(5)
148*4882a593Smuzhiyun #define RX_FIFO_OVERRUN			BIT(4)
149*4882a593Smuzhiyun #define RX_LATE_COLLISION		BIT(3)
150*4882a593Smuzhiyun #define RX_ALIGNMENT_ERROR		BIT(2)
151*4882a593Smuzhiyun #define RX_ERROR_MASK			0xfc
152*4882a593Smuzhiyun #define IS_RX_ERROR(r)			((r) & RX_ERROR_MASK)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define NB8800_RX_FIFO_SR		0x214
155*4882a593Smuzhiyun #define NB8800_RX_ITR			0x218
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /* Sigma Designs SMP86xx additional registers */
158*4882a593Smuzhiyun #define NB8800_TANGOX_PAD_MODE		0x400
159*4882a593Smuzhiyun #define PAD_MODE_MASK			0x7
160*4882a593Smuzhiyun #define PAD_MODE_MII			0x0
161*4882a593Smuzhiyun #define PAD_MODE_RGMII			0x1
162*4882a593Smuzhiyun #define PAD_MODE_GTX_CLK_INV		BIT(3)
163*4882a593Smuzhiyun #define PAD_MODE_GTX_CLK_DELAY		BIT(4)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define NB8800_TANGOX_MDIO_CLKDIV	0x420
166*4882a593Smuzhiyun #define NB8800_TANGOX_RESET		0x424
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /* Hardware DMA descriptor */
169*4882a593Smuzhiyun struct nb8800_dma_desc {
170*4882a593Smuzhiyun 	u32				s_addr;	/* start address */
171*4882a593Smuzhiyun 	u32				n_addr;	/* next descriptor address */
172*4882a593Smuzhiyun 	u32				r_addr;	/* report address */
173*4882a593Smuzhiyun 	u32				config;
174*4882a593Smuzhiyun } __aligned(8);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #define DESC_ID				BIT(23)
177*4882a593Smuzhiyun #define DESC_EOC			BIT(22)
178*4882a593Smuzhiyun #define DESC_EOF			BIT(21)
179*4882a593Smuzhiyun #define DESC_LK				BIT(20)
180*4882a593Smuzhiyun #define DESC_DS				BIT(19)
181*4882a593Smuzhiyun #define DESC_BTS(x)			(((x) & 0x7) << 16)
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /* DMA descriptor and associated data for rx.
184*4882a593Smuzhiyun  * Allocated from coherent memory.
185*4882a593Smuzhiyun  */
186*4882a593Smuzhiyun struct nb8800_rx_desc {
187*4882a593Smuzhiyun 	/* DMA descriptor */
188*4882a593Smuzhiyun 	struct nb8800_dma_desc		desc;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	/* Status report filled in by hardware */
191*4882a593Smuzhiyun 	u32				report;
192*4882a593Smuzhiyun };
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun /* Address of buffer on rx ring */
195*4882a593Smuzhiyun struct nb8800_rx_buf {
196*4882a593Smuzhiyun 	struct page			*page;
197*4882a593Smuzhiyun 	unsigned long			offset;
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun /* DMA descriptors and associated data for tx.
201*4882a593Smuzhiyun  * Allocated from coherent memory.
202*4882a593Smuzhiyun  */
203*4882a593Smuzhiyun struct nb8800_tx_desc {
204*4882a593Smuzhiyun 	/* DMA descriptor.  The second descriptor is used if packet
205*4882a593Smuzhiyun 	 * data is unaligned.
206*4882a593Smuzhiyun 	 */
207*4882a593Smuzhiyun 	struct nb8800_dma_desc		desc[2];
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	/* Status report filled in by hardware */
210*4882a593Smuzhiyun 	u32				report;
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	/* Bounce buffer for initial unaligned part of packet */
213*4882a593Smuzhiyun 	u8				buf[8] __aligned(8);
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun /* Packet in tx queue */
217*4882a593Smuzhiyun struct nb8800_tx_buf {
218*4882a593Smuzhiyun 	/* Currently queued skb */
219*4882a593Smuzhiyun 	struct sk_buff			*skb;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	/* DMA address of the first descriptor */
222*4882a593Smuzhiyun 	dma_addr_t			dma_desc;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/* DMA address of packet data */
225*4882a593Smuzhiyun 	dma_addr_t			dma_addr;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	/* Length of DMA mapping, less than skb->len if alignment
228*4882a593Smuzhiyun 	 * buffer is used.
229*4882a593Smuzhiyun 	 */
230*4882a593Smuzhiyun 	unsigned int			dma_len;
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun 	/* Number of packets in chain starting here */
233*4882a593Smuzhiyun 	unsigned int			chain_len;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun 	/* Packet chain ready to be submitted to hardware */
236*4882a593Smuzhiyun 	bool				ready;
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun struct nb8800_priv {
240*4882a593Smuzhiyun 	struct napi_struct		napi;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	void __iomem			*base;
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	/* RX DMA descriptors */
245*4882a593Smuzhiyun 	struct nb8800_rx_desc		*rx_descs;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	/* RX buffers referenced by DMA descriptors */
248*4882a593Smuzhiyun 	struct nb8800_rx_buf		*rx_bufs;
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	/* Current end of chain */
251*4882a593Smuzhiyun 	u32				rx_eoc;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun 	/* Value for rx interrupt time register in NAPI interrupt mode */
254*4882a593Smuzhiyun 	u32				rx_itr_irq;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	/* Value for rx interrupt time register in NAPI poll mode */
257*4882a593Smuzhiyun 	u32				rx_itr_poll;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	/* Value for config field of rx DMA descriptors */
260*4882a593Smuzhiyun 	u32				rx_dma_config;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	/* TX DMA descriptors */
263*4882a593Smuzhiyun 	struct nb8800_tx_desc		*tx_descs;
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun 	/* TX packet queue */
266*4882a593Smuzhiyun 	struct nb8800_tx_buf		*tx_bufs;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	/* Number of free tx queue entries */
269*4882a593Smuzhiyun 	atomic_t			tx_free;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	/* First free tx queue entry */
272*4882a593Smuzhiyun 	u32				tx_next;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun 	/* Next buffer to transmit */
275*4882a593Smuzhiyun 	u32				tx_queue;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	/* Start of current packet chain */
278*4882a593Smuzhiyun 	struct nb8800_tx_buf		*tx_chain;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun 	/* Next buffer to reclaim */
281*4882a593Smuzhiyun 	u32				tx_done;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	/* Lock for DMA activation */
284*4882a593Smuzhiyun 	spinlock_t			tx_lock;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	struct mii_bus			*mii_bus;
287*4882a593Smuzhiyun 	struct device_node		*phy_node;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun 	/* PHY connection type from DT */
290*4882a593Smuzhiyun 	phy_interface_t			phy_mode;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	/* Current link status */
293*4882a593Smuzhiyun 	int				speed;
294*4882a593Smuzhiyun 	int				duplex;
295*4882a593Smuzhiyun 	int				link;
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	/* Pause settings */
298*4882a593Smuzhiyun 	bool				pause_aneg;
299*4882a593Smuzhiyun 	bool				pause_rx;
300*4882a593Smuzhiyun 	bool				pause_tx;
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 	/* DMA base address of rx descriptors, see rx_descs above */
303*4882a593Smuzhiyun 	dma_addr_t			rx_desc_dma;
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	/* DMA base address of tx descriptors, see tx_descs above */
306*4882a593Smuzhiyun 	dma_addr_t			tx_desc_dma;
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	struct clk			*clk;
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun struct nb8800_ops {
312*4882a593Smuzhiyun 	int				(*init)(struct net_device *dev);
313*4882a593Smuzhiyun 	int				(*reset)(struct net_device *dev);
314*4882a593Smuzhiyun };
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun #endif /* _NB8800_H_ */
317