diff mbox series

[net-next,v2,01/12] ice: basic support for eswitch mode management

Message ID 20210622212134.341728-2-michal.swiatkowski@linux.intel.com
State Changes Requested
Headers show
Series Add switchdev driver model for ice driver | expand

Commit Message

Michal Swiatkowski June 22, 2021, 9:21 p.m. UTC
Write set and get eswitch mode functions used by devlink
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@localhost]# devlink dev eswitch show pci/0000:03:00.1
>pci/0000:03:00.1: mode legacy

- move to 'switchdev' mode
[root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode
switchdev
[root@localhost]# devlink dev eswitch show pci/0000:03:00.1
>pci/0000:03:00.1: mode switchdev

- create 2 VFs
[root@localhost]# echo 2 > /sys/class/net/ens4f1/device/sriov_numvfs

- unsuccessful attempt to change eswitch mode while VFs are created
[root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
>devlink answers: Operation not supported

- destroy VFs
[root@localhost]# echo 0 > /sys/class/net/ens4f1/device/sriov_numvfs

- restore 'legacy' mode
[root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
[root@localhost]# devlink dev eswitch show pci/0000:03:00.1
>pci/0000:03:00.1: mode legacy

Co-developed-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
Signed-off-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
---
 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

Comments

Michal Swiatkowski June 23, 2021, 3:41 a.m. UTC | #1
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@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@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode
> > switchdev
> > [root@localhost]# devlink dev eswitch show pci/0000:03:00.1
> > > pci/0000:03:00.1: mode switchdev
> > 
> > - create 2 VFs
> > [root@localhost]# echo 2 > /sys/class/net/ens4f1/device/sriov_numvfs
> > 
> > - unsuccessful attempt to change eswitch mode while VFs are created
> > [root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
> > > devlink answers: Operation not supported
> > 
> > - destroy VFs
> > [root@localhost]# echo 0 > /sys/class/net/ens4f1/device/sriov_numvfs
> > 
> > - restore 'legacy' mode
> > [root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
> > [root@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 <grzegorz.nitka@intel.com>
> > Signed-off-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
> > Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
> > ---
> >   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 <net/devlink.h>
> > +
> > +#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
> >
Paul Menzel June 23, 2021, 5:58 a.m. UTC | #2
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

> 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@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 >?

> - move to 'switchdev' mode
> [root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode
> switchdev
> [root@localhost]# devlink dev eswitch show pci/0000:03:00.1
>> pci/0000:03:00.1: mode switchdev
> 
> - create 2 VFs
> [root@localhost]# echo 2 > /sys/class/net/ens4f1/device/sriov_numvfs
> 
> - unsuccessful attempt to change eswitch mode while VFs are created
> [root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
>> devlink answers: Operation not supported
> 
> - destroy VFs
> [root@localhost]# echo 0 > /sys/class/net/ens4f1/device/sriov_numvfs
> 
> - restore 'legacy' mode
> [root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
> [root@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


> Co-developed-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
> Signed-off-by: Grzegorz Nitka <grzegorz.nitka@intel.com>
> Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
> ---
>   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 <net/devlink.h>
> +
> +#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
>
Paul Menzel July 5, 2021, 10:22 a.m. UTC | #3
Dear Michal,


Am 23.06.21 um 05:41 schrieb Michal Swiatkowski:
> On Wed, Jun 23, 2021 at 07:58:00AM +0200, Paul Menzel wrote:

>> Am 22.06.21 um 23:21 schrieb Michal Swiatkowski:

[…]

>>> - restore 'legacy' mode
>>> [root@localhost]# devlink dev eswitch set pci/0000:03:00.1 mode legacy
>>> [root@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`.

> 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.

Indeed. There is 
`Documentation/networking/device_drivers/ethernet/mellanox/mlx5.rst`. As 
long as there is no documentation, I’d put it into the Kconfig 
description. If you add documentation, then just refer to that from the 
Kconfig description.


Kind regards,

Paul
diff mbox series

Patch

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 <net/devlink.h>
+
+#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