1*a0285236SJedrzej Jagielski // SPDX-License-Identifier: GPL-2.0 2*a0285236SJedrzej Jagielski /* Copyright (c) 2025, Intel Corporation. */ 3*a0285236SJedrzej Jagielski 4*a0285236SJedrzej Jagielski #include "ixgbe.h" 5*a0285236SJedrzej Jagielski #include "devlink.h" 6*a0285236SJedrzej Jagielski 7*a0285236SJedrzej Jagielski static const struct devlink_ops ixgbe_devlink_ops = { 8*a0285236SJedrzej Jagielski }; 9*a0285236SJedrzej Jagielski 10*a0285236SJedrzej Jagielski /** 11*a0285236SJedrzej Jagielski * ixgbe_allocate_devlink - Allocate devlink instance 12*a0285236SJedrzej Jagielski * @dev: device to allocate devlink for 13*a0285236SJedrzej Jagielski * 14*a0285236SJedrzej Jagielski * Allocate a devlink instance for this physical function. 15*a0285236SJedrzej Jagielski * 16*a0285236SJedrzej Jagielski * Return: pointer to the device adapter structure on success, 17*a0285236SJedrzej Jagielski * ERR_PTR(-ENOMEM) when allocation failed. 18*a0285236SJedrzej Jagielski */ 19*a0285236SJedrzej Jagielski struct ixgbe_adapter *ixgbe_allocate_devlink(struct device *dev) 20*a0285236SJedrzej Jagielski { 21*a0285236SJedrzej Jagielski struct ixgbe_adapter *adapter; 22*a0285236SJedrzej Jagielski struct devlink *devlink; 23*a0285236SJedrzej Jagielski 24*a0285236SJedrzej Jagielski devlink = devlink_alloc(&ixgbe_devlink_ops, sizeof(*adapter), dev); 25*a0285236SJedrzej Jagielski if (!devlink) 26*a0285236SJedrzej Jagielski return ERR_PTR(-ENOMEM); 27*a0285236SJedrzej Jagielski 28*a0285236SJedrzej Jagielski adapter = devlink_priv(devlink); 29*a0285236SJedrzej Jagielski adapter->devlink = devlink; 30*a0285236SJedrzej Jagielski 31*a0285236SJedrzej Jagielski return adapter; 32*a0285236SJedrzej Jagielski } 33*a0285236SJedrzej Jagielski 34*a0285236SJedrzej Jagielski /** 35*a0285236SJedrzej Jagielski * ixgbe_devlink_set_switch_id - Set unique switch ID based on PCI DSN 36*a0285236SJedrzej Jagielski * @adapter: pointer to the device adapter structure 37*a0285236SJedrzej Jagielski * @ppid: struct with switch id information 38*a0285236SJedrzej Jagielski */ 39*a0285236SJedrzej Jagielski static void ixgbe_devlink_set_switch_id(struct ixgbe_adapter *adapter, 40*a0285236SJedrzej Jagielski struct netdev_phys_item_id *ppid) 41*a0285236SJedrzej Jagielski { 42*a0285236SJedrzej Jagielski u64 id = pci_get_dsn(adapter->pdev); 43*a0285236SJedrzej Jagielski 44*a0285236SJedrzej Jagielski ppid->id_len = sizeof(id); 45*a0285236SJedrzej Jagielski put_unaligned_be64(id, &ppid->id); 46*a0285236SJedrzej Jagielski } 47*a0285236SJedrzej Jagielski 48*a0285236SJedrzej Jagielski /** 49*a0285236SJedrzej Jagielski * ixgbe_devlink_register_port - Register devlink port 50*a0285236SJedrzej Jagielski * @adapter: pointer to the device adapter structure 51*a0285236SJedrzej Jagielski * 52*a0285236SJedrzej Jagielski * Create and register a devlink_port for this physical function. 53*a0285236SJedrzej Jagielski * 54*a0285236SJedrzej Jagielski * Return: 0 on success, error code on failure. 55*a0285236SJedrzej Jagielski */ 56*a0285236SJedrzej Jagielski int ixgbe_devlink_register_port(struct ixgbe_adapter *adapter) 57*a0285236SJedrzej Jagielski { 58*a0285236SJedrzej Jagielski struct devlink_port *devlink_port = &adapter->devlink_port; 59*a0285236SJedrzej Jagielski struct devlink *devlink = adapter->devlink; 60*a0285236SJedrzej Jagielski struct device *dev = &adapter->pdev->dev; 61*a0285236SJedrzej Jagielski struct devlink_port_attrs attrs = {}; 62*a0285236SJedrzej Jagielski int err; 63*a0285236SJedrzej Jagielski 64*a0285236SJedrzej Jagielski attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL; 65*a0285236SJedrzej Jagielski attrs.phys.port_number = adapter->hw.bus.func; 66*a0285236SJedrzej Jagielski ixgbe_devlink_set_switch_id(adapter, &attrs.switch_id); 67*a0285236SJedrzej Jagielski 68*a0285236SJedrzej Jagielski devlink_port_attrs_set(devlink_port, &attrs); 69*a0285236SJedrzej Jagielski 70*a0285236SJedrzej Jagielski err = devl_port_register(devlink, devlink_port, 0); 71*a0285236SJedrzej Jagielski if (err) { 72*a0285236SJedrzej Jagielski dev_err(dev, 73*a0285236SJedrzej Jagielski "devlink port registration failed, err %d\n", err); 74*a0285236SJedrzej Jagielski } 75*a0285236SJedrzej Jagielski 76*a0285236SJedrzej Jagielski return err; 77*a0285236SJedrzej Jagielski } 78