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