1bc767866SPriyanka Jain /* SPDX-License-Identifier: BSD-3-Clause 2*4d4399aeSJun Yang * Copyright 2019, 2023 NXP 3bc767866SPriyanka Jain */ 4bc767866SPriyanka Jain 5bc767866SPriyanka Jain #include <sys/queue.h> 6bc767866SPriyanka Jain #include <stdio.h> 7bc767866SPriyanka Jain #include <errno.h> 8bc767866SPriyanka Jain #include <stdint.h> 9bc767866SPriyanka Jain #include <string.h> 10bc767866SPriyanka Jain #include <unistd.h> 11bc767866SPriyanka Jain #include <stdarg.h> 12bc767866SPriyanka Jain 13f9bdee26SKonstantin Ananyev #include <ethdev_driver.h> 14bc767866SPriyanka Jain #include <rte_log.h> 15bc767866SPriyanka Jain #include <rte_eth_ctrl.h> 16bc767866SPriyanka Jain #include <rte_malloc.h> 17bc767866SPriyanka Jain #include <rte_time.h> 18bc767866SPriyanka Jain 19b4f22ca5SDavid Marchand #include <bus_fslmc_driver.h> 20bc767866SPriyanka Jain #include <fsl_dprtc.h> 21bc767866SPriyanka Jain #include <fsl_dpkg.h> 22bc767866SPriyanka Jain 23bc767866SPriyanka Jain #include <dpaa2_ethdev.h> 24bc767866SPriyanka Jain #include <dpaa2_pmd_logs.h> 25bc767866SPriyanka Jain 26bc767866SPriyanka Jain struct dpaa2_dprtc_dev { 27bc767866SPriyanka Jain struct fsl_mc_io dprtc; /** handle to DPRTC portal object */ 28bc767866SPriyanka Jain uint16_t token; 29bc767866SPriyanka Jain uint32_t dprtc_id; /*HW ID for DPRTC object */ 30bc767866SPriyanka Jain }; 31bc767866SPriyanka Jain static struct dpaa2_dprtc_dev *dprtc_dev; 32bc767866SPriyanka Jain 33bc767866SPriyanka Jain int dpaa2_timesync_enable(struct rte_eth_dev *dev __rte_unused) 34bc767866SPriyanka Jain { 35bc767866SPriyanka Jain return 0; 36bc767866SPriyanka Jain } 37bc767866SPriyanka Jain 38bc767866SPriyanka Jain int dpaa2_timesync_disable(struct rte_eth_dev *dev __rte_unused) 39bc767866SPriyanka Jain { 40bc767866SPriyanka Jain return 0; 41bc767866SPriyanka Jain } 42bc767866SPriyanka Jain 43bc767866SPriyanka Jain int dpaa2_timesync_read_time(struct rte_eth_dev *dev, 44bc767866SPriyanka Jain struct timespec *timestamp) 45bc767866SPriyanka Jain { 46bc767866SPriyanka Jain uint64_t ns; 47bc767866SPriyanka Jain int ret = 0; 48bc767866SPriyanka Jain 49bc767866SPriyanka Jain RTE_SET_USED(dev); 50bc767866SPriyanka Jain 51bc767866SPriyanka Jain ret = dprtc_get_time(&dprtc_dev->dprtc, CMD_PRI_LOW, 52bc767866SPriyanka Jain dprtc_dev->token, &ns); 53bc767866SPriyanka Jain if (ret) { 54bc767866SPriyanka Jain DPAA2_PMD_ERR("dprtc_get_time failed ret: %d", ret); 55bc767866SPriyanka Jain return ret; 56bc767866SPriyanka Jain } 57bc767866SPriyanka Jain 58bc767866SPriyanka Jain *timestamp = rte_ns_to_timespec(ns); 59bc767866SPriyanka Jain 60bc767866SPriyanka Jain return 0; 61bc767866SPriyanka Jain } 62bc767866SPriyanka Jain 63bc767866SPriyanka Jain int dpaa2_timesync_write_time(struct rte_eth_dev *dev, 64bc767866SPriyanka Jain const struct timespec *ts) 65bc767866SPriyanka Jain { 66bc767866SPriyanka Jain uint64_t ns; 67bc767866SPriyanka Jain int ret = 0; 68bc767866SPriyanka Jain 69bc767866SPriyanka Jain RTE_SET_USED(dev); 70bc767866SPriyanka Jain 71bc767866SPriyanka Jain ns = rte_timespec_to_ns(ts); 72bc767866SPriyanka Jain 73bc767866SPriyanka Jain ret = dprtc_set_time(&dprtc_dev->dprtc, CMD_PRI_LOW, 74bc767866SPriyanka Jain dprtc_dev->token, ns); 75bc767866SPriyanka Jain if (ret) { 76bc767866SPriyanka Jain DPAA2_PMD_ERR("dprtc_set_time failed ret: %d", ret); 77bc767866SPriyanka Jain return ret; 78bc767866SPriyanka Jain } 79bc767866SPriyanka Jain 80bc767866SPriyanka Jain return 0; 81bc767866SPriyanka Jain } 82bc767866SPriyanka Jain 83bc767866SPriyanka Jain int dpaa2_timesync_adjust_time(struct rte_eth_dev *dev, int64_t delta) 84bc767866SPriyanka Jain { 85bc767866SPriyanka Jain uint64_t ns; 86bc767866SPriyanka Jain int ret = 0; 87bc767866SPriyanka Jain 88bc767866SPriyanka Jain RTE_SET_USED(dev); 89bc767866SPriyanka Jain 90bc767866SPriyanka Jain ret = dprtc_get_time(&dprtc_dev->dprtc, CMD_PRI_LOW, 91bc767866SPriyanka Jain dprtc_dev->token, &ns); 92bc767866SPriyanka Jain if (ret) { 93bc767866SPriyanka Jain DPAA2_PMD_ERR("dprtc_get_time failed ret: %d", ret); 94bc767866SPriyanka Jain return ret; 95bc767866SPriyanka Jain } 96bc767866SPriyanka Jain 97bc767866SPriyanka Jain ns += delta; 98bc767866SPriyanka Jain 99bc767866SPriyanka Jain ret = dprtc_set_time(&dprtc_dev->dprtc, CMD_PRI_LOW, 100bc767866SPriyanka Jain dprtc_dev->token, ns); 101bc767866SPriyanka Jain if (ret) { 102bc767866SPriyanka Jain DPAA2_PMD_ERR("dprtc_set_time failed ret: %d", ret); 103bc767866SPriyanka Jain return ret; 104bc767866SPriyanka Jain } 105bc767866SPriyanka Jain 106bc767866SPriyanka Jain return 0; 107bc767866SPriyanka Jain } 108bc767866SPriyanka Jain 109bc767866SPriyanka Jain int dpaa2_timesync_read_tx_timestamp(struct rte_eth_dev *dev, 110bc767866SPriyanka Jain struct timespec *timestamp) 111bc767866SPriyanka Jain { 112bc767866SPriyanka Jain struct dpaa2_dev_priv *priv = dev->data->dev_private; 113bc767866SPriyanka Jain 11490762e5cSVanshika Shukla if (priv->next_tx_conf_queue) { 11590762e5cSVanshika Shukla while (!priv->tx_timestamp) 116bc767866SPriyanka Jain dpaa2_dev_tx_conf(priv->next_tx_conf_queue); 11790762e5cSVanshika Shukla } else { 118bc767866SPriyanka Jain return -1; 11990762e5cSVanshika Shukla } 120bc767866SPriyanka Jain *timestamp = rte_ns_to_timespec(priv->tx_timestamp); 121bc767866SPriyanka Jain 122bc767866SPriyanka Jain return 0; 123bc767866SPriyanka Jain } 124bc767866SPriyanka Jain 125bc767866SPriyanka Jain int dpaa2_timesync_read_rx_timestamp(struct rte_eth_dev *dev, 126bc767866SPriyanka Jain struct timespec *timestamp, 127bc767866SPriyanka Jain uint32_t flags __rte_unused) 128bc767866SPriyanka Jain { 129bc767866SPriyanka Jain struct dpaa2_dev_priv *priv = dev->data->dev_private; 130bc767866SPriyanka Jain *timestamp = rte_ns_to_timespec(priv->rx_timestamp); 131bc767866SPriyanka Jain return 0; 132bc767866SPriyanka Jain } 133bc767866SPriyanka Jain 134c6299a08SChenxu Di #if defined(RTE_LIBRTE_IEEE1588) 135bc767866SPriyanka Jain static int 136bc767866SPriyanka Jain dpaa2_create_dprtc_device(int vdev_fd __rte_unused, 137bc767866SPriyanka Jain struct vfio_device_info *obj_info __rte_unused, 138*4d4399aeSJun Yang struct rte_dpaa2_device *obj) 139bc767866SPriyanka Jain { 140bc767866SPriyanka Jain struct dprtc_attr attr; 141*4d4399aeSJun Yang int ret, dprtc_id = obj->object_id; 142bc767866SPriyanka Jain 143bc767866SPriyanka Jain PMD_INIT_FUNC_TRACE(); 144bc767866SPriyanka Jain 145bc767866SPriyanka Jain /* Allocate DPAA2 dprtc handle */ 146bc767866SPriyanka Jain dprtc_dev = rte_malloc(NULL, sizeof(struct dpaa2_dprtc_dev), 0); 147bc767866SPriyanka Jain if (!dprtc_dev) { 148bc767866SPriyanka Jain DPAA2_PMD_ERR("Memory allocation failed for DPRTC Device"); 149bc767866SPriyanka Jain return -1; 150bc767866SPriyanka Jain } 151bc767866SPriyanka Jain 152bc767866SPriyanka Jain /* Open the dprtc object */ 153a6a5f4b4SHemant Agrawal dprtc_dev->dprtc.regs = dpaa2_get_mcp_ptr(MC_PORTAL_INDEX); 154bc767866SPriyanka Jain ret = dprtc_open(&dprtc_dev->dprtc, CMD_PRI_LOW, dprtc_id, 155bc767866SPriyanka Jain &dprtc_dev->token); 156bc767866SPriyanka Jain if (ret) { 157bc767866SPriyanka Jain DPAA2_PMD_ERR("Unable to open dprtc object: err(%d)", ret); 158bc767866SPriyanka Jain goto init_err; 159bc767866SPriyanka Jain } 160bc767866SPriyanka Jain 161bc767866SPriyanka Jain ret = dprtc_get_attributes(&dprtc_dev->dprtc, CMD_PRI_LOW, 162bc767866SPriyanka Jain dprtc_dev->token, &attr); 163bc767866SPriyanka Jain if (ret) { 164bc767866SPriyanka Jain DPAA2_PMD_ERR("Unable to get dprtc attr: err(%d)", ret); 165bc767866SPriyanka Jain goto init_err; 166bc767866SPriyanka Jain } 167bc767866SPriyanka Jain 168bc767866SPriyanka Jain dprtc_dev->dprtc_id = dprtc_id; 169bc767866SPriyanka Jain 170bc767866SPriyanka Jain return 0; 171bc767866SPriyanka Jain 172bc767866SPriyanka Jain init_err: 173bc767866SPriyanka Jain rte_free(dprtc_dev); 174bc767866SPriyanka Jain 175bc767866SPriyanka Jain return -1; 176bc767866SPriyanka Jain } 177bc767866SPriyanka Jain 178bc767866SPriyanka Jain static struct rte_dpaa2_object rte_dpaa2_dprtc_obj = { 179bc767866SPriyanka Jain .dev_type = DPAA2_DPRTC, 180bc767866SPriyanka Jain .create = dpaa2_create_dprtc_device, 181bc767866SPriyanka Jain }; 182bc767866SPriyanka Jain 183bc767866SPriyanka Jain RTE_PMD_REGISTER_DPAA2_OBJECT(dprtc, rte_dpaa2_dprtc_obj); 184c6299a08SChenxu Di #endif 185