devlink: Add optional controller user input

A user optionally provides the external controller number when user
wants to create devlink port for the external controller.

An example on eswitch system:
$ devlink dev eswitch set pci/0033:01:00.0 mode switchdev

$ devlink port show
pci/0033:01:00.0/196607: type eth netdev enP51p1s0f0np0 flavour physical port 0 splittable false
pci/0033:01:00.0/131072: type eth netdev eth0 flavour pcipf controller 1 pfnum 0 external true splittable false
  function:
    hw_addr 00:00:00:00:00:00

$ devlink port add pci/0033:01:00.0 flavour pcisf pfnum 0 sfnum 77 controller 1
pci/0033:01:00.0/163840: type eth netdev eth1 flavour pcisf controller 1 pfnum 0 sfnum 77 external true splittable false
  function:
    hw_addr 00:00:00:00:00:00 state inactive opstate detached

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
Parav Pandit 2021-06-07 22:24:06 +03:00 committed by David Ahern
parent 0d5cf51e0d
commit fbd4b581cb
2 changed files with 37 additions and 3 deletions

View File

@ -286,6 +286,7 @@ static void ifname_map_free(struct ifname_map *ifname_map)
#define DL_OPT_PORT_PFNUMBER BIT(43)
#define DL_OPT_PORT_SFNUMBER BIT(44)
#define DL_OPT_PORT_FUNCTION_STATE BIT(45)
#define DL_OPT_PORT_CONTROLLER BIT(46)
struct dl_opts {
uint64_t present; /* flags of present items */
@ -336,6 +337,7 @@ struct dl_opts {
uint32_t overwrite_mask;
enum devlink_reload_action reload_action;
enum devlink_reload_limit reload_limit;
uint32_t port_controller;
uint32_t port_sfnumber;
uint16_t port_flavour;
uint16_t port_pfnumber;
@ -1886,6 +1888,12 @@ static int dl_argv_parse(struct dl *dl, uint64_t o_required,
if (err)
return err;
o_found |= DL_OPT_PORT_SFNUMBER;
} else if (dl_argv_match(dl, "controller") && (o_all & DL_OPT_PORT_CONTROLLER)) {
dl_arg_inc(dl);
err = dl_argv_uint32_t(dl, &opts->port_controller);
if (err)
return err;
o_found |= DL_OPT_PORT_CONTROLLER;
} else {
pr_err("Unknown option \"%s\"\n", dl_argv(dl));
return -EINVAL;
@ -2079,6 +2087,9 @@ static void dl_opts_put(struct nlmsghdr *nlh, struct dl *dl)
mnl_attr_put_u16(nlh, DEVLINK_ATTR_PORT_PCI_PF_NUMBER, opts->port_pfnumber);
if (opts->present & DL_OPT_PORT_SFNUMBER)
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_PCI_SF_NUMBER, opts->port_sfnumber);
if (opts->present & DL_OPT_PORT_CONTROLLER)
mnl_attr_put_u32(nlh, DEVLINK_ATTR_PORT_CONTROLLER_NUMBER,
opts->port_controller);
}
static int dl_argv_parse_put(struct nlmsghdr *nlh, struct dl *dl,
@ -3795,7 +3806,8 @@ static void cmd_port_help(void)
pr_err(" devlink port param set DEV/PORT_INDEX name PARAMETER value VALUE cmode { permanent | driverinit | runtime }\n");
pr_err(" devlink port param show [DEV/PORT_INDEX name PARAMETER]\n");
pr_err(" devlink port health show [ DEV/PORT_INDEX reporter REPORTER_NAME ]\n");
pr_err(" devlink port add DEV/PORT_INDEX flavour FLAVOUR pfnum PFNUM [ sfnum SFNUM ]\n");
pr_err(" devlink port add DEV/PORT_INDEX flavour FLAVOUR pfnum PFNUM\n"
" [ sfnum SFNUM ][ controller CNUM ]\n");
pr_err(" devlink port del DEV/PORT_INDEX\n");
}
@ -4324,7 +4336,8 @@ static int __cmd_health_show(struct dl *dl, bool show_device, bool show_port);
static void cmd_port_add_help(void)
{
pr_err(" devlink port add { DEV | DEV/PORT_INDEX } flavour FLAVOUR pfnum PFNUM [ sfnum SFNUM ]\n");
pr_err(" devlink port add DEV/PORT_INDEX flavour FLAVOUR pfnum PFNUM\n"
" [ sfnum SFNUM ][ controller CNUM ]\n");
}
static int cmd_port_add(struct dl *dl)
@ -4342,7 +4355,7 @@ static int cmd_port_add(struct dl *dl)
err = dl_argv_parse_put(nlh, dl, DL_OPT_HANDLE | DL_OPT_HANDLEP |
DL_OPT_PORT_FLAVOUR | DL_OPT_PORT_PFNUMBER,
DL_OPT_PORT_SFNUMBER);
DL_OPT_PORT_SFNUMBER | DL_OPT_PORT_CONTROLLER);
if (err)
return err;

View File

@ -52,9 +52,13 @@ devlink-port \- devlink port configuration
.IR FLAVOUR " ]"
.RB "[ " pcipf
.IR PFNUMBER " ]"
.br
.RB "{ " pcisf
.IR SFNUMBER " }"
.br
.RB "[ " controller
.IR CNUM " ]"
.br
.ti -8
.B devlink port del
@ -174,6 +178,12 @@ Specifies sfnumber to assign to the device of the SF.
This field is optional for those devices which supports auto assignment of the
SF number.
.TP
.BR controller " { " controller " } "
Specifies controller number for which the SF port is created.
This field is optional. It is used only when SF port is created for the
external controller.
.ti -8
.SS devlink port function set - Set the port function attribute(s).
@ -327,6 +337,17 @@ devlink dev param set pci/0000:01:00.0/1 name internal_error_reset value true cm
.RS 4
Sets the parameter internal_error_reset of specified devlink port (#1) to true.
.RE
.PP
devlink port add pci/0000:06:00.0 flavour pcisf pfnum 0 sfnum 88 controller 1
.RS 4
Add a devlink port of flavour PCI SF on controller 1 which has PCI PF of number
0 with SF number 88. To make use of the function an example sequence is to add
a port, configure the function attribute and activate the function. Once
the function usage is completed, deactivate the function and finally delete
the port. When there is desire to reuse the port without deletion, it can be
reconfigured and activated again when function is in inactive state and
function's operational state is detached.
.RE
.SH SEE ALSO
.BR devlink (8),