0001
0002
0003
0004 #include "ixgbe.h"
0005 #include <linux/ptp_classify.h>
0006 #include <linux/clocksource.h>
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 #define IXGBE_INCVAL_10GB 0x66666666
0064 #define IXGBE_INCVAL_1GB 0x40000000
0065 #define IXGBE_INCVAL_100 0x50000000
0066
0067 #define IXGBE_INCVAL_SHIFT_10GB 28
0068 #define IXGBE_INCVAL_SHIFT_1GB 24
0069 #define IXGBE_INCVAL_SHIFT_100 21
0070
0071 #define IXGBE_INCVAL_SHIFT_82599 7
0072 #define IXGBE_INCPER_SHIFT_82599 24
0073
0074 #define IXGBE_OVERFLOW_PERIOD (HZ * 30)
0075 #define IXGBE_PTP_TX_TIMEOUT (HZ)
0076
0077
0078
0079
0080 #define NS_PER_SEC 1000000000ULL
0081 #define NS_PER_HALF_SEC 500000000ULL
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141
0142 #define IXGBE_X550_BASE_PERIOD 0xC80000000ULL
0143 #define INCVALUE_MASK 0x7FFFFFFF
0144 #define ISGN 0x80000000
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160 static void ixgbe_ptp_setup_sdp_X540(struct ixgbe_adapter *adapter)
0161 {
0162 struct cyclecounter *cc = &adapter->hw_cc;
0163 struct ixgbe_hw *hw = &adapter->hw;
0164 u32 esdp, tsauxc, clktiml, clktimh, trgttiml, trgttimh, rem;
0165 u64 ns = 0, clock_edge = 0, clock_period;
0166 unsigned long flags;
0167
0168
0169 IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0);
0170 IXGBE_WRITE_FLUSH(hw);
0171
0172 if (!(adapter->flags2 & IXGBE_FLAG2_PTP_PPS_ENABLED))
0173 return;
0174
0175 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
0176
0177
0178
0179
0180 esdp |= IXGBE_ESDP_SDP0_DIR |
0181 IXGBE_ESDP_SDP0_NATIVE;
0182
0183
0184
0185
0186 tsauxc = (IXGBE_TSAUXC_EN_CLK |
0187 IXGBE_TSAUXC_SYNCLK |
0188 IXGBE_TSAUXC_SDP0_INT);
0189
0190
0191
0192
0193 clock_period = div_u64((NS_PER_HALF_SEC << cc->shift), cc->mult);
0194 clktiml = (u32)(clock_period);
0195 clktimh = (u32)(clock_period >> 32);
0196
0197
0198 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0199 ns = timecounter_read(&adapter->hw_tc);
0200 clock_edge = adapter->hw_tc.cycle_last;
0201 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0202
0203
0204 div_u64_rem(ns, NS_PER_SEC, &rem);
0205
0206
0207
0208
0209 rem = (NS_PER_SEC - rem);
0210
0211
0212 clock_edge += div_u64(((u64)rem << cc->shift), cc->mult);
0213 trgttiml = (u32)clock_edge;
0214 trgttimh = (u32)(clock_edge >> 32);
0215
0216 IXGBE_WRITE_REG(hw, IXGBE_CLKTIML, clktiml);
0217 IXGBE_WRITE_REG(hw, IXGBE_CLKTIMH, clktimh);
0218 IXGBE_WRITE_REG(hw, IXGBE_TRGTTIML0, trgttiml);
0219 IXGBE_WRITE_REG(hw, IXGBE_TRGTTIMH0, trgttimh);
0220
0221 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
0222 IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, tsauxc);
0223
0224 IXGBE_WRITE_FLUSH(hw);
0225 }
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239 static void ixgbe_ptp_setup_sdp_X550(struct ixgbe_adapter *adapter)
0240 {
0241 u32 esdp, tsauxc, freqout, trgttiml, trgttimh, rem, tssdp;
0242 struct cyclecounter *cc = &adapter->hw_cc;
0243 struct ixgbe_hw *hw = &adapter->hw;
0244 u64 ns = 0, clock_edge = 0;
0245 struct timespec64 ts;
0246 unsigned long flags;
0247
0248
0249 IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, 0x0);
0250 IXGBE_WRITE_FLUSH(hw);
0251
0252 if (!(adapter->flags2 & IXGBE_FLAG2_PTP_PPS_ENABLED))
0253 return;
0254
0255 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
0256
0257
0258
0259
0260 esdp |= IXGBE_ESDP_SDP0_DIR |
0261 IXGBE_ESDP_SDP0_NATIVE;
0262
0263
0264
0265
0266 #define IXGBE_TSAUXC_DIS_TS_CLEAR 0x40000000
0267 tsauxc = (IXGBE_TSAUXC_EN_CLK | IXGBE_TSAUXC_ST0 |
0268 IXGBE_TSAUXC_EN_TT0 | IXGBE_TSAUXC_SDP0_INT |
0269 IXGBE_TSAUXC_DIS_TS_CLEAR);
0270
0271 tssdp = (IXGBE_TSSDP_TS_SDP0_EN |
0272 IXGBE_TSSDP_TS_SDP0_CLK0);
0273
0274
0275
0276
0277
0278 freqout = div_u64(NS_PER_HALF_SEC << cc->shift, cc->mult);
0279
0280
0281 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0282 ns = timecounter_read(&adapter->hw_tc);
0283 clock_edge = adapter->hw_tc.cycle_last;
0284 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0285
0286
0287 div_u64_rem(ns, NS_PER_SEC, &rem);
0288
0289
0290
0291
0292 rem = (NS_PER_SEC - rem);
0293
0294
0295 clock_edge += div_u64(((u64)rem << cc->shift), cc->mult);
0296
0297
0298
0299
0300
0301
0302
0303
0304 ts = ns_to_timespec64(clock_edge);
0305 trgttiml = (u32)ts.tv_nsec;
0306 trgttimh = (u32)ts.tv_sec;
0307
0308 IXGBE_WRITE_REG(hw, IXGBE_FREQOUT0, freqout);
0309 IXGBE_WRITE_REG(hw, IXGBE_TRGTTIML0, trgttiml);
0310 IXGBE_WRITE_REG(hw, IXGBE_TRGTTIMH0, trgttimh);
0311
0312 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
0313 IXGBE_WRITE_REG(hw, IXGBE_TSSDP, tssdp);
0314 IXGBE_WRITE_REG(hw, IXGBE_TSAUXC, tsauxc);
0315
0316 IXGBE_WRITE_FLUSH(hw);
0317 }
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329 static u64 ixgbe_ptp_read_X550(const struct cyclecounter *cc)
0330 {
0331 struct ixgbe_adapter *adapter =
0332 container_of(cc, struct ixgbe_adapter, hw_cc);
0333 struct ixgbe_hw *hw = &adapter->hw;
0334 struct timespec64 ts;
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351 IXGBE_READ_REG(hw, IXGBE_SYSTIMR);
0352 ts.tv_nsec = IXGBE_READ_REG(hw, IXGBE_SYSTIML);
0353 ts.tv_sec = IXGBE_READ_REG(hw, IXGBE_SYSTIMH);
0354
0355 return (u64)timespec64_to_ns(&ts);
0356 }
0357
0358
0359
0360
0361
0362
0363
0364
0365
0366 static u64 ixgbe_ptp_read_82599(const struct cyclecounter *cc)
0367 {
0368 struct ixgbe_adapter *adapter =
0369 container_of(cc, struct ixgbe_adapter, hw_cc);
0370 struct ixgbe_hw *hw = &adapter->hw;
0371 u64 stamp = 0;
0372
0373 stamp |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIML);
0374 stamp |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIMH) << 32;
0375
0376 return stamp;
0377 }
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396 static void ixgbe_ptp_convert_to_hwtstamp(struct ixgbe_adapter *adapter,
0397 struct skb_shared_hwtstamps *hwtstamp,
0398 u64 timestamp)
0399 {
0400 unsigned long flags;
0401 struct timespec64 systime;
0402 u64 ns;
0403
0404 memset(hwtstamp, 0, sizeof(*hwtstamp));
0405
0406 switch (adapter->hw.mac.type) {
0407
0408
0409
0410
0411
0412
0413
0414
0415 case ixgbe_mac_X550:
0416 case ixgbe_mac_X550EM_x:
0417 case ixgbe_mac_x550em_a:
0418
0419
0420
0421
0422
0423 systime.tv_sec = timestamp >> 32;
0424 systime.tv_nsec = timestamp & 0xFFFFFFFF;
0425
0426 timestamp = timespec64_to_ns(&systime);
0427 break;
0428 default:
0429 break;
0430 }
0431
0432 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0433 ns = timecounter_cyc2time(&adapter->hw_tc, timestamp);
0434 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0435
0436 hwtstamp->hwtstamp = ns_to_ktime(ns);
0437 }
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449 static int ixgbe_ptp_adjfine_82599(struct ptp_clock_info *ptp, long scaled_ppm)
0450 {
0451 struct ixgbe_adapter *adapter =
0452 container_of(ptp, struct ixgbe_adapter, ptp_caps);
0453 struct ixgbe_hw *hw = &adapter->hw;
0454 u64 incval, diff;
0455 int neg_adj = 0;
0456
0457 if (scaled_ppm < 0) {
0458 neg_adj = 1;
0459 scaled_ppm = -scaled_ppm;
0460 }
0461
0462 smp_mb();
0463 incval = READ_ONCE(adapter->base_incval);
0464
0465 diff = mul_u64_u64_div_u64(incval, scaled_ppm,
0466 1000000ULL << 16);
0467
0468 incval = neg_adj ? (incval - diff) : (incval + diff);
0469
0470 switch (hw->mac.type) {
0471 case ixgbe_mac_X540:
0472 if (incval > 0xFFFFFFFFULL)
0473 e_dev_warn("PTP scaled_ppm adjusted SYSTIME rate overflowed!\n");
0474 IXGBE_WRITE_REG(hw, IXGBE_TIMINCA, (u32)incval);
0475 break;
0476 case ixgbe_mac_82599EB:
0477 if (incval > 0x00FFFFFFULL)
0478 e_dev_warn("PTP scaled_ppm adjusted SYSTIME rate overflowed!\n");
0479 IXGBE_WRITE_REG(hw, IXGBE_TIMINCA,
0480 BIT(IXGBE_INCPER_SHIFT_82599) |
0481 ((u32)incval & 0x00FFFFFFUL));
0482 break;
0483 default:
0484 break;
0485 }
0486
0487 return 0;
0488 }
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500 static int ixgbe_ptp_adjfine_X550(struct ptp_clock_info *ptp, long scaled_ppm)
0501 {
0502 struct ixgbe_adapter *adapter =
0503 container_of(ptp, struct ixgbe_adapter, ptp_caps);
0504 struct ixgbe_hw *hw = &adapter->hw;
0505 int neg_adj = 0;
0506 u64 rate;
0507 u32 inca;
0508
0509 if (scaled_ppm < 0) {
0510 neg_adj = 1;
0511 scaled_ppm = -scaled_ppm;
0512 }
0513
0514 rate = mul_u64_u64_div_u64(IXGBE_X550_BASE_PERIOD, scaled_ppm,
0515 1000000ULL << 16);
0516
0517
0518 if (rate >= INCVALUE_MASK)
0519 e_dev_warn("PTP scaled_ppm adjusted SYSTIME rate overflowed!\n");
0520
0521 inca = rate & INCVALUE_MASK;
0522 if (neg_adj)
0523 inca |= ISGN;
0524
0525 IXGBE_WRITE_REG(hw, IXGBE_TIMINCA, inca);
0526
0527 return 0;
0528 }
0529
0530
0531
0532
0533
0534
0535
0536
0537 static int ixgbe_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta)
0538 {
0539 struct ixgbe_adapter *adapter =
0540 container_of(ptp, struct ixgbe_adapter, ptp_caps);
0541 unsigned long flags;
0542
0543 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0544 timecounter_adjtime(&adapter->hw_tc, delta);
0545 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0546
0547 if (adapter->ptp_setup_sdp)
0548 adapter->ptp_setup_sdp(adapter);
0549
0550 return 0;
0551 }
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562 static int ixgbe_ptp_gettimex(struct ptp_clock_info *ptp,
0563 struct timespec64 *ts,
0564 struct ptp_system_timestamp *sts)
0565 {
0566 struct ixgbe_adapter *adapter =
0567 container_of(ptp, struct ixgbe_adapter, ptp_caps);
0568 struct ixgbe_hw *hw = &adapter->hw;
0569 unsigned long flags;
0570 u64 ns, stamp;
0571
0572 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0573
0574 switch (adapter->hw.mac.type) {
0575 case ixgbe_mac_X550:
0576 case ixgbe_mac_X550EM_x:
0577 case ixgbe_mac_x550em_a:
0578
0579
0580
0581
0582
0583 ptp_read_system_prets(sts);
0584 IXGBE_READ_REG(hw, IXGBE_SYSTIMR);
0585 ptp_read_system_postts(sts);
0586 ts->tv_nsec = IXGBE_READ_REG(hw, IXGBE_SYSTIML);
0587 ts->tv_sec = IXGBE_READ_REG(hw, IXGBE_SYSTIMH);
0588 stamp = timespec64_to_ns(ts);
0589 break;
0590 default:
0591 ptp_read_system_prets(sts);
0592 stamp = IXGBE_READ_REG(hw, IXGBE_SYSTIML);
0593 ptp_read_system_postts(sts);
0594 stamp |= (u64)IXGBE_READ_REG(hw, IXGBE_SYSTIMH) << 32;
0595 break;
0596 }
0597
0598 ns = timecounter_cyc2time(&adapter->hw_tc, stamp);
0599
0600 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0601
0602 *ts = ns_to_timespec64(ns);
0603
0604 return 0;
0605 }
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615 static int ixgbe_ptp_settime(struct ptp_clock_info *ptp,
0616 const struct timespec64 *ts)
0617 {
0618 struct ixgbe_adapter *adapter =
0619 container_of(ptp, struct ixgbe_adapter, ptp_caps);
0620 unsigned long flags;
0621 u64 ns = timespec64_to_ns(ts);
0622
0623
0624 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0625 timecounter_init(&adapter->hw_tc, &adapter->hw_cc, ns);
0626 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0627
0628 if (adapter->ptp_setup_sdp)
0629 adapter->ptp_setup_sdp(adapter);
0630 return 0;
0631 }
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642 static int ixgbe_ptp_feature_enable(struct ptp_clock_info *ptp,
0643 struct ptp_clock_request *rq, int on)
0644 {
0645 struct ixgbe_adapter *adapter =
0646 container_of(ptp, struct ixgbe_adapter, ptp_caps);
0647
0648
0649
0650
0651
0652
0653
0654 if (rq->type != PTP_CLK_REQ_PPS || !adapter->ptp_setup_sdp)
0655 return -ENOTSUPP;
0656
0657 if (on)
0658 adapter->flags2 |= IXGBE_FLAG2_PTP_PPS_ENABLED;
0659 else
0660 adapter->flags2 &= ~IXGBE_FLAG2_PTP_PPS_ENABLED;
0661
0662 adapter->ptp_setup_sdp(adapter);
0663 return 0;
0664 }
0665
0666
0667
0668
0669
0670
0671
0672
0673 void ixgbe_ptp_check_pps_event(struct ixgbe_adapter *adapter)
0674 {
0675 struct ixgbe_hw *hw = &adapter->hw;
0676 struct ptp_clock_event event;
0677
0678 event.type = PTP_CLOCK_PPS;
0679
0680
0681
0682
0683
0684 if (!adapter->ptp_clock)
0685 return;
0686
0687 switch (hw->mac.type) {
0688 case ixgbe_mac_X540:
0689 ptp_clock_event(adapter->ptp_clock, &event);
0690 break;
0691 default:
0692 break;
0693 }
0694 }
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704 void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter)
0705 {
0706 bool timeout = time_is_before_jiffies(adapter->last_overflow_check +
0707 IXGBE_OVERFLOW_PERIOD);
0708 unsigned long flags;
0709
0710 if (timeout) {
0711
0712 spin_lock_irqsave(&adapter->tmreg_lock, flags);
0713 timecounter_read(&adapter->hw_tc);
0714 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
0715
0716 adapter->last_overflow_check = jiffies;
0717 }
0718 }
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729 void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter)
0730 {
0731 struct ixgbe_hw *hw = &adapter->hw;
0732 u32 tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL);
0733 struct ixgbe_ring *rx_ring;
0734 unsigned long rx_event;
0735 int n;
0736
0737
0738
0739
0740 if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID)) {
0741 adapter->last_rx_ptp_check = jiffies;
0742 return;
0743 }
0744
0745
0746 rx_event = adapter->last_rx_ptp_check;
0747 for (n = 0; n < adapter->num_rx_queues; n++) {
0748 rx_ring = adapter->rx_ring[n];
0749 if (time_after(rx_ring->last_rx_timestamp, rx_event))
0750 rx_event = rx_ring->last_rx_timestamp;
0751 }
0752
0753
0754 if (time_is_before_jiffies(rx_event + 5 * HZ)) {
0755 IXGBE_READ_REG(hw, IXGBE_RXSTMPH);
0756 adapter->last_rx_ptp_check = jiffies;
0757
0758 adapter->rx_hwtstamp_cleared++;
0759 e_warn(drv, "clearing RX Timestamp hang\n");
0760 }
0761 }
0762
0763
0764
0765
0766
0767
0768
0769
0770
0771 static void ixgbe_ptp_clear_tx_timestamp(struct ixgbe_adapter *adapter)
0772 {
0773 struct ixgbe_hw *hw = &adapter->hw;
0774
0775 IXGBE_READ_REG(hw, IXGBE_TXSTMPH);
0776 if (adapter->ptp_tx_skb) {
0777 dev_kfree_skb_any(adapter->ptp_tx_skb);
0778 adapter->ptp_tx_skb = NULL;
0779 }
0780 clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state);
0781 }
0782
0783
0784
0785
0786
0787 void ixgbe_ptp_tx_hang(struct ixgbe_adapter *adapter)
0788 {
0789 bool timeout = time_is_before_jiffies(adapter->ptp_tx_start +
0790 IXGBE_PTP_TX_TIMEOUT);
0791
0792 if (!adapter->ptp_tx_skb)
0793 return;
0794
0795 if (!test_bit(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state))
0796 return;
0797
0798
0799
0800
0801
0802 if (timeout) {
0803 cancel_work_sync(&adapter->ptp_tx_work);
0804 ixgbe_ptp_clear_tx_timestamp(adapter);
0805 adapter->tx_hwtstamp_timeouts++;
0806 e_warn(drv, "clearing Tx timestamp hang\n");
0807 }
0808 }
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818 static void ixgbe_ptp_tx_hwtstamp(struct ixgbe_adapter *adapter)
0819 {
0820 struct sk_buff *skb = adapter->ptp_tx_skb;
0821 struct ixgbe_hw *hw = &adapter->hw;
0822 struct skb_shared_hwtstamps shhwtstamps;
0823 u64 regval = 0;
0824
0825 regval |= (u64)IXGBE_READ_REG(hw, IXGBE_TXSTMPL);
0826 regval |= (u64)IXGBE_READ_REG(hw, IXGBE_TXSTMPH) << 32;
0827 ixgbe_ptp_convert_to_hwtstamp(adapter, &shhwtstamps, regval);
0828
0829
0830
0831
0832
0833
0834 adapter->ptp_tx_skb = NULL;
0835 clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state);
0836
0837
0838 skb_tstamp_tx(skb, &shhwtstamps);
0839 dev_kfree_skb_any(skb);
0840 }
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850 static void ixgbe_ptp_tx_hwtstamp_work(struct work_struct *work)
0851 {
0852 struct ixgbe_adapter *adapter = container_of(work, struct ixgbe_adapter,
0853 ptp_tx_work);
0854 struct ixgbe_hw *hw = &adapter->hw;
0855 bool timeout = time_is_before_jiffies(adapter->ptp_tx_start +
0856 IXGBE_PTP_TX_TIMEOUT);
0857 u32 tsynctxctl;
0858
0859
0860 if (!adapter->ptp_tx_skb) {
0861 ixgbe_ptp_clear_tx_timestamp(adapter);
0862 return;
0863 }
0864
0865
0866 tsynctxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCTXCTL);
0867 if (tsynctxctl & IXGBE_TSYNCTXCTL_VALID) {
0868 ixgbe_ptp_tx_hwtstamp(adapter);
0869 return;
0870 }
0871
0872 if (timeout) {
0873 ixgbe_ptp_clear_tx_timestamp(adapter);
0874 adapter->tx_hwtstamp_timeouts++;
0875 e_warn(drv, "clearing Tx Timestamp hang\n");
0876 } else {
0877
0878 schedule_work(&adapter->ptp_tx_work);
0879 }
0880 }
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891 void ixgbe_ptp_rx_pktstamp(struct ixgbe_q_vector *q_vector,
0892 struct sk_buff *skb)
0893 {
0894 __le64 regval;
0895
0896
0897 skb_copy_bits(skb, skb->len - IXGBE_TS_HDR_LEN, ®val,
0898 IXGBE_TS_HDR_LEN);
0899 __pskb_trim(skb, skb->len - IXGBE_TS_HDR_LEN);
0900
0901
0902
0903
0904
0905
0906
0907 ixgbe_ptp_convert_to_hwtstamp(q_vector->adapter, skb_hwtstamps(skb),
0908 le64_to_cpu(regval));
0909 }
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920 void ixgbe_ptp_rx_rgtstamp(struct ixgbe_q_vector *q_vector,
0921 struct sk_buff *skb)
0922 {
0923 struct ixgbe_adapter *adapter;
0924 struct ixgbe_hw *hw;
0925 u64 regval = 0;
0926 u32 tsyncrxctl;
0927
0928
0929 if (!q_vector || !q_vector->adapter)
0930 return;
0931
0932 adapter = q_vector->adapter;
0933 hw = &adapter->hw;
0934
0935
0936
0937
0938
0939 tsyncrxctl = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL);
0940 if (!(tsyncrxctl & IXGBE_TSYNCRXCTL_VALID))
0941 return;
0942
0943 regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPL);
0944 regval |= (u64)IXGBE_READ_REG(hw, IXGBE_RXSTMPH) << 32;
0945
0946 ixgbe_ptp_convert_to_hwtstamp(adapter, skb_hwtstamps(skb), regval);
0947 }
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958 int ixgbe_ptp_get_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr)
0959 {
0960 struct hwtstamp_config *config = &adapter->tstamp_config;
0961
0962 return copy_to_user(ifr->ifr_data, config,
0963 sizeof(*config)) ? -EFAULT : 0;
0964 }
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991 static int ixgbe_ptp_set_timestamp_mode(struct ixgbe_adapter *adapter,
0992 struct hwtstamp_config *config)
0993 {
0994 struct ixgbe_hw *hw = &adapter->hw;
0995 u32 tsync_tx_ctl = IXGBE_TSYNCTXCTL_ENABLED;
0996 u32 tsync_rx_ctl = IXGBE_TSYNCRXCTL_ENABLED;
0997 u32 tsync_rx_mtrl = PTP_EV_PORT << 16;
0998 bool is_l2 = false;
0999 u32 regval;
1000
1001 switch (config->tx_type) {
1002 case HWTSTAMP_TX_OFF:
1003 tsync_tx_ctl = 0;
1004 break;
1005 case HWTSTAMP_TX_ON:
1006 break;
1007 default:
1008 return -ERANGE;
1009 }
1010
1011 switch (config->rx_filter) {
1012 case HWTSTAMP_FILTER_NONE:
1013 tsync_rx_ctl = 0;
1014 tsync_rx_mtrl = 0;
1015 adapter->flags &= ~(IXGBE_FLAG_RX_HWTSTAMP_ENABLED |
1016 IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER);
1017 break;
1018 case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
1019 tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_L4_V1;
1020 tsync_rx_mtrl |= IXGBE_RXMTRL_V1_SYNC_MSG;
1021 adapter->flags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED |
1022 IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER);
1023 break;
1024 case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
1025 tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_L4_V1;
1026 tsync_rx_mtrl |= IXGBE_RXMTRL_V1_DELAY_REQ_MSG;
1027 adapter->flags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED |
1028 IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER);
1029 break;
1030 case HWTSTAMP_FILTER_PTP_V2_EVENT:
1031 case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
1032 case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
1033 case HWTSTAMP_FILTER_PTP_V2_SYNC:
1034 case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
1035 case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
1036 case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ:
1037 case HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ:
1038 case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
1039 tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_EVENT_V2;
1040 is_l2 = true;
1041 config->rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
1042 adapter->flags |= (IXGBE_FLAG_RX_HWTSTAMP_ENABLED |
1043 IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER);
1044 break;
1045 case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
1046 case HWTSTAMP_FILTER_NTP_ALL:
1047 case HWTSTAMP_FILTER_ALL:
1048
1049
1050
1051 if (hw->mac.type >= ixgbe_mac_X550) {
1052 tsync_rx_ctl |= IXGBE_TSYNCRXCTL_TYPE_ALL;
1053 config->rx_filter = HWTSTAMP_FILTER_ALL;
1054 adapter->flags |= IXGBE_FLAG_RX_HWTSTAMP_ENABLED;
1055 break;
1056 }
1057 fallthrough;
1058 default:
1059
1060
1061
1062
1063
1064
1065 adapter->flags &= ~(IXGBE_FLAG_RX_HWTSTAMP_ENABLED |
1066 IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER);
1067 config->rx_filter = HWTSTAMP_FILTER_NONE;
1068 return -ERANGE;
1069 }
1070
1071 if (hw->mac.type == ixgbe_mac_82598EB) {
1072 adapter->flags &= ~(IXGBE_FLAG_RX_HWTSTAMP_ENABLED |
1073 IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER);
1074 if (tsync_rx_ctl | tsync_tx_ctl)
1075 return -ERANGE;
1076 return 0;
1077 }
1078
1079
1080
1081
1082
1083 switch (hw->mac.type) {
1084 case ixgbe_mac_X550:
1085 case ixgbe_mac_X550EM_x:
1086 case ixgbe_mac_x550em_a:
1087
1088
1089
1090
1091 if (config->rx_filter == HWTSTAMP_FILTER_NONE)
1092 break;
1093
1094 tsync_rx_ctl = IXGBE_TSYNCRXCTL_ENABLED |
1095 IXGBE_TSYNCRXCTL_TYPE_ALL |
1096 IXGBE_TSYNCRXCTL_TSIP_UT_EN;
1097 config->rx_filter = HWTSTAMP_FILTER_ALL;
1098 adapter->flags |= IXGBE_FLAG_RX_HWTSTAMP_ENABLED;
1099 adapter->flags &= ~IXGBE_FLAG_RX_HWTSTAMP_IN_REGISTER;
1100 is_l2 = true;
1101 break;
1102 default:
1103 break;
1104 }
1105
1106
1107 if (is_l2)
1108 IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_1588),
1109 (IXGBE_ETQF_FILTER_EN |
1110 IXGBE_ETQF_1588 |
1111 ETH_P_1588));
1112 else
1113 IXGBE_WRITE_REG(hw, IXGBE_ETQF(IXGBE_ETQF_FILTER_1588), 0);
1114
1115
1116 regval = IXGBE_READ_REG(hw, IXGBE_TSYNCTXCTL);
1117 regval &= ~IXGBE_TSYNCTXCTL_ENABLED;
1118 regval |= tsync_tx_ctl;
1119 IXGBE_WRITE_REG(hw, IXGBE_TSYNCTXCTL, regval);
1120
1121
1122 regval = IXGBE_READ_REG(hw, IXGBE_TSYNCRXCTL);
1123 regval &= ~(IXGBE_TSYNCRXCTL_ENABLED | IXGBE_TSYNCRXCTL_TYPE_MASK);
1124 regval |= tsync_rx_ctl;
1125 IXGBE_WRITE_REG(hw, IXGBE_TSYNCRXCTL, regval);
1126
1127
1128 IXGBE_WRITE_REG(hw, IXGBE_RXMTRL, tsync_rx_mtrl);
1129
1130 IXGBE_WRITE_FLUSH(hw);
1131
1132
1133 ixgbe_ptp_clear_tx_timestamp(adapter);
1134 IXGBE_READ_REG(hw, IXGBE_RXSTMPH);
1135
1136 return 0;
1137 }
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147 int ixgbe_ptp_set_ts_config(struct ixgbe_adapter *adapter, struct ifreq *ifr)
1148 {
1149 struct hwtstamp_config config;
1150 int err;
1151
1152 if (copy_from_user(&config, ifr->ifr_data, sizeof(config)))
1153 return -EFAULT;
1154
1155 err = ixgbe_ptp_set_timestamp_mode(adapter, &config);
1156 if (err)
1157 return err;
1158
1159
1160 memcpy(&adapter->tstamp_config, &config,
1161 sizeof(adapter->tstamp_config));
1162
1163 return copy_to_user(ifr->ifr_data, &config, sizeof(config)) ?
1164 -EFAULT : 0;
1165 }
1166
1167 static void ixgbe_ptp_link_speed_adjust(struct ixgbe_adapter *adapter,
1168 u32 *shift, u32 *incval)
1169 {
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184 switch (adapter->link_speed) {
1185 case IXGBE_LINK_SPEED_100_FULL:
1186 *shift = IXGBE_INCVAL_SHIFT_100;
1187 *incval = IXGBE_INCVAL_100;
1188 break;
1189 case IXGBE_LINK_SPEED_1GB_FULL:
1190 *shift = IXGBE_INCVAL_SHIFT_1GB;
1191 *incval = IXGBE_INCVAL_1GB;
1192 break;
1193 case IXGBE_LINK_SPEED_10GB_FULL:
1194 default:
1195 *shift = IXGBE_INCVAL_SHIFT_10GB;
1196 *incval = IXGBE_INCVAL_10GB;
1197 break;
1198 }
1199 }
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211 void ixgbe_ptp_start_cyclecounter(struct ixgbe_adapter *adapter)
1212 {
1213 struct ixgbe_hw *hw = &adapter->hw;
1214 struct cyclecounter cc;
1215 unsigned long flags;
1216 u32 incval = 0;
1217 u32 fuse0 = 0;
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230 cc.mask = CLOCKSOURCE_MASK(64);
1231 cc.mult = 1;
1232 cc.shift = 0;
1233
1234 switch (hw->mac.type) {
1235 case ixgbe_mac_X550EM_x:
1236
1237
1238
1239
1240
1241
1242 fuse0 = IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0));
1243 if (!(fuse0 & IXGBE_FUSES0_300MHZ)) {
1244 cc.mult = 3;
1245 cc.shift = 2;
1246 }
1247 fallthrough;
1248 case ixgbe_mac_x550em_a:
1249 case ixgbe_mac_X550:
1250 cc.read = ixgbe_ptp_read_X550;
1251 break;
1252 case ixgbe_mac_X540:
1253 cc.read = ixgbe_ptp_read_82599;
1254
1255 ixgbe_ptp_link_speed_adjust(adapter, &cc.shift, &incval);
1256 IXGBE_WRITE_REG(hw, IXGBE_TIMINCA, incval);
1257 break;
1258 case ixgbe_mac_82599EB:
1259 cc.read = ixgbe_ptp_read_82599;
1260
1261 ixgbe_ptp_link_speed_adjust(adapter, &cc.shift, &incval);
1262 incval >>= IXGBE_INCVAL_SHIFT_82599;
1263 cc.shift -= IXGBE_INCVAL_SHIFT_82599;
1264 IXGBE_WRITE_REG(hw, IXGBE_TIMINCA,
1265 BIT(IXGBE_INCPER_SHIFT_82599) | incval);
1266 break;
1267 default:
1268
1269 return;
1270 }
1271
1272
1273 WRITE_ONCE(adapter->base_incval, incval);
1274 smp_mb();
1275
1276
1277 spin_lock_irqsave(&adapter->tmreg_lock, flags);
1278 memcpy(&adapter->hw_cc, &cc, sizeof(adapter->hw_cc));
1279 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
1280 }
1281
1282
1283
1284
1285
1286
1287
1288 static void ixgbe_ptp_init_systime(struct ixgbe_adapter *adapter)
1289 {
1290 struct ixgbe_hw *hw = &adapter->hw;
1291 u32 tsauxc;
1292
1293 switch (hw->mac.type) {
1294 case ixgbe_mac_X550EM_x:
1295 case ixgbe_mac_x550em_a:
1296 case ixgbe_mac_X550:
1297 tsauxc = IXGBE_READ_REG(hw, IXGBE_TSAUXC);
1298
1299
1300 IXGBE_WRITE_REG(hw, IXGBE_SYSTIMR, 0);
1301 IXGBE_WRITE_REG(hw, IXGBE_SYSTIML, 0);
1302 IXGBE_WRITE_REG(hw, IXGBE_SYSTIMH, 0);
1303
1304
1305 IXGBE_WRITE_REG(hw, IXGBE_TSIM, IXGBE_TSIM_TXTS);
1306 IXGBE_WRITE_REG(hw, IXGBE_EIMS, IXGBE_EIMS_TIMESYNC);
1307
1308
1309 IXGBE_WRITE_REG(hw, IXGBE_TSAUXC,
1310 tsauxc & ~IXGBE_TSAUXC_DISABLE_SYSTIME);
1311 break;
1312 case ixgbe_mac_X540:
1313 case ixgbe_mac_82599EB:
1314
1315 IXGBE_WRITE_REG(hw, IXGBE_SYSTIML, 0);
1316 IXGBE_WRITE_REG(hw, IXGBE_SYSTIMH, 0);
1317 break;
1318 default:
1319
1320 return;
1321 };
1322
1323 IXGBE_WRITE_FLUSH(hw);
1324 }
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338 void ixgbe_ptp_reset(struct ixgbe_adapter *adapter)
1339 {
1340 struct ixgbe_hw *hw = &adapter->hw;
1341 unsigned long flags;
1342
1343
1344 ixgbe_ptp_set_timestamp_mode(adapter, &adapter->tstamp_config);
1345
1346
1347 if (hw->mac.type == ixgbe_mac_82598EB)
1348 return;
1349
1350 ixgbe_ptp_start_cyclecounter(adapter);
1351
1352 ixgbe_ptp_init_systime(adapter);
1353
1354 spin_lock_irqsave(&adapter->tmreg_lock, flags);
1355 timecounter_init(&adapter->hw_tc, &adapter->hw_cc,
1356 ktime_to_ns(ktime_get_real()));
1357 spin_unlock_irqrestore(&adapter->tmreg_lock, flags);
1358
1359 adapter->last_overflow_check = jiffies;
1360
1361
1362
1363
1364 if (adapter->ptp_setup_sdp)
1365 adapter->ptp_setup_sdp(adapter);
1366 }
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378 static long ixgbe_ptp_create_clock(struct ixgbe_adapter *adapter)
1379 {
1380 struct net_device *netdev = adapter->netdev;
1381 long err;
1382
1383
1384 if (!IS_ERR_OR_NULL(adapter->ptp_clock))
1385 return 0;
1386
1387 switch (adapter->hw.mac.type) {
1388 case ixgbe_mac_X540:
1389 snprintf(adapter->ptp_caps.name,
1390 sizeof(adapter->ptp_caps.name),
1391 "%s", netdev->name);
1392 adapter->ptp_caps.owner = THIS_MODULE;
1393 adapter->ptp_caps.max_adj = 250000000;
1394 adapter->ptp_caps.n_alarm = 0;
1395 adapter->ptp_caps.n_ext_ts = 0;
1396 adapter->ptp_caps.n_per_out = 0;
1397 adapter->ptp_caps.pps = 1;
1398 adapter->ptp_caps.adjfine = ixgbe_ptp_adjfine_82599;
1399 adapter->ptp_caps.adjtime = ixgbe_ptp_adjtime;
1400 adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex;
1401 adapter->ptp_caps.settime64 = ixgbe_ptp_settime;
1402 adapter->ptp_caps.enable = ixgbe_ptp_feature_enable;
1403 adapter->ptp_setup_sdp = ixgbe_ptp_setup_sdp_X540;
1404 break;
1405 case ixgbe_mac_82599EB:
1406 snprintf(adapter->ptp_caps.name,
1407 sizeof(adapter->ptp_caps.name),
1408 "%s", netdev->name);
1409 adapter->ptp_caps.owner = THIS_MODULE;
1410 adapter->ptp_caps.max_adj = 250000000;
1411 adapter->ptp_caps.n_alarm = 0;
1412 adapter->ptp_caps.n_ext_ts = 0;
1413 adapter->ptp_caps.n_per_out = 0;
1414 adapter->ptp_caps.pps = 0;
1415 adapter->ptp_caps.adjfine = ixgbe_ptp_adjfine_82599;
1416 adapter->ptp_caps.adjtime = ixgbe_ptp_adjtime;
1417 adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex;
1418 adapter->ptp_caps.settime64 = ixgbe_ptp_settime;
1419 adapter->ptp_caps.enable = ixgbe_ptp_feature_enable;
1420 break;
1421 case ixgbe_mac_X550:
1422 case ixgbe_mac_X550EM_x:
1423 case ixgbe_mac_x550em_a:
1424 snprintf(adapter->ptp_caps.name, 16, "%s", netdev->name);
1425 adapter->ptp_caps.owner = THIS_MODULE;
1426 adapter->ptp_caps.max_adj = 30000000;
1427 adapter->ptp_caps.n_alarm = 0;
1428 adapter->ptp_caps.n_ext_ts = 0;
1429 adapter->ptp_caps.n_per_out = 0;
1430 adapter->ptp_caps.pps = 1;
1431 adapter->ptp_caps.adjfine = ixgbe_ptp_adjfine_X550;
1432 adapter->ptp_caps.adjtime = ixgbe_ptp_adjtime;
1433 adapter->ptp_caps.gettimex64 = ixgbe_ptp_gettimex;
1434 adapter->ptp_caps.settime64 = ixgbe_ptp_settime;
1435 adapter->ptp_caps.enable = ixgbe_ptp_feature_enable;
1436 adapter->ptp_setup_sdp = ixgbe_ptp_setup_sdp_X550;
1437 break;
1438 default:
1439 adapter->ptp_clock = NULL;
1440 adapter->ptp_setup_sdp = NULL;
1441 return -EOPNOTSUPP;
1442 }
1443
1444 adapter->ptp_clock = ptp_clock_register(&adapter->ptp_caps,
1445 &adapter->pdev->dev);
1446 if (IS_ERR(adapter->ptp_clock)) {
1447 err = PTR_ERR(adapter->ptp_clock);
1448 adapter->ptp_clock = NULL;
1449 e_dev_err("ptp_clock_register failed\n");
1450 return err;
1451 } else if (adapter->ptp_clock)
1452 e_dev_info("registered PHC device on %s\n", netdev->name);
1453
1454
1455
1456
1457
1458 adapter->tstamp_config.rx_filter = HWTSTAMP_FILTER_NONE;
1459 adapter->tstamp_config.tx_type = HWTSTAMP_TX_OFF;
1460
1461 return 0;
1462 }
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472 void ixgbe_ptp_init(struct ixgbe_adapter *adapter)
1473 {
1474
1475
1476
1477
1478 spin_lock_init(&adapter->tmreg_lock);
1479
1480
1481 if (ixgbe_ptp_create_clock(adapter))
1482 return;
1483
1484
1485 INIT_WORK(&adapter->ptp_tx_work, ixgbe_ptp_tx_hwtstamp_work);
1486
1487
1488 ixgbe_ptp_reset(adapter);
1489
1490
1491 set_bit(__IXGBE_PTP_RUNNING, &adapter->state);
1492
1493 return;
1494 }
1495
1496
1497
1498
1499
1500
1501
1502
1503 void ixgbe_ptp_suspend(struct ixgbe_adapter *adapter)
1504 {
1505
1506 if (!test_and_clear_bit(__IXGBE_PTP_RUNNING, &adapter->state))
1507 return;
1508
1509 adapter->flags2 &= ~IXGBE_FLAG2_PTP_PPS_ENABLED;
1510 if (adapter->ptp_setup_sdp)
1511 adapter->ptp_setup_sdp(adapter);
1512
1513
1514 cancel_work_sync(&adapter->ptp_tx_work);
1515 ixgbe_ptp_clear_tx_timestamp(adapter);
1516 }
1517
1518
1519
1520
1521
1522
1523
1524
1525 void ixgbe_ptp_stop(struct ixgbe_adapter *adapter)
1526 {
1527
1528 ixgbe_ptp_suspend(adapter);
1529
1530
1531 if (adapter->ptp_clock) {
1532 ptp_clock_unregister(adapter->ptp_clock);
1533 adapter->ptp_clock = NULL;
1534 e_dev_info("removed PHC on %s\n",
1535 adapter->netdev->name);
1536 }
1537 }