Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp184986pxb; Wed, 3 Nov 2021 02:21:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwWViRJAcFNmLJwKgAbegmwCiYgHFj4WtouurBHOf03kEeyP2cCxFa9MQtZeOJdxIys0IXa X-Received: by 2002:a05:6e02:b4f:: with SMTP id f15mr2135772ilu.7.1635931312482; Wed, 03 Nov 2021 02:21:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635931312; cv=none; d=google.com; s=arc-20160816; b=FVg+GOomVcX5u94Qdi3b7Xyc+RNJIoo7yAR+bNK68IB9/S70wlKOQjFRto4gdUJ3nN xPY4aABMXJ2GUi1sTRXp+CTqUy44NAKAGOGtj9+GtUqr4lmu5aePPipze/EauhLzArUP eBHLOeisUbADS3rvgoqsjZS75ImVC06bhXVeGpR2S10x3hJY7ZP9YpR4eVBkm+OVJI2Q nChQwYouAH9qr0ty+/fSKdLlqye8BpBTnIwnx6Jk980nO+GMzdoosKvAmKg9IdaRG/k9 045jybqvhTs8a4YnhNJ9aDYaK3Uq3spoQ/GwGrovG7Qm92/jgM3QFKEdkvjuXKtYpDB7 NlTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=0Z+/1uXZd/1tzzbDK8D30FFLEgrH186cztMi0Lbo8UQ=; b=0C0pjvrTixHosHobafgCBdgeXMXc071U92UuX4zy5NhqMsOhduwHsTXxrNIjTge4NR 7wNIzphsWzq4bkdXWNalkNQ1qxszfsaqVm4ITKQi0QhpXwsh9ct5SBPf30MsP4P1n0JN pMha2uoJ8RyEeh+WtMF6pHsa/ZvxL1cEQPMPFMjau2JP7SJX9Ipn7//v2w8dw+WvO+s3 kUpicXxsOVz8+CWGnuOQRl7t6BGEllGL4x90VitGG2EzlyGouZt3l97wySmse4s7OWK1 cTUnvoPArg0gljjyPEavi+uxByZZytKU7CDPiZywlA0zv6u8oVh9am19j8yjdFWphOfA P/Dg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id d4si1150123ilq.50.2021.11.03.02.21.40; Wed, 03 Nov 2021 02:21:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232149AbhKCJXQ (ORCPT + 99 others); Wed, 3 Nov 2021 05:23:16 -0400 Received: from relay11.mail.gandi.net ([217.70.178.231]:49427 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231721AbhKCJXG (ORCPT ); Wed, 3 Nov 2021 05:23:06 -0400 Received: (Authenticated sender: clement.leger@bootlin.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 8DCCD10000A; Wed, 3 Nov 2021 09:20:28 +0000 (UTC) From: =?UTF-8?q?Cl=C3=A9ment=20L=C3=A9ger?= To: "David S. Miller" , Jakub Kicinski , Rob Herring , Vladimir Oltean , Claudiu Manoil , Alexandre Belloni , UNGLinuxDriver@microchip.com, Andrew Lunn Cc: =?UTF-8?q?Cl=C3=A9ment=20L=C3=A9ger?= , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Thomas Petazzoni Subject: [PATCH v2 3/6] net: ocelot: pre-compute injection frame header content Date: Wed, 3 Nov 2021 10:19:40 +0100 Message-Id: <20211103091943.3878621-4-clement.leger@bootlin.com> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20211103091943.3878621-1-clement.leger@bootlin.com> References: <20211103091943.3878621-1-clement.leger@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org IFH preparation can take quite some time on slow processors (up to 5% in a iperf3 test for instance). In order to reduce the cost of this preparation, pre-compute IFH since most of the parameters are fixed per port. Only rew_op and vlan tag will be set when sending if different than 0. This allows to remove entirely the calls to packing() with basic usage. In the same time, export this function that will be used by FDMA. Signed-off-by: Clément Léger --- drivers/net/ethernet/mscc/ocelot.c | 23 ++++++++++++++++++----- include/soc/mscc/ocelot.h | 5 +++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c index e6c18b598d5c..97693772595b 100644 --- a/drivers/net/ethernet/mscc/ocelot.c +++ b/drivers/net/ethernet/mscc/ocelot.c @@ -1076,20 +1076,29 @@ bool ocelot_can_inject(struct ocelot *ocelot, int grp) } EXPORT_SYMBOL(ocelot_can_inject); +void ocelot_ifh_port_set(void *ifh, struct ocelot_port *port, u32 rew_op, + u32 vlan_tag) +{ + memcpy(ifh, port->ifh, OCELOT_TAG_LEN); + + if (vlan_tag) + ocelot_ifh_set_vlan_tci(ifh, vlan_tag); + if (rew_op) + ocelot_ifh_set_rew_op(ifh, rew_op); +} +EXPORT_SYMBOL(ocelot_ifh_port_set); + void ocelot_port_inject_frame(struct ocelot *ocelot, int port, int grp, u32 rew_op, struct sk_buff *skb) { + struct ocelot_port *port_s = ocelot->ports[port]; u32 ifh[OCELOT_TAG_LEN / 4] = {0}; unsigned int i, count, last; ocelot_write_rix(ocelot, QS_INJ_CTRL_GAP_SIZE(1) | QS_INJ_CTRL_SOF, QS_INJ_CTRL, grp); - ocelot_ifh_set_bypass(ifh, 1); - ocelot_ifh_set_dest(ifh, BIT_ULL(port)); - ocelot_ifh_set_tag_type(ifh, IFH_TAG_TYPE_C); - ocelot_ifh_set_vlan_tci(ifh, skb_vlan_tag_get(skb)); - ocelot_ifh_set_rew_op(ifh, rew_op); + ocelot_ifh_port_set(ifh, port_s, rew_op, skb_vlan_tag_get(skb)); for (i = 0; i < OCELOT_TAG_LEN / 4; i++) ocelot_write_rix(ocelot, ifh[i], QS_INJ_WR, grp); @@ -2128,6 +2137,10 @@ void ocelot_init_port(struct ocelot *ocelot, int port) skb_queue_head_init(&ocelot_port->tx_skbs); + ocelot_ifh_set_bypass(ocelot_port->ifh, 1); + ocelot_ifh_set_dest(ocelot_port->ifh, BIT_ULL(port)); + ocelot_ifh_set_tag_type(ocelot_port->ifh, IFH_TAG_TYPE_C); + /* Basic L2 initialization */ /* Set MAC IFG Gaps diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h index fef3a36b0210..b3381c90ff3e 100644 --- a/include/soc/mscc/ocelot.h +++ b/include/soc/mscc/ocelot.h @@ -6,6 +6,7 @@ #define _SOC_MSCC_OCELOT_H #include +#include #include #include #include @@ -623,6 +624,8 @@ struct ocelot_port { struct net_device *bridge; u8 stp_state; + + u8 ifh[OCELOT_TAG_LEN]; }; struct ocelot { @@ -754,6 +757,8 @@ void __ocelot_target_write_ix(struct ocelot *ocelot, enum ocelot_target target, bool ocelot_can_inject(struct ocelot *ocelot, int grp); void ocelot_port_inject_frame(struct ocelot *ocelot, int port, int grp, u32 rew_op, struct sk_buff *skb); +void ocelot_ifh_port_set(void *ifh, struct ocelot_port *port, u32 rew_op, + u32 vlan_tag); int ocelot_xtr_poll_frame(struct ocelot *ocelot, int grp, struct sk_buff **skb); void ocelot_drain_cpu_queue(struct ocelot *ocelot, int grp); -- 2.33.0