From nobody Fri Apr 3 19:09:26 2026 Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2BB63D348C; Mon, 23 Mar 2026 17:41:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=198.175.65.16 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774287686; cv=none; b=EDENYE2fhnq5l8kAy9mh3vzLoL79D3+bxTep+dhY1WSxnQoDYwHdaLNw3GUI6UZq7HGHdA6Mew37W+lxiXs2+MWU5lN4IQViwaL7VgvLWR59/zQrh58/Jhny1ASjYklJbQFLZ7V3B0Th89x42NIQjomRuIi6SGSkUQOB5hWsdEM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774287686; c=relaxed/simple; bh=N+j5bFBQG7IVgb+U+Km1XXCsm7Ik726163g4RGJlU5w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tR6bIyIP6YKK1w0pb29gIqZaX6dLWF0AG05piDJ5gQOBJgUupUL5qq5bGzkIwrxeuLyvk28Tm9Ub1xpbSMUbktAgejwHcIGWxtLBqFOE45fhAd5fl1uk9Y0XzJ4ookzJScbxQEfTP5aKwkPOjy9aGKv7Vc73oXzoaj0o/1NZvGY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=aMPBQPza; arc=none smtp.client-ip=198.175.65.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="aMPBQPza" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1774287685; x=1805823685; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=N+j5bFBQG7IVgb+U+Km1XXCsm7Ik726163g4RGJlU5w=; b=aMPBQPzamGtaJIDKiTdBWOkSRXmSajUAHgeuS+EPgVuWZil6Zb65fI0U 8FR4vDMyncE9CK1mGvHUJDMIxCHV3FCz+LMdoomMtFszmQUdZbmJpHwFh mHpjQ4p7ZraE2qa+2Zn3LQBP5d5Lh4WjFrFfPgS9diHJS0lUFjEOywUyy Hf98TSoXEzCkLKTIDaAxlNzNkq2LlmqNUhTJge4bHUoBgPFtvN6Qct5Nc +bkSurSQQ4kn5XeNVD46n+qH7JIF0MVIrBdKyYDo45b+zFd3X6DxAmPyD t9nadQJJ9i8sd+hw6EFCyXHl07D0zrYIvWiBQGqWpHFU8xJ3CJfY2c6YL g==; X-CSE-ConnectionGUID: Y+hPU3SUTa6Cq/ybdMyN/Q== X-CSE-MsgGUID: TIrhoBsITUuLoS3ZGwIuog== X-IronPort-AV: E=McAfee;i="6800,10657,11738"; a="75484779" X-IronPort-AV: E=Sophos;i="6.23,137,1770624000"; d="scan'208";a="75484779" Received: from orviesa004.jf.intel.com ([10.64.159.144]) by orvoesa108.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Mar 2026 10:41:24 -0700 X-CSE-ConnectionGUID: TTk9+pwCRKWlKp9c48YfDQ== X-CSE-MsgGUID: feJgLBwsTZebLgK6AOC9fg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.23,137,1770624000"; d="scan'208";a="228576881" Received: from irvmail002.ir.intel.com ([10.43.11.120]) by orviesa004.jf.intel.com with ESMTP; 23 Mar 2026 10:41:19 -0700 Received: from mglak.igk.intel.com (mglak.igk.intel.com [10.237.112.146]) by irvmail002.ir.intel.com (Postfix) with ESMTP id 04F3232C8B; Mon, 23 Mar 2026 17:41:16 +0000 (GMT) From: Larysa Zaremba To: intel-wired-lan@lists.osuosl.org, Tony Nguyen Cc: aleksander.lobakin@intel.com, sridhar.samudrala@intel.com, "Singhai, Anjali" , Michal Swiatkowski , Larysa Zaremba , "Fijalkowski, Maciej" , Emil Tantilov , Madhu Chittim , Josh Hay , "Keller, Jacob E" , jayaprakash.shanmugam@intel.com, Jiri Pirko , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Jonathan Corbet , Richard Cochran , Przemek Kitszel , Andrew Lunn , netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH iwl-next v6 14/14] ixd: add devlink support Date: Mon, 23 Mar 2026 18:40:45 +0100 Message-ID: <20260323174052.5355-15-larysa.zaremba@intel.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20260323174052.5355-1-larysa.zaremba@intel.com> References: <20260323174052.5355-1-larysa.zaremba@intel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Amritha Nambiar Enable initial support for the devlink interface with the ixd driver. The ixd hardware is a single function PCIe device. So, the PCIe adapter gets its own devlink instance to manage device-wide resources or configuration. $ devlink dev show pci/0000:83:00.6 $ devlink dev info pci/0000:83:00.6 pci/0000:83:00.6: driver ixd serial_number 00-a0-c9-ff-ff-23-45-67 versions: fixed: device.type MEV running: virtchnl 2.0 Signed-off-by: Amritha Nambiar Reviewed-by: Michal Swiatkowski Reviewed-by: Maciej Fijalkowski Reviewed-by: Przemek Kitszel Signed-off-by: Larysa Zaremba Tested-by: Bharath R Signed-off-by: Tony Nguyen --- Documentation/networking/devlink/index.rst | 1 + Documentation/networking/devlink/ixd.rst | 30 ++++++ drivers/net/ethernet/intel/ixd/Kconfig | 1 + drivers/net/ethernet/intel/ixd/Makefile | 1 + drivers/net/ethernet/intel/ixd/ixd_devlink.c | 97 ++++++++++++++++++++ drivers/net/ethernet/intel/ixd/ixd_devlink.h | 44 +++++++++ drivers/net/ethernet/intel/ixd/ixd_main.c | 16 +++- 7 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 Documentation/networking/devlink/ixd.rst create mode 100644 drivers/net/ethernet/intel/ixd/ixd_devlink.c create mode 100644 drivers/net/ethernet/intel/ixd/ixd_devlink.h diff --git a/Documentation/networking/devlink/index.rst b/Documentation/net= working/devlink/index.rst index f7ba7dcf477d..f0c077843fa7 100644 --- a/Documentation/networking/devlink/index.rst +++ b/Documentation/networking/devlink/index.rst @@ -88,6 +88,7 @@ parameters, info versions, and other features it supports. ionic iosm ixgbe + ixd kvaser_pciefd kvaser_usb mlx4 diff --git a/Documentation/networking/devlink/ixd.rst b/Documentation/netwo= rking/devlink/ixd.rst new file mode 100644 index 000000000000..17b63c8425aa --- /dev/null +++ b/Documentation/networking/devlink/ixd.rst @@ -0,0 +1,30 @@ +.. SPDX-License-Identifier: GPL-2.0 + +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +ixd devlink support +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +This document describes the devlink features implemented by the ``ixd`` +device driver. + +Info versions +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The ``ixd`` driver reports the following versions + +.. list-table:: devlink info versions implemented + :widths: 5 5 5 90 + + * - Name + - Type + - Example + - Description + * - ``device.type`` + - fixed + - MEV + - The hardware type for this device + * - ``virtchnl`` + - running + - 2.0 + - 2-digit version number (major.minor) of the communication channel + (virtchnl) used by the device. diff --git a/drivers/net/ethernet/intel/ixd/Kconfig b/drivers/net/ethernet/= intel/ixd/Kconfig index 24510c50070e..34181c59dcdc 100644 --- a/drivers/net/ethernet/intel/ixd/Kconfig +++ b/drivers/net/ethernet/intel/ixd/Kconfig @@ -7,6 +7,7 @@ config IXD select LIBETH select LIBIE_CP select LIBIE_PCI + select NET_DEVLINK help This driver supports Intel(R) Control Plane PCI Function of Intel E2100 and later IPUs and FNICs. diff --git a/drivers/net/ethernet/intel/ixd/Makefile b/drivers/net/ethernet= /intel/ixd/Makefile index 90abf231fb16..03760a2580b9 100644 --- a/drivers/net/ethernet/intel/ixd/Makefile +++ b/drivers/net/ethernet/intel/ixd/Makefile @@ -8,5 +8,6 @@ obj-$(CONFIG_IXD) +=3D ixd.o ixd-y :=3D ixd_main.o ixd-y +=3D ixd_ctlq.o ixd-y +=3D ixd_dev.o +ixd-y +=3D ixd_devlink.o ixd-y +=3D ixd_lib.o ixd-y +=3D ixd_virtchnl.o diff --git a/drivers/net/ethernet/intel/ixd/ixd_devlink.c b/drivers/net/eth= ernet/intel/ixd/ixd_devlink.c new file mode 100644 index 000000000000..23ab11226978 --- /dev/null +++ b/drivers/net/ethernet/intel/ixd/ixd_devlink.c @@ -0,0 +1,97 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025, Intel Corporation. */ + +#include "ixd.h" +#include "ixd_devlink.h" + +#define IXD_DEVLINK_INFO_LEN 128 + +/** + * ixd_fill_dsn - Get the serial number for the ixd device + * @adapter: adapter to query + * @buf: storage buffer for the info request + */ +static void ixd_fill_dsn(struct ixd_adapter *adapter, char *buf) +{ + u8 dsn[8]; + + /* Copy the DSN into an array in Big Endian format */ + put_unaligned_be64(pci_get_dsn(adapter->cp_ctx.mmio_info.pdev), dsn); + + snprintf(buf, IXD_DEVLINK_INFO_LEN, "%8phD", dsn); +} + +/** + * ixd_fill_device_name - Get the name of the underlying hardware + * @adapter: adapter to query + * @buf: storage buffer for the info request + * @buf_size: size of the storage buffer + */ +static void ixd_fill_device_name(struct ixd_adapter *adapter, char *buf, + size_t buf_size) +{ + if (adapter->caps.device_type =3D=3D cpu_to_le32(VIRTCHNL2_MEV_DEVICE)) + snprintf(buf, buf_size, "%s", "MEV"); + else + snprintf(buf, buf_size, "%s", "UNKNOWN"); +} + +/** + * ixd_devlink_info_get - .info_get devlink handler + * @devlink: devlink instance structure + * @req: the devlink info request + * @extack: extended netdev ack structure + * + * Callback for the devlink .info_get operation. Reports information about= the + * device. + * + * Return: zero on success or an error code on failure. + */ +static int ixd_devlink_info_get(struct devlink *devlink, + struct devlink_info_req *req, + struct netlink_ext_ack *extack) +{ + struct ixd_adapter *adapter =3D devlink_priv(devlink); + char buf[IXD_DEVLINK_INFO_LEN]; + int err; + + ixd_fill_dsn(adapter, buf); + err =3D devlink_info_serial_number_put(req, buf); + if (err) + return err; + + ixd_fill_device_name(adapter, buf, IXD_DEVLINK_INFO_LEN); + err =3D devlink_info_version_fixed_put(req, "device.type", buf); + if (err) + return err; + + snprintf(buf, sizeof(buf), "%u.%u", + adapter->vc_ver.major, adapter->vc_ver.minor); + + return devlink_info_version_running_put(req, "virtchnl", buf); +} + +static const struct devlink_ops ixd_devlink_ops =3D { + .info_get =3D ixd_devlink_info_get, +}; + +/** + * ixd_adapter_alloc - Allocate devlink and return adapter pointer + * @dev: the device to allocate for + * + * Allocate a devlink instance for this device and return the private area= as + * the adapter structure. + * + * Return: adapter structure on success, NULL on failure + */ +struct ixd_adapter *ixd_adapter_alloc(struct device *dev) +{ + struct devlink *devlink; + + devlink =3D devlink_alloc(&ixd_devlink_ops, sizeof(struct ixd_adapter), + dev); + if (!devlink) + return NULL; + + return devlink_priv(devlink); +} diff --git a/drivers/net/ethernet/intel/ixd/ixd_devlink.h b/drivers/net/eth= ernet/intel/ixd/ixd_devlink.h new file mode 100644 index 000000000000..c43ce0655de2 --- /dev/null +++ b/drivers/net/ethernet/intel/ixd/ixd_devlink.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2025, Intel Corporation. */ + +#ifndef _IXD_DEVLINK_H_ +#define _IXD_DEVLINK_H_ +#include + +struct ixd_adapter *ixd_adapter_alloc(struct device *dev); + +/** + * ixd_devlink_free - teardown the devlink + * @adapter: the adapter structure to free + * + */ +static inline void ixd_devlink_free(struct ixd_adapter *adapter) +{ + struct devlink *devlink =3D priv_to_devlink(adapter); + + devlink_free(devlink); +} + +/** + * ixd_devlink_unregister - Unregister devlink resources for this adapter. + * @adapter: the adapter structure to cleanup + * + * Releases resources used by devlink and cleans up associated memory. + */ +static inline void ixd_devlink_unregister(struct ixd_adapter *adapter) +{ + devlink_unregister(priv_to_devlink(adapter)); +} + +/** + * ixd_devlink_register - Register devlink interface for this adapter + * @adapter: pointer to ixd adapter structure to be associated with devlink + * + * Register the devlink instance associated with this adapter + */ +static inline void ixd_devlink_register(struct ixd_adapter *adapter) +{ + devlink_register(priv_to_devlink(adapter)); +} + +#endif /* _IXD_DEVLINK_H_ */ diff --git a/drivers/net/ethernet/intel/ixd/ixd_main.c b/drivers/net/ethern= et/intel/ixd/ixd_main.c index 6d5e6aca77df..ea6aa793a6a7 100644 --- a/drivers/net/ethernet/intel/ixd/ixd_main.c +++ b/drivers/net/ethernet/intel/ixd/ixd_main.c @@ -4,6 +4,7 @@ #include "ixd.h" #include "ixd_ctlq.h" #include "ixd_lan_regs.h" +#include "ixd_devlink.h" =20 MODULE_DESCRIPTION("Intel(R) Control Plane Function Device Driver"); MODULE_IMPORT_NS("LIBIE_CP"); @@ -21,11 +22,14 @@ static void ixd_remove(struct pci_dev *pdev) /* Do not mix removal with (re)initialization */ cancel_delayed_work_sync(&adapter->init_task.init_work); =20 + ixd_devlink_unregister(adapter); + /* Leave the device clean on exit */ ixd_trigger_reset(adapter); ixd_deinit_dflt_mbx(adapter); =20 libie_pci_unmap_all_mmio_regions(&adapter->cp_ctx.mmio_info); + ixd_devlink_free(adapter); } =20 /** @@ -93,7 +97,7 @@ static int ixd_probe(struct pci_dev *pdev, const struct p= ci_device_id *ent) if (WARN_ON(ent->device !=3D IXD_DEV_ID_CPF)) return -EINVAL; =20 - adapter =3D devm_kzalloc(&pdev->dev, sizeof(*adapter), GFP_KERNEL); + adapter =3D ixd_adapter_alloc(&pdev->dev); if (!adapter) return -ENOMEM; =20 @@ -102,13 +106,13 @@ static int ixd_probe(struct pci_dev *pdev, const stru= ct pci_device_id *ent) =20 err =3D libie_pci_init_dev(pdev); if (err) - return err; + goto free_adapter; =20 pci_set_drvdata(pdev, adapter); =20 err =3D ixd_iomap_regions(adapter); if (err) - return err; + goto free_adapter; =20 INIT_DELAYED_WORK(&adapter->init_task.init_work, ixd_init_task); @@ -118,7 +122,13 @@ static int ixd_probe(struct pci_dev *pdev, const struc= t pci_device_id *ent) queue_delayed_work(system_unbound_wq, &adapter->init_task.init_work, msecs_to_jiffies(500)); =20 + ixd_devlink_register(adapter); + return 0; + +free_adapter: + ixd_devlink_free(adapter); + return err; } =20 static const struct pci_device_id ixd_pci_tbl[] =3D { --=20 2.47.0