xref: /linux/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c (revision a0285236ab93fdfdd1008afaa04561d142d6c276)
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