@@ -373,14 +373,18 @@ def sbdf_to_path(device_id: str):
373373 )
374374 sysfs_pci_devs_base = f"{ SYSFS_BASE } /bus/pci/devices"
375375
376+ root_buses = [dev [3 :]
377+ for dev in os .listdir (f"{ SYSFS_BASE } /devices" )
378+ if dev .startswith ("pci" )]
379+
376380 dev_match = regex .match (device_id )
377381 if not dev_match :
378382 raise ValueError ("Invalid device identifier: {!r}" .format (device_id ))
379383 if dev_match ["segment" ] is not None :
380384 segment = dev_match ["segment" ]
381385 else :
382386 segment = "0000"
383- if dev_match [" bus" ] == "00" :
387+ if f" { segment } : { dev_match [' bus' ] } " in root_buses :
384388 return (f"{ segment } _" if segment != "0000" else "" ) + (
385389 f"{ dev_match ['bus' ]} _"
386390 f"{ dev_match ['device' ]} .{ dev_match ['function' ]} "
@@ -488,8 +492,15 @@ def is_pci_path(device_id: str):
488492 :param device_id: device id to check
489493 :return:
490494 """
495+
496+ root_buses = [dev [3 :].replace (":" , "_" )
497+ for dev in os .listdir (f"{ SYSFS_BASE } /devices" )
498+ if dev .startswith ("pci" )]
499+ # add segment prefix for easier matching
500+ if len (device_id ) > 2 and device_id [2 ] == "_" :
501+ device_id = "0000_" + device_id
491502 path_re = re .compile (
492- r"\A([0-9a-f]{4}_)?00_ [0-9a-f]{2}\.[0-9a-f]"
503+ r"\A(" + "|" . join ( root_buses ) + r")_ [0-9a-f]{2}\.[0-9a-f]"
493504 r"(-[0-9a-f]{2}_[0-9a-f]{2}\.[0-9a-f])*\Z"
494505 )
495506 return bool (path_re .match (device_id ))
0 commit comments