xref: /linux/drivers/net/ethernet/intel/ixd/ixd_devlink.c (revision 91ec2035134982b98fab0609a9fd8480e8217dc1)
1*f290d48fSAmritha Nambiar // SPDX-License-Identifier: GPL-2.0
2*f290d48fSAmritha Nambiar /* Copyright (c) 2025, Intel Corporation. */
3*f290d48fSAmritha Nambiar 
4*f290d48fSAmritha Nambiar #include "ixd.h"
5*f290d48fSAmritha Nambiar #include "ixd_devlink.h"
6*f290d48fSAmritha Nambiar 
7*f290d48fSAmritha Nambiar #define IXD_DEVLINK_INFO_LEN	128
8*f290d48fSAmritha Nambiar 
9*f290d48fSAmritha Nambiar /**
10*f290d48fSAmritha Nambiar  * ixd_fill_dsn - Get the serial number for the ixd device
11*f290d48fSAmritha Nambiar  * @adapter: adapter to query
12*f290d48fSAmritha Nambiar  * @buf: storage buffer for the info request
13*f290d48fSAmritha Nambiar  */
ixd_fill_dsn(struct ixd_adapter * adapter,char * buf)14*f290d48fSAmritha Nambiar static void ixd_fill_dsn(struct ixd_adapter *adapter, char *buf)
15*f290d48fSAmritha Nambiar {
16*f290d48fSAmritha Nambiar 	u8 dsn[8];
17*f290d48fSAmritha Nambiar 
18*f290d48fSAmritha Nambiar 	/* Copy the DSN into an array in Big Endian format */
19*f290d48fSAmritha Nambiar 	put_unaligned_be64(pci_get_dsn(adapter->cp_ctx.mmio_info.pdev), dsn);
20*f290d48fSAmritha Nambiar 
21*f290d48fSAmritha Nambiar 	snprintf(buf, IXD_DEVLINK_INFO_LEN, "%8phD", dsn);
22*f290d48fSAmritha Nambiar }
23*f290d48fSAmritha Nambiar 
24*f290d48fSAmritha Nambiar /**
25*f290d48fSAmritha Nambiar  * ixd_fill_device_name - Get the name of the underlying hardware
26*f290d48fSAmritha Nambiar  * @adapter: adapter to query
27*f290d48fSAmritha Nambiar  * @buf: storage buffer for the info request
28*f290d48fSAmritha Nambiar  * @buf_size: size of the storage buffer
29*f290d48fSAmritha Nambiar  */
ixd_fill_device_name(struct ixd_adapter * adapter,char * buf,size_t buf_size)30*f290d48fSAmritha Nambiar static void ixd_fill_device_name(struct ixd_adapter *adapter, char *buf,
31*f290d48fSAmritha Nambiar 				 size_t buf_size)
32*f290d48fSAmritha Nambiar {
33*f290d48fSAmritha Nambiar 	if (adapter->caps.device_type == cpu_to_le32(VIRTCHNL2_MEV_DEVICE))
34*f290d48fSAmritha Nambiar 		snprintf(buf, buf_size, "%s", "MEV");
35*f290d48fSAmritha Nambiar 	else
36*f290d48fSAmritha Nambiar 		snprintf(buf, buf_size, "%s", "UNKNOWN");
37*f290d48fSAmritha Nambiar }
38*f290d48fSAmritha Nambiar 
39*f290d48fSAmritha Nambiar /**
40*f290d48fSAmritha Nambiar  * ixd_devlink_info_get - .info_get devlink handler
41*f290d48fSAmritha Nambiar  * @devlink: devlink instance structure
42*f290d48fSAmritha Nambiar  * @req: the devlink info request
43*f290d48fSAmritha Nambiar  * @extack: extended netdev ack structure
44*f290d48fSAmritha Nambiar  *
45*f290d48fSAmritha Nambiar  * Callback for the devlink .info_get operation. Reports information about the
46*f290d48fSAmritha Nambiar  * device.
47*f290d48fSAmritha Nambiar  *
48*f290d48fSAmritha Nambiar  * Return: zero on success or an error code on failure.
49*f290d48fSAmritha Nambiar  */
ixd_devlink_info_get(struct devlink * devlink,struct devlink_info_req * req,struct netlink_ext_ack * extack)50*f290d48fSAmritha Nambiar static int ixd_devlink_info_get(struct devlink *devlink,
51*f290d48fSAmritha Nambiar 				struct devlink_info_req *req,
52*f290d48fSAmritha Nambiar 				struct netlink_ext_ack *extack)
53*f290d48fSAmritha Nambiar {
54*f290d48fSAmritha Nambiar 	struct ixd_adapter *adapter = devlink_priv(devlink);
55*f290d48fSAmritha Nambiar 	char buf[IXD_DEVLINK_INFO_LEN];
56*f290d48fSAmritha Nambiar 	int err;
57*f290d48fSAmritha Nambiar 
58*f290d48fSAmritha Nambiar 	ixd_fill_dsn(adapter, buf);
59*f290d48fSAmritha Nambiar 	err = devlink_info_serial_number_put(req, buf);
60*f290d48fSAmritha Nambiar 	if (err)
61*f290d48fSAmritha Nambiar 		return err;
62*f290d48fSAmritha Nambiar 
63*f290d48fSAmritha Nambiar 	ixd_fill_device_name(adapter, buf, IXD_DEVLINK_INFO_LEN);
64*f290d48fSAmritha Nambiar 	err = devlink_info_version_fixed_put(req, "device.type", buf);
65*f290d48fSAmritha Nambiar 	if (err)
66*f290d48fSAmritha Nambiar 		return err;
67*f290d48fSAmritha Nambiar 
68*f290d48fSAmritha Nambiar 	snprintf(buf, sizeof(buf), "%u.%u",
69*f290d48fSAmritha Nambiar 		 adapter->vc_ver.major, adapter->vc_ver.minor);
70*f290d48fSAmritha Nambiar 
71*f290d48fSAmritha Nambiar 	return devlink_info_version_running_put(req,
72*f290d48fSAmritha Nambiar 						DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API,
73*f290d48fSAmritha Nambiar 						buf);
74*f290d48fSAmritha Nambiar }
75*f290d48fSAmritha Nambiar 
76*f290d48fSAmritha Nambiar static const struct devlink_ops ixd_devlink_ops = {
77*f290d48fSAmritha Nambiar 	.info_get = ixd_devlink_info_get,
78*f290d48fSAmritha Nambiar };
79*f290d48fSAmritha Nambiar 
80*f290d48fSAmritha Nambiar /**
81*f290d48fSAmritha Nambiar  * ixd_adapter_alloc - Allocate devlink and return adapter pointer
82*f290d48fSAmritha Nambiar  * @dev: the device to allocate for
83*f290d48fSAmritha Nambiar  *
84*f290d48fSAmritha Nambiar  * Allocate a devlink instance for this device and return the private area as
85*f290d48fSAmritha Nambiar  * the adapter structure.
86*f290d48fSAmritha Nambiar  *
87*f290d48fSAmritha Nambiar  * Return: adapter structure on success, NULL on failure
88*f290d48fSAmritha Nambiar  */
ixd_adapter_alloc(struct device * dev)89*f290d48fSAmritha Nambiar struct ixd_adapter *ixd_adapter_alloc(struct device *dev)
90*f290d48fSAmritha Nambiar {
91*f290d48fSAmritha Nambiar 	struct devlink *devlink;
92*f290d48fSAmritha Nambiar 
93*f290d48fSAmritha Nambiar 	devlink = devlink_alloc(&ixd_devlink_ops, sizeof(struct ixd_adapter),
94*f290d48fSAmritha Nambiar 				dev);
95*f290d48fSAmritha Nambiar 	if (!devlink)
96*f290d48fSAmritha Nambiar 		return NULL;
97*f290d48fSAmritha Nambiar 
98*f290d48fSAmritha Nambiar 	return devlink_priv(devlink);
99*f290d48fSAmritha Nambiar }
100