Skip to content

Commit f7bee3a

Browse files
committed
feature: Add more APIs to L0 Sysman python binding
Related-To: NEO-18602 Add following apis to python: 1. zesFrequencyGetProperties 2. zesPowerGetProperties 3. zesPowerGetUsage Signed-off-by: Aviral Nigam <aviral.nigam@intel.com>
1 parent 150fd84 commit f7bee3a

4 files changed

Lines changed: 98 additions & 4 deletions

File tree

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,19 @@ def get_frequency_domain_string(freq_domain):
149149
return domain_map.get(freq_domain, f"UNKNOWN_FREQ_DOMAIN_{freq_domain}")
150150

151151

152+
def get_power_domain_string(power_domain):
153+
"""Convert power domain enum to string"""
154+
domain_map = {
155+
pz.ZES_POWER_DOMAIN_UNKNOWN: "ZES_POWER_DOMAIN_UNKNOWN",
156+
pz.ZES_POWER_DOMAIN_CARD: "ZES_POWER_DOMAIN_CARD",
157+
pz.ZES_POWER_DOMAIN_PACKAGE: "ZES_POWER_DOMAIN_PACKAGE",
158+
pz.ZES_POWER_DOMAIN_STACK: "ZES_POWER_DOMAIN_STACK",
159+
pz.ZES_POWER_DOMAIN_MEMORY: "ZES_POWER_DOMAIN_MEMORY",
160+
pz.ZES_POWER_DOMAIN_GPU: "ZES_POWER_DOMAIN_GPU",
161+
}
162+
return domain_map.get(power_domain, f"UNKNOWN_POWER_DOMAIN_{power_domain}")
163+
164+
152165
def get_throttle_reasons_string(throttle_reasons):
153166
"""Convert throttle reason flags to human-readable string"""
154167
if throttle_reasons == 0:
@@ -666,8 +679,13 @@ def test_power_module(device_handle, device_index):
666679
print_verbose(f"\n Power Domain {i}:")
667680

668681
power_props = pz.zes_power_properties_t()
682+
power_ext_props = pz.zes_power_ext_properties_t()
683+
default_limit = pz.zes_power_limit_ext_desc_t()
669684
power_props.stype = pz.ZES_STRUCTURE_TYPE_POWER_PROPERTIES
670-
power_props.pNext = None
685+
power_props.pNext = cast(byref(power_ext_props), c_void_p)
686+
power_ext_props.stype = pz.ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES
687+
power_ext_props.pNext = None
688+
power_ext_props.defaultLimit = pointer(default_limit)
671689

672690
rc = pz.zesPowerGetProperties(power_handles[i], byref(power_props))
673691
if check_rc(f"zesPowerGetProperties(power {i})", rc):
@@ -682,6 +700,11 @@ def test_power_module(device_handle, device_index):
682700
print_verbose(f" Default Limit: {power_props.defaultLimit}")
683701
print_verbose(f" Min Limit: {power_props.minLimit}")
684702
print_verbose(f" Max Limit: {power_props.maxLimit}")
703+
print_verbose(
704+
" Extended Domain: "
705+
f"{get_power_domain_string(power_ext_props.domain)}"
706+
)
707+
print_verbose(f" Extended Default Limit: {default_limit.limit}")
685708

686709
# Test power usage
687710
instant_power = c_uint32(0)

bindings/sysman/python/source/pyzes.py

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class zes_engine_handle_t(c_void_p):
153153

154154
##
155155

156-
ze_bool_t = c_uint32
156+
ze_bool_t = c_uint8
157157
ze_device_property_flags_t = c_uint32
158158
zes_engine_type_flags_t = c_uint32
159159
zes_device_property_flags_t = c_uint32
@@ -224,6 +224,29 @@ class zes_engine_handle_t(c_void_p):
224224
ZES_POWER_DOMAIN_GPU = 5
225225
ZES_POWER_DOMAIN_FORCE_UINT32 = 0x7FFFFFFF
226226

227+
# Power limit level enumeration
228+
zes_power_level_t = c_int32
229+
ZES_POWER_LEVEL_UNKNOWN = 0
230+
ZES_POWER_LEVEL_SUSTAINED = 1
231+
ZES_POWER_LEVEL_BURST = 2
232+
ZES_POWER_LEVEL_PEAK = 3
233+
ZES_POWER_LEVEL_INSTANTANEOUS = 4
234+
ZES_POWER_LEVEL_FORCE_UINT32 = 0x7FFFFFFF
235+
236+
# Power source enumeration
237+
zes_power_source_t = c_int32
238+
ZES_POWER_SOURCE_ANY = 0
239+
ZES_POWER_SOURCE_MAINS = 1
240+
ZES_POWER_SOURCE_BATTERY = 2
241+
ZES_POWER_SOURCE_FORCE_UINT32 = 0x7FFFFFFF
242+
243+
# Power limit unit enumeration
244+
zes_limit_unit_t = c_int32
245+
ZES_LIMIT_UNIT_UNKNOWN = 0
246+
ZES_LIMIT_UNIT_CURRENT = 1
247+
ZES_LIMIT_UNIT_POWER = 2
248+
ZES_LIMIT_UNIT_FORCE_UINT32 = 0x7FFFFFFF
249+
227250
## Frequency domain enums ##
228251
zes_freq_domain_t = c_int32
229252
ZES_FREQ_DOMAIN_GPU = 0
@@ -340,6 +363,9 @@ class zes_engine_handle_t(c_void_p):
340363
ZES_STRUCTURE_TYPE_MEM_STATE = 0x1E
341364
ZES_STRUCTURE_TYPE_FREQ_PROPERTIES = 0x9
342365
ZES_STRUCTURE_TYPE_FREQ_STATE = 0x1B
366+
ZES_STRUCTURE_TYPE_POWER_PROPERTIES = 0xD
367+
ZES_STRUCTURE_TYPE_POWER_LIMIT_EXT_DESC = 0x27
368+
ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES = 0x28
343369
ZES_STRUCTURE_TYPE_TEMP_PROPERTIES = 0xA
344370
ZES_STRUCTURE_TYPE_TEMP_CONFIG = 0x1C
345371
ZES_STRUCTURE_TYPE_ENGINE_PROPERTIES = 0x5
@@ -500,6 +526,32 @@ class zes_power_properties_t(_PrintableStructure):
500526
}
501527

502528

529+
class zes_power_limit_ext_desc_t(_PrintableStructure):
530+
_fields_ = [
531+
("stype", c_int32), # ZES_STRUCTURE_TYPE_POWER_LIMIT_EXT_DESC
532+
("pNext", c_void_p),
533+
("level", zes_power_level_t),
534+
("source", zes_power_source_t),
535+
("limitUnit", zes_limit_unit_t),
536+
("enabledStateLocked", ze_bool_t),
537+
("enabled", ze_bool_t),
538+
("intervalValueLocked", ze_bool_t),
539+
("interval", c_int32),
540+
("limitValueLocked", ze_bool_t),
541+
("limit", c_int32),
542+
]
543+
_fmt_ = {"interval": "%d ms", "limit": "%d"}
544+
545+
546+
class zes_power_ext_properties_t(_PrintableStructure):
547+
_fields_ = [
548+
("stype", c_int32), # ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES
549+
("pNext", c_void_p),
550+
("domain", zes_power_domain_t),
551+
("defaultLimit", POINTER(zes_power_limit_ext_desc_t)),
552+
]
553+
554+
503555
class zes_power_energy_counter_t(_PrintableStructure):
504556
_fields_ = [
505557
("energy", c_uint64), # monotonic energy counter in microjoules

bindings/sysman/python/test/unit_tests/test_frequency.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,5 @@ def mock_get_properties(frequency_handle, properties_ptr):
130130
mock_get_func.assert_called_with("zesFrequencyGetProperties")
131131
mock_func.assert_called_once()
132132

133-
134133
if __name__ == "__main__":
135134
unittest.main()

bindings/sysman/python/test/unit_tests/test_power.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ def test_GivenValidPowerHandleWhenCallingZesPowerGetPropertiesThenCallSucceedsWi
108108
mock_default_limit = 150000
109109
mock_min_limit = 100000
110110
mock_max_limit = 225000
111+
mock_domain = self.pyzes.ZES_POWER_DOMAIN_PACKAGE
112+
mock_ext_default_limit = 175000
111113

112114
def mock_get_properties(power_handle, properties_ptr):
113115
properties_ptr._obj.onSubdevice = True
@@ -117,13 +119,29 @@ def mock_get_properties(power_handle, properties_ptr):
117119
properties_ptr._obj.defaultLimit = mock_default_limit
118120
properties_ptr._obj.minLimit = mock_min_limit
119121
properties_ptr._obj.maxLimit = mock_max_limit
122+
123+
ext_properties_ptr = cast(
124+
properties_ptr._obj.pNext,
125+
POINTER(self.pyzes.zes_power_ext_properties_t),
126+
)
127+
ext_properties_ptr.contents.domain = mock_domain
128+
ext_properties_ptr.contents.defaultLimit.contents.limit = (
129+
mock_ext_default_limit
130+
)
120131
return self.pyzes.ZE_RESULT_SUCCESS
121132

122133
mock_func = MagicMock(side_effect=mock_get_properties)
123134
mock_get_func.return_value = mock_func
124135

125136
power_handle = self.pyzes.zes_pwr_handle_t()
126137
properties = self.pyzes.zes_power_properties_t()
138+
ext_properties = self.pyzes.zes_power_ext_properties_t()
139+
ext_default_limit = self.pyzes.zes_power_limit_ext_desc_t()
140+
141+
properties.stype = self.pyzes.ZES_STRUCTURE_TYPE_POWER_PROPERTIES
142+
properties.pNext = cast(byref(ext_properties), c_void_p)
143+
ext_properties.stype = self.pyzes.ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES
144+
ext_properties.defaultLimit = pointer(ext_default_limit)
127145

128146
result = self.pyzes.zesPowerGetProperties(power_handle, byref(properties))
129147

@@ -135,9 +153,11 @@ def mock_get_properties(power_handle, properties_ptr):
135153
self.assertEqual(properties.defaultLimit, mock_default_limit)
136154
self.assertEqual(properties.minLimit, mock_min_limit)
137155
self.assertEqual(properties.maxLimit, mock_max_limit)
156+
self.assertEqual(ext_properties.stype, self.pyzes.ZES_STRUCTURE_TYPE_POWER_EXT_PROPERTIES)
157+
self.assertEqual(ext_properties.domain, mock_domain)
158+
self.assertEqual(ext_properties.defaultLimit.contents.limit, mock_ext_default_limit)
138159
mock_get_func.assert_called_with("zesPowerGetProperties")
139160
mock_func.assert_called_once()
140161

141-
142162
if __name__ == "__main__":
143163
unittest.main()

0 commit comments

Comments
 (0)