@@ -2177,6 +2177,51 @@ def test_device_health_module(device_handle, device_index, set_health=None):
21772177 return True
21782178
21792179
2180+ def test_firmware_module (device_handle , device_index ):
2181+ """Test firmware enumeration and properties"""
2182+ print (f"\n ---- Device { device_index } Firmware Test ----" )
2183+
2184+ firmware_count = c_uint32 (0 )
2185+ rc = pz .zesDeviceEnumFirmwares (device_handle , byref (firmware_count ), None )
2186+ if not check_rc (f"zesDeviceEnumFirmwares(device { device_index } , count)" , rc ):
2187+ return False
2188+
2189+ if firmware_count .value == 0 :
2190+ print_verbose ("No firmware components found on this device" )
2191+ return True
2192+
2193+ print_verbose (f"Found { firmware_count .value } firmware component(s)" )
2194+
2195+ FirmwareArray = pz .zes_firmware_handle_t * firmware_count .value
2196+ firmware_handles = FirmwareArray ()
2197+
2198+ rc = pz .zesDeviceEnumFirmwares (
2199+ device_handle , byref (firmware_count ), firmware_handles
2200+ )
2201+ if not check_rc (f"zesDeviceEnumFirmwares(device { device_index } , handles)" , rc ):
2202+ return False
2203+
2204+ for i in range (firmware_count .value ):
2205+ print_verbose (f"\n Firmware { i } :" )
2206+
2207+ props = pz .zes_firmware_properties_t ()
2208+ props .stype = pz .ZES_STRUCTURE_TYPE_FIRMWARE_PROPERTIES
2209+ props .pNext = None
2210+
2211+ rc = pz .zesFirmwareGetProperties (firmware_handles [i ], byref (props ))
2212+ if not check_rc (f"zesFirmwareGetProperties(firmware { i } )" , rc ):
2213+ continue
2214+
2215+ print_verbose (f" Name: { props .name .decode ('utf-8' , errors = 'ignore' )} " )
2216+ print_verbose (f" Version: { props .version .decode ('utf-8' , errors = 'ignore' )} " )
2217+ print_verbose (f" On Subdevice: { bool (props .onSubdevice )} " )
2218+ if props .onSubdevice :
2219+ print_verbose (f" Subdevice ID: { props .subdeviceId } " )
2220+ print_verbose (f" Can Control: { bool (props .canControl )} " )
2221+
2222+ return True
2223+
2224+
21802225def test_memory_modules (device_handle , device_index ):
21812226 """Test memory module enumeration and operations"""
21822227 print (f"\n ---- Device { device_index } Memory Modules Test ----" )
@@ -2889,6 +2934,8 @@ def run_all_tests():
28892934
28902935 test_vf_management_module (devices [device_idx ], device_idx )
28912936
2937+ test_firmware_module (devices [device_idx ], device_idx )
2938+
28922939 if not test_info_log_module (drivers [driver_idx ], driver_idx ):
28932940 success = False
28942941
@@ -2923,6 +2970,7 @@ def main():
29232970 %(prog)s -re --clear-ras-state # RAS tests, clear all error counters (root)
29242971 %(prog)s -s # Standby tests only
29252972 %(prog)s -v # VF management tests only
2973+ %(prog)s -i # Firmware tests only
29262974 %(prog)s -L # Info log properties tests only
29272975 %(prog)s -L --instanceapi # Info log tests, verify peek and read on a named collection instance
29282976 %(prog)s -L --instanceread --instance mylog --buffersize 1024 # Info log tests, read the records of a named 1 MB collection instance
@@ -3031,6 +3079,9 @@ def main():
30313079 parser .add_argument (
30323080 "-v" , "--vftelemetry" , action = "store_true" , help = "Run only VF management tests"
30333081 )
3082+ parser .add_argument (
3083+ "-i" , "--firmware" , action = "store_true" , help = "Run only firmware tests"
3084+ )
30343085 parser .add_argument (
30353086 "-L" ,
30363087 "--infolog" ,
@@ -3139,6 +3190,7 @@ def main():
31393190 or args .rasexp
31403191 or args .standby
31413192 or args .vftelemetry
3193+ or args .firmware
31423194 or args .infolog
31433195 or args .driverproperties
31443196 or args .event
@@ -3250,6 +3302,9 @@ def main():
32503302 if args .vftelemetry :
32513303 test_vf_management_module (devices [device_idx ], device_idx )
32523304
3305+ if args .firmware :
3306+ test_firmware_module (devices [device_idx ], device_idx )
3307+
32533308 if args .reset is not None and args .reset_device in (None , device_idx ):
32543309 test_device_reset (
32553310 devices [device_idx ],
0 commit comments