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
|