* [PATCH] usertools/devbind: cleanup device type declarations
@ 2026-10-08 14:43 David Marchand
2026-10-08 14:53 ` Bruce Richardson
0 siblings, 1 reply; 3+ messages in thread
From: David Marchand @ 2026-10-08 14:43 UTC (permalink / raw)
To: dev; +Cc: thomas, Robin Jarry
Adding more device types has resulted in a nice chaotic order over time.
Introduce a single dictionary and group by types (keeping the original
order).
Sort match entries by class/vendor/device values.
The Sub Vendor and Sub Device fields are never populated, just drop
them.
Signed-off-by: David Marchand <david.marchand@redhat.com>
---
usertools/dpdk-devbind.py | 247 ++++++++++++++++----------------------
1 file changed, 105 insertions(+), 142 deletions(-)
diff --git a/usertools/dpdk-devbind.py b/usertools/dpdk-devbind.py
index e72f238aba..961094a42b 100755
--- a/usertools/dpdk-devbind.py
+++ b/usertools/dpdk-devbind.py
@@ -21,92 +21,91 @@
See FreeBSD Getting Started Guide for details on binding and unbinding devices.
"""
-# The PCI base class for all devices
-network_class = {'Class': '02', 'Vendor': None, 'Device': None,
- 'SVendor': None, 'SDevice': None}
-acceleration_class = {'Class': '12', 'Vendor': None, 'Device': None,
- 'SVendor': None, 'SDevice': None}
-ifpga_class = {'Class': '12', 'Vendor': '8086', 'Device': '0b30',
- 'SVendor': None, 'SDevice': None}
-encryption_class = {'Class': '10', 'Vendor': None, 'Device': None,
- 'SVendor': None, 'SDevice': None}
-intel_processor_class = {'Class': '0b', 'Vendor': '8086', 'Device': None,
- 'SVendor': None, 'SDevice': None}
-cavium_sso = {'Class': '08', 'Vendor': '177d', 'Device': 'a04b,a04d',
- 'SVendor': None, 'SDevice': None}
-cavium_fpa = {'Class': '08', 'Vendor': '177d', 'Device': 'a053',
- 'SVendor': None, 'SDevice': None}
-cavium_pkx = {'Class': '08', 'Vendor': '177d', 'Device': 'a0dd,a049',
- 'SVendor': None, 'SDevice': None}
-cavium_tim = {'Class': '08', 'Vendor': '177d', 'Device': 'a051',
- 'SVendor': None, 'SDevice': None}
-cavium_zip = {'Class': '12', 'Vendor': '177d', 'Device': 'a037',
- 'SVendor': None, 'SDevice': None}
-avp_vnic = {'Class': '05', 'Vendor': '1af4', 'Device': '1110',
- 'SVendor': None, 'SDevice': None}
-
-cnxk_bphy = {'Class': '08', 'Vendor': '177d', 'Device': 'a089',
- 'SVendor': None, 'SDevice': None}
-cnxk_bphy_cgx = {'Class': '08', 'Vendor': '177d', 'Device': 'a059,a060',
- 'SVendor': None, 'SDevice': None}
-cnxk_dma = {'Class': '08', 'Vendor': '177d', 'Device': 'a081',
- 'SVendor': None, 'SDevice': None}
-cnxk_inl_dev = {'Class': '08', 'Vendor': '177d', 'Device': 'a0f0,a0f1',
- 'SVendor': None, 'SDevice': None}
-
-hisilicon_dma = {'Class': '08', 'Vendor': '19e5', 'Device': 'a122',
- 'SVendor': None, 'SDevice': None}
-odm_dma = {'Class': '08', 'Vendor': '177d', 'Device': 'a08c',
- 'SVendor': None, 'SDevice': None}
-
-intel_dlb = {'Class': '0b', 'Vendor': '8086', 'Device': '270b,2710,2714',
- 'SVendor': None, 'SDevice': None}
-intel_ioat_bdw = {'Class': '08', 'Vendor': '8086',
- 'Device': '6f20,6f21,6f22,6f23,6f24,6f25,6f26,6f27,6f2e,6f2f',
- 'SVendor': None, 'SDevice': None}
-intel_ioat_skx = {'Class': '08', 'Vendor': '8086', 'Device': '2021',
- 'SVendor': None, 'SDevice': None}
-intel_ioat_icx = {'Class': '08', 'Vendor': '8086', 'Device': '0b00',
- 'SVendor': None, 'SDevice': None}
-intel_idxd_spr = {'Class': '08', 'Vendor': '8086', 'Device': '0b25',
- 'SVendor': None, 'SDevice': None}
-intel_idxd_gnrd = {'Class': '08', 'Vendor': '8086', 'Device': '11fb',
- 'SVendor': None, 'SDevice': None}
-intel_idxd_dmr = {'Class': '08', 'Vendor': '8086', 'Device': '1212',
- 'SVendor': None, 'SDevice': None}
-intel_ntb_skx = {'Class': '06', 'Vendor': '8086', 'Device': '201c',
- 'SVendor': None, 'SDevice': None}
-intel_ntb_icx = {'Class': '06', 'Vendor': '8086', 'Device': '347e',
- 'SVendor': None, 'SDevice': None}
-
-cnxk_sso = {'Class': '08', 'Vendor': '177d', 'Device': 'a0f9,a0fa',
- 'SVendor': None, 'SDevice': None}
-cnxk_npa = {'Class': '08', 'Vendor': '177d', 'Device': 'a0fb,a0fc',
- 'SVendor': None, 'SDevice': None}
-cn9k_ree = {'Class': '08', 'Vendor': '177d', 'Device': 'a0f4',
- 'SVendor': None, 'SDevice': None}
-
-virtio_blk = {'Class': '01', 'Vendor': "1af4", 'Device': '1001,1042',
- 'SVendor': None, 'SDevice': None}
-
-cnxk_ml = {'Class': '08', 'Vendor': '177d', 'Device': 'a092',
- 'SVendor': None, 'SDevice': None}
-
-network_devices = [network_class, cavium_pkx, avp_vnic, ifpga_class]
-baseband_devices = [acceleration_class]
-crypto_devices = [encryption_class, intel_processor_class]
-dma_devices = [cnxk_dma, hisilicon_dma,
- intel_idxd_gnrd, intel_idxd_dmr, intel_idxd_spr,
- intel_ioat_bdw, intel_ioat_icx, intel_ioat_skx,
- odm_dma]
-eventdev_devices = [cavium_sso, cavium_tim, intel_dlb, cnxk_sso]
-mempool_devices = [cavium_fpa, cnxk_npa]
-compress_devices = [cavium_zip]
-regex_devices = [cn9k_ree]
-ml_devices = [cnxk_ml]
-misc_devices = [cnxk_bphy, cnxk_bphy_cgx, cnxk_inl_dev,
- intel_ntb_skx, intel_ntb_icx,
- virtio_blk]
+device_types = {
+ 'net': {
+ 'name': 'Network',
+ 'iface': True,
+ 'match': [
+ {'Class': '02', 'Vendor': None, 'Device': None}, # Network class
+ {'Class': '05', 'Vendor': '1af4', 'Device': '1110'}, # AVP vNIC
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a0dd,a049'}, # Cavium PKX
+ {'Class': '12', 'Vendor': '8086', 'Device': '0b30'}, # Intel FPGA
+ ]
+ },
+ 'baseband': {
+ 'name': 'Baseband',
+ 'match': [
+ {'Class': '12', 'Vendor': None, 'Device': None}, # Acceleration class
+ ]
+ },
+ 'crypto': {
+ 'name': 'Crypto',
+ 'match': [
+ {'Class': '0b', 'Vendor': '8086', 'Device': None}, # Intel Processor
+ {'Class': '10', 'Vendor': None, 'Device': None}, # Encryption class
+ ]
+ },
+ 'dma': {
+ 'name': 'DMA',
+ 'match': [
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a081'}, # Marvell CNXK DMA
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a08c'}, # Marvell ODM DMA
+ {'Class': '08', 'Vendor': '19e5', 'Device': 'a122'}, # HiSilicon DMA
+ {'Class': '08', 'Vendor': '8086', 'Device': '0b00'}, # Intel IOAT Ice Lake
+ {'Class': '08', 'Vendor': '8086', 'Device': '0b25'}, # Intel IDXD Sapphire Rapids
+ {'Class': '08', 'Vendor': '8086', 'Device': '11fb'}, # Intel IDXD Granite Rapids
+ {'Class': '08', 'Vendor': '8086', 'Device': '1212'}, # Intel IDXD Diamond Rapids
+ {'Class': '08', 'Vendor': '8086', 'Device': '2021'}, # Intel IOAT Skylake
+ {'Class': '08', 'Vendor': '8086', # Intel IOAT Broadwell
+ 'Device': '6f20,6f21,6f22,6f23,6f24,6f25,6f26,6f27,6f2e,6f2f'},
+ ]
+ },
+ 'event': {
+ 'name': 'Eventdev',
+ 'match': [
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a04b,a04d'}, # Cavium SSO
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a051'}, # Cavium TIM
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a0f9,a0fa'}, # Marvell CNXK SSO
+ {'Class': '0b', 'Vendor': '8086', 'Device': '270b,2710,2714'}, # Intel DLB
+ ]
+ },
+ 'mempool': {
+ 'name': 'Mempool',
+ 'match': [
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a053'}, # Cavium FPA
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a0fb,a0fc'}, # Marvell CNXK NPA
+ ]
+ },
+ 'compress': {
+ 'name': 'Compress',
+ 'match': [
+ {'Class': '12', 'Vendor': '177d', 'Device': 'a037'}, # Cavium ZIP
+ ]
+ },
+ 'misc': {
+ 'name': 'Misc (rawdev)',
+ 'match': [
+ {'Class': '01', 'Vendor': '1af4', 'Device': '1001,1042'}, # VirtIO block
+ {'Class': '06', 'Vendor': '8086', 'Device': '201c'}, # Intel NTB Skylake
+ {'Class': '06', 'Vendor': '8086', 'Device': '347e'}, # Intel NTB Ice Lake
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a059,a060'}, # Marvell CNXK BPHY CGX
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a089'}, # Marvell CNXK BPHY
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a0f0,a0f1'}, # Marvell CNXK Inline
+ ]
+ },
+ 'regex': {
+ 'name': 'Regex',
+ 'match': [
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a0f4'}, # Marvell CN9K REE
+ ]
+ },
+ 'ml': {
+ 'name': 'ML',
+ 'match': [
+ {'Class': '08', 'Vendor': '177d', 'Device': 'a092'}, # Marvell CNXK ML
+ ]
+ },
+}
# global dict ethernet devices present. Dictionary indexed by PCI address.
# Each device within this is itself a dictionary of device properties
@@ -351,12 +350,14 @@ def get_device_details(devices_type):
global devices
global dpdk_drivers
+ match_list = device_types[devices_type]['match']
+
if is_linux:
- get_basic_devinfo_linux(devices_type)
+ get_basic_devinfo_linux(match_list)
else:
- get_basic_devinfo_bsd(devices_type)
+ get_basic_devinfo_bsd(match_list)
- if is_linux and devices_type == network_devices:
+ if is_linux and devices_type == 'net':
# check what is the interface if any for an ssh connection if
# any to this host, so we can mark it later.
ssh_if = []
@@ -371,7 +372,7 @@ def get_device_details(devices_type):
# based on the basic info, get extended text details
for d in devices.keys():
- if not device_type_match(devices[d], devices_type):
+ if not device_type_match(devices[d], match_list):
continue
# get additional info and add it to existing data
@@ -379,7 +380,7 @@ def get_device_details(devices_type):
# No need to probe lspci
devices[d].update(get_pci_device_details(d, False).items())
- if is_linux and devices_type == network_devices:
+ if is_linux and devices_type == 'net':
for _if in ssh_if:
if _if in devices[d]["Interface"].split(","):
devices[d]["Ssh_if"] = True
@@ -720,17 +721,21 @@ def display_devices(title, dev_list, extra_params=None):
print("\n".join(strings)) # print one per line
-def show_device_status(devices_type, device_name, if_field=False):
+def show_device_status(devices_type):
global dpdk_drivers
kernel_drv = []
dpdk_drv = []
no_drv = []
+ match_list = device_types[devices_type]['match']
+ device_name = device_types[devices_type]['name']
+ if_field = device_types[devices_type].get('iface', False)
+
print_numa = True # by default, assume we can print NUMA information
# split our list of network devices into the three categories above
for d in devices.keys():
- if device_type_match(devices[d], devices_type):
+ if device_type_match(devices[d], match_list):
print_numa &= "NUMANode" in devices[d]
if not has_driver(d):
no_drv.append(devices[d])
@@ -778,35 +783,9 @@ def show_status():
Displays to the user what devices are bound to the igb_uio driver, the
kernel driver or to no driver'''
- if status_dev in ["net", "all"]:
- show_device_status(network_devices, "Network", if_field=True)
-
- if status_dev in ["baseband", "all"]:
- show_device_status(baseband_devices, "Baseband")
-
- if status_dev in ["crypto", "all"]:
- show_device_status(crypto_devices, "Crypto")
-
- if status_dev in ["dma", "all"]:
- show_device_status(dma_devices, "DMA")
-
- if status_dev in ["event", "all"]:
- show_device_status(eventdev_devices, "Eventdev")
-
- if status_dev in ["mempool", "all"]:
- show_device_status(mempool_devices, "Mempool")
-
- if status_dev in ["compress", "all"]:
- show_device_status(compress_devices, "Compress")
-
- if status_dev in ["misc", "all"]:
- show_device_status(misc_devices, "Misc (rawdev)")
-
- if status_dev in ["regex", "all"]:
- show_device_status(regex_devices, "Regex")
-
- if status_dev in ["ml", "all"]:
- show_device_status(ml_devices, "ML")
+ for dev_type in device_types:
+ if status_dev in [dev_type, "all"]:
+ show_device_status(dev_type)
def pci_glob(arg):
@@ -971,16 +950,8 @@ def do_arg_actions():
if b_flag is not None:
clear_data()
# refresh if we have changed anything
- get_device_details(network_devices)
- get_device_details(baseband_devices)
- get_device_details(crypto_devices)
- get_device_details(dma_devices)
- get_device_details(eventdev_devices)
- get_device_details(mempool_devices)
- get_device_details(compress_devices)
- get_device_details(regex_devices)
- get_device_details(ml_devices)
- get_device_details(misc_devices)
+ for dev_type in device_types:
+ get_device_details(dev_type)
show_status()
@@ -996,16 +967,8 @@ def main():
parse_args()
check_modules()
clear_data()
- get_device_details(network_devices)
- get_device_details(baseband_devices)
- get_device_details(crypto_devices)
- get_device_details(dma_devices)
- get_device_details(eventdev_devices)
- get_device_details(mempool_devices)
- get_device_details(compress_devices)
- get_device_details(regex_devices)
- get_device_details(ml_devices)
- get_device_details(misc_devices)
+ for dev_type in device_types:
+ get_device_details(dev_type)
do_arg_actions()
--
2.54.0
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] usertools/devbind: cleanup device type declarations
2026-10-08 14:43 [PATCH] usertools/devbind: cleanup device type declarations David Marchand
@ 2026-10-08 14:53 ` Bruce Richardson
2026-10-09 7:39 ` David Marchand
0 siblings, 1 reply; 3+ messages in thread
From: Bruce Richardson @ 2026-10-08 14:53 UTC (permalink / raw)
To: David Marchand; +Cc: dev, thomas, Robin Jarry
On Thu, Oct 08, 2026 at 04:43:13PM +0200, David Marchand wrote:
> Adding more device types has resulted in a nice chaotic order over time.
> Introduce a single dictionary and group by types (keeping the original
> order).
> Sort match entries by class/vendor/device values.
>
> The Sub Vendor and Sub Device fields are never populated, just drop
> them.
>
> Signed-off-by: David Marchand <david.marchand@redhat.com>
> ---
> usertools/dpdk-devbind.py | 247 ++++++++++++++++----------------------
> 1 file changed, 105 insertions(+), 142 deletions(-)
>
Good idea, thanks for the cleanup.
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] usertools/devbind: cleanup device type declarations
2026-10-08 14:53 ` Bruce Richardson
@ 2026-10-09 7:39 ` David Marchand
0 siblings, 0 replies; 3+ messages in thread
From: David Marchand @ 2026-10-09 7:39 UTC (permalink / raw)
To: David Marchand; +Cc: dev, thomas, Robin Jarry, Bruce Richardson
On Thu, 8 Oct 2026 at 16:53, Bruce Richardson
<bruce.richardson@intel.com> wrote:
> On Thu, Oct 08, 2026 at 04:43:13PM +0200, David Marchand wrote:
> > Adding more device types has resulted in a nice chaotic order over time.
> > Introduce a single dictionary and group by types (keeping the original
> > order).
> > Sort match entries by class/vendor/device values.
> >
> > The Sub Vendor and Sub Device fields are never populated, just drop
> > them.
> >
> > Signed-off-by: David Marchand <david.marchand@redhat.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
Applied, thanks.
--
David Marchand
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-09 7:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-08 14:43 [PATCH] usertools/devbind: cleanup device type declarations David Marchand
2026-10-08 14:53 ` Bruce Richardson
2026-10-09 7:39 ` David Marchand
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox