diff mbox series

[net-next,v2,4/4] qed*: Add devlink support for configuration attributes.

Message ID 20190704132011.13600-5-skalluru@marvell.com
State Changes Requested
Delegated to: David Miller
Headers show
Series qed*/devlink: Devlink support for config attributes. | expand

Commit Message

Sudarsana Reddy Kalluru July 4, 2019, 1:20 p.m. UTC
This patch adds implementation for devlink callbacks for reading and
configuring the device attributes.

Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
Signed-off-by: Ariel Elior <aelior@marvell.com>
---
 Documentation/networking/devlink-params-qede.txt |  72 ++++++++
 drivers/net/ethernet/qlogic/qed/qed_main.c       |  38 +++++
 drivers/net/ethernet/qlogic/qede/qede.h          |   3 +
 drivers/net/ethernet/qlogic/qede/qede_devlink.c  | 202 ++++++++++++++++++++++-
 drivers/net/ethernet/qlogic/qede/qede_devlink.h  |  23 +++
 include/linux/qed/qed_if.h                       |  16 ++
 6 files changed, 353 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/networking/devlink-params-qede.txt

Comments

Jakub Kicinski July 4, 2019, 10:07 p.m. UTC | #1
On Thu, 4 Jul 2019 06:20:11 -0700, Sudarsana Reddy Kalluru wrote:
> This patch adds implementation for devlink callbacks for reading and
> configuring the device attributes.
> 
> Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> Signed-off-by: Ariel Elior <aelior@marvell.com>
> ---
>  Documentation/networking/devlink-params-qede.txt |  72 ++++++++
>  drivers/net/ethernet/qlogic/qed/qed_main.c       |  38 +++++
>  drivers/net/ethernet/qlogic/qede/qede.h          |   3 +
>  drivers/net/ethernet/qlogic/qede/qede_devlink.c  | 202 ++++++++++++++++++++++-
>  drivers/net/ethernet/qlogic/qede/qede_devlink.h  |  23 +++
>  include/linux/qed/qed_if.h                       |  16 ++
>  6 files changed, 353 insertions(+), 1 deletion(-)
>  create mode 100644 Documentation/networking/devlink-params-qede.txt
> 
> diff --git a/Documentation/networking/devlink-params-qede.txt b/Documentation/networking/devlink-params-qede.txt
> new file mode 100644
> index 0000000..f78a993
> --- /dev/null
> +++ b/Documentation/networking/devlink-params-qede.txt
> @@ -0,0 +1,72 @@
> +enable_sriov		[DEVICE, GENERIC]
> +			Configuration mode: Permanent
> +
> +iwarp_cmt		[DEVICE, DRIVER-SPECIFIC]
> +			Enable iWARP support over 100G device (CMT mode).
> +			Type: Boolean
> +			Configuration mode: runtime
> +
> +entity_id		[DEVICE, DRIVER-SPECIFIC]
> +			Set the entity ID value to be used for this device
> +			while reading/configuring the devlink attributes.
> +			Type: u8
> +			Configuration mode: runtime

Can you explain what this is?

> +device_capabilities	[DEVICE, DRIVER-SPECIFIC]
> +			Set the entity ID value to be used for this device
> +			while reading/configuring the devlink attributes.
> +			Type: u8
> +			Configuration mode: runtime

Looks like you copied the previous text here.

> +mf_mode			[DEVICE, DRIVER-SPECIFIC]
> +			Configure Multi Function mode for the device.
> +			Supported MF modes and the assoicated values are,
> +			    MF allowed(0), Default(1), SPIO4(2), NPAR1.0(3),
> +			    NPAR1.5(4), NPAR2.0(5), BD(6) and UFP(7)

NPAR should have a proper API in devlink port, what are the other modes?

> +			Type: u8
> +			Configuration mode: Permanent
> +
> +dcbx_mode		[PORT, DRIVER-SPECIFIC]
> +			Configure DCBX mode for the device.
> +			Supported dcbx modes are,
> +			    Disabled(0), IEEE(1), CEE(2) and Dynamic(3)
> +			Type: u8
> +			Configuration mode: Permanent

Why is this a permanent parameter?

> +preboot_oprom		[PORT, DRIVER-SPECIFIC]
> +			Enable Preboot Option ROM.
> +			Type: Boolean
> +			Configuration mode: Permanent

This should definitely not be a driver specific toggle.

> +preboot_boot_protocol	[PORT, DRIVER-SPECIFIC]
> +			Configure preboot Boot protocol.
> +			Possible values are,
> +			    PXE(0), iSCSI Boot(3), FCoE Boot(4) and NONE(7)
> +			Type: u8
> +			Configuration mode: Permanent

Ditto.

> +preboot_vlan		[PORT, DRIVER-SPECIFIC]
> +			Preboot VLAN.
> +			Type: u16
> +			Configuration mode: Permanent
> +
> +preboot_vlan_value	[PORT, DRIVER-SPECIFIC]
> +			Configure Preboot VLAN value.
> +			Type: u16
> +			Configuration mode: Permanent

And these.

> +mba_delay_time		[PORT, DRIVER-SPECIFIC]
> +			Configure MBA Delay Time. Supported range is [0-15].
> +			Type: u8
> +			Configuration mode: Permanent
> +
> +mba_setup_hot_key	[PORT, DRIVER-SPECIFIC]
> +			Configure MBA setup Hot Key. Possible values are,
> +			Ctrl S(0) and Ctrl B(1).
> +			Type: u8
> +			Configuration mode: Permanent
> +
> +mba_hide_setup_prompt	[PORT, DRIVER-SPECIFIC]
> +			Configure MBA hide setup prompt.
> +			Type: Boolean
> +			Configuration mode: Permanent
Sudarsana Reddy Kalluru July 5, 2019, 8:22 a.m. UTC | #2
> -----Original Message-----
> From: Jakub Kicinski <jakub.kicinski@netronome.com>
> Sent: Friday, July 5, 2019 3:38 AM
> To: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> Cc: davem@davemloft.net; netdev@vger.kernel.org; Michal Kalderon
> <mkalderon@marvell.com>; Ariel Elior <aelior@marvell.com>; Jiri Pirko
> <jiri@resnulli.us>
> Subject: [EXT] Re: [PATCH net-next v2 4/4] qed*: Add devlink support for
> configuration attributes.
> 
> External Email
> 
> ----------------------------------------------------------------------
> On Thu, 4 Jul 2019 06:20:11 -0700, Sudarsana Reddy Kalluru wrote:
> > This patch adds implementation for devlink callbacks for reading and
> > configuring the device attributes.
> >
> > Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> > Signed-off-by: Ariel Elior <aelior@marvell.com>
> > ---
> >  Documentation/networking/devlink-params-qede.txt |  72 ++++++++
> >  drivers/net/ethernet/qlogic/qed/qed_main.c       |  38 +++++
> >  drivers/net/ethernet/qlogic/qede/qede.h          |   3 +
> >  drivers/net/ethernet/qlogic/qede/qede_devlink.c  | 202
> > ++++++++++++++++++++++-
> drivers/net/ethernet/qlogic/qede/qede_devlink.h  |  23 +++
> >  include/linux/qed/qed_if.h                       |  16 ++
> >  6 files changed, 353 insertions(+), 1 deletion(-)  create mode 100644
> > Documentation/networking/devlink-params-qede.txt
> >
> > diff --git a/Documentation/networking/devlink-params-qede.txt
> > b/Documentation/networking/devlink-params-qede.txt
> > new file mode 100644
> > index 0000000..f78a993
> > --- /dev/null
> > +++ b/Documentation/networking/devlink-params-qede.txt
> > @@ -0,0 +1,72 @@
> > +enable_sriov		[DEVICE, GENERIC]
> > +			Configuration mode: Permanent
> > +
> > +iwarp_cmt		[DEVICE, DRIVER-SPECIFIC]
> > +			Enable iWARP support over 100G device (CMT
> mode).
> > +			Type: Boolean
> > +			Configuration mode: runtime
> > +
> > +entity_id		[DEVICE, DRIVER-SPECIFIC]
> > +			Set the entity ID value to be used for this device
> > +			while reading/configuring the devlink attributes.
> > +			Type: u8
> > +			Configuration mode: runtime
> 
> Can you explain what this is?
Hardware/mfw provides the option to modify/read the config of other PFs. A non-zero entity id represents a partition number (or simply a PF-id) for which the config need to be read/updated.

> 
> > +device_capabilities	[DEVICE, DRIVER-SPECIFIC]
> > +			Set the entity ID value to be used for this device
> > +			while reading/configuring the devlink attributes.
> > +			Type: u8
> > +			Configuration mode: runtime
> 
> Looks like you copied the previous text here.
Will update it, thanks.

> 
> > +mf_mode			[DEVICE, DRIVER-SPECIFIC]
> > +			Configure Multi Function mode for the device.
> > +			Supported MF modes and the assoicated values are,
> > +			    MF allowed(0), Default(1), SPIO4(2), NPAR1.0(3),
> > +			    NPAR1.5(4), NPAR2.0(5), BD(6) and UFP(7)
> 
> NPAR should have a proper API in devlink port, what are the other modes?
> 
These are the different modes supported by the Marvell NIC. In our case the mf_mode is per adapter basis, e.g., it's not possible to configure one port in NPAR mode and the other in Default mode.

> > +			Type: u8
> > +			Configuration mode: Permanent
> > +
> > +dcbx_mode		[PORT, DRIVER-SPECIFIC]
> > +			Configure DCBX mode for the device.
> > +			Supported dcbx modes are,
> > +			    Disabled(0), IEEE(1), CEE(2) and Dynamic(3)
> > +			Type: u8
> > +			Configuration mode: Permanent
> 
> Why is this a permanent parameter?
> 
This specifies the dcbx_mode to be configured in non-volatile memory. The value is persistent and is used in the next load of OS or the mfw.

> > +preboot_oprom		[PORT, DRIVER-SPECIFIC]
> > +			Enable Preboot Option ROM.
> > +			Type: Boolean
> > +			Configuration mode: Permanent
> 
> This should definitely not be a driver specific toggle.
> 
> > +preboot_boot_protocol	[PORT, DRIVER-SPECIFIC]
> > +			Configure preboot Boot protocol.
> > +			Possible values are,
> > +			    PXE(0), iSCSI Boot(3), FCoE Boot(4) and NONE(7)
> > +			Type: u8
> > +			Configuration mode: Permanent
> 
> Ditto.
> 
> > +preboot_vlan		[PORT, DRIVER-SPECIFIC]
> > +			Preboot VLAN.
> > +			Type: u16
> > +			Configuration mode: Permanent
> > +
> > +preboot_vlan_value	[PORT, DRIVER-SPECIFIC]
> > +			Configure Preboot VLAN value.
> > +			Type: u16
> > +			Configuration mode: Permanent
> 
> And these.
Sure, will add generic definitions for these.

> 
> > +mba_delay_time		[PORT, DRIVER-SPECIFIC]
> > +			Configure MBA Delay Time. Supported range is [0-
> 15].
> > +			Type: u8
> > +			Configuration mode: Permanent
> > +
> > +mba_setup_hot_key	[PORT, DRIVER-SPECIFIC]
> > +			Configure MBA setup Hot Key. Possible values are,
> > +			Ctrl S(0) and Ctrl B(1).
> > +			Type: u8
> > +			Configuration mode: Permanent
> > +
> > +mba_hide_setup_prompt	[PORT, DRIVER-SPECIFIC]
> > +			Configure MBA hide setup prompt.
> > +			Type: Boolean
> > +			Configuration mode: Permanent
Jakub Kicinski July 5, 2019, 7:39 p.m. UTC | #3
On Fri, 5 Jul 2019 08:22:41 +0000, Sudarsana Reddy Kalluru wrote:
> > On Thu, 4 Jul 2019 06:20:11 -0700, Sudarsana Reddy Kalluru wrote:  
> > > This patch adds implementation for devlink callbacks for reading and
> > > configuring the device attributes.
> > >
> > > Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> > > Signed-off-by: Ariel Elior <aelior@marvell.com>

> > > diff --git a/Documentation/networking/devlink-params-qede.txt
> > > b/Documentation/networking/devlink-params-qede.txt
> > > new file mode 100644
> > > index 0000000..f78a993
> > > --- /dev/null
> > > +++ b/Documentation/networking/devlink-params-qede.txt
> > > @@ -0,0 +1,72 @@
> > > +enable_sriov		[DEVICE, GENERIC]
> > > +			Configuration mode: Permanent
> > > +
> > > +iwarp_cmt		[DEVICE, DRIVER-SPECIFIC]
> > > +			Enable iWARP support over 100G device (CMT mode).  
> > > +			Type: Boolean
> > > +			Configuration mode: runtime
> > > +
> > > +entity_id		[DEVICE, DRIVER-SPECIFIC]
> > > +			Set the entity ID value to be used for this device
> > > +			while reading/configuring the devlink attributes.
> > > +			Type: u8
> > > +			Configuration mode: runtime  
> > 
> > Can you explain what this is?  
>
> Hardware/mfw provides the option to modify/read the config of other
> PFs. A non-zero entity id represents a partition number (or simply a
> PF-id) for which the config need to be read/updated.

Having a parameter which changes the interpretation of other parameters
makes me quite uncomfortable :(  Could it be a better idea, perhaps, to
use PCI ports?  We have been discussing PCI ports for a while now, and
they will probably become a reality soon.  You could then hang the
per-PF parameters off of the PF ports rather than the device instance? 

> > > +device_capabilities	[DEVICE, DRIVER-SPECIFIC]
> > > +			Set the entity ID value to be used for this device
> > > +			while reading/configuring the devlink attributes.
> > > +			Type: u8
> > > +			Configuration mode: runtime  
> > 
> > Looks like you copied the previous text here.  
> Will update it, thanks.
> 
> >   
> > > +mf_mode			[DEVICE, DRIVER-SPECIFIC]
> > > +			Configure Multi Function mode for the device.
> > > +			Supported MF modes and the assoicated values are,
> > > +			    MF allowed(0), Default(1), SPIO4(2), NPAR1.0(3),
> > > +			    NPAR1.5(4), NPAR2.0(5), BD(6) and UFP(7)  
> > 
> > NPAR should have a proper API in devlink port, what are the other modes?
> >   
> These are the different modes supported by the Marvell NIC. In our
> case the mf_mode is per adapter basis, e.g., it's not possible to
> configure one port in NPAR mode and the other in Default mode.

Jiri, what are your thoughts on the NPAR support?  It is effectively a
PCI split.  If we are going to support mdev split, should we perhaps
have a "depth" or "type" of split and allow for users to configure it
using the same API?

> > > +			Type: u8
> > > +			Configuration mode: Permanent
> > > +
> > > +dcbx_mode		[PORT, DRIVER-SPECIFIC]
> > > +			Configure DCBX mode for the device.
> > > +			Supported dcbx modes are,
> > > +			    Disabled(0), IEEE(1), CEE(2) and
> > > Dynamic(3)
> > > +			Type: u8
> > > +			Configuration mode: Permanent  
> > 
> > Why is this a permanent parameter?
> >   
> This specifies the dcbx_mode to be configured in non-volatile memory.
> The value is persistent and is used in the next load of OS or the mfw.

And it can't be changed at runtime?
Sudarsana Reddy Kalluru July 8, 2019, 2:31 a.m. UTC | #4
> -----Original Message-----
> From: Jakub Kicinski <jakub.kicinski@netronome.com>
> Sent: Saturday, July 6, 2019 1:09 AM
> To: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> Cc: davem@davemloft.net; netdev@vger.kernel.org; Michal Kalderon
> <mkalderon@marvell.com>; Ariel Elior <aelior@marvell.com>; Jiri Pirko
> <jiri@resnulli.us>
> Subject: Re: [EXT] Re: [PATCH net-next v2 4/4] qed*: Add devlink support for
> configuration attributes.
> 
> On Fri, 5 Jul 2019 08:22:41 +0000, Sudarsana Reddy Kalluru wrote:
> > > On Thu, 4 Jul 2019 06:20:11 -0700, Sudarsana Reddy Kalluru wrote:
> > > > This patch adds implementation for devlink callbacks for reading
> > > > and configuring the device attributes.
> > > >
> > > > Signed-off-by: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> > > > Signed-off-by: Ariel Elior <aelior@marvell.com>
> 
> > > > diff --git a/Documentation/networking/devlink-params-qede.txt
> > > > b/Documentation/networking/devlink-params-qede.txt
> > > > new file mode 100644
> > > > index 0000000..f78a993
> > > > --- /dev/null
> > > > +++ b/Documentation/networking/devlink-params-qede.txt
> > > > @@ -0,0 +1,72 @@
> > > > +enable_sriov		[DEVICE, GENERIC]
> > > > +			Configuration mode: Permanent
> > > > +
> > > > +iwarp_cmt		[DEVICE, DRIVER-SPECIFIC]
> > > > +			Enable iWARP support over 100G device (CMT
> mode).
> > > > +			Type: Boolean
> > > > +			Configuration mode: runtime
> > > > +
> > > > +entity_id		[DEVICE, DRIVER-SPECIFIC]
> > > > +			Set the entity ID value to be used for this device
> > > > +			while reading/configuring the devlink attributes.
> > > > +			Type: u8
> > > > +			Configuration mode: runtime
> > >
> > > Can you explain what this is?
> >
> > Hardware/mfw provides the option to modify/read the config of other
> > PFs. A non-zero entity id represents a partition number (or simply a
> > PF-id) for which the config need to be read/updated.
> 
> Having a parameter which changes the interpretation of other parameters
> makes me quite uncomfortable :(  Could it be a better idea, perhaps, to use
> PCI ports?  We have been discussing PCI ports for a while now, and they will
> probably become a reality soon.  You could then hang the per-PF parameters
> off of the PF ports rather than the device instance?
> 
Agree with you, thanks.

> > > > +device_capabilities	[DEVICE, DRIVER-SPECIFIC]
> > > > +			Set the entity ID value to be used for this device
> > > > +			while reading/configuring the devlink attributes.
> > > > +			Type: u8
> > > > +			Configuration mode: runtime
> > >
> > > Looks like you copied the previous text here.
> > Will update it, thanks.
> >
> > >
> > > > +mf_mode			[DEVICE, DRIVER-SPECIFIC]
> > > > +			Configure Multi Function mode for the device.
> > > > +			Supported MF modes and the assoicated values are,
> > > > +			    MF allowed(0), Default(1), SPIO4(2), NPAR1.0(3),
> > > > +			    NPAR1.5(4), NPAR2.0(5), BD(6) and UFP(7)
> > >
> > > NPAR should have a proper API in devlink port, what are the other
> modes?
> > >
> > These are the different modes supported by the Marvell NIC. In our
> > case the mf_mode is per adapter basis, e.g., it's not possible to
> > configure one port in NPAR mode and the other in Default mode.
> 
> Jiri, what are your thoughts on the NPAR support?  It is effectively a PCI split.
> If we are going to support mdev split, should we perhaps have a "depth" or
> "type" of split and allow for users to configure it using the same API?
> 
> > > > +			Type: u8
> > > > +			Configuration mode: Permanent
> > > > +
> > > > +dcbx_mode		[PORT, DRIVER-SPECIFIC]
> > > > +			Configure DCBX mode for the device.
> > > > +			Supported dcbx modes are,
> > > > +			    Disabled(0), IEEE(1), CEE(2) and
> > > > Dynamic(3)
> > > > +			Type: u8
> > > > +			Configuration mode: Permanent
> > >
> > > Why is this a permanent parameter?
> > >
> > This specifies the dcbx_mode to be configured in non-volatile memory.
> > The value is persistent and is used in the next load of OS or the mfw.
> 
> And it can't be changed at runtime?
Run time dcbx params are not affected via this interface, it only updates config on permanent storage of the port.
Jakub Kicinski July 8, 2019, 9:47 p.m. UTC | #5
On Mon, 8 Jul 2019 02:31:15 +0000, Sudarsana Reddy Kalluru wrote:
> > > > > +			Type: u8
> > > > > +			Configuration mode: Permanent
> > > > > +
> > > > > +dcbx_mode		[PORT, DRIVER-SPECIFIC]
> > > > > +			Configure DCBX mode for the device.
> > > > > +			Supported dcbx modes are,
> > > > > +			    Disabled(0), IEEE(1), CEE(2) and
> > > > > Dynamic(3)
> > > > > +			Type: u8
> > > > > +			Configuration mode: Permanent  
> > > >
> > > > Why is this a permanent parameter?
> > > >  
> > > This specifies the dcbx_mode to be configured in non-volatile memory.
> > > The value is persistent and is used in the next load of OS or the mfw.  
> > 
> > And it can't be changed at runtime?  
>
> Run time dcbx params are not affected via this interface, it only
> updates config on permanent storage of the port.

IOW it affects the defaults after boot?  It'd be preferable to have 
the DCB uAPI handle "persistent"/default settings if that's the case.
Sudarsana Reddy Kalluru July 9, 2019, 2:08 a.m. UTC | #6
> -----Original Message-----
> From: Jakub Kicinski <jakub.kicinski@netronome.com>
> Sent: Tuesday, July 9, 2019 3:17 AM
> To: Sudarsana Reddy Kalluru <skalluru@marvell.com>
> Cc: davem@davemloft.net; netdev@vger.kernel.org; Michal Kalderon
> <mkalderon@marvell.com>; Ariel Elior <aelior@marvell.com>; Jiri Pirko
> <jiri@resnulli.us>
> Subject: Re: [EXT] Re: [PATCH net-next v2 4/4] qed*: Add devlink support for
> configuration attributes.
> 
> On Mon, 8 Jul 2019 02:31:15 +0000, Sudarsana Reddy Kalluru wrote:
> > > > > > +			Type: u8
> > > > > > +			Configuration mode: Permanent
> > > > > > +
> > > > > > +dcbx_mode		[PORT, DRIVER-SPECIFIC]
> > > > > > +			Configure DCBX mode for the device.
> > > > > > +			Supported dcbx modes are,
> > > > > > +			    Disabled(0), IEEE(1), CEE(2) and
> > > > > > Dynamic(3)
> > > > > > +			Type: u8
> > > > > > +			Configuration mode: Permanent
> > > > >
> > > > > Why is this a permanent parameter?
> > > > >
> > > > This specifies the dcbx_mode to be configured in non-volatile memory.
> > > > The value is persistent and is used in the next load of OS or the mfw.
> > >
> > > And it can't be changed at runtime?
> >
> > Run time dcbx params are not affected via this interface, it only
> > updates config on permanent storage of the port.
> 
> IOW it affects the defaults after boot?  It'd be preferable to have the DCB
> uAPI handle "persistent"/default settings if that's the case.
Yes, it's effective after the reboot. Thanks for your suggestion.
diff mbox series

Patch

diff --git a/Documentation/networking/devlink-params-qede.txt b/Documentation/networking/devlink-params-qede.txt
new file mode 100644
index 0000000..f78a993
--- /dev/null
+++ b/Documentation/networking/devlink-params-qede.txt
@@ -0,0 +1,72 @@ 
+enable_sriov		[DEVICE, GENERIC]
+			Configuration mode: Permanent
+
+iwarp_cmt		[DEVICE, DRIVER-SPECIFIC]
+			Enable iWARP support over 100G device (CMT mode).
+			Type: Boolean
+			Configuration mode: runtime
+
+entity_id		[DEVICE, DRIVER-SPECIFIC]
+			Set the entity ID value to be used for this device
+			while reading/configuring the devlink attributes.
+			Type: u8
+			Configuration mode: runtime
+
+device_capabilities	[DEVICE, DRIVER-SPECIFIC]
+			Set the entity ID value to be used for this device
+			while reading/configuring the devlink attributes.
+			Type: u8
+			Configuration mode: runtime
+
+mf_mode			[DEVICE, DRIVER-SPECIFIC]
+			Configure Multi Function mode for the device.
+			Supported MF modes and the assoicated values are,
+			    MF allowed(0), Default(1), SPIO4(2), NPAR1.0(3),
+			    NPAR1.5(4), NPAR2.0(5), BD(6) and UFP(7)
+			Type: u8
+			Configuration mode: Permanent
+
+dcbx_mode		[PORT, DRIVER-SPECIFIC]
+			Configure DCBX mode for the device.
+			Supported dcbx modes are,
+			    Disabled(0), IEEE(1), CEE(2) and Dynamic(3)
+			Type: u8
+			Configuration mode: Permanent
+
+preboot_oprom		[PORT, DRIVER-SPECIFIC]
+			Enable Preboot Option ROM.
+			Type: Boolean
+			Configuration mode: Permanent
+
+preboot_boot_protocol	[PORT, DRIVER-SPECIFIC]
+			Configure preboot Boot protocol.
+			Possible values are,
+			    PXE(0), iSCSI Boot(3), FCoE Boot(4) and NONE(7)
+			Type: u8
+			Configuration mode: Permanent
+
+preboot_vlan		[PORT, DRIVER-SPECIFIC]
+			Preboot VLAN.
+			Type: u16
+			Configuration mode: Permanent
+
+preboot_vlan_value	[PORT, DRIVER-SPECIFIC]
+			Configure Preboot VLAN value.
+			Type: u16
+			Configuration mode: Permanent
+
+mba_delay_time		[PORT, DRIVER-SPECIFIC]
+			Configure MBA Delay Time. Supported range is [0-15].
+			Type: u8
+			Configuration mode: Permanent
+
+mba_setup_hot_key	[PORT, DRIVER-SPECIFIC]
+			Configure MBA setup Hot Key. Possible values are,
+			Ctrl S(0) and Ctrl B(1).
+			Type: u8
+			Configuration mode: Permanent
+
+mba_hide_setup_prompt	[PORT, DRIVER-SPECIFIC]
+			Configure MBA hide setup prompt.
+			Type: Boolean
+			Configuration mode: Permanent
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index f0183e2..3d43140 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -2388,6 +2388,42 @@  static void qed_set_iwarp_cmt(struct qed_dev *cdev, bool iwarp_cmt)
 	cdev->iwarp_cmt = iwarp_cmt;
 }
 
+static int qed_get_cfg_attr(struct qed_dev *cdev, u16 cmd, u8 entity, u32 flags,
+			    u8 *buf, int *len)
+{
+	struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev);
+	struct qed_ptt *ptt;
+	int status = 0;
+
+	ptt = qed_ptt_acquire(hwfn);
+	if (!ptt)
+		return -EAGAIN;
+
+	status = qed_mcp_nvm_get_cfg(hwfn, ptt, cmd, entity, flags, buf, len);
+
+	qed_ptt_release(hwfn, ptt);
+
+	return status;
+}
+
+static int qed_set_cfg_attr(struct qed_dev *cdev, u16 cmd, u8 entity, u32 flags,
+			    u8 *buf, int len)
+{
+	struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev);
+	struct qed_ptt *ptt;
+	int status = 0;
+
+	ptt = qed_ptt_acquire(hwfn);
+	if (!ptt)
+		return -EAGAIN;
+
+	status = qed_mcp_nvm_set_cfg(hwfn, ptt, cmd, entity, flags, buf, len);
+
+	qed_ptt_release(hwfn, ptt);
+
+	return status;
+}
+
 static struct qed_selftest_ops qed_selftest_ops_pass = {
 	.selftest_memory = &qed_selftest_memory,
 	.selftest_interrupt = &qed_selftest_interrupt,
@@ -2438,6 +2474,8 @@  static void qed_set_iwarp_cmt(struct qed_dev *cdev, bool iwarp_cmt)
 	.get_affin_hwfn_idx = &qed_get_affin_hwfn_idx,
 	.get_iwarp_cmt = &qed_get_iwarp_cmt,
 	.set_iwarp_cmt = &qed_set_iwarp_cmt,
+	.get_cfg_attr = &qed_get_cfg_attr,
+	.set_cfg_attr = &qed_set_cfg_attr,
 };
 
 void qed_get_protocol_stats(struct qed_dev *cdev,
diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
index 35ad5cd..e175d30 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
@@ -54,6 +54,7 @@ 
 
 #include <net/pkt_cls.h>
 #include <net/tc_act/tc_gact.h>
+#include <net/devlink.h>
 
 #define QEDE_MAJOR_VERSION		8
 #define QEDE_MINOR_VERSION		37
@@ -264,6 +265,8 @@  struct qede_dev {
 	struct bpf_prog *xdp_prog;
 
 	struct devlink			*dl;
+	struct devlink_port		dl_port;
+	u8				cfg_entity_id;
 };
 
 enum QEDE_STATE {
diff --git a/drivers/net/ethernet/qlogic/qede/qede_devlink.c b/drivers/net/ethernet/qlogic/qede/qede_devlink.c
index 3f362ac..076a66a 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_devlink.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_devlink.c
@@ -2,6 +2,31 @@ 
 #include "qede.h"
 #include "qede_devlink.h"
 
+static const struct qede_devlink_cfg_param cfg_params[] = {
+	{DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV, QED_NVM_CFG_ID_ENABLE_SRIOV,
+	 DEVLINK_PARAM_TYPE_BOOL},
+	{QEDE_DEVLINK_ENTITY_ID, 0, DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_DEVICE_CAPABILITIES,
+	 QED_NVM_CFG_ID_DEVICE_CAPABILITIES, DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_MF_MODE, QED_NVM_CFG_ID_MF_MODE, DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_DCBX_MODE, QED_NVM_CFG_ID_DCBX_MODE,
+	 DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_PREBOOT_OPROM, QED_NVM_CFG_ID_PREBOOT_OPROM,
+	 DEVLINK_PARAM_TYPE_BOOL},
+	{QEDE_DEVLINK_PREBOOT_BOOT_PROTOCOL,
+	 QED_NVM_CFG_ID_PREBOOT_BOOT_PROTOCOL, DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_PREBOOT_VLAN, QED_NVM_CFG_ID_PREBOOT_VLAN,
+	 DEVLINK_PARAM_TYPE_U16},
+	{QEDE_DEVLINK_PREBOOT_VLAN_VALUE, QED_NVM_CFG_ID_PREBOOT_VLAN_VALUE,
+	 DEVLINK_PARAM_TYPE_U16},
+	{QEDE_DEVLINK_MBA_DELAY_TIME, QED_NVM_CFG_ID_MBA_DELAY_TIME,
+	 DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_MBA_SETUP_HOT_KEY, QED_NVM_CFG_ID_MBA_SETUP_HOT_KEY,
+	 DEVLINK_PARAM_TYPE_U8},
+	{QEDE_DEVLINK_MBA_HIDE_SETUP_PROMPT,
+	 QED_NVM_CFG_ID_MBA_HIDE_SETUP_PROMPT, DEVLINK_PARAM_TYPE_BOOL},
+};
+
 static int qede_dl_param_get(struct devlink *dl, u32 id,
 			     struct devlink_param_gset_ctx *ctx)
 {
@@ -28,11 +53,159 @@  static int qede_dl_param_set(struct devlink *dl, u32 id,
 	return 0;
 }
 
+static int qede_dl_get_perm_cfg(struct devlink *dl, u32 id,
+				struct devlink_param_gset_ctx *ctx)
+{
+	u8 buf[QEDE_DL_PARAM_BUF_LEN];
+	struct qede_devlink *qede_dl;
+	int rc, idx, len = 0;
+	struct qede_dev *edev;
+	u32 flags;
+
+	qede_dl = devlink_priv(dl);
+	edev = qede_dl->edev;
+
+	if (id == QEDE_DEVLINK_ENTITY_ID) {
+		ctx->val.vu8 = edev->cfg_entity_id;
+		return 0;
+	}
+
+	for (idx = 0; idx < ARRAY_SIZE(cfg_params); idx++)
+		if (cfg_params[idx].id == id)
+			break;
+
+	if (idx == ARRAY_SIZE(cfg_params)) {
+		DP_ERR(edev, "Invalid command id %d\n", id);
+		return -EINVAL;
+	}
+
+	memset(buf, 0, QEDE_DL_PARAM_BUF_LEN);
+	flags = edev->cfg_entity_id ? QEDE_DL_PARAM_PF_GET_FLAGS :
+		QEDE_DL_PARAM_GET_FLAGS;
+
+	rc = edev->ops->common->get_cfg_attr(edev->cdev, cfg_params[idx].cmd,
+					     edev->cfg_entity_id, flags, buf,
+					     &len);
+	if (rc)
+		DP_ERR(edev, "Error = %d\n", rc);
+	else
+		memcpy(&ctx->val, buf, len);
+
+	return rc;
+}
+
+static int qede_dl_set_perm_cfg(struct devlink *dl, u32 id,
+				struct devlink_param_gset_ctx *ctx)
+{
+	u8 buf[QEDE_DL_PARAM_BUF_LEN];
+	struct qede_devlink *qede_dl;
+	int rc, idx, len = 0;
+	struct qede_dev *edev;
+	u32 flags;
+
+	qede_dl = devlink_priv(dl);
+	edev = qede_dl->edev;
+
+	if (id == QEDE_DEVLINK_ENTITY_ID) {
+		edev->cfg_entity_id = ctx->val.vu8;
+		return 0;
+	}
+
+	for (idx = 0; idx < ARRAY_SIZE(cfg_params); idx++)
+		if (cfg_params[idx].id == id)
+			break;
+
+	if (idx == ARRAY_SIZE(cfg_params)) {
+		DP_ERR(edev, "Invalid command id %d\n", id);
+		return -EINVAL;
+	}
+
+	memset(buf, 0, QEDE_DL_PARAM_BUF_LEN);
+	switch (cfg_params[idx].type) {
+	case DEVLINK_PARAM_TYPE_BOOL:
+		len = 1;
+		break;
+	case DEVLINK_PARAM_TYPE_U8:
+		len = 1;
+		break;
+	case DEVLINK_PARAM_TYPE_U16:
+		len = 2;
+		break;
+	case DEVLINK_PARAM_TYPE_U32:
+		len = 4;
+		break;
+	case DEVLINK_PARAM_TYPE_STRING:
+		len = strlen(ctx->val.vstr);
+		break;
+	}
+
+	memcpy(buf, &ctx->val, len);
+	flags = edev->cfg_entity_id ? QEDE_DL_PARAM_PF_SET_FLAGS :
+		QEDE_DL_PARAM_SET_FLAGS;
+
+	rc = edev->ops->common->set_cfg_attr(edev->cdev, cfg_params[idx].cmd,
+					     edev->cfg_entity_id, flags, buf,
+					     len);
+	if (rc)
+		DP_ERR(edev, "Error = %d\n", rc);
+
+	return rc;
+}
+
 static const struct devlink_param qede_devlink_params[] = {
 	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_PARAM_ID_IWARP_CMT,
 			     "iwarp_cmt", DEVLINK_PARAM_TYPE_BOOL,
 			     BIT(DEVLINK_PARAM_CMODE_RUNTIME),
 			     qede_dl_param_get, qede_dl_param_set, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_ENTITY_ID,
+			     "entity_id", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_RUNTIME),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_GENERIC(ENABLE_SRIOV, BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			      qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_MF_MODE,
+			     "mf_mode", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_DEVICE_CAPABILITIES,
+			     "device_capabilities", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+};
+
+static const struct devlink_param qede_devlink_port_params[] = {
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_DCBX_MODE,
+			     "dcbx_mode", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_PREBOOT_OPROM,
+			     "preboot_oprom", DEVLINK_PARAM_TYPE_BOOL,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_PREBOOT_BOOT_PROTOCOL,
+			     "preboot_boot_protocol", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_PREBOOT_VLAN,
+			     "preboot_vlan", DEVLINK_PARAM_TYPE_U16,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_PREBOOT_VLAN_VALUE,
+			     "preboot_vlan_value", DEVLINK_PARAM_TYPE_U16,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_MBA_DELAY_TIME,
+			     "mba_delay_time", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_MBA_SETUP_HOT_KEY,
+			     "mba_setup_hot_key", DEVLINK_PARAM_TYPE_U8,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
+	DEVLINK_PARAM_DRIVER(QEDE_DEVLINK_MBA_HIDE_SETUP_PROMPT,
+			     "mba_hide_setup_prompt", DEVLINK_PARAM_TYPE_BOOL,
+			     BIT(DEVLINK_PARAM_CMODE_PERMANENT),
+			     qede_dl_get_perm_cfg, qede_dl_set_perm_cfg, NULL),
 };
 
 static const struct devlink_ops qede_dl_ops;
@@ -66,11 +239,34 @@  int qede_devlink_register(struct qede_dev *edev)
 	devlink_param_driverinit_value_set(dl, QEDE_DEVLINK_PARAM_ID_IWARP_CMT,
 					   value);
 
+	devlink_port_attrs_set(&edev->dl_port, DEVLINK_PORT_FLAVOUR_PHYSICAL,
+			       0, false, 0, NULL, 0);
+	rc = devlink_port_register(dl, &edev->dl_port, 0);
+	if (rc) {
+		DP_ERR(edev, "devlink_port_register failed");
+		goto err_param_unregister;
+	}
+	devlink_port_type_eth_set(&edev->dl_port, edev->ndev);
+
+	rc = devlink_port_params_register(&edev->dl_port,
+					  qede_devlink_port_params,
+					  ARRAY_SIZE(qede_devlink_port_params));
+	if (rc) {
+		DP_ERR(edev, "devlink_port_params_register failed");
+		goto err_port_unregister;
+	}
+
 	devlink_params_publish(dl);
+	devlink_port_params_publish(&edev->dl_port);
 	edev->ops->common->set_iwarp_cmt(edev->cdev, false);
 
 	return 0;
 
+err_port_unregister:
+	devlink_port_unregister(&edev->dl_port);
+err_param_unregister:
+	devlink_params_unregister(edev->dl, qede_devlink_params,
+				  ARRAY_SIZE(qede_devlink_params));
 err_unregister:
 	devlink_unregister(dl);
 
@@ -86,9 +282,13 @@  void qede_devlink_unregister(struct qede_dev *edev)
 	if (!edev->dl)
 		return;
 
+	devlink_port_params_unpublish(&edev->dl_port);
+	devlink_params_unpublish(edev->dl);
+	devlink_port_params_unregister(&edev->dl_port, qede_devlink_port_params,
+				       ARRAY_SIZE(qede_devlink_port_params));
 	devlink_params_unregister(edev->dl, qede_devlink_params,
 				  ARRAY_SIZE(qede_devlink_params));
-
+	devlink_port_unregister(&edev->dl_port);
 	devlink_unregister(edev->dl);
 	devlink_free(edev->dl);
 }
diff --git a/drivers/net/ethernet/qlogic/qede/qede_devlink.h b/drivers/net/ethernet/qlogic/qede/qede_devlink.h
index 5aa79dd..57b5fcc 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_devlink.h
+++ b/drivers/net/ethernet/qlogic/qede/qede_devlink.h
@@ -3,6 +3,12 @@ 
 #define _QEDE_DEVLINK_H
 #include <net/devlink.h>
 
+#define QEDE_DL_PARAM_GET_FLAGS		0xA
+#define QEDE_DL_PARAM_SET_FLAGS		0xE
+#define QEDE_DL_PARAM_PF_GET_FLAGS	0x1A
+#define QEDE_DL_PARAM_PF_SET_FLAGS	0x1E
+#define QEDE_DL_PARAM_BUF_LEN		32
+
 struct qede_devlink {
 	struct qede_dev *edev;
 };
@@ -10,6 +16,23 @@  struct qede_devlink {
 enum qede_devlink_param_id {
 	QEDE_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
 	QEDE_DEVLINK_PARAM_ID_IWARP_CMT,
+	QEDE_DEVLINK_ENTITY_ID,
+	QEDE_DEVLINK_DEVICE_CAPABILITIES,
+	QEDE_DEVLINK_MF_MODE,
+	QEDE_DEVLINK_DCBX_MODE,
+	QEDE_DEVLINK_PREBOOT_OPROM,
+	QEDE_DEVLINK_PREBOOT_BOOT_PROTOCOL,
+	QEDE_DEVLINK_PREBOOT_VLAN,
+	QEDE_DEVLINK_PREBOOT_VLAN_VALUE,
+	QEDE_DEVLINK_MBA_DELAY_TIME,
+	QEDE_DEVLINK_MBA_SETUP_HOT_KEY,
+	QEDE_DEVLINK_MBA_HIDE_SETUP_PROMPT,
+};
+
+struct qede_devlink_cfg_param {
+	u16 id;
+	u16 cmd;
+	enum devlink_param_type type;
 };
 
 int qede_devlink_register(struct qede_dev *edev);
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h
index 7c41304..6430762 100644
--- a/include/linux/qed/qed_if.h
+++ b/include/linux/qed/qed_if.h
@@ -48,6 +48,18 @@ 
 #include <linux/qed/qed_chain.h>
 #include <linux/io-64-nonatomic-lo-hi.h>
 
+#define QED_NVM_CFG_ID_MF_MODE			9
+#define QED_NVM_CFG_ID_DCBX_MODE		26
+#define QED_NVM_CFG_ID_PREBOOT_OPROM		59
+#define QED_NVM_CFG_ID_MBA_DELAY_TIME		61
+#define QED_NVM_CFG_ID_MBA_SETUP_HOT_KEY	62
+#define QED_NVM_CFG_ID_MBA_HIDE_SETUP_PROMPT	63
+#define QED_NVM_CFG_ID_PREBOOT_BOOT_PROTOCOL	69
+#define QED_NVM_CFG_ID_ENABLE_SRIOV		70
+#define QED_NVM_CFG_ID_DEVICE_CAPABILITIES	117
+#define QED_NVM_CFG_ID_PREBOOT_VLAN_VALUE	132
+#define QED_NVM_CFG_ID_PREBOOT_VLAN		133
+
 enum dcbx_protocol_type {
 	DCBX_PROTOCOL_ISCSI,
 	DCBX_PROTOCOL_FCOE,
@@ -1134,6 +1146,10 @@  struct qed_common_ops {
 
 	bool (*get_iwarp_cmt)(struct qed_dev *cdev);
 	void (*set_iwarp_cmt)(struct qed_dev *cdev, bool iwarp_cmt);
+	int (*get_cfg_attr)(struct qed_dev *cdev, u16 cmd, u8 entity, u32 flags,
+			    u8 *buf, int *len);
+	int (*set_cfg_attr)(struct qed_dev *cdev, u16 cmd, u8 entity, u32 flags,
+			    u8 *buf, int len);
 };
 
 #define MASK_FIELD(_name, _value) \