1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /* Copyright(c) 2013 - 2018 Intel Corporation. */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun #include "i40e.h"
5*4882a593Smuzhiyun #include <linux/ptp_classify.h>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun /* The XL710 timesync is very much like Intel's 82599 design when it comes to
8*4882a593Smuzhiyun * the fundamental clock design. However, the clock operations are much simpler
9*4882a593Smuzhiyun * in the XL710 because the device supports a full 64 bits of nanoseconds.
10*4882a593Smuzhiyun * Because the field is so wide, we can forgo the cycle counter and just
11*4882a593Smuzhiyun * operate with the nanosecond field directly without fear of overflow.
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * Much like the 82599, the update period is dependent upon the link speed:
14*4882a593Smuzhiyun * At 40Gb, 25Gb, or no link, the period is 1.6ns.
15*4882a593Smuzhiyun * At 10Gb or 5Gb link, the period is multiplied by 2. (3.2ns)
16*4882a593Smuzhiyun * At 1Gb link, the period is multiplied by 20. (32ns)
17*4882a593Smuzhiyun * 1588 functionality is not supported at 100Mbps.
18*4882a593Smuzhiyun */
19*4882a593Smuzhiyun #define I40E_PTP_40GB_INCVAL 0x0199999999ULL
20*4882a593Smuzhiyun #define I40E_PTP_10GB_INCVAL_MULT 2
21*4882a593Smuzhiyun #define I40E_PTP_5GB_INCVAL_MULT 2
22*4882a593Smuzhiyun #define I40E_PTP_1GB_INCVAL_MULT 20
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #define I40E_PRTTSYN_CTL1_TSYNTYPE_V1 BIT(I40E_PRTTSYN_CTL1_TSYNTYPE_SHIFT)
25*4882a593Smuzhiyun #define I40E_PRTTSYN_CTL1_TSYNTYPE_V2 (2 << \
26*4882a593Smuzhiyun I40E_PRTTSYN_CTL1_TSYNTYPE_SHIFT)
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /**
29*4882a593Smuzhiyun * i40e_ptp_read - Read the PHC time from the device
30*4882a593Smuzhiyun * @pf: Board private structure
31*4882a593Smuzhiyun * @ts: timespec structure to hold the current time value
32*4882a593Smuzhiyun * @sts: structure to hold the system time before and after reading the PHC
33*4882a593Smuzhiyun *
34*4882a593Smuzhiyun * This function reads the PRTTSYN_TIME registers and stores them in a
35*4882a593Smuzhiyun * timespec. However, since the registers are 64 bits of nanoseconds, we must
36*4882a593Smuzhiyun * convert the result to a timespec before we can return.
37*4882a593Smuzhiyun **/
i40e_ptp_read(struct i40e_pf * pf,struct timespec64 * ts,struct ptp_system_timestamp * sts)38*4882a593Smuzhiyun static void i40e_ptp_read(struct i40e_pf *pf, struct timespec64 *ts,
39*4882a593Smuzhiyun struct ptp_system_timestamp *sts)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
42*4882a593Smuzhiyun u32 hi, lo;
43*4882a593Smuzhiyun u64 ns;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun /* The timer latches on the lowest register read. */
46*4882a593Smuzhiyun ptp_read_system_prets(sts);
47*4882a593Smuzhiyun lo = rd32(hw, I40E_PRTTSYN_TIME_L);
48*4882a593Smuzhiyun ptp_read_system_postts(sts);
49*4882a593Smuzhiyun hi = rd32(hw, I40E_PRTTSYN_TIME_H);
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun ns = (((u64)hi) << 32) | lo;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun *ts = ns_to_timespec64(ns);
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /**
57*4882a593Smuzhiyun * i40e_ptp_write - Write the PHC time to the device
58*4882a593Smuzhiyun * @pf: Board private structure
59*4882a593Smuzhiyun * @ts: timespec structure that holds the new time value
60*4882a593Smuzhiyun *
61*4882a593Smuzhiyun * This function writes the PRTTSYN_TIME registers with the user value. Since
62*4882a593Smuzhiyun * we receive a timespec from the stack, we must convert that timespec into
63*4882a593Smuzhiyun * nanoseconds before programming the registers.
64*4882a593Smuzhiyun **/
i40e_ptp_write(struct i40e_pf * pf,const struct timespec64 * ts)65*4882a593Smuzhiyun static void i40e_ptp_write(struct i40e_pf *pf, const struct timespec64 *ts)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
68*4882a593Smuzhiyun u64 ns = timespec64_to_ns(ts);
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun /* The timer will not update until the high register is written, so
71*4882a593Smuzhiyun * write the low register first.
72*4882a593Smuzhiyun */
73*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_TIME_L, ns & 0xFFFFFFFF);
74*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_TIME_H, ns >> 32);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun /**
78*4882a593Smuzhiyun * i40e_ptp_convert_to_hwtstamp - Convert device clock to system time
79*4882a593Smuzhiyun * @hwtstamps: Timestamp structure to update
80*4882a593Smuzhiyun * @timestamp: Timestamp from the hardware
81*4882a593Smuzhiyun *
82*4882a593Smuzhiyun * We need to convert the NIC clock value into a hwtstamp which can be used by
83*4882a593Smuzhiyun * the upper level timestamping functions. Since the timestamp is simply a 64-
84*4882a593Smuzhiyun * bit nanosecond value, we can call ns_to_ktime directly to handle this.
85*4882a593Smuzhiyun **/
i40e_ptp_convert_to_hwtstamp(struct skb_shared_hwtstamps * hwtstamps,u64 timestamp)86*4882a593Smuzhiyun static void i40e_ptp_convert_to_hwtstamp(struct skb_shared_hwtstamps *hwtstamps,
87*4882a593Smuzhiyun u64 timestamp)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun memset(hwtstamps, 0, sizeof(*hwtstamps));
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun hwtstamps->hwtstamp = ns_to_ktime(timestamp);
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun /**
95*4882a593Smuzhiyun * i40e_ptp_adjfreq - Adjust the PHC frequency
96*4882a593Smuzhiyun * @ptp: The PTP clock structure
97*4882a593Smuzhiyun * @ppb: Parts per billion adjustment from the base
98*4882a593Smuzhiyun *
99*4882a593Smuzhiyun * Adjust the frequency of the PHC by the indicated parts per billion from the
100*4882a593Smuzhiyun * base frequency.
101*4882a593Smuzhiyun **/
i40e_ptp_adjfreq(struct ptp_clock_info * ptp,s32 ppb)102*4882a593Smuzhiyun static int i40e_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun struct i40e_pf *pf = container_of(ptp, struct i40e_pf, ptp_caps);
105*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
106*4882a593Smuzhiyun u64 adj, freq, diff;
107*4882a593Smuzhiyun int neg_adj = 0;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun if (ppb < 0) {
110*4882a593Smuzhiyun neg_adj = 1;
111*4882a593Smuzhiyun ppb = -ppb;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun freq = I40E_PTP_40GB_INCVAL;
115*4882a593Smuzhiyun freq *= ppb;
116*4882a593Smuzhiyun diff = div_u64(freq, 1000000000ULL);
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun if (neg_adj)
119*4882a593Smuzhiyun adj = I40E_PTP_40GB_INCVAL - diff;
120*4882a593Smuzhiyun else
121*4882a593Smuzhiyun adj = I40E_PTP_40GB_INCVAL + diff;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun /* At some link speeds, the base incval is so large that directly
124*4882a593Smuzhiyun * multiplying by ppb would result in arithmetic overflow even when
125*4882a593Smuzhiyun * using a u64. Avoid this by instead calculating the new incval
126*4882a593Smuzhiyun * always in terms of the 40GbE clock rate and then multiplying by the
127*4882a593Smuzhiyun * link speed factor afterwards. This does result in slightly lower
128*4882a593Smuzhiyun * precision at lower link speeds, but it is fairly minor.
129*4882a593Smuzhiyun */
130*4882a593Smuzhiyun smp_mb(); /* Force any pending update before accessing. */
131*4882a593Smuzhiyun adj *= READ_ONCE(pf->ptp_adj_mult);
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_INC_L, adj & 0xFFFFFFFF);
134*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_INC_H, adj >> 32);
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun return 0;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /**
140*4882a593Smuzhiyun * i40e_ptp_adjtime - Adjust the PHC time
141*4882a593Smuzhiyun * @ptp: The PTP clock structure
142*4882a593Smuzhiyun * @delta: Offset in nanoseconds to adjust the PHC time by
143*4882a593Smuzhiyun *
144*4882a593Smuzhiyun * Adjust the current clock time by a delta specified in nanoseconds.
145*4882a593Smuzhiyun **/
i40e_ptp_adjtime(struct ptp_clock_info * ptp,s64 delta)146*4882a593Smuzhiyun static int i40e_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
147*4882a593Smuzhiyun {
148*4882a593Smuzhiyun struct i40e_pf *pf = container_of(ptp, struct i40e_pf, ptp_caps);
149*4882a593Smuzhiyun struct timespec64 now, then;
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun then = ns_to_timespec64(delta);
152*4882a593Smuzhiyun mutex_lock(&pf->tmreg_lock);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun i40e_ptp_read(pf, &now, NULL);
155*4882a593Smuzhiyun now = timespec64_add(now, then);
156*4882a593Smuzhiyun i40e_ptp_write(pf, (const struct timespec64 *)&now);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun mutex_unlock(&pf->tmreg_lock);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun return 0;
161*4882a593Smuzhiyun }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun /**
164*4882a593Smuzhiyun * i40e_ptp_gettimex - Get the time of the PHC
165*4882a593Smuzhiyun * @ptp: The PTP clock structure
166*4882a593Smuzhiyun * @ts: timespec structure to hold the current time value
167*4882a593Smuzhiyun * @sts: structure to hold the system time before and after reading the PHC
168*4882a593Smuzhiyun *
169*4882a593Smuzhiyun * Read the device clock and return the correct value on ns, after converting it
170*4882a593Smuzhiyun * into a timespec struct.
171*4882a593Smuzhiyun **/
i40e_ptp_gettimex(struct ptp_clock_info * ptp,struct timespec64 * ts,struct ptp_system_timestamp * sts)172*4882a593Smuzhiyun static int i40e_ptp_gettimex(struct ptp_clock_info *ptp, struct timespec64 *ts,
173*4882a593Smuzhiyun struct ptp_system_timestamp *sts)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun struct i40e_pf *pf = container_of(ptp, struct i40e_pf, ptp_caps);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun mutex_lock(&pf->tmreg_lock);
178*4882a593Smuzhiyun i40e_ptp_read(pf, ts, sts);
179*4882a593Smuzhiyun mutex_unlock(&pf->tmreg_lock);
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun return 0;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun /**
185*4882a593Smuzhiyun * i40e_ptp_settime - Set the time of the PHC
186*4882a593Smuzhiyun * @ptp: The PTP clock structure
187*4882a593Smuzhiyun * @ts: timespec structure that holds the new time value
188*4882a593Smuzhiyun *
189*4882a593Smuzhiyun * Set the device clock to the user input value. The conversion from timespec
190*4882a593Smuzhiyun * to ns happens in the write function.
191*4882a593Smuzhiyun **/
i40e_ptp_settime(struct ptp_clock_info * ptp,const struct timespec64 * ts)192*4882a593Smuzhiyun static int i40e_ptp_settime(struct ptp_clock_info *ptp,
193*4882a593Smuzhiyun const struct timespec64 *ts)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun struct i40e_pf *pf = container_of(ptp, struct i40e_pf, ptp_caps);
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun mutex_lock(&pf->tmreg_lock);
198*4882a593Smuzhiyun i40e_ptp_write(pf, ts);
199*4882a593Smuzhiyun mutex_unlock(&pf->tmreg_lock);
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun return 0;
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun /**
205*4882a593Smuzhiyun * i40e_ptp_feature_enable - Enable/disable ancillary features of the PHC subsystem
206*4882a593Smuzhiyun * @ptp: The PTP clock structure
207*4882a593Smuzhiyun * @rq: The requested feature to change
208*4882a593Smuzhiyun * @on: Enable/disable flag
209*4882a593Smuzhiyun *
210*4882a593Smuzhiyun * The XL710 does not support any of the ancillary features of the PHC
211*4882a593Smuzhiyun * subsystem, so this function may just return.
212*4882a593Smuzhiyun **/
i40e_ptp_feature_enable(struct ptp_clock_info * ptp,struct ptp_clock_request * rq,int on)213*4882a593Smuzhiyun static int i40e_ptp_feature_enable(struct ptp_clock_info *ptp,
214*4882a593Smuzhiyun struct ptp_clock_request *rq, int on)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun return -EOPNOTSUPP;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun /**
220*4882a593Smuzhiyun * i40e_ptp_update_latch_events - Read I40E_PRTTSYN_STAT_1 and latch events
221*4882a593Smuzhiyun * @pf: the PF data structure
222*4882a593Smuzhiyun *
223*4882a593Smuzhiyun * This function reads I40E_PRTTSYN_STAT_1 and updates the corresponding timers
224*4882a593Smuzhiyun * for noticed latch events. This allows the driver to keep track of the first
225*4882a593Smuzhiyun * time a latch event was noticed which will be used to help clear out Rx
226*4882a593Smuzhiyun * timestamps for packets that got dropped or lost.
227*4882a593Smuzhiyun *
228*4882a593Smuzhiyun * This function will return the current value of I40E_PRTTSYN_STAT_1 and is
229*4882a593Smuzhiyun * expected to be called only while under the ptp_rx_lock.
230*4882a593Smuzhiyun **/
i40e_ptp_get_rx_events(struct i40e_pf * pf)231*4882a593Smuzhiyun static u32 i40e_ptp_get_rx_events(struct i40e_pf *pf)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
234*4882a593Smuzhiyun u32 prttsyn_stat, new_latch_events;
235*4882a593Smuzhiyun int i;
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun prttsyn_stat = rd32(hw, I40E_PRTTSYN_STAT_1);
238*4882a593Smuzhiyun new_latch_events = prttsyn_stat & ~pf->latch_event_flags;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun /* Update the jiffies time for any newly latched timestamp. This
241*4882a593Smuzhiyun * ensures that we store the time that we first discovered a timestamp
242*4882a593Smuzhiyun * was latched by the hardware. The service task will later determine
243*4882a593Smuzhiyun * if we should free the latch and drop that timestamp should too much
244*4882a593Smuzhiyun * time pass. This flow ensures that we only update jiffies for new
245*4882a593Smuzhiyun * events latched since the last time we checked, and not all events
246*4882a593Smuzhiyun * currently latched, so that the service task accounting remains
247*4882a593Smuzhiyun * accurate.
248*4882a593Smuzhiyun */
249*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
250*4882a593Smuzhiyun if (new_latch_events & BIT(i))
251*4882a593Smuzhiyun pf->latch_events[i] = jiffies;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /* Finally, we store the current status of the Rx timestamp latches */
255*4882a593Smuzhiyun pf->latch_event_flags = prttsyn_stat;
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun return prttsyn_stat;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /**
261*4882a593Smuzhiyun * i40e_ptp_rx_hang - Detect error case when Rx timestamp registers are hung
262*4882a593Smuzhiyun * @pf: The PF private data structure
263*4882a593Smuzhiyun *
264*4882a593Smuzhiyun * This watchdog task is scheduled to detect error case where hardware has
265*4882a593Smuzhiyun * dropped an Rx packet that was timestamped when the ring is full. The
266*4882a593Smuzhiyun * particular error is rare but leaves the device in a state unable to timestamp
267*4882a593Smuzhiyun * any future packets.
268*4882a593Smuzhiyun **/
i40e_ptp_rx_hang(struct i40e_pf * pf)269*4882a593Smuzhiyun void i40e_ptp_rx_hang(struct i40e_pf *pf)
270*4882a593Smuzhiyun {
271*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
272*4882a593Smuzhiyun unsigned int i, cleared = 0;
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun /* Since we cannot turn off the Rx timestamp logic if the device is
275*4882a593Smuzhiyun * configured for Tx timestamping, we check if Rx timestamping is
276*4882a593Smuzhiyun * configured. We don't want to spuriously warn about Rx timestamp
277*4882a593Smuzhiyun * hangs if we don't care about the timestamps.
278*4882a593Smuzhiyun */
279*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP) || !pf->ptp_rx)
280*4882a593Smuzhiyun return;
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun spin_lock_bh(&pf->ptp_rx_lock);
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun /* Update current latch times for Rx events */
285*4882a593Smuzhiyun i40e_ptp_get_rx_events(pf);
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun /* Check all the currently latched Rx events and see whether they have
288*4882a593Smuzhiyun * been latched for over a second. It is assumed that any timestamp
289*4882a593Smuzhiyun * should have been cleared within this time, or else it was captured
290*4882a593Smuzhiyun * for a dropped frame that the driver never received. Thus, we will
291*4882a593Smuzhiyun * clear any timestamp that has been latched for over 1 second.
292*4882a593Smuzhiyun */
293*4882a593Smuzhiyun for (i = 0; i < 4; i++) {
294*4882a593Smuzhiyun if ((pf->latch_event_flags & BIT(i)) &&
295*4882a593Smuzhiyun time_is_before_jiffies(pf->latch_events[i] + HZ)) {
296*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_RXTIME_H(i));
297*4882a593Smuzhiyun pf->latch_event_flags &= ~BIT(i);
298*4882a593Smuzhiyun cleared++;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun spin_unlock_bh(&pf->ptp_rx_lock);
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun /* Log a warning if more than 2 timestamps got dropped in the same
305*4882a593Smuzhiyun * check. We don't want to warn about all drops because it can occur
306*4882a593Smuzhiyun * in normal scenarios such as PTP frames on multicast addresses we
307*4882a593Smuzhiyun * aren't listening to. However, administrator should know if this is
308*4882a593Smuzhiyun * the reason packets aren't receiving timestamps.
309*4882a593Smuzhiyun */
310*4882a593Smuzhiyun if (cleared > 2)
311*4882a593Smuzhiyun dev_dbg(&pf->pdev->dev,
312*4882a593Smuzhiyun "Dropped %d missed RXTIME timestamp events\n",
313*4882a593Smuzhiyun cleared);
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun /* Finally, update the rx_hwtstamp_cleared counter */
316*4882a593Smuzhiyun pf->rx_hwtstamp_cleared += cleared;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun
319*4882a593Smuzhiyun /**
320*4882a593Smuzhiyun * i40e_ptp_tx_hang - Detect error case when Tx timestamp register is hung
321*4882a593Smuzhiyun * @pf: The PF private data structure
322*4882a593Smuzhiyun *
323*4882a593Smuzhiyun * This watchdog task is run periodically to make sure that we clear the Tx
324*4882a593Smuzhiyun * timestamp logic if we don't obtain a timestamp in a reasonable amount of
325*4882a593Smuzhiyun * time. It is unexpected in the normal case but if it occurs it results in
326*4882a593Smuzhiyun * permanently preventing timestamps of future packets.
327*4882a593Smuzhiyun **/
i40e_ptp_tx_hang(struct i40e_pf * pf)328*4882a593Smuzhiyun void i40e_ptp_tx_hang(struct i40e_pf *pf)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun struct sk_buff *skb;
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP) || !pf->ptp_tx)
333*4882a593Smuzhiyun return;
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun /* Nothing to do if we're not already waiting for a timestamp */
336*4882a593Smuzhiyun if (!test_bit(__I40E_PTP_TX_IN_PROGRESS, pf->state))
337*4882a593Smuzhiyun return;
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun /* We already have a handler routine which is run when we are notified
340*4882a593Smuzhiyun * of a Tx timestamp in the hardware. If we don't get an interrupt
341*4882a593Smuzhiyun * within a second it is reasonable to assume that we never will.
342*4882a593Smuzhiyun */
343*4882a593Smuzhiyun if (time_is_before_jiffies(pf->ptp_tx_start + HZ)) {
344*4882a593Smuzhiyun skb = pf->ptp_tx_skb;
345*4882a593Smuzhiyun pf->ptp_tx_skb = NULL;
346*4882a593Smuzhiyun clear_bit_unlock(__I40E_PTP_TX_IN_PROGRESS, pf->state);
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun /* Free the skb after we clear the bitlock */
349*4882a593Smuzhiyun dev_kfree_skb_any(skb);
350*4882a593Smuzhiyun pf->tx_hwtstamp_timeouts++;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun /**
355*4882a593Smuzhiyun * i40e_ptp_tx_hwtstamp - Utility function which returns the Tx timestamp
356*4882a593Smuzhiyun * @pf: Board private structure
357*4882a593Smuzhiyun *
358*4882a593Smuzhiyun * Read the value of the Tx timestamp from the registers, convert it into a
359*4882a593Smuzhiyun * value consumable by the stack, and store that result into the shhwtstamps
360*4882a593Smuzhiyun * struct before returning it up the stack.
361*4882a593Smuzhiyun **/
i40e_ptp_tx_hwtstamp(struct i40e_pf * pf)362*4882a593Smuzhiyun void i40e_ptp_tx_hwtstamp(struct i40e_pf *pf)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun struct skb_shared_hwtstamps shhwtstamps;
365*4882a593Smuzhiyun struct sk_buff *skb = pf->ptp_tx_skb;
366*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
367*4882a593Smuzhiyun u32 hi, lo;
368*4882a593Smuzhiyun u64 ns;
369*4882a593Smuzhiyun
370*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP) || !pf->ptp_tx)
371*4882a593Smuzhiyun return;
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun /* don't attempt to timestamp if we don't have an skb */
374*4882a593Smuzhiyun if (!pf->ptp_tx_skb)
375*4882a593Smuzhiyun return;
376*4882a593Smuzhiyun
377*4882a593Smuzhiyun lo = rd32(hw, I40E_PRTTSYN_TXTIME_L);
378*4882a593Smuzhiyun hi = rd32(hw, I40E_PRTTSYN_TXTIME_H);
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun ns = (((u64)hi) << 32) | lo;
381*4882a593Smuzhiyun i40e_ptp_convert_to_hwtstamp(&shhwtstamps, ns);
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun /* Clear the bit lock as soon as possible after reading the register,
384*4882a593Smuzhiyun * and prior to notifying the stack via skb_tstamp_tx(). Otherwise
385*4882a593Smuzhiyun * applications might wake up and attempt to request another transmit
386*4882a593Smuzhiyun * timestamp prior to the bit lock being cleared.
387*4882a593Smuzhiyun */
388*4882a593Smuzhiyun pf->ptp_tx_skb = NULL;
389*4882a593Smuzhiyun clear_bit_unlock(__I40E_PTP_TX_IN_PROGRESS, pf->state);
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun /* Notify the stack and free the skb after we've unlocked */
392*4882a593Smuzhiyun skb_tstamp_tx(skb, &shhwtstamps);
393*4882a593Smuzhiyun dev_kfree_skb_any(skb);
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun /**
397*4882a593Smuzhiyun * i40e_ptp_rx_hwtstamp - Utility function which checks for an Rx timestamp
398*4882a593Smuzhiyun * @pf: Board private structure
399*4882a593Smuzhiyun * @skb: Particular skb to send timestamp with
400*4882a593Smuzhiyun * @index: Index into the receive timestamp registers for the timestamp
401*4882a593Smuzhiyun *
402*4882a593Smuzhiyun * The XL710 receives a notification in the receive descriptor with an offset
403*4882a593Smuzhiyun * into the set of RXTIME registers where the timestamp is for that skb. This
404*4882a593Smuzhiyun * function goes and fetches the receive timestamp from that offset, if a valid
405*4882a593Smuzhiyun * one exists. The RXTIME registers are in ns, so we must convert the result
406*4882a593Smuzhiyun * first.
407*4882a593Smuzhiyun **/
i40e_ptp_rx_hwtstamp(struct i40e_pf * pf,struct sk_buff * skb,u8 index)408*4882a593Smuzhiyun void i40e_ptp_rx_hwtstamp(struct i40e_pf *pf, struct sk_buff *skb, u8 index)
409*4882a593Smuzhiyun {
410*4882a593Smuzhiyun u32 prttsyn_stat, hi, lo;
411*4882a593Smuzhiyun struct i40e_hw *hw;
412*4882a593Smuzhiyun u64 ns;
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun /* Since we cannot turn off the Rx timestamp logic if the device is
415*4882a593Smuzhiyun * doing Tx timestamping, check if Rx timestamping is configured.
416*4882a593Smuzhiyun */
417*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP) || !pf->ptp_rx)
418*4882a593Smuzhiyun return;
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun hw = &pf->hw;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun spin_lock_bh(&pf->ptp_rx_lock);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun /* Get current Rx events and update latch times */
425*4882a593Smuzhiyun prttsyn_stat = i40e_ptp_get_rx_events(pf);
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun /* TODO: Should we warn about missing Rx timestamp event? */
428*4882a593Smuzhiyun if (!(prttsyn_stat & BIT(index))) {
429*4882a593Smuzhiyun spin_unlock_bh(&pf->ptp_rx_lock);
430*4882a593Smuzhiyun return;
431*4882a593Smuzhiyun }
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun /* Clear the latched event since we're about to read its register */
434*4882a593Smuzhiyun pf->latch_event_flags &= ~BIT(index);
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun lo = rd32(hw, I40E_PRTTSYN_RXTIME_L(index));
437*4882a593Smuzhiyun hi = rd32(hw, I40E_PRTTSYN_RXTIME_H(index));
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun spin_unlock_bh(&pf->ptp_rx_lock);
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun ns = (((u64)hi) << 32) | lo;
442*4882a593Smuzhiyun
443*4882a593Smuzhiyun i40e_ptp_convert_to_hwtstamp(skb_hwtstamps(skb), ns);
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun /**
447*4882a593Smuzhiyun * i40e_ptp_set_increment - Utility function to update clock increment rate
448*4882a593Smuzhiyun * @pf: Board private structure
449*4882a593Smuzhiyun *
450*4882a593Smuzhiyun * During a link change, the DMA frequency that drives the 1588 logic will
451*4882a593Smuzhiyun * change. In order to keep the PRTTSYN_TIME registers in units of nanoseconds,
452*4882a593Smuzhiyun * we must update the increment value per clock tick.
453*4882a593Smuzhiyun **/
i40e_ptp_set_increment(struct i40e_pf * pf)454*4882a593Smuzhiyun void i40e_ptp_set_increment(struct i40e_pf *pf)
455*4882a593Smuzhiyun {
456*4882a593Smuzhiyun struct i40e_link_status *hw_link_info;
457*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
458*4882a593Smuzhiyun u64 incval;
459*4882a593Smuzhiyun u32 mult;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun hw_link_info = &hw->phy.link_info;
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun i40e_aq_get_link_info(&pf->hw, true, NULL, NULL);
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun switch (hw_link_info->link_speed) {
466*4882a593Smuzhiyun case I40E_LINK_SPEED_10GB:
467*4882a593Smuzhiyun mult = I40E_PTP_10GB_INCVAL_MULT;
468*4882a593Smuzhiyun break;
469*4882a593Smuzhiyun case I40E_LINK_SPEED_5GB:
470*4882a593Smuzhiyun mult = I40E_PTP_5GB_INCVAL_MULT;
471*4882a593Smuzhiyun break;
472*4882a593Smuzhiyun case I40E_LINK_SPEED_1GB:
473*4882a593Smuzhiyun mult = I40E_PTP_1GB_INCVAL_MULT;
474*4882a593Smuzhiyun break;
475*4882a593Smuzhiyun case I40E_LINK_SPEED_100MB:
476*4882a593Smuzhiyun {
477*4882a593Smuzhiyun static int warn_once;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun if (!warn_once) {
480*4882a593Smuzhiyun dev_warn(&pf->pdev->dev,
481*4882a593Smuzhiyun "1588 functionality is not supported at 100 Mbps. Stopping the PHC.\n");
482*4882a593Smuzhiyun warn_once++;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun mult = 0;
485*4882a593Smuzhiyun break;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun case I40E_LINK_SPEED_40GB:
488*4882a593Smuzhiyun default:
489*4882a593Smuzhiyun mult = 1;
490*4882a593Smuzhiyun break;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun /* The increment value is calculated by taking the base 40GbE incvalue
494*4882a593Smuzhiyun * and multiplying it by a factor based on the link speed.
495*4882a593Smuzhiyun */
496*4882a593Smuzhiyun incval = I40E_PTP_40GB_INCVAL * mult;
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun /* Write the new increment value into the increment register. The
499*4882a593Smuzhiyun * hardware will not update the clock until both registers have been
500*4882a593Smuzhiyun * written.
501*4882a593Smuzhiyun */
502*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_INC_L, incval & 0xFFFFFFFF);
503*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_INC_H, incval >> 32);
504*4882a593Smuzhiyun
505*4882a593Smuzhiyun /* Update the base adjustement value. */
506*4882a593Smuzhiyun WRITE_ONCE(pf->ptp_adj_mult, mult);
507*4882a593Smuzhiyun smp_mb(); /* Force the above update. */
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun /**
511*4882a593Smuzhiyun * i40e_ptp_get_ts_config - ioctl interface to read the HW timestamping
512*4882a593Smuzhiyun * @pf: Board private structure
513*4882a593Smuzhiyun * @ifr: ioctl data
514*4882a593Smuzhiyun *
515*4882a593Smuzhiyun * Obtain the current hardware timestamping settigs as requested. To do this,
516*4882a593Smuzhiyun * keep a shadow copy of the timestamp settings rather than attempting to
517*4882a593Smuzhiyun * deconstruct it from the registers.
518*4882a593Smuzhiyun **/
i40e_ptp_get_ts_config(struct i40e_pf * pf,struct ifreq * ifr)519*4882a593Smuzhiyun int i40e_ptp_get_ts_config(struct i40e_pf *pf, struct ifreq *ifr)
520*4882a593Smuzhiyun {
521*4882a593Smuzhiyun struct hwtstamp_config *config = &pf->tstamp_config;
522*4882a593Smuzhiyun
523*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP))
524*4882a593Smuzhiyun return -EOPNOTSUPP;
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ?
527*4882a593Smuzhiyun -EFAULT : 0;
528*4882a593Smuzhiyun }
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun /**
531*4882a593Smuzhiyun * i40e_ptp_set_timestamp_mode - setup hardware for requested timestamp mode
532*4882a593Smuzhiyun * @pf: Board private structure
533*4882a593Smuzhiyun * @config: hwtstamp settings requested or saved
534*4882a593Smuzhiyun *
535*4882a593Smuzhiyun * Control hardware registers to enter the specific mode requested by the
536*4882a593Smuzhiyun * user. Also used during reset path to ensure that timestamp settings are
537*4882a593Smuzhiyun * maintained.
538*4882a593Smuzhiyun *
539*4882a593Smuzhiyun * Note: modifies config in place, and may update the requested mode to be
540*4882a593Smuzhiyun * more broad if the specific filter is not directly supported.
541*4882a593Smuzhiyun **/
i40e_ptp_set_timestamp_mode(struct i40e_pf * pf,struct hwtstamp_config * config)542*4882a593Smuzhiyun static int i40e_ptp_set_timestamp_mode(struct i40e_pf *pf,
543*4882a593Smuzhiyun struct hwtstamp_config *config)
544*4882a593Smuzhiyun {
545*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
546*4882a593Smuzhiyun u32 tsyntype, regval;
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun /* Reserved for future extensions. */
549*4882a593Smuzhiyun if (config->flags)
550*4882a593Smuzhiyun return -EINVAL;
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun switch (config->tx_type) {
553*4882a593Smuzhiyun case HWTSTAMP_TX_OFF:
554*4882a593Smuzhiyun pf->ptp_tx = false;
555*4882a593Smuzhiyun break;
556*4882a593Smuzhiyun case HWTSTAMP_TX_ON:
557*4882a593Smuzhiyun pf->ptp_tx = true;
558*4882a593Smuzhiyun break;
559*4882a593Smuzhiyun default:
560*4882a593Smuzhiyun return -ERANGE;
561*4882a593Smuzhiyun }
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun switch (config->rx_filter) {
564*4882a593Smuzhiyun case HWTSTAMP_FILTER_NONE:
565*4882a593Smuzhiyun pf->ptp_rx = false;
566*4882a593Smuzhiyun /* We set the type to V1, but do not enable UDP packet
567*4882a593Smuzhiyun * recognition. In this way, we should be as close to
568*4882a593Smuzhiyun * disabling PTP Rx timestamps as possible since V1 packets
569*4882a593Smuzhiyun * are always UDP, since L2 packets are a V2 feature.
570*4882a593Smuzhiyun */
571*4882a593Smuzhiyun tsyntype = I40E_PRTTSYN_CTL1_TSYNTYPE_V1;
572*4882a593Smuzhiyun break;
573*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
574*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
575*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
576*4882a593Smuzhiyun if (!(pf->hw_features & I40E_HW_PTP_L4_CAPABLE))
577*4882a593Smuzhiyun return -ERANGE;
578*4882a593Smuzhiyun pf->ptp_rx = true;
579*4882a593Smuzhiyun tsyntype = I40E_PRTTSYN_CTL1_V1MESSTYPE0_MASK |
580*4882a593Smuzhiyun I40E_PRTTSYN_CTL1_TSYNTYPE_V1 |
581*4882a593Smuzhiyun I40E_PRTTSYN_CTL1_UDP_ENA_MASK;
582*4882a593Smuzhiyun config->rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
583*4882a593Smuzhiyun break;
584*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_EVENT:
585*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
586*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_SYNC:
587*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
588*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
589*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
590*4882a593Smuzhiyun if (!(pf->hw_features & I40E_HW_PTP_L4_CAPABLE))
591*4882a593Smuzhiyun return -ERANGE;
592*4882a593Smuzhiyun fallthrough;
593*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
594*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
595*4882a593Smuzhiyun case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
596*4882a593Smuzhiyun pf->ptp_rx = true;
597*4882a593Smuzhiyun tsyntype = I40E_PRTTSYN_CTL1_V2MESSTYPE0_MASK |
598*4882a593Smuzhiyun I40E_PRTTSYN_CTL1_TSYNTYPE_V2;
599*4882a593Smuzhiyun if (pf->hw_features & I40E_HW_PTP_L4_CAPABLE) {
600*4882a593Smuzhiyun tsyntype |= I40E_PRTTSYN_CTL1_UDP_ENA_MASK;
601*4882a593Smuzhiyun config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
602*4882a593Smuzhiyun } else {
603*4882a593Smuzhiyun config->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
604*4882a593Smuzhiyun }
605*4882a593Smuzhiyun break;
606*4882a593Smuzhiyun case HWTSTAMP_FILTER_NTP_ALL:
607*4882a593Smuzhiyun case HWTSTAMP_FILTER_ALL:
608*4882a593Smuzhiyun default:
609*4882a593Smuzhiyun return -ERANGE;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun /* Clear out all 1588-related registers to clear and unlatch them. */
613*4882a593Smuzhiyun spin_lock_bh(&pf->ptp_rx_lock);
614*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_STAT_0);
615*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_TXTIME_H);
616*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_RXTIME_H(0));
617*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_RXTIME_H(1));
618*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_RXTIME_H(2));
619*4882a593Smuzhiyun rd32(hw, I40E_PRTTSYN_RXTIME_H(3));
620*4882a593Smuzhiyun pf->latch_event_flags = 0;
621*4882a593Smuzhiyun spin_unlock_bh(&pf->ptp_rx_lock);
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun /* Enable/disable the Tx timestamp interrupt based on user input. */
624*4882a593Smuzhiyun regval = rd32(hw, I40E_PRTTSYN_CTL0);
625*4882a593Smuzhiyun if (pf->ptp_tx)
626*4882a593Smuzhiyun regval |= I40E_PRTTSYN_CTL0_TXTIME_INT_ENA_MASK;
627*4882a593Smuzhiyun else
628*4882a593Smuzhiyun regval &= ~I40E_PRTTSYN_CTL0_TXTIME_INT_ENA_MASK;
629*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_CTL0, regval);
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun regval = rd32(hw, I40E_PFINT_ICR0_ENA);
632*4882a593Smuzhiyun if (pf->ptp_tx)
633*4882a593Smuzhiyun regval |= I40E_PFINT_ICR0_ENA_TIMESYNC_MASK;
634*4882a593Smuzhiyun else
635*4882a593Smuzhiyun regval &= ~I40E_PFINT_ICR0_ENA_TIMESYNC_MASK;
636*4882a593Smuzhiyun wr32(hw, I40E_PFINT_ICR0_ENA, regval);
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun /* Although there is no simple on/off switch for Rx, we "disable" Rx
639*4882a593Smuzhiyun * timestamps by setting to V1 only mode and clear the UDP
640*4882a593Smuzhiyun * recognition. This ought to disable all PTP Rx timestamps as V1
641*4882a593Smuzhiyun * packets are always over UDP. Note that software is configured to
642*4882a593Smuzhiyun * ignore Rx timestamps via the pf->ptp_rx flag.
643*4882a593Smuzhiyun */
644*4882a593Smuzhiyun regval = rd32(hw, I40E_PRTTSYN_CTL1);
645*4882a593Smuzhiyun /* clear everything but the enable bit */
646*4882a593Smuzhiyun regval &= I40E_PRTTSYN_CTL1_TSYNENA_MASK;
647*4882a593Smuzhiyun /* now enable bits for desired Rx timestamps */
648*4882a593Smuzhiyun regval |= tsyntype;
649*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_CTL1, regval);
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun return 0;
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun /**
655*4882a593Smuzhiyun * i40e_ptp_set_ts_config - ioctl interface to control the HW timestamping
656*4882a593Smuzhiyun * @pf: Board private structure
657*4882a593Smuzhiyun * @ifr: ioctl data
658*4882a593Smuzhiyun *
659*4882a593Smuzhiyun * Respond to the user filter requests and make the appropriate hardware
660*4882a593Smuzhiyun * changes here. The XL710 cannot support splitting of the Tx/Rx timestamping
661*4882a593Smuzhiyun * logic, so keep track in software of whether to indicate these timestamps
662*4882a593Smuzhiyun * or not.
663*4882a593Smuzhiyun *
664*4882a593Smuzhiyun * It is permissible to "upgrade" the user request to a broader filter, as long
665*4882a593Smuzhiyun * as the user receives the timestamps they care about and the user is notified
666*4882a593Smuzhiyun * the filter has been broadened.
667*4882a593Smuzhiyun **/
i40e_ptp_set_ts_config(struct i40e_pf * pf,struct ifreq * ifr)668*4882a593Smuzhiyun int i40e_ptp_set_ts_config(struct i40e_pf *pf, struct ifreq *ifr)
669*4882a593Smuzhiyun {
670*4882a593Smuzhiyun struct hwtstamp_config config;
671*4882a593Smuzhiyun int err;
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP))
674*4882a593Smuzhiyun return -EOPNOTSUPP;
675*4882a593Smuzhiyun
676*4882a593Smuzhiyun if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
677*4882a593Smuzhiyun return -EFAULT;
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun err = i40e_ptp_set_timestamp_mode(pf, &config);
680*4882a593Smuzhiyun if (err)
681*4882a593Smuzhiyun return err;
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun /* save these settings for future reference */
684*4882a593Smuzhiyun pf->tstamp_config = config;
685*4882a593Smuzhiyun
686*4882a593Smuzhiyun return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
687*4882a593Smuzhiyun -EFAULT : 0;
688*4882a593Smuzhiyun }
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun /**
691*4882a593Smuzhiyun * i40e_ptp_create_clock - Create PTP clock device for userspace
692*4882a593Smuzhiyun * @pf: Board private structure
693*4882a593Smuzhiyun *
694*4882a593Smuzhiyun * This function creates a new PTP clock device. It only creates one if we
695*4882a593Smuzhiyun * don't already have one, so it is safe to call. Will return error if it
696*4882a593Smuzhiyun * can't create one, but success if we already have a device. Should be used
697*4882a593Smuzhiyun * by i40e_ptp_init to create clock initially, and prevent global resets from
698*4882a593Smuzhiyun * creating new clock devices.
699*4882a593Smuzhiyun **/
i40e_ptp_create_clock(struct i40e_pf * pf)700*4882a593Smuzhiyun static long i40e_ptp_create_clock(struct i40e_pf *pf)
701*4882a593Smuzhiyun {
702*4882a593Smuzhiyun /* no need to create a clock device if we already have one */
703*4882a593Smuzhiyun if (!IS_ERR_OR_NULL(pf->ptp_clock))
704*4882a593Smuzhiyun return 0;
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun strlcpy(pf->ptp_caps.name, i40e_driver_name,
707*4882a593Smuzhiyun sizeof(pf->ptp_caps.name) - 1);
708*4882a593Smuzhiyun pf->ptp_caps.owner = THIS_MODULE;
709*4882a593Smuzhiyun pf->ptp_caps.max_adj = 999999999;
710*4882a593Smuzhiyun pf->ptp_caps.n_ext_ts = 0;
711*4882a593Smuzhiyun pf->ptp_caps.pps = 0;
712*4882a593Smuzhiyun pf->ptp_caps.adjfreq = i40e_ptp_adjfreq;
713*4882a593Smuzhiyun pf->ptp_caps.adjtime = i40e_ptp_adjtime;
714*4882a593Smuzhiyun pf->ptp_caps.gettimex64 = i40e_ptp_gettimex;
715*4882a593Smuzhiyun pf->ptp_caps.settime64 = i40e_ptp_settime;
716*4882a593Smuzhiyun pf->ptp_caps.enable = i40e_ptp_feature_enable;
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun /* Attempt to register the clock before enabling the hardware. */
719*4882a593Smuzhiyun pf->ptp_clock = ptp_clock_register(&pf->ptp_caps, &pf->pdev->dev);
720*4882a593Smuzhiyun if (IS_ERR(pf->ptp_clock))
721*4882a593Smuzhiyun return PTR_ERR(pf->ptp_clock);
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun /* clear the hwtstamp settings here during clock create, instead of
724*4882a593Smuzhiyun * during regular init, so that we can maintain settings across a
725*4882a593Smuzhiyun * reset or suspend.
726*4882a593Smuzhiyun */
727*4882a593Smuzhiyun pf->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE;
728*4882a593Smuzhiyun pf->tstamp_config.tx_type = HWTSTAMP_TX_OFF;
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun /* Set the previous "reset" time to the current Kernel clock time */
731*4882a593Smuzhiyun ktime_get_real_ts64(&pf->ptp_prev_hw_time);
732*4882a593Smuzhiyun pf->ptp_reset_start = ktime_get();
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun return 0;
735*4882a593Smuzhiyun }
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun /**
738*4882a593Smuzhiyun * i40e_ptp_save_hw_time - Save the current PTP time as ptp_prev_hw_time
739*4882a593Smuzhiyun * @pf: Board private structure
740*4882a593Smuzhiyun *
741*4882a593Smuzhiyun * Read the current PTP time and save it into pf->ptp_prev_hw_time. This should
742*4882a593Smuzhiyun * be called at the end of preparing to reset, just before hardware reset
743*4882a593Smuzhiyun * occurs, in order to preserve the PTP time as close as possible across
744*4882a593Smuzhiyun * resets.
745*4882a593Smuzhiyun */
i40e_ptp_save_hw_time(struct i40e_pf * pf)746*4882a593Smuzhiyun void i40e_ptp_save_hw_time(struct i40e_pf *pf)
747*4882a593Smuzhiyun {
748*4882a593Smuzhiyun /* don't try to access the PTP clock if it's not enabled */
749*4882a593Smuzhiyun if (!(pf->flags & I40E_FLAG_PTP))
750*4882a593Smuzhiyun return;
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun i40e_ptp_gettimex(&pf->ptp_caps, &pf->ptp_prev_hw_time, NULL);
753*4882a593Smuzhiyun /* Get a monotonic starting time for this reset */
754*4882a593Smuzhiyun pf->ptp_reset_start = ktime_get();
755*4882a593Smuzhiyun }
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun /**
758*4882a593Smuzhiyun * i40e_ptp_restore_hw_time - Restore the ptp_prev_hw_time + delta to PTP regs
759*4882a593Smuzhiyun * @pf: Board private structure
760*4882a593Smuzhiyun *
761*4882a593Smuzhiyun * Restore the PTP hardware clock registers. We previously cached the PTP
762*4882a593Smuzhiyun * hardware time as pf->ptp_prev_hw_time. To be as accurate as possible,
763*4882a593Smuzhiyun * update this value based on the time delta since the time was saved, using
764*4882a593Smuzhiyun * CLOCK_MONOTONIC (via ktime_get()) to calculate the time difference.
765*4882a593Smuzhiyun *
766*4882a593Smuzhiyun * This ensures that the hardware clock is restored to nearly what it should
767*4882a593Smuzhiyun * have been if a reset had not occurred.
768*4882a593Smuzhiyun */
i40e_ptp_restore_hw_time(struct i40e_pf * pf)769*4882a593Smuzhiyun void i40e_ptp_restore_hw_time(struct i40e_pf *pf)
770*4882a593Smuzhiyun {
771*4882a593Smuzhiyun ktime_t delta = ktime_sub(ktime_get(), pf->ptp_reset_start);
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun /* Update the previous HW time with the ktime delta */
774*4882a593Smuzhiyun timespec64_add_ns(&pf->ptp_prev_hw_time, ktime_to_ns(delta));
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun /* Restore the hardware clock registers */
777*4882a593Smuzhiyun i40e_ptp_settime(&pf->ptp_caps, &pf->ptp_prev_hw_time);
778*4882a593Smuzhiyun }
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun /**
781*4882a593Smuzhiyun * i40e_ptp_init - Initialize the 1588 support after device probe or reset
782*4882a593Smuzhiyun * @pf: Board private structure
783*4882a593Smuzhiyun *
784*4882a593Smuzhiyun * This function sets device up for 1588 support. The first time it is run, it
785*4882a593Smuzhiyun * will create a PHC clock device. It does not create a clock device if one
786*4882a593Smuzhiyun * already exists. It also reconfigures the device after a reset.
787*4882a593Smuzhiyun *
788*4882a593Smuzhiyun * The first time a clock is created, i40e_ptp_create_clock will set
789*4882a593Smuzhiyun * pf->ptp_prev_hw_time to the current system time. During resets, it is
790*4882a593Smuzhiyun * expected that this timespec will be set to the last known PTP clock time,
791*4882a593Smuzhiyun * in order to preserve the clock time as close as possible across a reset.
792*4882a593Smuzhiyun **/
i40e_ptp_init(struct i40e_pf * pf)793*4882a593Smuzhiyun void i40e_ptp_init(struct i40e_pf *pf)
794*4882a593Smuzhiyun {
795*4882a593Smuzhiyun struct net_device *netdev = pf->vsi[pf->lan_vsi]->netdev;
796*4882a593Smuzhiyun struct i40e_hw *hw = &pf->hw;
797*4882a593Smuzhiyun u32 pf_id;
798*4882a593Smuzhiyun long err;
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun /* Only one PF is assigned to control 1588 logic per port. Do not
801*4882a593Smuzhiyun * enable any support for PFs not assigned via PRTTSYN_CTL0.PF_ID
802*4882a593Smuzhiyun */
803*4882a593Smuzhiyun pf_id = (rd32(hw, I40E_PRTTSYN_CTL0) & I40E_PRTTSYN_CTL0_PF_ID_MASK) >>
804*4882a593Smuzhiyun I40E_PRTTSYN_CTL0_PF_ID_SHIFT;
805*4882a593Smuzhiyun if (hw->pf_id != pf_id) {
806*4882a593Smuzhiyun pf->flags &= ~I40E_FLAG_PTP;
807*4882a593Smuzhiyun dev_info(&pf->pdev->dev, "%s: PTP not supported on %s\n",
808*4882a593Smuzhiyun __func__,
809*4882a593Smuzhiyun netdev->name);
810*4882a593Smuzhiyun return;
811*4882a593Smuzhiyun }
812*4882a593Smuzhiyun
813*4882a593Smuzhiyun mutex_init(&pf->tmreg_lock);
814*4882a593Smuzhiyun spin_lock_init(&pf->ptp_rx_lock);
815*4882a593Smuzhiyun
816*4882a593Smuzhiyun /* ensure we have a clock device */
817*4882a593Smuzhiyun err = i40e_ptp_create_clock(pf);
818*4882a593Smuzhiyun if (err) {
819*4882a593Smuzhiyun pf->ptp_clock = NULL;
820*4882a593Smuzhiyun dev_err(&pf->pdev->dev, "%s: ptp_clock_register failed\n",
821*4882a593Smuzhiyun __func__);
822*4882a593Smuzhiyun } else if (pf->ptp_clock) {
823*4882a593Smuzhiyun u32 regval;
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun if (pf->hw.debug_mask & I40E_DEBUG_LAN)
826*4882a593Smuzhiyun dev_info(&pf->pdev->dev, "PHC enabled\n");
827*4882a593Smuzhiyun pf->flags |= I40E_FLAG_PTP;
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun /* Ensure the clocks are running. */
830*4882a593Smuzhiyun regval = rd32(hw, I40E_PRTTSYN_CTL0);
831*4882a593Smuzhiyun regval |= I40E_PRTTSYN_CTL0_TSYNENA_MASK;
832*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_CTL0, regval);
833*4882a593Smuzhiyun regval = rd32(hw, I40E_PRTTSYN_CTL1);
834*4882a593Smuzhiyun regval |= I40E_PRTTSYN_CTL1_TSYNENA_MASK;
835*4882a593Smuzhiyun wr32(hw, I40E_PRTTSYN_CTL1, regval);
836*4882a593Smuzhiyun
837*4882a593Smuzhiyun /* Set the increment value per clock tick. */
838*4882a593Smuzhiyun i40e_ptp_set_increment(pf);
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun /* reset timestamping mode */
841*4882a593Smuzhiyun i40e_ptp_set_timestamp_mode(pf, &pf->tstamp_config);
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun /* Restore the clock time based on last known value */
844*4882a593Smuzhiyun i40e_ptp_restore_hw_time(pf);
845*4882a593Smuzhiyun }
846*4882a593Smuzhiyun }
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun /**
849*4882a593Smuzhiyun * i40e_ptp_stop - Disable the driver/hardware support and unregister the PHC
850*4882a593Smuzhiyun * @pf: Board private structure
851*4882a593Smuzhiyun *
852*4882a593Smuzhiyun * This function handles the cleanup work required from the initialization by
853*4882a593Smuzhiyun * clearing out the important information and unregistering the PHC.
854*4882a593Smuzhiyun **/
i40e_ptp_stop(struct i40e_pf * pf)855*4882a593Smuzhiyun void i40e_ptp_stop(struct i40e_pf *pf)
856*4882a593Smuzhiyun {
857*4882a593Smuzhiyun pf->flags &= ~I40E_FLAG_PTP;
858*4882a593Smuzhiyun pf->ptp_tx = false;
859*4882a593Smuzhiyun pf->ptp_rx = false;
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun if (pf->ptp_tx_skb) {
862*4882a593Smuzhiyun struct sk_buff *skb = pf->ptp_tx_skb;
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun pf->ptp_tx_skb = NULL;
865*4882a593Smuzhiyun clear_bit_unlock(__I40E_PTP_TX_IN_PROGRESS, pf->state);
866*4882a593Smuzhiyun dev_kfree_skb_any(skb);
867*4882a593Smuzhiyun }
868*4882a593Smuzhiyun
869*4882a593Smuzhiyun if (pf->ptp_clock) {
870*4882a593Smuzhiyun ptp_clock_unregister(pf->ptp_clock);
871*4882a593Smuzhiyun pf->ptp_clock = NULL;
872*4882a593Smuzhiyun dev_info(&pf->pdev->dev, "%s: removed PHC on %s\n", __func__,
873*4882a593Smuzhiyun pf->vsi[pf->lan_vsi]->netdev->name);
874*4882a593Smuzhiyun }
875*4882a593Smuzhiyun }
876