xref: /openbmc/linux/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
14fa9c49fSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
27ac6653aSJeff Kirsher /*******************************************************************************
37ac6653aSJeff Kirsher   DWMAC DMA Header file.
47ac6653aSJeff Kirsher 
57ac6653aSJeff Kirsher   Copyright (C) 2007-2009  STMicroelectronics Ltd
67ac6653aSJeff Kirsher 
77ac6653aSJeff Kirsher 
87ac6653aSJeff Kirsher   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
97ac6653aSJeff Kirsher *******************************************************************************/
107ac6653aSJeff Kirsher 
11bd4242dfSRayagond Kokatanur #ifndef __DWMAC_DMA_H__
12bd4242dfSRayagond Kokatanur #define __DWMAC_DMA_H__
13bd4242dfSRayagond Kokatanur 
147ac6653aSJeff Kirsher /* DMA CRS Control and Status Register Mapping */
157ac6653aSJeff Kirsher #define DMA_BUS_MODE		0x00001000	/* Bus Mode */
167ac6653aSJeff Kirsher #define DMA_XMT_POLL_DEMAND	0x00001004	/* Transmit Poll Demand */
177ac6653aSJeff Kirsher #define DMA_RCV_POLL_DEMAND	0x00001008	/* Received Poll Demand */
187ac6653aSJeff Kirsher #define DMA_RCV_BASE_ADDR	0x0000100c	/* Receive List Base */
197ac6653aSJeff Kirsher #define DMA_TX_BASE_ADDR	0x00001010	/* Transmit List Base */
207ac6653aSJeff Kirsher #define DMA_STATUS		0x00001014	/* Status Register */
217ac6653aSJeff Kirsher #define DMA_CONTROL		0x00001018	/* Ctrl (Operational Mode) */
227ac6653aSJeff Kirsher #define DMA_INTR_ENA		0x0000101c	/* Interrupt Enable */
237ac6653aSJeff Kirsher #define DMA_MISSED_FRAME_CTR	0x00001020	/* Missed Frame Counter */
24495db273SGiuseppe Cavallaro 
25495db273SGiuseppe Cavallaro /* SW Reset */
26495db273SGiuseppe Cavallaro #define DMA_BUS_MODE_SFT_RESET	0x00000001	/* Software Reset */
27495db273SGiuseppe Cavallaro 
2862a2ab93SGiuseppe CAVALLARO /* Rx watchdog register */
2962a2ab93SGiuseppe CAVALLARO #define DMA_RX_WATCHDOG		0x00001024
30afea0365SGiuseppe Cavallaro 
31afea0365SGiuseppe Cavallaro /* AXI Master Bus Mode */
3262a2ab93SGiuseppe CAVALLARO #define DMA_AXI_BUS_MODE	0x00001028
33afea0365SGiuseppe Cavallaro 
34afea0365SGiuseppe Cavallaro #define DMA_AXI_EN_LPI		BIT(31)
35afea0365SGiuseppe Cavallaro #define DMA_AXI_LPI_XIT_FRM	BIT(30)
36afea0365SGiuseppe Cavallaro #define DMA_AXI_WR_OSR_LMT	GENMASK(23, 20)
37afea0365SGiuseppe Cavallaro #define DMA_AXI_WR_OSR_LMT_SHIFT	20
38afea0365SGiuseppe Cavallaro #define DMA_AXI_WR_OSR_LMT_MASK	0xf
39afea0365SGiuseppe Cavallaro #define DMA_AXI_RD_OSR_LMT	GENMASK(19, 16)
40afea0365SGiuseppe Cavallaro #define DMA_AXI_RD_OSR_LMT_SHIFT	16
41afea0365SGiuseppe Cavallaro #define DMA_AXI_RD_OSR_LMT_MASK	0xf
42afea0365SGiuseppe Cavallaro 
43afea0365SGiuseppe Cavallaro #define DMA_AXI_OSR_MAX		0xf
44afea0365SGiuseppe Cavallaro #define DMA_AXI_MAX_OSR_LIMIT ((DMA_AXI_OSR_MAX << DMA_AXI_WR_OSR_LMT_SHIFT) | \
45afea0365SGiuseppe Cavallaro 			       (DMA_AXI_OSR_MAX << DMA_AXI_RD_OSR_LMT_SHIFT))
46afea0365SGiuseppe Cavallaro #define	DMA_AXI_1KBBE		BIT(13)
47afea0365SGiuseppe Cavallaro #define DMA_AXI_AAL		BIT(12)
48afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN256		BIT(7)
49afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN128		BIT(6)
50afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN64		BIT(5)
51afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN32		BIT(4)
52afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN16		BIT(3)
53afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN8		BIT(2)
54afea0365SGiuseppe Cavallaro #define DMA_AXI_BLEN4		BIT(1)
55afea0365SGiuseppe Cavallaro #define DMA_BURST_LEN_DEFAULT	(DMA_AXI_BLEN256 | DMA_AXI_BLEN128 | \
56afea0365SGiuseppe Cavallaro 				 DMA_AXI_BLEN64 | DMA_AXI_BLEN32 | \
57afea0365SGiuseppe Cavallaro 				 DMA_AXI_BLEN16 | DMA_AXI_BLEN8 | \
58afea0365SGiuseppe Cavallaro 				 DMA_AXI_BLEN4)
59afea0365SGiuseppe Cavallaro 
60afea0365SGiuseppe Cavallaro #define DMA_AXI_UNDEF		BIT(0)
61afea0365SGiuseppe Cavallaro 
62afea0365SGiuseppe Cavallaro #define DMA_AXI_BURST_LEN_MASK	0x000000FE
63afea0365SGiuseppe Cavallaro 
647ac6653aSJeff Kirsher #define DMA_CUR_TX_BUF_ADDR	0x00001050	/* Current Host Tx Buffer */
657ac6653aSJeff Kirsher #define DMA_CUR_RX_BUF_ADDR	0x00001054	/* Current Host Rx Buffer */
66e7434821SGiuseppe CAVALLARO #define DMA_HW_FEATURE		0x00001058	/* HW Feature Register */
677ac6653aSJeff Kirsher 
687ac6653aSJeff Kirsher /* DMA Control register defines */
697ac6653aSJeff Kirsher #define DMA_CONTROL_ST		0x00002000	/* Start/Stop Transmission */
707ac6653aSJeff Kirsher #define DMA_CONTROL_SR		0x00000002	/* Start/Stop Receive */
717ac6653aSJeff Kirsher 
727ac6653aSJeff Kirsher /* DMA Normal interrupt */
737ac6653aSJeff Kirsher #define DMA_INTR_ENA_NIE 0x00010000	/* Normal Summary */
747ac6653aSJeff Kirsher #define DMA_INTR_ENA_TIE 0x00000001	/* Transmit Interrupt */
757ac6653aSJeff Kirsher #define DMA_INTR_ENA_TUE 0x00000004	/* Transmit Buffer Unavailable */
767ac6653aSJeff Kirsher #define DMA_INTR_ENA_RIE 0x00000040	/* Receive Interrupt */
777ac6653aSJeff Kirsher #define DMA_INTR_ENA_ERE 0x00004000	/* Early Receive */
787ac6653aSJeff Kirsher 
797ac6653aSJeff Kirsher #define DMA_INTR_NORMAL	(DMA_INTR_ENA_NIE | DMA_INTR_ENA_RIE | \
807ac6653aSJeff Kirsher 			DMA_INTR_ENA_TIE)
817ac6653aSJeff Kirsher 
827ac6653aSJeff Kirsher /* DMA Abnormal interrupt */
837ac6653aSJeff Kirsher #define DMA_INTR_ENA_AIE 0x00008000	/* Abnormal Summary */
847ac6653aSJeff Kirsher #define DMA_INTR_ENA_FBE 0x00002000	/* Fatal Bus Error */
857ac6653aSJeff Kirsher #define DMA_INTR_ENA_ETE 0x00000400	/* Early Transmit */
867ac6653aSJeff Kirsher #define DMA_INTR_ENA_RWE 0x00000200	/* Receive Watchdog */
877ac6653aSJeff Kirsher #define DMA_INTR_ENA_RSE 0x00000100	/* Receive Stopped */
887ac6653aSJeff Kirsher #define DMA_INTR_ENA_RUE 0x00000080	/* Receive Buffer Unavailable */
897ac6653aSJeff Kirsher #define DMA_INTR_ENA_UNE 0x00000020	/* Tx Underflow */
907ac6653aSJeff Kirsher #define DMA_INTR_ENA_OVE 0x00000010	/* Receive Overflow */
917ac6653aSJeff Kirsher #define DMA_INTR_ENA_TJE 0x00000008	/* Transmit Jabber */
927ac6653aSJeff Kirsher #define DMA_INTR_ENA_TSE 0x00000002	/* Transmit Stopped */
937ac6653aSJeff Kirsher 
947ac6653aSJeff Kirsher #define DMA_INTR_ABNORMAL	(DMA_INTR_ENA_AIE | DMA_INTR_ENA_FBE | \
957ac6653aSJeff Kirsher 				DMA_INTR_ENA_UNE)
967ac6653aSJeff Kirsher 
977ac6653aSJeff Kirsher /* DMA default interrupt mask */
987ac6653aSJeff Kirsher #define DMA_INTR_DEFAULT_MASK	(DMA_INTR_NORMAL | DMA_INTR_ABNORMAL)
99021bd5e3SJose Abreu #define DMA_INTR_DEFAULT_RX	(DMA_INTR_ENA_RIE)
100021bd5e3SJose Abreu #define DMA_INTR_DEFAULT_TX	(DMA_INTR_ENA_TIE)
1017ac6653aSJeff Kirsher 
1027ac6653aSJeff Kirsher /* DMA Status register defines */
103d765955dSGiuseppe CAVALLARO #define DMA_STATUS_GLPII	0x40000000	/* GMAC LPI interrupt */
1047ac6653aSJeff Kirsher #define DMA_STATUS_GPI		0x10000000	/* PMT interrupt */
1057ac6653aSJeff Kirsher #define DMA_STATUS_GMI		0x08000000	/* MMC interrupt */
1067ac6653aSJeff Kirsher #define DMA_STATUS_GLI		0x04000000	/* GMAC Line interface int */
1077ac6653aSJeff Kirsher #define DMA_STATUS_EB_MASK	0x00380000	/* Error Bits Mask */
1087ac6653aSJeff Kirsher #define DMA_STATUS_EB_TX_ABORT	0x00080000	/* Error Bits - TX Abort */
1097ac6653aSJeff Kirsher #define DMA_STATUS_EB_RX_ABORT	0x00100000	/* Error Bits - RX Abort */
1107ac6653aSJeff Kirsher #define DMA_STATUS_TS_MASK	0x00700000	/* Transmit Process State */
1117ac6653aSJeff Kirsher #define DMA_STATUS_TS_SHIFT	20
1127ac6653aSJeff Kirsher #define DMA_STATUS_RS_MASK	0x000e0000	/* Receive Process State */
1137ac6653aSJeff Kirsher #define DMA_STATUS_RS_SHIFT	17
1147ac6653aSJeff Kirsher #define DMA_STATUS_NIS	0x00010000	/* Normal Interrupt Summary */
1157ac6653aSJeff Kirsher #define DMA_STATUS_AIS	0x00008000	/* Abnormal Interrupt Summary */
1167ac6653aSJeff Kirsher #define DMA_STATUS_ERI	0x00004000	/* Early Receive Interrupt */
1177ac6653aSJeff Kirsher #define DMA_STATUS_FBI	0x00002000	/* Fatal Bus Error Interrupt */
1187ac6653aSJeff Kirsher #define DMA_STATUS_ETI	0x00000400	/* Early Transmit Interrupt */
1197ac6653aSJeff Kirsher #define DMA_STATUS_RWT	0x00000200	/* Receive Watchdog Timeout */
1207ac6653aSJeff Kirsher #define DMA_STATUS_RPS	0x00000100	/* Receive Process Stopped */
1217ac6653aSJeff Kirsher #define DMA_STATUS_RU	0x00000080	/* Receive Buffer Unavailable */
1227ac6653aSJeff Kirsher #define DMA_STATUS_RI	0x00000040	/* Receive Interrupt */
1237ac6653aSJeff Kirsher #define DMA_STATUS_UNF	0x00000020	/* Transmit Underflow */
1247ac6653aSJeff Kirsher #define DMA_STATUS_OVF	0x00000010	/* Receive Overflow */
1257ac6653aSJeff Kirsher #define DMA_STATUS_TJT	0x00000008	/* Transmit Jabber Timeout */
1267ac6653aSJeff Kirsher #define DMA_STATUS_TU	0x00000004	/* Transmit Buffer Unavailable */
1277ac6653aSJeff Kirsher #define DMA_STATUS_TPS	0x00000002	/* Transmit Process Stopped */
1287ac6653aSJeff Kirsher #define DMA_STATUS_TI	0x00000001	/* Transmit Interrupt */
1297ac6653aSJeff Kirsher #define DMA_CONTROL_FTF		0x00100000	/* Flush transmit FIFO */
1307ac6653aSJeff Kirsher 
1317e1c520cSOng Boon Leong #define DMA_STATUS_MSK_COMMON		(DMA_STATUS_NIS | \
1327e1c520cSOng Boon Leong 					 DMA_STATUS_AIS | \
1337e1c520cSOng Boon Leong 					 DMA_STATUS_FBI)
1347e1c520cSOng Boon Leong 
1357e1c520cSOng Boon Leong #define DMA_STATUS_MSK_RX		(DMA_STATUS_ERI | \
1367e1c520cSOng Boon Leong 					 DMA_STATUS_RWT | \
1377e1c520cSOng Boon Leong 					 DMA_STATUS_RPS | \
1387e1c520cSOng Boon Leong 					 DMA_STATUS_RU | \
1397e1c520cSOng Boon Leong 					 DMA_STATUS_RI | \
1407e1c520cSOng Boon Leong 					 DMA_STATUS_OVF | \
1417e1c520cSOng Boon Leong 					 DMA_STATUS_MSK_COMMON)
1427e1c520cSOng Boon Leong 
1437e1c520cSOng Boon Leong #define DMA_STATUS_MSK_TX		(DMA_STATUS_ETI | \
1447e1c520cSOng Boon Leong 					 DMA_STATUS_UNF | \
1457e1c520cSOng Boon Leong 					 DMA_STATUS_TJT | \
1467e1c520cSOng Boon Leong 					 DMA_STATUS_TU | \
1477e1c520cSOng Boon Leong 					 DMA_STATUS_TPS | \
1487e1c520cSOng Boon Leong 					 DMA_STATUS_TI | \
1497e1c520cSOng Boon Leong 					 DMA_STATUS_MSK_COMMON)
1507e1c520cSOng Boon Leong 
151f4458b92SThor Thayer #define NUM_DWMAC100_DMA_REGS	9
152f4458b92SThor Thayer #define NUM_DWMAC1000_DMA_REGS	23
1537af037c3SCamel Guo #define NUM_DWMAC4_DMA_REGS	27
154f4458b92SThor Thayer 
155d6cc64efSJoe Perches void dwmac_enable_dma_transmission(void __iomem *ioaddr);
156*1d84b487SAndrew Halaney void dwmac_enable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
157*1d84b487SAndrew Halaney 			  u32 chan, bool rx, bool tx);
158*1d84b487SAndrew Halaney void dwmac_disable_dma_irq(struct stmmac_priv *priv, void __iomem *ioaddr,
159*1d84b487SAndrew Halaney 			   u32 chan, bool rx, bool tx);
160*1d84b487SAndrew Halaney void dwmac_dma_start_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
161*1d84b487SAndrew Halaney 			u32 chan);
162*1d84b487SAndrew Halaney void dwmac_dma_stop_tx(struct stmmac_priv *priv, void __iomem *ioaddr,
163*1d84b487SAndrew Halaney 		       u32 chan);
164*1d84b487SAndrew Halaney void dwmac_dma_start_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
165*1d84b487SAndrew Halaney 			u32 chan);
166*1d84b487SAndrew Halaney void dwmac_dma_stop_rx(struct stmmac_priv *priv, void __iomem *ioaddr,
167*1d84b487SAndrew Halaney 		       u32 chan);
168*1d84b487SAndrew Halaney int dwmac_dma_interrupt(struct stmmac_priv *priv, void __iomem *ioaddr,
169*1d84b487SAndrew Halaney 			struct stmmac_extra_stats *x, u32 chan, u32 dir);
170495db273SGiuseppe Cavallaro int dwmac_dma_reset(void __iomem *ioaddr);
171bd4242dfSRayagond Kokatanur 
172bd4242dfSRayagond Kokatanur #endif /* __DWMAC_DMA_H__ */
173