summaryrefslogtreecommitdiff
path: root/sys/dev/cadence/cemacreg.h
blob: 1872a863807ab53e667d738557cd3eb4588f8d88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
/*      $NetBSD: cemacreg.h,v 1.3 2015/08/24 18:51:37 rjs Exp $	*/

/*-
 * Copyright (c) 2015  Genetec Corporation.  All rights reserved.
 * Written by Hashimoto Kenichi for Genetec Corporation.
 *
 * Copyright (c) 2007 Embedtronics Oy
 * All rights reserved
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#ifndef	_IF_CEMACREG_H_
#define	_IF_CEMACREG_H_

/* Ethernet MAC (EMAC),
 * at91rm9200.pdf, page 573 */

#define	ETH_CTL		0x00U	/* 0x00: Control Register		*/
#define	ETH_CFG		0x04U	/* 0x04: Configuration Register		*/
#define	ETH_SR		0x08U	/* 0x08: Status Register		*/
#define	ETH_TAR		0x0CU	/* 0x0C: Transmit Address Register (at91rm9200 only)	*/
#define	ETH_TCR		0x10U	/* 0x10: Transmit Control Register (at91rm9200 only)	*/
#define	ETH_TSR		0x14U	/* 0x14: Transmit Status Register	*/
#define	ETH_RBQP	0x18U	/* 0x18: Receive Buffer Queue Pointer	*/
#define ETH_TBQP	0x1CU	/* 0x1C: Transmit Buffer Queue Pointer	*/
#define	ETH_RSR		0x20U	/* 0x20: Receive Status Register	*/
#define	ETH_ISR		0x24U	/* 0x24: Interrupt Status Register	*/
#define	ETH_IER		0x28U	/* 0x28: Interrupt Enable Register	*/
#define	ETH_IDR		0x2CU	/* 0x2C: Interrupt Disable Register	*/
#define	ETH_IMR		0x30U	/* 0x30: Interrupt Mask Register	*/
#define	ETH_MAN		0x34U	/* 0x34: PHY Maintenance Register	*/

#define	ETH_FRA		0x40U	/* 0x40: Frames Transmitted OK		*/
#define	ETH_SCOL	0x44U	/* 0x44: Single Collision Frames	*/
#define	ETH_MCOL	0x48U	/* 0x48: Multiple Collision Frames	*/
#define	ETH_OK		0x4CU	/* 0x4C: Frames Received OK		*/
#define	ETH_SEQE	0x50U	/* 0x50: Frame Check Sequence Errors	*/
#define	ETH_ALE		0x54U	/* 0x54: Alignment Errors		*/
#define	ETH_DTE		0x58U	/* 0x58: Deferred Transmission Frame	*/
#define	ETH_LCOL	0x5CU	/* 0x5C: Late Collisions		*/
#define	ETH_ECOL	0x60U	/* 0x60: Excessive Collisions		*/
#define	ETH_CSE		0x64U	/* 0x64: Carrier Sense Errors		*/
#define	ETH_TUE		0x68U	/* 0x68: Transmit Underrun Errors	*/
#define	ETH_CDE		0x6CU	/* 0x6C: Code Errors			*/
#define	ETH_ELR		0x70U	/* 0x70: Excessive Length Errors	*/
#define	ETH_RJB		0x74U	/* 0x74: Receive Jabbers		*/
#define	ETH_USF		0x78U	/* 0x78: Undersize Frames		*/
#define	ETH_SQEE	0x7CU	/* 0x7C: SQE Test Errors		*/
#define	ETH_DRFC	0x80U	/* 0x80: Discarded RX Frames		*/

#define	ETH_HSH		0x90U	/* 0x90: Hash Address High		*/
#define	ETH_HSL		0x94U	/* 0x94: Hash Address Low		*/

#define	ETH_SA1L	0x98U	/* 0x98: Specific Address 1 Low		*/
#define	ETH_SA1H	0x9CU	/* 0x9C: Specific Address 1 High	*/

#define	ETH_SA2L	0xA0U	/* 0xA0: Specific Address 2 Low		*/
#define	ETH_SA2H	0xA4U	/* 0xA4: Specific Address 2 High	*/

#define	ETH_SA3L	0xA8U	/* 0xA8: Specific Address 3 Low		*/
#define	ETH_SA3H	0xACU	/* 0xAC: Specific Address 3 High	*/

#define	ETH_SA4L	0xB0U	/* 0xB0: Specific Address 4 Low		*/
#define	ETH_SA4H	0xB4U	/* 0xB4: Specific Address 4 High	*/

/*
 * Gigabit Ethernet Controller (GEM)
 * ug585-Zynq-7000-TRM.pdf
 */

#define GEM_USER_IO	0x000C
#define GEM_DMA_CFG	0x0010	/* DMA Configuration */
#define  GEM_DMA_CFG_DISC_WHEN_NO_AHB		__BIT(24)
#define  GEM_DMA_CFG_RX_BUF_SIZE		__BITS(23, 16)
#define  GEM_DMA_CFG_CHKSUM_GEN_OFFLOAD_EN	__BIT(11)
#define  GEM_DMA_CFG_TX_PKTBUF_MEMSZ_SEL	__BIT(10)
#define  GEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL	__BITS(9, 8)
#define  GEM_DMA_CFG_AHB_ENDIAN_SWAP_PKT_EN	__BIT(7)
#define  GEM_DMA_CFG_AHB_ENDIAN_SWAP_MGMT_EN	__BIT(6)
#define  GEM_DMA_CFG_AHB_FIXED_BURST_LEN	__BITS(4, 0)
#define GEM_HSH		0x0080
#define GEM_HSL		0x0084
#define	GEM_SA1L	0x0088
#define	GEM_SA1H	0x008C
#define	GEM_SA2L	0x0090
#define	GEM_SA2H	0x0094
#define	GEM_SA3L	0x0098
#define	GEM_SA3H	0x009C
#define	GEM_SA4L	0x0090
#define	GEM_SA4H	0x0094
#define	GEM_SCOL	0x0138
#define	GEM_MCOL	0x013C
#define	GEM_DCFG2	0x0284
#define	GEM_DCFG3	0x0288
#define	GEM_DCFG4	0x028C
#define	GEM_DCFG5	0x0290

#define ETH_SIZE	0x1000

/* Control Register bits: */
#define GEM_CTL_ZEROPAUSETX	__BIT(12)
#define GEM_CTL_PAUSETX		__BIT(11)
#define GEM_CTL_HALTTX		__BIT(10)
#define GEM_CTL_STARTTX		__BIT(9)

#define	ETH_CTL_BP	0x100U	/* 1 = back pressure enabled		*/
#define	ETH_CTL_WES	0x080U	/* 1 = statistics registers writeable	*/
#define	ETH_CTL_ISR	0x040U	/* 1 = increment statistics registers	*/
#define	ETH_CTL_CSR	0x020U	/* 1 = clear statistics registers	*/
#define	ETH_CTL_MPE	0x010U	/* 1 = management port enabled		*/
#define	ETH_CTL_TE	0x008U	/* 1 = transmit enable			*/
#define	ETH_CTL_RE	0x004U	/* 1 = receive enable			*/
#define	ETH_CTL_LBL	0x002U	/* 1 = local loopback enabled		*/
#define	ETH_CTL_LB	0x001U	/* 1 = loopback signal is at high level	*/


/* Configuration Register bits: */
#define	ETH_CFG_RMII	0x2000U	/* 1 = enable RMII (Reduce MII)	(AT91RM9200 only) */
#define	ETH_CFG_RTY	0x1000U	/* 1 = retry test enabled		*/

#define	ETH_CFG_CLK	0x0C00U	/* clock				*/
#define	ETH_CFG_CLK_8	0x0000U
#define	ETH_CFG_CLK_16	0x0400U
#define	ETH_CFG_CLK_32	0x0800U
#define	ETH_CFG_CLK_64	0x0C00U

#define	ETH_CFG_EAE	0x0200U	/* 1 = external address match enable	*/
#define	ETH_CFG_BIG	0x0100U	/* 1 = receive up to 1522 bytes	(VLAN)	*/
#define	ETH_CFG_UNI	0x0080U	/* 1 = enable unicast hash		*/
#define	ETH_CFG_MTI	0x0040U	/* 1 = enable multicast hash		*/
#define	ETH_CFG_NBC	0x0020U	/* 1 = ignore received broadcasts	*/
#define	ETH_CFG_CAF	0x0010U	/* 1 = receive all valid frames		*/
#define	ETH_CFG_BR	0x0004U
#define	ETH_CFG_FD	0x0002U	/* 1 = force full duplex		*/
#define	ETH_CFG_SPD	0x0001U	/* 1 = 100 Mbps				*/

#define GEM_CFG_GEN	__BIT(10)
#define GEM_CFG_CLK	__BITS(20, 18)
#define GEM_CFG_CLK_8	__SHIFTIN(0, GEM_CFG_CLK)
#define GEM_CFG_CLK_16	__SHIFTIN(1, GEM_CFG_CLK)
#define GEM_CFG_CLK_32	__SHIFTIN(2, GEM_CFG_CLK)
#define GEM_CFG_CLK_48	__SHIFTIN(3, GEM_CFG_CLK)
#define GEM_CFG_CLK_64	__SHIFTIN(4, GEM_CFG_CLK)
#define GEM_CFG_CLK_96	__SHIFTIN(5, GEM_CFG_CLK)
#define GEM_CFG_DBW	__BITS(22, 21)
#define	GEM_CFG_RX_CHKSUM_OFFLD_EN	__BIT(24)

/* Status Register bits: */
#define	ETH_SR_IDLE	0x0004U	/* 1 = PHY logic is running		*/
#define	ETH_SR_MDIO	0x0002U	/* 1 = MDIO pin set			*/
#define	ETH_SR_LINK	0x0001U


/* Transmit Control Register bits: */
#define	ETH_TCR_NCRC	0x8000U	/* 1 = don't append CRC			*/
#define	ETH_TCR_LEN	0x07FFU	/* transmit frame length		*/


/* Transmit Status Register bits: */
#define	ETH_TSR_UND	0x40U	/* 1 = transmit underrun detected	*/
#define	ETH_TSR_COMP	0x20U	/* 1 = transmit complete		*/
#define	ETH_TSR_BNQ	0x10U	/* 1 = transmit buffer not queued (at91rm9200 only)	*/
#define	ETH_TSR_IDLE	0x08U	/* 1 = transmitter idle			*/
#define	ETH_TSR_RLE	0x04U	/* 1 = retry limit exceeded		*/
#define	ETH_TSR_COL	0x02U	/* 1 = collision occurred		*/
#define	ETH_TSR_OVR	0x01U	/* 1 = transmit buffer overrun		*/

#define	GEM_TSR_TXGO	__BIT(3)

/* Receive Status Register bits: */
#define	ETH_RSR_OVR	0x04U	/* 1 = RX overrun			*/
#define	ETH_RSR_REC	0x02U	/* 1 = frame received			*/
#define	ETH_RSR_BNA	0x01U	/* 1 = buffer not available		*/


/* Interrupt bits: */
#define	ETH_ISR_ABT	0x0800U	/* 1 = abort during DMA transfer	*/
#define	ETH_ISR_ROVR	0x0400U	/* 1 = RX overrun			*/
#define	ETH_ISR_LINK	0x0200U	/* 1 = link pin changed			*/
#define	ETH_ISR_TIDLE	0x0100U	/* 1 = transmitter idle			*/
#define	ETH_ISR_TCOM	0x0080U	/* 1 = transmit complete		*/
#define	ETH_ISR_TBRE	0x0040U	/* 1 = transmit buffer register empty	*/
#define	ETH_ISR_RTRY	0x0020U	/* 1 = retry limit exceeded		*/
#define	ETH_ISR_TUND	0x0010U	/* 1 = transmit buffer underrun		*/
#define	ETH_ISR_TOVR	0x0008U	/* 1 = transmit buffer overrun		*/
#define	ETH_ISR_RBNA	0x0004U	/* 1 = receive buffer not available	*/
#define	ETH_ISR_RCOM	0x0002U	/* 1 = receive complete			*/
#define	ETH_ISR_DONE	0x0001U	/* 1 = management done			*/


/* PHY Maintenance Register bits: */
#define	ETH_MAN_LOW	0x80000000U /* must not be set			*/
#define	ETH_MAN_HIGH	0x40000000U /* must be set			*/

#define	ETH_MAN_RW	0x30000000U
#define	ETH_MAN_RW_RD	0x20000000U
#define	ETH_MAN_RW_WR	0x10000000U

#define	ETH_MAN_PHYA	0x0F800000U /* PHY address (normally 0)		*/
#define	ETH_MAN_PHYA_SHIFT 23U
#define	ETH_MAN_REGA	0x007C0000U
#define	ETH_MAN_REGA_SHIFT 18U
#define	ETH_MAN_CODE	0x00030000U /* must be 10			*/
#define	ETH_MAN_CODE_IEEE802_3 \
			0x00020000U
#define	ETH_MAN_DATA	0x0000FFFFU /* data to be written to the PHY	*/

#define	ETH_MAN_VAL	(ETH_MAN_HIGH|ETH_MAN_CODE_IEEE802_3)


/* received buffer descriptor: */
#define	ETH_DSC_ADDR		0x00U
#define	ETH_DSC_FLAGS		0x00U
#define	ETH_DSC_INFO		0x04U
#define	ETH_DSC_SIZE		0x08U

typedef struct eth_dsc {
	volatile uint32_t	Addr;
	volatile uint32_t	Info;
} __attribute__ ((aligned(4))) eth_dsc_t;

/* flags: */
#define	ETH_RDSC_F_WRAP		0x00000002U
#define	ETH_RDSC_F_USED		0x00000001U

/* frame info bits: */
#define	ETH_RDSC_I_BCAST	__BIT(31)
#define	ETH_RDSC_I_MULTICAST	__BIT(30)
#define	ETH_RDSC_I_UNICAST	__BIT(29)
#define	ETH_RDSC_I_VLAN		0x10000000U
#define	ETH_RDSC_I_UNKNOWN_SRC	0x08000000U
#define	ETH_RDSC_I_MATCH1	0x04000000U
#define	ETH_RDSC_I_MATCH2	0x02000000U
#define	ETH_RDSC_I_MATCH3	0x01000000U
#define	ETH_RDSC_I_MATCH4	0x00800000U
#define	ETH_RDSC_I_CHKSUM	__BITS(23, 22)
#define	ETH_RDSC_I_CHKSUM_NONE	__SHIFTIN(0, ETH_RDSC_I_CHKSUM)
#define	ETH_RDSC_I_CHKSUM_IP	__SHIFTIN(1, ETH_RDSC_I_CHKSUM)
#define	ETH_RDSC_I_CHKSUM_TCP	__SHIFTIN(2, ETH_RDSC_I_CHKSUM)
#define	ETH_RDSC_I_CHKSUM_UDP	__SHIFTIN(3, ETH_RDSC_I_CHKSUM)
#define	ETH_RDSC_I_LEN		__BITS(13, 0)

#define ETH_TDSC_I_USED				__BIT(31)	/* done transmitting */
#define ETH_TDSC_I_WRAP				__BIT(30)	/* end of descr ring */
#define ETH_TDSC_I_RETRY_ERR			__BIT(29)
#define ETH_TDSC_I_AHB_ERR			__BIT(27)
#define ETH_TDSC_I_LATE_COLL			__BIT(26)
#define	ETH_TDSC_I_CHKSUM			__BITS(22, 20)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_NO_ERR	__SHIFTIN(0, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_VLAN_HDR_ERR	__SHIFTIN(1, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_SNAP_HDR_ERR	__SHIFTIN(2, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_IP_HDR_ERR	__SHIFTIN(3, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_UNKNOWN_TYPE	__SHIFTIN(4, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_UNSUPP_FRAG	__SHIFTIN(5, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_NOT_TCPUDP	__SHIFTIN(6, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_CHKSUM_GEN_STAT_SHORT_PKT	__SHIFTIN(7, ETH_TDSC_I_CHKSUM)
#define ETH_TDSC_I_NO_CRC_APPENDED		__BIT(16)
#define ETH_TDSC_I_LAST_BUF			__BIT(15)	/* last buf in frame */
#define ETH_TDSC_I_LEN				__BITS(13, 0)

#endif /* !_IF_CEMACREG_H_ */