1 /* Intel Ethernet Switch Host Interface Driver
2  * Copyright(c) 2013 - 2015 Intel Corporation.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms and conditions of the GNU General Public License,
6  * version 2, as published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  *
13  * The full GNU General Public License is included in this distribution in
14  * the file called "COPYING".
15  *
16  * Contact Information:
17  * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
18  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
19  */
20 
21 #include <linux/ptp_classify.h>
22 #include <linux/ptp_clock_kernel.h>
23 
24 #include "fm10k.h"
25 
26 #define FM10K_TS_TX_TIMEOUT		(HZ * 15)
27 
fm10k_systime_to_hwtstamp(struct fm10k_intfc * interface,struct skb_shared_hwtstamps * hwtstamp,u64 systime)28 void fm10k_systime_to_hwtstamp(struct fm10k_intfc *interface,
29 			       struct skb_shared_hwtstamps *hwtstamp,
30 			       u64 systime)
31 {
32 	unsigned long flags;
33 
34 	read_lock_irqsave(&interface->systime_lock, flags);
35 	systime += interface->ptp_adjust;
36 	read_unlock_irqrestore(&interface->systime_lock, flags);
37 
38 	hwtstamp->hwtstamp = ns_to_ktime(systime);
39 }
40 
fm10k_ts_tx_skb(struct fm10k_intfc * interface,__le16 dglort)41 static struct sk_buff *fm10k_ts_tx_skb(struct fm10k_intfc *interface,
42 				       __le16 dglort)
43 {
44 	struct sk_buff_head *list = &interface->ts_tx_skb_queue;
45 	struct sk_buff *skb;
46 
47 	skb_queue_walk(list, skb) {
48 		if (FM10K_CB(skb)->fi.w.dglort == dglort)
49 			return skb;
50 	}
51 
52 	return NULL;
53 }
54 
fm10k_ts_tx_enqueue(struct fm10k_intfc * interface,struct sk_buff * skb)55 void fm10k_ts_tx_enqueue(struct fm10k_intfc *interface, struct sk_buff *skb)
56 {
57 	struct sk_buff_head *list = &interface->ts_tx_skb_queue;
58 	struct sk_buff *clone;
59 	unsigned long flags;
60 
61 	/* create clone for us to return on the Tx path */
62 	clone = skb_clone_sk(skb);
63 	if (!clone)
64 		return;
65 
66 	FM10K_CB(clone)->ts_tx_timeout = jiffies + FM10K_TS_TX_TIMEOUT;
67 	spin_lock_irqsave(&list->lock, flags);
68 
69 	/* attempt to locate any buffers with the same dglort,
70 	 * if none are present then insert skb in tail of list
71 	 */
72 	skb = fm10k_ts_tx_skb(interface, FM10K_CB(clone)->fi.w.dglort);
73 	if (!skb)
74 		__skb_queue_tail(list, clone);
75 
76 	spin_unlock_irqrestore(&list->lock, flags);
77 
78 	/* if list is already has one then we just free the clone */
79 	if (skb)
80 		kfree_skb(skb);
81 	else
82 		skb_shinfo(clone)->tx_flags |= SKBTX_IN_PROGRESS;
83 }
84 
fm10k_ts_tx_hwtstamp(struct fm10k_intfc * interface,__le16 dglort,u64 systime)85 void fm10k_ts_tx_hwtstamp(struct fm10k_intfc *interface, __le16 dglort,
86 			  u64 systime)
87 {
88 	struct skb_shared_hwtstamps shhwtstamps;
89 	struct sk_buff_head *list = &interface->ts_tx_skb_queue;
90 	struct sk_buff *skb;
91 	unsigned long flags;
92 
93 	spin_lock_irqsave(&list->lock, flags);
94 
95 	/* attempt to locate and pull the sk_buff out of the list */
96 	skb = fm10k_ts_tx_skb(interface, dglort);
97 	if (skb)
98 		__skb_unlink(skb, list);
99 
100 	spin_unlock_irqrestore(&list->lock, flags);
101 
102 	/* if not found do nothing */
103 	if (!skb)
104 		return;
105 
106 	/* timestamp the sk_buff and return it to the socket */
107 	fm10k_systime_to_hwtstamp(interface, &shhwtstamps, systime);
108 	skb_complete_tx_timestamp(skb, &shhwtstamps);
109 }
110 
fm10k_ts_tx_subtask(struct fm10k_intfc * interface)111 void fm10k_ts_tx_subtask(struct fm10k_intfc *interface)
112 {
113 	struct sk_buff_head *list = &interface->ts_tx_skb_queue;
114 	struct sk_buff *skb, *tmp;
115 	unsigned long flags;
116 
117 	/* If we're down or resetting, just bail */
118 	if (test_bit(__FM10K_DOWN, &interface->state) ||
119 	    test_bit(__FM10K_RESETTING, &interface->state))
120 		return;
121 
122 	spin_lock_irqsave(&list->lock, flags);
123 
124 	/* walk though the list and flush any expired timestamp packets */
125 	skb_queue_walk_safe(list, skb, tmp) {
126 		if (!time_is_after_jiffies(FM10K_CB(skb)->ts_tx_timeout))
127 			continue;
128 		__skb_unlink(skb, list);
129 		kfree_skb(skb);
130 		interface->tx_hwtstamp_timeouts++;
131 	}
132 
133 	spin_unlock_irqrestore(&list->lock, flags);
134 }
135 
fm10k_systime_read(struct fm10k_intfc * interface)136 static u64 fm10k_systime_read(struct fm10k_intfc *interface)
137 {
138 	struct fm10k_hw *hw = &interface->hw;
139 
140 	return hw->mac.ops.read_systime(hw);
141 }
142 
fm10k_ts_reset(struct fm10k_intfc * interface)143 void fm10k_ts_reset(struct fm10k_intfc *interface)
144 {
145 	s64 ns = ktime_to_ns(ktime_get_real());
146 	unsigned long flags;
147 
148 	/* reinitialize the clock */
149 	write_lock_irqsave(&interface->systime_lock, flags);
150 	interface->ptp_adjust = fm10k_systime_read(interface) - ns;
151 	write_unlock_irqrestore(&interface->systime_lock, flags);
152 }
153 
fm10k_ts_init(struct fm10k_intfc * interface)154 void fm10k_ts_init(struct fm10k_intfc *interface)
155 {
156 	/* Initialize lock protecting systime access */
157 	rwlock_init(&interface->systime_lock);
158 
159 	/* Initialize skb queue for pending timestamp requests */
160 	skb_queue_head_init(&interface->ts_tx_skb_queue);
161 
162 	/* reset the clock to current kernel time */
163 	fm10k_ts_reset(interface);
164 }
165 
166 /**
167  * fm10k_get_ts_config - get current hardware timestamping configuration
168  * @netdev: network interface device structure
169  * @ifreq: ioctl data
170  *
171  * This function returns the current timestamping settings. Rather than
172  * attempt to deconstruct registers to fill in the values, simply keep a copy
173  * of the old settings around, and return a copy when requested.
174  */
fm10k_get_ts_config(struct net_device * netdev,struct ifreq * ifr)175 int fm10k_get_ts_config(struct net_device *netdev, struct ifreq *ifr)
176 {
177 	struct fm10k_intfc *interface = netdev_priv(netdev);
178 	struct hwtstamp_config *config = &interface->ts_config;
179 
180 	return copy_to_user(ifr->ifr_data, config, sizeof(*config)) ?
181 		-EFAULT : 0;
182 }
183 
184 /**
185  * fm10k_set_ts_config - control hardware time stamping
186  * @netdev: network interface device structure
187  * @ifreq: ioctl data
188  *
189  * Outgoing time stamping can be enabled and disabled. Play nice and
190  * disable it when requested, although it shouldn't cause any overhead
191  * when no packet needs it. At most one packet in the queue may be
192  * marked for time stamping, otherwise it would be impossible to tell
193  * for sure to which packet the hardware time stamp belongs.
194  *
195  * Incoming time stamping has to be configured via the hardware
196  * filters. Not all combinations are supported, in particular event
197  * type has to be specified. Matching the kind of event packet is
198  * not supported, with the exception of "all V2 events regardless of
199  * level 2 or 4".
200  *
201  * Since hardware always timestamps Path delay packets when timestamping V2
202  * packets, regardless of the type specified in the register, only use V2
203  * Event mode. This more accurately tells the user what the hardware is going
204  * to do anyways.
205  */
fm10k_set_ts_config(struct net_device * netdev,struct ifreq * ifr)206 int fm10k_set_ts_config(struct net_device *netdev, struct ifreq *ifr)
207 {
208 	struct fm10k_intfc *interface = netdev_priv(netdev);
209 	struct hwtstamp_config ts_config;
210 
211 	if (copy_from_user(&ts_config, ifr->ifr_data, sizeof(ts_config)))
212 		return -EFAULT;
213 
214 	/* reserved for future extensions */
215 	if (ts_config.flags)
216 		return -EINVAL;
217 
218 	switch (ts_config.tx_type) {
219 	case HWTSTAMP_TX_OFF:
220 		break;
221 	case HWTSTAMP_TX_ON:
222 		/* we likely need some check here to see if this is supported */
223 		break;
224 	default:
225 		return -ERANGE;
226 	}
227 
228 	switch (ts_config.rx_filter) {
229 	case HWTSTAMP_FILTER_NONE:
230 		interface->flags &= ~FM10K_FLAG_RX_TS_ENABLED;
231 		break;
232 	case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
233 	case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
234 	case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
235 	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
236 	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
237 	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
238 	case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
239 	case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
240 	case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
241 	case HWTSTAMP_FILTER_PTP_V2_EVENT:
242 	case HWTSTAMP_FILTER_PTP_V2_SYNC:
243 	case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
244 	case HWTSTAMP_FILTER_ALL:
245 		interface->flags |= FM10K_FLAG_RX_TS_ENABLED;
246 		ts_config.rx_filter = HWTSTAMP_FILTER_ALL;
247 		break;
248 	default:
249 		return -ERANGE;
250 	}
251 
252 	/* save these settings for future reference */
253 	interface->ts_config = ts_config;
254 
255 	return copy_to_user(ifr->ifr_data, &ts_config, sizeof(ts_config)) ?
256 		-EFAULT : 0;
257 }
258 
fm10k_ptp_adjfreq(struct ptp_clock_info * ptp,s32 ppb)259 static int fm10k_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
260 {
261 	struct fm10k_intfc *interface;
262 	struct fm10k_hw *hw;
263 	int err;
264 
265 	interface = container_of(ptp, struct fm10k_intfc, ptp_caps);
266 	hw = &interface->hw;
267 
268 	err = hw->mac.ops.adjust_systime(hw, ppb);
269 
270 	/* the only error we should see is if the value is out of range */
271 	return (err == FM10K_ERR_PARAM) ? -ERANGE : err;
272 }
273 
fm10k_ptp_adjtime(struct ptp_clock_info * ptp,s64 delta)274 static int fm10k_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
275 {
276 	struct fm10k_intfc *interface;
277 	unsigned long flags;
278 
279 	interface = container_of(ptp, struct fm10k_intfc, ptp_caps);
280 
281 	write_lock_irqsave(&interface->systime_lock, flags);
282 	interface->ptp_adjust += delta;
283 	write_unlock_irqrestore(&interface->systime_lock, flags);
284 
285 	return 0;
286 }
287 
fm10k_ptp_gettime(struct ptp_clock_info * ptp,struct timespec64 * ts)288 static int fm10k_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
289 {
290 	struct fm10k_intfc *interface;
291 	unsigned long flags;
292 	u64 now;
293 
294 	interface = container_of(ptp, struct fm10k_intfc, ptp_caps);
295 
296 	read_lock_irqsave(&interface->systime_lock, flags);
297 	now = fm10k_systime_read(interface) + interface->ptp_adjust;
298 	read_unlock_irqrestore(&interface->systime_lock, flags);
299 
300 	*ts = ns_to_timespec64(now);
301 
302 	return 0;
303 }
304 
fm10k_ptp_settime(struct ptp_clock_info * ptp,const struct timespec64 * ts)305 static int fm10k_ptp_settime(struct ptp_clock_info *ptp,
306 			     const struct timespec64 *ts)
307 {
308 	struct fm10k_intfc *interface;
309 	unsigned long flags;
310 	u64 ns = timespec64_to_ns(ts);
311 
312 	interface = container_of(ptp, struct fm10k_intfc, ptp_caps);
313 
314 	write_lock_irqsave(&interface->systime_lock, flags);
315 	interface->ptp_adjust = fm10k_systime_read(interface) - ns;
316 	write_unlock_irqrestore(&interface->systime_lock, flags);
317 
318 	return 0;
319 }
320 
fm10k_ptp_enable(struct ptp_clock_info * ptp,struct ptp_clock_request * rq,int __always_unused on)321 static int fm10k_ptp_enable(struct ptp_clock_info *ptp,
322 			    struct ptp_clock_request *rq,
323 			    int __always_unused on)
324 {
325 	struct ptp_clock_time *t = &rq->perout.period;
326 	struct fm10k_intfc *interface;
327 	struct fm10k_hw *hw;
328 	u64 period;
329 	u32 step;
330 
331 	/* we can only support periodic output */
332 	if (rq->type != PTP_CLK_REQ_PEROUT)
333 		return -EINVAL;
334 
335 	/* verify the requested channel is there */
336 	if (rq->perout.index >= ptp->n_per_out)
337 		return -EINVAL;
338 
339 	/* we cannot enforce start time as there is no
340 	 * mechanism for that in the hardware, we can only control
341 	 * the period.
342 	 */
343 
344 	/* we cannot support periods greater than 4 seconds due to reg limit */
345 	if (t->sec > 4 || t->sec < 0)
346 		return -ERANGE;
347 
348 	interface = container_of(ptp, struct fm10k_intfc, ptp_caps);
349 	hw = &interface->hw;
350 
351 	/* we simply cannot support the operation if we don't have BAR4 */
352 	if (!hw->sw_addr)
353 		return -ENOTSUPP;
354 
355 	/* convert to unsigned 64b ns, verify we can put it in a 32b register */
356 	period = t->sec * 1000000000LL + t->nsec;
357 
358 	/* determine the minimum size for period */
359 	step = 2 * (fm10k_read_reg(hw, FM10K_SYSTIME_CFG) &
360 		    FM10K_SYSTIME_CFG_STEP_MASK);
361 
362 	/* verify the value is in range supported by hardware */
363 	if ((period && (period < step)) || (period > U32_MAX))
364 		return -ERANGE;
365 
366 	/* notify hardware of request to being sending pulses */
367 	fm10k_write_sw_reg(hw, FM10K_SW_SYSTIME_PULSE(rq->perout.index),
368 			   (u32)period);
369 
370 	return 0;
371 }
372 
373 static struct ptp_pin_desc fm10k_ptp_pd[2] = {
374 	{
375 		.name = "IEEE1588_PULSE0",
376 		.index = 0,
377 		.func = PTP_PF_PEROUT,
378 		.chan = 0
379 	},
380 	{
381 		.name = "IEEE1588_PULSE1",
382 		.index = 1,
383 		.func = PTP_PF_PEROUT,
384 		.chan = 1
385 	}
386 };
387 
fm10k_ptp_verify(struct ptp_clock_info * ptp,unsigned int pin,enum ptp_pin_function func,unsigned int chan)388 static int fm10k_ptp_verify(struct ptp_clock_info *ptp, unsigned int pin,
389 			    enum ptp_pin_function func, unsigned int chan)
390 {
391 	/* verify the requested pin is there */
392 	if (pin >= ptp->n_pins || !ptp->pin_config)
393 		return -EINVAL;
394 
395 	/* enforce locked channels, no changing them */
396 	if (chan != ptp->pin_config[pin].chan)
397 		return -EINVAL;
398 
399 	/* we want to keep the functions locked as well */
400 	if (func != ptp->pin_config[pin].func)
401 		return -EINVAL;
402 
403 	return 0;
404 }
405 
fm10k_ptp_register(struct fm10k_intfc * interface)406 void fm10k_ptp_register(struct fm10k_intfc *interface)
407 {
408 	struct ptp_clock_info *ptp_caps = &interface->ptp_caps;
409 	struct device *dev = &interface->pdev->dev;
410 	struct ptp_clock *ptp_clock;
411 
412 	snprintf(ptp_caps->name, sizeof(ptp_caps->name),
413 		 "%s", interface->netdev->name);
414 	ptp_caps->owner		= THIS_MODULE;
415 	/* This math is simply the inverse of the math in
416 	 * fm10k_adjust_systime_pf applied to an adjustment value
417 	 * of 2^30 - 1 which is the maximum value of the register:
418 	 * 	max_ppb == ((2^30 - 1) * 5^9) / 2^31
419 	 */
420 	ptp_caps->max_adj	= 976562;
421 	ptp_caps->adjfreq	= fm10k_ptp_adjfreq;
422 	ptp_caps->adjtime	= fm10k_ptp_adjtime;
423 	ptp_caps->gettime64	= fm10k_ptp_gettime;
424 	ptp_caps->settime64	= fm10k_ptp_settime;
425 
426 	/* provide pins if BAR4 is accessible */
427 	if (interface->sw_addr) {
428 		/* enable periodic outputs */
429 		ptp_caps->n_per_out = 2;
430 		ptp_caps->enable	= fm10k_ptp_enable;
431 
432 		/* enable clock pins */
433 		ptp_caps->verify	= fm10k_ptp_verify;
434 		ptp_caps->n_pins = 2;
435 		ptp_caps->pin_config = fm10k_ptp_pd;
436 	}
437 
438 	ptp_clock = ptp_clock_register(ptp_caps, dev);
439 	if (IS_ERR(ptp_clock)) {
440 		ptp_clock = NULL;
441 		dev_err(dev, "ptp_clock_register failed\n");
442 	} else {
443 		dev_info(dev, "registered PHC device %s\n", ptp_caps->name);
444 	}
445 
446 	interface->ptp_clock = ptp_clock;
447 }
448 
fm10k_ptp_unregister(struct fm10k_intfc * interface)449 void fm10k_ptp_unregister(struct fm10k_intfc *interface)
450 {
451 	struct ptp_clock *ptp_clock = interface->ptp_clock;
452 	struct device *dev = &interface->pdev->dev;
453 
454 	if (!ptp_clock)
455 		return;
456 
457 	interface->ptp_clock = NULL;
458 
459 	ptp_clock_unregister(ptp_clock);
460 	dev_info(dev, "removed PHC %s\n", interface->ptp_caps.name);
461 }
462