1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2019, Vladimir Oltean <olteanv@gmail.com>
3 */
4 #include <linux/spi/spi.h>
5 #include "sja1105.h"
6
7 /* The adjfine API clamps ppb between [-32,768,000, 32,768,000], and
8 * therefore scaled_ppm between [-2,147,483,648, 2,147,483,647].
9 * Set the maximum supported ppb to a round value smaller than the maximum.
10 *
11 * Percentually speaking, this is a +/- 0.032x adjustment of the
12 * free-running counter (0.968x to 1.032x).
13 */
14 #define SJA1105_MAX_ADJ_PPB 32000000
15 #define SJA1105_SIZE_PTP_CMD 4
16
17 /* PTPSYNCTS has no interrupt or update mechanism, because the intended
18 * hardware use case is for the timestamp to be collected synchronously,
19 * immediately after the CAS_MASTER SJA1105 switch has performed a CASSYNC
20 * one-shot toggle (no return to level) on the PTP_CLK pin. When used as a
21 * generic extts source, the PTPSYNCTS register needs polling and a comparison
22 * with the old value. The polling interval is configured as the Nyquist rate
23 * of a signal with 50% duty cycle and 1Hz frequency, which is sadly all that
24 * this hardware can do (but may be enough for some setups). Anything of higher
25 * frequency than 1 Hz will be lost, since there is no timestamp FIFO.
26 */
27 #define SJA1105_EXTTS_INTERVAL (HZ / 6)
28
29 /* This range is actually +/- SJA1105_MAX_ADJ_PPB
30 * divided by 1000 (ppb -> ppm) and with a 16-bit
31 * "fractional" part (actually fixed point).
32 * |
33 * v
34 * Convert scaled_ppm from the +/- ((10^6) << 16) range
35 * into the +/- (1 << 31) range.
36 *
37 * This forgoes a "ppb" numeric representation (up to NSEC_PER_SEC)
38 * and defines the scaling factor between scaled_ppm and the actual
39 * frequency adjustments of the PHC.
40 *
41 * ptpclkrate = scaled_ppm * 2^31 / (10^6 * 2^16)
42 * simplifies to
43 * ptpclkrate = scaled_ppm * 2^9 / 5^6
44 */
45 #define SJA1105_CC_MULT_NUM (1 << 9)
46 #define SJA1105_CC_MULT_DEM 15625
47 #define SJA1105_CC_MULT 0x80000000
48
49 enum sja1105_ptp_clk_mode {
50 PTP_ADD_MODE = 1,
51 PTP_SET_MODE = 0,
52 };
53
54 #define extts_to_data(t) \
55 container_of((t), struct sja1105_ptp_data, extts_timer)
56 #define ptp_caps_to_data(d) \
57 container_of((d), struct sja1105_ptp_data, caps)
58 #define ptp_data_to_sja1105(d) \
59 container_of((d), struct sja1105_private, ptp_data)
60
sja1105_hwtstamp_set(struct dsa_switch * ds,int port,struct kernel_hwtstamp_config * config,struct netlink_ext_ack * extack)61 int sja1105_hwtstamp_set(struct dsa_switch *ds, int port,
62 struct kernel_hwtstamp_config *config,
63 struct netlink_ext_ack *extack)
64 {
65 struct sja1105_private *priv = ds->priv;
66 unsigned long hwts_tx_en, hwts_rx_en;
67
68 hwts_tx_en = priv->hwts_tx_en;
69 hwts_rx_en = priv->hwts_rx_en;
70
71 switch (config->tx_type) {
72 case HWTSTAMP_TX_OFF:
73 hwts_tx_en &= ~BIT(port);
74 break;
75 case HWTSTAMP_TX_ON:
76 hwts_tx_en |= BIT(port);
77 break;
78 default:
79 return -ERANGE;
80 }
81
82 switch (config->rx_filter) {
83 case HWTSTAMP_FILTER_NONE:
84 hwts_rx_en &= ~BIT(port);
85 break;
86 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
87 hwts_rx_en |= BIT(port);
88 break;
89 default:
90 return -ERANGE;
91 }
92
93 priv->hwts_tx_en = hwts_tx_en;
94 priv->hwts_rx_en = hwts_rx_en;
95
96 return 0;
97 }
98
sja1105_hwtstamp_get(struct dsa_switch * ds,int port,struct kernel_hwtstamp_config * config)99 int sja1105_hwtstamp_get(struct dsa_switch *ds, int port,
100 struct kernel_hwtstamp_config *config)
101 {
102 struct sja1105_private *priv = ds->priv;
103
104 config->flags = 0;
105 if (priv->hwts_tx_en & BIT(port))
106 config->tx_type = HWTSTAMP_TX_ON;
107 else
108 config->tx_type = HWTSTAMP_TX_OFF;
109 if (priv->hwts_rx_en & BIT(port))
110 config->rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
111 else
112 config->rx_filter = HWTSTAMP_FILTER_NONE;
113
114 return 0;
115 }
116
sja1105_get_ts_info(struct dsa_switch * ds,int port,struct kernel_ethtool_ts_info * info)117 int sja1105_get_ts_info(struct dsa_switch *ds, int port,
118 struct kernel_ethtool_ts_info *info)
119 {
120 struct sja1105_private *priv = ds->priv;
121 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
122
123 /* Called during cleanup */
124 if (!ptp_data->clock)
125 return -ENODEV;
126
127 info->so_timestamping = SOF_TIMESTAMPING_TX_HARDWARE |
128 SOF_TIMESTAMPING_RX_HARDWARE |
129 SOF_TIMESTAMPING_RAW_HARDWARE;
130 info->tx_types = (1 << HWTSTAMP_TX_OFF) |
131 (1 << HWTSTAMP_TX_ON);
132 info->rx_filters = (1 << HWTSTAMP_FILTER_NONE) |
133 (1 << HWTSTAMP_FILTER_PTP_V2_L2_EVENT);
134 info->phc_index = ptp_clock_index(ptp_data->clock);
135 return 0;
136 }
137
sja1105et_ptp_cmd_packing(u8 * buf,struct sja1105_ptp_cmd * cmd,enum packing_op op)138 void sja1105et_ptp_cmd_packing(u8 *buf, struct sja1105_ptp_cmd *cmd,
139 enum packing_op op)
140 {
141 const int size = SJA1105_SIZE_PTP_CMD;
142 /* No need to keep this as part of the structure */
143 u64 valid = 1;
144
145 sja1105_packing(buf, &valid, 31, 31, size, op);
146 sja1105_packing(buf, &cmd->ptpstrtsch, 30, 30, size, op);
147 sja1105_packing(buf, &cmd->ptpstopsch, 29, 29, size, op);
148 sja1105_packing(buf, &cmd->startptpcp, 28, 28, size, op);
149 sja1105_packing(buf, &cmd->stopptpcp, 27, 27, size, op);
150 sja1105_packing(buf, &cmd->resptp, 2, 2, size, op);
151 sja1105_packing(buf, &cmd->corrclk4ts, 1, 1, size, op);
152 sja1105_packing(buf, &cmd->ptpclkadd, 0, 0, size, op);
153 }
154
sja1105pqrs_ptp_cmd_packing(u8 * buf,struct sja1105_ptp_cmd * cmd,enum packing_op op)155 void sja1105pqrs_ptp_cmd_packing(u8 *buf, struct sja1105_ptp_cmd *cmd,
156 enum packing_op op)
157 {
158 const int size = SJA1105_SIZE_PTP_CMD;
159 /* No need to keep this as part of the structure */
160 u64 valid = 1;
161
162 sja1105_packing(buf, &valid, 31, 31, size, op);
163 sja1105_packing(buf, &cmd->ptpstrtsch, 30, 30, size, op);
164 sja1105_packing(buf, &cmd->ptpstopsch, 29, 29, size, op);
165 sja1105_packing(buf, &cmd->startptpcp, 28, 28, size, op);
166 sja1105_packing(buf, &cmd->stopptpcp, 27, 27, size, op);
167 sja1105_packing(buf, &cmd->resptp, 3, 3, size, op);
168 sja1105_packing(buf, &cmd->corrclk4ts, 2, 2, size, op);
169 sja1105_packing(buf, &cmd->ptpclkadd, 0, 0, size, op);
170 }
171
sja1105_ptp_commit(struct dsa_switch * ds,struct sja1105_ptp_cmd * cmd,sja1105_spi_rw_mode_t rw)172 int sja1105_ptp_commit(struct dsa_switch *ds, struct sja1105_ptp_cmd *cmd,
173 sja1105_spi_rw_mode_t rw)
174 {
175 const struct sja1105_private *priv = ds->priv;
176 const struct sja1105_regs *regs = priv->info->regs;
177 u8 buf[SJA1105_SIZE_PTP_CMD] = {0};
178 int rc;
179
180 if (rw == SPI_WRITE)
181 priv->info->ptp_cmd_packing(buf, cmd, PACK);
182
183 rc = sja1105_xfer_buf(priv, rw, regs->ptp_control, buf,
184 SJA1105_SIZE_PTP_CMD);
185
186 if (rw == SPI_READ)
187 priv->info->ptp_cmd_packing(buf, cmd, UNPACK);
188
189 return rc;
190 }
191
192 /* The switch returns partial timestamps (24 bits for SJA1105 E/T, which wrap
193 * around in 0.135 seconds, and 32 bits for P/Q/R/S, wrapping around in 34.35
194 * seconds).
195 *
196 * This receives the RX or TX MAC timestamps, provided by hardware as
197 * the lower bits of the cycle counter, sampled at the time the timestamp was
198 * collected.
199 *
200 * To reconstruct into a full 64-bit-wide timestamp, the cycle counter is
201 * read and the high-order bits are filled in.
202 *
203 * Must be called within one wraparound period of the partial timestamp since
204 * it was generated by the MAC.
205 */
sja1105_tstamp_reconstruct(struct dsa_switch * ds,u64 now,u64 ts_partial)206 static u64 sja1105_tstamp_reconstruct(struct dsa_switch *ds, u64 now,
207 u64 ts_partial)
208 {
209 struct sja1105_private *priv = ds->priv;
210 u64 partial_tstamp_mask = CYCLECOUNTER_MASK(priv->info->ptp_ts_bits);
211 u64 ts_reconstructed;
212
213 ts_reconstructed = (now & ~partial_tstamp_mask) | ts_partial;
214
215 /* Check lower bits of current cycle counter against the timestamp.
216 * If the current cycle counter is lower than the partial timestamp,
217 * then wraparound surely occurred and must be accounted for.
218 */
219 if ((now & partial_tstamp_mask) <= ts_partial)
220 ts_reconstructed -= (partial_tstamp_mask + 1);
221
222 return ts_reconstructed;
223 }
224
225 /* Reads the SPI interface for an egress timestamp generated by the switch
226 * for frames sent using management routes.
227 *
228 * SJA1105 E/T layout of the 4-byte SPI payload:
229 *
230 * 31 23 15 7 0
231 * | | | | |
232 * +-----+-----+-----+ ^
233 * ^ |
234 * | |
235 * 24-bit timestamp Update bit
236 *
237 *
238 * SJA1105 P/Q/R/S layout of the 8-byte SPI payload:
239 *
240 * 31 23 15 7 0 63 55 47 39 32
241 * | | | | | | | | | |
242 * ^ +-----+-----+-----+-----+
243 * | ^
244 * | |
245 * Update bit 32-bit timestamp
246 *
247 * Notice that the update bit is in the same place.
248 * To have common code for E/T and P/Q/R/S for reading the timestamp,
249 * we need to juggle with the offset and the bit indices.
250 */
sja1105_ptpegr_ts_poll(struct dsa_switch * ds,int port,u64 * ts)251 static int sja1105_ptpegr_ts_poll(struct dsa_switch *ds, int port, u64 *ts)
252 {
253 struct sja1105_private *priv = ds->priv;
254 const struct sja1105_regs *regs = priv->info->regs;
255 int tstamp_bit_start, tstamp_bit_end;
256 int timeout = 10;
257 u8 packed_buf[8];
258 u64 update;
259 int rc;
260
261 do {
262 rc = sja1105_xfer_buf(priv, SPI_READ, regs->ptpegr_ts[port],
263 packed_buf, priv->info->ptpegr_ts_bytes);
264 if (rc < 0)
265 return rc;
266
267 sja1105_unpack(packed_buf, &update, 0, 0,
268 priv->info->ptpegr_ts_bytes);
269 if (update)
270 break;
271
272 usleep_range(10, 50);
273 } while (--timeout);
274
275 if (!timeout)
276 return -ETIMEDOUT;
277
278 /* Point the end bit to the second 32-bit word on P/Q/R/S,
279 * no-op on E/T.
280 */
281 tstamp_bit_end = (priv->info->ptpegr_ts_bytes - 4) * 8;
282 /* Shift the 24-bit timestamp on E/T to be collected from 31:8.
283 * No-op on P/Q/R/S.
284 */
285 tstamp_bit_end += 32 - priv->info->ptp_ts_bits;
286 tstamp_bit_start = tstamp_bit_end + priv->info->ptp_ts_bits - 1;
287
288 *ts = 0;
289
290 sja1105_unpack(packed_buf, ts, tstamp_bit_start, tstamp_bit_end,
291 priv->info->ptpegr_ts_bytes);
292
293 return 0;
294 }
295
296 /* Caller must hold ptp_data->lock */
sja1105_ptpclkval_read(struct sja1105_private * priv,u64 * ticks,struct ptp_system_timestamp * ptp_sts)297 static int sja1105_ptpclkval_read(struct sja1105_private *priv, u64 *ticks,
298 struct ptp_system_timestamp *ptp_sts)
299 {
300 const struct sja1105_regs *regs = priv->info->regs;
301
302 return sja1105_xfer_u64(priv, SPI_READ, regs->ptpclkval, ticks,
303 ptp_sts);
304 }
305
306 /* Caller must hold ptp_data->lock */
sja1105_ptpclkval_write(struct sja1105_private * priv,u64 ticks,struct ptp_system_timestamp * ptp_sts)307 static int sja1105_ptpclkval_write(struct sja1105_private *priv, u64 ticks,
308 struct ptp_system_timestamp *ptp_sts)
309 {
310 const struct sja1105_regs *regs = priv->info->regs;
311
312 return sja1105_xfer_u64(priv, SPI_WRITE, regs->ptpclkval, &ticks,
313 ptp_sts);
314 }
315
sja1105_extts_poll(struct sja1105_private * priv)316 static void sja1105_extts_poll(struct sja1105_private *priv)
317 {
318 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
319 const struct sja1105_regs *regs = priv->info->regs;
320 struct ptp_clock_event event;
321 u64 ptpsyncts = 0;
322 int rc;
323
324 rc = sja1105_xfer_u64(priv, SPI_READ, regs->ptpsyncts, &ptpsyncts,
325 NULL);
326 if (rc < 0)
327 dev_err_ratelimited(priv->ds->dev,
328 "Failed to read PTPSYNCTS: %d\n", rc);
329
330 if (ptpsyncts && ptp_data->ptpsyncts != ptpsyncts) {
331 event.index = 0;
332 event.type = PTP_CLOCK_EXTTS;
333 event.timestamp = ns_to_ktime(sja1105_ticks_to_ns(ptpsyncts));
334 ptp_clock_event(ptp_data->clock, &event);
335
336 ptp_data->ptpsyncts = ptpsyncts;
337 }
338 }
339
sja1105_rxtstamp_work(struct ptp_clock_info * ptp)340 static long sja1105_rxtstamp_work(struct ptp_clock_info *ptp)
341 {
342 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
343 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
344 struct dsa_switch *ds = priv->ds;
345 struct sk_buff *skb;
346
347 mutex_lock(&ptp_data->lock);
348
349 while ((skb = skb_dequeue(&ptp_data->skb_rxtstamp_queue)) != NULL) {
350 struct skb_shared_hwtstamps *shwt = skb_hwtstamps(skb);
351 u64 ticks, ts;
352 int rc;
353
354 rc = sja1105_ptpclkval_read(priv, &ticks, NULL);
355 if (rc < 0) {
356 dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc);
357 kfree_skb(skb);
358 continue;
359 }
360
361 *shwt = (struct skb_shared_hwtstamps) {0};
362
363 ts = SJA1105_SKB_CB(skb)->tstamp;
364 ts = sja1105_tstamp_reconstruct(ds, ticks, ts);
365
366 shwt->hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(ts));
367 netif_rx(skb);
368 }
369
370 if (ptp_data->extts_enabled)
371 sja1105_extts_poll(priv);
372
373 mutex_unlock(&ptp_data->lock);
374
375 /* Don't restart */
376 return -1;
377 }
378
sja1105_rxtstamp(struct dsa_switch * ds,int port,struct sk_buff * skb)379 bool sja1105_rxtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
380 {
381 struct sja1105_private *priv = ds->priv;
382 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
383
384 if (!(priv->hwts_rx_en & BIT(port)))
385 return false;
386
387 /* We need to read the full PTP clock to reconstruct the Rx
388 * timestamp. For that we need a sleepable context.
389 */
390 skb_queue_tail(&ptp_data->skb_rxtstamp_queue, skb);
391 ptp_schedule_worker(ptp_data->clock, 0);
392 return true;
393 }
394
sja1110_rxtstamp(struct dsa_switch * ds,int port,struct sk_buff * skb)395 bool sja1110_rxtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
396 {
397 struct skb_shared_hwtstamps *shwt = skb_hwtstamps(skb);
398 u64 ts = SJA1105_SKB_CB(skb)->tstamp;
399
400 *shwt = (struct skb_shared_hwtstamps) {0};
401
402 shwt->hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(ts));
403
404 /* Don't defer */
405 return false;
406 }
407
408 /* Called from dsa_skb_defer_rx_timestamp */
sja1105_port_rxtstamp(struct dsa_switch * ds,int port,struct sk_buff * skb,unsigned int type)409 bool sja1105_port_rxtstamp(struct dsa_switch *ds, int port,
410 struct sk_buff *skb, unsigned int type)
411 {
412 struct sja1105_private *priv = ds->priv;
413
414 return priv->info->rxtstamp(ds, port, skb);
415 }
416
sja1110_process_meta_tstamp(struct dsa_switch * ds,int port,u8 ts_id,enum sja1110_meta_tstamp dir,u64 tstamp)417 void sja1110_process_meta_tstamp(struct dsa_switch *ds, int port, u8 ts_id,
418 enum sja1110_meta_tstamp dir, u64 tstamp)
419 {
420 struct sja1105_private *priv = ds->priv;
421 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
422 struct sk_buff *skb, *skb_tmp, *skb_match = NULL;
423 struct skb_shared_hwtstamps shwt = {0};
424
425 /* We don't care about RX timestamps on the CPU port */
426 if (dir == SJA1110_META_TSTAMP_RX)
427 return;
428
429 spin_lock(&ptp_data->skb_txtstamp_queue.lock);
430
431 skb_queue_walk_safe(&ptp_data->skb_txtstamp_queue, skb, skb_tmp) {
432 if (SJA1105_SKB_CB(skb)->ts_id != ts_id)
433 continue;
434
435 __skb_unlink(skb, &ptp_data->skb_txtstamp_queue);
436 skb_match = skb;
437
438 break;
439 }
440
441 spin_unlock(&ptp_data->skb_txtstamp_queue.lock);
442
443 if (WARN_ON(!skb_match))
444 return;
445
446 shwt.hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(tstamp));
447 skb_complete_tx_timestamp(skb_match, &shwt);
448 }
449
450 /* In addition to cloning the skb which is done by the common
451 * sja1105_port_txtstamp, we need to generate a timestamp ID and save the
452 * packet to the TX timestamping queue.
453 */
sja1110_txtstamp(struct dsa_switch * ds,int port,struct sk_buff * skb)454 void sja1110_txtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
455 {
456 struct sk_buff *clone = SJA1105_SKB_CB(skb)->clone;
457 struct sja1105_private *priv = ds->priv;
458 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
459 u8 ts_id;
460
461 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
462
463 spin_lock(&priv->ts_id_lock);
464
465 ts_id = priv->ts_id;
466 /* Deal automatically with 8-bit wraparound */
467 priv->ts_id++;
468
469 SJA1105_SKB_CB(clone)->ts_id = ts_id;
470
471 spin_unlock(&priv->ts_id_lock);
472
473 skb_queue_tail(&ptp_data->skb_txtstamp_queue, clone);
474 }
475
476 /* Called from dsa_skb_tx_timestamp. This callback is just to clone
477 * the skb and have it available in SJA1105_SKB_CB in the .port_deferred_xmit
478 * callback, where we will timestamp it synchronously.
479 */
sja1105_port_txtstamp(struct dsa_switch * ds,int port,struct sk_buff * skb)480 void sja1105_port_txtstamp(struct dsa_switch *ds, int port, struct sk_buff *skb)
481 {
482 struct sja1105_private *priv = ds->priv;
483 struct sk_buff *clone;
484
485 if (!(priv->hwts_tx_en & BIT(port)))
486 return;
487
488 clone = skb_clone_sk(skb);
489 if (!clone)
490 return;
491
492 SJA1105_SKB_CB(skb)->clone = clone;
493
494 if (priv->info->txtstamp)
495 priv->info->txtstamp(ds, port, skb);
496 }
497
sja1105_ptp_reset(struct dsa_switch * ds)498 static int sja1105_ptp_reset(struct dsa_switch *ds)
499 {
500 struct sja1105_private *priv = ds->priv;
501 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
502 struct sja1105_ptp_cmd cmd = ptp_data->cmd;
503 int rc;
504
505 mutex_lock(&ptp_data->lock);
506
507 cmd.resptp = 1;
508
509 dev_dbg(ds->dev, "Resetting PTP clock\n");
510 rc = sja1105_ptp_commit(ds, &cmd, SPI_WRITE);
511
512 sja1105_tas_clockstep(priv->ds);
513
514 mutex_unlock(&ptp_data->lock);
515
516 return rc;
517 }
518
519 /* Caller must hold ptp_data->lock */
__sja1105_ptp_gettimex(struct dsa_switch * ds,u64 * ns,struct ptp_system_timestamp * ptp_sts)520 int __sja1105_ptp_gettimex(struct dsa_switch *ds, u64 *ns,
521 struct ptp_system_timestamp *ptp_sts)
522 {
523 struct sja1105_private *priv = ds->priv;
524 u64 ticks;
525 int rc;
526
527 rc = sja1105_ptpclkval_read(priv, &ticks, ptp_sts);
528 if (rc < 0) {
529 dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc);
530 return rc;
531 }
532
533 *ns = sja1105_ticks_to_ns(ticks);
534
535 return 0;
536 }
537
sja1105_ptp_gettimex(struct ptp_clock_info * ptp,struct timespec64 * ts,struct ptp_system_timestamp * ptp_sts)538 static int sja1105_ptp_gettimex(struct ptp_clock_info *ptp,
539 struct timespec64 *ts,
540 struct ptp_system_timestamp *ptp_sts)
541 {
542 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
543 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
544 u64 now = 0;
545 int rc;
546
547 mutex_lock(&ptp_data->lock);
548
549 rc = __sja1105_ptp_gettimex(priv->ds, &now, ptp_sts);
550 *ts = ns_to_timespec64(now);
551
552 mutex_unlock(&ptp_data->lock);
553
554 return rc;
555 }
556
557 /* Caller must hold ptp_data->lock */
sja1105_ptp_mode_set(struct sja1105_private * priv,enum sja1105_ptp_clk_mode mode)558 static int sja1105_ptp_mode_set(struct sja1105_private *priv,
559 enum sja1105_ptp_clk_mode mode)
560 {
561 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
562
563 if (ptp_data->cmd.ptpclkadd == mode)
564 return 0;
565
566 ptp_data->cmd.ptpclkadd = mode;
567
568 return sja1105_ptp_commit(priv->ds, &ptp_data->cmd, SPI_WRITE);
569 }
570
571 /* Write to PTPCLKVAL while PTPCLKADD is 0 */
__sja1105_ptp_settime(struct dsa_switch * ds,u64 ns,struct ptp_system_timestamp * ptp_sts)572 int __sja1105_ptp_settime(struct dsa_switch *ds, u64 ns,
573 struct ptp_system_timestamp *ptp_sts)
574 {
575 struct sja1105_private *priv = ds->priv;
576 u64 ticks = ns_to_sja1105_ticks(ns);
577 int rc;
578
579 rc = sja1105_ptp_mode_set(priv, PTP_SET_MODE);
580 if (rc < 0) {
581 dev_err(priv->ds->dev, "Failed to put PTPCLK in set mode\n");
582 return rc;
583 }
584
585 rc = sja1105_ptpclkval_write(priv, ticks, ptp_sts);
586
587 sja1105_tas_clockstep(priv->ds);
588
589 return rc;
590 }
591
sja1105_ptp_settime(struct ptp_clock_info * ptp,const struct timespec64 * ts)592 static int sja1105_ptp_settime(struct ptp_clock_info *ptp,
593 const struct timespec64 *ts)
594 {
595 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
596 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
597 u64 ns = timespec64_to_ns(ts);
598 int rc;
599
600 mutex_lock(&ptp_data->lock);
601
602 rc = __sja1105_ptp_settime(priv->ds, ns, NULL);
603
604 mutex_unlock(&ptp_data->lock);
605
606 return rc;
607 }
608
sja1105_ptp_adjfine(struct ptp_clock_info * ptp,long scaled_ppm)609 static int sja1105_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
610 {
611 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
612 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
613 const struct sja1105_regs *regs = priv->info->regs;
614 u32 clkrate32;
615 s64 clkrate;
616 int rc;
617
618 clkrate = (s64)scaled_ppm * SJA1105_CC_MULT_NUM;
619 clkrate = div_s64(clkrate, SJA1105_CC_MULT_DEM);
620
621 /* Take a +/- value and re-center it around 2^31. */
622 clkrate = SJA1105_CC_MULT + clkrate;
623 WARN_ON(abs(clkrate) >= GENMASK_ULL(31, 0));
624 clkrate32 = clkrate;
625
626 mutex_lock(&ptp_data->lock);
627
628 rc = sja1105_xfer_u32(priv, SPI_WRITE, regs->ptpclkrate, &clkrate32,
629 NULL);
630
631 sja1105_tas_adjfreq(priv->ds);
632
633 mutex_unlock(&ptp_data->lock);
634
635 return rc;
636 }
637
638 /* Write to PTPCLKVAL while PTPCLKADD is 1 */
__sja1105_ptp_adjtime(struct dsa_switch * ds,s64 delta)639 int __sja1105_ptp_adjtime(struct dsa_switch *ds, s64 delta)
640 {
641 struct sja1105_private *priv = ds->priv;
642 s64 ticks = ns_to_sja1105_ticks(delta);
643 int rc;
644
645 rc = sja1105_ptp_mode_set(priv, PTP_ADD_MODE);
646 if (rc < 0) {
647 dev_err(priv->ds->dev, "Failed to put PTPCLK in add mode\n");
648 return rc;
649 }
650
651 rc = sja1105_ptpclkval_write(priv, ticks, NULL);
652
653 sja1105_tas_clockstep(priv->ds);
654
655 return rc;
656 }
657
sja1105_ptp_adjtime(struct ptp_clock_info * ptp,s64 delta)658 static int sja1105_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
659 {
660 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
661 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
662 int rc;
663
664 mutex_lock(&ptp_data->lock);
665
666 rc = __sja1105_ptp_adjtime(priv->ds, delta);
667
668 mutex_unlock(&ptp_data->lock);
669
670 return rc;
671 }
672
sja1105_ptp_extts_setup_timer(struct sja1105_ptp_data * ptp_data)673 static void sja1105_ptp_extts_setup_timer(struct sja1105_ptp_data *ptp_data)
674 {
675 unsigned long expires = ((jiffies / SJA1105_EXTTS_INTERVAL) + 1) *
676 SJA1105_EXTTS_INTERVAL;
677
678 mod_timer(&ptp_data->extts_timer, expires);
679 }
680
sja1105_ptp_extts_timer(struct timer_list * t)681 static void sja1105_ptp_extts_timer(struct timer_list *t)
682 {
683 struct sja1105_ptp_data *ptp_data = extts_to_data(t);
684
685 ptp_schedule_worker(ptp_data->clock, 0);
686
687 sja1105_ptp_extts_setup_timer(ptp_data);
688 }
689
sja1105_change_ptp_clk_pin_func(struct sja1105_private * priv,enum ptp_pin_function func)690 static int sja1105_change_ptp_clk_pin_func(struct sja1105_private *priv,
691 enum ptp_pin_function func)
692 {
693 struct sja1105_avb_params_entry *avb;
694 enum ptp_pin_function old_func;
695
696 avb = priv->static_config.tables[BLK_IDX_AVB_PARAMS].entries;
697
698 if (priv->info->device_id == SJA1105E_DEVICE_ID ||
699 priv->info->device_id == SJA1105T_DEVICE_ID ||
700 avb->cas_master)
701 old_func = PTP_PF_PEROUT;
702 else
703 old_func = PTP_PF_EXTTS;
704
705 if (func == old_func)
706 return 0;
707
708 avb->cas_master = (func == PTP_PF_PEROUT);
709
710 return sja1105_dynamic_config_write(priv, BLK_IDX_AVB_PARAMS, 0, avb,
711 true);
712 }
713
714 /* The PTP_CLK pin may be configured to toggle with a 50% duty cycle and a
715 * frequency f:
716 *
717 * NSEC_PER_SEC
718 * f = ----------------------
719 * (PTPPINDUR * 8 ns) * 2
720 */
sja1105_per_out_enable(struct sja1105_private * priv,struct ptp_perout_request * perout,bool on)721 static int sja1105_per_out_enable(struct sja1105_private *priv,
722 struct ptp_perout_request *perout,
723 bool on)
724 {
725 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
726 const struct sja1105_regs *regs = priv->info->regs;
727 struct sja1105_ptp_cmd cmd = ptp_data->cmd;
728 int rc;
729
730 /* We only support one channel */
731 if (perout->index != 0)
732 return -EOPNOTSUPP;
733
734 mutex_lock(&ptp_data->lock);
735
736 rc = sja1105_change_ptp_clk_pin_func(priv, PTP_PF_PEROUT);
737 if (rc)
738 goto out;
739
740 if (on) {
741 struct timespec64 pin_duration_ts = {
742 .tv_sec = perout->period.sec,
743 .tv_nsec = perout->period.nsec,
744 };
745 struct timespec64 pin_start_ts = {
746 .tv_sec = perout->start.sec,
747 .tv_nsec = perout->start.nsec,
748 };
749 u64 pin_duration = timespec64_to_ns(&pin_duration_ts);
750 u64 pin_start = timespec64_to_ns(&pin_start_ts);
751 u32 pin_duration32;
752 u64 now;
753
754 /* ptppindur: 32 bit register which holds the interval between
755 * 2 edges on PTP_CLK. So check for truncation which happens
756 * at periods larger than around 68.7 seconds.
757 */
758 pin_duration = max_t(u64, ns_to_sja1105_ticks(pin_duration / 2), 1);
759 if (pin_duration > U32_MAX) {
760 rc = -ERANGE;
761 goto out;
762 }
763 pin_duration32 = pin_duration;
764
765 /* ptppins: 64 bit register which needs to hold a PTP time
766 * larger than the current time, otherwise the startptpcp
767 * command won't do anything. So advance the current time
768 * by a number of periods in a way that won't alter the
769 * phase offset.
770 */
771 rc = __sja1105_ptp_gettimex(priv->ds, &now, NULL);
772 if (rc < 0)
773 goto out;
774
775 pin_start = future_base_time(pin_start, pin_duration,
776 now + 1ull * NSEC_PER_SEC);
777 pin_start = ns_to_sja1105_ticks(pin_start);
778
779 rc = sja1105_xfer_u64(priv, SPI_WRITE, regs->ptppinst,
780 &pin_start, NULL);
781 if (rc < 0)
782 goto out;
783
784 rc = sja1105_xfer_u32(priv, SPI_WRITE, regs->ptppindur,
785 &pin_duration32, NULL);
786 if (rc < 0)
787 goto out;
788 }
789
790 if (on)
791 cmd.startptpcp = true;
792 else
793 cmd.stopptpcp = true;
794
795 rc = sja1105_ptp_commit(priv->ds, &cmd, SPI_WRITE);
796
797 out:
798 mutex_unlock(&ptp_data->lock);
799
800 return rc;
801 }
802
sja1105_extts_enable(struct sja1105_private * priv,struct ptp_extts_request * extts,bool on)803 static int sja1105_extts_enable(struct sja1105_private *priv,
804 struct ptp_extts_request *extts,
805 bool on)
806 {
807 int rc;
808
809 /* We only support one channel */
810 if (extts->index != 0)
811 return -EOPNOTSUPP;
812
813 /* We can only enable time stamping on both edges, sadly. */
814 if ((extts->flags & PTP_STRICT_FLAGS) &&
815 (extts->flags & PTP_ENABLE_FEATURE) &&
816 (extts->flags & PTP_EXTTS_EDGES) != PTP_EXTTS_EDGES)
817 return -EOPNOTSUPP;
818
819 rc = sja1105_change_ptp_clk_pin_func(priv, PTP_PF_EXTTS);
820 if (rc)
821 return rc;
822
823 priv->ptp_data.extts_enabled = on;
824
825 if (on)
826 sja1105_ptp_extts_setup_timer(&priv->ptp_data);
827 else
828 timer_delete_sync(&priv->ptp_data.extts_timer);
829
830 return 0;
831 }
832
sja1105_ptp_enable(struct ptp_clock_info * ptp,struct ptp_clock_request * req,int on)833 static int sja1105_ptp_enable(struct ptp_clock_info *ptp,
834 struct ptp_clock_request *req, int on)
835 {
836 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
837 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
838 int rc = -EOPNOTSUPP;
839
840 if (req->type == PTP_CLK_REQ_PEROUT)
841 rc = sja1105_per_out_enable(priv, &req->perout, on);
842 else if (req->type == PTP_CLK_REQ_EXTTS)
843 rc = sja1105_extts_enable(priv, &req->extts, on);
844
845 return rc;
846 }
847
sja1105_ptp_verify_pin(struct ptp_clock_info * ptp,unsigned int pin,enum ptp_pin_function func,unsigned int chan)848 static int sja1105_ptp_verify_pin(struct ptp_clock_info *ptp, unsigned int pin,
849 enum ptp_pin_function func, unsigned int chan)
850 {
851 struct sja1105_ptp_data *ptp_data = ptp_caps_to_data(ptp);
852 struct sja1105_private *priv = ptp_data_to_sja1105(ptp_data);
853
854 if (chan != 0 || pin != 0)
855 return -1;
856
857 switch (func) {
858 case PTP_PF_NONE:
859 case PTP_PF_PEROUT:
860 break;
861 case PTP_PF_EXTTS:
862 if (priv->info->device_id == SJA1105E_DEVICE_ID ||
863 priv->info->device_id == SJA1105T_DEVICE_ID)
864 return -1;
865 break;
866 default:
867 return -1;
868 }
869 return 0;
870 }
871
872 static struct ptp_pin_desc sja1105_ptp_pin = {
873 .name = "ptp_clk",
874 .index = 0,
875 .func = PTP_PF_NONE,
876 };
877
sja1105_ptp_clock_register(struct dsa_switch * ds)878 int sja1105_ptp_clock_register(struct dsa_switch *ds)
879 {
880 struct sja1105_private *priv = ds->priv;
881 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
882
883 ptp_data->caps = (struct ptp_clock_info) {
884 .owner = THIS_MODULE,
885 .name = "SJA1105 PHC",
886 .adjfine = sja1105_ptp_adjfine,
887 .adjtime = sja1105_ptp_adjtime,
888 .gettimex64 = sja1105_ptp_gettimex,
889 .settime64 = sja1105_ptp_settime,
890 .enable = sja1105_ptp_enable,
891 .verify = sja1105_ptp_verify_pin,
892 .do_aux_work = sja1105_rxtstamp_work,
893 .max_adj = SJA1105_MAX_ADJ_PPB,
894 .pin_config = &sja1105_ptp_pin,
895 .n_pins = 1,
896 .n_ext_ts = 1,
897 .n_per_out = 1,
898 .supported_extts_flags = PTP_RISING_EDGE |
899 PTP_FALLING_EDGE |
900 PTP_STRICT_FLAGS,
901 };
902
903 /* Only used on SJA1105 */
904 skb_queue_head_init(&ptp_data->skb_rxtstamp_queue);
905 /* Only used on SJA1110 */
906 skb_queue_head_init(&ptp_data->skb_txtstamp_queue);
907
908 ptp_data->clock = ptp_clock_register(&ptp_data->caps, ds->dev);
909 if (IS_ERR_OR_NULL(ptp_data->clock))
910 return PTR_ERR(ptp_data->clock);
911
912 ptp_data->cmd.corrclk4ts = true;
913 ptp_data->cmd.ptpclkadd = PTP_SET_MODE;
914
915 timer_setup(&ptp_data->extts_timer, sja1105_ptp_extts_timer, 0);
916
917 return sja1105_ptp_reset(ds);
918 }
919
sja1105_ptp_clock_unregister(struct dsa_switch * ds)920 void sja1105_ptp_clock_unregister(struct dsa_switch *ds)
921 {
922 struct sja1105_private *priv = ds->priv;
923 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
924
925 if (IS_ERR_OR_NULL(ptp_data->clock))
926 return;
927
928 timer_delete_sync(&ptp_data->extts_timer);
929 ptp_cancel_worker_sync(ptp_data->clock);
930 skb_queue_purge(&ptp_data->skb_txtstamp_queue);
931 skb_queue_purge(&ptp_data->skb_rxtstamp_queue);
932 ptp_clock_unregister(ptp_data->clock);
933 ptp_data->clock = NULL;
934 }
935
sja1105_ptp_txtstamp_skb(struct dsa_switch * ds,int port,struct sk_buff * skb)936 void sja1105_ptp_txtstamp_skb(struct dsa_switch *ds, int port,
937 struct sk_buff *skb)
938 {
939 struct sja1105_private *priv = ds->priv;
940 struct sja1105_ptp_data *ptp_data = &priv->ptp_data;
941 struct skb_shared_hwtstamps shwt = {0};
942 u64 ticks, ts;
943 int rc;
944
945 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
946
947 mutex_lock(&ptp_data->lock);
948
949 rc = sja1105_ptpegr_ts_poll(ds, port, &ts);
950 if (rc < 0) {
951 dev_err(ds->dev, "timed out polling for tstamp\n");
952 kfree_skb(skb);
953 goto out;
954 }
955
956 rc = sja1105_ptpclkval_read(priv, &ticks, NULL);
957 if (rc < 0) {
958 dev_err(ds->dev, "Failed to read PTP clock: %d\n", rc);
959 kfree_skb(skb);
960 goto out;
961 }
962
963 ts = sja1105_tstamp_reconstruct(ds, ticks, ts);
964
965 shwt.hwtstamp = ns_to_ktime(sja1105_ticks_to_ns(ts));
966 skb_complete_tx_timestamp(skb, &shwt);
967
968 out:
969 mutex_unlock(&ptp_data->lock);
970 }
971