summaryrefslogtreecommitdiff
path: root/drivers/net/imx_ptp.h
blob: 53a49779010ce0f5ff97b95827447a13b37f894e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
/*
 * drivers/net/imx_ptp.h
 *
 * Copyright (C) 2010 Freescale Semiconductor, Inc. All rights reserved.
 *
 * Description: IEEE 1588 driver supporting imx5 Fast Ethernet Controller.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

#ifndef _PTP_H_
#define _PTP_H_
#ifndef TRUE
#define TRUE	1
#endif
#ifndef FALSE
#define FALSE	0
#endif

#define PTP_NUM_OF_PORTS	2
#define SEQ_ID_OUT_OF_BAND	0xFFFF

/* PTP message types */
enum e_ptp_message {
	e_PTP_MSG_SYNC = 0,	/*Sync message*/
	e_PTP_MSG_DELAY_REQ,	/*Dealy_req message*/
	e_PTP_MSG_FOLLOW_UP,	/*Follow_up message*/
	e_PTP_MSG_DELAY_RESP,	/*Delay_resp message*/
	e_PTP_MSG_MANAGEMENT,	/*Management message*/
	e_PTP_MSG_DUMMY_LAST
};

/* PTP time stamp delivery mode*/
enum e_ptp_tsu_delivery_mode {
	e_PTP_TSU_DELIVERY_IN_BAND,	/*in-band time-sttamp delivery mode*/
	e_PTP_TSU_DELIVERY_OUT_OF_BAND	/*out-of-band time stamp delivery mode*/
};

/*PTP RTC Alarm Polarity Options*/
enum e_ptp_rtc_alarm_polarity {
	e_PTP_RTC_ALARM_POLARITY_ACTIVE_HIGH,	/*active-high output polarity*/
	e_PTP_RTC_ALARM_POLARITY_ACTIVE_LOW	/*active-low output polarity*/
};

/*PTP RTC Trigger Polarity Options*/
enum e_ptp_rtc_trig_polarity {
	e_PTP_RTC_TRIGGER_ON_RISING_EDGE,	/*trigger on rising edge*/
	e_PTP_RTC_TRIGGER_ON_FALLING_EDGE	/*trigger on falling edge*/
};

/*PTP RTC Periodic Pulse Start Mode*/
enum e_ptp_rtc_pulse_start_mode {
	e_PTP_RTC_PULSE_START_AUTO,	/*start pulse when RTC is enabled*/
	e_PTP_RTC_PULSE_START_ON_ALARM	/*start pulse on alarm 1 event*/
};

/*PTP RTC Alarm ID*/
enum e_ptp_rtc_alarm_id {
	e_PTP_RTC_ALARM_1 = 0,	/*alarm signal 1*/
	e_PTP_RTC_ALARM_2,	/*slarm signal 2*/
	e_PTP_RTC_ALARM_DUMMY_LAST
};
#define PTP_RTC_NUM_OF_ALARMS e_PTP_RTC_ALARM_DUMMY_LAST

/*PTP RTC Periodic Pulse ID*/
enum e_ptp_rtc_pulse_id {
	e_PTP_RTC_PULSE_1 = 0,	/*periodic pulse 1*/
	e_PTP_RTC_PULSE_2,	/*periodic pulse 2*/
	e_PTP_RTC_PULSE_3,	/*periodic pulse 3*/
	e_PTP_RTC_PULSE_DUMMY_LASR
};
#define PTP_RTC_NUM_OF_PULSES e_PTP_RTC_PULSE_DUMMY_LASR

/*PTP RTC External trigger ID*/
enum e_ptp_rtc_trigger_id {
	e_PTP_RTC_TRIGGER_1 = 0,	/*External trigger 1*/
	e_PTP_RTC_TRIGGER_2,		/*External trigger 2*/
	e_PTP_RTC_TRIGGER_DUMMY_LAST
};
#define PTP_RTC_NUM_OF_TRIGGERS e_PTP_RTC_TRIGGER_DUMMY_LAST

/* PTP register definition */
#define PTP_TSPDR1		0x0
#define PTP_TSPDR2		0x4
#define PTP_TSPDR3		0x8
#define PTP_TSPDR4		0xc
#define PTP_TSPOV		0x10
#define PTP_TSMR		0x14
#define PTP_TMR_PEVENT		0x18
#define PTP_TMR_PEMASK		0x1c
#define PTP_TMR_RXTS_H		0x20
#define PTP_TMR_RXTS_L		0x30
#define PTP_TMR_TXTS_H		0x40
#define PTP_TMR_TXTS_L		0x50
#define PTP_TSPDR5		0x60
#define PTP_TSPDR6		0x64
#define PTP_TSPDR7		0x68

/* RTC register definition */
#define PTP_TMR_CTRL		0x0
#define PTP_TMR_TEVENT		0x4
#define PTP_TMR_TEMASK		0x8
#define PTP_TMR_CNT_L		0xc
#define PTP_TMR_CNT_H		0x10
#define PTP_TMR_ADD		0x14
#define PTP_TMR_ACC		0x18
#define PTP_TMR_PRSC		0x1c
#define PTP_TMR_OFF_L		0x20
#define PTP_TMR_OFF_H		0x24
#define PTP_TMR_ALARM1_L	0x28
#define PTP_TMR_ALARM1_H	0x2c
#define PTP_TMR_ALARM2_L	0x30
#define PTP_TMR_ALARM2_H	0x34
#define PTP_TMR_FIPER1		0x38
#define PTP_TMR_FIPER2		0x3c
#define PTP_TMR_FIPER3		0x40
#define PTP_TMR_ETTS1_L		0x44
#define PTP_TMR_ETTS1_H		0x48
#define PTP_TMR_ETTS2_L		0x4c
#define PTP_TMR_ETTS2_H		0x50
#define PTP_TMR_FSV_L		0x54
#define PTP_TMR_FSV_H		0x58

/* PTP parser registers*/
#define PTP_TSPDR1_ETT_MASK	0xFFFF0000
#define PTP_TSPDR1_IPT_MASK	0x0000FF00
#define PTP_TSPDR1_ETT_SHIFT	16
#define PTP_TSPDR1_IPT_SHIFT	8

#define PTP_TSPDR2_DPNGE_MASK	0xFFFF0000
#define PTP_TSPDR2_DPNEV_MASK	0x0000FFFF
#define PTP_TSPDR2_DPNGE_SHIFT	16

#define PTP_TSPDR3_SYCTL_MASK	0xFF000000
#define PTP_TSPDR3_DRCTL_MASK	0x00FF0000
#define PTP_TSPDR3_DRPCTL_MASK	0x0000FF00
#define PTP_TSPDR3_FUCTL_MASK	0x000000FF
#define PTP_TSPDR3_SYCTL_SHIFT	24
#define PTP_TSPDR3_DRCTL_SHIFT	16
#define PTP_TSPDR3_DRPCTL_SHIFT	8

#define PTP_TSPDR4_MACTL_MASK	0xFF000000
#define PTP_TSPDR4_VLAN_MASK	0x0000FFFF
#define PTP_TSPDR4_MACTL_SHIFT	24

/*PTP Parsing Offset Values*/
#define PTP_TSPOV_ETTOF_MASK	0xFF000000
#define PTP_TSPOV_IPTOF_MASK	0x00FF0000
#define PTP_TSPOV_UDOF_MASK	0x0000FF00
#define PTP_TSPOV_PTOF_MASK	0x000000FF
#define PTP_TSPOV_ETTOF_SHIFT	24
#define PTP_TSPOV_IPTOF_SHIFT	16
#define PTP_TSPOV_UDOF_SHIFT	8

/*PTP Mode register*/
#define PTP_TSMR_OPMODE1_IN_BAND	0x00080000
#define PTP_TSMR_OPMODE2_IN_BAND	0x00040000
#define PTP_TSMR_OPMODE3_IN_BAND	0x00020000
#define PTP_TSMR_OPMODE4_IN_BAND	0x00010000
#define PTP_TSMR_EN1			0x00000008
#define PTP_TSMR_EN2			0x00000004
#define PTP_TSMR_EN3			0x00000002
#define PTP_TSMR_EN4			0x00000001

/*ptp tsu event register*/
#define PTP_TS_EXR		0x80000000	/*rx, EX to receiver */
#define PTP_TS_RX_OVR1		0x40000000	/*rx,overrun */
#define PTP_TS_TX_OVR1		0x20000000	/*tx,overrun */
#define PTP_TS_RX_SYNC1		0x10000000	/*rx,Sync Frame */
#define PTP_TS_RX_DELAY_REQ1	0x08000000	/*rx,dealy_req frame */
#define PTP_TS_TX_FRAME1	0x04000000	/*tx,PTP frame */
#define PTP_TS_PDRQRE1		0x02000000	/*rx,Pdelay_Req frame */
#define PTP_TS_PDRSRE1		0x01000000	/*rx,Pdelay_Resp frame */
#define PTP_TS_EXT		0x00800000	/*tx, EX to transmitter */
#define DEFAULT_events_PTP_Mask	0xFF800000
#define PTP_TMR_PEVENT_ALL	DEFAULT_events_PTP_Mask
#define PTP_TMR_PEVENT_VALID	0x7F000000

#define PTP_TS_RX_ALL			 \
		(PTP_TS_RX_SYNC1	|\
		 PTP_TS_RX_DELAY_REQ1	|\
		 PTP_TS_PDRQRE1		|\
		 PTP_TS_PDRSRE1)

/*RTC timer control register*/
#define RTC_TMR_CTRL_ALMP1		0x80000000	/*active low output*/
#define RTC_TMR_CTRL_ALMP2		0x40000000	/*active low output*/
#define RTC_TMR_CTRL_FS			0x10000000
#define RTC_TMR_CTRL_TCLK_PERIOD_MSK	0x03FF0000
#define RTC_TMR_CTRL_ETEP2		0x00000200
#define RTC_TMR_CTRL_ETEP1		0x00000100
#define RTC_TMR_CTRL_COPH		0x00000080
#define RTC_TMR_CTRL_CIPH		0x00000040
#define RTC_TMR_CTRL_TMSR		0x00000020
#define RTC_TMR_CTRL_DBG		0x00000010
#define RTC_TMR_CTRL_BYP		0x00000008
#define RTC_TMR_CTRL_TE			0x00000004
#define RTC_TMR_CTRL_CKSEL_TX_CLK	0x00000002
#define RTC_TMR_CTRL_CKSEL_QE_CLK	0x00000001
#define RTC_TMR_CTRL_CKSEL_EXT_CLK	0x00000000
#define RTC_TMR_CTRL_TCLK_PERIOD_SHIFT	16

/*RTC event register*/
#define RTC_TEVENT_EXT_TRIGGER_2_TS	0x02000000	/*External trigger2 TS*/
#define RTC_TEVENT_EXT_TRIGGER_1_TS	0x01000000	/*External trigger1 TS*/
#define RTC_TEVENT_ALARM_2		0x00020000	/*Alarm 2*/
#define RTC_TEVENT_ALARM_1		0x00010000	/*Alarm 1*/
#define RTC_TEVENT_PERIODIC_PULSE_1	0x00000080	/*Periodic pulse 1*/
#define RTC_TEVENT_PERIODIC_PULSE_2	0x00000040	/*Periodic pulse 2*/
#define RTC_TEVENT_PERIODIC_PULSE_3	0x00000020	/*Periodic pulse 3*/

#define RTC_EVENT_ALL				 \
		(RTC_TEVENT_EXT_TRIGGER_2_TS	|\
		RTC_TEVENT_EXT_TRIGGER_1_TS	|\
		RTC_TEVENT_ALARM_2		|\
		RTC_TEVENT_ALARM_1		|\
		RTC_TEVENT_PERIODIC_PULSE_1	|\
		RTC_TEVENT_PERIODIC_PULSE_2	|\
		RTC_TEVENT_PERIODIC_PULSE_3)

#define OFFSET_RTC	0x0000
#define OFFSET_PTP1	0x0080
#define OFFSET_PTP2	0x0100

#define NUM_OF_MODULE	2

/*General definitions*/
#define NANOSEC_PER_ONE_HZ_TICK	1000000000
#define NANOSEC_IN_SEC		NANOSEC_PER_ONE_HZ_TICK
#define MIN_RTC_CLK_FREQ_HZ	1000
#define MHZ			1000000
#define PTP_RTC_FREQ		50	/*MHz*/

/*PTP driver's default values*/
#define ETH_TYPE_VALUE		0x0800	/*IP frame*/
#define VLAN_TYPE_VALUE		0x8100
#define IP_TYPE_VALUE		0x11	/*UDP frame*/
#define UDP_GENERAL_PORT	320
#define UDP_EVENT_PORT		319
#define ETH_TYPE_OFFSET		12
#define IP_TYPE_OFFSET		23
#define UDP_DEST_PORT_OFFSET	36
#define PTP_TYPE_OFFSET		74
#define PTP_SEQUENCE_OFFSET	72
#define LENGTH_OF_TS		8

#define PTP_TX				0x00800000
#define PTP_RX				0x02000000

/*RTC default values*/
#define DEFAULT_SRC_CLOCK		0	/*external clock source*/
#define DEFAULT_BYPASS_COMPENSATION	FALSE
#define DEFAULT_INVERT_INPUT_CLK_PHASE	FALSE
#define DEFAULT_INVERT_OUTPUT_CLK_PHASE	FALSE
#define DEFAULT_OUTPUT_CLOCK_DIVISOR	0x0001
#define DEFAULT_ALARM_POLARITY		e_PTP_RTC_ALARM_POLARITY_ACTIVE_HIGH
#define DEFAULT_TRIGGER_POLARITY	e_PTP_RTC_TRIGGER_ON_RISING_EDGE
#define DEFAULT_PULSE_START_MODE	e_PTP_RTC_PULSE_START_AUTO
#define DEFAULT_EVENTS_RTC_MASK		RTC_EVENT_ALL

/*PTP default message type*/
#define DEFAULT_MSG_SYNC		e_PTP_MSG_SYNC
#define DEFAULT_MSG_DELAY_REQ		e_PTP_MSG_DELAY_REQ
#define DEFAULT_MSG_FOLLOW_UP		e_PTP_MSG_FOLLOW_UP
#define DEFAULT_MSG_DELAY_RESP		e_PTP_MSG_DELAY_RESP
#define DEFAULT_MSG_MANAGEMENT		e_PTP_MSG_MANAGEMENT

#define USE_CASE_PULSE_1_PERIOD		(NANOSEC_IN_SEC)
#define USE_CASE_PULSE_2_PERIOD		(NANOSEC_IN_SEC / 2)
#define USE_CASE_PULSE_3_PERIOD		(NANOSEC_IN_SEC / 4)

#define USE_CASE_ALARM_1_TIME		(NANOSEC_IN_SEC)
#define USE_CASE_ALARM_2_TIME		(NANOSEC_IN_SEC * 2)

#define UCC_PTP_ENABLE			0x40000000

struct ptp_rtc_driver_param {
	u32 src_clock;
	u32 src_clock_freq_hz;
	u32 rtc_freq_hz;
	bool invert_input_clk_phase;
	bool invert_output_clk_phase;
	u32 events_mask;
	enum e_ptp_rtc_pulse_start_mode pulse_start_mode;
	enum e_ptp_rtc_alarm_polarity alarm_polarity[PTP_RTC_NUM_OF_ALARMS];
	enum e_ptp_rtc_trig_polarity trigger_polarity[PTP_RTC_NUM_OF_TRIGGERS];
};

struct ptp_rtc {
	void __iomem *mem_map;		/*pointer to RTC mem*/
	bool bypass_compensation;			/*is bypass?*/
	bool start_pulse_on_alarm;			/*start on alarm 1*/
	u32 clock_period_nansec;			/*clock periodic in ns*/
	u16 output_clock_divisor;			/*clock divisor*/
	struct ptp_rtc_driver_param *driver_param;	/*driver parameters*/
	u32 rtc_irq;
	struct clk *clk;
	struct {
		void *ext_trig_timestamp_queue;
	} ext_trig_ts[2];				/*external trigger ts*/
};

/*PTP driver parameters*/
struct ptp_driver_param {
	u16 eth_type_value;
	u16 vlan_type_value;
	u16 udp_general_port;
	u16 udp_event_port;
	u8 ip_type_value;
	u8 eth_type_offset;
	u8 ip_type_offset;
	u8 udp_dest_port_offset;	/*offset of UDP destination port*/
	u8 ptp_type_offset;
	u8 ptp_msg_codes[e_PTP_MSG_DUMMY_LAST];

	enum e_ptp_tsu_delivery_mode delivery_mode;
};

/*PTP control structure*/
struct ptp {
	spinlock_t lock;
	void __iomem *mem_map;

	/*TSU*/
	u32 events_mask;
	struct fec_ptp_private *fpp;
	struct clk *clk;

	/*RTC*/
	struct ptp_rtc *rtc;		/*pointer to RTC control structure*/
	u32 orig_freq_comp;		/*the initial frequency compensation*/

	/*driver parameters*/
	struct ptp_driver_param *driver_param;

	u32 tx_time_stamps;
	u32 rx_time_stamps;
	u32 tx_time_stamps_overrun;
	u32 rx_time_stamps_overrun;
	u32 alarm_counters[PTP_RTC_NUM_OF_ALARMS];
	u32 pulse_counters[PTP_RTC_NUM_OF_PULSES];
};

#endif