1403f69bbSGerhard Engleder /* SPDX-License-Identifier: GPL-2.0 */
2403f69bbSGerhard Engleder /* Copyright (C) 2021 Gerhard Engleder <gerhard@engleder-embedded.com> */
3403f69bbSGerhard Engleder 
4403f69bbSGerhard Engleder /* Hardware definition of TSNEP and EtherCAT MAC device */
5403f69bbSGerhard Engleder 
6403f69bbSGerhard Engleder #ifndef _TSNEP_HW_H
7403f69bbSGerhard Engleder #define _TSNEP_HW_H
8403f69bbSGerhard Engleder 
9403f69bbSGerhard Engleder #include <linux/types.h>
10403f69bbSGerhard Engleder 
11403f69bbSGerhard Engleder /* type */
12403f69bbSGerhard Engleder #define ECM_TYPE 0x0000
13403f69bbSGerhard Engleder #define ECM_REVISION_MASK 0x000000FF
14403f69bbSGerhard Engleder #define ECM_REVISION_SHIFT 0
15403f69bbSGerhard Engleder #define ECM_VERSION_MASK 0x0000FF00
16403f69bbSGerhard Engleder #define ECM_VERSION_SHIFT 8
17403f69bbSGerhard Engleder #define ECM_QUEUE_COUNT_MASK 0x00070000
18403f69bbSGerhard Engleder #define ECM_QUEUE_COUNT_SHIFT 16
19403f69bbSGerhard Engleder #define ECM_GATE_CONTROL 0x02000000
20403f69bbSGerhard Engleder 
21403f69bbSGerhard Engleder /* system time */
22403f69bbSGerhard Engleder #define ECM_SYSTEM_TIME_LOW 0x0008
23403f69bbSGerhard Engleder #define ECM_SYSTEM_TIME_HIGH 0x000C
24403f69bbSGerhard Engleder 
25403f69bbSGerhard Engleder /* clock */
26403f69bbSGerhard Engleder #define ECM_CLOCK_RATE 0x0010
27403f69bbSGerhard Engleder #define ECM_CLOCK_RATE_OFFSET_MASK 0x7FFFFFFF
28403f69bbSGerhard Engleder #define ECM_CLOCK_RATE_OFFSET_SIGN 0x80000000
29403f69bbSGerhard Engleder 
30403f69bbSGerhard Engleder /* interrupt */
31403f69bbSGerhard Engleder #define ECM_INT_ENABLE 0x0018
32403f69bbSGerhard Engleder #define ECM_INT_ACTIVE 0x001C
33403f69bbSGerhard Engleder #define ECM_INT_ACKNOWLEDGE 0x001C
34403f69bbSGerhard Engleder #define ECM_INT_LINK 0x00000020
35403f69bbSGerhard Engleder #define ECM_INT_TX_0 0x00000100
36403f69bbSGerhard Engleder #define ECM_INT_RX_0 0x00000200
3776203137SGerhard Engleder #define ECM_INT_TXRX_SHIFT 2
38403f69bbSGerhard Engleder #define ECM_INT_ALL 0x7FFFFFFF
39403f69bbSGerhard Engleder #define ECM_INT_DISABLE 0x80000000
40403f69bbSGerhard Engleder 
41403f69bbSGerhard Engleder /* reset */
42403f69bbSGerhard Engleder #define ECM_RESET 0x0020
43403f69bbSGerhard Engleder #define ECM_RESET_COMMON 0x00000001
44403f69bbSGerhard Engleder #define ECM_RESET_CHANNEL 0x00000100
45403f69bbSGerhard Engleder #define ECM_RESET_TXRX 0x00010000
46403f69bbSGerhard Engleder 
470abb62b6SGerhard Engleder /* counter */
480abb62b6SGerhard Engleder #define ECM_COUNTER_LOW 0x0028
490abb62b6SGerhard Engleder #define ECM_COUNTER_HIGH 0x002C
500abb62b6SGerhard Engleder 
51*d3dfe8d6SGerhard Engleder /* interrupt delay */
52*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY 0x0030
53*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_MASK 0xF0
54*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_SHIFT 4
55*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_BASE_US 16
56*d3dfe8d6SGerhard Engleder #define ECM_INT_DELAY_OFFSET 1
57*d3dfe8d6SGerhard Engleder 
58403f69bbSGerhard Engleder /* control and status */
59403f69bbSGerhard Engleder #define ECM_STATUS 0x0080
60403f69bbSGerhard Engleder #define ECM_LINK_MODE_OFF 0x01000000
61403f69bbSGerhard Engleder #define ECM_LINK_MODE_100 0x02000000
62403f69bbSGerhard Engleder #define ECM_LINK_MODE_1000 0x04000000
63403f69bbSGerhard Engleder #define ECM_NO_LINK 0x01000000
64403f69bbSGerhard Engleder #define ECM_LINK_MODE_MASK 0x06000000
65403f69bbSGerhard Engleder 
66403f69bbSGerhard Engleder /* management data */
67403f69bbSGerhard Engleder #define ECM_MD_CONTROL 0x0084
68403f69bbSGerhard Engleder #define ECM_MD_STATUS 0x0084
69403f69bbSGerhard Engleder #define ECM_MD_PREAMBLE 0x00000001
70403f69bbSGerhard Engleder #define ECM_MD_READ 0x00000004
71403f69bbSGerhard Engleder #define ECM_MD_WRITE 0x00000002
72403f69bbSGerhard Engleder #define ECM_MD_ADDR_MASK 0x000000F8
73403f69bbSGerhard Engleder #define ECM_MD_ADDR_SHIFT 3
74403f69bbSGerhard Engleder #define ECM_MD_PHY_ADDR_MASK 0x00001F00
75403f69bbSGerhard Engleder #define ECM_MD_PHY_ADDR_SHIFT 8
76403f69bbSGerhard Engleder #define ECM_MD_BUSY 0x00000001
77403f69bbSGerhard Engleder #define ECM_MD_DATA_MASK 0xFFFF0000
78403f69bbSGerhard Engleder #define ECM_MD_DATA_SHIFT 16
79403f69bbSGerhard Engleder 
80403f69bbSGerhard Engleder /* statistic */
81403f69bbSGerhard Engleder #define ECM_STAT 0x00B0
82403f69bbSGerhard Engleder #define ECM_STAT_RX_ERR_MASK 0x000000FF
83403f69bbSGerhard Engleder #define ECM_STAT_RX_ERR_SHIFT 0
84403f69bbSGerhard Engleder #define ECM_STAT_INV_FRM_MASK 0x0000FF00
85403f69bbSGerhard Engleder #define ECM_STAT_INV_FRM_SHIFT 8
86403f69bbSGerhard Engleder #define ECM_STAT_FWD_RX_ERR_MASK 0x00FF0000
87403f69bbSGerhard Engleder #define ECM_STAT_FWD_RX_ERR_SHIFT 16
88403f69bbSGerhard Engleder 
89403f69bbSGerhard Engleder /* tsnep */
90403f69bbSGerhard Engleder #define TSNEP_MAC_SIZE 0x4000
91403f69bbSGerhard Engleder #define TSNEP_QUEUE_SIZE 0x1000
92403f69bbSGerhard Engleder #define TSNEP_QUEUE(n) ({ typeof(n) __n = (n); \
93403f69bbSGerhard Engleder 			  (__n) == 0 ? \
94403f69bbSGerhard Engleder 			  0 : \
95403f69bbSGerhard Engleder 			  TSNEP_MAC_SIZE + TSNEP_QUEUE_SIZE * ((__n) - 1); })
96403f69bbSGerhard Engleder #define TSNEP_MAX_QUEUES 8
97403f69bbSGerhard Engleder #define TSNEP_MAX_FRAME_SIZE (2 * 1024) /* hardware supports actually 16k */
98403f69bbSGerhard Engleder #define TSNEP_DESC_SIZE 256
99403f69bbSGerhard Engleder #define TSNEP_DESC_OFFSET 128
100403f69bbSGerhard Engleder 
101403f69bbSGerhard Engleder /* tsnep register */
102403f69bbSGerhard Engleder #define TSNEP_INFO 0x0100
1037d8dd6b5SGerhard Engleder #define TSNEP_INFO_TX_TIME 0x00010000
104403f69bbSGerhard Engleder #define TSNEP_CONTROL 0x0108
105403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_RESET 0x00000001
106403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_ENABLE 0x00000002
107403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_DMA_ERROR 0x00000010
108403f69bbSGerhard Engleder #define TSNEP_CONTROL_TX_DESC_ERROR 0x00000020
109403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_RESET 0x00000100
110403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_ENABLE 0x00000200
111403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_DISABLE 0x00000400
112403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_DMA_ERROR 0x00001000
113403f69bbSGerhard Engleder #define TSNEP_CONTROL_RX_DESC_ERROR 0x00002000
114403f69bbSGerhard Engleder #define TSNEP_TX_DESC_ADDR_LOW 0x0140
115403f69bbSGerhard Engleder #define TSNEP_TX_DESC_ADDR_HIGH 0x0144
116403f69bbSGerhard Engleder #define TSNEP_RX_DESC_ADDR_LOW 0x0180
117403f69bbSGerhard Engleder #define TSNEP_RX_DESC_ADDR_HIGH 0x0184
118403f69bbSGerhard Engleder #define TSNEP_RESET_OWNER_COUNTER 0x01
119403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC 0x0190
120403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_NO_DESC_MASK 0x000000FF
121403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_NO_DESC_SHIFT 0
122403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL_MASK 0x0000FF00
123403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL_SHIFT 8
124403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW_MASK 0x00FF0000
125403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW_SHIFT 16
126403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_INVALID_FRAME_MASK 0xFF000000
127403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_INVALID_FRAME_SHIFT 24
128403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_NO_DESC 0x0190
129403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL 0x0191
130403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW 0x0192
131403f69bbSGerhard Engleder #define TSNEP_RX_STATISTIC_INVALID_FRAME 0x0193
132403f69bbSGerhard Engleder #define TSNEP_MAC_ADDRESS_LOW 0x0800
133403f69bbSGerhard Engleder #define TSNEP_MAC_ADDRESS_HIGH 0x0804
134403f69bbSGerhard Engleder #define TSNEP_RX_FILTER 0x0806
135403f69bbSGerhard Engleder #define TSNEP_RX_FILTER_ACCEPT_ALL_MULTICASTS 0x0001
136403f69bbSGerhard Engleder #define TSNEP_RX_FILTER_ACCEPT_ALL_UNICASTS 0x0002
137403f69bbSGerhard Engleder #define TSNEP_GC 0x0808
138403f69bbSGerhard Engleder #define TSNEP_GC_ENABLE_A 0x00000002
139403f69bbSGerhard Engleder #define TSNEP_GC_ENABLE_B 0x00000004
140403f69bbSGerhard Engleder #define TSNEP_GC_DISABLE 0x00000008
141403f69bbSGerhard Engleder #define TSNEP_GC_ENABLE_TIMEOUT 0x00000010
142403f69bbSGerhard Engleder #define TSNEP_GC_ACTIVE_A 0x00000002
143403f69bbSGerhard Engleder #define TSNEP_GC_ACTIVE_B 0x00000004
144403f69bbSGerhard Engleder #define TSNEP_GC_CHANGE_AB 0x00000008
145403f69bbSGerhard Engleder #define TSNEP_GC_TIMEOUT_ACTIVE 0x00000010
146403f69bbSGerhard Engleder #define TSNEP_GC_TIMEOUT_SIGNAL 0x00000020
147403f69bbSGerhard Engleder #define TSNEP_GC_LIST_ERROR 0x00000080
148403f69bbSGerhard Engleder #define TSNEP_GC_OPEN 0x00FF0000
149403f69bbSGerhard Engleder #define TSNEP_GC_OPEN_SHIFT 16
150403f69bbSGerhard Engleder #define TSNEP_GC_NEXT_OPEN 0xFF000000
151403f69bbSGerhard Engleder #define TSNEP_GC_NEXT_OPEN_SHIFT 24
152403f69bbSGerhard Engleder #define TSNEP_GC_TIMEOUT 131072
153403f69bbSGerhard Engleder #define TSNEP_GC_TIME 0x080C
154403f69bbSGerhard Engleder #define TSNEP_GC_CHANGE 0x0810
155403f69bbSGerhard Engleder #define TSNEP_GCL_A 0x2000
156403f69bbSGerhard Engleder #define TSNEP_GCL_B 0x2800
157403f69bbSGerhard Engleder #define TSNEP_GCL_SIZE SZ_2K
158308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN 0x0840
159308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ACTIVE 0x00000001
160308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_QUEUE_MASK 0x00000006
161308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_QUEUE_SHIFT 1
162308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_OFFSET 1
163308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ETHER_TYPE 0x0880
164308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ETHER_TYPE_OFFSET 2
165308ce142SGerhard Engleder #define TSNEP_RX_ASSIGN_ETHER_TYPE_COUNT 2
166403f69bbSGerhard Engleder 
167403f69bbSGerhard Engleder /* tsnep gate control list operation */
168403f69bbSGerhard Engleder struct tsnep_gcl_operation {
169403f69bbSGerhard Engleder 	u32 properties;
170403f69bbSGerhard Engleder 	u32 interval;
171403f69bbSGerhard Engleder };
172403f69bbSGerhard Engleder 
173403f69bbSGerhard Engleder #define TSNEP_GCL_COUNT (TSNEP_GCL_SIZE / sizeof(struct tsnep_gcl_operation))
174403f69bbSGerhard Engleder #define TSNEP_GCL_MASK 0x000000FF
175403f69bbSGerhard Engleder #define TSNEP_GCL_INSERT 0x20000000
176403f69bbSGerhard Engleder #define TSNEP_GCL_CHANGE 0x40000000
177403f69bbSGerhard Engleder #define TSNEP_GCL_LAST 0x80000000
178403f69bbSGerhard Engleder #define TSNEP_GCL_MIN_INTERVAL 32
179403f69bbSGerhard Engleder 
180403f69bbSGerhard Engleder /* tsnep TX/RX descriptor */
181403f69bbSGerhard Engleder #define TSNEP_DESC_SIZE 256
182403f69bbSGerhard Engleder #define TSNEP_DESC_SIZE_DATA_AFTER 2048
183403f69bbSGerhard Engleder #define TSNEP_DESC_OFFSET 128
184403f69bbSGerhard Engleder #define TSNEP_DESC_OWNER_COUNTER_MASK 0xC0000000
185403f69bbSGerhard Engleder #define TSNEP_DESC_OWNER_COUNTER_SHIFT 30
186403f69bbSGerhard Engleder #define TSNEP_DESC_LENGTH_MASK 0x00003FFF
187403f69bbSGerhard Engleder #define TSNEP_DESC_INTERRUPT_FLAG 0x00040000
188403f69bbSGerhard Engleder #define TSNEP_DESC_EXTENDED_WRITEBACK_FLAG 0x00080000
189403f69bbSGerhard Engleder #define TSNEP_DESC_NO_LINK_FLAG 0x01000000
190403f69bbSGerhard Engleder 
191403f69bbSGerhard Engleder /* tsnep TX descriptor */
192403f69bbSGerhard Engleder struct tsnep_tx_desc {
193403f69bbSGerhard Engleder 	__le32 properties;
194403f69bbSGerhard Engleder 	__le32 more_properties;
195403f69bbSGerhard Engleder 	__le32 reserved[2];
196403f69bbSGerhard Engleder 	__le64 next;
197403f69bbSGerhard Engleder 	__le64 tx;
198403f69bbSGerhard Engleder };
199403f69bbSGerhard Engleder 
200403f69bbSGerhard Engleder #define TSNEP_TX_DESC_OWNER_MASK 0xE0000000
201403f69bbSGerhard Engleder #define TSNEP_TX_DESC_OWNER_USER_FLAG 0x20000000
202403f69bbSGerhard Engleder #define TSNEP_TX_DESC_LAST_FRAGMENT_FLAG 0x00010000
203403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DATA_AFTER_DESC_FLAG 0x00020000
204403f69bbSGerhard Engleder 
205403f69bbSGerhard Engleder /* tsnep TX descriptor writeback */
206403f69bbSGerhard Engleder struct tsnep_tx_desc_wb {
207403f69bbSGerhard Engleder 	__le32 properties;
2080abb62b6SGerhard Engleder 	__le32 reserved1;
2090abb62b6SGerhard Engleder 	__le64 counter;
210403f69bbSGerhard Engleder 	__le64 timestamp;
211403f69bbSGerhard Engleder 	__le32 dma_delay;
212403f69bbSGerhard Engleder 	__le32 reserved2;
213403f69bbSGerhard Engleder };
214403f69bbSGerhard Engleder 
215403f69bbSGerhard Engleder #define TSNEP_TX_DESC_UNDERRUN_ERROR_FLAG 0x00010000
216403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_FIRST_DATA_MASK 0x0000FFFC
217403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_FIRST_DATA_SHIFT 2
218403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_LAST_DATA_MASK 0xFFFC0000
219403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_LAST_DATA_SHIFT 18
220403f69bbSGerhard Engleder #define TSNEP_TX_DESC_DMA_DELAY_NS 64
221403f69bbSGerhard Engleder 
222403f69bbSGerhard Engleder /* tsnep RX descriptor */
223403f69bbSGerhard Engleder struct tsnep_rx_desc {
224403f69bbSGerhard Engleder 	__le32 properties;
225403f69bbSGerhard Engleder 	__le32 reserved[3];
226403f69bbSGerhard Engleder 	__le64 next;
227403f69bbSGerhard Engleder 	__le64 rx;
228403f69bbSGerhard Engleder };
229403f69bbSGerhard Engleder 
230403f69bbSGerhard Engleder #define TSNEP_RX_DESC_BUFFER_SIZE_MASK 0x00003FFC
231403f69bbSGerhard Engleder 
232403f69bbSGerhard Engleder /* tsnep RX descriptor writeback */
233403f69bbSGerhard Engleder struct tsnep_rx_desc_wb {
234403f69bbSGerhard Engleder 	__le32 properties;
235403f69bbSGerhard Engleder 	__le32 reserved[7];
236403f69bbSGerhard Engleder };
237403f69bbSGerhard Engleder 
238403f69bbSGerhard Engleder /* tsnep RX inline meta */
239403f69bbSGerhard Engleder struct tsnep_rx_inline {
2400abb62b6SGerhard Engleder 	__le64 counter;
241403f69bbSGerhard Engleder 	__le64 timestamp;
242403f69bbSGerhard Engleder };
243403f69bbSGerhard Engleder 
244403f69bbSGerhard Engleder #define TSNEP_RX_INLINE_METADATA_SIZE (sizeof(struct tsnep_rx_inline))
245403f69bbSGerhard Engleder 
246403f69bbSGerhard Engleder #endif /* _TSNEP_HW_H */
247