Skip to content

Commit 1b53fac

Browse files
authored
feature: Add pyzes support for firmware APIs
Add python bindings, unit tests, black box test coverage and README entries for: 1. zesFirmwareGetProperties
1 parent 9e1a8b2 commit 1b53fac

4 files changed

Lines changed: 119 additions & 0 deletions

File tree

‎bindings/sysman/python/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ SUPPORTED APIs
180180
| `zesDeviceGetHealthStatusExt` | Device | 0.1.4 | None |
181181
| `zesDeviceSetHealthStatusExt` | Device | 0.1.4 | Linux: Requires superuser; persisted to non-volatile memory |
182182
| `zesDeviceEnumFirmwares` | Device | 0.1.4 | None |
183+
| `zesFirmwareGetProperties` | Firmware | 0.1.4 | None |
183184
| **Memory Management** |-|-|-|
184185
| `zesDeviceEnumMemoryModules` | Memory | 0.1.0 | None |
185186
| `zesMemoryGetProperties` | Memory | 0.1.0 | None |

‎bindings/sysman/python/source/pyzes/__init__.py‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ class zes_firmware_handle_t(c_void_p):
508508
ZES_STRUCTURE_TYPE_INFO_LOG_METADATA_EXT = 0x00020022
509509
ZES_STRUCTURE_TYPE_INFO_LOG_READ_STATUS_EXT = 0x00020023
510510
ZES_STRUCTURE_TYPE_DRIVER_PROPERTIES = 0x2F
511+
ZES_STRUCTURE_TYPE_FIRMWARE_PROPERTIES = 0x8
511512

512513

513514
## Core ze_device UUID struct ##
@@ -1069,6 +1070,18 @@ class zes_info_log_read_status_ext_t(_PrintableStructure):
10691070
_fmt_ = {"consumedDataSize": "%d bytes"}
10701071

10711072

1073+
class zes_firmware_properties_t(_PrintableStructure):
1074+
_fields_ = [
1075+
("stype", c_int32),
1076+
("pNext", c_void_p),
1077+
("onSubdevice", ze_bool_t),
1078+
("subdeviceId", c_uint32),
1079+
("canControl", ze_bool_t),
1080+
("name", c_char * ZES_STRING_PROPERTY_SIZE),
1081+
("version", c_char * ZES_STRING_PROPERTY_SIZE),
1082+
]
1083+
1084+
10721085
## Function access ##
10731086
_getFunctionPointerList: Dict[str, Any] = dict()
10741087

@@ -1482,6 +1495,26 @@ def zesDeviceEnumFirmwares(hDevice, pCount, phFirmware):
14821495
return retVal
14831496

14841497

1498+
def zesFirmwareGetProperties(hFirmware, pProperties):
1499+
"""Wraps API:
1500+
ze_result_t zesFirmwareGetProperties(
1501+
zes_firmware_handle_t hFirmware,
1502+
zes_firmware_properties_t* pProperties)
1503+
1504+
Parameters:
1505+
hFirmware: firmware handle
1506+
pProperties: POINTER(zes_firmware_properties_t) - properties structure to fill
1507+
Returns:
1508+
ze_result_t - return code only, properties are filled into pProperties
1509+
"""
1510+
funcPtr = getFunctionPointerList("zesFirmwareGetProperties")
1511+
funcPtr.argtypes = [zes_firmware_handle_t, POINTER(zes_firmware_properties_t)]
1512+
funcPtr.restype = ze_result_t
1513+
1514+
retVal = funcPtr(hFirmware, pProperties)
1515+
return retVal
1516+
1517+
14851518
## Memory management functions ##
14861519
def zesDeviceEnumMemoryModules(hDevice, pCount, phMemory):
14871520
"""Wraps API:

‎bindings/sysman/python/source/pyzes/examples/pyzes_black_box_test.py‎

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
21802225
def 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],

‎bindings/sysman/python/test/unit_tests/test_device.py‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,36 @@ def mock_enum_firmwares(device_handle, count_ptr, handles_ptr):
188188
mock_get_func.assert_called_with("zesDeviceEnumFirmwares")
189189
mock_func.assert_called_once()
190190

191+
def test_GivenValidFirmwareHandleWhenCallingZesFirmwareGetPropertiesThenCallSucceedsWithValidProperties(
192+
self, mock_get_func
193+
):
194+
def mock_get_properties(firmware_handle, properties_ptr):
195+
properties = properties_ptr._obj
196+
properties.onSubdevice = 1
197+
properties.subdeviceId = 1
198+
properties.canControl = 1
199+
properties.name = b"GFX"
200+
properties.version = b"DG02_2.2421"
201+
return self.pyzes.ZE_RESULT_SUCCESS
202+
203+
mock_func = MagicMock(side_effect=mock_get_properties)
204+
mock_get_func.return_value = mock_func
205+
206+
firmware_handle = self.pyzes.zes_firmware_handle_t()
207+
properties = self.pyzes.zes_firmware_properties_t()
208+
properties.stype = self.pyzes.ZES_STRUCTURE_TYPE_FIRMWARE_PROPERTIES
209+
210+
result = self.pyzes.zesFirmwareGetProperties(firmware_handle, byref(properties))
211+
212+
self.assertEqual(result, self.pyzes.ZE_RESULT_SUCCESS)
213+
self.assertEqual(properties.onSubdevice, 1)
214+
self.assertEqual(properties.subdeviceId, 1)
215+
self.assertEqual(properties.canControl, 1)
216+
self.assertEqual(properties.name, b"GFX")
217+
self.assertEqual(properties.version, b"DG02_2.2421")
218+
mock_get_func.assert_called_with("zesFirmwareGetProperties")
219+
mock_func.assert_called_once()
220+
191221

192222
if __name__ == "__main__":
193223
unittest.main()

0 commit comments

Comments
 (0)