From patchwork Sat Jul 27 20:41:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Harman Kalra X-Patchwork-Id: 57209 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CC8031C0D8; Sat, 27 Jul 2019 22:41:20 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 987051C0B8 for ; Sat, 27 Jul 2019 22:41:18 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id x6RKfC8R014305 for ; Sat, 27 Jul 2019 13:41:17 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : references : in-reply-to : content-type : content-transfer-encoding : mime-version; s=pfpt0818; bh=k7bbJgddnpmKmDB1KSRSGEFfJ6RwGtjswC55uXIibGo=; b=h1/Rb/AuRJ8poVrN/mUV9q5Ow1isSq2kGJId1irDLspYWp+1eiMhoMca+eSMrw3evfte bVAfYp3XM02BelsD25c5zywjNbHQRGNI/gIbzpHbkBvVn1grb5oUV9Qhi2JtqL7NWKcW Eml8C7ZX8h4IJTQS3G/ixxzTAuHbbhdBcbGM9ORfUZsP8RiujuLwJZqWujCvkRPUXIQJ EcyZ5I5s0+kju4dV63nshrOGm2NSslDOF4ZYBDJ81twIs7EuataGNMHNr1b3g92rRZlD L1RHQnRyLc6wWb7WMlvF535Xee3oqJj9oFAymVXC3BrdAkZiDIy23u6JWHUmHlmYBTd+ Hw== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 2u0kypst45-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT) for ; Sat, 27 Jul 2019 13:41:17 -0700 Received: from SC-EXCH02.marvell.com (10.93.176.82) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1367.3; Sat, 27 Jul 2019 13:41:16 -0700 Received: from NAM02-BL2-obe.outbound.protection.outlook.com (104.47.38.52) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1367.3 via Frontend Transport; Sat, 27 Jul 2019 13:41:16 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=YLqYIxq0n8qNpmvgJWQ7FXzNV4FfRw961yOFU+6TyE4EyIJmXXHD/6LxILXAe4m+GuIQ4bqrYsHLrEfdcBI85xHj8QVUNUV0F1/6WIC/mUTVluqb+jaocXtZJy/92evcimDb3LsmayMSxYN4gg+bH4GS04oKR/5A3feL7D0tDLGqahgFZ11NIf51mXs5wEkEQHvq1/XzYZ0P00NOiraL2tL8+f+w2D5S9NZnyTv4MaBqKPIVd3D6ffODrajCblFblKRI4bvferqz4WgCOHeGbWyCoTLcYUE5BrAm6MzN0bBw9jgY5mZ6Ujgtpno7MpvA/mW7Lk0zDmPChpDQmbowKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=k7bbJgddnpmKmDB1KSRSGEFfJ6RwGtjswC55uXIibGo=; b=My2o4UKhx8K9u15jdFeT6ShsxCoZNKNBsOJs65hCy4YSKjKJQpbt90Sl+5Q5UAKTjNkUD93wI/d4q/Fnkjg83YGzihxRuSxhBo0cPq+pPTO7pkNbDnPP2xCcuoS83KDb7lodct0rN1H3w3KqYeZpoiH9EX9TbpYTWthH7XXsnb3BDYTxNjFP/O0laxvFu6qIVY0JoIOpVWdE1cmtI73+jVwt28cu0TG1Z9OeCwvVicQroYtsKFrPjjgehkHcqdRvU8+3PnFZsQxKAjUk1JxClaU3tidJ6blMQ6/wUQv+wEWUjZf//foHx7vlbNYg7KBoL0OdcccyAZgvpwJe2Wgzzg== ARC-Authentication-Results: i=1; mx.microsoft.com 1;spf=pass smtp.mailfrom=marvell.com;dmarc=pass action=none header.from=marvell.com;dkim=pass header.d=marvell.com;arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.onmicrosoft.com; s=selector2-marvell-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=k7bbJgddnpmKmDB1KSRSGEFfJ6RwGtjswC55uXIibGo=; b=tQcnwr/gEXWtNMqiFJzO5MgNN4tttZtl+4Epu1jVx47m2KBCIYkZrtGEtyUW0fUrHbFZjycu0RKmombYjHmg5bz93dtf23LSp9hV4+tg8fQH0Hg5SoJuxXekduugZ0USBvY9RtvuPNJ2Lr0ZpynlU54cpHbYHYgbcIHYv8gs/80= Received: from MN2PR18MB2848.namprd18.prod.outlook.com (20.179.21.149) by MN2PR18MB2623.namprd18.prod.outlook.com (20.179.82.145) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2115.15; Sat, 27 Jul 2019 20:41:14 +0000 Received: from MN2PR18MB2848.namprd18.prod.outlook.com ([fe80::4447:9459:5386:2e18]) by MN2PR18MB2848.namprd18.prod.outlook.com ([fe80::4447:9459:5386:2e18%7]) with mapi id 15.20.2115.005; Sat, 27 Jul 2019 20:41:14 +0000 From: Harman Kalra To: Jerin Jacob Kollanukkaran , Nithin Kumar Dabilpuram , Vamsi Krishna Attunuru , Kiran Kumar Kokkilagadda CC: "dev@dpdk.org" , Harman Kalra Thread-Topic: [PATCH v2 2/2] net/octeontx2: support read clock API Thread-Index: AQHVRLuirLymq7GY+Uai8T7UgVsbKA== Date: Sat, 27 Jul 2019 20:41:14 +0000 Message-ID: <1564260052-28926-2-git-send-email-hkalra@marvell.com> References: <1564260052-28926-1-git-send-email-hkalra@marvell.com> In-Reply-To: <1564260052-28926-1-git-send-email-hkalra@marvell.com> Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: PN1PR0101CA0063.INDPRD01.PROD.OUTLOOK.COM (2603:1096:c00:d::25) To MN2PR18MB2848.namprd18.prod.outlook.com (2603:10b6:208:3e::21) x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.7.4 x-originating-ip: [115.113.156.2] x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 072937dd-d762-4d43-eb81-08d712d2c44d x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(8990200)(5600148)(711020)(4605104)(1401327)(2017052603328)(7193020); SRVR:MN2PR18MB2623; x-ms-traffictypediagnostic: MN2PR18MB2623: x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:1443; x-forefront-prvs: 01110342A5 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(4636009)(366004)(396003)(376002)(39830400003)(346002)(136003)(199004)(189003)(3846002)(6116002)(2906002)(107886003)(25786009)(4326008)(8676002)(81156014)(81166006)(8936002)(66066001)(50226002)(14454004)(7736002)(478600001)(102836004)(110136005)(54906003)(26005)(305945005)(6512007)(68736007)(71190400001)(71200400001)(86362001)(66446008)(64756008)(66946007)(66556008)(66476007)(316002)(5660300002)(186003)(55236004)(2616005)(53936002)(6636002)(11346002)(446003)(36756003)(76176011)(52116002)(476003)(6486002)(486006)(14444005)(256004)(6436002)(386003)(6506007)(99286004); DIR:OUT; SFP:1101; SCL:1; SRVR:MN2PR18MB2623; H:MN2PR18MB2848.namprd18.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: marvell.com does not designate permitted sender hosts) x-ms-exchange-senderadcheck: 1 x-microsoft-antispam-message-info: XJAgdofy4ScgfeN7AAzm+l90uGTbPKS8gwED7WcgkF4X+Gv7ntcJkloWp+E5cmFoQuIFy7JNKrP0yZ0NjSl7IV4OnWoS1OcUY6oY2OQiCfNOu8tAgH05RyJcj3aRVJm6yR5WB9FyWwZqPO8kdnG4RHYfcJiJu6s9vlxqy78zzcNHXJJZa5L1dtKu7Q5d/+4t/bRAM7qkI3DMZg1W3pN5qzDokz4fPA3s9/jnUMVemvtHVE/pXVOOkzgobw0CjmTvX7mLImexENVdUdQ013UZnTzfcSZ9Y3ID/57VXiZBcgTaq7GfXxpe7X239VVc+KyG/f8KXW7qo++WeORTjQrIhEbs48jox78lGWMaFRD4L2jo9CnjKLFcTNH+J3ukRjdwsMhSE52ExdlLoD8O4KmbI1N1E96uP28hp+aAUpA63sA= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-Network-Message-Id: 072937dd-d762-4d43-eb81-08d712d2c44d X-MS-Exchange-CrossTenant-originalarrivaltime: 27 Jul 2019 20:41:14.6045 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 70e1fb47-1155-421d-87fc-2e58f638b6e0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: hkalra@marvell.com X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR18MB2623 X-OriginatorOrg: marvell.com X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:5.22.84,1.0.8 definitions=2019-07-27_15:2019-07-26,2019-07-27 signatures=0 Subject: [dpdk-dev] [PATCH v2 2/2] net/octeontx2: support read clock API X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This patch implements read clock api whose purpose is to return raw clock ticks. Using this API real time ticks spent in processing a packet can be known: - mbuf->timestamp Calling mbox for reading raw clock ticks in fastpath is very expensive so its value is derived from time stamp counter(tsc) using freq multipler (ratio of raw clock ticks and tsc) and clock delta (by how much tsc is lagging from raw clock value). Signed-off-by: Harman Kalra --- V2: * More detailed commit message * changed rdtsc to tsc (timestamp counter) * Initialized a variable to zero only when needed * changed done label to fail drivers/common/octeontx2/otx2_mbox.h | 2 + drivers/net/octeontx2/otx2_ethdev.c | 89 ++++++++++++++++++++++++++++ drivers/net/octeontx2/otx2_ethdev.h | 4 ++ drivers/net/octeontx2/otx2_ptp.c | 30 ++++++++++ 4 files changed, 125 insertions(+) diff --git a/drivers/common/octeontx2/otx2_mbox.h b/drivers/common/octeontx2/otx2_mbox.h index c0bb676b2..b2c59c86e 100644 --- a/drivers/common/octeontx2/otx2_mbox.h +++ b/drivers/common/octeontx2/otx2_mbox.h @@ -1354,11 +1354,13 @@ struct ptp_req { struct mbox_msghdr hdr; uint8_t __otx2_io op; int64_t __otx2_io scaled_ppm; + uint8_t __otx2_io is_pmu; }; struct ptp_rsp { struct mbox_msghdr hdr; uint64_t __otx2_io clk; + uint64_t __otx2_io tsc; }; struct get_hw_cap_rsp { diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c index 595c8003a..ddbce945d 100644 --- a/drivers/net/octeontx2/otx2_ethdev.c +++ b/drivers/net/octeontx2/otx2_ethdev.c @@ -521,6 +521,19 @@ otx2_nix_rx_queue_setup(struct rte_eth_dev *eth_dev, uint16_t rq, eth_dev->data->rx_queues[rq] = rxq; eth_dev->data->rx_queue_state[rq] = RTE_ETH_QUEUE_STATE_STOPPED; + + /* Calculating delta and freq mult between PTP HI clock and tsc. + * These are needed for deriving PTP HI clock value from tsc counter. + */ + if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP) || + otx2_ethdev_is_ptp_en(dev)) { + rc = otx2_nix_raw_clock_tsc_conv(dev); + if (rc) { + otx2_err("Failed to calculate delta and freq mult"); + goto fail; + } + } + return 0; free_rxq: @@ -1186,6 +1199,81 @@ nix_set_nop_rxtx_function(struct rte_eth_dev *eth_dev) rte_mb(); } +static int +nix_read_raw_clock(struct otx2_eth_dev *dev, uint64_t *clock, uint64_t *tsc, + uint8_t is_pmu) +{ + struct otx2_mbox *mbox = dev->mbox; + struct ptp_req *req; + struct ptp_rsp *rsp; + int rc; + + req = otx2_mbox_alloc_msg_ptp_op(mbox); + req->op = PTP_OP_GET_CLOCK; + req->is_pmu = is_pmu; + rc = otx2_mbox_process_msg(mbox, (void *)&rsp); + if (rc) + goto fail; + + if (clock) + *clock = rsp->clk; + if (tsc) + *tsc = rsp->tsc; + +fail: + return rc; +} + +/* This function calculates two parameters "clk_freq_mult" and + * "clk_delta" which is useful in deriving PTP HI clock from + * timestamp counter (tsc) value. + */ +int +otx2_nix_raw_clock_tsc_conv(struct otx2_eth_dev *dev) +{ + uint64_t ticks_base = 0, ticks = 0, tsc = 0, t_freq; + int rc, val; + + /* Calculating the frequency at which PTP HI clock is running */ + rc = nix_read_raw_clock(dev, &ticks_base, &tsc, false); + if (rc) { + otx2_err("Failed to read the raw clock value: %d", rc); + goto fail; + } + + rte_delay_ms(100); + + rc = nix_read_raw_clock(dev, &ticks, &tsc, false); + if (rc) { + otx2_err("Failed to read the raw clock value: %d", rc); + goto fail; + } + + t_freq = (ticks - ticks_base) * 10; + + /* Calculating the freq multiplier viz the ratio between the + * frequency at which PTP HI clock works and tsc clock runs + */ + dev->clk_freq_mult = + (double)pow(10, floor(log10(t_freq))) / rte_get_timer_hz(); + + val = false; +#ifdef RTE_ARM_EAL_RDTSC_USE_PMU + val = true; +#endif + rc = nix_read_raw_clock(dev, &ticks, &tsc, val); + if (rc) { + otx2_err("Failed to read the raw clock value: %d", rc); + goto fail; + } + + /* Calculating delta between PTP HI clock and tsc */ + dev->clk_delta = ((uint64_t)(ticks / dev->clk_freq_mult) - tsc); + +fail: + return rc; +} + static int otx2_nix_configure(struct rte_eth_dev *eth_dev) { @@ -1649,6 +1737,7 @@ static const struct eth_dev_ops otx2_eth_dev_ops = { .vlan_pvid_set = otx2_nix_vlan_pvid_set, .rx_queue_intr_enable = otx2_nix_rx_queue_intr_enable, .rx_queue_intr_disable = otx2_nix_rx_queue_intr_disable, + .read_clock = otx2_nix_read_clock, }; static inline int diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h index 863d4877f..ef2ff762d 100644 --- a/drivers/net/octeontx2/otx2_ethdev.h +++ b/drivers/net/octeontx2/otx2_ethdev.h @@ -300,6 +300,8 @@ struct otx2_eth_dev { struct rte_timecounter systime_tc; struct rte_timecounter rx_tstamp_tc; struct rte_timecounter tx_tstamp_tc; + double clk_freq_mult; + uint64_t clk_delta; } __rte_cache_aligned; struct otx2_eth_txq { @@ -527,5 +529,7 @@ int otx2_nix_timesync_write_time(struct rte_eth_dev *eth_dev, int otx2_nix_timesync_read_time(struct rte_eth_dev *eth_dev, struct timespec *ts); int otx2_eth_dev_ptp_info_update(struct otx2_dev *dev, bool ptp_en); +int otx2_nix_read_clock(struct rte_eth_dev *eth_dev, uint64_t *time); +int otx2_nix_raw_clock_tsc_conv(struct otx2_eth_dev *dev); #endif /* __OTX2_ETHDEV_H__ */ diff --git a/drivers/net/octeontx2/otx2_ptp.c b/drivers/net/octeontx2/otx2_ptp.c index 0186c629a..7b24c6644 100644 --- a/drivers/net/octeontx2/otx2_ptp.c +++ b/drivers/net/octeontx2/otx2_ptp.c @@ -224,6 +224,13 @@ otx2_nix_timesync_adjust_time(struct rte_eth_dev *eth_dev, int64_t delta) rc = otx2_mbox_process_msg(mbox, (void *)&rsp); if (rc) return rc; + /* Since the frequency of PTP comp register is tuned, delta and + * freq mult calculation for deriving PTP_HI from timestamp + * counter should be done again. + */ + rc = otx2_nix_raw_clock_tsc_conv(dev); + if (rc) + otx2_err("Failed to calculate delta and freq mult"); } dev->systime_tc.nsec += delta; dev->rx_tstamp_tc.nsec += delta; @@ -271,3 +278,26 @@ otx2_nix_timesync_read_time(struct rte_eth_dev *eth_dev, struct timespec *ts) return 0; } + + +int +otx2_nix_read_clock(struct rte_eth_dev *eth_dev, uint64_t *clock) +{ + struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev); + + if (!otx2_ethdev_is_ptp_en(dev)) { + otx2_err("PTP should be enabled."); + return -EINVAL; + } + + /* This API returns the raw PTP HI clock value. Since LFs doesn't + * have direct access to PTP registers and it requires mbox msg + * to AF for this value. In fastpath reading this value for every + * packet (which involes mbox call) becomes very expensive, hence + * we should be able to derive PTP HI clock value from tsc by + * using freq_mult and clk_delta calculated during configure stage. + */ + *clock = (rte_get_tsc_cycles() + dev->clk_delta) * dev->clk_freq_mult; + + return 0; +}