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