xref: /linux/drivers/net/dsa/motorcomm/chip.h (revision 279d5c8afcd38bd841832a39bfe1aa4f8518d98e)
19c472a0dSDavid Yang /* SPDX-License-Identifier: GPL-2.0-or-later */
29c472a0dSDavid Yang /*
39c472a0dSDavid Yang  * Copyright (c) 2025 David Yang
49c472a0dSDavid Yang  */
59c472a0dSDavid Yang 
69c472a0dSDavid Yang #ifndef __YT921X_H
79c472a0dSDavid Yang #define __YT921X_H
89c472a0dSDavid Yang 
99c472a0dSDavid Yang #include <net/dsa.h>
109c472a0dSDavid Yang 
119c472a0dSDavid Yang #define YT921X_SMI_SWITCHID_M		GENMASK(3, 2)
129c472a0dSDavid Yang #define  YT921X_SMI_SWITCHID(x)			FIELD_PREP(YT921X_SMI_SWITCHID_M, (x))
139c472a0dSDavid Yang #define YT921X_SMI_AD			BIT(1)
149c472a0dSDavid Yang #define  YT921X_SMI_ADDR			0
159c472a0dSDavid Yang #define  YT921X_SMI_DATA			YT921X_SMI_AD
169c472a0dSDavid Yang #define YT921X_SMI_RW			BIT(0)
179c472a0dSDavid Yang #define  YT921X_SMI_WRITE			0
189c472a0dSDavid Yang #define  YT921X_SMI_READ			YT921X_SMI_RW
199c472a0dSDavid Yang 
209c472a0dSDavid Yang #define YT921X_SWITCHID_NUM		4
219c472a0dSDavid Yang 
229c472a0dSDavid Yang #define YT921X_RST			0x80000
239c472a0dSDavid Yang #define  YT921X_RST_HW				BIT(31)
249c472a0dSDavid Yang #define  YT921X_RST_SW				BIT(1)
259c472a0dSDavid Yang #define YT921X_FUNC			0x80004
269c472a0dSDavid Yang #define  YT921X_FUNC_METER			BIT(4)
279c472a0dSDavid Yang #define  YT921X_FUNC_ACL			BIT(2)
289c472a0dSDavid Yang #define  YT921X_FUNC_MIB			BIT(1)
299c472a0dSDavid Yang #define YT921X_CHIP_ID			0x80008
309c472a0dSDavid Yang #define  YT921X_CHIP_ID_MAJOR			GENMASK(31, 16)
319c472a0dSDavid Yang #define YT921X_EXT_CPU_PORT		0x8000c
329c472a0dSDavid Yang #define  YT921X_EXT_CPU_PORT_TAG_EN		BIT(15)
339c472a0dSDavid Yang #define  YT921X_EXT_CPU_PORT_PORT_EN		BIT(14)
349c472a0dSDavid Yang #define  YT921X_EXT_CPU_PORT_PORT_M		GENMASK(3, 0)
359c472a0dSDavid Yang #define   YT921X_EXT_CPU_PORT_PORT(x)			FIELD_PREP(YT921X_EXT_CPU_PORT_PORT_M, (x))
369c472a0dSDavid Yang #define YT921X_CPU_TAG_TPID		0x80010
379c472a0dSDavid Yang #define  YT921X_CPU_TAG_TPID_TPID_M		GENMASK(15, 0)
389c472a0dSDavid Yang /* Same as ETH_P_YT921X, but this represents the true HW default, while the
399c472a0dSDavid Yang  * former is a local convention chosen by us.
409c472a0dSDavid Yang  */
419c472a0dSDavid Yang #define   YT921X_CPU_TAG_TPID_TPID_DEFAULT		0x9988
429c472a0dSDavid Yang #define YT921X_PVID_SEL			0x80014
439c472a0dSDavid Yang #define  YT921X_PVID_SEL_SVID_PORTn(port)	BIT(port)
449c472a0dSDavid Yang #define YT921X_SERDES_CTRL		0x80028
45be5cdff0SDavid Yang #define  YT921X_SERDES_CTRL_TEST		BIT(6)
469c472a0dSDavid Yang #define  YT921X_SERDES_CTRL_PORTn(port)		BIT((port) - 8)
479c472a0dSDavid Yang #define YT921X_IO_LEVEL			0x80030
489c472a0dSDavid Yang #define  YT9215_IO_LEVEL_NORMAL_M		GENMASK(5, 4)
499c472a0dSDavid Yang #define   YT9215_IO_LEVEL_NORMAL(x)			FIELD_PREP(YT9215_IO_LEVEL_NORMAL_M, (x))
509c472a0dSDavid Yang #define   YT9215_IO_LEVEL_NORMAL_3V3			YT9215_IO_LEVEL_NORMAL(0)
519c472a0dSDavid Yang #define   YT9215_IO_LEVEL_NORMAL_1V8			YT9215_IO_LEVEL_NORMAL(3)
529c472a0dSDavid Yang #define  YT9215_IO_LEVEL_RGMII1_M		GENMASK(3, 2)
539c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII1(x)			FIELD_PREP(YT9215_IO_LEVEL_RGMII1_M, (x))
549c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII1_3V3			YT9215_IO_LEVEL_RGMII1(0)
559c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII1_2V5			YT9215_IO_LEVEL_RGMII1(1)
569c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII1_1V8			YT9215_IO_LEVEL_RGMII1(2)
579c472a0dSDavid Yang #define  YT9215_IO_LEVEL_RGMII0_M		GENMASK(1, 0)
589c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII0(x)			FIELD_PREP(YT9215_IO_LEVEL_RGMII0_M, (x))
599c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII0_3V3			YT9215_IO_LEVEL_RGMII0(0)
609c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII0_2V5			YT9215_IO_LEVEL_RGMII0(1)
619c472a0dSDavid Yang #define   YT9215_IO_LEVEL_RGMII0_1V8			YT9215_IO_LEVEL_RGMII0(2)
629c472a0dSDavid Yang #define  YT9218_IO_LEVEL_RGMII1_M		GENMASK(5, 4)
639c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII1(x)			FIELD_PREP(YT9218_IO_LEVEL_RGMII1_M, (x))
649c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII1_3V3			YT9218_IO_LEVEL_RGMII1(0)
659c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII1_2V5			YT9218_IO_LEVEL_RGMII1(1)
669c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII1_1V8			YT9218_IO_LEVEL_RGMII1(2)
679c472a0dSDavid Yang #define  YT9218_IO_LEVEL_RGMII0_M		GENMASK(3, 2)
689c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII0(x)			FIELD_PREP(YT9218_IO_LEVEL_RGMII0_M, (x))
699c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII0_3V3			YT9218_IO_LEVEL_RGMII0(0)
709c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII0_2V5			YT9218_IO_LEVEL_RGMII0(1)
719c472a0dSDavid Yang #define   YT9218_IO_LEVEL_RGMII0_1V8			YT9218_IO_LEVEL_RGMII0(2)
729c472a0dSDavid Yang #define  YT9218_IO_LEVEL_NORMAL_M		GENMASK(1, 0)
739c472a0dSDavid Yang #define   YT9218_IO_LEVEL_NORMAL(x)			FIELD_PREP(YT9218_IO_LEVEL_NORMAL_M, (x))
749c472a0dSDavid Yang #define   YT9218_IO_LEVEL_NORMAL_3V3			YT9218_IO_LEVEL_NORMAL(0)
759c472a0dSDavid Yang #define   YT9218_IO_LEVEL_NORMAL_1V8			YT9218_IO_LEVEL_NORMAL(3)
769c472a0dSDavid Yang #define YT921X_MAC_ADDR_HI2		0x80080
779c472a0dSDavid Yang #define YT921X_MAC_ADDR_LO4		0x80084
789c472a0dSDavid Yang #define YT921X_SERDESn(port)		(0x8008c + 4 * ((port) - 8))
799c472a0dSDavid Yang #define  YT921X_SERDES_MODE_M			GENMASK(9, 7)
809c472a0dSDavid Yang #define   YT921X_SERDES_MODE(x)				FIELD_PREP(YT921X_SERDES_MODE_M, (x))
819c472a0dSDavid Yang #define   YT921X_SERDES_MODE_SGMII			YT921X_SERDES_MODE(0)
829c472a0dSDavid Yang #define   YT921X_SERDES_MODE_REVSGMII			YT921X_SERDES_MODE(1)
839c472a0dSDavid Yang #define   YT921X_SERDES_MODE_1000BASEX			YT921X_SERDES_MODE(2)
849c472a0dSDavid Yang #define   YT921X_SERDES_MODE_100BASEX			YT921X_SERDES_MODE(3)
859c472a0dSDavid Yang #define   YT921X_SERDES_MODE_2500BASEX			YT921X_SERDES_MODE(4)
869c472a0dSDavid Yang #define  YT921X_SERDES_RX_PAUSE			BIT(6)
879c472a0dSDavid Yang #define  YT921X_SERDES_TX_PAUSE			BIT(5)
889c472a0dSDavid Yang #define  YT921X_SERDES_LINK			BIT(4)  /* force link */
899c472a0dSDavid Yang #define  YT921X_SERDES_DUPLEX_FULL		BIT(3)
909c472a0dSDavid Yang #define  YT921X_SERDES_SPEED_M			GENMASK(2, 0)
919c472a0dSDavid Yang #define   YT921X_SERDES_SPEED(x)			FIELD_PREP(YT921X_SERDES_SPEED_M, (x))
92be5cdff0SDavid Yang #define YT921X_PORTn_CTRL(port)		(0x80100 + 4 * (port))  /* Bit 7-0 shared with PORT_STATUS */
939c472a0dSDavid Yang #define  YT921X_PORT_CTRL_PAUSE_AN		BIT(10)
94be5cdff0SDavid Yang #define  YT921X_PORT_CTRL_LINK_AN		BIT(9)
95be5cdff0SDavid Yang #define  YT921X_PORT_CTRL_HALF_PAUSE		BIT(8)  /* Half-duplex back pressure mode */
969c472a0dSDavid Yang #define YT921X_PORTn_STATUS(port)	(0x80200 + 4 * (port))
97be5cdff0SDavid Yang #define  YT921X_PORT_LINK			BIT(8)
989c472a0dSDavid Yang #define  YT921X_PORT_DUPLEX_FULL		BIT(7)
999c472a0dSDavid Yang #define  YT921X_PORT_RX_PAUSE			BIT(6)
1009c472a0dSDavid Yang #define  YT921X_PORT_TX_PAUSE			BIT(5)
1019c472a0dSDavid Yang #define  YT921X_PORT_RX_MAC_EN			BIT(4)
1029c472a0dSDavid Yang #define  YT921X_PORT_TX_MAC_EN			BIT(3)
1039c472a0dSDavid Yang #define  YT921X_PORT_SPEED_M			GENMASK(2, 0)
1049c472a0dSDavid Yang #define   YT921X_PORT_SPEED(x)				FIELD_PREP(YT921X_PORT_SPEED_M, (x))
1059c472a0dSDavid Yang #define YT921X_PON_STRAP_FUNC		0x80320
1069c472a0dSDavid Yang #define YT921X_PON_STRAP_VAL		0x80324
1079c472a0dSDavid Yang #define YT921X_PON_STRAP_CAP		0x80328
1089c472a0dSDavid Yang #define  YT921X_PON_STRAP_EEE			BIT(16)
1099c472a0dSDavid Yang #define  YT921X_PON_STRAP_LOOP_DETECT		BIT(7)
1109c472a0dSDavid Yang #define YT921X_MDIO_POLLINGn(port)	(0x80364 + 4 * ((port) - 8))
1119c472a0dSDavid Yang #define  YT921X_MDIO_POLLING_DUPLEX_FULL	BIT(4)
1129c472a0dSDavid Yang #define  YT921X_MDIO_POLLING_LINK		BIT(3)
1139c472a0dSDavid Yang #define  YT921X_MDIO_POLLING_SPEED_M		GENMASK(2, 0)
1149c472a0dSDavid Yang #define   YT921X_MDIO_POLLING_SPEED(x)			FIELD_PREP(YT921X_MDIO_POLLING_SPEED_M, (x))
1155423f892SDavid Yang 
1165423f892SDavid Yang enum yt921x_speed {
1175423f892SDavid Yang 	YT921X_SPEED_10,
1185423f892SDavid Yang 	YT921X_SPEED_100,
1195423f892SDavid Yang 	YT921X_SPEED_1000,
1205423f892SDavid Yang 	YT921X_SPEED_10000,
1215423f892SDavid Yang 	YT921X_SPEED_2500,
1225423f892SDavid Yang 	YT921X_SPEED_INVALID
1235423f892SDavid Yang };
1245423f892SDavid Yang 
1259c472a0dSDavid Yang #define YT921X_SENSOR			0x8036c
1269c472a0dSDavid Yang #define  YT921X_SENSOR_TEMP			BIT(18)
1279c472a0dSDavid Yang #define YT921X_TEMP			0x80374
1289c472a0dSDavid Yang #define YT921X_CHIP_MODE		0x80388
1299c472a0dSDavid Yang #define  YT921X_CHIP_MODE_MODE			GENMASK(1, 0)
1309c472a0dSDavid Yang #define YT921X_XMII_CTRL		0x80394
1319c472a0dSDavid Yang #define  YT921X_XMII_CTRL_PORTn(port)		BIT(9 - (port))  /* Yes, it's reversed */
1329c472a0dSDavid Yang #define YT921X_XMIIn(port)		(0x80400 + 8 * ((port) - 8))
1339c472a0dSDavid Yang #define  YT921X_XMII_MODE_M			GENMASK(31, 29)
1349c472a0dSDavid Yang #define   YT921X_XMII_MODE(x)				FIELD_PREP(YT921X_XMII_MODE_M, (x))
1359c472a0dSDavid Yang #define   YT921X_XMII_MODE_MII				YT921X_XMII_MODE(0)
1369c472a0dSDavid Yang #define   YT921X_XMII_MODE_REVMII			YT921X_XMII_MODE(1)
1379c472a0dSDavid Yang #define   YT921X_XMII_MODE_RMII				YT921X_XMII_MODE(2)
1389c472a0dSDavid Yang #define   YT921X_XMII_MODE_REVRMII			YT921X_XMII_MODE(3)
1399c472a0dSDavid Yang #define   YT921X_XMII_MODE_RGMII			YT921X_XMII_MODE(4)
1409c472a0dSDavid Yang #define   YT921X_XMII_MODE_DISABLE			YT921X_XMII_MODE(5)
1419c472a0dSDavid Yang #define  YT921X_XMII_LINK			BIT(19)  /* force link */
1429c472a0dSDavid Yang #define  YT921X_XMII_EN				BIT(18)
1439c472a0dSDavid Yang #define  YT921X_XMII_SOFT_RST			BIT(17)
1449c472a0dSDavid Yang #define  YT921X_XMII_RGMII_TX_DELAY_150PS_M	GENMASK(16, 13)
1459c472a0dSDavid Yang #define   YT921X_XMII_RGMII_TX_DELAY_150PS(x)		FIELD_PREP(YT921X_XMII_RGMII_TX_DELAY_150PS_M, (x))
1469c472a0dSDavid Yang #define  YT921X_XMII_TX_CLK_IN			BIT(11)
1479c472a0dSDavid Yang #define  YT921X_XMII_RX_CLK_IN			BIT(10)
1489c472a0dSDavid Yang #define  YT921X_XMII_RGMII_TX_DELAY_2NS		BIT(8)
1499c472a0dSDavid Yang #define  YT921X_XMII_RGMII_TX_CLK_OUT		BIT(7)
1509c472a0dSDavid Yang #define  YT921X_XMII_RGMII_RX_DELAY_150PS_M	GENMASK(6, 3)
1519c472a0dSDavid Yang #define   YT921X_XMII_RGMII_RX_DELAY_150PS(x)		FIELD_PREP(YT921X_XMII_RGMII_RX_DELAY_150PS_M, (x))
1529c472a0dSDavid Yang #define  YT921X_XMII_RMII_PHY_TX_CLK_OUT	BIT(2)
1539c472a0dSDavid Yang #define  YT921X_XMII_REVMII_TX_CLK_OUT		BIT(1)
1549c472a0dSDavid Yang #define  YT921X_XMII_REVMII_RX_CLK_OUT		BIT(0)
1559c472a0dSDavid Yang 
1569c472a0dSDavid Yang #define YT921X_MACn_FRAME(port)		(0x81008 + 0x1000 * (port))
1579c472a0dSDavid Yang #define  YT921X_MAC_FRAME_SIZE_M		GENMASK(21, 8)
1589c472a0dSDavid Yang #define   YT921X_MAC_FRAME_SIZE(x)			FIELD_PREP(YT921X_MAC_FRAME_SIZE_M, (x))
1599c472a0dSDavid Yang 
1609c472a0dSDavid Yang #define YT921X_EEEn_VAL(port)		(0xa0000 + 0x40 * (port))
1619c472a0dSDavid Yang #define  YT921X_EEE_VAL_DATA			BIT(1)
1629c472a0dSDavid Yang 
1639c472a0dSDavid Yang #define YT921X_EEE_CTRL			0xb0000
1649c472a0dSDavid Yang #define  YT921X_EEE_CTRL_ENn(port)		BIT(port)
1659c472a0dSDavid Yang 
1669c472a0dSDavid Yang #define YT921X_EDATA_CTRL		0xe0000
1679c472a0dSDavid Yang #define  YT921X_EDATA_CTRL_ADDR_M		GENMASK(15, 8)
1689c472a0dSDavid Yang #define   YT921X_EDATA_CTRL_ADDR(x)			FIELD_PREP(YT921X_EDATA_CTRL_ADDR_M, (x))
1699c472a0dSDavid Yang #define  YT921X_EDATA_CTRL_OP_M			GENMASK(3, 0)
1709c472a0dSDavid Yang #define   YT921X_EDATA_CTRL_OP(x)			FIELD_PREP(YT921X_EDATA_CTRL_OP_M, (x))
1719c472a0dSDavid Yang #define   YT921X_EDATA_CTRL_READ			YT921X_EDATA_CTRL_OP(5)
1729c472a0dSDavid Yang #define YT921X_EDATA_DATA		0xe0004
1739c472a0dSDavid Yang #define  YT921X_EDATA_DATA_DATA_M			GENMASK(31, 24)
1749c472a0dSDavid Yang #define  YT921X_EDATA_DATA_STATUS_M		GENMASK(3, 0)
1759c472a0dSDavid Yang #define   YT921X_EDATA_DATA_STATUS(x)			FIELD_PREP(YT921X_EDATA_DATA_STATUS_M, (x))
1769c472a0dSDavid Yang #define   YT921X_EDATA_DATA_IDLE			YT921X_EDATA_DATA_STATUS(3)
1779c472a0dSDavid Yang #define YT921X_SYS_CLK			0xe0040
1789c472a0dSDavid Yang #define  YT921X_SYS_CLK_SEL_M			GENMASK(1, 0)  /* unknown: 167M */
1799c472a0dSDavid Yang #define   YT9215_SYS_CLK_125M				0
1809c472a0dSDavid Yang #define   YT9218_SYS_CLK_167M				0
1819c472a0dSDavid Yang #define   YT921X_SYS_CLK_143M				1
1829c472a0dSDavid Yang 
1839c472a0dSDavid Yang #define YT921X_PORTn_EGR(port)		(0x100000 + 4 * (port))
1849c472a0dSDavid Yang #define  YT921X_PORT_EGR_TPID_CTAG_M		GENMASK(5, 4)
1859c472a0dSDavid Yang #define   YT921X_PORT_EGR_TPID_CTAG(x)			FIELD_PREP(YT921X_PORT_EGR_TPID_CTAG_M, (x))
1869c472a0dSDavid Yang #define  YT921X_PORT_EGR_TPID_STAG_M		GENMASK(3, 2)
1879c472a0dSDavid Yang #define   YT921X_PORT_EGR_TPID_STAG(x)			FIELD_PREP(YT921X_PORT_EGR_TPID_STAG_M, (x))
1889c472a0dSDavid Yang #define YT921X_TPID_EGRn(x)		(0x100300 + 4 * (x))	/* [0, 3] */
1899c472a0dSDavid Yang #define  YT921X_TPID_EGR_TPID_M			GENMASK(15, 0)
1909c472a0dSDavid Yang 
1919c472a0dSDavid Yang #define YT921X_IPM_DSCPn(n)		(0x180000 + 4 * (n))	/* Internal Priority Map */
1929c472a0dSDavid Yang #define YT921X_IPM_PCPn(map, dei, pcp)	(0x180100 + 4 * (16 * (map) + 8 * (dei) + (pcp)))
1939c472a0dSDavid Yang #define  YT921X_IPM_PRIO_M			GENMASK(4, 2)
1949c472a0dSDavid Yang #define   YT921X_IPM_PRIO(x)				FIELD_PREP(YT921X_IPM_PRIO_M, (x))
1959c472a0dSDavid Yang #define  YT921X_IPM_COLOR_M			GENMASK(1, 0)
1969c472a0dSDavid Yang #define   YT921X_IPM_COLOR(x)				FIELD_PREP(YT921X_IPM_COLOR_M, (x))
1979c472a0dSDavid Yang #define   YT921X_IPM_COLOR_GREEN			YT921X_IPM_COLOR(0)
1989c472a0dSDavid Yang #define   YT921X_IPM_COLOR_YELLOW			YT921X_IPM_COLOR(1)
1999c472a0dSDavid Yang #define   YT921X_IPM_COLOR_RED				YT921X_IPM_COLOR(2)
2009c472a0dSDavid Yang #define YT921X_PORTn_QOS(port)		(0x180180 + 4 * (port))
2019c472a0dSDavid Yang #define  YT921X_PORT_QOS_CVLAN_PRIO_MAP_ID	BIT(5)
2029c472a0dSDavid Yang #define  YT921X_PORT_QOS_SVLAN_PRIO_MAP_ID	BIT(4)
2039c472a0dSDavid Yang #define  YT921X_PORT_QOS_PRIO_M			GENMASK(3, 1)
2049c472a0dSDavid Yang #define   YT921X_PORT_QOS_PRIO(x)			FIELD_PREP(YT921X_PORT_QOS_PRIO_M, (x))
2059c472a0dSDavid Yang #define  YT921X_PORT_QOS_PRIO_EN		BIT(0)
2069c472a0dSDavid Yang #define YT921X_PORTn_PRIO_ORD(port)	(0x180200 + 4 * (port))
2079c472a0dSDavid Yang #define  YT921X_PORT_PRIO_ORD_APPm_M(m)		GENMASK(3 * (m) + 2, 3 * (m))
2089c472a0dSDavid Yang #define   YT921X_PORT_PRIO_ORD_APPm(m, x)		((x) << (3 * (m)))	/* 0: disabled, except PORT_QOS_PRIO */
2099c472a0dSDavid Yang 
2109c472a0dSDavid Yang enum yt921x_app_selector {
2119c472a0dSDavid Yang 	YT921X_APP_SEL_MAC_SA,
2129c472a0dSDavid Yang 	YT921X_APP_SEL_MAC_DA,
2139c472a0dSDavid Yang 	YT921X_APP_SEL_VID,
2149c472a0dSDavid Yang 	YT921X_APP_SEL_ACL,
2159c472a0dSDavid Yang 	YT921X_APP_SEL_DSCP,
2169c472a0dSDavid Yang 	YT921X_APP_SEL_CVLAN_PCP,
2179c472a0dSDavid Yang 	YT921X_APP_SEL_SVLAN_PCP,
2189c472a0dSDavid Yang 	/* The physical port, i.e. YT921X_PORT_QOS_PRIO */
2199c472a0dSDavid Yang 	YT921X_APP_SEL_PORT,
2209c472a0dSDavid Yang 	YT921X_APP_SEL_NUM
2219c472a0dSDavid Yang };
2229c472a0dSDavid Yang 
2239c472a0dSDavid Yang #define YT921X_VLAN_IGR_FILTER		0x180280
2249c472a0dSDavid Yang #define  YT921X_VLAN_IGR_FILTER_PORTn_BYPASS_IGMP(port)	BIT((port) + 11)
2259c472a0dSDavid Yang #define  YT921X_VLAN_IGR_FILTER_PORTn(port)	BIT(port)
2269c472a0dSDavid Yang #define YT921X_PORTn_ISOLATION(port)	(0x180294 + 4 * (port))
2279c472a0dSDavid Yang #define  YT921X_PORT_ISOLATION_BLOCKn(port)	BIT(port)
2289c472a0dSDavid Yang #define YT921X_STPn(n)			(0x18038c + 4 * (n))
2299c472a0dSDavid Yang #define  YT921X_STP_PORTn_M(port)		GENMASK(2 * (port) + 1, 2 * (port))
2309c472a0dSDavid Yang #define   YT921X_STP_PORTn(port, x)			((x) << (2 * (port)))
2319c472a0dSDavid Yang #define   YT921X_STP_PORTn_DISABLED(port)		YT921X_STP_PORTn(port, 0)
2329c472a0dSDavid Yang #define   YT921X_STP_PORTn_LEARNING(port)		YT921X_STP_PORTn(port, 1)
2339c472a0dSDavid Yang #define   YT921X_STP_PORTn_BLOCKING(port)		YT921X_STP_PORTn(port, 2)
2349c472a0dSDavid Yang #define   YT921X_STP_PORTn_FORWARD(port)		YT921X_STP_PORTn(port, 3)
2359c472a0dSDavid Yang #define YT921X_PORTn_LEARN(port)	(0x1803d0 + 4 * (port))
2369c472a0dSDavid Yang #define  YT921X_PORT_LEARN_VID_LEARN_MULTI_EN	BIT(22)
2379c472a0dSDavid Yang #define  YT921X_PORT_LEARN_VID_LEARN_MODE	BIT(21)
2389c472a0dSDavid Yang #define  YT921X_PORT_LEARN_VID_LEARN_EN		BIT(20)
2399c472a0dSDavid Yang #define  YT921X_PORT_LEARN_SUSPEND_COPY_EN	BIT(19)
2409c472a0dSDavid Yang #define  YT921X_PORT_LEARN_SUSPEND_DROP_EN	BIT(18)
2419c472a0dSDavid Yang #define  YT921X_PORT_LEARN_DIS			BIT(17)
2429c472a0dSDavid Yang #define  YT921X_PORT_LEARN_LIMIT_EN		BIT(16)
2439c472a0dSDavid Yang #define  YT921X_PORT_LEARN_LIMIT_M		GENMASK(15, 8)
2449c472a0dSDavid Yang #define   YT921X_PORT_LEARN_LIMIT(x)			FIELD_PREP(YT921X_PORT_LEARN_LIMIT_M, (x))
2459c472a0dSDavid Yang #define  YT921X_PORT_LEARN_DROP_ON_EXCEEDED	BIT(2)
2469c472a0dSDavid Yang #define  YT921X_PORT_LEARN_MODE_M		GENMASK(1, 0)
2479c472a0dSDavid Yang #define   YT921X_PORT_LEARN_MODE(x)			FIELD_PREP(YT921X_PORT_LEARN_MODE_M, (x))
2489c472a0dSDavid Yang #define   YT921X_PORT_LEARN_MODE_AUTO			YT921X_PORT_LEARN_MODE(0)
2499c472a0dSDavid Yang #define   YT921X_PORT_LEARN_MODE_AUTO_AND_COPY		YT921X_PORT_LEARN_MODE(1)
2509c472a0dSDavid Yang #define   YT921X_PORT_LEARN_MODE_CPU_CONTROL		YT921X_PORT_LEARN_MODE(2)
2519c472a0dSDavid Yang #define YT921X_AGEING			0x180440
2529c472a0dSDavid Yang #define  YT921X_AGEING_INTERVAL_M		GENMASK(15, 0)
2539c472a0dSDavid Yang #define YT921X_FDB_IN0			0x180454
2549c472a0dSDavid Yang #define YT921X_FDB_IN1			0x180458
2559c472a0dSDavid Yang #define YT921X_FDB_IN2			0x18045c
2569c472a0dSDavid Yang #define YT921X_FDB_OP			0x180460
2579c472a0dSDavid Yang #define  YT921X_FDB_OP_INDEX_M			GENMASK(22, 11)
2589c472a0dSDavid Yang #define   YT921X_FDB_OP_INDEX(x)			FIELD_PREP(YT921X_FDB_OP_INDEX_M, (x))
2599c472a0dSDavid Yang #define  YT921X_FDB_OP_MODE_INDEX		BIT(10)  /* mac+fid / index */
2609c472a0dSDavid Yang #define  YT921X_FDB_OP_FLUSH_MCAST		BIT(9)  /* ucast / mcast */
2619c472a0dSDavid Yang #define  YT921X_FDB_OP_FLUSH_M			GENMASK(8, 7)
2629c472a0dSDavid Yang #define   YT921X_FDB_OP_FLUSH(x)			FIELD_PREP(YT921X_FDB_OP_FLUSH_M, (x))
2639c472a0dSDavid Yang #define   YT921X_FDB_OP_FLUSH_ALL			YT921X_FDB_OP_FLUSH(0)
2649c472a0dSDavid Yang #define   YT921X_FDB_OP_FLUSH_PORT			YT921X_FDB_OP_FLUSH(1)
2659c472a0dSDavid Yang #define   YT921X_FDB_OP_FLUSH_PORT_VID			YT921X_FDB_OP_FLUSH(2)
2669c472a0dSDavid Yang #define   YT921X_FDB_OP_FLUSH_VID			YT921X_FDB_OP_FLUSH(3)
2679c472a0dSDavid Yang #define  YT921X_FDB_OP_FLUSH_STATIC		BIT(6)
2689c472a0dSDavid Yang #define  YT921X_FDB_OP_NEXT_TYPE_M		GENMASK(5, 4)
2699c472a0dSDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE(x)			FIELD_PREP(YT921X_FDB_OP_NEXT_TYPE_M, (x))
2709c472a0dSDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_UCAST_PORT		YT921X_FDB_OP_NEXT_TYPE(0)
2719c472a0dSDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_UCAST_VID		YT921X_FDB_OP_NEXT_TYPE(1)
2729c472a0dSDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_UCAST			YT921X_FDB_OP_NEXT_TYPE(2)
2739c472a0dSDavid Yang #define   YT921X_FDB_OP_NEXT_TYPE_MCAST			YT921X_FDB_OP_NEXT_TYPE(3)
2749c472a0dSDavid Yang #define  YT921X_FDB_OP_OP_M			GENMASK(3, 1)
2759c472a0dSDavid Yang #define   YT921X_FDB_OP_OP(x)				FIELD_PREP(YT921X_FDB_OP_OP_M, (x))
2769c472a0dSDavid Yang #define   YT921X_FDB_OP_OP_ADD				YT921X_FDB_OP_OP(0)
2779c472a0dSDavid Yang #define   YT921X_FDB_OP_OP_DEL				YT921X_FDB_OP_OP(1)
2789c472a0dSDavid Yang #define   YT921X_FDB_OP_OP_GET_ONE			YT921X_FDB_OP_OP(2)
2799c472a0dSDavid Yang #define   YT921X_FDB_OP_OP_GET_NEXT			YT921X_FDB_OP_OP(3)
2809c472a0dSDavid Yang #define   YT921X_FDB_OP_OP_FLUSH			YT921X_FDB_OP_OP(4)
2819c472a0dSDavid Yang #define  YT921X_FDB_OP_START			BIT(0)
2829c472a0dSDavid Yang #define YT921X_FDB_RESULT		0x180464
2839c472a0dSDavid Yang #define  YT921X_FDB_RESULT_DONE			BIT(15)
2849c472a0dSDavid Yang #define  YT921X_FDB_RESULT_NOTFOUND		BIT(14)
2859c472a0dSDavid Yang #define  YT921X_FDB_RESULT_OVERWRITED		BIT(13)
2869c472a0dSDavid Yang #define  YT921X_FDB_RESULT_INDEX_M		GENMASK(11, 0)
2879c472a0dSDavid Yang #define   YT921X_FDB_RESULT_INDEX(x)			FIELD_PREP(YT921X_FDB_RESULT_INDEX_M, (x))
2889c472a0dSDavid Yang #define YT921X_FDB_OUT0			0x1804b0
2899c472a0dSDavid Yang #define  YT921X_FDB_IO0_ADDR_HI4_M		GENMASK(31, 0)
2909c472a0dSDavid Yang #define YT921X_FDB_OUT1			0x1804b4
2919c472a0dSDavid Yang #define  YT921X_FDB_IO1_EGR_PRIO_EN		BIT(31)
2929c472a0dSDavid Yang #define  YT921X_FDB_IO1_STATUS_M		GENMASK(30, 28)
2939c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS(x)			FIELD_PREP(YT921X_FDB_IO1_STATUS_M, (x))
2949c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS_INVALID			YT921X_FDB_IO1_STATUS(0)
2959c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS_MIN_TIME		YT921X_FDB_IO1_STATUS(1)
2969c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS_MOVE_AGING_MAX_TIME	YT921X_FDB_IO1_STATUS(3)
2979c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS_MAX_TIME		YT921X_FDB_IO1_STATUS(5)
2989c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS_PENDING			YT921X_FDB_IO1_STATUS(6)
2999c472a0dSDavid Yang #define   YT921X_FDB_IO1_STATUS_STATIC			YT921X_FDB_IO1_STATUS(7)
3009c472a0dSDavid Yang #define  YT921X_FDB_IO1_FID_M			GENMASK(27, 16)  /* filtering ID (VID) */
3019c472a0dSDavid Yang #define   YT921X_FDB_IO1_FID(x)				FIELD_PREP(YT921X_FDB_IO1_FID_M, (x))
3029c472a0dSDavid Yang #define  YT921X_FDB_IO1_ADDR_LO2_M		GENMASK(15, 0)
3039c472a0dSDavid Yang #define YT921X_FDB_OUT2			0x1804b8
3049c472a0dSDavid Yang #define  YT921X_FDB_IO2_MOVE_AGING_STATUS_M	GENMASK(31, 30)
3059c472a0dSDavid Yang #define  YT921X_FDB_IO2_IGR_DROP		BIT(29)
3069c472a0dSDavid Yang #define  YT921X_FDB_IO2_EGR_PORTS_M		GENMASK(28, 18)
3079c472a0dSDavid Yang #define   YT921X_FDB_IO2_EGR_PORTS(x)			FIELD_PREP(YT921X_FDB_IO2_EGR_PORTS_M, (x))
3089c472a0dSDavid Yang #define  YT921X_FDB_IO2_EGR_DROP		BIT(17)
3099c472a0dSDavid Yang #define  YT921X_FDB_IO2_COPY_TO_CPU		BIT(16)
3109c472a0dSDavid Yang #define  YT921X_FDB_IO2_IGR_PRIO_EN		BIT(15)
3119c472a0dSDavid Yang #define  YT921X_FDB_IO2_PRIO_M			GENMASK(14, 12)
3129c472a0dSDavid Yang #define   YT921X_FDB_IO2_PRIO(x)			FIELD_PREP(YT921X_FDB_IO2_PRIO_M, (x))
3139c472a0dSDavid Yang #define  YT921X_FDB_IO2_NEW_VID_M		GENMASK(11, 0)
3149c472a0dSDavid Yang #define   YT921X_FDB_IO2_NEW_VID(x)			FIELD_PREP(YT921X_FDB_IO2_NEW_VID_M, (x))
3159c472a0dSDavid Yang #define YT921X_FILTER_UNK_UCAST		0x180508
3169c472a0dSDavid Yang #define YT921X_FILTER_UNK_MCAST		0x18050c
3179c472a0dSDavid Yang #define YT921X_FILTER_MCAST		0x180510
3189c472a0dSDavid Yang #define YT921X_FILTER_BCAST		0x180514
3199c472a0dSDavid Yang #define  YT921X_FILTER_PORTS_M			GENMASK(10, 0)
3209c472a0dSDavid Yang #define   YT921X_FILTER_PORTS(x)			FIELD_PREP(YT921X_FILTER_PORTS_M, (x))
3219c472a0dSDavid Yang #define  YT921X_FILTER_PORTn(port)		BIT(port)
3229c472a0dSDavid Yang #define YT921X_VLAN_EGR_FILTER		0x180598
3239c472a0dSDavid Yang #define  YT921X_VLAN_EGR_FILTER_PORTn(port)	BIT(port)
3249c472a0dSDavid Yang #define YT921X_LAG_GROUPn(n)		(0x1805a8 + 4 * (n))
3259c472a0dSDavid Yang #define  YT921X_LAG_GROUP_PORTS_M		GENMASK(13, 3)
3269c472a0dSDavid Yang #define   YT921X_LAG_GROUP_PORTS(x)			FIELD_PREP(YT921X_LAG_GROUP_PORTS_M, (x))
3279c472a0dSDavid Yang #define  YT921X_LAG_GROUP_MEMBER_NUM_M		GENMASK(2, 0)
3289c472a0dSDavid Yang #define   YT921X_LAG_GROUP_MEMBER_NUM(x)		FIELD_PREP(YT921X_LAG_GROUP_MEMBER_NUM_M, (x))
3299c472a0dSDavid Yang #define YT921X_LAG_MEMBERnm(n, m)	(0x1805b0 + 4 * (4 * (n) + (m)))
3309c472a0dSDavid Yang #define  YT921X_LAG_MEMBER_PORT_M		GENMASK(3, 0)
3319c472a0dSDavid Yang #define   YT921X_LAG_MEMBER_PORT(x)			FIELD_PREP(YT921X_LAG_MEMBER_PORT_M, (x))
3329c472a0dSDavid Yang #define YT921X_CPU_COPY			0x180690
3339c472a0dSDavid Yang #define  YT921X_CPU_COPY_FORCE_INT_PORT		BIT(2)
3349c472a0dSDavid Yang #define  YT921X_CPU_COPY_TO_INT_CPU		BIT(1)
3359c472a0dSDavid Yang #define  YT921X_CPU_COPY_TO_EXT_CPU		BIT(0)
3369c472a0dSDavid Yang #define YT921X_ACL_PERMIT_UNMATCH	0x1806a0
3379c472a0dSDavid Yang #define  YT921X_ACL_PERMIT_UNMATCH_PORTS_M	GENMASK(10, 0)
3389c472a0dSDavid Yang #define   YT921X_ACL_PERMIT_UNMATCH_PORTS(x)		FIELD_PREP(YT921X_ACL_PERMIT_UNMATCH_PORTS_M, (x))
3399c472a0dSDavid Yang #define  YT921X_ACL_PERMIT_UNMATCH_PORTn(port)	BIT(port)
3409c472a0dSDavid Yang #define YT921X_ACT_UNK_UCAST		0x180734
3419c472a0dSDavid Yang #define YT921X_ACT_UNK_MCAST		0x180738
3429c472a0dSDavid Yang #define  YT921X_ACT_UNK_MCAST_BYPASS_DROP_RMA	BIT(23)
3439c472a0dSDavid Yang #define  YT921X_ACT_UNK_MCAST_BYPASS_DROP_IGMP	BIT(22)
3449c472a0dSDavid Yang #define  YT921X_ACT_UNK_ACTn_M(port)		GENMASK(2 * (port) + 1, 2 * (port))
3459c472a0dSDavid Yang #define   YT921X_ACT_UNK_ACTn(port, x)			((x) << (2 * (port)))
3469c472a0dSDavid Yang #define   YT921X_ACT_UNK_ACTn_FORWARD(port)		YT921X_ACT_UNK_ACTn(port, 0)  /* flood */
3479c472a0dSDavid Yang #define   YT921X_ACT_UNK_ACTn_TRAP(port)		YT921X_ACT_UNK_ACTn(port, 1)  /* steer to CPU */
3489c472a0dSDavid Yang #define   YT921X_ACT_UNK_ACTn_DROP(port)		YT921X_ACT_UNK_ACTn(port, 2)  /* discard */
3499c472a0dSDavid Yang /* NEVER use this action; see comments in the tag driver */
3509c472a0dSDavid Yang #define   YT921X_ACT_UNK_ACTn_COPY(port)		YT921X_ACT_UNK_ACTn(port, 3)  /* flood and copy */
3519c472a0dSDavid Yang #define YT921X_FDB_HW_FLUSH		0x180958
3529c472a0dSDavid Yang #define  YT921X_FDB_HW_FLUSH_ON_LINKDOWN	BIT(0)
3539c472a0dSDavid Yang 
3549c472a0dSDavid Yang #define YT921X_VLANn_CTRL(vlan)		(0x188000 + 8 * (vlan))
3559c472a0dSDavid Yang #define  YT921X_VLAN_CTRLb_UNTAG_PORTS_M	GENMASK(18, 8)
3569c472a0dSDavid Yang #define   YT921X_VLAN_CTRLb_UNTAG_PORTS(x)		FIELD_PREP(YT921X_VLAN_CTRLb_UNTAG_PORTS_M, (x))
3579c472a0dSDavid Yang #define  YT921X_VLAN_CTRLb_UNTAG_PORTn(port)	BIT((port) + 8)
3589c472a0dSDavid Yang #define  YT921X_VLAN_CTRLb_STP_ID_M		GENMASK(7, 4)
3599c472a0dSDavid Yang #define   YT921X_VLAN_CTRLb_STP_ID(x)			FIELD_PREP(YT921X_VLAN_CTRLb_STP_ID_M, (x))
3609c472a0dSDavid Yang #define  YT921X_VLAN_CTRLb_SVLAN_EN		BIT(3)
3619c472a0dSDavid Yang #define  YT921X_VLAN_CTRLab_FID_M		GENMASK_ULL(34, 23)
3629c472a0dSDavid Yang #define   YT921X_VLAN_CTRLab_FID(x)			FIELD_PREP(YT921X_VLAN_CTRLab_FID_M, (x))
3639c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_LEARN_DIS		BIT(22)
3649c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_PRIO_EN		BIT(21)
3659c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_PRIO_M		GENMASK(20, 18)
3669c472a0dSDavid Yang #define   YT921X_VLAN_CTRLa_PRIO(x)			FIELD_PREP(YT921X_VLAN_CTRLa_PRIO_M, (x))
3679c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_PORTS_M		GENMASK(17, 7)
3689c472a0dSDavid Yang #define   YT921X_VLAN_CTRLa_PORTS(x)			FIELD_PREP(YT921X_VLAN_CTRLa_PORTS_M, (x))
3699c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_PORTn(port)		BIT((port) + 7)
3709c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_BYPASS_1X_AC		BIT(6)
3719c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_METER_EN		BIT(5)
3729c472a0dSDavid Yang #define  YT921X_VLAN_CTRLa_METER_ID_M		GENMASK(4, 0)
3739c472a0dSDavid Yang 
3749c472a0dSDavid Yang #define YT921X_TPID_IGRn(x)		(0x210000 + 4 * (x))	/* [0, 3] */
3759c472a0dSDavid Yang #define  YT921X_TPID_IGR_TPID_M			GENMASK(15, 0)
3769c472a0dSDavid Yang #define YT921X_PORTn_IGR_TPID(port)	(0x210010 + 4 * (port))
3779c472a0dSDavid Yang #define  YT921X_PORT_IGR_TPIDn_STAG_M		GENMASK(7, 4)
3789c472a0dSDavid Yang #define  YT921X_PORT_IGR_TPIDn_STAG(x)		BIT((x) + 4)
3799c472a0dSDavid Yang #define  YT921X_PORT_IGR_TPIDn_CTAG_M		GENMASK(3, 0)
3809c472a0dSDavid Yang #define  YT921X_PORT_IGR_TPIDn_CTAG(x)		BIT(x)
3819c472a0dSDavid Yang #define YT921X_LAG_HASH			0x210090
3829c472a0dSDavid Yang #define  YT921X_LAG_HASH_L4_SPORT		BIT(7)
3839c472a0dSDavid Yang #define  YT921X_LAG_HASH_L4_DPORT		BIT(6)
3849c472a0dSDavid Yang #define  YT921X_LAG_HASH_IP_PROTO		BIT(5)
3859c472a0dSDavid Yang #define  YT921X_LAG_HASH_IP_SRC			BIT(4)
3869c472a0dSDavid Yang #define  YT921X_LAG_HASH_IP_DST			BIT(3)
3879c472a0dSDavid Yang #define  YT921X_LAG_HASH_MAC_SA			BIT(2)
3889c472a0dSDavid Yang #define  YT921X_LAG_HASH_MAC_DA			BIT(1)
3899c472a0dSDavid Yang #define  YT921X_LAG_HASH_SRC_PORT		BIT(0)
3909c472a0dSDavid Yang 
3919c472a0dSDavid Yang #define YT921X_PORTn_VLAN_CTRL(port)	(0x230010 + 4 * (port))
3929c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL_SVLAN_PRIO_EN	BIT(31)
3939c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL_CVLAN_PRIO_EN	BIT(30)
3949c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL_SVID_M		GENMASK(29, 18)
3959c472a0dSDavid Yang #define   YT921X_PORT_VLAN_CTRL_SVID(x)			FIELD_PREP(YT921X_PORT_VLAN_CTRL_SVID_M, (x))
3969c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL_CVID_M		GENMASK(17, 6)
3979c472a0dSDavid Yang #define   YT921X_PORT_VLAN_CTRL_CVID(x)			FIELD_PREP(YT921X_PORT_VLAN_CTRL_CVID_M, (x))
3989c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL_SVLAN_PRIO_M	GENMASK(5, 3)
3999c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL_CVLAN_PRIO_M	GENMASK(2, 0)
4009c472a0dSDavid Yang #define YT921X_PORTn_VLAN_CTRL1(port)	(0x230080 + 4 * (port))
4019c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_EN	BIT(8)
4029c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL1_VLAN_RANGE_PROFILE_ID_M	GENMASK(7, 4)
4039c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_TAGGED	BIT(3)
4049c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL1_SVLAN_DROP_UNTAGGED	BIT(2)
4059c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_TAGGED	BIT(1)
4069c472a0dSDavid Yang #define  YT921X_PORT_VLAN_CTRL1_CVLAN_DROP_UNTAGGED	BIT(0)
4079c472a0dSDavid Yang 
4089c472a0dSDavid Yang #define YT921X_EDATA_EXTMODE	0xfb
4099c472a0dSDavid Yang #define YT921X_EDATA_LEN	0x100
4109c472a0dSDavid Yang 
4119c472a0dSDavid Yang #define YT921X_FDB_NUM	4096
4129c472a0dSDavid Yang 
4139c472a0dSDavid Yang enum yt921x_fdb_entry_status {
4149c472a0dSDavid Yang 	YT921X_FDB_ENTRY_STATUS_INVALID = 0,
4159c472a0dSDavid Yang 	YT921X_FDB_ENTRY_STATUS_MIN_TIME = 1,
4169c472a0dSDavid Yang 	YT921X_FDB_ENTRY_STATUS_MOVE_AGING_MAX_TIME = 3,
4179c472a0dSDavid Yang 	YT921X_FDB_ENTRY_STATUS_MAX_TIME = 5,
4189c472a0dSDavid Yang 	YT921X_FDB_ENTRY_STATUS_PENDING = 6,
4199c472a0dSDavid Yang 	YT921X_FDB_ENTRY_STATUS_STATIC = 7,
4209c472a0dSDavid Yang };
4219c472a0dSDavid Yang 
4229c472a0dSDavid Yang #define YT921X_MSTI_NUM		16
4239c472a0dSDavid Yang 
4249c472a0dSDavid Yang /* Custom meters only, not including dedicated port meters (11) */
4259c472a0dSDavid Yang #define YT921X_METER_NUM	64
4269c472a0dSDavid Yang 
4279c472a0dSDavid Yang #define YT921X_LAG_NUM		2
4289c472a0dSDavid Yang #define YT921X_LAG_PORT_NUM	4
4299c472a0dSDavid Yang 
4309c472a0dSDavid Yang #define YT921X_PRIO_NUM	8
4319c472a0dSDavid Yang 
4329c472a0dSDavid Yang #define YT9215_MAJOR	0x9002
4339c472a0dSDavid Yang #define YT9218_MAJOR	0x9001
4349c472a0dSDavid Yang 
4359c472a0dSDavid Yang /* required for a hard reset */
4369c472a0dSDavid Yang #define YT921X_RST_DELAY_US	10000
4379c472a0dSDavid Yang 
4389c472a0dSDavid Yang #define YT921X_FRAME_SIZE_MAX	0x2400  /* 9216 */
4399c472a0dSDavid Yang 
4409c472a0dSDavid Yang #define YT921X_TAG_LEN	8
4419c472a0dSDavid Yang 
4429c472a0dSDavid Yang #define YT921X_ACL_BLK_NUM	48
443*279d5c8aSDavid Yang #define YT921X_UDF_NUM		16
4449c472a0dSDavid Yang 
4459af9a816SDavid Yang #define YT921X_LED_GROUP_NUM	3
4469af9a816SDavid Yang #define YT921X_LED_PORT_NUM	10
4479af9a816SDavid Yang 
4489c472a0dSDavid Yang /* 8 internal + 2 external + 1 mcu */
4499c472a0dSDavid Yang #define YT921X_PORT_NUM			11
4509c472a0dSDavid Yang 
4519af9a816SDavid Yang #define YT921X_NAME	"yt921x"
4529af9a816SDavid Yang 
4539c472a0dSDavid Yang struct yt921x_port {
4549c472a0dSDavid Yang 	unsigned char index;
4559c472a0dSDavid Yang 
45607b60e1bSDavid Yang 	/* SerDes in use */
45707b60e1bSDavid Yang 	bool serdes:1;
4584b8fbb87SDavid Yang 	/* Link from in-band status (PHYLINK_PCS_NEG_INBAND) */
4594b8fbb87SDavid Yang 	bool inband:1;
46007b60e1bSDavid Yang 	/* BR_HAIRPIN_MODE */
46107b60e1bSDavid Yang 	bool hairpin:1;
46207b60e1bSDavid Yang 	/* BR_ISOLATED */
46307b60e1bSDavid Yang 	bool isolated:1;
4649c472a0dSDavid Yang 
46573db071aSDavid Yang 	unsigned short acl_cnt;
46673db071aSDavid Yang 
4679af9a816SDavid Yang #if IS_ENABLED(CONFIG_NET_DSA_YT921X_LEDS)
4689af9a816SDavid Yang 	unsigned char led_duty;
4699af9a816SDavid Yang 	unsigned short led_cycle;
4709af9a816SDavid Yang 
4719af9a816SDavid Yang 	unsigned char led_duty_mask;
4729af9a816SDavid Yang 	unsigned char led_cycle_mask;
4739af9a816SDavid Yang 
4749af9a816SDavid Yang 	struct yt921x_led *leds[YT921X_LED_GROUP_NUM];
4759af9a816SDavid Yang #endif
4764b8fbb87SDavid Yang 
477a219b5eaSDavid Yang 	struct yt921x_mib *mib;
4784b8fbb87SDavid Yang 	struct phylink_pcs pcs;
4799c472a0dSDavid Yang };
4809c472a0dSDavid Yang 
4814b8fbb87SDavid Yang #define pcs_to_yt921x_port(_pcs) container_of((_pcs), struct yt921x_port, pcs)
4824b8fbb87SDavid Yang 
4839c472a0dSDavid Yang struct yt921x_reg_ops {
4849c472a0dSDavid Yang 	int (*read)(void *context, u32 reg, u32 *valp);
4859c472a0dSDavid Yang 	int (*write)(void *context, u32 reg, u32 val);
4869c472a0dSDavid Yang };
4879c472a0dSDavid Yang 
488605597afSDavid Yang struct yt921x_info {
489605597afSDavid Yang 	const char *name;
490605597afSDavid Yang 	u16 major;
491605597afSDavid Yang 	/* Unknown, seems to be plain enumeration */
492605597afSDavid Yang 	u8 mode;
493605597afSDavid Yang 	u8 extmode;
494605597afSDavid Yang 	/* Ports with integral GbE PHYs, not including MCU Port 10 */
495605597afSDavid Yang 	u16 internal_mask;
496605597afSDavid Yang 	/* Note: xmii_mask and serdes_mask may overlap */
497605597afSDavid Yang 	u16 xmii_mask;
498605597afSDavid Yang 	u16 serdes_mask;
499605597afSDavid Yang };
500605597afSDavid Yang 
501a219b5eaSDavid Yang static inline u16 yt921x_info_ports_mask(const struct yt921x_info *info)
502a219b5eaSDavid Yang {
503a219b5eaSDavid Yang 	return info->internal_mask | info->xmii_mask | info->serdes_mask;
504a219b5eaSDavid Yang }
505a219b5eaSDavid Yang 
5069c472a0dSDavid Yang struct yt921x_priv {
5079c472a0dSDavid Yang 	struct dsa_switch ds;
5089c472a0dSDavid Yang 
5099c472a0dSDavid Yang 	const struct yt921x_info *info;
5109c472a0dSDavid Yang 	unsigned int meter_slot_ns;
5119c472a0dSDavid Yang 	unsigned int port_shape_slot_ns;
5129c472a0dSDavid Yang 	/* cache of dsa_cpu_ports(ds) */
5139c472a0dSDavid Yang 	u16 cpu_ports_mask;
5149c472a0dSDavid Yang 	unsigned char cycle_ns;
5159c472a0dSDavid Yang 
5169c472a0dSDavid Yang 	/* protect the access to the switch registers */
5179c472a0dSDavid Yang 	struct mutex reg_lock;
5189c472a0dSDavid Yang 	const struct yt921x_reg_ops *reg_ops;
5199c472a0dSDavid Yang 	void *reg_ctx;
5209c472a0dSDavid Yang 
5219c472a0dSDavid Yang 	/* mdio master bus */
5229c472a0dSDavid Yang 	struct mii_bus *mbus_int;
5239c472a0dSDavid Yang 	struct mii_bus *mbus_ext;
5249c472a0dSDavid Yang 
5259c472a0dSDavid Yang 	struct yt921x_port ports[YT921X_PORT_NUM];
5269c472a0dSDavid Yang 
5279c472a0dSDavid Yang 	u16 eee_ports_mask;
5289c472a0dSDavid Yang 
5299c472a0dSDavid Yang 	DECLARE_BITMAP(meters_map, YT921X_METER_NUM);
5309c472a0dSDavid Yang 
5319c472a0dSDavid Yang 	u8 acl_masks[YT921X_ACL_BLK_NUM];
5329c472a0dSDavid Yang 	struct yt921x_acl_blk *acl_blks[YT921X_ACL_BLK_NUM];
5339c472a0dSDavid Yang };
5349c472a0dSDavid Yang 
535cece0b57SDavid Yang #define dsa_to_yt921x_priv(_ds) container_of_const(_ds, struct yt921x_priv, ds)
536c9996cf7SDavid Yang #define yt921x_port_to_priv(pp) \
537c9996cf7SDavid Yang 	container_of_const((pp), struct yt921x_priv, ports[(pp)->index])
538cece0b57SDavid Yang #define yt921x_priv_to_device(priv) ((priv)->ds.dev)
539c9996cf7SDavid Yang 
5405423f892SDavid Yang static inline int ethtool_speed_to_yt921x(int speed)
5415423f892SDavid Yang {
5425423f892SDavid Yang 	switch (speed) {
5435423f892SDavid Yang 	case SPEED_10:
5445423f892SDavid Yang 		return YT921X_SPEED_10;
5455423f892SDavid Yang 	case SPEED_100:
5465423f892SDavid Yang 		return YT921X_SPEED_100;
5475423f892SDavid Yang 	case SPEED_1000:
5485423f892SDavid Yang 		return YT921X_SPEED_1000;
5495423f892SDavid Yang 	case SPEED_2500:
5505423f892SDavid Yang 		return YT921X_SPEED_2500;
5515423f892SDavid Yang 	case SPEED_10000:
5525423f892SDavid Yang 		return YT921X_SPEED_10000;
5535423f892SDavid Yang 	default:
5545423f892SDavid Yang 		return YT921X_SPEED_INVALID;
5555423f892SDavid Yang 	}
5565423f892SDavid Yang }
5575423f892SDavid Yang 
558ba13bd27SDavid Yang static inline u32 ethaddr_hi4_to_u32(const unsigned char *addr)
559ba13bd27SDavid Yang {
560ba13bd27SDavid Yang 	return (addr[0] << 24) | (addr[1] << 16) | (addr[2] << 8) | addr[3];
561ba13bd27SDavid Yang }
562ba13bd27SDavid Yang 
563ba13bd27SDavid Yang static inline u32 ethaddr_lo2_to_u32(const unsigned char *addr)
564ba13bd27SDavid Yang {
565ba13bd27SDavid Yang 	return (addr[4] << 8) | addr[5];
566ba13bd27SDavid Yang }
567ba13bd27SDavid Yang 
5689c472a0dSDavid Yang #endif
569