xref: /linux/drivers/net/dsa/yt921x.h (revision 24f171c7e145f43b9f187578e89b0982ce87e54c)
1186623f4SDavid Yang /* SPDX-License-Identifier: GPL-2.0-or-later */
2186623f4SDavid Yang /*
3186623f4SDavid Yang  * Copyright (c) 2025 David Yang
4186623f4SDavid Yang  */
5186623f4SDavid Yang 
6186623f4SDavid Yang #ifndef __YT921X_H
7186623f4SDavid Yang #define __YT921X_H
8186623f4SDavid Yang 
9186623f4SDavid Yang #include <net/dsa.h>
10186623f4SDavid Yang 
11186623f4SDavid Yang #define YT921X_SMI_SWITCHID_M		GENMASK(3, 2)
12186623f4SDavid Yang #define  YT921X_SMI_SWITCHID(x)			FIELD_PREP(YT921X_SMI_SWITCHID_M, (x))
13186623f4SDavid Yang #define YT921X_SMI_AD			BIT(1)
14186623f4SDavid Yang #define  YT921X_SMI_ADDR			0
15186623f4SDavid Yang #define  YT921X_SMI_DATA			YT921X_SMI_AD
16186623f4SDavid Yang #define YT921X_SMI_RW			BIT(0)
17186623f4SDavid Yang #define  YT921X_SMI_WRITE			0
18186623f4SDavid Yang #define  YT921X_SMI_READ			YT921X_SMI_RW
19186623f4SDavid Yang 
20186623f4SDavid Yang #define YT921X_SWITCHID_NUM		4
21186623f4SDavid Yang 
22186623f4SDavid Yang #define YT921X_RST			0x80000
23186623f4SDavid Yang #define  YT921X_RST_HW				BIT(31)
24186623f4SDavid Yang #define  YT921X_RST_SW				BIT(1)
25186623f4SDavid Yang #define YT921X_FUNC			0x80004
26186623f4SDavid Yang #define  YT921X_FUNC_MIB			BIT(1)
27186623f4SDavid Yang #define YT921X_CHIP_ID			0x80008
28186623f4SDavid Yang #define  YT921X_CHIP_ID_MAJOR			GENMASK(31, 16)
29186623f4SDavid Yang #define YT921X_EXT_CPU_PORT		0x8000c
30186623f4SDavid Yang #define  YT921X_EXT_CPU_PORT_TAG_EN		BIT(15)
31186623f4SDavid Yang #define  YT921X_EXT_CPU_PORT_PORT_EN		BIT(14)
32186623f4SDavid Yang #define  YT921X_EXT_CPU_PORT_PORT_M		GENMASK(3, 0)
33186623f4SDavid Yang #define   YT921X_EXT_CPU_PORT_PORT(x)			FIELD_PREP(YT921X_EXT_CPU_PORT_PORT_M, (x))
34186623f4SDavid Yang #define YT921X_CPU_TAG_TPID		0x80010
35186623f4SDavid Yang #define  YT921X_CPU_TAG_TPID_TPID_M		GENMASK(15, 0)
36186623f4SDavid Yang /* Same as ETH_P_YT921X, but this represents the true HW default, while the
37186623f4SDavid Yang  * former is a local convention chosen by us.
38186623f4SDavid Yang  */
39186623f4SDavid Yang #define   YT921X_CPU_TAG_TPID_TPID_DEFAULT		0x9988
40186623f4SDavid Yang #define YT921X_PVID_SEL			0x80014
41186623f4SDavid Yang #define  YT921X_PVID_SEL_SVID_PORTn(port)	BIT(port)
42186623f4SDavid Yang #define YT921X_SERDES_CTRL		0x80028
43186623f4SDavid Yang #define  YT921X_SERDES_CTRL_PORTn_TEST(port)	BIT((port) - 3)
44186623f4SDavid Yang #define  YT921X_SERDES_CTRL_PORTn(port)		BIT((port) - 8)
45186623f4SDavid Yang #define YT921X_IO_LEVEL			0x80030
46186623f4SDavid Yang #define  YT9215_IO_LEVEL_NORMAL_M		GENMASK(5, 4)
47186623f4SDavid Yang #define   YT9215_IO_LEVEL_NORMAL(x)			FIELD_PREP(YT9215_IO_LEVEL_NORMAL_M, (x))
48186623f4SDavid Yang #define   YT9215_IO_LEVEL_NORMAL_3V3			YT9215_IO_LEVEL_NORMAL(0)
49186623f4SDavid Yang #define   YT9215_IO_LEVEL_NORMAL_1V8			YT9215_IO_LEVEL_NORMAL(3)
50186623f4SDavid Yang #define  YT9215_IO_LEVEL_RGMII1_M		GENMASK(3, 2)
51186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII1(x)			FIELD_PREP(YT9215_IO_LEVEL_RGMII1_M, (x))
52186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII1_3V3			YT9215_IO_LEVEL_RGMII1(0)
53186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII1_2V5			YT9215_IO_LEVEL_RGMII1(1)
54186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII1_1V8			YT9215_IO_LEVEL_RGMII1(2)
55186623f4SDavid Yang #define  YT9215_IO_LEVEL_RGMII0_M		GENMASK(1, 0)
56186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII0(x)			FIELD_PREP(YT9215_IO_LEVEL_RGMII0_M, (x))
57186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII0_3V3			YT9215_IO_LEVEL_RGMII0(0)
58186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII0_2V5			YT9215_IO_LEVEL_RGMII0(1)
59186623f4SDavid Yang #define   YT9215_IO_LEVEL_RGMII0_1V8			YT9215_IO_LEVEL_RGMII0(2)
60186623f4SDavid Yang #define  YT9218_IO_LEVEL_RGMII1_M		GENMASK(5, 4)
61186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII1(x)			FIELD_PREP(YT9218_IO_LEVEL_RGMII1_M, (x))
62186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII1_3V3			YT9218_IO_LEVEL_RGMII1(0)
63186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII1_2V5			YT9218_IO_LEVEL_RGMII1(1)
64186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII1_1V8			YT9218_IO_LEVEL_RGMII1(2)
65186623f4SDavid Yang #define  YT9218_IO_LEVEL_RGMII0_M		GENMASK(3, 2)
66186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII0(x)			FIELD_PREP(YT9218_IO_LEVEL_RGMII0_M, (x))
67186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII0_3V3			YT9218_IO_LEVEL_RGMII0(0)
68186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII0_2V5			YT9218_IO_LEVEL_RGMII0(1)
69186623f4SDavid Yang #define   YT9218_IO_LEVEL_RGMII0_1V8			YT9218_IO_LEVEL_RGMII0(2)
70186623f4SDavid Yang #define  YT9218_IO_LEVEL_NORMAL_M		GENMASK(1, 0)
71186623f4SDavid Yang #define   YT9218_IO_LEVEL_NORMAL(x)			FIELD_PREP(YT9218_IO_LEVEL_NORMAL_M, (x))
72186623f4SDavid Yang #define   YT9218_IO_LEVEL_NORMAL_3V3			YT9218_IO_LEVEL_NORMAL(0)
73186623f4SDavid Yang #define   YT9218_IO_LEVEL_NORMAL_1V8			YT9218_IO_LEVEL_NORMAL(3)
74186623f4SDavid Yang #define YT921X_MAC_ADDR_HI2		0x80080
75186623f4SDavid Yang #define YT921X_MAC_ADDR_LO4		0x80084
76186623f4SDavid Yang #define YT921X_SERDESn(port)		(0x8008c + 4 * ((port) - 8))
77186623f4SDavid Yang #define  YT921X_SERDES_MODE_M			GENMASK(9, 7)
78186623f4SDavid Yang #define   YT921X_SERDES_MODE(x)				FIELD_PREP(YT921X_SERDES_MODE_M, (x))
79186623f4SDavid Yang #define   YT921X_SERDES_MODE_SGMII			YT921X_SERDES_MODE(0)
80186623f4SDavid Yang #define   YT921X_SERDES_MODE_REVSGMII			YT921X_SERDES_MODE(1)
81186623f4SDavid Yang #define   YT921X_SERDES_MODE_1000BASEX			YT921X_SERDES_MODE(2)
82186623f4SDavid Yang #define   YT921X_SERDES_MODE_100BASEX			YT921X_SERDES_MODE(3)
83186623f4SDavid Yang #define   YT921X_SERDES_MODE_2500BASEX			YT921X_SERDES_MODE(4)
84186623f4SDavid Yang #define  YT921X_SERDES_RX_PAUSE			BIT(6)
85186623f4SDavid Yang #define  YT921X_SERDES_TX_PAUSE			BIT(5)
86186623f4SDavid Yang #define  YT921X_SERDES_LINK			BIT(4)  /* force link */
87186623f4SDavid Yang #define  YT921X_SERDES_DUPLEX_FULL		BIT(3)
88186623f4SDavid Yang #define  YT921X_SERDES_SPEED_M			GENMASK(2, 0)
89186623f4SDavid Yang #define   YT921X_SERDES_SPEED(x)			FIELD_PREP(YT921X_SERDES_SPEED_M, (x))
90186623f4SDavid Yang #define   YT921X_SERDES_SPEED_10			YT921X_SERDES_SPEED(0)
91186623f4SDavid Yang #define   YT921X_SERDES_SPEED_100			YT921X_SERDES_SPEED(1)
92186623f4SDavid Yang #define   YT921X_SERDES_SPEED_1000			YT921X_SERDES_SPEED(2)
93186623f4SDavid Yang #define   YT921X_SERDES_SPEED_10000			YT921X_SERDES_SPEED(3)
94186623f4SDavid Yang #define   YT921X_SERDES_SPEED_2500			YT921X_SERDES_SPEED(4)
95186623f4SDavid Yang #define YT921X_PORTn_CTRL(port)		(0x80100 + 4 * (port))
96186623f4SDavid Yang #define  YT921X_PORT_CTRL_PAUSE_AN		BIT(10)
97186623f4SDavid Yang #define YT921X_PORTn_STATUS(port)	(0x80200 + 4 * (port))
98186623f4SDavid Yang #define  YT921X_PORT_LINK			BIT(9)  /* CTRL: auto negotiation */
99186623f4SDavid Yang #define  YT921X_PORT_HALF_PAUSE			BIT(8)  /* Half-duplex back pressure mode */
100186623f4SDavid Yang #define  YT921X_PORT_DUPLEX_FULL		BIT(7)
101186623f4SDavid Yang #define  YT921X_PORT_RX_PAUSE			BIT(6)
102186623f4SDavid Yang #define  YT921X_PORT_TX_PAUSE			BIT(5)
103186623f4SDavid Yang #define  YT921X_PORT_RX_MAC_EN			BIT(4)
104186623f4SDavid Yang #define  YT921X_PORT_TX_MAC_EN			BIT(3)
105186623f4SDavid Yang #define  YT921X_PORT_SPEED_M			GENMASK(2, 0)
106186623f4SDavid Yang #define   YT921X_PORT_SPEED(x)				FIELD_PREP(YT921X_PORT_SPEED_M, (x))
107186623f4SDavid Yang #define   YT921X_PORT_SPEED_10				YT921X_PORT_SPEED(0)
108186623f4SDavid Yang #define   YT921X_PORT_SPEED_100				YT921X_PORT_SPEED(1)
109186623f4SDavid Yang #define   YT921X_PORT_SPEED_1000			YT921X_PORT_SPEED(2)
110186623f4SDavid Yang #define   YT921X_PORT_SPEED_10000			YT921X_PORT_SPEED(3)
111186623f4SDavid Yang #define   YT921X_PORT_SPEED_2500			YT921X_PORT_SPEED(4)
112186623f4SDavid Yang #define YT921X_PON_STRAP_FUNC		0x80320
113186623f4SDavid Yang #define YT921X_PON_STRAP_VAL		0x80324
114186623f4SDavid Yang #define YT921X_PON_STRAP_CAP		0x80328
115186623f4SDavid Yang #define  YT921X_PON_STRAP_EEE			BIT(16)
116186623f4SDavid Yang #define  YT921X_PON_STRAP_LOOP_DETECT		BIT(7)
117186623f4SDavid Yang #define YT921X_MDIO_POLLINGn(port)	(0x80364 + 4 * ((port) - 8))
118186623f4SDavid Yang #define  YT921X_MDIO_POLLING_DUPLEX_FULL	BIT(4)
119186623f4SDavid Yang #define  YT921X_MDIO_POLLING_LINK		BIT(3)
120186623f4SDavid Yang #define  YT921X_MDIO_POLLING_SPEED_M		GENMASK(2, 0)
121186623f4SDavid Yang #define   YT921X_MDIO_POLLING_SPEED(x)			FIELD_PREP(YT921X_MDIO_POLLING_SPEED_M, (x))
122186623f4SDavid Yang #define   YT921X_MDIO_POLLING_SPEED_10			YT921X_MDIO_POLLING_SPEED(0)
123186623f4SDavid Yang #define   YT921X_MDIO_POLLING_SPEED_100			YT921X_MDIO_POLLING_SPEED(1)
124186623f4SDavid Yang #define   YT921X_MDIO_POLLING_SPEED_1000		YT921X_MDIO_POLLING_SPEED(2)
125186623f4SDavid Yang #define   YT921X_MDIO_POLLING_SPEED_10000		YT921X_MDIO_POLLING_SPEED(3)
126186623f4SDavid Yang #define   YT921X_MDIO_POLLING_SPEED_2500		YT921X_MDIO_POLLING_SPEED(4)
127186623f4SDavid Yang #define YT921X_SENSOR			0x8036c
128186623f4SDavid Yang #define  YT921X_SENSOR_TEMP			BIT(18)
129186623f4SDavid Yang #define YT921X_TEMP			0x80374
130186623f4SDavid Yang #define YT921X_CHIP_MODE		0x80388
131186623f4SDavid Yang #define  YT921X_CHIP_MODE_MODE			GENMASK(1, 0)
132186623f4SDavid Yang #define YT921X_XMII_CTRL		0x80394
133186623f4SDavid Yang #define  YT921X_XMII_CTRL_PORTn(port)		BIT(9 - (port))  /* Yes, it's reversed */
134186623f4SDavid Yang #define YT921X_XMIIn(port)		(0x80400 + 8 * ((port) - 8))
135186623f4SDavid Yang #define  YT921X_XMII_MODE_M			GENMASK(31, 29)
136186623f4SDavid Yang #define   YT921X_XMII_MODE(x)				FIELD_PREP(YT921X_XMII_MODE_M, (x))
137186623f4SDavid Yang #define   YT921X_XMII_MODE_MII				YT921X_XMII_MODE(0)
138186623f4SDavid Yang #define   YT921X_XMII_MODE_REVMII			YT921X_XMII_MODE(1)
139186623f4SDavid Yang #define   YT921X_XMII_MODE_RMII				YT921X_XMII_MODE(2)
140186623f4SDavid Yang #define   YT921X_XMII_MODE_REVRMII			YT921X_XMII_MODE(3)
141186623f4SDavid Yang #define   YT921X_XMII_MODE_RGMII			YT921X_XMII_MODE(4)
142186623f4SDavid Yang #define   YT921X_XMII_MODE_DISABLE			YT921X_XMII_MODE(5)
143186623f4SDavid Yang #define  YT921X_XMII_LINK			BIT(19)  /* force link */
144186623f4SDavid Yang #define  YT921X_XMII_EN				BIT(18)
145186623f4SDavid Yang #define  YT921X_XMII_SOFT_RST			BIT(17)
146186623f4SDavid Yang #define  YT921X_XMII_RGMII_TX_DELAY_150PS_M	GENMASK(16, 13)
147186623f4SDavid Yang #define   YT921X_XMII_RGMII_TX_DELAY_150PS(x)		FIELD_PREP(YT921X_XMII_RGMII_TX_DELAY_150PS_M, (x))
148186623f4SDavid Yang #define  YT921X_XMII_TX_CLK_IN			BIT(11)
149186623f4SDavid Yang #define  YT921X_XMII_RX_CLK_IN			BIT(10)
150186623f4SDavid Yang #define  YT921X_XMII_RGMII_TX_DELAY_2NS		BIT(8)
151186623f4SDavid Yang #define  YT921X_XMII_RGMII_TX_CLK_OUT		BIT(7)
152186623f4SDavid Yang #define  YT921X_XMII_RGMII_RX_DELAY_150PS_M	GENMASK(6, 3)
153186623f4SDavid Yang #define   YT921X_XMII_RGMII_RX_DELAY_150PS(x)		FIELD_PREP(YT921X_XMII_RGMII_RX_DELAY_150PS_M, (x))
154186623f4SDavid Yang #define  YT921X_XMII_RMII_PHY_TX_CLK_OUT	BIT(2)
155186623f4SDavid Yang #define  YT921X_XMII_REVMII_TX_CLK_OUT		BIT(1)
156186623f4SDavid Yang #define  YT921X_XMII_REVMII_RX_CLK_OUT		BIT(0)
157186623f4SDavid Yang 
158186623f4SDavid Yang #define YT921X_MACn_FRAME(port)		(0x81008 + 0x1000 * (port))
159186623f4SDavid Yang #define  YT921X_MAC_FRAME_SIZE_M		GENMASK(21, 8)
160186623f4SDavid Yang #define   YT921X_MAC_FRAME_SIZE(x)			FIELD_PREP(YT921X_MAC_FRAME_SIZE_M, (x))
161186623f4SDavid Yang 
162186623f4SDavid Yang #define YT921X_EEEn_VAL(port)		(0xa0000 + 0x40 * (port))
163186623f4SDavid Yang #define  YT921X_EEE_VAL_DATA			BIT(1)
164186623f4SDavid Yang 
165186623f4SDavid Yang #define YT921X_EEE_CTRL			0xb0000
166186623f4SDavid Yang #define  YT921X_EEE_CTRL_ENn(port)		BIT(port)
167186623f4SDavid Yang 
168186623f4SDavid Yang #define YT921X_MIB_CTRL			0xc0004
169186623f4SDavid Yang #define  YT921X_MIB_CTRL_CLEAN			BIT(30)
170186623f4SDavid Yang #define  YT921X_MIB_CTRL_PORT_M			GENMASK(6, 3)
171186623f4SDavid Yang #define   YT921X_MIB_CTRL_PORT(x)			FIELD_PREP(YT921X_MIB_CTRL_PORT_M, (x))
172186623f4SDavid Yang #define  YT921X_MIB_CTRL_ONE_PORT		BIT(1)
173186623f4SDavid Yang #define  YT921X_MIB_CTRL_ALL_PORT		BIT(0)
174186623f4SDavid Yang #define YT921X_MIBn_DATA0(port)		(0xc0100 + 0x100 * (port))
175186623f4SDavid Yang #define YT921X_MIBn_DATAm(port, x)	(YT921X_MIBn_DATA0(port) + 4 * (x))
176fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_BROADCAST		0x00
177fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PAUSE		0x04
178fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_MULTICAST		0x08
179fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_CRC_ERR		0x0c
180fbce7b36SDavid Yang 
181fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_ALIGN_ERR		0x10
182fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_UNDERSIZE_ERR	0x14
183fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_FRAG_ERR		0x18
184fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_64		0x1c
185fbce7b36SDavid Yang 
186fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_65_TO_127	0x20
187fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_128_TO_255	0x24
188fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_256_TO_511	0x28
189fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_512_TO_1023	0x2c
190fbce7b36SDavid Yang 
191fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_1024_TO_1518	0x30
192fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_PKT_SZ_1519_TO_MAX	0x34
193fbce7b36SDavid Yang /* 0x38: unused */
194fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_GOOD_BYTES		0x3c
195fbce7b36SDavid Yang 
196fbce7b36SDavid Yang /* 0x40: 64 bytes */
197fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_BAD_BYTES		0x44
198fbce7b36SDavid Yang /* 0x48: 64 bytes */
199fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_OVERSIZE_ERR	0x4c
200fbce7b36SDavid Yang 
201fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_DROPPED		0x50
202fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_BROADCAST		0x54
203fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PAUSE		0x58
204fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_MULTICAST		0x5c
205fbce7b36SDavid Yang 
206fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_UNDERSIZE_ERR	0x60
207fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_64		0x64
208fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127	0x68
209fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255	0x6c
210fbce7b36SDavid Yang 
211fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_256_TO_511	0x70
212fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_512_TO_1023	0x74
213fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_1024_TO_1518	0x78
214fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT_SZ_1519_TO_MAX	0x7c
215fbce7b36SDavid Yang 
216fbce7b36SDavid Yang /* 0x80: unused */
217fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_GOOD_BYTES		0x84
218fbce7b36SDavid Yang /* 0x88: 64 bytes */
219fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_COLLISION		0x8c
220fbce7b36SDavid Yang 
221fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_EXCESSIVE_COLLISION	0x90
222fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_MULTIPLE_COLLISION	0x94
223fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_SINGLE_COLLISION	0x98
224fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_PKT			0x9c
225fbce7b36SDavid Yang 
226fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_DEFERRED		0xa0
227fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_LATE_COLLISION	0xa4
228fbce7b36SDavid Yang #define  YT921X_MIB_DATA_RX_OAM			0xa8
229fbce7b36SDavid Yang #define  YT921X_MIB_DATA_TX_OAM			0xac
230186623f4SDavid Yang 
231186623f4SDavid Yang #define YT921X_EDATA_CTRL		0xe0000
232186623f4SDavid Yang #define  YT921X_EDATA_CTRL_ADDR_M		GENMASK(15, 8)
233186623f4SDavid Yang #define   YT921X_EDATA_CTRL_ADDR(x)			FIELD_PREP(YT921X_EDATA_CTRL_ADDR_M, (x))
234186623f4SDavid Yang #define  YT921X_EDATA_CTRL_OP_M			GENMASK(3, 0)
235186623f4SDavid Yang #define   YT921X_EDATA_CTRL_OP(x)			FIELD_PREP(YT921X_EDATA_CTRL_OP_M, (x))
236186623f4SDavid Yang #define   YT921X_EDATA_CTRL_READ			YT921X_EDATA_CTRL_OP(5)
237186623f4SDavid Yang #define YT921X_EDATA_DATA		0xe0004
238186623f4SDavid Yang #define  YT921X_EDATA_DATA_DATA_M			GENMASK(31, 24)
239186623f4SDavid Yang #define  YT921X_EDATA_DATA_STATUS_M		GENMASK(3, 0)
240186623f4SDavid Yang #define   YT921X_EDATA_DATA_STATUS(x)			FIELD_PREP(YT921X_EDATA_DATA_STATUS_M, (x))
241186623f4SDavid Yang #define   YT921X_EDATA_DATA_IDLE			YT921X_EDATA_DATA_STATUS(3)
242186623f4SDavid Yang 
243186623f4SDavid Yang #define YT921X_EXT_MBUS_OP		0x6a000
244186623f4SDavid Yang #define YT921X_INT_MBUS_OP		0xf0000
245186623f4SDavid Yang #define  YT921X_MBUS_OP_START			BIT(0)
246186623f4SDavid Yang #define YT921X_EXT_MBUS_CTRL		0x6a004
247186623f4SDavid Yang #define YT921X_INT_MBUS_CTRL		0xf0004
248186623f4SDavid Yang #define  YT921X_MBUS_CTRL_PORT_M		GENMASK(25, 21)
249186623f4SDavid Yang #define   YT921X_MBUS_CTRL_PORT(x)			FIELD_PREP(YT921X_MBUS_CTRL_PORT_M, (x))
250186623f4SDavid Yang #define  YT921X_MBUS_CTRL_REG_M			GENMASK(20, 16)
251186623f4SDavid Yang #define   YT921X_MBUS_CTRL_REG(x)			FIELD_PREP(YT921X_MBUS_CTRL_REG_M, (x))
252186623f4SDavid Yang #define  YT921X_MBUS_CTRL_TYPE_M		GENMASK(11, 8)  /* wild guess */
253186623f4SDavid Yang #define   YT921X_MBUS_CTRL_TYPE(x)			FIELD_PREP(YT921X_MBUS_CTRL_TYPE_M, (x))
254186623f4SDavid Yang #define   YT921X_MBUS_CTRL_TYPE_C22			YT921X_MBUS_CTRL_TYPE(4)
255186623f4SDavid Yang #define  YT921X_MBUS_CTRL_OP_M			GENMASK(3, 2)  /* wild guess */
256186623f4SDavid Yang #define   YT921X_MBUS_CTRL_OP(x)			FIELD_PREP(YT921X_MBUS_CTRL_OP_M, (x))
257186623f4SDavid Yang #define   YT921X_MBUS_CTRL_WRITE			YT921X_MBUS_CTRL_OP(1)
258186623f4SDavid Yang #define   YT921X_MBUS_CTRL_READ				YT921X_MBUS_CTRL_OP(2)
259186623f4SDavid Yang #define YT921X_EXT_MBUS_DOUT		0x6a008
260186623f4SDavid Yang #define YT921X_INT_MBUS_DOUT		0xf0008
261186623f4SDavid Yang #define YT921X_EXT_MBUS_DIN		0x6a00c
262186623f4SDavid Yang #define YT921X_INT_MBUS_DIN		0xf000c
263186623f4SDavid Yang 
264186623f4SDavid Yang #define YT921X_PORTn_EGR(port)		(0x100000 + 4 * (port))
265186623f4SDavid Yang #define  YT921X_PORT_EGR_TPID_CTAG_M		GENMASK(5, 4)
266186623f4SDavid Yang #define   YT921X_PORT_EGR_TPID_CTAG(x)			FIELD_PREP(YT921X_PORT_EGR_TPID_CTAG_M, (x))
267186623f4SDavid Yang #define  YT921X_PORT_EGR_TPID_STAG_M		GENMASK(3, 2)
268186623f4SDavid Yang #define   YT921X_PORT_EGR_TPID_STAG(x)			FIELD_PREP(YT921X_PORT_EGR_TPID_STAG_M, (x))
269186623f4SDavid Yang #define YT921X_TPID_EGRn(x)		(0x100300 + 4 * (x))	/* [0, 3] */
270186623f4SDavid Yang #define  YT921X_TPID_EGR_TPID_M			GENMASK(15, 0)
271186623f4SDavid Yang 
272186623f4SDavid Yang #define YT921X_VLAN_IGR_FILTER		0x180280
273186623f4SDavid Yang #define  YT921X_VLAN_IGR_FILTER_PORTn_BYPASS_IGMP(port)	BIT((port) + 11)
274186623f4SDavid Yang #define  YT921X_VLAN_IGR_FILTER_PORTn(port)	BIT(port)
275186623f4SDavid Yang #define YT921X_PORTn_ISOLATION(port)	(0x180294 + 4 * (port))
276186623f4SDavid Yang #define  YT921X_PORT_ISOLATION_BLOCKn(port)	BIT(port)
277*633b1d01SDavid Yang #define YT921X_STPn(n)			(0x18038c + 4 * (n))
278*633b1d01SDavid Yang #define  YT921X_STP_PORTn_M(port)		GENMASK(2 * (port) + 1, 2 * (port))
279*633b1d01SDavid Yang #define   YT921X_STP_PORTn(port, x)			((x) << (2 * (port)))
280*633b1d01SDavid Yang #define   YT921X_STP_PORTn_DISABLED(port)		YT921X_STP_PORTn(port, 0)
281*633b1d01SDavid Yang #define   YT921X_STP_PORTn_LEARNING(port)		YT921X_STP_PORTn(port, 1)
282*633b1d01SDavid Yang #define   YT921X_STP_PORTn_BLOCKING(port)		YT921X_STP_PORTn(port, 2)
283*633b1d01SDavid Yang #define   YT921X_STP_PORTn_FORWARD(port)		YT921X_STP_PORTn(port, 3)
284186623f4SDavid Yang #define YT921X_PORTn_LEARN(port)	(0x1803d0 + 4 * (port))
285186623f4SDavid Yang #define  YT921X_PORT_LEARN_VID_LEARN_MULTI_EN	BIT(22)
286186623f4SDavid Yang #define  YT921X_PORT_LEARN_VID_LEARN_MODE	BIT(21)
287186623f4SDavid Yang #define  YT921X_PORT_LEARN_VID_LEARN_EN		BIT(20)
288186623f4SDavid Yang #define  YT921X_PORT_LEARN_SUSPEND_COPY_EN	BIT(19)
289186623f4SDavid Yang #define  YT921X_PORT_LEARN_SUSPEND_DROP_EN	BIT(18)
290186623f4SDavid Yang #define  YT921X_PORT_LEARN_DIS			BIT(17)
291186623f4SDavid Yang #define  YT921X_PORT_LEARN_LIMIT_EN		BIT(16)
292186623f4SDavid Yang #define  YT921X_PORT_LEARN_LIMIT_M		GENMASK(15, 8)
293186623f4SDavid Yang #define   YT921X_PORT_LEARN_LIMIT(x)			FIELD_PREP(YT921X_PORT_LEARN_LIMIT_M, (x))
294186623f4SDavid Yang #define  YT921X_PORT_LEARN_DROP_ON_EXCEEDED	BIT(2)
295186623f4SDavid Yang #define  YT921X_PORT_LEARN_MODE_M		GENMASK(1, 0)
296186623f4SDavid Yang #define   YT921X_PORT_LEARN_MODE(x)			FIELD_PREP(YT921X_PORT_LEARN_MODE_M, (x))
297186623f4SDavid Yang #define   YT921X_PORT_LEARN_MODE_AUTO			YT921X_PORT_LEARN_MODE(0)
298186623f4SDavid Yang #define   YT921X_PORT_LEARN_MODE_AUTO_AND_COPY		YT921X_PORT_LEARN_MODE(1)
299186623f4SDavid Yang #define   YT921X_PORT_LEARN_MODE_CPU_CONTROL		YT921X_PORT_LEARN_MODE(2)
300186623f4SDavid Yang #define YT921X_AGEING			0x180440
301186623f4SDavid Yang #define  YT921X_AGEING_INTERVAL_M		GENMASK(15, 0)
302186623f4SDavid Yang #define YT921X_FDB_IN0			0x180454
303186623f4SDavid Yang #define YT921X_FDB_IN1			0x180458
304186623f4SDavid Yang #define YT921X_FDB_IN2			0x18045c
305186623f4SDavid Yang #define YT921X_FDB_OP			0x180460
306186623f4SDavid Yang #define  YT921X_FDB_OP_INDEX_M			GENMASK(22, 11)
307186623f4SDavid Yang #define   YT921X_FDB_OP_INDEX(x)			FIELD_PREP(YT921X_FDB_OP_INDEX_M, (x))
308186623f4SDavid Yang #define  YT921X_FDB_OP_MODE_INDEX		BIT(10)  /* mac+fid / index */
309186623f4SDavid Yang #define  YT921X_FDB_OP_FLUSH_MCAST		BIT(9)  /* ucast / mcast */
310186623f4SDavid Yang #define  YT921X_FDB_OP_FLUSH_M			GENMASK(8, 7)
311186623f4SDavid Yang #define   YT921X_FDB_OP_FLUSH(x)			FIELD_PREP(YT921X_FDB_OP_FLUSH_M, (x))
312186623f4SDavid Yang #define   YT921X_FDB_OP_FLUSH_ALL			YT921X_FDB_OP_FLUSH(0)
313186623f4SDavid Yang #define   YT921X_FDB_OP_FLUSH_PORT			YT921X_FDB_OP_FLUSH(1)
314186623f4SDavid Yang #define   YT921X_FDB_OP_FLUSH_PORT_VID			YT921X_FDB_OP_FLUSH(2)
315186623f4SDavid Yang #define   YT921X_FDB_OP_FLUSH_VID			YT921X_FDB_OP_FLUSH(3)
316186623f4SDavid Yang #define  YT921X_FDB_OP_FLUSH_STATIC		BIT(6)
317186623f4SDavid Yang #define  YT921X_FDB_OP_NEXT_TYPE_M		GENMASK(5, 4)
318186623f4SDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE(x)			FIELD_PREP(YT921X_FDB_OP_NEXT_TYPE_M, (x))
319186623f4SDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_UCAST_PORT		YT921X_FDB_OP_NEXT_TYPE(0)
320186623f4SDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_UCAST_VID		YT921X_FDB_OP_NEXT_TYPE(1)
321186623f4SDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_UCAST			YT921X_FDB_OP_NEXT_TYPE(2)
322186623f4SDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_MCAST			YT921X_FDB_OP_NEXT_TYPE(3)
323186623f4SDavid Yang #define  YT921X_FDB_OP_OP_M			GENMASK(3, 1)
324186623f4SDavid Yang #define   YT921X_FDB_OP_OP(x)				FIELD_PREP(YT921X_FDB_OP_OP_M, (x))
325186623f4SDavid Yang #define   YT921X_FDB_OP_OP_ADD				YT921X_FDB_OP_OP(0)
326186623f4SDavid Yang #define   YT921X_FDB_OP_OP_DEL				YT921X_FDB_OP_OP(1)
327186623f4SDavid Yang #define   YT921X_FDB_OP_OP_GET_ONE			YT921X_FDB_OP_OP(2)
328186623f4SDavid Yang #define   YT921X_FDB_OP_OP_GET_NEXT			YT921X_FDB_OP_OP(3)
329186623f4SDavid Yang #define   YT921X_FDB_OP_OP_FLUSH			YT921X_FDB_OP_OP(4)
330186623f4SDavid Yang #define  YT921X_FDB_OP_START			BIT(0)
331186623f4SDavid Yang #define YT921X_FDB_RESULT		0x180464
332186623f4SDavid Yang #define  YT921X_FDB_RESULT_DONE			BIT(15)
333186623f4SDavid Yang #define  YT921X_FDB_RESULT_NOTFOUND		BIT(14)
334186623f4SDavid Yang #define  YT921X_FDB_RESULT_OVERWRITED		BIT(13)
335186623f4SDavid Yang #define  YT921X_FDB_RESULT_INDEX_M		GENMASK(11, 0)
336186623f4SDavid Yang #define   YT921X_FDB_RESULT_INDEX(x)			FIELD_PREP(YT921X_FDB_RESULT_INDEX_M, (x))
337186623f4SDavid Yang #define YT921X_FDB_OUT0			0x1804b0
338186623f4SDavid Yang #define  YT921X_FDB_IO0_ADDR_HI4_M		GENMASK(31, 0)
339186623f4SDavid Yang #define YT921X_FDB_OUT1			0x1804b4
340186623f4SDavid Yang #define  YT921X_FDB_IO1_EGR_INT_PRI_EN		BIT(31)
341186623f4SDavid Yang #define  YT921X_FDB_IO1_STATUS_M		GENMASK(30, 28)
342186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS(x)			FIELD_PREP(YT921X_FDB_IO1_STATUS_M, (x))
343186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS_INVALID			YT921X_FDB_IO1_STATUS(0)
344186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS_MIN_TIME		YT921X_FDB_IO1_STATUS(1)
345186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS_MOVE_AGING_MAX_TIME	YT921X_FDB_IO1_STATUS(3)
346186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS_MAX_TIME		YT921X_FDB_IO1_STATUS(5)
347186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS_PENDING			YT921X_FDB_IO1_STATUS(6)
348186623f4SDavid Yang #define   YT921X_FDB_IO1_STATUS_STATIC			YT921X_FDB_IO1_STATUS(7)
349186623f4SDavid Yang #define  YT921X_FDB_IO1_FID_M			GENMASK(27, 16)  /* filtering ID (VID) */
350186623f4SDavid Yang #define   YT921X_FDB_IO1_FID(x)				FIELD_PREP(YT921X_FDB_IO1_FID_M, (x))
351186623f4SDavid Yang #define  YT921X_FDB_IO1_ADDR_LO2_M		GENMASK(15, 0)
352186623f4SDavid Yang #define YT921X_FDB_OUT2			0x1804b8
353186623f4SDavid Yang #define  YT921X_FDB_IO2_MOVE_AGING_STATUS_M	GENMASK(31, 30)
354186623f4SDavid Yang #define  YT921X_FDB_IO2_IGR_DROP		BIT(29)
355186623f4SDavid Yang #define  YT921X_FDB_IO2_EGR_PORTS_M		GENMASK(28, 18)
356186623f4SDavid Yang #define   YT921X_FDB_IO2_EGR_PORTS(x)			FIELD_PREP(YT921X_FDB_IO2_EGR_PORTS_M, (x))
357186623f4SDavid Yang #define  YT921X_FDB_IO2_EGR_DROP		BIT(17)
358186623f4SDavid Yang #define  YT921X_FDB_IO2_COPY_TO_CPU		BIT(16)
359186623f4SDavid Yang #define  YT921X_FDB_IO2_IGR_INT_PRI_EN		BIT(15)
360186623f4SDavid Yang #define  YT921X_FDB_IO2_INT_PRI_M		GENMASK(14, 12)
361186623f4SDavid Yang #define   YT921X_FDB_IO2_INT_PRI(x)			FIELD_PREP(YT921X_FDB_IO2_INT_PRI_M, (x))
362186623f4SDavid Yang #define  YT921X_FDB_IO2_NEW_VID_M		GENMASK(11, 0)
363186623f4SDavid Yang #define   YT921X_FDB_IO2_NEW_VID(x)			FIELD_PREP(YT921X_FDB_IO2_NEW_VID_M, (x))
364186623f4SDavid Yang #define YT921X_FILTER_UNK_UCAST		0x180508
365186623f4SDavid Yang #define YT921X_FILTER_UNK_MCAST		0x18050c
366186623f4SDavid Yang #define YT921X_FILTER_MCAST		0x180510
367186623f4SDavid Yang #define YT921X_FILTER_BCAST		0x180514
368186623f4SDavid Yang #define  YT921X_FILTER_PORTS_M			GENMASK(10, 0)
369186623f4SDavid Yang #define   YT921X_FILTER_PORTS(x)			FIELD_PREP(YT921X_FILTER_PORTS_M, (x))
370186623f4SDavid Yang #define  YT921X_FILTER_PORTn(port)		BIT(port)
371186623f4SDavid Yang #define YT921X_VLAN_EGR_FILTER		0x180598
372186623f4SDavid Yang #define  YT921X_VLAN_EGR_FILTER_PORTn(port)	BIT(port)
373186623f4SDavid Yang #define YT921X_CPU_COPY			0x180690
374186623f4SDavid Yang #define  YT921X_CPU_COPY_FORCE_INT_PORT		BIT(2)
375186623f4SDavid Yang #define  YT921X_CPU_COPY_TO_INT_CPU		BIT(1)
376186623f4SDavid Yang #define  YT921X_CPU_COPY_TO_EXT_CPU		BIT(0)
377186623f4SDavid Yang #define YT921X_ACT_UNK_UCAST		0x180734
378186623f4SDavid Yang #define YT921X_ACT_UNK_MCAST		0x180738
379186623f4SDavid Yang #define  YT921X_ACT_UNK_MCAST_BYPASS_DROP_RMA	BIT(23)
380186623f4SDavid Yang #define  YT921X_ACT_UNK_MCAST_BYPASS_DROP_IGMP	BIT(22)
381186623f4SDavid Yang #define  YT921X_ACT_UNK_ACTn_M(port)		GENMASK(2 * (port) + 1, 2 * (port))
382186623f4SDavid Yang #define   YT921X_ACT_UNK_ACTn(port, x)			((x) << (2 * (port)))
383186623f4SDavid Yang #define   YT921X_ACT_UNK_ACTn_FORWARD(port)		YT921X_ACT_UNK_ACTn(port, 0)  /* flood */
384186623f4SDavid Yang #define   YT921X_ACT_UNK_ACTn_TRAP(port)		YT921X_ACT_UNK_ACTn(port, 1)  /* steer to CPU */
385186623f4SDavid Yang #define   YT921X_ACT_UNK_ACTn_DROP(port)		YT921X_ACT_UNK_ACTn(port, 2)  /* discard */
386186623f4SDavid Yang /* NEVER use this action; see comments in the tag driver */
387186623f4SDavid Yang #define   YT921X_ACT_UNK_ACTn_COPY(port)		YT921X_ACT_UNK_ACTn(port, 3)  /* flood and copy */
388186623f4SDavid Yang #define YT921X_FDB_HW_FLUSH		0x180958
389186623f4SDavid Yang #define  YT921X_FDB_HW_FLUSH_ON_LINKDOWN	BIT(0)
390186623f4SDavid Yang 
391186623f4SDavid Yang #define YT921X_VLANn_CTRL(vlan)		(0x188000 + 8 * (vlan))
392d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_UNTAG_PORTS_M		GENMASK_ULL(50, 40)
393186623f4SDavid Yang #define   YT921X_VLAN_CTRL_UNTAG_PORTS(x)		FIELD_PREP(YT921X_VLAN_CTRL_UNTAG_PORTS_M, (x))
394d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_UNTAG_PORTn(port)	BIT_ULL((port) + 40)
395d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_STP_ID_M		GENMASK_ULL(39, 36)
396186623f4SDavid Yang #define   YT921X_VLAN_CTRL_STP_ID(x)			FIELD_PREP(YT921X_VLAN_CTRL_STP_ID_M, (x))
397d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_SVLAN_EN		BIT_ULL(35)
398d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_FID_M			GENMASK_ULL(34, 23)
399186623f4SDavid Yang #define   YT921X_VLAN_CTRL_FID(x)			FIELD_PREP(YT921X_VLAN_CTRL_FID_M, (x))
400d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_LEARN_DIS		BIT_ULL(22)
401d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_INT_PRI_EN		BIT_ULL(21)
402d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_INT_PRI_M		GENMASK_ULL(20, 18)
403d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_PORTS_M		GENMASK_ULL(17, 7)
404186623f4SDavid Yang #define   YT921X_VLAN_CTRL_PORTS(x)			FIELD_PREP(YT921X_VLAN_CTRL_PORTS_M, (x))
405d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_PORTn(port)		BIT_ULL((port) + 7)
406d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_BYPASS_1X_AC		BIT_ULL(6)
407d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_METER_EN		BIT_ULL(5)
408d973ac83SDavid Yang #define  YT921X_VLAN_CTRL_METER_ID_M		GENMASK_ULL(4, 0)
409186623f4SDavid Yang 
410186623f4SDavid Yang #define YT921X_TPID_IGRn(x)		(0x210000 + 4 * (x))	/* [0, 3] */
411186623f4SDavid Yang #define  YT921X_TPID_IGR_TPID_M			GENMASK(15, 0)
412186623f4SDavid Yang #define YT921X_PORTn_IGR_TPID(port)	(0x210010 + 4 * (port))
413186623f4SDavid Yang #define  YT921X_PORT_IGR_TPIDn_STAG_M		GENMASK(7, 4)
414186623f4SDavid Yang #define  YT921X_PORT_IGR_TPIDn_STAG(x)		BIT((x) + 4)
415186623f4SDavid Yang #define  YT921X_PORT_IGR_TPIDn_CTAG_M		GENMASK(3, 0)
416186623f4SDavid Yang #define  YT921X_PORT_IGR_TPIDn_CTAG(x)		BIT(x)
417186623f4SDavid Yang 
418186623f4SDavid Yang #define YT921X_PORTn_VLAN_CTRL(port)	(0x230010 + 4 * (port))
419186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL_SVLAN_PRI_EN	BIT(31)
420186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL_CVLAN_PRI_EN	BIT(30)
421186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL_SVID_M		GENMASK(29, 18)
422186623f4SDavid Yang #define   YT921X_PORT_VLAN_CTRL_SVID(x)			FIELD_PREP(YT921X_PORT_VLAN_CTRL_SVID_M, (x))
423186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL_CVID_M		GENMASK(17, 6)
424186623f4SDavid Yang #define   YT921X_PORT_VLAN_CTRL_CVID(x)			FIELD_PREP(YT921X_PORT_VLAN_CTRL_CVID_M, (x))
425186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL_SVLAN_PRI_M	GENMASK(5, 3)
426186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL_CVLAN_PRI_M	GENMASK(2, 0)
427186623f4SDavid Yang #define YT921X_PORTn_VLAN_CTRL1(port)	(0x230080 + 4 * (port))
428186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_EN	BIT(8)
429186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_PROFILE_ID_M	GENMASK(7, 4)
430186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_TAGGED	BIT(3)
431186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_UNTAGGED	BIT(2)
432186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_TAGGED	BIT(1)
433186623f4SDavid Yang #define  YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_UNTAGGED	BIT(0)
434186623f4SDavid Yang 
435186623f4SDavid Yang #define YT921X_MIRROR			0x300300
436186623f4SDavid Yang #define  YT921X_MIRROR_IGR_PORTS_M		GENMASK(26, 16)
437186623f4SDavid Yang #define   YT921X_MIRROR_IGR_PORTS(x)			FIELD_PREP(YT921X_MIRROR_IGR_PORTS_M, (x))
438186623f4SDavid Yang #define  YT921X_MIRROR_IGR_PORTn(port)		BIT((port) + 16)
439186623f4SDavid Yang #define  YT921X_MIRROR_EGR_PORTS_M		GENMASK(14, 4)
440186623f4SDavid Yang #define   YT921X_MIRROR_EGR_PORTS(x)			FIELD_PREP(YT921X_MIRROR_EGR_PORTS_M, (x))
441186623f4SDavid Yang #define  YT921X_MIRROR_EGR_PORTn(port)		BIT((port) + 4)
442186623f4SDavid Yang #define  YT921X_MIRROR_PORT_M			GENMASK(3, 0)
443186623f4SDavid Yang #define   YT921X_MIRROR_PORT(x)				FIELD_PREP(YT921X_MIRROR_PORT_M, (x))
444186623f4SDavid Yang 
445186623f4SDavid Yang #define YT921X_EDATA_EXTMODE	0xfb
446186623f4SDavid Yang #define YT921X_EDATA_LEN	0x100
447186623f4SDavid Yang 
448186623f4SDavid Yang #define YT921X_FDB_NUM	4096
449186623f4SDavid Yang 
450186623f4SDavid Yang enum yt921x_fdb_entry_status {
451186623f4SDavid Yang 	YT921X_FDB_ENTRY_STATUS_INVALID = 0,
452186623f4SDavid Yang 	YT921X_FDB_ENTRY_STATUS_MIN_TIME = 1,
453186623f4SDavid Yang 	YT921X_FDB_ENTRY_STATUS_MOVE_AGING_MAX_TIME = 3,
454186623f4SDavid Yang 	YT921X_FDB_ENTRY_STATUS_MAX_TIME = 5,
455186623f4SDavid Yang 	YT921X_FDB_ENTRY_STATUS_PENDING = 6,
456186623f4SDavid Yang 	YT921X_FDB_ENTRY_STATUS_STATIC = 7,
457186623f4SDavid Yang };
458186623f4SDavid Yang 
459*633b1d01SDavid Yang #define YT921X_MSTI_NUM		16
460*633b1d01SDavid Yang 
461186623f4SDavid Yang #define YT9215_MAJOR	0x9002
462186623f4SDavid Yang #define YT9218_MAJOR	0x9001
463186623f4SDavid Yang 
464186623f4SDavid Yang /* required for a hard reset */
465186623f4SDavid Yang #define YT921X_RST_DELAY_US	10000
466186623f4SDavid Yang 
467186623f4SDavid Yang #define YT921X_FRAME_SIZE_MAX	0x2400  /* 9216 */
468186623f4SDavid Yang 
469186623f4SDavid Yang #define YT921X_TAG_LEN	8
470186623f4SDavid Yang 
471186623f4SDavid Yang /* 8 internal + 2 external + 1 mcu */
472186623f4SDavid Yang #define YT921X_PORT_NUM			11
473186623f4SDavid Yang 
474186623f4SDavid Yang #define yt921x_port_is_internal(port) ((port) < 8)
475186623f4SDavid Yang #define yt921x_port_is_external(port) (8 <= (port) && (port) < 9)
476186623f4SDavid Yang 
477186623f4SDavid Yang struct yt921x_mib {
478186623f4SDavid Yang 	u64 rx_broadcast;
479186623f4SDavid Yang 	u64 rx_pause;
480186623f4SDavid Yang 	u64 rx_multicast;
481186623f4SDavid Yang 	u64 rx_crc_errors;
482186623f4SDavid Yang 
483186623f4SDavid Yang 	u64 rx_alignment_errors;
484186623f4SDavid Yang 	u64 rx_undersize_errors;
485186623f4SDavid Yang 	u64 rx_fragment_errors;
486186623f4SDavid Yang 	u64 rx_64byte;
487186623f4SDavid Yang 
488186623f4SDavid Yang 	u64 rx_65_127byte;
489186623f4SDavid Yang 	u64 rx_128_255byte;
490186623f4SDavid Yang 	u64 rx_256_511byte;
491186623f4SDavid Yang 	u64 rx_512_1023byte;
492186623f4SDavid Yang 
493186623f4SDavid Yang 	u64 rx_1024_1518byte;
494186623f4SDavid Yang 	u64 rx_jumbo;
495186623f4SDavid Yang 	u64 rx_good_bytes;
496186623f4SDavid Yang 
497186623f4SDavid Yang 	u64 rx_bad_bytes;
498186623f4SDavid Yang 	u64 rx_oversize_errors;
499186623f4SDavid Yang 
500186623f4SDavid Yang 	u64 rx_dropped;
501186623f4SDavid Yang 	u64 tx_broadcast;
502186623f4SDavid Yang 	u64 tx_pause;
503186623f4SDavid Yang 	u64 tx_multicast;
504186623f4SDavid Yang 
505186623f4SDavid Yang 	u64 tx_undersize_errors;
506186623f4SDavid Yang 	u64 tx_64byte;
507186623f4SDavid Yang 	u64 tx_65_127byte;
508186623f4SDavid Yang 	u64 tx_128_255byte;
509186623f4SDavid Yang 
510186623f4SDavid Yang 	u64 tx_256_511byte;
511186623f4SDavid Yang 	u64 tx_512_1023byte;
512186623f4SDavid Yang 	u64 tx_1024_1518byte;
513186623f4SDavid Yang 	u64 tx_jumbo;
514186623f4SDavid Yang 
515186623f4SDavid Yang 	u64 tx_good_bytes;
516186623f4SDavid Yang 	u64 tx_collisions;
517186623f4SDavid Yang 
518186623f4SDavid Yang 	u64 tx_aborted_errors;
519186623f4SDavid Yang 	u64 tx_multiple_collisions;
520186623f4SDavid Yang 	u64 tx_single_collisions;
521186623f4SDavid Yang 	u64 tx_good;
522186623f4SDavid Yang 
523186623f4SDavid Yang 	u64 tx_deferred;
524186623f4SDavid Yang 	u64 tx_late_collisions;
525186623f4SDavid Yang 	u64 rx_oam;
526186623f4SDavid Yang 	u64 tx_oam;
527186623f4SDavid Yang };
528186623f4SDavid Yang 
529186623f4SDavid Yang struct yt921x_port {
530186623f4SDavid Yang 	unsigned char index;
531186623f4SDavid Yang 
532186623f4SDavid Yang 	bool hairpin;
533186623f4SDavid Yang 	bool isolated;
534186623f4SDavid Yang 
535186623f4SDavid Yang 	struct delayed_work mib_read;
536186623f4SDavid Yang 	struct yt921x_mib mib;
537186623f4SDavid Yang 	u64 rx_frames;
538186623f4SDavid Yang 	u64 tx_frames;
539186623f4SDavid Yang };
540186623f4SDavid Yang 
541186623f4SDavid Yang struct yt921x_reg_ops {
542186623f4SDavid Yang 	int (*read)(void *context, u32 reg, u32 *valp);
543186623f4SDavid Yang 	int (*write)(void *context, u32 reg, u32 val);
544186623f4SDavid Yang };
545186623f4SDavid Yang 
546186623f4SDavid Yang struct yt921x_priv {
547186623f4SDavid Yang 	struct dsa_switch ds;
548186623f4SDavid Yang 
549186623f4SDavid Yang 	const struct yt921x_info *info;
550186623f4SDavid Yang 	/* cache of dsa_cpu_ports(ds) */
551186623f4SDavid Yang 	u16 cpu_ports_mask;
552186623f4SDavid Yang 
553186623f4SDavid Yang 	/* protect the access to the switch registers */
554186623f4SDavid Yang 	struct mutex reg_lock;
555186623f4SDavid Yang 	const struct yt921x_reg_ops *reg_ops;
556186623f4SDavid Yang 	void *reg_ctx;
557186623f4SDavid Yang 
558186623f4SDavid Yang 	/* mdio master bus */
559186623f4SDavid Yang 	struct mii_bus *mbus_int;
560186623f4SDavid Yang 	struct mii_bus *mbus_ext;
561186623f4SDavid Yang 
562186623f4SDavid Yang 	struct yt921x_port ports[YT921X_PORT_NUM];
563186623f4SDavid Yang 
564186623f4SDavid Yang 	u16 eee_ports_mask;
565186623f4SDavid Yang };
566186623f4SDavid Yang 
567186623f4SDavid Yang #endif
568