ixd: add basic driver framework for Intel(R) Control Plane Function

Add module register and probe functionality. Add the required support to
register IXD PCI driver, as well as probe, remove and shutdown callbacks.
Enable the PCI device and request to reserve the memory resources that will
be used by the driver. Finally map the BAR0 address space.

For now, use devm_kzalloc() to allocate adapter, as it requires the least
amount of code. In a later commit, it will be replaced with a devlink
alternative.

Co-developed-by: Amritha Nambiar <amritha.nambiar@intel.com>
Signed-off-by: Amritha Nambiar <amritha.nambiar@intel.com>
Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
Tested-by: Bharath R <Bharath.r@intel.com>
Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
Larysa Zaremba 2026-06-25 18:02:06 +02:00 committed by Tony Nguyen
parent 1150ca4085
commit bea44e3892
9 changed files with 231 additions and 0 deletions

View File

@ -35,6 +35,7 @@ Contents:
intel/idpf
intel/igb
intel/igbvf
intel/ixd
intel/ixgbe
intel/ixgbevf
intel/i40e

View File

@ -0,0 +1,39 @@
.. SPDX-License-Identifier: GPL-2.0+
==========================================================================
iXD Linux* Base Driver for the Intel(R) Control Plane Function
==========================================================================
Intel iXD Linux driver.
Copyright(C) 2025 Intel Corporation.
.. contents::
For questions related to hardware requirements, refer to the documentation
supplied with your Intel adapter. All hardware requirements listed apply to use
with Linux.
Identifying Your Adapter
========================
For information on how to identify your adapter, and for the latest Intel
network drivers, refer to the Intel Support website:
http://www.intel.com/support
Support
=======
For general information, go to the Intel support website at:
http://www.intel.com/support/
If an issue is identified with the released source code on a supported kernel
with a supported adapter, email the specific information related to the issue
to intel-wired-lan@lists.osuosl.org.
Trademarks
==========
Intel is a trademark or registered trademark of Intel Corporation or its
subsidiaries in the United States and/or other countries.
* Other names and brands may be claimed as the property of others.

View File

@ -398,4 +398,6 @@ config IGC_LEDS
source "drivers/net/ethernet/intel/idpf/Kconfig"
source "drivers/net/ethernet/intel/ixd/Kconfig"
endif # NET_VENDOR_INTEL

View File

@ -19,3 +19,4 @@ obj-$(CONFIG_IAVF) += iavf/
obj-$(CONFIG_FM10K) += fm10k/
obj-$(CONFIG_ICE) += ice/
obj-$(CONFIG_IDPF) += idpf/
obj-$(CONFIG_IXD) += ixd/

View File

@ -0,0 +1,12 @@
# SPDX-License-Identifier: GPL-2.0-only
# Copyright (C) 2025 Intel Corporation
config IXD
tristate "Intel(R) Control Plane Function Support"
depends on PCI_MSI
select LIBIE_PCI
help
This driver supports Intel(R) Control Plane PCI Function
of Intel E2100 and later IPUs and FNICs.
It facilitates a centralized control over multiple IDPF PFs/VFs/SFs
exposed by the same card.

View File

@ -0,0 +1,8 @@
# SPDX-License-Identifier: GPL-2.0-only
# Copyright (C) 2025 Intel Corporation
# Intel(R) Control Plane Function Linux Driver
obj-$(CONFIG_IXD) += ixd.o
ixd-y := ixd_main.o

View File

@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2025 Intel Corporation */
#ifndef _IXD_H_
#define _IXD_H_
#include <linux/net/intel/libie/pci.h>
/**
* struct ixd_adapter - Data structure representing a CPF
* @hw: Device access data
*/
struct ixd_adapter {
struct libie_mmio_info hw;
};
/**
* ixd_to_dev - Get the corresponding device struct from an adapter
* @adapter: PCI device driver-specific private data
*
* Return: struct device corresponding to the given adapter
*/
static inline struct device *ixd_to_dev(struct ixd_adapter *adapter)
{
return &adapter->hw.pdev->dev;
}
#endif /* _IXD_H_ */

View File

@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2025 Intel Corporation */
#ifndef _IXD_LAN_REGS_H_
#define _IXD_LAN_REGS_H_
/* Control Plane Function PCI ID */
#define IXD_DEV_ID_CPF 0x1efe
/* Control Queue (Mailbox) */
#define PF_FW_MBX_REG_LEN 4096
#define PF_FW_MBX 0x08400000
/* Reset registers */
#define PFGEN_RTRIG_REG_LEN 2048
#define PFGEN_RTRIG 0x08407000 /* Device resets */
/**
* struct ixd_bar_region - BAR region description
* @offset: BAR region offset
* @size: BAR region size
*/
struct ixd_bar_region {
resource_size_t offset;
resource_size_t size;
};
#endif /* _IXD_LAN_REGS_H_ */

View File

@ -0,0 +1,112 @@
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (C) 2025 Intel Corporation */
#include "ixd.h"
#include "ixd_lan_regs.h"
MODULE_DESCRIPTION("Intel(R) Control Plane Function Device Driver");
MODULE_IMPORT_NS("LIBIE_PCI");
MODULE_LICENSE("GPL");
/**
* ixd_remove - remove a CPF PCI device
* @pdev: PCI device being removed
*/
static void ixd_remove(struct pci_dev *pdev)
{
struct ixd_adapter *adapter = pci_get_drvdata(pdev);
libie_pci_unmap_all_mmio_regions(&adapter->hw);
}
/**
* ixd_shutdown - shut down a CPF PCI device
* @pdev: PCI device being shut down
*/
static void ixd_shutdown(struct pci_dev *pdev)
{
ixd_remove(pdev);
if (system_state == SYSTEM_POWER_OFF)
pci_set_power_state(pdev, PCI_D3hot);
}
/**
* ixd_iomap_regions - iomap PCI BARs
* @adapter: adapter to map memory regions for
*
* Returns: %0 on success, negative on failure
*/
static int ixd_iomap_regions(struct ixd_adapter *adapter)
{
const struct ixd_bar_region regions[] = {
{
.offset = PFGEN_RTRIG,
.size = PFGEN_RTRIG_REG_LEN,
},
{
.offset = PF_FW_MBX,
.size = PF_FW_MBX_REG_LEN,
},
};
for (int i = 0; i < ARRAY_SIZE(regions); i++) {
struct libie_mmio_info *mmio_info = &adapter->hw;
bool map_ok;
map_ok = libie_pci_map_mmio_region(mmio_info,
regions[i].offset,
regions[i].size);
if (!map_ok) {
dev_err(ixd_to_dev(adapter),
"Failed to map PCI device MMIO region\n");
libie_pci_unmap_all_mmio_regions(mmio_info);
return -EIO;
}
}
return 0;
}
/**
* ixd_probe - probe a CPF PCI device
* @pdev: corresponding PCI device
* @ent: entry in ixd_pci_tbl
*
* Returns: %0 on success, negative errno code on failure
*/
static int ixd_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
struct ixd_adapter *adapter;
int err;
adapter = devm_kzalloc(&pdev->dev, sizeof(*adapter), GFP_KERNEL);
if (!adapter)
return -ENOMEM;
adapter->hw.pdev = pdev;
INIT_LIST_HEAD(&adapter->hw.mmio_list);
err = libie_pci_init_dev(pdev);
if (err)
return err;
pci_set_drvdata(pdev, adapter);
return ixd_iomap_regions(adapter);
}
static const struct pci_device_id ixd_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, IXD_DEV_ID_CPF) },
{ }
};
MODULE_DEVICE_TABLE(pci, ixd_pci_tbl);
static struct pci_driver ixd_driver = {
.name = KBUILD_MODNAME,
.id_table = ixd_pci_tbl,
.probe = ixd_probe,
.remove = ixd_remove,
.shutdown = ixd_shutdown,
};
module_pci_driver(ixd_driver);