Lines Matching +full:sparx +full:- +full:5

1 // SPDX-License-Identifier: GPL-2.0+
7 * https://github.com/microchip-ung/sparx-5_reginfo
32 * (1/1000000)/((2^-59)/X) in sparx5_ptp_get_1ppm()
37 switch (sparx5->coreclock) { in sparx5_ptp_get_1ppm()
59 switch (sparx5->coreclock) { in sparx5_ptp_get_nominal_value()
79 struct sparx5 *sparx5 = port->sparx5; in sparx5_ptp_hwtstamp_set()
88 if (test_bit(port->portno, sparx5->bridge_mask)) in sparx5_ptp_hwtstamp_set()
89 return -EINVAL; in sparx5_ptp_hwtstamp_set()
91 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in sparx5_ptp_hwtstamp_set()
92 return -EFAULT; in sparx5_ptp_hwtstamp_set()
96 port->ptp_cmd = IFH_REW_OP_TWO_STEP_PTP; in sparx5_ptp_hwtstamp_set()
99 port->ptp_cmd = IFH_REW_OP_ONE_STEP_PTP; in sparx5_ptp_hwtstamp_set()
102 port->ptp_cmd = IFH_REW_OP_NOOP; in sparx5_ptp_hwtstamp_set()
105 return -ERANGE; in sparx5_ptp_hwtstamp_set()
128 return -ERANGE; in sparx5_ptp_hwtstamp_set()
132 mutex_lock(&sparx5->ptp_lock); in sparx5_ptp_hwtstamp_set()
133 phc = &sparx5->phc[SPARX5_PHC_PORT]; in sparx5_ptp_hwtstamp_set()
134 memcpy(&phc->hwtstamp_config, &cfg, sizeof(cfg)); in sparx5_ptp_hwtstamp_set()
135 mutex_unlock(&sparx5->ptp_lock); in sparx5_ptp_hwtstamp_set()
137 return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; in sparx5_ptp_hwtstamp_set()
142 struct sparx5 *sparx5 = port->sparx5; in sparx5_ptp_hwtstamp_get()
145 phc = &sparx5->phc[SPARX5_PHC_PORT]; in sparx5_ptp_hwtstamp_get()
146 return copy_to_user(ifr->ifr_data, &phc->hwtstamp_config, in sparx5_ptp_hwtstamp_get()
147 sizeof(phc->hwtstamp_config)) ? -EFAULT : 0; in sparx5_ptp_hwtstamp_get()
157 if (port->ptp_cmd == IFH_REW_OP_NOOP) { in sparx5_ptp_classify()
188 if (port->ptp_cmd == IFH_REW_OP_TWO_STEP_PTP) { in sparx5_ptp_classify()
210 spin_lock_irqsave(&port->tx_skbs.lock, flags); in sparx5_ptp_txtstamp_old_release()
211 skb_queue_walk_safe(&port->tx_skbs, skb, skb_tmp) { in sparx5_ptp_txtstamp_old_release()
212 if time_after(SPARX5_SKB_CB(skb)->jiffies + SPARX5_PTP_TIMEOUT, in sparx5_ptp_txtstamp_old_release()
216 __skb_unlink(skb, &port->tx_skbs); in sparx5_ptp_txtstamp_old_release()
219 spin_unlock_irqrestore(&port->tx_skbs.lock, flags); in sparx5_ptp_txtstamp_old_release()
225 struct sparx5 *sparx5 = port->sparx5; in sparx5_ptp_txtstamp_request()
230 SPARX5_SKB_CB(skb)->rew_op = rew_op; in sparx5_ptp_txtstamp_request()
231 SPARX5_SKB_CB(skb)->pdu_type = pdu_type; in sparx5_ptp_txtstamp_request()
232 SPARX5_SKB_CB(skb)->pdu_w16_offset = pdu_w16_offset; in sparx5_ptp_txtstamp_request()
239 spin_lock_irqsave(&sparx5->ptp_ts_id_lock, flags); in sparx5_ptp_txtstamp_request()
240 if (sparx5->ptp_skbs == SPARX5_MAX_PTP_ID) { in sparx5_ptp_txtstamp_request()
241 spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags); in sparx5_ptp_txtstamp_request()
242 return -EBUSY; in sparx5_ptp_txtstamp_request()
245 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in sparx5_ptp_txtstamp_request()
247 skb_queue_tail(&port->tx_skbs, skb); in sparx5_ptp_txtstamp_request()
248 SPARX5_SKB_CB(skb)->ts_id = port->ts_id; in sparx5_ptp_txtstamp_request()
249 SPARX5_SKB_CB(skb)->jiffies = jiffies; in sparx5_ptp_txtstamp_request()
251 sparx5->ptp_skbs++; in sparx5_ptp_txtstamp_request()
252 port->ts_id++; in sparx5_ptp_txtstamp_request()
253 if (port->ts_id == SPARX5_MAX_PTP_ID) in sparx5_ptp_txtstamp_request()
254 port->ts_id = 0; in sparx5_ptp_txtstamp_request()
256 spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags); in sparx5_ptp_txtstamp_request()
264 struct sparx5 *sparx5 = port->sparx5; in sparx5_ptp_txtstamp_release()
267 spin_lock_irqsave(&sparx5->ptp_ts_id_lock, flags); in sparx5_ptp_txtstamp_release()
268 port->ts_id--; in sparx5_ptp_txtstamp_release()
269 sparx5->ptp_skbs--; in sparx5_ptp_txtstamp_release()
270 skb_unlink(skb, &port->tx_skbs); in sparx5_ptp_txtstamp_release()
271 spin_unlock_irqrestore(&sparx5->ptp_ts_id_lock, flags); in sparx5_ptp_txtstamp_release()
282 spin_lock_irqsave(&sparx5->ptp_clock_lock, flags); in sparx5_get_hwtimestamp()
292 ts->tv_sec = spx5_rd(sparx5, PTP_PTP_TOD_SEC_LSB(TOD_ACC_PIN)); in sparx5_get_hwtimestamp()
295 ts->tv_nsec = nsec; in sparx5_get_hwtimestamp()
299 ts->tv_sec--; in sparx5_get_hwtimestamp()
301 spin_unlock_irqrestore(&sparx5->ptp_clock_lock, flags); in sparx5_get_hwtimestamp()
309 while (budget--) { in sparx5_ptp_irq_handler()
333 port = sparx5->ports[txport]; in sparx5_ptp_irq_handler()
357 spin_lock_irqsave(&port->tx_skbs.lock, flags); in sparx5_ptp_irq_handler()
358 skb_queue_walk_safe(&port->tx_skbs, skb, skb_tmp) { in sparx5_ptp_irq_handler()
359 if (SPARX5_SKB_CB(skb)->ts_id != id) in sparx5_ptp_irq_handler()
362 __skb_unlink(skb, &port->tx_skbs); in sparx5_ptp_irq_handler()
366 spin_unlock_irqrestore(&port->tx_skbs.lock, flags); in sparx5_ptp_irq_handler()
376 spin_lock(&sparx5->ptp_ts_id_lock); in sparx5_ptp_irq_handler()
377 sparx5->ptp_skbs--; in sparx5_ptp_irq_handler()
378 spin_unlock(&sparx5->ptp_ts_id_lock); in sparx5_ptp_irq_handler()
396 struct sparx5 *sparx5 = phc->sparx5; in sparx5_ptp_adjfine()
407 scaled_ppm = -scaled_ppm; in sparx5_ptp_adjfine()
418 tod_inc = neg_adj ? tod_inc - ref : tod_inc + ref; in sparx5_ptp_adjfine()
420 spin_lock_irqsave(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_adjfine()
422 spx5_rmw(PTP_PTP_DOM_CFG_PTP_CLKCFG_DIS_SET(1 << BIT(phc->index)), in sparx5_ptp_adjfine()
427 PTP_CLK_PER_CFG(phc->index, 0)); in sparx5_ptp_adjfine()
429 PTP_CLK_PER_CFG(phc->index, 1)); in sparx5_ptp_adjfine()
435 spin_unlock_irqrestore(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_adjfine()
444 struct sparx5 *sparx5 = phc->sparx5; in sparx5_ptp_settime64()
447 spin_lock_irqsave(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_settime64()
451 PTP_PTP_PIN_CFG_PTP_PIN_DOM_SET(phc->index) | in sparx5_ptp_settime64()
459 spx5_wr(PTP_PTP_TOD_SEC_MSB_PTP_TOD_SEC_MSB_SET(upper_32_bits(ts->tv_sec)), in sparx5_ptp_settime64()
461 spx5_wr(lower_32_bits(ts->tv_sec), in sparx5_ptp_settime64()
463 spx5_wr(ts->tv_nsec, sparx5, PTP_PTP_TOD_NSEC(TOD_ACC_PIN)); in sparx5_ptp_settime64()
467 PTP_PTP_PIN_CFG_PTP_PIN_DOM_SET(phc->index) | in sparx5_ptp_settime64()
474 spin_unlock_irqrestore(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_settime64()
483 struct sparx5 *sparx5 = phc->sparx5; in sparx5_ptp_gettime64()
488 spin_lock_irqsave(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_gettime64()
491 PTP_PTP_PIN_CFG_PTP_PIN_DOM_SET(phc->index) | in sparx5_ptp_gettime64()
504 spin_unlock_irqrestore(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_gettime64()
508 s--; in sparx5_ptp_gettime64()
520 struct sparx5 *sparx5 = phc->sparx5; in sparx5_ptp_adjtime()
522 if (delta > -(NSEC_PER_SEC / 2) && delta < (NSEC_PER_SEC / 2)) { in sparx5_ptp_adjtime()
525 spin_lock_irqsave(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_adjtime()
529 PTP_PTP_PIN_CFG_PTP_PIN_DOM_SET(phc->index) | in sparx5_ptp_adjtime()
541 PTP_PTP_PIN_CFG_PTP_PIN_DOM_SET(phc->index) | in sparx5_ptp_adjtime()
548 spin_unlock_irqrestore(&sparx5->ptp_clock_lock, flags); in sparx5_ptp_adjtime()
579 struct sparx5_phc *phc = &sparx5->phc[index]; in sparx5_ptp_phc_init()
581 phc->info = *clock_info; in sparx5_ptp_phc_init()
582 phc->clock = ptp_clock_register(&phc->info, sparx5->dev); in sparx5_ptp_phc_init()
583 if (IS_ERR(phc->clock)) in sparx5_ptp_phc_init()
584 return PTR_ERR(phc->clock); in sparx5_ptp_phc_init()
586 phc->index = index; in sparx5_ptp_phc_init()
587 phc->sparx5 = sparx5; in sparx5_ptp_phc_init()
590 phc->hwtstamp_config.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; in sparx5_ptp_phc_init()
601 if (!sparx5->ptp) in sparx5_ptp_init()
610 spin_lock_init(&sparx5->ptp_clock_lock); in sparx5_ptp_init()
611 spin_lock_init(&sparx5->ptp_ts_id_lock); in sparx5_ptp_init()
612 mutex_init(&sparx5->ptp_lock); in sparx5_ptp_init()
636 for (i = 0; i < sparx5->port_count; i++) { in sparx5_ptp_init()
637 port = sparx5->ports[i]; in sparx5_ptp_init()
641 skb_queue_head_init(&port->tx_skbs); in sparx5_ptp_init()
652 for (i = 0; i < sparx5->port_count; i++) { in sparx5_ptp_deinit()
653 port = sparx5->ports[i]; in sparx5_ptp_deinit()
657 skb_queue_purge(&port->tx_skbs); in sparx5_ptp_deinit()
661 ptp_clock_unregister(sparx5->phc[i].clock); in sparx5_ptp_deinit()
672 if (!sparx5->ptp) in sparx5_ptp_rxtstamp()
675 phc = &sparx5->phc[SPARX5_PHC_PORT]; in sparx5_ptp_rxtstamp()
676 sparx5_ptp_gettime64(&phc->info, &ts); in sparx5_ptp_rxtstamp()
679 ts.tv_sec--; in sparx5_ptp_rxtstamp()
684 shhwtstamps->hwtstamp = full_ts_in_ns; in sparx5_ptp_rxtstamp()