1c6acd629SVladyslav Tarasiuk // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2c6acd629SVladyslav Tarasiuk /* Copyright (c) 2020, Mellanox Technologies inc.  All rights reserved. */
3c6acd629SVladyslav Tarasiuk 
4c6acd629SVladyslav Tarasiuk #include "en/devlink.h"
5*5a65d85dSRoi Dayan #include "eswitch.h"
6*5a65d85dSRoi Dayan 
7*5a65d85dSRoi Dayan static void
8*5a65d85dSRoi Dayan mlx5e_devlink_get_port_parent_id(struct mlx5_core_dev *dev, struct netdev_phys_item_id *ppid)
9*5a65d85dSRoi Dayan {
10*5a65d85dSRoi Dayan 	u64 parent_id;
11*5a65d85dSRoi Dayan 
12*5a65d85dSRoi Dayan 	parent_id = mlx5_query_nic_system_image_guid(dev);
13*5a65d85dSRoi Dayan 	ppid->id_len = sizeof(parent_id);
14*5a65d85dSRoi Dayan 	memcpy(ppid->id, &parent_id, sizeof(parent_id));
15*5a65d85dSRoi Dayan }
16c6acd629SVladyslav Tarasiuk 
1731e87b39SVladyslav Tarasiuk int mlx5e_devlink_port_register(struct mlx5e_priv *priv)
18c6acd629SVladyslav Tarasiuk {
1931e87b39SVladyslav Tarasiuk 	struct devlink *devlink = priv_to_devlink(priv->mdev);
2071ad8d55SDanielle Ratson 	struct devlink_port_attrs attrs = {};
21*5a65d85dSRoi Dayan 	struct netdev_phys_item_id ppid = {};
22*5a65d85dSRoi Dayan 	unsigned int dl_port_index;
23c6acd629SVladyslav Tarasiuk 
2471ad8d55SDanielle Ratson 	if (mlx5_core_is_pf(priv->mdev)) {
2571ad8d55SDanielle Ratson 		attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
2671ad8d55SDanielle Ratson 		attrs.phys.port_number = PCI_FUNC(priv->mdev->pdev->devfn);
27*5a65d85dSRoi Dayan 		if (MLX5_ESWITCH_MANAGER(priv->mdev)) {
28*5a65d85dSRoi Dayan 			mlx5e_devlink_get_port_parent_id(priv->mdev, &ppid);
29*5a65d85dSRoi Dayan 			memcpy(attrs.switch_id.id, ppid.id, ppid.id_len);
30*5a65d85dSRoi Dayan 			attrs.switch_id.id_len = ppid.id_len;
31*5a65d85dSRoi Dayan 		}
32*5a65d85dSRoi Dayan 		dl_port_index = mlx5_esw_vport_to_devlink_port_index(priv->mdev,
33*5a65d85dSRoi Dayan 								     MLX5_VPORT_UPLINK);
3471ad8d55SDanielle Ratson 	} else {
3571ad8d55SDanielle Ratson 		attrs.flavour = DEVLINK_PORT_FLAVOUR_VIRTUAL;
36*5a65d85dSRoi Dayan 		dl_port_index = mlx5_esw_vport_to_devlink_port_index(priv->mdev, 0);
3771ad8d55SDanielle Ratson 	}
3871ad8d55SDanielle Ratson 
3971ad8d55SDanielle Ratson 	devlink_port_attrs_set(&priv->dl_port, &attrs);
40162add8cSParav Pandit 
41*5a65d85dSRoi Dayan 	return devlink_port_register(devlink, &priv->dl_port, dl_port_index);
4231e87b39SVladyslav Tarasiuk }
4331e87b39SVladyslav Tarasiuk 
4431e87b39SVladyslav Tarasiuk void mlx5e_devlink_port_type_eth_set(struct mlx5e_priv *priv)
4531e87b39SVladyslav Tarasiuk {
4631e87b39SVladyslav Tarasiuk 	devlink_port_type_eth_set(&priv->dl_port, priv->netdev);
47c6acd629SVladyslav Tarasiuk }
48c6acd629SVladyslav Tarasiuk 
49162add8cSParav Pandit void mlx5e_devlink_port_unregister(struct mlx5e_priv *priv)
50c6acd629SVladyslav Tarasiuk {
51162add8cSParav Pandit 	devlink_port_unregister(&priv->dl_port);
52c6acd629SVladyslav Tarasiuk }
53c6acd629SVladyslav Tarasiuk 
54162add8cSParav Pandit struct devlink_port *mlx5e_get_devlink_port(struct net_device *dev)
55c6acd629SVladyslav Tarasiuk {
56c6acd629SVladyslav Tarasiuk 	struct mlx5e_priv *priv = netdev_priv(dev);
57c6acd629SVladyslav Tarasiuk 
58162add8cSParav Pandit 	return &priv->dl_port;
59c6acd629SVladyslav Tarasiuk }
60