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