1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2 /* QLogic qede NIC Driver
3 * Copyright (c) 2015-2017 QLogic Corporation
4 * Copyright (c) 2019-2020 Marvell International Ltd.
8 #define QEDE_PTP_TX_TIMEOUT (2 * HZ)
11 const struct qed_eth_ptp_ops
*ops
;
12 struct ptp_clock_info clock_info
;
13 struct cyclecounter cc
;
14 struct timecounter tc
;
15 struct ptp_clock
*clock
;
16 struct work_struct work
;
17 unsigned long ptp_tx_start
;
18 struct qede_dev
*edev
;
19 struct sk_buff
*tx_skb
;
21 /* ptp spinlock is used for protecting the cycle/time counter fields
22 * and, also for serializing the qed PTP API invocations.
25 bool hw_ts_ioctl_called
;
31 * qede_ptp_adjfreq() - Adjust the frequency of the PTP cycle counter.
33 * @info: The PTP clock info structure.
34 * @ppb: Parts per billion adjustment from base.
36 * Return: Zero on success, negative errno otherwise.
38 static int qede_ptp_adjfreq(struct ptp_clock_info
*info
, s32 ppb
)
40 struct qede_ptp
*ptp
= container_of(info
, struct qede_ptp
, clock_info
);
41 struct qede_dev
*edev
= ptp
->edev
;
45 if (edev
->state
== QEDE_STATE_OPEN
) {
46 spin_lock_bh(&ptp
->lock
);
47 rc
= ptp
->ops
->adjfreq(edev
->cdev
, ppb
);
48 spin_unlock_bh(&ptp
->lock
);
50 DP_ERR(edev
, "PTP adjfreq called while interface is down\n");
58 static int qede_ptp_adjtime(struct ptp_clock_info
*info
, s64 delta
)
60 struct qede_dev
*edev
;
63 ptp
= container_of(info
, struct qede_ptp
, clock_info
);
66 DP_VERBOSE(edev
, QED_MSG_DEBUG
, "PTP adjtime called, delta = %llx\n",
69 spin_lock_bh(&ptp
->lock
);
70 timecounter_adjtime(&ptp
->tc
, delta
);
71 spin_unlock_bh(&ptp
->lock
);
76 static int qede_ptp_gettime(struct ptp_clock_info
*info
, struct timespec64
*ts
)
78 struct qede_dev
*edev
;
82 ptp
= container_of(info
, struct qede_ptp
, clock_info
);
85 spin_lock_bh(&ptp
->lock
);
86 ns
= timecounter_read(&ptp
->tc
);
87 spin_unlock_bh(&ptp
->lock
);
89 DP_VERBOSE(edev
, QED_MSG_DEBUG
, "PTP gettime called, ns = %llu\n", ns
);
91 *ts
= ns_to_timespec64(ns
);
96 static int qede_ptp_settime(struct ptp_clock_info
*info
,
97 const struct timespec64
*ts
)
99 struct qede_dev
*edev
;
100 struct qede_ptp
*ptp
;
103 ptp
= container_of(info
, struct qede_ptp
, clock_info
);
106 ns
= timespec64_to_ns(ts
);
108 DP_VERBOSE(edev
, QED_MSG_DEBUG
, "PTP settime called, ns = %llu\n", ns
);
110 /* Re-init the timecounter */
111 spin_lock_bh(&ptp
->lock
);
112 timecounter_init(&ptp
->tc
, &ptp
->cc
, ns
);
113 spin_unlock_bh(&ptp
->lock
);
118 /* Enable (or disable) ancillary features of the phc subsystem */
119 static int qede_ptp_ancillary_feature_enable(struct ptp_clock_info
*info
,
120 struct ptp_clock_request
*rq
,
123 struct qede_dev
*edev
;
124 struct qede_ptp
*ptp
;
126 ptp
= container_of(info
, struct qede_ptp
, clock_info
);
129 DP_ERR(edev
, "PHC ancillary features are not supported\n");
134 static void qede_ptp_task(struct work_struct
*work
)
136 struct skb_shared_hwtstamps shhwtstamps
;
137 struct qede_dev
*edev
;
138 struct qede_ptp
*ptp
;
143 ptp
= container_of(work
, struct qede_ptp
, work
);
145 timedout
= time_is_before_jiffies(ptp
->ptp_tx_start
+
146 QEDE_PTP_TX_TIMEOUT
);
148 /* Read Tx timestamp registers */
149 spin_lock_bh(&ptp
->lock
);
150 rc
= ptp
->ops
->read_tx_ts(edev
->cdev
, ×tamp
);
151 spin_unlock_bh(&ptp
->lock
);
153 if (unlikely(timedout
)) {
154 DP_INFO(edev
, "Tx timestamp is not recorded\n");
155 dev_kfree_skb_any(ptp
->tx_skb
);
157 clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS
,
159 edev
->ptp_skip_txts
++;
161 /* Reschedule to keep checking for a valid TS value */
162 schedule_work(&ptp
->work
);
167 ns
= timecounter_cyc2time(&ptp
->tc
, timestamp
);
168 memset(&shhwtstamps
, 0, sizeof(shhwtstamps
));
169 shhwtstamps
.hwtstamp
= ns_to_ktime(ns
);
170 skb_tstamp_tx(ptp
->tx_skb
, &shhwtstamps
);
171 dev_kfree_skb_any(ptp
->tx_skb
);
173 clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS
, &edev
->flags
);
175 DP_VERBOSE(edev
, QED_MSG_DEBUG
,
176 "Tx timestamp, timestamp cycles = %llu, ns = %llu\n",
180 /* Read the PHC. This API is invoked with ptp_lock held. */
181 static u64
qede_ptp_read_cc(const struct cyclecounter
*cc
)
183 struct qede_dev
*edev
;
184 struct qede_ptp
*ptp
;
188 ptp
= container_of(cc
, struct qede_ptp
, cc
);
190 rc
= ptp
->ops
->read_cc(edev
->cdev
, &phc_cycles
);
192 WARN_ONCE(1, "PHC read err %d\n", rc
);
194 DP_VERBOSE(edev
, QED_MSG_DEBUG
, "PHC read cycles = %llu\n", phc_cycles
);
199 static int qede_ptp_cfg_filters(struct qede_dev
*edev
)
201 enum qed_ptp_hwtstamp_tx_type tx_type
= QED_PTP_HWTSTAMP_TX_ON
;
202 enum qed_ptp_filter_type rx_filter
= QED_PTP_FILTER_NONE
;
203 struct qede_ptp
*ptp
= edev
->ptp
;
208 if (!ptp
->hw_ts_ioctl_called
) {
209 DP_INFO(edev
, "TS IOCTL not called\n");
213 switch (ptp
->tx_type
) {
215 set_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN
, &edev
->flags
);
216 tx_type
= QED_PTP_HWTSTAMP_TX_ON
;
219 case HWTSTAMP_TX_OFF
:
220 clear_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN
, &edev
->flags
);
221 tx_type
= QED_PTP_HWTSTAMP_TX_OFF
;
224 case HWTSTAMP_TX_ONESTEP_SYNC
:
225 case HWTSTAMP_TX_ONESTEP_P2P
:
226 DP_ERR(edev
, "One-step timestamping is not supported\n");
230 spin_lock_bh(&ptp
->lock
);
231 switch (ptp
->rx_filter
) {
232 case HWTSTAMP_FILTER_NONE
:
233 rx_filter
= QED_PTP_FILTER_NONE
;
235 case HWTSTAMP_FILTER_ALL
:
236 case HWTSTAMP_FILTER_SOME
:
237 case HWTSTAMP_FILTER_NTP_ALL
:
238 ptp
->rx_filter
= HWTSTAMP_FILTER_NONE
;
239 rx_filter
= QED_PTP_FILTER_ALL
;
241 case HWTSTAMP_FILTER_PTP_V1_L4_EVENT
:
242 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V1_L4_EVENT
;
243 rx_filter
= QED_PTP_FILTER_V1_L4_EVENT
;
245 case HWTSTAMP_FILTER_PTP_V1_L4_SYNC
:
246 case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ
:
247 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V1_L4_EVENT
;
248 /* Initialize PTP detection for UDP/IPv4 events */
249 rx_filter
= QED_PTP_FILTER_V1_L4_GEN
;
251 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT
:
252 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V2_L4_EVENT
;
253 rx_filter
= QED_PTP_FILTER_V2_L4_EVENT
;
255 case HWTSTAMP_FILTER_PTP_V2_L4_SYNC
:
256 case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ
:
257 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V2_L4_EVENT
;
258 /* Initialize PTP detection for UDP/IPv4 or UDP/IPv6 events */
259 rx_filter
= QED_PTP_FILTER_V2_L4_GEN
;
261 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT
:
262 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V2_L2_EVENT
;
263 rx_filter
= QED_PTP_FILTER_V2_L2_EVENT
;
265 case HWTSTAMP_FILTER_PTP_V2_L2_SYNC
:
266 case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ
:
267 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V2_L2_EVENT
;
268 /* Initialize PTP detection L2 events */
269 rx_filter
= QED_PTP_FILTER_V2_L2_GEN
;
271 case HWTSTAMP_FILTER_PTP_V2_EVENT
:
272 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V2_EVENT
;
273 rx_filter
= QED_PTP_FILTER_V2_EVENT
;
275 case HWTSTAMP_FILTER_PTP_V2_SYNC
:
276 case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ
:
277 ptp
->rx_filter
= HWTSTAMP_FILTER_PTP_V2_EVENT
;
278 /* Initialize PTP detection L2, UDP/IPv4 or UDP/IPv6 events */
279 rx_filter
= QED_PTP_FILTER_V2_GEN
;
283 ptp
->ops
->cfg_filters(edev
->cdev
, rx_filter
, tx_type
);
285 spin_unlock_bh(&ptp
->lock
);
290 int qede_ptp_hw_ts(struct qede_dev
*edev
, struct ifreq
*ifr
)
292 struct hwtstamp_config config
;
293 struct qede_ptp
*ptp
;
300 if (copy_from_user(&config
, ifr
->ifr_data
, sizeof(config
)))
303 DP_VERBOSE(edev
, QED_MSG_DEBUG
,
304 "HWTSTAMP IOCTL: Requested tx_type = %d, requested rx_filters = %d\n",
305 config
.tx_type
, config
.rx_filter
);
308 DP_ERR(edev
, "config.flags is reserved for future use\n");
312 ptp
->hw_ts_ioctl_called
= 1;
313 ptp
->tx_type
= config
.tx_type
;
314 ptp
->rx_filter
= config
.rx_filter
;
316 rc
= qede_ptp_cfg_filters(edev
);
320 config
.rx_filter
= ptp
->rx_filter
;
322 return copy_to_user(ifr
->ifr_data
, &config
,
323 sizeof(config
)) ? -EFAULT
: 0;
326 int qede_ptp_get_ts_info(struct qede_dev
*edev
, struct ethtool_ts_info
*info
)
328 struct qede_ptp
*ptp
= edev
->ptp
;
331 info
->so_timestamping
= SOF_TIMESTAMPING_TX_SOFTWARE
|
332 SOF_TIMESTAMPING_RX_SOFTWARE
|
333 SOF_TIMESTAMPING_SOFTWARE
;
334 info
->phc_index
= -1;
339 info
->so_timestamping
= SOF_TIMESTAMPING_TX_SOFTWARE
|
340 SOF_TIMESTAMPING_RX_SOFTWARE
|
341 SOF_TIMESTAMPING_SOFTWARE
|
342 SOF_TIMESTAMPING_TX_HARDWARE
|
343 SOF_TIMESTAMPING_RX_HARDWARE
|
344 SOF_TIMESTAMPING_RAW_HARDWARE
;
347 info
->phc_index
= ptp_clock_index(ptp
->clock
);
349 info
->phc_index
= -1;
351 info
->rx_filters
= BIT(HWTSTAMP_FILTER_NONE
) |
352 BIT(HWTSTAMP_FILTER_PTP_V1_L4_EVENT
) |
353 BIT(HWTSTAMP_FILTER_PTP_V1_L4_SYNC
) |
354 BIT(HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ
) |
355 BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT
) |
356 BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC
) |
357 BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ
) |
358 BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT
) |
359 BIT(HWTSTAMP_FILTER_PTP_V2_L2_SYNC
) |
360 BIT(HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ
) |
361 BIT(HWTSTAMP_FILTER_PTP_V2_EVENT
) |
362 BIT(HWTSTAMP_FILTER_PTP_V2_SYNC
) |
363 BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ
);
365 info
->tx_types
= BIT(HWTSTAMP_TX_OFF
) | BIT(HWTSTAMP_TX_ON
);
370 void qede_ptp_disable(struct qede_dev
*edev
)
372 struct qede_ptp
*ptp
;
379 ptp_clock_unregister(ptp
->clock
);
383 /* Cancel PTP work queue. Should be done after the Tx queues are
384 * drained to prevent additional scheduling.
386 cancel_work_sync(&ptp
->work
);
388 dev_kfree_skb_any(ptp
->tx_skb
);
390 clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS
, &edev
->flags
);
393 /* Disable PTP in HW */
394 spin_lock_bh(&ptp
->lock
);
395 ptp
->ops
->disable(edev
->cdev
);
396 spin_unlock_bh(&ptp
->lock
);
402 static int qede_ptp_init(struct qede_dev
*edev
)
404 struct qede_ptp
*ptp
;
411 spin_lock_init(&ptp
->lock
);
413 /* Configure PTP in HW */
414 rc
= ptp
->ops
->enable(edev
->cdev
);
416 DP_INFO(edev
, "PTP HW enable failed\n");
420 /* Init work queue for Tx timestamping */
421 INIT_WORK(&ptp
->work
, qede_ptp_task
);
423 /* Init cyclecounter and timecounter */
424 memset(&ptp
->cc
, 0, sizeof(ptp
->cc
));
425 ptp
->cc
.read
= qede_ptp_read_cc
;
426 ptp
->cc
.mask
= CYCLECOUNTER_MASK(64);
430 timecounter_init(&ptp
->tc
, &ptp
->cc
, ktime_to_ns(ktime_get_real()));
435 int qede_ptp_enable(struct qede_dev
*edev
)
437 struct qede_ptp
*ptp
;
440 ptp
= kzalloc(sizeof(*ptp
), GFP_KERNEL
);
442 DP_INFO(edev
, "Failed to allocate struct for PTP\n");
447 ptp
->ops
= edev
->ops
->ptp
;
449 DP_INFO(edev
, "PTP enable failed\n");
456 rc
= qede_ptp_init(edev
);
460 qede_ptp_cfg_filters(edev
);
462 /* Fill the ptp_clock_info struct and register PTP clock */
463 ptp
->clock_info
.owner
= THIS_MODULE
;
464 snprintf(ptp
->clock_info
.name
, 16, "%s", edev
->ndev
->name
);
465 ptp
->clock_info
.max_adj
= QED_MAX_PHC_DRIFT_PPB
;
466 ptp
->clock_info
.n_alarm
= 0;
467 ptp
->clock_info
.n_ext_ts
= 0;
468 ptp
->clock_info
.n_per_out
= 0;
469 ptp
->clock_info
.pps
= 0;
470 ptp
->clock_info
.adjfreq
= qede_ptp_adjfreq
;
471 ptp
->clock_info
.adjtime
= qede_ptp_adjtime
;
472 ptp
->clock_info
.gettime64
= qede_ptp_gettime
;
473 ptp
->clock_info
.settime64
= qede_ptp_settime
;
474 ptp
->clock_info
.enable
= qede_ptp_ancillary_feature_enable
;
476 ptp
->clock
= ptp_clock_register(&ptp
->clock_info
, &edev
->pdev
->dev
);
477 if (IS_ERR(ptp
->clock
)) {
478 DP_ERR(edev
, "PTP clock registration failed\n");
479 qede_ptp_disable(edev
);
494 void qede_ptp_tx_ts(struct qede_dev
*edev
, struct sk_buff
*skb
)
496 struct qede_ptp
*ptp
;
502 if (test_and_set_bit_lock(QEDE_FLAGS_PTP_TX_IN_PRORGESS
,
504 DP_ERR(edev
, "Timestamping in progress\n");
505 edev
->ptp_skip_txts
++;
509 if (unlikely(!test_bit(QEDE_FLAGS_TX_TIMESTAMPING_EN
, &edev
->flags
))) {
511 "Tx timestamping was not enabled, this packet will not be timestamped\n");
512 clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS
, &edev
->flags
);
513 edev
->ptp_skip_txts
++;
514 } else if (unlikely(ptp
->tx_skb
)) {
516 "The device supports only a single outstanding packet to timestamp, this packet will not be timestamped\n");
517 clear_bit_unlock(QEDE_FLAGS_PTP_TX_IN_PRORGESS
, &edev
->flags
);
518 edev
->ptp_skip_txts
++;
520 skb_shinfo(skb
)->tx_flags
|= SKBTX_IN_PROGRESS
;
521 /* schedule check for Tx timestamp */
522 ptp
->tx_skb
= skb_get(skb
);
523 ptp
->ptp_tx_start
= jiffies
;
524 schedule_work(&ptp
->work
);
528 void qede_ptp_rx_ts(struct qede_dev
*edev
, struct sk_buff
*skb
)
530 struct qede_ptp
*ptp
;
538 spin_lock_bh(&ptp
->lock
);
539 rc
= ptp
->ops
->read_rx_ts(edev
->cdev
, ×tamp
);
541 spin_unlock_bh(&ptp
->lock
);
542 DP_INFO(edev
, "Invalid Rx timestamp\n");
546 ns
= timecounter_cyc2time(&ptp
->tc
, timestamp
);
547 spin_unlock_bh(&ptp
->lock
);
548 skb_hwtstamps(skb
)->hwtstamp
= ns_to_ktime(ns
);
549 DP_VERBOSE(edev
, QED_MSG_DEBUG
,
550 "Rx timestamp, timestamp cycles = %llu, ns = %llu\n",