Commit 98fd2d65 authored by Parav Pandit's avatar Parav Pandit Committed by David S. Miller

devlink: Introduce PCI PF port flavour and port attribute

In an eswitch, PCI PF may have port which is normally represented
using a representor netdevice.
To have better visibility of eswitch port, its association with
PF and a representor netdevice, introduce a PCI PF port
flavour and port attriute.

When devlink port flavour is PCI PF, fill up PCI PF attributes of the
port.

Extend port name creation using PCI PF number on best effort basis.
So that vendor drivers can skip defining their own scheme.

$ devlink port show
pci/0000:05:00.0/0: type eth netdev eth0 flavour pcipf pfnum 0
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a2c6b87d
...@@ -46,6 +46,10 @@ struct devlink_port_phys_attrs { ...@@ -46,6 +46,10 @@ struct devlink_port_phys_attrs {
u32 split_subport_number; u32 split_subport_number;
}; };
struct devlink_port_pci_pf_attrs {
u16 pf; /* Associated PCI PF for this port. */
};
struct devlink_port_attrs { struct devlink_port_attrs {
u8 set:1, u8 set:1,
split:1, split:1,
...@@ -54,6 +58,7 @@ struct devlink_port_attrs { ...@@ -54,6 +58,7 @@ struct devlink_port_attrs {
struct netdev_phys_item_id switch_id; struct netdev_phys_item_id switch_id;
union { union {
struct devlink_port_phys_attrs phys; struct devlink_port_phys_attrs phys;
struct devlink_port_pci_pf_attrs pci_pf;
}; };
}; };
...@@ -599,6 +604,9 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, ...@@ -599,6 +604,9 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
u32 split_subport_number, u32 split_subport_number,
const unsigned char *switch_id, const unsigned char *switch_id,
unsigned char switch_id_len); unsigned char switch_id_len);
void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port,
const unsigned char *switch_id,
unsigned char switch_id_len, u16 pf);
int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
u32 size, u16 ingress_pools_count, u32 size, u16 ingress_pools_count,
u16 egress_pools_count, u16 ingress_tc_count, u16 egress_pools_count, u16 ingress_tc_count,
......
...@@ -169,6 +169,10 @@ enum devlink_port_flavour { ...@@ -169,6 +169,10 @@ enum devlink_port_flavour {
DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture DEVLINK_PORT_FLAVOUR_DSA, /* Distributed switch architecture
* interconnect port. * interconnect port.
*/ */
DEVLINK_PORT_FLAVOUR_PCI_PF, /* Represents eswitch port for
* the PCI PF. It is an internal
* port that faces the PCI PF.
*/
}; };
enum devlink_param_cmode { enum devlink_param_cmode {
...@@ -337,6 +341,7 @@ enum devlink_attr { ...@@ -337,6 +341,7 @@ enum devlink_attr {
DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE, /* u64 */ DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE, /* u64 */
DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL, /* u64 */ DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL, /* u64 */
DEVLINK_ATTR_PORT_PCI_PF_NUMBER, /* u16 */
/* add new attributes above here, update the policy in devlink.c */ /* add new attributes above here, update the policy in devlink.c */
__DEVLINK_ATTR_MAX, __DEVLINK_ATTR_MAX,
......
...@@ -515,6 +515,11 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, ...@@ -515,6 +515,11 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg,
return 0; return 0;
if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour)) if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour))
return -EMSGSIZE; return -EMSGSIZE;
if (devlink_port->attrs.flavour == DEVLINK_PORT_FLAVOUR_PCI_PF) {
if (nla_put_u16(msg, DEVLINK_ATTR_PORT_PCI_PF_NUMBER,
attrs->pci_pf.pf))
return -EMSGSIZE;
}
if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PHYSICAL && if (devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_PHYSICAL &&
devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_CPU && devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_CPU &&
devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_DSA) devlink_port->attrs.flavour != DEVLINK_PORT_FLAVOUR_DSA)
...@@ -5801,6 +5806,32 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, ...@@ -5801,6 +5806,32 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
} }
EXPORT_SYMBOL_GPL(devlink_port_attrs_set); EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
/**
* devlink_port_attrs_pci_pf_set - Set PCI PF port attributes
*
* @devlink_port: devlink port
* @pf: associated PF for the devlink port instance
* @switch_id: if the port is part of switch, this is buffer with ID,
* otherwise this is NULL
* @switch_id_len: length of the switch_id buffer
*/
void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port,
const unsigned char *switch_id,
unsigned char switch_id_len, u16 pf)
{
struct devlink_port_attrs *attrs = &devlink_port->attrs;
int ret;
ret = __devlink_port_attrs_set(devlink_port,
DEVLINK_PORT_FLAVOUR_PCI_PF,
switch_id, switch_id_len);
if (ret)
return;
attrs->pci_pf.pf = pf;
}
EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_pf_set);
static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
char *name, size_t len) char *name, size_t len)
{ {
...@@ -5826,6 +5857,9 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, ...@@ -5826,6 +5857,9 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
*/ */
WARN_ON(1); WARN_ON(1);
return -EINVAL; return -EINVAL;
case DEVLINK_PORT_FLAVOUR_PCI_PF:
n = snprintf(name, len, "pf%u", attrs->pci_pf.pf);
break;
} }
if (n >= len) if (n >= len)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment