1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (C) 2021 Gerhard Engleder <gerhard@engleder-embedded.com> */
3 
4 /* Hardware definition of TSNEP and EtherCAT MAC device */
5 
6 #ifndef _TSNEP_HW_H
7 #define _TSNEP_HW_H
8 
9 #include <linux/types.h>
10 
11 /* type */
12 #define ECM_TYPE 0x0000
13 #define ECM_REVISION_MASK 0x000000FF
14 #define ECM_REVISION_SHIFT 0
15 #define ECM_VERSION_MASK 0x0000FF00
16 #define ECM_VERSION_SHIFT 8
17 #define ECM_QUEUE_COUNT_MASK 0x00070000
18 #define ECM_QUEUE_COUNT_SHIFT 16
19 #define ECM_GATE_CONTROL 0x02000000
20 
21 /* system time */
22 #define ECM_SYSTEM_TIME_LOW 0x0008
23 #define ECM_SYSTEM_TIME_HIGH 0x000C
24 
25 /* clock */
26 #define ECM_CLOCK_RATE 0x0010
27 #define ECM_CLOCK_RATE_OFFSET_MASK 0x7FFFFFFF
28 #define ECM_CLOCK_RATE_OFFSET_SIGN 0x80000000
29 
30 /* interrupt */
31 #define ECM_INT_ENABLE 0x0018
32 #define ECM_INT_ACTIVE 0x001C
33 #define ECM_INT_ACKNOWLEDGE 0x001C
34 #define ECM_INT_LINK 0x00000020
35 #define ECM_INT_TX_0 0x00000100
36 #define ECM_INT_RX_0 0x00000200
37 #define ECM_INT_TXRX_SHIFT 2
38 #define ECM_INT_ALL 0x7FFFFFFF
39 #define ECM_INT_DISABLE 0x80000000
40 
41 /* reset */
42 #define ECM_RESET 0x0020
43 #define ECM_RESET_COMMON 0x00000001
44 #define ECM_RESET_CHANNEL 0x00000100
45 #define ECM_RESET_TXRX 0x00010000
46 
47 /* counter */
48 #define ECM_COUNTER_LOW 0x0028
49 #define ECM_COUNTER_HIGH 0x002C
50 
51 /* interrupt delay */
52 #define ECM_INT_DELAY 0x0030
53 #define ECM_INT_DELAY_MASK 0xF0
54 #define ECM_INT_DELAY_SHIFT 4
55 #define ECM_INT_DELAY_BASE_US 16
56 #define ECM_INT_DELAY_OFFSET 1
57 
58 /* control and status */
59 #define ECM_STATUS 0x0080
60 #define ECM_LINK_MODE_OFF 0x01000000
61 #define ECM_LINK_MODE_100 0x02000000
62 #define ECM_LINK_MODE_1000 0x04000000
63 #define ECM_NO_LINK 0x01000000
64 #define ECM_LINK_MODE_MASK 0x06000000
65 
66 /* management data */
67 #define ECM_MD_CONTROL 0x0084
68 #define ECM_MD_STATUS 0x0084
69 #define ECM_MD_PREAMBLE 0x00000001
70 #define ECM_MD_READ 0x00000004
71 #define ECM_MD_WRITE 0x00000002
72 #define ECM_MD_ADDR_MASK 0x000000F8
73 #define ECM_MD_ADDR_SHIFT 3
74 #define ECM_MD_PHY_ADDR_MASK 0x00001F00
75 #define ECM_MD_PHY_ADDR_SHIFT 8
76 #define ECM_MD_BUSY 0x00000001
77 #define ECM_MD_DATA_MASK 0xFFFF0000
78 #define ECM_MD_DATA_SHIFT 16
79 
80 /* statistic */
81 #define ECM_STAT 0x00B0
82 #define ECM_STAT_RX_ERR_MASK 0x000000FF
83 #define ECM_STAT_RX_ERR_SHIFT 0
84 #define ECM_STAT_INV_FRM_MASK 0x0000FF00
85 #define ECM_STAT_INV_FRM_SHIFT 8
86 #define ECM_STAT_FWD_RX_ERR_MASK 0x00FF0000
87 #define ECM_STAT_FWD_RX_ERR_SHIFT 16
88 
89 /* tsnep */
90 #define TSNEP_MAC_SIZE 0x4000
91 #define TSNEP_QUEUE_SIZE 0x1000
92 #define TSNEP_QUEUE(n) ({ typeof(n) __n = (n); \
93 			  (__n) == 0 ? \
94 			  0 : \
95 			  TSNEP_MAC_SIZE + TSNEP_QUEUE_SIZE * ((__n) - 1); })
96 #define TSNEP_MAX_QUEUES 8
97 #define TSNEP_MAX_FRAME_SIZE (2 * 1024) /* hardware supports actually 16k */
98 #define TSNEP_DESC_SIZE 256
99 #define TSNEP_DESC_OFFSET 128
100 
101 /* tsnep register */
102 #define TSNEP_INFO 0x0100
103 #define TSNEP_INFO_TX_TIME 0x00010000
104 #define TSNEP_CONTROL 0x0108
105 #define TSNEP_CONTROL_TX_RESET 0x00000001
106 #define TSNEP_CONTROL_TX_ENABLE 0x00000002
107 #define TSNEP_CONTROL_TX_DMA_ERROR 0x00000010
108 #define TSNEP_CONTROL_TX_DESC_ERROR 0x00000020
109 #define TSNEP_CONTROL_RX_RESET 0x00000100
110 #define TSNEP_CONTROL_RX_ENABLE 0x00000200
111 #define TSNEP_CONTROL_RX_DISABLE 0x00000400
112 #define TSNEP_CONTROL_RX_DMA_ERROR 0x00001000
113 #define TSNEP_CONTROL_RX_DESC_ERROR 0x00002000
114 #define TSNEP_TX_DESC_ADDR_LOW 0x0140
115 #define TSNEP_TX_DESC_ADDR_HIGH 0x0144
116 #define TSNEP_RX_DESC_ADDR_LOW 0x0180
117 #define TSNEP_RX_DESC_ADDR_HIGH 0x0184
118 #define TSNEP_RESET_OWNER_COUNTER 0x01
119 #define TSNEP_RX_STATISTIC 0x0190
120 #define TSNEP_RX_STATISTIC_NO_DESC_MASK 0x000000FF
121 #define TSNEP_RX_STATISTIC_NO_DESC_SHIFT 0
122 #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL_MASK 0x0000FF00
123 #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL_SHIFT 8
124 #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW_MASK 0x00FF0000
125 #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW_SHIFT 16
126 #define TSNEP_RX_STATISTIC_INVALID_FRAME_MASK 0xFF000000
127 #define TSNEP_RX_STATISTIC_INVALID_FRAME_SHIFT 24
128 #define TSNEP_RX_STATISTIC_NO_DESC 0x0190
129 #define TSNEP_RX_STATISTIC_BUFFER_TOO_SMALL 0x0191
130 #define TSNEP_RX_STATISTIC_FIFO_OVERFLOW 0x0192
131 #define TSNEP_RX_STATISTIC_INVALID_FRAME 0x0193
132 #define TSNEP_MAC_ADDRESS_LOW 0x0800
133 #define TSNEP_MAC_ADDRESS_HIGH 0x0804
134 #define TSNEP_RX_FILTER 0x0806
135 #define TSNEP_RX_FILTER_ACCEPT_ALL_MULTICASTS 0x0001
136 #define TSNEP_RX_FILTER_ACCEPT_ALL_UNICASTS 0x0002
137 #define TSNEP_GC 0x0808
138 #define TSNEP_GC_ENABLE_A 0x00000002
139 #define TSNEP_GC_ENABLE_B 0x00000004
140 #define TSNEP_GC_DISABLE 0x00000008
141 #define TSNEP_GC_ENABLE_TIMEOUT 0x00000010
142 #define TSNEP_GC_ACTIVE_A 0x00000002
143 #define TSNEP_GC_ACTIVE_B 0x00000004
144 #define TSNEP_GC_CHANGE_AB 0x00000008
145 #define TSNEP_GC_TIMEOUT_ACTIVE 0x00000010
146 #define TSNEP_GC_TIMEOUT_SIGNAL 0x00000020
147 #define TSNEP_GC_LIST_ERROR 0x00000080
148 #define TSNEP_GC_OPEN 0x00FF0000
149 #define TSNEP_GC_OPEN_SHIFT 16
150 #define TSNEP_GC_NEXT_OPEN 0xFF000000
151 #define TSNEP_GC_NEXT_OPEN_SHIFT 24
152 #define TSNEP_GC_TIMEOUT 131072
153 #define TSNEP_GC_TIME 0x080C
154 #define TSNEP_GC_CHANGE 0x0810
155 #define TSNEP_GCL_A 0x2000
156 #define TSNEP_GCL_B 0x2800
157 #define TSNEP_GCL_SIZE SZ_2K
158 #define TSNEP_RX_ASSIGN 0x0840
159 #define TSNEP_RX_ASSIGN_ACTIVE 0x00000001
160 #define TSNEP_RX_ASSIGN_QUEUE_MASK 0x00000006
161 #define TSNEP_RX_ASSIGN_QUEUE_SHIFT 1
162 #define TSNEP_RX_ASSIGN_OFFSET 1
163 #define TSNEP_RX_ASSIGN_ETHER_TYPE 0x0880
164 #define TSNEP_RX_ASSIGN_ETHER_TYPE_OFFSET 2
165 #define TSNEP_RX_ASSIGN_ETHER_TYPE_COUNT 2
166 
167 /* tsnep gate control list operation */
168 struct tsnep_gcl_operation {
169 	u32 properties;
170 	u32 interval;
171 };
172 
173 #define TSNEP_GCL_COUNT (TSNEP_GCL_SIZE / sizeof(struct tsnep_gcl_operation))
174 #define TSNEP_GCL_MASK 0x000000FF
175 #define TSNEP_GCL_INSERT 0x20000000
176 #define TSNEP_GCL_CHANGE 0x40000000
177 #define TSNEP_GCL_LAST 0x80000000
178 #define TSNEP_GCL_MIN_INTERVAL 32
179 
180 /* tsnep TX/RX descriptor */
181 #define TSNEP_DESC_SIZE 256
182 #define TSNEP_DESC_SIZE_DATA_AFTER 2048
183 #define TSNEP_DESC_OFFSET 128
184 #define TSNEP_DESC_OWNER_COUNTER_MASK 0xC0000000
185 #define TSNEP_DESC_OWNER_COUNTER_SHIFT 30
186 #define TSNEP_DESC_LENGTH_MASK 0x00003FFF
187 #define TSNEP_DESC_INTERRUPT_FLAG 0x00040000
188 #define TSNEP_DESC_EXTENDED_WRITEBACK_FLAG 0x00080000
189 #define TSNEP_DESC_NO_LINK_FLAG 0x01000000
190 
191 /* tsnep TX descriptor */
192 struct tsnep_tx_desc {
193 	__le32 properties;
194 	__le32 more_properties;
195 	__le32 reserved[2];
196 	__le64 next;
197 	__le64 tx;
198 };
199 
200 #define TSNEP_TX_DESC_OWNER_MASK 0xE0000000
201 #define TSNEP_TX_DESC_OWNER_USER_FLAG 0x20000000
202 #define TSNEP_TX_DESC_LAST_FRAGMENT_FLAG 0x00010000
203 #define TSNEP_TX_DESC_DATA_AFTER_DESC_FLAG 0x00020000
204 
205 /* tsnep TX descriptor writeback */
206 struct tsnep_tx_desc_wb {
207 	__le32 properties;
208 	__le32 reserved1;
209 	__le64 counter;
210 	__le64 timestamp;
211 	__le32 dma_delay;
212 	__le32 reserved2;
213 };
214 
215 #define TSNEP_TX_DESC_UNDERRUN_ERROR_FLAG 0x00010000
216 #define TSNEP_TX_DESC_DMA_DELAY_FIRST_DATA_MASK 0x0000FFFC
217 #define TSNEP_TX_DESC_DMA_DELAY_FIRST_DATA_SHIFT 2
218 #define TSNEP_TX_DESC_DMA_DELAY_LAST_DATA_MASK 0xFFFC0000
219 #define TSNEP_TX_DESC_DMA_DELAY_LAST_DATA_SHIFT 18
220 #define TSNEP_TX_DESC_DMA_DELAY_NS 64
221 
222 /* tsnep RX descriptor */
223 struct tsnep_rx_desc {
224 	__le32 properties;
225 	__le32 reserved[3];
226 	__le64 next;
227 	__le64 rx;
228 };
229 
230 #define TSNEP_RX_DESC_BUFFER_SIZE_MASK 0x00003FFC
231 
232 /* tsnep RX descriptor writeback */
233 struct tsnep_rx_desc_wb {
234 	__le32 properties;
235 	__le32 reserved[7];
236 };
237 
238 /* tsnep RX inline meta */
239 struct tsnep_rx_inline {
240 	__le64 counter;
241 	__le64 timestamp;
242 };
243 
244 #define TSNEP_RX_INLINE_METADATA_SIZE (sizeof(struct tsnep_rx_inline))
245 
246 #endif /* _TSNEP_HW_H */
247