blob: 65bc9fcc047f0a84cd32ce5f94435bda396901d2 [file] [log] [blame]
Weijie Gao23f17162018-12-20 16:12:53 +08001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright (C) 2018 MediaTek Inc.
4 *
5 * Author: Weijie Gao <weijie.gao@mediatek.com>
6 * Author: Mark Lee <mark-mc.lee@mediatek.com>
7 */
8
9#ifndef _MTK_ETH_H_
10#define _MTK_ETH_H_
11
Simon Glasscd93d622020-05-10 11:40:13 -060012#include <linux/bitops.h>
Weijie Gao7d928c32022-09-09 19:59:24 +080013#include <linux/bitfield.h>
Weijie Gao62596722022-09-09 19:59:21 +080014
15enum mkt_eth_capabilities {
16 MTK_TRGMII_BIT,
17 MTK_TRGMII_MT7621_CLK_BIT,
18
19 /* PATH BITS */
20 MTK_ETH_PATH_GMAC1_TRGMII_BIT,
21};
22
23#define MTK_TRGMII BIT(MTK_TRGMII_BIT)
24#define MTK_TRGMII_MT7621_CLK BIT(MTK_TRGMII_MT7621_CLK_BIT)
25
26/* Supported path present on SoCs */
27#define MTK_ETH_PATH_GMAC1_TRGMII BIT(MTK_ETH_PATH_GMAC1_TRGMII_BIT)
28
29#define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII)
30
31#define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x))
32
33#define MT7621_CAPS (MTK_GMAC1_TRGMII | MTK_TRGMII_MT7621_CLK)
34
35#define MT7623_CAPS (MTK_GMAC1_TRGMII)
36
37/* Frame Engine Register Bases */
Weijie Gao23f17162018-12-20 16:12:53 +080038#define PDMA_BASE 0x0800
39#define GDMA1_BASE 0x0500
40#define GDMA2_BASE 0x1500
41#define GMAC_BASE 0x10000
42
43/* Ethernet subsystem registers */
44
45#define ETHSYS_SYSCFG0_REG 0x14
46#define SYSCFG0_GE_MODE_S(n) (12 + ((n) * 2))
47#define SYSCFG0_GE_MODE_M 0x3
MarkLeeb4ef49a2020-01-21 19:31:57 +080048#define SYSCFG0_SGMII_SEL_M (0x3 << 8)
49#define SYSCFG0_SGMII_SEL(gmac) ((!(gmac)) ? BIT(9) : BIT(8))
Weijie Gao23f17162018-12-20 16:12:53 +080050
51#define ETHSYS_CLKCFG0_REG 0x2c
52#define ETHSYS_TRGMII_CLK_SEL362_5 BIT(11)
53
54/* SYSCFG0_GE_MODE: GE Modes */
55#define GE_MODE_RGMII 0
56#define GE_MODE_MII 1
57#define GE_MODE_MII_PHY 2
58#define GE_MODE_RMII 3
59
MarkLeeb4ef49a2020-01-21 19:31:57 +080060/* SGMII subsystem config registers */
61#define SGMSYS_PCS_CONTROL_1 0x0
Landen Chao532de8d2020-02-18 16:49:37 +080062#define SGMII_LINK_STATUS BIT(18)
MarkLeeb4ef49a2020-01-21 19:31:57 +080063#define SGMII_AN_ENABLE BIT(12)
Landen Chao532de8d2020-02-18 16:49:37 +080064#define SGMII_AN_RESTART BIT(9)
MarkLeeb4ef49a2020-01-21 19:31:57 +080065
66#define SGMSYS_SGMII_MODE 0x20
67#define SGMII_FORCE_MODE 0x31120019
68
69#define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8
70#define SGMII_PHYA_PWD BIT(4)
71
72#define SGMSYS_GEN2_SPEED 0x2028
MarkLeef0236b72020-06-19 19:17:16 +080073#define SGMSYS_GEN2_SPEED_V2 0x128
MarkLeeb4ef49a2020-01-21 19:31:57 +080074#define SGMSYS_SPEED_2500 BIT(2)
75
Weijie Gao23f17162018-12-20 16:12:53 +080076/* Frame Engine Registers */
77
78/* PDMA */
79#define TX_BASE_PTR_REG(n) (0x000 + (n) * 0x10)
80#define TX_MAX_CNT_REG(n) (0x004 + (n) * 0x10)
81#define TX_CTX_IDX_REG(n) (0x008 + (n) * 0x10)
82#define TX_DTX_IDX_REG(n) (0x00c + (n) * 0x10)
83
84#define RX_BASE_PTR_REG(n) (0x100 + (n) * 0x10)
85#define RX_MAX_CNT_REG(n) (0x104 + (n) * 0x10)
86#define RX_CRX_IDX_REG(n) (0x108 + (n) * 0x10)
87#define RX_DRX_IDX_REG(n) (0x10c + (n) * 0x10)
88
89#define PDMA_GLO_CFG_REG 0x204
90#define TX_WB_DDONE BIT(6)
91#define RX_DMA_BUSY BIT(3)
92#define RX_DMA_EN BIT(2)
93#define TX_DMA_BUSY BIT(1)
94#define TX_DMA_EN BIT(0)
95
96#define PDMA_RST_IDX_REG 0x208
97#define RST_DRX_IDX0 BIT(16)
98#define RST_DTX_IDX0 BIT(0)
99
100/* GDMA */
101#define GDMA_IG_CTRL_REG 0x000
102#define GDM_ICS_EN BIT(22)
103#define GDM_TCS_EN BIT(21)
104#define GDM_UCS_EN BIT(20)
105#define STRP_CRC BIT(16)
106#define MYMAC_DP_S 12
107#define MYMAC_DP_M 0xf000
108#define BC_DP_S 8
109#define BC_DP_M 0xf00
110#define MC_DP_S 4
111#define MC_DP_M 0xf0
112#define UN_DP_S 0
113#define UN_DP_M 0x0f
114
115#define GDMA_MAC_LSB_REG 0x008
116
117#define GDMA_MAC_MSB_REG 0x00c
118
119/* MYMAC_DP/BC_DP/MC_DP/UN_DP: Destination ports */
120#define DP_PDMA 0
121#define DP_GDMA1 1
122#define DP_GDMA2 2
123#define DP_PPE 4
124#define DP_QDMA 5
125#define DP_DISCARD 7
126
127/* GMAC Registers */
128
129#define GMAC_PIAC_REG 0x0004
130#define PHY_ACS_ST BIT(31)
131#define MDIO_REG_ADDR_S 25
132#define MDIO_REG_ADDR_M 0x3e000000
133#define MDIO_PHY_ADDR_S 20
134#define MDIO_PHY_ADDR_M 0x1f00000
135#define MDIO_CMD_S 18
136#define MDIO_CMD_M 0xc0000
137#define MDIO_ST_S 16
138#define MDIO_ST_M 0x30000
139#define MDIO_RW_DATA_S 0
140#define MDIO_RW_DATA_M 0xffff
141
142/* MDIO_CMD: MDIO commands */
143#define MDIO_CMD_ADDR 0
144#define MDIO_CMD_WRITE 1
145#define MDIO_CMD_READ 2
146#define MDIO_CMD_READ_C45 3
147
148/* MDIO_ST: MDIO start field */
149#define MDIO_ST_C45 0
150#define MDIO_ST_C22 1
151
152#define GMAC_PORT_MCR(p) (0x0100 + (p) * 0x100)
153#define MAC_RX_PKT_LEN_S 24
154#define MAC_RX_PKT_LEN_M 0x3000000
155#define IPG_CFG_S 18
156#define IPG_CFG_M 0xc0000
157#define MAC_MODE BIT(16)
158#define FORCE_MODE BIT(15)
159#define MAC_TX_EN BIT(14)
160#define MAC_RX_EN BIT(13)
161#define BKOFF_EN BIT(9)
162#define BACKPR_EN BIT(8)
163#define FORCE_RX_FC BIT(5)
164#define FORCE_TX_FC BIT(4)
165#define FORCE_SPD_S 2
166#define FORCE_SPD_M 0x0c
167#define FORCE_DPX BIT(1)
168#define FORCE_LINK BIT(0)
169
Landen Chao532de8d2020-02-18 16:49:37 +0800170/* Values of IPG_CFG */
171#define IPG_96BIT 0
172#define IPG_96BIT_WITH_SHORT_IPG 1
173#define IPG_64BIT 2
174
Weijie Gao23f17162018-12-20 16:12:53 +0800175/* MAC_RX_PKT_LEN: Max RX packet length */
176#define MAC_RX_PKT_LEN_1518 0
177#define MAC_RX_PKT_LEN_1536 1
178#define MAC_RX_PKT_LEN_1552 2
179#define MAC_RX_PKT_LEN_JUMBO 3
180
181/* FORCE_SPD: Forced link speed */
182#define SPEED_10M 0
183#define SPEED_100M 1
184#define SPEED_1000M 2
185
186#define GMAC_TRGMII_RCK_CTRL 0x300
187#define RX_RST BIT(31)
188#define RXC_DQSISEL BIT(30)
189
190#define GMAC_TRGMII_TD_ODT(n) (0x354 + (n) * 8)
191#define TD_DM_DRVN_S 4
192#define TD_DM_DRVN_M 0xf0
193#define TD_DM_DRVP_S 0
194#define TD_DM_DRVP_M 0x0f
195
196/* MT7530 Registers */
197
198#define PCR_REG(p) (0x2004 + (p) * 0x100)
199#define PORT_MATRIX_S 16
200#define PORT_MATRIX_M 0xff0000
201
202#define PVC_REG(p) (0x2010 + (p) * 0x100)
203#define STAG_VPID_S 16
204#define STAG_VPID_M 0xffff0000
205#define VLAN_ATTR_S 6
206#define VLAN_ATTR_M 0xc0
207
208/* VLAN_ATTR: VLAN attributes */
209#define VLAN_ATTR_USER 0
210#define VLAN_ATTR_STACK 1
211#define VLAN_ATTR_TRANSLATION 2
212#define VLAN_ATTR_TRANSPARENT 3
213
Landen Chao532de8d2020-02-18 16:49:37 +0800214#define PMCR_REG(p) (0x3000 + (p) * 0x100)
215/* XXX: all fields of MT7530 are defined under GMAC_PORT_MCR
216 * MT7531 specific fields are defined below
217 */
218#define FORCE_MODE_EEE1G BIT(25)
219#define FORCE_MODE_EEE100 BIT(26)
220#define FORCE_MODE_TX_FC BIT(27)
221#define FORCE_MODE_RX_FC BIT(28)
222#define FORCE_MODE_DPX BIT(29)
223#define FORCE_MODE_SPD BIT(30)
224#define FORCE_MODE_LNK BIT(31)
225#define MT7531_FORCE_MODE FORCE_MODE_EEE1G | FORCE_MODE_EEE100 |\
226 FORCE_MODE_TX_FC | FORCE_MODE_RX_FC | \
227 FORCE_MODE_DPX | FORCE_MODE_SPD | \
228 FORCE_MODE_LNK
Weijie Gao23f17162018-12-20 16:12:53 +0800229
Landen Chao532de8d2020-02-18 16:49:37 +0800230/* MT7531 SGMII Registers */
231#define MT7531_SGMII_REG_BASE 0x5000
232#define MT7531_SGMII_REG_PORT_BASE 0x1000
233#define MT7531_SGMII_REG(p, r) (MT7531_SGMII_REG_BASE + \
234 (p) * MT7531_SGMII_REG_PORT_BASE + (r))
235#define MT7531_PCS_CONTROL_1(p) MT7531_SGMII_REG(((p) - 5), 0x00)
236#define MT7531_SGMII_MODE(p) MT7531_SGMII_REG(((p) - 5), 0x20)
237#define MT7531_QPHY_PWR_STATE_CTRL(p) MT7531_SGMII_REG(((p) - 5), 0xe8)
238#define MT7531_PHYA_CTRL_SIGNAL3(p) MT7531_SGMII_REG(((p) - 5), 0x128)
239/* XXX: all fields of MT7531 SGMII are defined under SGMSYS */
240
241/* MT753x System Control Register */
Weijie Gao23f17162018-12-20 16:12:53 +0800242#define SYS_CTRL_REG 0x7000
243#define SW_PHY_RST BIT(2)
244#define SW_SYS_RST BIT(1)
245#define SW_REG_RST BIT(0)
246
Landen Chao532de8d2020-02-18 16:49:37 +0800247/* MT7531 */
248#define MT7531_PHY_IAC 0x701c
249/* XXX: all fields are defined under GMAC_PIAC_REG */
250
251#define MT7531_CLKGEN_CTRL 0x7500
252#define CLK_SKEW_OUT_S 8
253#define CLK_SKEW_OUT_M 0x300
254#define CLK_SKEW_IN_S 6
255#define CLK_SKEW_IN_M 0xc0
256#define RXCLK_NO_DELAY BIT(5)
257#define TXCLK_NO_REVERSE BIT(4)
258#define GP_MODE_S 1
259#define GP_MODE_M 0x06
260#define GP_CLK_EN BIT(0)
261
262/* Values of GP_MODE */
263#define GP_MODE_RGMII 0
264#define GP_MODE_MII 1
265#define GP_MODE_REV_MII 2
266
267/* Values of CLK_SKEW_IN */
268#define CLK_SKEW_IN_NO_CHANGE 0
269#define CLK_SKEW_IN_DELAY_100PPS 1
270#define CLK_SKEW_IN_DELAY_200PPS 2
271#define CLK_SKEW_IN_REVERSE 3
272
273/* Values of CLK_SKEW_OUT */
274#define CLK_SKEW_OUT_NO_CHANGE 0
275#define CLK_SKEW_OUT_DELAY_100PPS 1
276#define CLK_SKEW_OUT_DELAY_200PPS 2
277#define CLK_SKEW_OUT_REVERSE 3
Weijie Gao23f17162018-12-20 16:12:53 +0800278
279#define HWTRAP_REG 0x7800
Landen Chao532de8d2020-02-18 16:49:37 +0800280/* MT7530 Modified Hardware Trap Status Registers */
Weijie Gao23f17162018-12-20 16:12:53 +0800281#define MHWTRAP_REG 0x7804
282#define CHG_TRAP BIT(16)
283#define LOOPDET_DIS BIT(14)
284#define P5_INTF_SEL_S 13
285#define P5_INTF_SEL_M 0x2000
286#define SMI_ADDR_S 11
287#define SMI_ADDR_M 0x1800
288#define XTAL_FSEL_S 9
289#define XTAL_FSEL_M 0x600
290#define P6_INTF_DIS BIT(8)
291#define P5_INTF_MODE_S 7
292#define P5_INTF_MODE_M 0x80
293#define P5_INTF_DIS BIT(6)
294#define C_MDIO_BPS BIT(5)
295#define CHIP_MODE_S 0
296#define CHIP_MODE_M 0x0f
297
298/* P5_INTF_SEL: Interface type of Port5 */
299#define P5_INTF_SEL_GPHY 0
300#define P5_INTF_SEL_GMAC5 1
301
302/* P5_INTF_MODE: Interface mode of Port5 */
303#define P5_INTF_MODE_GMII_MII 0
304#define P5_INTF_MODE_RGMII 1
305
306#define MT7530_P6ECR 0x7830
307#define P6_INTF_MODE_M 0x3
308#define P6_INTF_MODE_S 0
309
310/* P6_INTF_MODE: Interface mode of Port6 */
311#define P6_INTF_MODE_RGMII 0
312#define P6_INTF_MODE_TRGMII 1
313
Landen Chao532de8d2020-02-18 16:49:37 +0800314#define NUM_TRGMII_CTRL 5
315
Weijie Gao23f17162018-12-20 16:12:53 +0800316#define MT7530_TRGMII_RD(n) (0x7a10 + (n) * 8)
317#define RD_TAP_S 0
318#define RD_TAP_M 0x7f
319
320#define MT7530_TRGMII_TD_ODT(n) (0x7a54 + (n) * 8)
321/* XXX: all fields are defined under GMAC_TRGMII_TD_ODT */
322
Landen Chao532de8d2020-02-18 16:49:37 +0800323/* TOP Signals Status Register */
324#define MT7531_TOP_SIG_SR 0x780c
325#define PAD_MCM_SMI_EN BIT(0)
326#define PAD_DUAL_SGMII_EN BIT(1)
Weijie Gao23f17162018-12-20 16:12:53 +0800327
Landen Chao532de8d2020-02-18 16:49:37 +0800328/* MT7531 PLLGP Registers */
329#define MT7531_PLLGP_EN 0x7820
330#define EN_COREPLL BIT(2)
331#define SW_CLKSW BIT(1)
332#define SW_PLLGP BIT(0)
333
334#define MT7531_PLLGP_CR0 0x78a8
335#define RG_COREPLL_EN BIT(22)
336#define RG_COREPLL_POSDIV_S 23
337#define RG_COREPLL_POSDIV_M 0x3800000
338#define RG_COREPLL_SDM_PCW_S 1
339#define RG_COREPLL_SDM_PCW_M 0x3ffffe
340#define RG_COREPLL_SDM_PCW_CHG BIT(0)
341
342/* MT7531 RGMII and SGMII PLL clock */
343#define MT7531_ANA_PLLGP_CR2 0x78b0
344#define MT7531_ANA_PLLGP_CR5 0x78bc
345
346/* MT7531 GPIO GROUP IOLB SMT0 Control */
347#define MT7531_SMT0_IOLB 0x7f04
348#define SMT_IOLB_5_SMI_MDC_EN BIT(5)
349
350/* MT7530 GPHY MDIO Indirect Access Registers */
Weijie Gao23f17162018-12-20 16:12:53 +0800351#define MII_MMD_ACC_CTL_REG 0x0d
352#define MMD_CMD_S 14
353#define MMD_CMD_M 0xc000
354#define MMD_DEVAD_S 0
355#define MMD_DEVAD_M 0x1f
356
357/* MMD_CMD: MMD commands */
358#define MMD_ADDR 0
359#define MMD_DATA 1
360#define MMD_DATA_RW_POST_INC 2
361#define MMD_DATA_W_POST_INC 3
362
363#define MII_MMD_ADDR_DATA_REG 0x0e
364
365/* MT7530 GPHY MDIO MMD Registers */
Weijie Gao23f17162018-12-20 16:12:53 +0800366#define CORE_PLL_GROUP2 0x401
367#define RG_SYSPLL_EN_NORMAL BIT(15)
368#define RG_SYSPLL_VODEN BIT(14)
369#define RG_SYSPLL_POSDIV_S 5
370#define RG_SYSPLL_POSDIV_M 0x60
371
372#define CORE_PLL_GROUP4 0x403
Landen Chao532de8d2020-02-18 16:49:37 +0800373#define MT7531_BYPASS_MODE BIT(4)
374#define MT7531_POWER_ON_OFF BIT(5)
Weijie Gao23f17162018-12-20 16:12:53 +0800375#define RG_SYSPLL_DDSFBK_EN BIT(12)
376#define RG_SYSPLL_BIAS_EN BIT(11)
377#define RG_SYSPLL_BIAS_LPF_EN BIT(10)
378
379#define CORE_PLL_GROUP5 0x404
380#define RG_LCDDS_PCW_NCPO1_S 0
381#define RG_LCDDS_PCW_NCPO1_M 0xffff
382
383#define CORE_PLL_GROUP6 0x405
384#define RG_LCDDS_PCW_NCPO0_S 0
385#define RG_LCDDS_PCW_NCPO0_M 0xffff
386
387#define CORE_PLL_GROUP7 0x406
388#define RG_LCDDS_PWDB BIT(15)
389#define RG_LCDDS_ISO_EN BIT(13)
390#define RG_LCCDS_C_S 4
391#define RG_LCCDS_C_M 0x70
392#define RG_LCDDS_PCW_NCPO_CHG BIT(3)
393
394#define CORE_PLL_GROUP10 0x409
395#define RG_LCDDS_SSC_DELTA_S 0
396#define RG_LCDDS_SSC_DELTA_M 0xfff
397
398#define CORE_PLL_GROUP11 0x40a
399#define RG_LCDDS_SSC_DELTA1_S 0
400#define RG_LCDDS_SSC_DELTA1_M 0xfff
401
402#define CORE_GSWPLL_GRP1 0x40d
403#define RG_GSWPLL_POSDIV_200M_S 12
404#define RG_GSWPLL_POSDIV_200M_M 0x3000
405#define RG_GSWPLL_EN_PRE BIT(11)
406#define RG_GSWPLL_FBKDIV_200M_S 0
407#define RG_GSWPLL_FBKDIV_200M_M 0xff
408
409#define CORE_GSWPLL_GRP2 0x40e
410#define RG_GSWPLL_POSDIV_500M_S 8
411#define RG_GSWPLL_POSDIV_500M_M 0x300
412#define RG_GSWPLL_FBKDIV_500M_S 0
413#define RG_GSWPLL_FBKDIV_500M_M 0xff
414
415#define CORE_TRGMII_GSW_CLK_CG 0x410
416#define REG_GSWCK_EN BIT(0)
417#define REG_TRGMIICK_EN BIT(1)
418
Landen Chao532de8d2020-02-18 16:49:37 +0800419/* Extend PHY Control Register 3 */
420#define PHY_EXT_REG_14 0x14
421
422/* Fields of PHY_EXT_REG_14 */
423#define PHY_EN_DOWN_SHFIT BIT(4)
424
425/* Extend PHY Control Register 4 */
426#define PHY_EXT_REG_17 0x17
427
428/* Fields of PHY_EXT_REG_17 */
429#define PHY_LINKDOWN_POWER_SAVING_EN BIT(4)
430
431/* PHY RXADC Control Register 7 */
432#define PHY_DEV1E_REG_0C6 0x0c6
433
434/* Fields of PHY_DEV1E_REG_0C6 */
435#define PHY_POWER_SAVING_S 8
436#define PHY_POWER_SAVING_M 0x300
437#define PHY_POWER_SAVING_TX 0x0
438
Weijie Gao7d928c32022-09-09 19:59:24 +0800439/* PDMA descriptors */
440struct mtk_rx_dma {
441 unsigned int rxd1;
442 unsigned int rxd2;
443 unsigned int rxd3;
444 unsigned int rxd4;
445} __packed __aligned(4);
446
447struct mtk_tx_dma {
448 unsigned int txd1;
449 unsigned int txd2;
450 unsigned int txd3;
451 unsigned int txd4;
452} __packed __aligned(4);
453
454/* PDMA TXD fields */
455#define PDMA_TXD2_DDONE BIT(31)
456#define PDMA_TXD2_LS0 BIT(30)
457#define PDMA_TXD2_SDL0_M GENMASK(29, 16)
458#define PDMA_TXD2_SDL0_SET(_v) FIELD_PREP(PDMA_TXD2_SDL0_M, (_v))
459
460#define PDMA_TXD4_FPORT_M GENMASK(27, 25)
461#define PDMA_TXD4_FPORT_SET(_v) FIELD_PREP(PDMA_TXD4_FPORT_M, (_v))
462
463/* PDMA RXD fields */
464#define PDMA_RXD2_DDONE BIT(31)
465#define PDMA_RXD2_LS0 BIT(30)
466#define PDMA_RXD2_PLEN0_M GENMASK(29, 16)
467#define PDMA_RXD2_PLEN0_GET(_v) FIELD_GET(PDMA_RXD2_PLEN0_M, (_v))
468#define PDMA_RXD2_PLEN0_SET(_v) FIELD_PREP(PDMA_RXD2_PLEN0_M, (_v))
469
Weijie Gao23f17162018-12-20 16:12:53 +0800470#endif /* _MTK_ETH_H_ */