diff --git a/level_zero/api/sysman/zes_sysman.cpp b/level_zero/api/sysman/zes_sysman.cpp index 21f92370f0..18b25b622c 100644 --- a/level_zero/api/sysman/zes_sysman.cpp +++ b/level_zero/api/sysman/zes_sysman.cpp @@ -209,7 +209,7 @@ zesFrequencyGetAvailableClocks( zes_freq_handle_t hFrequency, uint32_t *pCount, double *phFrequency) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + return L0::Frequency::fromHandle(hFrequency)->frequencyGetAvailableClocks(pCount, phFrequency); } ZE_APIEXPORT ze_result_t ZE_APICALL diff --git a/level_zero/tools/source/sysman/frequency/frequency.h b/level_zero/tools/source/sysman/frequency/frequency.h index 9678150c25..fd2de7d264 100644 --- a/level_zero/tools/source/sysman/frequency/frequency.h +++ b/level_zero/tools/source/sysman/frequency/frequency.h @@ -23,6 +23,7 @@ class Frequency : _zes_freq_handle_t { virtual ~Frequency() {} virtual ze_result_t frequencyGetProperties(zes_freq_properties_t *pProperties) = 0; + virtual ze_result_t frequencyGetAvailableClocks(uint32_t *pCount, double *phFrequency) = 0; virtual ze_result_t frequencyGetRange(zes_freq_range_t *pLimits) = 0; virtual ze_result_t frequencySetRange(const zes_freq_range_t *pLimits) = 0; virtual ze_result_t frequencyGetState(zes_freq_state_t *pState) = 0; diff --git a/level_zero/tools/source/sysman/frequency/frequency_imp.cpp b/level_zero/tools/source/sysman/frequency/frequency_imp.cpp index 094eda1043..0ff4568999 100644 --- a/level_zero/tools/source/sysman/frequency/frequency_imp.cpp +++ b/level_zero/tools/source/sysman/frequency/frequency_imp.cpp @@ -7,6 +7,7 @@ #include "level_zero/tools/source/sysman/frequency/frequency_imp.h" +#include "shared/source/helpers/basic_math.h" #include "shared/source/helpers/debug_helpers.h" #include @@ -21,6 +22,19 @@ ze_result_t FrequencyImp::frequencyGetProperties(zes_freq_properties_t *pPropert return ZE_RESULT_SUCCESS; } +ze_result_t FrequencyImp::frequencyGetAvailableClocks(uint32_t *pCount, double *phFrequency) { + uint32_t numToCopy = std::min(*pCount, numClocks); + if (0 == *pCount || *pCount > numClocks) { + *pCount = numClocks; + } + if (nullptr != phFrequency) { + for (uint32_t i = 0; i < numToCopy; i++) { + phFrequency[i] = pClocks[i]; + } + } + return ZE_RESULT_SUCCESS; +} + ze_result_t FrequencyImp::frequencyGetRange(zes_freq_range_t *pLimits) { ze_result_t result = pOsFrequency->getMax(pLimits->max); if (ZE_RESULT_SUCCESS != result) { diff --git a/level_zero/tools/source/sysman/frequency/frequency_imp.h b/level_zero/tools/source/sysman/frequency/frequency_imp.h index 936b12ae18..8d9f26f342 100644 --- a/level_zero/tools/source/sysman/frequency/frequency_imp.h +++ b/level_zero/tools/source/sysman/frequency/frequency_imp.h @@ -18,6 +18,7 @@ namespace L0 { class FrequencyImp : public Frequency, NEO::NonCopyableOrMovableClass { public: ze_result_t frequencyGetProperties(zes_freq_properties_t *pProperties) override; + ze_result_t frequencyGetAvailableClocks(uint32_t *pCount, double *phFrequency) override; ze_result_t frequencyGetRange(zes_freq_range_t *pLimits) override; ze_result_t frequencySetRange(const zes_freq_range_t *pLimits) override; ze_result_t frequencyGetState(zes_freq_state_t *pState) override;