Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Copyright (C) 2021 Intel Corporation

TARGETS := idpf auxiliary
VERSION := 1.0.1
VERSION := 1.0.2

# Shortcut version target
ifneq ($(filter version,${MAKECMDGOALS}),)
Expand Down
2 changes: 1 addition & 1 deletion idpf.spec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Name: idpf
Summary: Infrastructure Data Path Function Linux Driver
Version: 1.0.1
Version: 1.0.2
Release: 1
Source: %{name}-%{version}.tar.gz
Vendor: Intel Corporation
Expand Down
2 changes: 1 addition & 1 deletion idpf/src/idpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ struct idpf_rss_data;
#endif /* CONFIG_IOMMU_BYPASS */

#define IDPF_DRV_NAME "idpf"
#define IDPF_DRV_VER "1.0.1"
#define IDPF_DRV_VER "1.0.2"

#define IDPF_M(m, s) ((m) << (s))

Expand Down
150 changes: 116 additions & 34 deletions idpf/src/idpf_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,16 @@
#include "kcompat.h"
#include <linux/aer.h>
#include "idpf.h"
#include "idpf_lan_vf_regs.h"
#include "idpf_virtchnl.h"

#define DRV_SUMMARY "Intel(R) Infrastructure Data Path Function Linux Driver"

#define IDPF_NETWORK_ETHERNET_PROGIF 0x01
#define IDPF_CLASS_NETWORK_ETHERNET_PROGIF \
(PCI_CLASS_NETWORK_ETHERNET << 8 | IDPF_NETWORK_ETHERNET_PROGIF)
#define IDPF_VF_TEST_VAL 0xfeed0000u

MODULE_VERSION(IDPF_DRV_VER);
static const char idpf_driver_string[] = DRV_SUMMARY;
static const char idpf_copyright[] = "Copyright (C) 2019-2025 Intel Corporation";
Expand Down Expand Up @@ -276,6 +283,105 @@ static int idpf_cfg_hw(struct idpf_adapter *adapter)
static struct lock_class_key idpf_pf_vport_init_lock_key;
static struct lock_class_key idpf_pf_work_lock_key;

/**
* idpf_get_device_type - Helper to find if it is a VF or PF device
* @pdev: PCI device information struct
*
* Return: PF/VF or -%errno on failure.
*/
static int idpf_get_device_type(struct pci_dev *pdev)
{
void __iomem *addr;
int ret;

addr = ioremap(pci_resource_start(pdev, 0) + VF_ARQBAL, 4);
if (!addr) {
pci_err(pdev, "Failed to allocate BAR0 mbx region\n");
return -EIO;
}

writel(IDPF_VF_TEST_VAL, addr);
if (readl(addr) == IDPF_VF_TEST_VAL)
ret = IDPF_DEV_ID_VF;
else
ret = IDPF_DEV_ID_PF;

iounmap(addr);

return ret;
}

/**
* idpf_dev_init - Initialize device specific parameters
* @adapter: adapter to initialize
* @ent: entry in idpf_pci_tbl
*
* Return: %0 on success, -%errno on failure.
*/
static int idpf_dev_init(struct idpf_adapter *adapter,
const struct pci_device_id *ent)
{
int ret;

switch (ent->device) {
case IDPF_DEV_ID_VF_SIOV:
idpf_vf_dev_ops_init(adapter);
return 0;
case IDPF_DEV_ID_PF_SIMICS:
idpf_dev_ops_init(adapter);
lockdep_set_class(&adapter->vport_init_lock,
&idpf_pf_vport_init_lock_key);
lockdep_init_map(&adapter->vc_event_task.work.lockdep_map,
"idpf-PF-simics-vc-work", &idpf_pf_work_lock_key, 0);
return 0;
case IDPF_DEV_ID_VF_SIMICS:
idpf_vf_dev_ops_init(adapter);
return 0;
default:
break;
}

if (ent->class == IDPF_CLASS_NETWORK_ETHERNET_PROGIF) {
ret = idpf_get_device_type(adapter->pdev);
switch (ret) {
case IDPF_DEV_ID_VF:
idpf_vf_dev_ops_init(adapter);
adapter->crc_enable = true;
break;
case IDPF_DEV_ID_PF:
idpf_dev_ops_init(adapter);
lockdep_set_class(&adapter->vport_init_lock,
&idpf_pf_vport_init_lock_key);
lockdep_init_map(&adapter->vc_event_task.work.lockdep_map,
"idpf-PF-vc-work",
&idpf_pf_work_lock_key, 0);
break;
default:
return ret;
}

return 0;
}

switch (ent->device) {
case IDPF_DEV_ID_PF:
idpf_dev_ops_init(adapter);
lockdep_set_class(&adapter->vport_init_lock,
&idpf_pf_vport_init_lock_key);
lockdep_init_map(&adapter->vc_event_task.work.lockdep_map,
"idpf-PF-vc-work", &idpf_pf_work_lock_key, 0);
break;
case IDPF_DEV_ID_VF:
idpf_vf_dev_ops_init(adapter);
adapter->crc_enable = true;
break;
default:
return -ENODEV;
}

return 0;
}

/**
* idpf_probe - Device initialization routine
* @pdev: PCI device information struct
Expand Down Expand Up @@ -337,38 +443,6 @@ static int idpf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
INIT_DELAYED_WORK(&adapter->stats_task, idpf_statistics_task);
INIT_DELAYED_WORK(&adapter->vc_event_task, idpf_vc_event_task);

switch (ent->device) {
case IDPF_DEV_ID_PF:
idpf_dev_ops_init(adapter);
lockdep_set_class(&adapter->vport_init_lock,
&idpf_pf_vport_init_lock_key);
lockdep_init_map(&adapter->vc_event_task.work.lockdep_map,
"idpf-PF-vc-work", &idpf_pf_work_lock_key, 0);
break;
case IDPF_DEV_ID_VF:
idpf_vf_dev_ops_init(adapter);
adapter->crc_enable = true;
break;
case IDPF_DEV_ID_VF_SIOV:
idpf_vf_dev_ops_init(adapter);
break;
case IDPF_DEV_ID_PF_SIMICS:
idpf_dev_ops_init(adapter);
lockdep_set_class(&adapter->vport_init_lock,
&idpf_pf_vport_init_lock_key);
lockdep_init_map(&adapter->vc_event_task.work.lockdep_map,
"idpf-PF-simics-vc-work", &idpf_pf_work_lock_key, 0);
break;
case IDPF_DEV_ID_VF_SIMICS:
idpf_vf_dev_ops_init(adapter);
break;
default:
err = -ENODEV;
dev_err(&pdev->dev, "Unexpected dev ID 0x%x in idpf probe\n",
ent->device);
goto err_free;
}

if (!adapter->drv_name) {
dev_err(dev, "Invalid configuration, no drv_name given\n");
err = -EINVAL;
Expand Down Expand Up @@ -487,11 +561,18 @@ static int idpf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
/* setup msglvl */
adapter->msg_enable = netif_msg_init(-1, IDPF_AVAIL_NETIF_M);

err = idpf_dev_init(adapter, ent);
if (err) {
dev_err(&pdev->dev, "Unexpected dev ID 0x%x in idpf probe\n",
ent->device);
goto destroy_vc_event_wq;
}

err = idpf_cfg_hw(adapter);
if (err) {
dev_err(dev, "Failed to configure HW structure for adapter: %d\n",
err);
goto err_cfg_hw;
goto destroy_vc_event_wq;
}

#if IS_ENABLED(CONFIG_VFIO_MDEV) && defined(HAVE_PASID_SUPPORT)
Expand All @@ -510,7 +591,7 @@ static int idpf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
#endif /* DEVLINK_ENABLED */
return 0;

err_cfg_hw:
destroy_vc_event_wq:
destroy_workqueue(adapter->vc_event_wq);
err_vc_event_wq_alloc:
if (IS_SILICON_DEVICE(adapter->hw.subsystem_device_id))
Expand Down Expand Up @@ -785,6 +866,7 @@ static const struct pci_device_id idpf_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, IDPF_DEV_ID_VF_SIOV) },
{ PCI_VDEVICE(INTEL, IDPF_DEV_ID_PF_SIMICS) },
{ PCI_VDEVICE(INTEL, IDPF_DEV_ID_VF_SIMICS) },
{ PCI_DEVICE_CLASS(IDPF_CLASS_NETWORK_ETHERNET_PROGIF, ~0)},
{ /* Sentinel */ }
};
MODULE_DEVICE_TABLE(pci, idpf_pci_tbl);
Expand Down