Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp3017477pxb; Fri, 12 Feb 2021 07:15:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJw13uVyHmfxac1DuBycTFefgWHPEN4ShGSeCiQNBECzKd5eNu+mjPdIFltMaOWex7OCS0yO X-Received: by 2002:a50:8b66:: with SMTP id l93mr3800055edl.384.1613142958683; Fri, 12 Feb 2021 07:15:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1613142958; cv=none; d=google.com; s=arc-20160816; b=ByXiP6GHj8YeoPoXf9SNJ4axZOOR5MoVTFVcYzsyMPSvrNC0fPOtrFWBZsznTX1zNB DB99b5m86+fHVyR0mYw/ioGI71K6AoMljbIwPeXZKaJqqfMPx9JXtsPVvbPerAReGpZz wV8T/K5ywNDN9I+c+1A1l9aCgkZxA73nlcrVTOO589irVWrpyaiMZMPCs6ItfibvlXxA tPan7hT7zC+1LIfteoBaxMKuZzO5TKWAofsQ7TzHhxdm8yRI02aNFDR+bihxNdWZBKq4 10gZ3Ft5tWelv1BIleBJLpGCe9R+t/e+vmdzXMlVq6gG32wjHI4f7iwf68V5z/PTgz/m 3pHg== 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=q8Bb5y6p4iMqQ3Yr9srjAH44nAIALRh1QiPB7YVyvC0=; b=ODP5lA0ZgzJd6qutZmp6fgElu+kWfqA1wJ3k7RpvsmzqpgpyO9SaU9KqUI/DEjuNtO qhXAeEc2f35l/lHCdwRK1yWJGM5sQZBANY4sqN09SeCtCb2qTJQHUR+KvU061KJ3Omil BD8EHamRr2uCT2Ofx9Fznlk6kcLUUlQhZ2pllz801zN6YDdC1n6/pWQR1xe24ZRzLtBw uXaCDV2DX257CwNAwmLkzv9MF1FGTxQWcUKPylDJYjrkw+Or8A95Q4vgMVWVjjKNfe1W 81jpMWcoxgPyARUYqZznCAKkGiyMqScRcz/DQ10Rl7PSx91yTz7QETGZsabie7s43dvm h87Q== 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 f16si6621480ejw.361.2021.02.12.07.15.35; Fri, 12 Feb 2021 07:15:58 -0800 (PST) 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 S230104AbhBLPNS (ORCPT + 99 others); Fri, 12 Feb 2021 10:13:18 -0500 Received: from relay11.mail.gandi.net ([217.70.178.231]:56225 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229812AbhBLPNP (ORCPT ); Fri, 12 Feb 2021 10:13:15 -0500 Received: from pc-2.home (apoitiers-259-1-26-122.w90-55.abo.wanadoo.fr [90.55.97.122]) (Authenticated sender: maxime.chevallier@bootlin.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id A80D5100011; Fri, 12 Feb 2021 15:12:32 +0000 (UTC) From: Maxime Chevallier To: davem@davemloft.net Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, gregory.clement@bootlin.com Subject: [PATCH net-next 2/2] net: mvneta: Implement mqprio support Date: Fri, 12 Feb 2021 16:12:20 +0100 Message-Id: <20210212151220.84106-3-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20210212151220.84106-1-maxime.chevallier@bootlin.com> References: <20210212151220.84106-1-maxime.chevallier@bootlin.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Implement a basic MQPrio support, inserting rules in RX that translate the TC to prio mapping into vlan prio to queues. The TX logic stays the same as when we don't offload the qdisc. Signed-off-by: Maxime Chevallier --- drivers/net/ethernet/marvell/mvneta.c | 65 +++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 8e410fafff8d..5389d195d4ce 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -102,6 +102,8 @@ #define MVNETA_TX_NO_DATA_SWAP BIT(5) #define MVNETA_DESC_SWAP BIT(6) #define MVNETA_TX_BRST_SZ_MASK(burst) ((burst) << 22) +#define MVNETA_VLAN_PRIO_TO_RXQ 0x2440 +#define MVNETA_VLAN_PRIO_RXQ_MAP(prio, rxq) ((rxq) << ((prio) * 3)) #define MVNETA_PORT_STATUS 0x2444 #define MVNETA_TX_IN_PRGRS BIT(1) #define MVNETA_TX_FIFO_EMPTY BIT(8) @@ -490,6 +492,7 @@ struct mvneta_port { u8 mcast_count[256]; u16 tx_ring_size; u16 rx_ring_size; + u8 prio_tc_map[8]; phy_interface_t phy_interface; struct device_node *dn; @@ -4922,6 +4925,67 @@ static int mvneta_ethtool_set_eee(struct net_device *dev, return phylink_ethtool_set_eee(pp->phylink, eee); } +static void mvneta_clear_rx_prio_map(struct mvneta_port *pp) +{ + mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, 0); +} + +static void mvneta_setup_rx_prio_map(struct mvneta_port *pp) +{ + int i; + u32 val = 0; + + for (i = 0; i < rxq_number; i++) + val |= MVNETA_VLAN_PRIO_RXQ_MAP(i, pp->prio_tc_map[i]); + + mvreg_write(pp, MVNETA_VLAN_PRIO_TO_RXQ, val); +} + +static int mvneta_setup_mqprio(struct net_device *dev, + struct tc_mqprio_qopt *qopt) +{ + struct mvneta_port *pp = netdev_priv(dev); + u8 num_tc; + int i; + + qopt->hw = TC_MQPRIO_HW_OFFLOAD_TCS; + num_tc = qopt->num_tc; + + if (num_tc > rxq_number) + return -EINVAL; + + if (!num_tc) { + mvneta_clear_rx_prio_map(pp); + netdev_reset_tc(dev); + return 0; + } + + if (qopt->prio_tc_map) { + memcpy(pp->prio_tc_map, qopt->prio_tc_map, + sizeof(pp->prio_tc_map)); + + mvneta_setup_rx_prio_map(pp); + + netdev_set_num_tc(dev, qopt->num_tc); + for (i = 0; i < qopt->num_tc; i++) + netdev_set_tc_queue(dev, i, qopt->count[i], + qopt->offset[i]); + } + + return 0; +} + +static int mvneta_setup_tc(struct net_device *dev, enum tc_setup_type type, + void *type_data) +{ + switch (type) { + case TC_SETUP_QDISC_MQPRIO: + return mvneta_setup_mqprio(dev, type_data); + default: + return -EOPNOTSUPP; + } +} + static const struct net_device_ops mvneta_netdev_ops = { .ndo_open = mvneta_open, .ndo_stop = mvneta_stop, @@ -4934,6 +4998,7 @@ static const struct net_device_ops mvneta_netdev_ops = { .ndo_do_ioctl = mvneta_ioctl, .ndo_bpf = mvneta_xdp, .ndo_xdp_xmit = mvneta_xdp_xmit, + .ndo_setup_tc = mvneta_setup_tc, }; static const struct ethtool_ops mvneta_eth_tool_ops = { -- 2.25.4