1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2012-2013 Thomas Skibo
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29/*
30 * Hardware and register defines for Cadence GEM Gigabit Ethernet
31 * controller such as the one used in Zynq-7000 SoC.
32 *
33 * Reference: Zynq-7000 All Programmable SoC Technical Reference Manual.
34 * (v1.4) November 16, 2012.  Xilinx doc UG585.  GEM is covered in Ch. 16
35 * and register definitions are in appendix B.18.
36 *
37 * Additional Reference: Zynq UltraScale+ Device Register Reference
38 * (UG1087 v1.7 Feb 8,2019):
39 * https://www.xilinx.com/html_docs/registers/ug1087/ug1087-zynq-ultrascale-registers.html
40 */
41
42#ifndef _IF_CGEM_HW_H_
43#define _IF_CGEM_HW_H_
44
45/* Cadence GEM hardware register definitions. */
46#define CGEM_NET_CTRL			0x000	/* Network Control */
47#define   CGEM_NET_CTRL_FLUSH_DPRAM_PKT		(1 << 18)
48#define   CGEM_NET_CTRL_TX_PFC_PRI_PAUSE_FRAME	(1 << 17)
49#define   CGEM_NET_CTRL_EN_PFC_PRI_PAUSE_RX	(1 << 16)
50#define   CGEM_NET_CTRL_STORE_RX_TSTAMP		(1 << 15)
51#define   CGEM_NET_CTRL_TX_ZEROQ_PAUSE_FRAME	(1 << 12)
52#define   CGEM_NET_CTRL_TX_PAUSE_FRAME		(1 << 11)
53#define   CGEM_NET_CTRL_TX_HALT			(1 << 10)
54#define   CGEM_NET_CTRL_START_TX		(1 << 9)
55#define   CGEM_NET_CTRL_BACK_PRESSURE		(1 << 8)
56#define   CGEM_NET_CTRL_WREN_STAT_REGS		(1 << 7)
57#define   CGEM_NET_CTRL_INCR_STAT_REGS		(1 << 6)
58#define   CGEM_NET_CTRL_CLR_STAT_REGS		(1 << 5)
59#define   CGEM_NET_CTRL_MGMT_PORT_EN		(1 << 4)
60#define   CGEM_NET_CTRL_TX_EN			(1 << 3)
61#define   CGEM_NET_CTRL_RX_EN			(1 << 2)
62#define   CGEM_NET_CTRL_LOOP_LOCAL		(1 << 1)
63
64#define CGEM_NET_CFG			0x004	/* Network Configuration */
65#define   CGEM_NET_CFG_UNIDIR_EN		(1U << 31)
66#define   CGEM_NET_CFG_IGNORE_IPG_RX_ER		(1 << 30)
67#define   CGEM_NET_CFG_RX_BAD_PREAMBLE		(1 << 29)
68#define   CGEM_NET_CFG_IPG_STRETCH_EN		(1 << 28)
69#define   CGEM_NET_CFG_SGMII_EN			(1 << 27)
70#define   CGEM_NET_CFG_IGNORE_RX_FCS		(1 << 26)
71#define   CGEM_NET_CFG_RX_HD_WHILE_TX		(1 << 25)
72#define   CGEM_NET_CFG_RX_CHKSUM_OFFLD_EN	(1 << 24)
73#define   CGEM_NET_CFG_DIS_CP_PAUSE_FRAME	(1 << 23)
74#define   CGEM_NET_CFG_DBUS_WIDTH_32		(0 << 21)
75#define   CGEM_NET_CFG_DBUS_WIDTH_64		(1 << 21)
76#define   CGEM_NET_CFG_DBUS_WIDTH_128		(2 << 21)
77#define   CGEM_NET_CFG_DBUS_WIDTH_MASK		(3 << 21)
78#define   CGEM_NET_CFG_MDC_CLK_DIV_8		(0 << 18)
79#define   CGEM_NET_CFG_MDC_CLK_DIV_16		(1 << 18)
80#define   CGEM_NET_CFG_MDC_CLK_DIV_32		(2 << 18)
81#define   CGEM_NET_CFG_MDC_CLK_DIV_48		(3 << 18)
82#define   CGEM_NET_CFG_MDC_CLK_DIV_64		(4 << 18)
83#define   CGEM_NET_CFG_MDC_CLK_DIV_96		(5 << 18)
84#define   CGEM_NET_CFG_MDC_CLK_DIV_128		(6 << 18)
85#define   CGEM_NET_CFG_MDC_CLK_DIV_224		(7 << 18)
86#define   CGEM_NET_CFG_MDC_CLK_DIV_MASK		(7 << 18)
87#define   CGEM_NET_CFG_FCS_REMOVE		(1 << 17)
88#define   CGEM_NET_CFG_LEN_ERR_FRAME_DISC	(1 << 16)
89#define   CGEM_NET_CFG_RX_BUF_OFFSET_SHFT	14
90#define   CGEM_NET_CFG_RX_BUF_OFFSET_MASK	(3 << 14)
91#define   CGEM_NET_CFG_RX_BUF_OFFSET(n)		((n) << 14)
92#define   CGEM_NET_CFG_PAUSE_EN			(1 << 13)
93#define   CGEM_NET_CFG_RETRY_TEST		(1 << 12)
94#define   CGEM_NET_CFG_PCS_SEL			(1 << 11)
95#define   CGEM_NET_CFG_GIGE_EN			(1 << 10)
96#define   CGEM_NET_CFG_EXT_ADDR_MATCH_EN	(1 << 9)
97#define   CGEM_NET_CFG_1536RXEN			(1 << 8)
98#define   CGEM_NET_CFG_UNI_HASH_EN		(1 << 7)
99#define   CGEM_NET_CFG_MULTI_HASH_EN		(1 << 6)
100#define   CGEM_NET_CFG_NO_BCAST			(1 << 5)
101#define   CGEM_NET_CFG_COPY_ALL			(1 << 4)
102#define   CGEM_NET_CFG_DISC_NON_VLAN		(1 << 2)
103#define   CGEM_NET_CFG_FULL_DUPLEX		(1 << 1)
104#define   CGEM_NET_CFG_SPEED100			(1 << 0)
105
106#define CGEM_NET_STAT			0x008	/* Network Status */
107#define   CGEM_NET_STAT_PFC_PRI_PAUSE_NEG	(1 << 6)
108#define   CGEM_NET_STAT_PCS_AUTONEG_PAUSE_TX_RES (1 << 5)
109#define   CGEM_NET_STAT_PCS_AUTONEG_PAUSE_RX_RES (1 << 4)
110#define   CGEM_NET_STAT_PCS_AUTONEG_DUP_RES	(1 << 3)
111#define   CGEM_NET_STAT_PHY_MGMT_IDLE		(1 << 2)
112#define   CGEM_NET_STAT_MDIO_IN_PIN_STATUS	(1 << 1)
113#define   CGEM_NET_STAT_PCS_LINK_STATE		(1 << 0)
114
115#define CGEM_USER_IO			0x00C	/* User I/O */
116
117#define CGEM_DMA_CFG			0x010	/* DMA Config */
118#define   CGEM_DMA_CFG_ADDR_BUS_64		(1 << 30)
119#define   CGEM_DMA_CFG_DISC_WHEN_NO_AHB		(1 << 24)
120#define   CGEM_DMA_CFG_RX_BUF_SIZE_SHIFT	16
121#define   CGEM_DMA_CFG_RX_BUF_SIZE_MASK		(0xff << 16)
122#define   CGEM_DMA_CFG_RX_BUF_SIZE(sz)		((((sz) + 63) / 64)  <<  16)
123#define   CGEM_DMA_CFG_CHKSUM_GEN_OFFLOAD_EN	(1 << 11)
124#define   CGEM_DMA_CFG_TX_PKTBUF_MEMSZ_SEL	(1 << 10)
125#define   CGEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL_1K	(0 << 8)
126#define   CGEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL_2K	(1 << 8)
127#define   CGEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL_4K	(2 << 8)
128#define   CGEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL_8K	(3 << 8)
129#define   CGEM_DMA_CFG_RX_PKTBUF_MEMSZ_SEL_MASK	(3 << 8)
130#define   CGEM_DMA_CFG_AHB_ENDIAN_SWAP_PKT_EN	(1 << 7)
131#define   CGEM_DMA_CFG_AHB_ENDIAN_SWAP_MGMT_EN	(1 << 6)
132#define   CGEM_DMA_CFG_AHB_FIXED_BURST_LEN_1	(1 << 0)
133#define   CGEM_DMA_CFG_AHB_FIXED_BURST_LEN_4	(4 << 0)
134#define   CGEM_DMA_CFG_AHB_FIXED_BURST_LEN_8	(8 << 0)
135#define   CGEM_DMA_CFG_AHB_FIXED_BURST_LEN_16	(16 << 0)
136#define   CGEM_DMA_CFG_AHB_FIXED_BURST_LEN_MASK	(0x1f << 0)
137
138#define CGEM_TX_STAT			0x014	/* Transmit Status */
139#define   CGEM_TX_STAT_HRESP_NOT_OK		(1 << 8)
140#define   CGEM_TX_STAT_LATE_COLL		(1 << 7)
141#define   CGEM_TX_STAT_UNDERRUN			(1 << 6)
142#define   CGEM_TX_STAT_COMPLETE			(1 << 5)
143#define   CGEM_TX_STAT_CORRUPT_AHB_ERR		(1 << 4)
144#define   CGEM_TX_STAT_GO			(1 << 3)
145#define   CGEM_TX_STAT_RETRY_LIMIT_EXC		(1 << 2)
146#define   CGEM_TX_STAT_COLLISION		(1 << 1)
147#define   CGEM_TX_STAT_USED_BIT_READ		(1 << 0)
148#define   CGEM_TX_STAT_ALL			0x1ff
149
150#define CGEM_RX_QBAR			0x018	/* Receive Buf Q Base Addr */
151#define CGEM_TX_QBAR			0x01C	/* Transmit Buf Q Base Addr */
152
153#define CGEM_RX_STAT			0x020	/* Receive Status */
154#define   CGEM_RX_STAT_HRESP_NOT_OK		(1 << 3)
155#define   CGEM_RX_STAT_OVERRUN			(1 << 2)
156#define   CGEM_RX_STAT_FRAME_RECD		(1 << 1)
157#define   CGEM_RX_STAT_BUF_NOT_AVAIL		(1 << 0)
158#define   CGEM_RX_STAT_ALL			0xf
159
160#define CGEM_INTR_STAT			0x024	/* Interrupt Status */
161#define CGEM_INTR_EN			0x028	/* Interrupt Enable */
162#define CGEM_INTR_DIS			0x02C	/* Interrupt Disable */
163#define CGEM_INTR_MASK			0x030	/* Interrupt Mask */
164#define   CGEM_INTR_TSU_SEC_INCR		(1 << 26)
165#define   CGEM_INTR_PDELAY_RESP_TX		(1 << 25)
166#define   CGEM_INTR_PDELAY_REQ_TX		(1 << 24)
167#define   CGEM_INTR_PDELAY_RESP_RX		(1 << 23)
168#define   CGEM_INTR_PDELAY_REQ_RX		(1 << 22)
169#define   CGEM_INTR_SYNX_TX			(1 << 21)
170#define   CGEM_INTR_DELAY_REQ_TX		(1 << 20)
171#define   CGEM_INTR_SYNC_RX			(1 << 19)
172#define   CGEM_INTR_DELAY_REQ_RX		(1 << 18)
173#define   CGEM_INTR_PARTNER_PG_RX		(1 << 17)
174#define   CGEM_INTR_AUTONEG_COMPL		(1 << 16)
175#define   CGEM_INTR_EXT_INTR			(1 << 15)
176#define   CGEM_INTR_PAUSE_TX			(1 << 14)
177#define   CGEM_INTR_PAUSE_ZERO			(1 << 13)
178#define   CGEM_INTR_PAUSE_NONZEROQ_RX		(1 << 12)
179#define   CGEM_INTR_HRESP_NOT_OK		(1 << 11)
180#define   CGEM_INTR_RX_OVERRUN			(1 << 10)
181#define   CGEM_INTR_LINK_CHNG			(1 << 9)
182#define   CGEM_INTR_TX_COMPLETE			(1 << 7)
183#define   CGEM_INTR_TX_CORRUPT_AHB_ERR		(1 << 6)
184#define   CGEM_INTR_RETRY_EX_LATE_COLLISION	(1 << 5)
185#define   CGEM_INTR_TX_USED_READ		(1 << 3)
186#define   CGEM_INTR_RX_USED_READ		(1 << 2)
187#define   CGEM_INTR_RX_COMPLETE			(1 << 1)
188#define   CGEM_INTR_MGMT_SENT			(1 << 0)
189#define   CGEM_INTR_ALL				0x7FFFEFF
190
191#define CGEM_PHY_MAINT			0x034	/* PHY Maintenenace */
192#define   CGEM_PHY_MAINT_CLAUSE_22		(1 << 30)
193#define   CGEM_PHY_MAINT_OP_SHIFT		28
194#define   CGEM_PHY_MAINT_OP_MASK		(3 << 28)
195#define   CGEM_PHY_MAINT_OP_READ		(2 << 28)
196#define   CGEM_PHY_MAINT_OP_WRITE		(1 << 28)
197#define   CGEM_PHY_MAINT_PHY_ADDR_SHIFT		23
198#define   CGEM_PHY_MAINT_PHY_ADDR_MASK		(0x1f << 23)
199#define   CGEM_PHY_MAINT_REG_ADDR_SHIFT		18
200#define   CGEM_PHY_MAINT_REG_ADDR_MASK		(0x1f << 18)
201#define   CGEM_PHY_MAINT_MUST_10		(2 << 16)
202#define   CGEM_PHY_MAINT_DATA_MASK		0xffff
203
204#define CGEM_RX_PAUSEQ			0x038	/* Received Pause Quantum */
205#define CGEM_TX_PAUSEQ			0x03C	/* Transmit Puase Quantum */
206
207#define CGEM_HASH_BOT			0x080	/* Hash Reg Bottom [31:0] */
208#define CGEM_HASH_TOP			0x084	/* Hash Reg Top [63:32] */
209#define CGEM_SPEC_ADDR_LOW(n)		(0x088 + (n) * 8)
210#define CGEM_SPEC_ADDR_HI(n)		(0x08C + (n) * 8)
211
212#define CGEM_TYPE_ID_MATCH1		0x0A8	/* Type ID Match 1 */
213#define   CGEM_TYPE_ID_MATCH_COPY_EN		(1U << 31)
214#define CGEM_TYPE_ID_MATCH2		0x0AC	/* Type ID Match 2 */
215#define CGEM_TYPE_ID_MATCH3		0x0B0	/* Type ID Match 3 */
216#define CGEM_TYPE_ID_MATCH4		0x0B4	/* Type ID Match 4 */
217
218#define CGEM_WAKE_ON_LAN		0x0B8	/* Wake on LAN Register */
219#define   CGEM_WOL_MULTI_HASH_EN		(1 << 19)
220#define   CGEM_WOL_SPEC_ADDR1_EN		(1 << 18)
221#define   CGEM_WOL_ARP_REQ_EN			(1 << 17)
222#define   CGEM_WOL_MAGIC_PKT_EN			(1 << 16)
223#define   CGEM_WOL_ARP_REQ_IP_ADDR_MASK		0xffff
224
225#define CGEM_IPG_STRETCH		/* IPG Stretch Register */
226
227#define CGEM_STACKED_VLAN		0x0C0	/* Stacked VLAN Register */
228#define   CGEM_STACKED_VLAN_EN			(1U << 31)
229
230#define CGEM_TX_PFC_PAUSE		0x0C4	/* Transmit PFC Pause Reg */
231#define   CGEM_TX_PFC_PAUSEQ_SEL_SHIFT		8
232#define   CGEM_TX_PFC_PAUSEQ_SEL_MASK		(0xff << 8)
233#define   CGEM_TX_PFC_PAUSE_PRI_EN_VEC_VAL_MASK 0xff
234
235#define CGEM_SPEC_ADDR1_MASK_BOT	0x0C8	/* Specific Addr Mask1 [31:0]*/
236#define CGEM_SPEC_ADDR1_MASK_TOP	0x0CC	/* Specific Addr Mask1[47:32]*/
237#define CGEM_MODULE_ID			0x0FC	/* Module ID */
238#define CGEM_OCTETS_TX_BOT		0x100	/* Octets xmitted [31:0] */
239#define CGEM_OCTETS_TX_TOP		0x104	/* Octets xmitted [47:32] */
240#define CGEM_FRAMES_TX			0x108	/* Frames xmitted */
241#define CGEM_BCAST_FRAMES_TX		0x10C	/* Broadcast Frames xmitted */
242#define CGEM_MULTI_FRAMES_TX		0x110	/* Multicast Frames xmitted */
243#define CGEM_PAUSE_FRAMES_TX		0x114	/* Pause Frames xmitted */
244#define CGEM_FRAMES_64B_TX		0x118	/* 64-Byte Frames xmitted */
245#define CGEM_FRAMES_65_127B_TX		0x11C	/* 65-127 Byte Frames xmitted*/
246#define CGEM_FRAMES_128_255B_TX		0x120	/* 128-255 Byte Frames xmit */
247#define CGEM_FRAMES_256_511B_TX		0x124	/* 256-511 Byte Frames xmit */
248#define CGEM_FRAMES_512_1023B_TX	0x128	/* 512-1023 Byte frames xmit */
249#define CGEM_FRAMES_1024_1518B_TX	0x12C	/* 1024-1518 Byte frames xmit*/
250#define CGEM_TX_UNDERRUNS		0x134	/* Transmit Under-runs */
251#define CGEM_SINGLE_COLL_FRAMES		0x138	/* Single-Collision Frames */
252#define CGEM_MULTI_COLL_FRAMES		0x13C	/* Multi-Collision Frames */
253#define CGEM_EXCESSIVE_COLL_FRAMES	0x140	/* Excessive Collision Frames*/
254#define CGEM_LATE_COLL			0x144	/* Late Collisions */
255#define CGEM_DEFERRED_TX_FRAMES		0x148	/* Deferred Transmit Frames */
256#define CGEM_CARRIER_SENSE_ERRS		0x14C	/* Carrier Sense Errors */
257#define CGEM_OCTETS_RX_BOT		0x150	/* Octets Received [31:0] */
258#define CGEM_OCTETS_RX_TOP		0x154	/* Octets Received [47:32] */
259#define CGEM_FRAMES_RX			0x158	/* Frames Received */
260#define CGEM_BCAST_FRAMES_RX		0x15C	/* Broadcast Frames Received */
261#define CGEM_MULTI_FRAMES_RX		0x160	/* Multicast Frames Received */
262#define CGEM_PAUSE_FRAMES_RX		0x164	/* Pause Frames Reeived */
263#define CGEM_FRAMES_64B_RX		0x168	/* 64-Byte Frames Received */
264#define CGEM_FRAMES_65_127B_RX		0x16C	/* 65-127 Byte Frames Rx'd */
265#define CGEM_FRAMES_128_255B_RX		0x170	/* 128-255 Byte Frames Rx'd */
266#define CGEM_FRAMES_256_511B_RX		0x174	/* 256-511 Byte Frames Rx'd */
267#define CGEM_FRAMES_512_1023B_RX	0x178	/* 512-1023 Byte Frames Rx'd */
268#define CGEM_FRAMES_1024_1518B_RX	0x17C	/* 1024-1518 Byte Frames Rx'd*/
269#define CGEM_UNDERSZ_RX			0x184	/* Undersize Frames Rx'd */
270#define CGEM_OVERSZ_RX			0x188	/* Oversize Frames Rx'd */
271#define CGEM_JABBERS_RX			0x18C	/* Jabbers received */
272#define CGEM_FCS_ERRS			0x190	/* Frame Check Sequence Errs */
273#define CGEM_LENGTH_FIELD_ERRS		0x194	/* Length Firled Frame Errs */
274#define CGEM_RX_SYMBOL_ERRS		0x198	/* Receive Symbol Errs */
275#define CGEM_ALIGN_ERRS			0x19C	/* Alignment Errors */
276#define CGEM_RX_RESOURCE_ERRS		0x1A0	/* Receive Resoure Errors */
277#define CGEM_RX_OVERRUN_ERRS		0x1A4	/* Receive Overrun Errors */
278#define CGEM_IP_HDR_CKSUM_ERRS		0x1A8	/* IP Hdr Checksum Errors */
279#define CGEM_TCP_CKSUM_ERRS		0x1AC	/* TCP Checksum Errors */
280#define CGEM_UDP_CKSUM_ERRS		0x1B0	/* UDP Checksum Errors */
281#define CGEM_TIMER_STROBE_S		0x1C8	/* 1588 timer sync strobe s */
282#define CGEM_TIMER_STROBE_NS		0x1CC	/* timer sync strobe ns */
283#define CGEM_TIMER_S			0x1D0	/* 1588 timer seconds */
284#define CGEM_TIMER_NS			0x1D4	/* 1588 timer ns */
285#define CGEM_ADJUST			0x1D8	/* 1588 timer adjust */
286#define CGEM_INCR			0x1DC	/* 1588 timer increment */
287#define CGEM_PTP_TX_S			0x1E0	/* PTP Event Frame xmit secs */
288#define CGEM_PTP_TX_NS			0x1E4	/* PTP Event Frame xmit ns */
289#define CGEM_PTP_RX_S			0x1E8	/* PTP Event Frame rcv'd s */
290#define CGEM_PTP_RX_NS			0x1EC	/* PTP Event Frame rcv'd ns */
291#define CGEM_PTP_PEER_TX_S		0x1F0	/* PTP Peer Event xmit s */
292#define CGEM_PTP_PEER_TX_NS		0x1F4	/* PTP Peer Event xmit ns */
293#define CGEM_PTP_PEER_RX_S		0x1F8	/* PTP Peer Event rcv'd s */
294#define CGEM_PTP_PEER_RX_NS		0x1FC	/* PTP Peer Event rcv'd ns */
295
296#define CGEM_DESIGN_CFG1		0x280	/* Design Configuration 1 */
297#define   CGEM_DESIGN_CFG1_AXI_CACHE_WIDTH_MASK	(0xfU << 28)
298#define   CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_MASK	(7 << 25)
299#define   CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_32	(1 << 25)
300#define   CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_64	(2 << 25)
301#define   CGEM_DESIGN_CFG1_DMA_BUS_WIDTH_128	(4 << 25)
302#define   CGEM_DESIGN_CFG1_IRQ_READ_CLR		(1 << 23)
303#define   CGEM_DESIGN_CFG1_NO_SNAPSHOT		(1 << 22)
304#define   CGEM_DESIGN_CFG1_NO_STATS		(1 << 21)
305#define   CGEM_DESIGN_CFG1_NO_SCAN_PINS		(1 << 20)
306#define   CGEM_DESIGN_CFG1_USER_IN_WIDTH_MASK	(0x1f << 15)
307#define   CGEM_DESIGN_CFG1_USER_OUT_WIDTH_MASK	(0x1f << 10)
308#define   CGEM_DESIGN_CFG1_USER_IO		(1 << 9)
309#define   CGEM_DESIGN_CFG1_APB_REV2		(1 << 8)
310#define   CGEM_DESIGN_CFG1_APB_REV1		(1 << 7)
311#define   CGEM_DESIGN_CFG1_EXT_FIFO_INTERFACE	(1 << 6)
312#define   CGEM_DESIGN_CFG1_NO_INT_LOOPBACK	(1 << 5)
313#define   CGEM_DESIGN_CFG1_INT_LOOPBACK		(1 << 4)
314#define   CGEM_DESIGN_CFG1_TDC_50		(1 << 3)
315#define   CGEM_DESIGN_CFG1_RDC_50		(1 << 2)
316#define   CGEM_DESIGN_CFG1_SERDES		(1 << 1)
317#define   CGEM_DESIGN_CFG1_NO_PCS		(1 << 0)
318
319#define CGEM_DESIGN_CFG2		0x284	/* Design Configuration 2 */
320#define   CGEM_DESIGN_CFG2_TX_PBUF_ADDR_SHIFT	26
321#define   CGEM_DESIGN_CFG2_TX_PBUF_ADDR_MASK	(0xf << 26)
322#define   CGEM_DESIGN_CFG2_RX_PBUF_ADDR_SHIFT	22
323#define   CGEM_DESIGN_CFG2_RX_PBUF_ADDR_MASK	(0xf << 22)
324#define   CGEM_DESIGN_CFG2_TX_PKT_BUF		(1 << 21)
325#define   CGEM_DESIGN_CFG2_RX_PKT_BUF		(1 << 20)
326#define   CGEM_DESIGN_CFG2_HPROT_VAL_SHIFT	16
327#define   CGEM_DESIGN_CFG2_HPROT_VAL_MASK	(0xf << 16)
328#define   CGEM_DESIGN_CFG2_JUMBO_MAX_LEN_MASK	0xffff
329
330#define CGEM_DESIGN_CFG3		0x288	/* Design Configuration 3 */
331#define   CGEM_DESIGN_CFG3_RX_BASE2_FIFO_SZ_MASK (0xffffU << 16)
332#define   CGEM_DESIGN_CFG3_RX_BASE2_FIFO_SZ_SHIFT 16
333#define   CGEM_DESIGN_CFG3_RX_FIFO_SIZE_MASK	0xffff
334
335#define CGEM_DESIGN_CFG4		0x28C	/* Design Configuration 4 */
336#define   CGEM_DESIGN_CFG4_TX_BASE2_FIFO_SZ_SHIFT 16
337#define   CGEM_DESIGN_CFG4_TX_BASE2_FIFO_SZ_MASK (0xffffU << 16)
338#define   CGEM_DESIGN_CFG4_TX_FIFO_SIZE_MASK	0xffff
339
340#define CGEM_DESIGN_CFG5		0x290	/* Design Configuration 5 */
341#define   CGEM_DESIGN_CFG5_TSU_CLK		(1 << 28)
342#define   CGEM_DESIGN_CFG5_RX_BUF_LEN_DEF_SHIFT 20
343#define   CGEM_DESIGN_CFG5_RX_BUF_LEN_DEF_MASK	(0xff << 20)
344#define   CGEM_DESIGN_CFG5_TX_PBUF_SIZE_DEF	(1 << 19)
345#define   CGEM_DESIGN_CFG5_RX_PBUF_SIZE_DEF_SHIFT 17
346#define   CGEM_DESIGN_CFG5_RX_PBUF_SIZE_DEF_MASK (3 << 17)
347#define   CGEM_DESIGN_CFG5_ENDIAN_SWAP_DEF_SHIFT 15
348#define   CGEM_DESIGN_CFG5_ENDIAN_SWAP_DEF_MASK (3 << 15)
349#define   CGEM_DESIGN_CFG5_MDC_CLOCK_DIV_SHIFT	12
350#define   CGEM_DESIGN_CFG5_MDC_CLOCK_DIV_MASK	(7 << 12)
351#define   CGEM_DESIGN_CFG5_DMA_BUS_WIDTH_SHIFT	10
352#define   CGEM_DESIGN_CFG5_DMA_BUS_WIDTH_MASK	(3 << 10)
353#define   CGEM_DESIGN_CFG5_PHY_IDENT		(1 << 9)
354#define   CGEM_DESIGN_CFG5_TSU			(1 << 8)
355#define   CGEM_DESIGN_CFG5_TX_FIFO_CNT_WIDTH_SHIFT 4
356#define   CGEM_DESIGN_CFG5_TX_FIFO_CNT_WIDTH_MASK (0xf << 4)
357#define   CGEM_DESIGN_CFG5_RX_FIFO_CNT_WIDTH_MASK 0xf
358
359#define CGEM_DESIGN_CFG6		0x294	/* Design Configuration 6 */
360#define   CGEM_DESIGN_CFG6_ADDR_64B		(1 << 23) /* 64-bit addr cap */
361#define   CGEM_DESIGN_CFG6_DMA_PRIO_Q_MASK	0xfffe
362#define   CGEM_DESIGN_CFG6_DMA_PRIO_Q(n)	(1 << (n))
363
364#define CGEM_TX_QN_BAR(n)		(0x440 + ((n) - 1) * 4)
365#define CGEM_RX_QN_BAR(n)		(0x480 + ((n) - 1) * 4)
366
367#define CGEM_TX_QBAR_HI			0x4C8
368#define CGEM_RX_QBAR_HI			0x4D4
369
370/*
371 * Transmit Descriptors:  two or four 32-bit words:
372 *	word0: address
373 *	word1: length and control
374 *	word2: address upper 32-bits (64-bit mode)
375 *	word3: unused (64-bit mode)
376 */
377
378struct cgem_tx_desc {
379	uint32_t	addr;
380	uint32_t	ctl;
381#define CGEM_TXDESC_USED			(1U << 31) /* done txmitting */
382#define CGEM_TXDESC_WRAP			(1 << 30)  /* end descr ring */
383#define CGEM_TXDESC_RETRY_ERR			(1 << 29)
384#define CGEM_TXDESC_AHB_ERR			(1 << 27)
385#define CGEM_TXDESC_LATE_COLL			(1 << 26)
386#define CGEM_TXDESC_CKSUM_GEN_STAT_MASK		(7 << 20)
387#define CGEM_TXDESC_CKSUM_GEN_STAT_VLAN_HDR_ERR (1 << 20)
388#define CGEM_TXDESC_CKSUM_GEN_STAT_SNAP_HDR_ERR (2 << 20)
389#define CGEM_TXDESC_CKSUM_GEN_STAT_IP_HDR_ERR	(3 << 20)
390#define CGEM_TXDESC_CKSUM_GEN_STAT_UNKNOWN_TYPE (4 << 20)
391#define CGEM_TXDESC_CKSUM_GEN_STAT_UNSUPP_FRAG	(5 << 20)
392#define CGEM_TXDESC_CKSUM_GEN_STAT_NOT_TCPUDP	(6 << 20)
393#define CGEM_TXDESC_CKSUM_GEN_STAT_SHORT_PKT	(7 << 20)
394#define CGEM_TXDESC_NO_CRC_APPENDED		(1 << 16)
395#define CGEM_TXDESC_LAST_BUF			(1 << 15)  /* last in frame */
396#define CGEM_TXDESC_LENGTH_MASK		0x3fff
397#ifdef CGEM64
398	uint32_t	addrhi;
399	uint32_t	unused;
400#endif
401};
402
403/*
404 * Receive Descriptors: two or four 32-bit words:
405 *	word0: address | WRAP and OWN flags
406 *	word1: length and control
407 *	word2: address upper 32 bits (64-bit mode)
408 *	word3: unused
409 */
410
411struct cgem_rx_desc {
412	uint32_t	addr;
413#define CGEM_RXDESC_WRAP			(1 << 1)  /* goes in addr! */
414#define CGEM_RXDESC_OWN				(1 << 0)  /* buf filled */
415	uint32_t	ctl;
416#define CGEM_RXDESC_BCAST			(1U << 31)/* all 1's bcast */
417#define CGEM_RXDESC_MULTI_MATCH			(1 << 30) /* mutlicast match */
418#define CGEM_RXDESC_UNICAST_MATCH		(1 << 29)
419#define CGEM_RXDESC_EXTERNAL_MATCH		(1 << 28) /* ext addr match */
420#define CGEM_RXDESC_SPEC_MATCH_SHIFT		25
421#define CGEM_RXDESC_SPEC_MATCH_MASK		(3 << 25)
422#define CGEM_RXDESC_TYPE_ID_MATCH_SHIFT		22
423#define CGEM_RXDESC_TYPE_ID_MATCH_MASK		(3 << 22)
424#define CGEM_RXDESC_CKSUM_STAT_MASK		(3 << 22) /* same as above */
425#define CGEM_RXDESC_CKSUM_STAT_NONE		(0 << 22)
426#define CGEM_RXDESC_CKSUM_STAT_IP_GOOD		(1 << 22)
427#define CGEM_RXDESC_CKSUM_STAT_TCP_GOOD		(2 << 22) /* and ip good */
428#define CGEM_RXDESC_CKSUM_STAT_UDP_GOOD		(3 << 22) /* and ip good */
429#define CGEM_RXDESC_VLAN_DETECTED		(1 << 21)
430#define CGEM_RXDESC_PRIO_DETECTED		(1 << 20)
431#define CGEM_RXDESC_VLAN_PRIO_SHIFT		17
432#define CGEM_RXDESC_VLAN_PRIO_MASK		(7 << 17)
433#define CGEM_RXDESC_CFI				(1 << 16)
434#define CGEM_RXDESC_EOF				(1 << 15) /* end of frame */
435#define CGEM_RXDESC_SOF				(1 << 14) /* start of frame */
436#define CGEM_RXDESC_BAD_FCS			(1 << 13)
437#define CGEM_RXDESC_LENGTH_MASK			0x1fff
438#ifdef CGEM64
439	uint32_t	addrhi;
440	uint32_t	unused;
441#endif
442};
443
444#endif /* _IF_CGEM_HW_H_ */
445