From patchwork Fri Jun 5 15:19:04 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John McNamara X-Patchwork-Id: 5212 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 1AEDCC332; Fri, 5 Jun 2015 17:20:07 +0200 (CEST) Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id 1055AC322 for ; Fri, 5 Jun 2015 17:20:04 +0200 (CEST) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP; 05 Jun 2015 08:20:04 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,559,1427785200"; d="scan'208";a="503299379" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by FMSMGA003.fm.intel.com with ESMTP; 05 Jun 2015 08:20:04 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id t55FK2ZS020381; Fri, 5 Jun 2015 16:20:02 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id t55FK2La019599; Fri, 5 Jun 2015 16:20:02 +0100 Received: (from jmcnam2x@localhost) by sivswdev02.ir.intel.com with id t55FK2Xl019595; Fri, 5 Jun 2015 16:20:02 +0100 From: John McNamara To: dev@dpdk.org Date: Fri, 5 Jun 2015 16:19:04 +0100 Message-Id: <1433517547-19537-2-git-send-email-john.mcnamara@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1433517547-19537-1-git-send-email-john.mcnamara@intel.com> References: <1433517547-19537-1-git-send-email-john.mcnamara@intel.com> Subject: [dpdk-dev] [PATCH 1/4] ethdev: add support for ieee1588 timestamping X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add ethdev API to enable and read IEEE1588 PTP timestamps from nics that support it. The following functions are added: rte_eth_ieee1588_enable() rte_eth_ieee1588_disable() rte_eth_ieee1588_read_rx_timestamp() rte_eth_ieee1588_read_tx_timestamp() Signed-off-by: John McNamara --- lib/librte_ether/rte_ethdev.c | 70 ++++++++++++++++++++++++++- lib/librte_ether/rte_ethdev.h | 88 +++++++++++++++++++++++++++++++++- lib/librte_ether/rte_ether_version.map | 4 ++ 3 files changed, 160 insertions(+), 2 deletions(-) diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c index 5a94654..f85a1cd 100644 --- a/lib/librte_ether/rte_ethdev.c +++ b/lib/librte_ether/rte_ethdev.c @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -3627,3 +3627,71 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, /* Callback wasn't found. */ return -EINVAL; } + +int +rte_eth_ieee1588_enable(uint8_t port_id) +{ + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + dev = &rte_eth_devices[port_id]; + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->ieee1588_enable, -ENOTSUP); + return (*dev->dev_ops->ieee1588_enable)(dev); +} + +int +rte_eth_ieee1588_disable(uint8_t port_id) +{ + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + dev = &rte_eth_devices[port_id]; + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->ieee1588_disable, -ENOTSUP); + return (*dev->dev_ops->ieee1588_disable)(dev); +} + +int +rte_eth_ieee1588_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp) +{ + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + dev = &rte_eth_devices[port_id]; + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->ieee1588_read_rx_timestamp, + -ENOTSUP); + return (*dev->dev_ops->ieee1588_read_rx_timestamp)(dev, timestamp); +} + + +int +rte_eth_ieee1588_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp) +{ + struct rte_eth_dev *dev; + + if (!rte_eth_dev_is_valid_port(port_id)) { + PMD_DEBUG_TRACE("Invalid port_id=%d\n", port_id); + return -ENODEV; + } + + dev = &rte_eth_devices[port_id]; + + FUNC_PTR_OR_ERR_RET(*dev->dev_ops->ieee1588_read_tx_timestamp, + -ENOTSUP); + return (*dev->dev_ops->ieee1588_read_tx_timestamp)(dev, timestamp); +} + diff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h index 16dbe00..abe9b1c 100644 --- a/lib/librte_ether/rte_ethdev.h +++ b/lib/librte_ether/rte_ethdev.h @@ -1,7 +1,7 @@ /*- * BSD LICENSE * - * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. + * Copyright(c) 2010-2015 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -1220,6 +1220,7 @@ typedef int (*eth_mirror_rule_reset_t)(struct rte_eth_dev *dev, uint8_t rule_id); /**< @internal Remove a traffic mirroring rule on an Ethernet device */ + typedef int (*eth_udp_tunnel_add_t)(struct rte_eth_dev *dev, struct rte_eth_udp_tunnel *tunnel_udp); /**< @internal Add tunneling UDP info */ @@ -1228,6 +1229,20 @@ typedef int (*eth_udp_tunnel_del_t)(struct rte_eth_dev *dev, struct rte_eth_udp_tunnel *tunnel_udp); /**< @internal Delete tunneling UDP info */ +typedef int (*eth_ieee1588_enable_t)(struct rte_eth_dev *dev); +/**< @internal Function used to enable IEEE1588 PTP timestamping. */ + +typedef int (*eth_ieee1588_disable_t)(struct rte_eth_dev *dev); +/**< @internal Function used to disable IEEE1588 PTP timestamping. */ + +typedef int (*eth_ieee1588_read_rx_timestamp_t)(struct rte_eth_dev *dev, + struct timespec *timestamp); +/**< @internal Function used to read an RX IEEE1588 PTP timestamp. */ + +typedef int (*eth_ieee1588_read_tx_timestamp_t)(struct rte_eth_dev *dev, + struct timespec *timestamp); +/**< @internal Function used to read a TX IEEE1588 PTP timestamp. */ + #ifdef RTE_NIC_BYPASS @@ -1386,6 +1401,16 @@ struct eth_dev_ops { /** Get current RSS hash configuration. */ rss_hash_conf_get_t rss_hash_conf_get; eth_filter_ctrl_t filter_ctrl; /**< common filter control*/ + + /** Turn IEEE1588 timestamping on. */ + eth_ieee1588_enable_t ieee1588_enable; + /** Turn IEEE1588 timestamping off. */ + eth_ieee1588_disable_t ieee1588_disable; + /** Read the IEEE1588 RX timestamp. */ + eth_ieee1588_read_rx_timestamp_t ieee1588_read_rx_timestamp; + /** Read the IEEE1588 TX timestamp. */ + eth_ieee1588_read_tx_timestamp_t ieee1588_read_tx_timestamp; + }; /** @@ -3611,6 +3636,67 @@ int rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id, int rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id, struct rte_eth_rxtx_callback *user_cb); +/** + * Enable IEEE1588 timestamping for an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + * + * @return + * - 0: Success. + * - -ENODEV: The port ID is invalid. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_ieee1588_enable(uint8_t port_id); + +/** + * Disable IEEE1588 timestamping for an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + * + * @return + * - 0: Success. + * - -ENODEV: The port ID is invalid. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_ieee1588_disable(uint8_t port_id); + +/** + * Read an IEEE1588 RX timestamp from an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param timestamp + * Pointer to the timestamp struct. + * + * @return + * - 0: Success. + * - -EINVAL: No timestamp is available. + * - -ENODEV: The port ID is invalid. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_ieee1588_read_rx_timestamp(uint8_t port_id, + struct timespec *timestamp); + +/** + * Read an IEEE1588 TX timestamp from an Ethernet device. + * + * @param port_id + * The port identifier of the Ethernet device. + * @param timestamp + * Pointer to the timestamp struct. + * + * @return + * - 0: Success. + * - -EINVAL: No timestamp is available. + * - -ENODEV: The port ID is invalid. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +extern int rte_eth_ieee1588_read_tx_timestamp(uint8_t port_id, + struct timespec *timestamp); + + #ifdef __cplusplus } #endif diff --git a/lib/librte_ether/rte_ether_version.map b/lib/librte_ether/rte_ether_version.map index a2d25a6..9a0fe20 100644 --- a/lib/librte_ether/rte_ether_version.map +++ b/lib/librte_ether/rte_ether_version.map @@ -76,6 +76,10 @@ DPDK_2.0 { rte_eth_dev_wd_timeout_store; rte_eth_devices; rte_eth_driver_register; + rte_eth_ieee1588_disable; + rte_eth_ieee1588_enable; + rte_eth_ieee1588_read_rx_timestamp; + rte_eth_ieee1588_read_tx_timestamp; rte_eth_led_off; rte_eth_led_on; rte_eth_link;