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