From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michal Swiatkowski Date: Tue, 22 Jun 2021 23:41:40 -0400 Subject: [Intel-wired-lan] [PATCH net-next v2 01/12] ice: basic support for eswitch mode management In-Reply-To: References: <20210622212134.341728-1-michal.swiatkowski@linux.intel.com> <20210622212134.341728-2-michal.swiatkowski@linux.intel.com> Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: intel-wired-lan@osuosl.org List-ID: On Wed, Jun 23, 2021 at 07:58:00AM +0200, Paul Menzel wrote: > Dear Michal, dear Grzegorz, > > > Am 22.06.21 um 23:21 schrieb Michal Swiatkowski: > > Write set and get eswitch mode functions used by devlink > > Commit 08f4b5918b2 (net/devlink: Add E-Switch mode control) spells it > E-Switch mode. > > To make the commit summary a statement, maybe use: > > > ice: Support basic E-Switch mode control > Sure, thanks > > ops. Use new pf struct member eswitch_mode to track current > > eswitch mode in driver. > > > > Changing eswitch mode is only allowed when there are no > > VFs created. > > > > Create new file for eswitch related code. > > > > Add config flag ICE_SWITCHDEV to allow user to choose if > > switchdev support should be enabled or disabled. > > > > Use case examples: > > - show current eswitch mode ('legacy' is the default one) > > [root at localhost]# devlink dev eswitch show pci/0000:03:00.1 > > > pci/0000:03:00.1: mode legacy > > At least Mozilla Thunderbird displays this as a quote. Is your `devlink` > command really prepending a >? > No, good catch, I will remove this > > > - move to 'switchdev' mode > > [root at localhost]# devlink dev eswitch set pci/0000:03:00.1 mode > > switchdev > > [root at localhost]# devlink dev eswitch show pci/0000:03:00.1 > > > pci/0000:03:00.1: mode switchdev > > > > - create 2 VFs > > [root at localhost]# echo 2 > /sys/class/net/ens4f1/device/sriov_numvfs > > > > - unsuccessful attempt to change eswitch mode while VFs are created > > [root at localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy > > > devlink answers: Operation not supported > > > > - destroy VFs > > [root at localhost]# echo 0 > /sys/class/net/ens4f1/device/sriov_numvfs > > > > - restore 'legacy' mode > > [root at localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy > > [root at localhost]# devlink dev eswitch show pci/0000:03:00.1 > > > pci/0000:03:00.1: mode legacy > > Thank you for adding these examples to the commit message. I?d put some of > them into the Kconfig description of `ICE_SWITCHDEV`. > > > Kind regards, > > Paul > > You mean putting this devlink command to help section of Kconfig? Something like: To go to E-switch mode type: devlink dev eswitch set pci/0000:03:00.1 mode switchdev Is this right place for this kind of information? I have seen that Mellanox doesn't have command example in Kconfig for switchdev. Thanks for reviweing this. Best regards, Michal > > Co-developed-by: Grzegorz Nitka > > Signed-off-by: Grzegorz Nitka > > Signed-off-by: Michal Swiatkowski > > --- > > drivers/net/ethernet/intel/Kconfig | 10 ++++ > > drivers/net/ethernet/intel/ice/Makefile | 1 + > > drivers/net/ethernet/intel/ice/ice.h | 1 + > > drivers/net/ethernet/intel/ice/ice_devlink.c | 3 + > > drivers/net/ethernet/intel/ice/ice_eswitch.c | 62 ++++++++++++++++++++ > > drivers/net/ethernet/intel/ice/ice_eswitch.h | 34 +++++++++++ > > 6 files changed, 111 insertions(+) > > create mode 100644 drivers/net/ethernet/intel/ice/ice_eswitch.c > > create mode 100644 drivers/net/ethernet/intel/ice/ice_eswitch.h > > > > diff --git a/drivers/net/ethernet/intel/Kconfig b/drivers/net/ethernet/intel/Kconfig > > index 3639cf79cfae..4da8b3930f6e 100644 > > --- a/drivers/net/ethernet/intel/Kconfig > > +++ b/drivers/net/ethernet/intel/Kconfig > > @@ -313,6 +313,16 @@ config ICE > > To compile this driver as a module, choose M here. The module > > will be called ice. > > +config ICE_SWITCHDEV > > + bool "Switchdev Support" > > + default y > > + depends on ICE && NET_SWITCHDEV > > + help > > + Say Y here if you want to use Switchdev in the > > + driver. > > + > > + If unsure, say N. > > + > > config FM10K > > tristate "Intel(R) FM10000 Ethernet Switch Host Interface Support" > > default n > > diff --git a/drivers/net/ethernet/intel/ice/Makefile b/drivers/net/ethernet/intel/ice/Makefile > > index 4f538cdf42c1..0545594c80ba 100644 > > --- a/drivers/net/ethernet/intel/ice/Makefile > > +++ b/drivers/net/ethernet/intel/ice/Makefile > > @@ -33,3 +33,4 @@ ice-$(CONFIG_PTP_1588_CLOCK) += ice_ptp.o ice_ptp_hw.o > > ice-$(CONFIG_DCB) += ice_dcb.o ice_dcb_nl.o ice_dcb_lib.o > > ice-$(CONFIG_RFS_ACCEL) += ice_arfs.o > > ice-$(CONFIG_XDP_SOCKETS) += ice_xsk.o > > +ice-$(CONFIG_ICE_SWITCHDEV) += ice_eswitch.o > > diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h > > index f4729caccbe9..729d375fbebc 100644 > > --- a/drivers/net/ethernet/intel/ice/ice.h > > +++ b/drivers/net/ethernet/intel/ice/ice.h > > @@ -430,6 +430,7 @@ struct ice_pf { > > struct ice_vsi **vsi; /* VSIs created by the driver */ > > struct ice_sw *first_sw; /* first switch created by firmware */ > > + u16 eswitch_mode; /* current mode of eswitch */ > > /* Virtchnl/SR-IOV config info */ > > struct ice_vf *vf; > > u16 num_alloc_vfs; /* actual number of VFs allocated */ > > diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c > > index d69507d57de1..de6d0a8ba1a8 100644 > > --- a/drivers/net/ethernet/intel/ice/ice_devlink.c > > +++ b/drivers/net/ethernet/intel/ice/ice_devlink.c > > @@ -4,6 +4,7 @@ > > #include "ice.h" > > #include "ice_lib.h" > > #include "ice_devlink.h" > > +#include "ice_eswitch.h" > > #include "ice_fw_update.h" > > /* context for devlink info version reporting */ > > @@ -423,6 +424,8 @@ ice_devlink_flash_update(struct devlink *devlink, > > static const struct devlink_ops ice_devlink_ops = { > > .supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK, > > + .eswitch_mode_get = ice_eswitch_mode_get, > > + .eswitch_mode_set = ice_eswitch_mode_set, > > .info_get = ice_devlink_info_get, > > .flash_update = ice_devlink_flash_update, > > }; > > diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.c b/drivers/net/ethernet/intel/ice/ice_eswitch.c > > new file mode 100644 > > index 000000000000..1370c41b77ab > > --- /dev/null > > +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.c > > @@ -0,0 +1,62 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* Copyright (C) 2019-2021, Intel Corporation. */ > > + > > +#include "ice.h" > > +#include "ice_eswitch.h" > > +#include "ice_devlink.h" > > + > > +/** > > + * ice_eswitch_mode_set - set new eswitch mode > > + * @devlink: pointer to devlink structure > > + * @mode: eswitch mode to switch to > > + * @extack: pointer to extack structure > > + */ > > +int > > +ice_eswitch_mode_set(struct devlink *devlink, u16 mode, > > + struct netlink_ext_ack *extack) > > +{ > > + struct ice_pf *pf = devlink_priv(devlink); > > + > > + if (pf->eswitch_mode == mode) > > + return 0; > > + > > + if (pf->num_alloc_vfs) { > > + dev_info(ice_pf_to_dev(pf), "Changing eswitch mode is allowed only if there is no VFs created"); > > + NL_SET_ERR_MSG_MOD(extack, "Changing eswitch mode is allowed only if there is no VFs created"); > > + return -EOPNOTSUPP; > > + } > > + > > + switch (mode) { > > + case DEVLINK_ESWITCH_MODE_LEGACY: > > + dev_info(ice_pf_to_dev(pf), "PF %d changed eswitch mode to legacy", > > + pf->hw.pf_id); > > + NL_SET_ERR_MSG_MOD(extack, "Changed eswitch mode to legacy"); > > + break; > > + case DEVLINK_ESWITCH_MODE_SWITCHDEV: > > + { > > + dev_info(ice_pf_to_dev(pf), "PF %d changed eswitch mode to switchdev", > > + pf->hw.pf_id); > > + NL_SET_ERR_MSG_MOD(extack, "Changed eswitch mode to switchdev"); > > + break; > > + } > > + default: > > + NL_SET_ERR_MSG_MOD(extack, "Unknown eswitch mode"); > > + return -EINVAL; > > + } > > + > > + pf->eswitch_mode = mode; > > + return 0; > > +} > > + > > +/** > > + * ice_eswitch_mode_get - get current eswitch mode > > + * @devlink: pointer to devlink structure > > + * @mode: output parameter for current eswitch mode > > + */ > > +int ice_eswitch_mode_get(struct devlink *devlink, u16 *mode) > > +{ > > + struct ice_pf *pf = devlink_priv(devlink); > > + > > + *mode = pf->eswitch_mode; > > + return 0; > > +} > > diff --git a/drivers/net/ethernet/intel/ice/ice_eswitch.h b/drivers/net/ethernet/intel/ice/ice_eswitch.h > > new file mode 100644 > > index 000000000000..0aa6fb7e0c4e > > --- /dev/null > > +++ b/drivers/net/ethernet/intel/ice/ice_eswitch.h > > @@ -0,0 +1,34 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* Copyright (C) 2019-2021, Intel Corporation. */ > > + > > +#ifndef _ICE_ESWITCH_H_ > > +#define _ICE_ESWITCH_H_ > > +#include > > + > > +#ifdef CONFIG_ICE_SWITCHDEV > > +int ice_eswitch_mode_get(struct devlink *devlink, u16 *mode); > > +int > > +ice_eswitch_mode_set(struct devlink *devlink, u16 mode, > > + struct netlink_ext_ack *extack); > > +bool ice_is_eswitch_mode_switchdev(struct ice_pf *pf); > > +#else /* CONFIG_ICE_SWITCHDEV */ > > +static inline int > > +ice_eswitch_mode_get(struct devlink *devlink, u16 *mode) > > +{ > > + return DEVLINK_ESWITCH_MODE_LEGACY; > > +} > > + > > +static inline int > > +ice_eswitch_mode_set(struct devlink *devlink, u16 mode, > > + struct netlink_ext_ack *extack) > > +{ > > + return -EOPNOTSUPP; > > +} > > + > > +static inline bool > > +ice_is_eswitch_mode_switchdev(struct ice_pf *pf) > > +{ > > + return false; > > +} > > +#endif /* CONFIG_ICE_SWITCHDEV */ > > +#endif > >