From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 49B85919F for ; Fri, 16 Oct 2015 00:53:21 +0200 (CEST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP; 15 Oct 2015 15:53:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,687,1437462000"; d="scan'208";a="812130997" Received: from irsmsx107.ger.corp.intel.com ([163.33.3.99]) by fmsmga001.fm.intel.com with ESMTP; 15 Oct 2015 15:53:18 -0700 Received: from irsmsx105.ger.corp.intel.com ([169.254.7.75]) by IRSMSX107.ger.corp.intel.com ([169.254.10.49]) with mapi id 14.03.0248.002; Thu, 15 Oct 2015 23:53:18 +0100 From: "Ananyev, Konstantin" To: "Lu, Wenzhuo" Thread-Topic: [dpdk-dev] [PATCH 3/4] ixgbe: VF RSS hash query and update Thread-Index: AQHQ+cLF4Wmj2y0P+E67fOQ60dQDa55tQrxwgAACPQA= Date: Thu, 15 Oct 2015 22:53:17 +0000 Message-ID: <2601191342CEEE43887BDE71AB97725836AB0343@irsmsx105.ger.corp.intel.com> References: <1443426751-4906-1-git-send-email-wenzhuo.lu@intel.com> <1443426751-4906-4-git-send-email-wenzhuo.lu@intel.com> Accept-Language: en-IE, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [163.33.239.182] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Cc: "dev@dpdk.org" Subject: [dpdk-dev] FW: [PATCH 3/4] ixgbe: VF RSS hash query and update 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: , X-List-Received-Date: Thu, 15 Oct 2015 22:53:22 -0000 > -----Original Message----- > From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Wenzhuo Lu > Sent: Monday, September 28, 2015 8:53 AM > To: dev@dpdk.org > Subject: [dpdk-dev] [PATCH 3/4] ixgbe: VF RSS hash query and update >=20 > This patch implements the VF RSS hash query and update function on 10G > NICs. But the update function is only provided for x550. Because the > other NICs don't have the separate registers for VF, we don't want to > let a VF NIC change the shared RSS hash registers. It may cause PF and > other VF NICs' behavior change without being noticed. >=20 > Signed-off-by: Wenzhuo Lu > --- > drivers/net/ixgbe/ixgbe_ethdev.c | 2 + > drivers/net/ixgbe/ixgbe_ethdev.h | 6 +++ > drivers/net/ixgbe/ixgbe_rxtx.c | 95 ++++++++++++++++++++++++++++++++++= ++++++ > 3 files changed, 103 insertions(+) >=20 > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_e= thdev.c > index a1ef26f..5e50ee6 100644 > --- a/drivers/net/ixgbe/ixgbe_ethdev.c > +++ b/drivers/net/ixgbe/ixgbe_ethdev.c > @@ -497,6 +497,8 @@ static const struct eth_dev_ops ixgbevf_eth_dev_ops = =3D { > .mac_addr_set =3D ixgbevf_set_default_mac_addr, > .get_reg_length =3D ixgbevf_get_reg_length, > .get_reg =3D ixgbevf_get_regs, > + .rss_hash_update =3D ixgbevf_dev_rss_hash_update, > + .rss_hash_conf_get =3D ixgbevf_dev_rss_hash_conf_get, > }; >=20 > /* store statistics names and its offset in stats structure */ > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h b/drivers/net/ixgbe/ixgbe_e= thdev.h > index c3d4f4f..30952b6 100644 > --- a/drivers/net/ixgbe/ixgbe_ethdev.h > +++ b/drivers/net/ixgbe/ixgbe_ethdev.h > @@ -377,6 +377,12 @@ int ixgbe_dev_rss_hash_update(struct rte_eth_dev *de= v, > int ixgbe_dev_rss_hash_conf_get(struct rte_eth_dev *dev, > struct rte_eth_rss_conf *rss_conf); >=20 > +int ixgbevf_dev_rss_hash_update(struct rte_eth_dev *dev, > + struct rte_eth_rss_conf *rss_conf); > + > +int ixgbevf_dev_rss_hash_conf_get(struct rte_eth_dev *dev, > + struct rte_eth_rss_conf *rss_conf); > + > /* > * Flow director function prototypes > */ > diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxt= x.c > index 4a2d24a..5b64ece 100644 > --- a/drivers/net/ixgbe/ixgbe_rxtx.c > +++ b/drivers/net/ixgbe/ixgbe_rxtx.c > @@ -2895,6 +2895,101 @@ ixgbevf_hw_rss_hash_set_x550(struct ixgbe_hw *hw, > IXGBE_WRITE_REG(hw, IXGBE_VFMRQC, vfmrqc); > } >=20 > +int > +ixgbevf_dev_rss_hash_update(struct rte_eth_dev *dev, > + struct rte_eth_rss_conf *rss_conf) > +{ > + struct ixgbe_hw *hw =3D IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private)= ; > + uint32_t vfmrqc; > + uint64_t rss_hf; > + > + if (hw->mac.type !=3D ixgbe_mac_X550_vf && > + hw->mac.type !=3D ixgbe_mac_X550EM_x_vf) { > + PMD_DRV_LOG(ERR, "RSS hash update is not supported on this " > + "VF NIC."); > + return -ENOTSUP; > + } > + > + /* > + * There's hardware limitation: > + * "RSS enabling cannot be done dynamically while it must be > + * preceded by a software reset" > + * Before changing anything, first check that the update RSS operation > + * does not attempt to disable RSS, if RSS was enabled at > + * initialization time, or does not attempt to enable RSS, if RSS was > + * disabled at initialization time. > + */ > + rss_hf =3D rss_conf->rss_hf & IXGBE_RSS_OFFLOAD_ALL; > + vfmrqc =3D IXGBE_READ_REG(hw, IXGBE_VFMRQC); > + if (!(vfmrqc & IXGBE_MRQC_RSSEN)) { /* RSS disabled */ > + if (rss_hf !=3D 0) /* Enable RSS */ > + return -(EINVAL); > + return 0; /* Nothing to do */ > + } > + /* RSS enabled */ > + if (rss_hf =3D=3D 0) /* Disable RSS */ > + return -(EINVAL); > + ixgbevf_hw_rss_hash_set_x550(hw, rss_conf); > + return 0; > +} Same comment as before: this function is just copy & paste ixgbe_dev_rss_ha= sh_update(), the only difference is the HW register: VFMRQC vs MRQC. Pls unify - create a common static function that would be called by both ix= gbe_dev_rss_hash_update() and ixgbevf_dev_rss_hash_update(), or something.=20 > + > +int > +ixgbevf_dev_rss_hash_conf_get(struct rte_eth_dev *dev, > + struct rte_eth_rss_conf *rss_conf) > +{ > + struct ixgbe_hw *hw =3D IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private)= ; > + uint8_t *hash_key; > + uint32_t vfmrqc; > + uint32_t rss_key; > + uint64_t rss_hf; > + uint16_t i; > + > + if (hw->mac.type !=3D ixgbe_mac_X550_vf && > + hw->mac.type !=3D ixgbe_mac_X550EM_x_vf) { > + return ixgbe_dev_rss_hash_conf_get(dev, rss_conf); > + } > + > + hash_key =3D rss_conf->rss_key; > + if (hash_key !=3D NULL) { > + /* Return RSS hash key */ > + for (i =3D 0; i < 10; i++) { > + rss_key =3D IXGBE_READ_REG_ARRAY(hw, IXGBE_VFRSSRK(0), i); > + hash_key[(i * 4)] =3D rss_key & 0x000000FF; > + hash_key[(i * 4) + 1] =3D (rss_key >> 8) & 0x000000FF; > + hash_key[(i * 4) + 2] =3D (rss_key >> 16) & 0x000000FF; > + hash_key[(i * 4) + 3] =3D (rss_key >> 24) & 0x000000FF; > + } > + } > + > + /* Get RSS functions configured in VFMRQC register */ > + vfmrqc =3D IXGBE_READ_REG(hw, IXGBE_VFMRQC); > + if ((vfmrqc & IXGBE_MRQC_RSSEN) =3D=3D 0) { /* RSS is disabled */ > + rss_conf->rss_hf =3D 0; > + return 0; > + } > + rss_hf =3D 0; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV4) > + rss_hf |=3D ETH_RSS_IPV4; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV4_TCP) > + rss_hf |=3D ETH_RSS_NONFRAG_IPV4_TCP; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV6) > + rss_hf |=3D ETH_RSS_IPV6; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV6_EX) > + rss_hf |=3D ETH_RSS_IPV6_EX; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV6_TCP) > + rss_hf |=3D ETH_RSS_NONFRAG_IPV6_TCP; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV6_EX_TCP) > + rss_hf |=3D ETH_RSS_IPV6_TCP_EX; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV4_UDP) > + rss_hf |=3D ETH_RSS_NONFRAG_IPV4_UDP; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV6_UDP) > + rss_hf |=3D ETH_RSS_NONFRAG_IPV6_UDP; > + if (vfmrqc & IXGBE_MRQC_RSS_FIELD_IPV6_EX_UDP) > + rss_hf |=3D ETH_RSS_IPV6_UDP_EX; > + rss_conf->rss_hf =3D rss_hf; > + return 0; > +} Still the same: this is a clone of ixgbe_dev_rss_hash_conf_get() except the= HW regsiters names. No need to create another copy of identical copy. Pls unify. Konstantin > + > static void > ixgbevf_rss_configure_x550(struct rte_eth_dev *dev) > { > -- > 1.9.3