xref: /dpdk/drivers/net/dpaa/dpaa_ptp.c (revision 73585446921304f543360af104473a955ae46df9)
1615352f5SVanshika Shukla /* SPDX-License-Identifier: BSD-3-Clause
2615352f5SVanshika Shukla  * Copyright 2022-2024 NXP
3615352f5SVanshika Shukla  */
4615352f5SVanshika Shukla 
5615352f5SVanshika Shukla /* System headers */
6615352f5SVanshika Shukla #include <stdio.h>
7615352f5SVanshika Shukla #include <inttypes.h>
8615352f5SVanshika Shukla #include <unistd.h>
9615352f5SVanshika Shukla 
10615352f5SVanshika Shukla #include <rte_ethdev.h>
11615352f5SVanshika Shukla #include <rte_log.h>
12615352f5SVanshika Shukla #include <rte_eth_ctrl.h>
13615352f5SVanshika Shukla #include <rte_malloc.h>
14615352f5SVanshika Shukla #include <rte_time.h>
15615352f5SVanshika Shukla 
16615352f5SVanshika Shukla #include <dpaa_ethdev.h>
17615352f5SVanshika Shukla #include <dpaa_rxtx.h>
18615352f5SVanshika Shukla 
19*73585446SVanshika Shukla int
20*73585446SVanshika Shukla dpaa_timesync_enable(struct rte_eth_dev *dev __rte_unused)
21*73585446SVanshika Shukla {
22*73585446SVanshika Shukla 	return 0;
23*73585446SVanshika Shukla }
24*73585446SVanshika Shukla 
25*73585446SVanshika Shukla int
26*73585446SVanshika Shukla dpaa_timesync_disable(struct rte_eth_dev *dev __rte_unused)
27*73585446SVanshika Shukla {
28*73585446SVanshika Shukla 	return 0;
29*73585446SVanshika Shukla }
30*73585446SVanshika Shukla 
31*73585446SVanshika Shukla int
32*73585446SVanshika Shukla dpaa_timesync_read_time(struct rte_eth_dev *dev,
33*73585446SVanshika Shukla 					struct timespec *timestamp)
34*73585446SVanshika Shukla {
35*73585446SVanshika Shukla 	uint32_t *tmr_cnt_h, *tmr_cnt_l;
36*73585446SVanshika Shukla 	struct __fman_if *__fif;
37*73585446SVanshika Shukla 	struct fman_if *fif;
38*73585446SVanshika Shukla 	uint64_t time;
39*73585446SVanshika Shukla 
40*73585446SVanshika Shukla 	fif = dev->process_private;
41*73585446SVanshika Shukla 	__fif = container_of(fif, struct __fman_if, __if);
42*73585446SVanshika Shukla 
43*73585446SVanshika Shukla 	tmr_cnt_h = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_h;
44*73585446SVanshika Shukla 	tmr_cnt_l = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_l;
45*73585446SVanshika Shukla 
46*73585446SVanshika Shukla 	time = (uint64_t)in_be32(tmr_cnt_l);
47*73585446SVanshika Shukla 	time |= ((uint64_t)in_be32(tmr_cnt_h) << 32);
48*73585446SVanshika Shukla 
49*73585446SVanshika Shukla 	*timestamp = rte_ns_to_timespec(time);
50*73585446SVanshika Shukla 	return 0;
51*73585446SVanshika Shukla }
52*73585446SVanshika Shukla 
53*73585446SVanshika Shukla int
54*73585446SVanshika Shukla dpaa_timesync_write_time(struct rte_eth_dev *dev,
55*73585446SVanshika Shukla 					const struct timespec *ts)
56*73585446SVanshika Shukla {
57*73585446SVanshika Shukla 	uint32_t *tmr_cnt_h, *tmr_cnt_l;
58*73585446SVanshika Shukla 	struct __fman_if *__fif;
59*73585446SVanshika Shukla 	struct fman_if *fif;
60*73585446SVanshika Shukla 	uint64_t time;
61*73585446SVanshika Shukla 
62*73585446SVanshika Shukla 	fif = dev->process_private;
63*73585446SVanshika Shukla 	__fif = container_of(fif, struct __fman_if, __if);
64*73585446SVanshika Shukla 
65*73585446SVanshika Shukla 	tmr_cnt_h = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_h;
66*73585446SVanshika Shukla 	tmr_cnt_l = &((struct rtc_regs *)__fif->rtc_map)->tmr_cnt_l;
67*73585446SVanshika Shukla 
68*73585446SVanshika Shukla 	time = rte_timespec_to_ns(ts);
69*73585446SVanshika Shukla 
70*73585446SVanshika Shukla 	out_be32(tmr_cnt_l, (uint32_t)time);
71*73585446SVanshika Shukla 	out_be32(tmr_cnt_h, (uint32_t)(time >> 32));
72*73585446SVanshika Shukla 
73*73585446SVanshika Shukla 	return 0;
74*73585446SVanshika Shukla }
75*73585446SVanshika Shukla 
76*73585446SVanshika Shukla int
77*73585446SVanshika Shukla dpaa_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta)
78*73585446SVanshika Shukla {
79*73585446SVanshika Shukla 	struct timespec ts = {0, 0}, *timestamp = &ts;
80*73585446SVanshika Shukla 	uint64_t ns;
81*73585446SVanshika Shukla 
82*73585446SVanshika Shukla 	dpaa_timesync_read_time(dev, timestamp);
83*73585446SVanshika Shukla 
84*73585446SVanshika Shukla 	ns = rte_timespec_to_ns(timestamp);
85*73585446SVanshika Shukla 	ns += delta;
86*73585446SVanshika Shukla 	*timestamp = rte_ns_to_timespec(ns);
87*73585446SVanshika Shukla 
88*73585446SVanshika Shukla 	dpaa_timesync_write_time(dev, timestamp);
89*73585446SVanshika Shukla 
90*73585446SVanshika Shukla 	return 0;
91*73585446SVanshika Shukla }
92*73585446SVanshika Shukla 
93*73585446SVanshika Shukla int
94*73585446SVanshika Shukla dpaa_timesync_read_tx_timestamp(struct rte_eth_dev *dev,
95615352f5SVanshika Shukla 						struct timespec *timestamp)
96615352f5SVanshika Shukla {
97615352f5SVanshika Shukla 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
98615352f5SVanshika Shukla 
99615352f5SVanshika Shukla 	if (dpaa_intf->next_tx_conf_queue) {
100615352f5SVanshika Shukla 		while (!dpaa_intf->tx_timestamp)
101615352f5SVanshika Shukla 			dpaa_eth_tx_conf(dpaa_intf->next_tx_conf_queue);
102615352f5SVanshika Shukla 	} else {
103615352f5SVanshika Shukla 		return -1;
104615352f5SVanshika Shukla 	}
105615352f5SVanshika Shukla 	*timestamp = rte_ns_to_timespec(dpaa_intf->tx_timestamp);
106615352f5SVanshika Shukla 
107615352f5SVanshika Shukla 	return 0;
108615352f5SVanshika Shukla }
109615352f5SVanshika Shukla 
110*73585446SVanshika Shukla int
111*73585446SVanshika Shukla dpaa_timesync_read_rx_timestamp(struct rte_eth_dev *dev,
112615352f5SVanshika Shukla 						struct timespec *timestamp,
113615352f5SVanshika Shukla 						uint32_t flags __rte_unused)
114615352f5SVanshika Shukla {
115615352f5SVanshika Shukla 	struct dpaa_if *dpaa_intf = dev->data->dev_private;
116615352f5SVanshika Shukla 	*timestamp = rte_ns_to_timespec(dpaa_intf->rx_timestamp);
117615352f5SVanshika Shukla 	return 0;
118615352f5SVanshika Shukla }
119