Lines Matching full:ptp

10 	struct hclge_ptp *ptp = hdev->ptp;  in hclge_ptp_get_cycle()  local
12 ptp->cycle.quo = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG) & in hclge_ptp_get_cycle()
14 ptp->cycle.numer = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_NUM_REG); in hclge_ptp_get_cycle()
15 ptp->cycle.den = readl(hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG); in hclge_ptp_get_cycle()
17 if (ptp->cycle.den == 0) { in hclge_ptp_get_cycle()
18 dev_err(&hdev->pdev->dev, "invalid ptp cycle denominator!\n"); in hclge_ptp_get_cycle()
25 static int hclge_ptp_adjfine(struct ptp_clock_info *ptp, long scaled_ppm) in hclge_ptp_adjfine() argument
27 struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp); in hclge_ptp_adjfine()
28 struct hclge_ptp_cycle *cycle = &hdev->ptp->cycle; in hclge_ptp_adjfine()
38 * denominator is fixed to ptp->cycle.den, and numerator in hclge_ptp_adjfine()
39 * is 0.5 * ptp->cycle.den. in hclge_ptp_adjfine()
43 spin_lock_irqsave(&hdev->ptp->lock, flags); in hclge_ptp_adjfine()
45 hdev->ptp->io_base + HCLGE_PTP_CYCLE_QUO_REG); in hclge_ptp_adjfine()
46 writel(numerator, hdev->ptp->io_base + HCLGE_PTP_CYCLE_NUM_REG); in hclge_ptp_adjfine()
47 writel(cycle->den, hdev->ptp->io_base + HCLGE_PTP_CYCLE_DEN_REG); in hclge_ptp_adjfine()
49 hdev->ptp->io_base + HCLGE_PTP_CYCLE_CFG_REG); in hclge_ptp_adjfine()
50 spin_unlock_irqrestore(&hdev->ptp->lock, flags); in hclge_ptp_adjfine()
59 struct hclge_ptp *ptp = hdev->ptp; in hclge_ptp_set_tx_info() local
61 if (!ptp) in hclge_ptp_set_tx_info()
64 if (!test_bit(HCLGE_PTP_FLAG_TX_EN, &ptp->flags) || in hclge_ptp_set_tx_info()
66 ptp->tx_skipped++; in hclge_ptp_set_tx_info()
70 ptp->tx_start = jiffies; in hclge_ptp_set_tx_info()
71 ptp->tx_skb = skb_get(skb); in hclge_ptp_set_tx_info()
72 ptp->tx_cnt++; in hclge_ptp_set_tx_info()
79 struct sk_buff *skb = hdev->ptp->tx_skb; in hclge_ptp_clean_tx_hwts()
84 ns = readl(hdev->ptp->io_base + HCLGE_PTP_TX_TS_NSEC_REG) & in hclge_ptp_clean_tx_hwts()
86 lo = readl(hdev->ptp->io_base + HCLGE_PTP_TX_TS_SEC_L_REG); in hclge_ptp_clean_tx_hwts()
87 hi = readl(hdev->ptp->io_base + HCLGE_PTP_TX_TS_SEC_H_REG) & in hclge_ptp_clean_tx_hwts()
89 hdev->ptp->last_tx_seqid = readl(hdev->ptp->io_base + in hclge_ptp_clean_tx_hwts()
93 hdev->ptp->tx_skb = NULL; in hclge_ptp_clean_tx_hwts()
94 hdev->ptp->tx_cleaned++; in hclge_ptp_clean_tx_hwts()
114 if (!hdev->ptp || !test_bit(HCLGE_PTP_FLAG_RX_EN, &hdev->ptp->flags)) in hclge_ptp_get_rx_hwts()
121 spin_lock_irqsave(&hdev->ptp->lock, flags); in hclge_ptp_get_rx_hwts()
122 sec_h = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_SEC_H_REG); in hclge_ptp_get_rx_hwts()
123 spin_unlock_irqrestore(&hdev->ptp->lock, flags); in hclge_ptp_get_rx_hwts()
127 hdev->ptp->last_rx = jiffies; in hclge_ptp_get_rx_hwts()
128 hdev->ptp->rx_cnt++; in hclge_ptp_get_rx_hwts()
131 static int hclge_ptp_gettimex(struct ptp_clock_info *ptp, struct timespec64 *ts, in hclge_ptp_gettimex() argument
134 struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp); in hclge_ptp_gettimex()
139 spin_lock_irqsave(&hdev->ptp->lock, flags); in hclge_ptp_gettimex()
140 ns = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_NSEC_REG); in hclge_ptp_gettimex()
141 hi = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_SEC_H_REG); in hclge_ptp_gettimex()
142 lo = readl(hdev->ptp->io_base + HCLGE_PTP_CUR_TIME_SEC_L_REG); in hclge_ptp_gettimex()
143 spin_unlock_irqrestore(&hdev->ptp->lock, flags); in hclge_ptp_gettimex()
151 static int hclge_ptp_settime(struct ptp_clock_info *ptp, in hclge_ptp_settime() argument
154 struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp); in hclge_ptp_settime()
157 spin_lock_irqsave(&hdev->ptp->lock, flags); in hclge_ptp_settime()
158 writel(ts->tv_nsec, hdev->ptp->io_base + HCLGE_PTP_TIME_NSEC_REG); in hclge_ptp_settime()
160 hdev->ptp->io_base + HCLGE_PTP_TIME_SEC_H_REG); in hclge_ptp_settime()
162 hdev->ptp->io_base + HCLGE_PTP_TIME_SEC_L_REG); in hclge_ptp_settime()
165 hdev->ptp->io_base + HCLGE_PTP_TIME_SYNC_REG); in hclge_ptp_settime()
166 spin_unlock_irqrestore(&hdev->ptp->lock, flags); in hclge_ptp_settime()
171 static int hclge_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) in hclge_ptp_adjtime() argument
173 struct hclge_dev *hdev = hclge_ptp_get_hdev(ptp); in hclge_ptp_adjtime()
188 hclge_ptp_gettimex(ptp, &ts, NULL); in hclge_ptp_adjtime()
192 return hclge_ptp_settime(ptp, &ts); in hclge_ptp_adjtime()
197 spin_lock_irqsave(&hdev->ptp->lock, flags); in hclge_ptp_adjtime()
198 writel(adj_val, hdev->ptp->io_base + HCLGE_PTP_TIME_NSEC_REG); in hclge_ptp_adjtime()
200 hdev->ptp->io_base + HCLGE_PTP_TIME_ADJ_REG); in hclge_ptp_adjtime()
201 spin_unlock_irqrestore(&hdev->ptp->lock, flags); in hclge_ptp_adjtime()
211 return copy_to_user(ifr->ifr_data, &hdev->ptp->ts_cfg, in hclge_ptp_get_cfg()
228 "failed to %s ptp interrupt, ret = %d\n", in hclge_ptp_int_en()
245 "failed to query ptp config, ret = %d\n", ret); in hclge_ptp_cfg_qry()
266 "failed to config ptp, ret = %d\n", ret); in hclge_ptp_cfg()
336 unsigned long flags = hdev->ptp->flags; in hclge_ptp_set_ts_mode()
340 if (test_bit(HCLGE_PTP_FLAG_EN, &hdev->ptp->flags)) in hclge_ptp_set_ts_mode()
355 hdev->ptp->flags = flags; in hclge_ptp_set_ts_mode()
356 hdev->ptp->ptp_cfg = ptp_cfg; in hclge_ptp_set_ts_mode()
378 hdev->ptp->ts_cfg = cfg; in hclge_ptp_set_cfg()
399 if (hdev->ptp->clock) in hclge_ptp_get_ts_info()
400 info->phc_index = ptp_clock_index(hdev->ptp->clock); in hclge_ptp_get_ts_info()
423 struct hclge_ptp *ptp; in hclge_ptp_create_clock() local
425 ptp = devm_kzalloc(&hdev->pdev->dev, sizeof(*ptp), GFP_KERNEL); in hclge_ptp_create_clock()
426 if (!ptp) in hclge_ptp_create_clock()
429 ptp->hdev = hdev; in hclge_ptp_create_clock()
430 snprintf(ptp->info.name, sizeof(ptp->info.name), "%s", in hclge_ptp_create_clock()
432 ptp->info.owner = THIS_MODULE; in hclge_ptp_create_clock()
433 ptp->info.max_adj = HCLGE_PTP_CYCLE_ADJ_MAX; in hclge_ptp_create_clock()
434 ptp->info.n_ext_ts = 0; in hclge_ptp_create_clock()
435 ptp->info.pps = 0; in hclge_ptp_create_clock()
436 ptp->info.adjfine = hclge_ptp_adjfine; in hclge_ptp_create_clock()
437 ptp->info.adjtime = hclge_ptp_adjtime; in hclge_ptp_create_clock()
438 ptp->info.gettimex64 = hclge_ptp_gettimex; in hclge_ptp_create_clock()
439 ptp->info.settime64 = hclge_ptp_settime; in hclge_ptp_create_clock()
441 ptp->info.n_alarm = 0; in hclge_ptp_create_clock()
442 ptp->clock = ptp_clock_register(&ptp->info, &hdev->pdev->dev); in hclge_ptp_create_clock()
443 if (IS_ERR(ptp->clock)) { in hclge_ptp_create_clock()
445 "%d failed to register ptp clock, ret = %ld\n", in hclge_ptp_create_clock()
446 ptp->info.n_alarm, PTR_ERR(ptp->clock)); in hclge_ptp_create_clock()
448 } else if (!ptp->clock) { in hclge_ptp_create_clock()
449 dev_err(&hdev->pdev->dev, "failed to register ptp clock\n"); in hclge_ptp_create_clock()
453 spin_lock_init(&ptp->lock); in hclge_ptp_create_clock()
454 ptp->io_base = hdev->hw.hw.io_base + HCLGE_PTP_REG_OFFSET; in hclge_ptp_create_clock()
455 ptp->ts_cfg.rx_filter = HWTSTAMP_FILTER_NONE; in hclge_ptp_create_clock()
456 ptp->ts_cfg.tx_type = HWTSTAMP_TX_OFF; in hclge_ptp_create_clock()
457 hdev->ptp = ptp; in hclge_ptp_create_clock()
464 ptp_clock_unregister(hdev->ptp->clock); in hclge_ptp_destroy_clock()
465 hdev->ptp->clock = NULL; in hclge_ptp_destroy_clock()
466 devm_kfree(&hdev->pdev->dev, hdev->ptp); in hclge_ptp_destroy_clock()
467 hdev->ptp = NULL; in hclge_ptp_destroy_clock()
479 if (!hdev->ptp) { in hclge_ptp_init()
493 set_bit(HCLGE_PTP_FLAG_EN, &hdev->ptp->flags); in hclge_ptp_init()
494 ret = hclge_ptp_adjfine(&hdev->ptp->info, 0); in hclge_ptp_init()
501 ret = hclge_ptp_set_ts_mode(hdev, &hdev->ptp->ts_cfg); in hclge_ptp_init()
509 ret = hclge_ptp_settime(&hdev->ptp->info, &ts); in hclge_ptp_init()
529 struct hclge_ptp *ptp = hdev->ptp; in hclge_ptp_uninit() local
531 if (!ptp) in hclge_ptp_uninit()
536 clear_bit(HCLGE_PTP_FLAG_EN, &ptp->flags); in hclge_ptp_uninit()
537 ptp->ts_cfg.rx_filter = HWTSTAMP_FILTER_NONE; in hclge_ptp_uninit()
538 ptp->ts_cfg.tx_type = HWTSTAMP_TX_OFF; in hclge_ptp_uninit()
540 if (hclge_ptp_set_ts_mode(hdev, &ptp->ts_cfg)) in hclge_ptp_uninit()
543 if (ptp->tx_skb) { in hclge_ptp_uninit()
544 struct sk_buff *skb = ptp->tx_skb; in hclge_ptp_uninit()
546 ptp->tx_skb = NULL; in hclge_ptp_uninit()