1 /*
2  * Copyright (C) 2020-2021 Intel Corporation
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  */
7 
8 #include "level_zero/tools/test/unit_tests/sources/sysman/linux/mock_sysman_fixture.h"
9 
10 #include "gmock/gmock.h"
11 #include "gtest/gtest.h"
12 #include "mock_sysfs_frequency.h"
13 
14 #include <cmath>
15 
16 extern bool sysmanUltsEnable;
17 
18 using ::testing::Invoke;
19 
20 namespace L0 {
21 namespace ult {
22 
23 constexpr double minFreq = 300.0;
24 constexpr double maxFreq = 1100.0;
25 constexpr double step = 100.0 / 6;
26 constexpr double request = 300.0;
27 constexpr double tdp = 1100.0;
28 constexpr double actual = 300.0;
29 constexpr double efficient = 300.0;
30 constexpr double maxVal = 1100.0;
31 constexpr double minVal = 300.0;
32 constexpr uint32_t numClocks = static_cast<uint32_t>((maxFreq - minFreq) / step) + 1;
33 constexpr uint32_t handleComponentCount = 1u;
34 class SysmanDeviceFrequencyFixture : public SysmanDeviceFixture {
35   protected:
36     std::unique_ptr<Mock<FrequencySysfsAccess>> pSysfsAccess;
37     SysfsAccess *pSysfsAccessOld = nullptr;
38     std::vector<ze_device_handle_t> deviceHandles;
39 
SetUp()40     void SetUp() override {
41         if (!sysmanUltsEnable) {
42             GTEST_SKIP();
43         }
44         SysmanDeviceFixture::SetUp();
45         pSysfsAccessOld = pLinuxSysmanImp->pSysfsAccess;
46         pSysfsAccess = std::make_unique<NiceMock<Mock<FrequencySysfsAccess>>>();
47         pLinuxSysmanImp->pSysfsAccess = pSysfsAccess.get();
48 
49         pSysfsAccess->setVal(minFreqFile, minFreq);
50         pSysfsAccess->setVal(maxFreqFile, maxFreq);
51         pSysfsAccess->setVal(requestFreqFile, request);
52         pSysfsAccess->setVal(tdpFreqFile, tdp);
53         pSysfsAccess->setVal(actualFreqFile, actual);
54         pSysfsAccess->setVal(efficientFreqFile, efficient);
55         pSysfsAccess->setVal(maxValFreqFile, maxVal);
56         pSysfsAccess->setVal(minValFreqFile, minVal);
57         ON_CALL(*pSysfsAccess.get(), read(_, _))
58             .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getVal));
59         ON_CALL(*pSysfsAccess.get(), write(_, _))
60             .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setVal));
61         ON_CALL(*pSysfsAccess.get(), directoryExists(_))
62             .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::mockDirectoryExistsSuccess));
63 
64         // delete handles created in initial SysmanDeviceHandleContext::init() call
65         for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
66             delete handle;
67         }
68         pSysmanDeviceImp->pFrequencyHandleContext->handleList.clear();
69         uint32_t subDeviceCount = 0;
70         // We received a device handle. Check for subdevices in this device
71         Device::fromHandle(device->toHandle())->getSubDevices(&subDeviceCount, nullptr);
72         if (subDeviceCount == 0) {
73             deviceHandles.resize(1, device->toHandle());
74         } else {
75             deviceHandles.resize(subDeviceCount, nullptr);
76             Device::fromHandle(device->toHandle())->getSubDevices(&subDeviceCount, deviceHandles.data());
77         }
78         pSysmanDeviceImp->pFrequencyHandleContext->init(deviceHandles);
79     }
80 
TearDown()81     void TearDown() override {
82         if (!sysmanUltsEnable) {
83             GTEST_SKIP();
84         }
85         SysmanDeviceFixture::TearDown();
86         pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOld;
87     }
88 
clockValue(const double calculatedClock)89     double clockValue(const double calculatedClock) {
90         // i915 specific. frequency step is a fraction
91         // However, the i915 represents all clock
92         // rates as integer values. So clocks are
93         // rounded to the nearest integer.
94         uint32_t actualClock = static_cast<uint32_t>(calculatedClock + 0.5);
95         return static_cast<double>(actualClock);
96     }
97 
get_freq_handles(uint32_t count)98     std::vector<zes_freq_handle_t> get_freq_handles(uint32_t count) {
99         std::vector<zes_freq_handle_t> handles(count, nullptr);
100         EXPECT_EQ(zesDeviceEnumFrequencyDomains(device->toHandle(), &count, handles.data()), ZE_RESULT_SUCCESS);
101         return handles;
102     }
103 };
104 
TEST_F(SysmanDeviceFrequencyFixture,GivenComponentCountZeroWhenEnumeratingFrequencyHandlesThenNonZeroCountIsReturnedAndCallSucceds)105 TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroWhenEnumeratingFrequencyHandlesThenNonZeroCountIsReturnedAndCallSucceds) {
106     uint32_t count = 0U;
107 
108     EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, nullptr));
109     EXPECT_EQ(count, handleComponentCount);
110 
111     uint32_t testCount = count + 1;
112     EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &testCount, nullptr));
113     EXPECT_EQ(count, testCount);
114 
115     auto handles = get_freq_handles(count);
116     for (auto handle : handles) {
117         EXPECT_NE(handle, nullptr);
118     }
119 }
120 
TEST_F(SysmanDeviceFrequencyFixture,GivenComponentCountZeroAndValidPtrWhenEnumeratingFrequencyHandlesThenNonZeroCountAndNoHandlesAreReturnedAndCallSucceds)121 TEST_F(SysmanDeviceFrequencyFixture, GivenComponentCountZeroAndValidPtrWhenEnumeratingFrequencyHandlesThenNonZeroCountAndNoHandlesAreReturnedAndCallSucceds) {
122     uint32_t count = 0U;
123     zes_freq_handle_t handle = static_cast<zes_freq_handle_t>(0UL);
124 
125     EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumFrequencyDomains(device->toHandle(), &count, &handle));
126     EXPECT_EQ(count, handleComponentCount);
127     EXPECT_EQ(handle, static_cast<zes_freq_handle_t>(0UL));
128 }
129 
TEST_F(SysmanDeviceFrequencyFixture,GivenActualComponentCountTwoWhenTryingToGetOneComponentOnlyThenOneComponentIsReturnedAndCountUpdated)130 TEST_F(SysmanDeviceFrequencyFixture, GivenActualComponentCountTwoWhenTryingToGetOneComponentOnlyThenOneComponentIsReturnedAndCountUpdated) {
131     auto pFrequencyHandleContextTest = std::make_unique<FrequencyHandleContext>(pOsSysman);
132     pFrequencyHandleContextTest->handleList.push_back(new FrequencyImp(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU));
133     pFrequencyHandleContextTest->handleList.push_back(new FrequencyImp(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU));
134 
135     uint32_t count = 1;
136     std::vector<zes_freq_handle_t> phFrequency(count, nullptr);
137     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyHandleContextTest->frequencyGet(&count, phFrequency.data()));
138     EXPECT_EQ(count, 1u);
139 }
140 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyGetPropertiesThenSuccessIsReturned)141 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyGetPropertiesThenSuccessIsReturned) {
142     auto handles = get_freq_handles(handleComponentCount);
143     for (auto handle : handles) {
144         EXPECT_NE(handle, nullptr);
145         zes_freq_properties_t properties;
146         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetProperties(handle, &properties));
147         EXPECT_EQ(nullptr, properties.pNext);
148         EXPECT_EQ(ZES_FREQ_DOMAIN_GPU, properties.type);
149         EXPECT_FALSE(properties.onSubdevice);
150         EXPECT_DOUBLE_EQ(maxFreq, properties.max);
151         EXPECT_DOUBLE_EQ(minFreq, properties.min);
152         EXPECT_TRUE(properties.canControl);
153     }
154 }
155 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleAndZeroCountWhenCallingzesFrequencyGetAvailableClocksThenCallSucceeds)156 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleAndZeroCountWhenCallingzesFrequencyGetAvailableClocksThenCallSucceeds) {
157     auto handles = get_freq_handles(handleComponentCount);
158     for (auto handle : handles) {
159         EXPECT_NE(handle, nullptr);
160         uint32_t count = 0;
161         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetAvailableClocks(handle, &count, nullptr));
162         EXPECT_EQ(numClocks, count);
163     }
164 }
165 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleAndZeroCountWhenCountIsMoreThanNumClocksThenCallSucceeds)166 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleAndZeroCountWhenCountIsMoreThanNumClocksThenCallSucceeds) {
167     auto handles = get_freq_handles(handleComponentCount);
168     for (auto handle : handles) {
169         EXPECT_NE(handle, nullptr);
170         uint32_t count = 80;
171         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetAvailableClocks(handle, &count, nullptr));
172         EXPECT_EQ(numClocks, count);
173     }
174 }
175 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleAndZeroCountWhenCountIsLessThanNumClocksThenCallSucceeds)176 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleAndZeroCountWhenCountIsLessThanNumClocksThenCallSucceeds) {
177     auto handles = get_freq_handles(handleComponentCount);
178     for (auto handle : handles) {
179         EXPECT_NE(handle, nullptr);
180         uint32_t count = 20;
181         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetAvailableClocks(handle, &count, nullptr));
182     }
183 }
184 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleAndCorrectCountWhenCallingzesFrequencyGetAvailableClocksThenCallSucceeds)185 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleAndCorrectCountWhenCallingzesFrequencyGetAvailableClocksThenCallSucceeds) {
186     auto handles = get_freq_handles(handleComponentCount);
187     for (auto handle : handles) {
188         uint32_t count = 0;
189 
190         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetAvailableClocks(handle, &count, nullptr));
191         EXPECT_EQ(numClocks, count);
192 
193         double *clocks = new double[count];
194         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetAvailableClocks(handle, &count, clocks));
195         EXPECT_EQ(numClocks, count);
196         for (uint32_t i = 0; i < count; i++) {
197             EXPECT_DOUBLE_EQ(clockValue(minFreq + (step * i)), clocks[i]);
198         }
199         delete[] clocks;
200     }
201 }
202 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidateFrequencyGetRangeWhengetMaxAndgetMinFailsThenFrequencyGetRangeCallReturnsNegativeValuesForRange)203 TEST_F(SysmanDeviceFrequencyFixture, GivenValidateFrequencyGetRangeWhengetMaxAndgetMinFailsThenFrequencyGetRangeCallReturnsNegativeValuesForRange) {
204     auto pFrequencyImp = std::make_unique<FrequencyImp>(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU);
205     zes_freq_range_t limit = {};
206     ON_CALL(*pSysfsAccess.get(), read(_, _))
207         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValReturnErrorNotAvailable));
208     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetRange(&limit));
209     EXPECT_EQ(-1, limit.max);
210     EXPECT_EQ(-1, limit.min);
211 
212     ON_CALL(*pSysfsAccess.get(), read(_, _))
213         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValReturnErrorUnknown));
214     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetRange(&limit));
215     EXPECT_EQ(-1, limit.max);
216     EXPECT_EQ(-1, limit.min);
217 }
218 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyGetRangeThenVerifyzesFrequencyGetRangeTestCallSucceeds)219 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyGetRangeThenVerifyzesFrequencyGetRangeTestCallSucceeds) {
220     auto handles = get_freq_handles(handleComponentCount);
221     for (auto handle : handles) {
222         zes_freq_range_t limits;
223         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetRange(handle, &limits));
224         EXPECT_DOUBLE_EQ(minFreq, limits.min);
225         EXPECT_DOUBLE_EQ(maxFreq, limits.max);
226     }
227 }
228 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyLimitsWhenCallingFrequencySetRangeForFailures1ThenAPIExitsGracefully)229 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyLimitsWhenCallingFrequencySetRangeForFailures1ThenAPIExitsGracefully) {
230     auto pFrequencyImp = std::make_unique<FrequencyImp>(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU);
231     zes_freq_range_t limits = {};
232 
233     // Verify that Max must be within range.
234     limits.min = minFreq;
235     limits.max = 600.0;
236     ON_CALL(*pSysfsAccess.get(), write(_, _))
237         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValMinReturnErrorNotAvailable));
238     EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pFrequencyImp->frequencySetRange(&limits));
239 
240     ON_CALL(*pSysfsAccess.get(), write(_, _))
241         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValMinReturnErrorUnknown));
242     EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, pFrequencyImp->frequencySetRange(&limits));
243 }
244 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyLimitsWhenCallingFrequencySetRangeForFailures2ThenAPIExitsGracefully)245 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyLimitsWhenCallingFrequencySetRangeForFailures2ThenAPIExitsGracefully) {
246     auto pFrequencyImp = std::make_unique<FrequencyImp>(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU);
247     zes_freq_range_t limits = {};
248 
249     // Verify that Max must be within range.
250     limits.min = 900.0;
251     limits.max = maxFreq;
252     ON_CALL(*pSysfsAccess.get(), write(_, _))
253         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValMaxReturnErrorNotAvailable));
254     EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pFrequencyImp->frequencySetRange(&limits));
255 
256     ON_CALL(*pSysfsAccess.get(), write(_, _))
257         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValMaxReturnErrorUnknown));
258     EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, pFrequencyImp->frequencySetRange(&limits));
259 }
260 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeThenVerifyzesFrequencySetRangeTest1CallSucceeds)261 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeThenVerifyzesFrequencySetRangeTest1CallSucceeds) {
262     auto handles = get_freq_handles(handleComponentCount);
263     for (auto handle : handles) {
264         const double startingMin = 900.0;
265         const double newMax = 600.0;
266         zes_freq_range_t limits;
267 
268         pSysfsAccess->setVal(minFreqFile, startingMin);
269         // If the new Max value is less than the old Min
270         // value, the new Min must be set before the new Max
271         limits.min = minFreq;
272         limits.max = newMax;
273         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencySetRange(handle, &limits));
274         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetRange(handle, &limits));
275         EXPECT_DOUBLE_EQ(minFreq, limits.min);
276         EXPECT_DOUBLE_EQ(newMax, limits.max);
277     }
278 }
279 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeThenVerifyzesFrequencySetRangeTest2CallSucceeds)280 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeThenVerifyzesFrequencySetRangeTest2CallSucceeds) {
281     auto handles = get_freq_handles(handleComponentCount);
282     for (auto handle : handles) {
283         const double startingMax = 600.0;
284         const double newMin = 900.0;
285         zes_freq_range_t limits;
286 
287         pSysfsAccess->setVal(maxFreqFile, startingMax);
288         // If the new Min value is greater than the old Max
289         // value, the new Max must be set before the new Min
290         limits.min = newMin;
291         limits.max = maxFreq;
292         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencySetRange(handle, &limits));
293         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetRange(handle, &limits));
294         EXPECT_DOUBLE_EQ(newMin, limits.min);
295         EXPECT_DOUBLE_EQ(maxFreq, limits.max);
296     }
297 }
298 
TEST_F(SysmanDeviceFrequencyFixture,GivenInvalidFrequencyLimitsWhenCallingFrequencySetRangeThenVerifyFrequencySetRangeTest4ReturnsError)299 TEST_F(SysmanDeviceFrequencyFixture, GivenInvalidFrequencyLimitsWhenCallingFrequencySetRangeThenVerifyFrequencySetRangeTest4ReturnsError) {
300     auto pFrequencyImp = std::make_unique<FrequencyImp>(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU);
301     zes_freq_range_t limits;
302 
303     // Verify that Max must be greater than min range.
304     limits.min = clockValue(maxFreq + step);
305     limits.max = minFreq;
306     EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, pFrequencyImp->frequencySetRange(&limits));
307 }
308 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyGetStateThenVerifyzesFrequencyGetStateTestCallSucceeds)309 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyGetStateThenVerifyzesFrequencyGetStateTestCallSucceeds) {
310     auto handles = get_freq_handles(handleComponentCount);
311     for (auto handle : handles) {
312         const double testRequestValue = 450.0;
313         const double testTdpValue = 1200.0;
314         const double testEfficientValue = 400.0;
315         const double testActualValue = 550.0;
316         zes_freq_state_t state;
317 
318         pSysfsAccess->setVal(requestFreqFile, testRequestValue);
319         pSysfsAccess->setVal(tdpFreqFile, testTdpValue);
320         pSysfsAccess->setVal(actualFreqFile, testActualValue);
321         pSysfsAccess->setVal(efficientFreqFile, testEfficientValue);
322         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetState(handle, &state));
323         EXPECT_DOUBLE_EQ(testRequestValue, state.request);
324         EXPECT_DOUBLE_EQ(testTdpValue, state.tdp);
325         EXPECT_DOUBLE_EQ(testEfficientValue, state.efficient);
326         EXPECT_DOUBLE_EQ(testActualValue, state.actual);
327         EXPECT_EQ(0u, state.throttleReasons);
328         EXPECT_EQ(nullptr, state.pNext);
329         EXPECT_LE(state.currentVoltage, 0);
330     }
331 }
332 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyGetStateWithLegacyPathThenVerifyzesFrequencyGetStateTestCallSucceeds)333 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyGetStateWithLegacyPathThenVerifyzesFrequencyGetStateTestCallSucceeds) {
334     ON_CALL(*pSysfsAccess.get(), read(_, _))
335         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValLegacy));
336     ON_CALL(*pSysfsAccess.get(), write(_, _))
337         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValLegacy));
338     ON_CALL(*pSysfsAccess.get(), directoryExists(_))
339         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::mockDirectoryExistsFailure));
340     for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
341         delete handle;
342     }
343     pSysmanDeviceImp->pFrequencyHandleContext->handleList.clear();
344     pSysmanDeviceImp->pFrequencyHandleContext->init(deviceHandles);
345 
346     auto handles = get_freq_handles(handleComponentCount);
347     for (auto handle : handles) {
348         const double testRequestValue = 400.0;
349         const double testTdpValue = 1100.0;
350         const double testEfficientValue = 300.0;
351         const double testActualValue = 550.0;
352         zes_freq_state_t state;
353 
354         pSysfsAccess->setValLegacy(requestFreqFileLegacy, testRequestValue);
355         pSysfsAccess->setValLegacy(tdpFreqFileLegacy, testTdpValue);
356         pSysfsAccess->setValLegacy(actualFreqFileLegacy, testActualValue);
357         pSysfsAccess->setValLegacy(efficientFreqFileLegacy, testEfficientValue);
358         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetState(handle, &state));
359         EXPECT_DOUBLE_EQ(testRequestValue, state.request);
360         EXPECT_DOUBLE_EQ(testTdpValue, state.tdp);
361         EXPECT_DOUBLE_EQ(testEfficientValue, state.efficient);
362         EXPECT_DOUBLE_EQ(testActualValue, state.actual);
363         EXPECT_EQ(0u, state.throttleReasons);
364         EXPECT_EQ(nullptr, state.pNext);
365         EXPECT_LE(state.currentVoltage, 0);
366     }
367 }
368 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyGetRangeWithLegacyPathThenVerifyzesFrequencyGetRangeTestCallSucceeds)369 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyGetRangeWithLegacyPathThenVerifyzesFrequencyGetRangeTestCallSucceeds) {
370     ON_CALL(*pSysfsAccess.get(), read(_, _))
371         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValLegacy));
372     ON_CALL(*pSysfsAccess.get(), write(_, _))
373         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValLegacy));
374     ON_CALL(*pSysfsAccess.get(), directoryExists(_))
375         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::mockDirectoryExistsFailure));
376     for (auto handle : pSysmanDeviceImp->pFrequencyHandleContext->handleList) {
377         delete handle;
378     }
379     pSysmanDeviceImp->pFrequencyHandleContext->handleList.clear();
380     pSysmanDeviceImp->pFrequencyHandleContext->init(deviceHandles);
381     auto handles = get_freq_handles(handleComponentCount);
382     double minFreqLegacy = 400.0;
383     double maxFreqLegacy = 1200.0;
384     pSysfsAccess->setValLegacy(minFreqFileLegacy, minFreqLegacy);
385     pSysfsAccess->setValLegacy(maxFreqFileLegacy, maxFreqLegacy);
386     for (auto handle : handles) {
387         zes_freq_range_t limits;
388         EXPECT_EQ(ZE_RESULT_SUCCESS, zesFrequencyGetRange(handle, &limits));
389         EXPECT_DOUBLE_EQ(minFreqLegacy, limits.min);
390         EXPECT_DOUBLE_EQ(maxFreqLegacy, limits.max);
391     }
392 }
393 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidStatePointerWhenValidatingfrequencyGetStateWhenOneOfTheFrequencyStateThenNegativeValueIsReturned)394 TEST_F(SysmanDeviceFrequencyFixture, GivenValidStatePointerWhenValidatingfrequencyGetStateWhenOneOfTheFrequencyStateThenNegativeValueIsReturned) {
395     auto pFrequencyImp = std::make_unique<FrequencyImp>(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU);
396     zes_freq_state_t state = {};
397     ON_CALL(*pSysfsAccess.get(), read(_, _))
398         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValRequestReturnErrorNotAvailable));
399     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
400     EXPECT_EQ(-1, state.request);
401 
402     ON_CALL(*pSysfsAccess.get(), read(_, _))
403         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValRequestReturnErrorUnknown));
404     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
405     EXPECT_EQ(-1, state.request);
406 
407     ON_CALL(*pSysfsAccess.get(), read(_, _))
408         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValTdpReturnErrorNotAvailable));
409     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
410     EXPECT_EQ(-1, state.tdp);
411 
412     ON_CALL(*pSysfsAccess.get(), read(_, _))
413         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValTdpReturnErrorUnknown));
414     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
415     EXPECT_EQ(-1, state.tdp);
416 
417     ON_CALL(*pSysfsAccess.get(), read(_, _))
418         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValEfficientReturnErrorNotAvailable));
419     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
420     EXPECT_EQ(-1, state.efficient);
421 
422     ON_CALL(*pSysfsAccess.get(), read(_, _))
423         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValEfficientReturnErrorUnknown));
424     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
425     EXPECT_EQ(-1, state.efficient);
426 
427     ON_CALL(*pSysfsAccess.get(), read(_, _))
428         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValActualReturnErrorNotAvailable));
429     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
430     EXPECT_EQ(-1, state.actual);
431 
432     ON_CALL(*pSysfsAccess.get(), read(_, _))
433         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValActualReturnErrorUnknown));
434     EXPECT_EQ(ZE_RESULT_SUCCESS, pFrequencyImp->frequencyGetState(&state));
435     EXPECT_EQ(-1, state.actual);
436 }
437 
TEST_F(SysmanDeviceFrequencyFixture,GivenThrottleTimeStructPointerWhenCallingfrequencyGetThrottleTimeThenUnsupportedIsReturned)438 TEST_F(SysmanDeviceFrequencyFixture, GivenThrottleTimeStructPointerWhenCallingfrequencyGetThrottleTimeThenUnsupportedIsReturned) {
439     auto pFrequencyImp = std::make_unique<FrequencyImp>(pOsSysman, device->toHandle(), ZES_FREQ_DOMAIN_GPU);
440     zes_freq_throttle_time_t throttleTime = {};
441     EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pFrequencyImp->frequencyGetThrottleTime(&throttleTime));
442 }
443 
TEST_F(SysmanDeviceFrequencyFixture,GivengetMinFunctionReturnsErrorWhenValidatinggetMinFailuresThenAPIReturnsErrorAccordingly)444 TEST_F(SysmanDeviceFrequencyFixture, GivengetMinFunctionReturnsErrorWhenValidatinggetMinFailuresThenAPIReturnsErrorAccordingly) {
445     PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 0, 0, ZES_FREQ_DOMAIN_GPU);
446     double min = 0;
447     ON_CALL(*pSysfsAccess.get(), read(_, _))
448         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValReturnErrorNotAvailable));
449     EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, linuxFrequencyImp.getMin(min));
450 
451     ON_CALL(*pSysfsAccess.get(), read(_, _))
452         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getValReturnErrorUnknown));
453     EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, linuxFrequencyImp.getMin(min));
454 }
455 
TEST_F(SysmanDeviceFrequencyFixture,GivengetMinValFunctionReturnsErrorWhenValidatinggetMinValFailuresThenAPIReturnsErrorAccordingly)456 TEST_F(SysmanDeviceFrequencyFixture, GivengetMinValFunctionReturnsErrorWhenValidatinggetMinValFailuresThenAPIReturnsErrorAccordingly) {
457     PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 0, 0, ZES_FREQ_DOMAIN_GPU);
458     double val = 0;
459     ON_CALL(*pSysfsAccess.get(), read(_, _))
460         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getMinValReturnErrorNotAvailable));
461     EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, linuxFrequencyImp.getMinVal(val));
462 
463     ON_CALL(*pSysfsAccess.get(), read(_, _))
464         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getMinValReturnErrorUnknown));
465     EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, linuxFrequencyImp.getMinVal(val));
466 }
467 
TEST_F(SysmanDeviceFrequencyFixture,GivengetMaxValFunctionReturnsErrorWhenValidatinggetMaxValFailuresThenAPIReturnsErrorAccordingly)468 TEST_F(SysmanDeviceFrequencyFixture, GivengetMaxValFunctionReturnsErrorWhenValidatinggetMaxValFailuresThenAPIReturnsErrorAccordingly) {
469     PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 0, 0, ZES_FREQ_DOMAIN_GPU);
470     double val = 0;
471     ON_CALL(*pSysfsAccess.get(), read(_, _))
472         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getMaxValReturnErrorNotAvailable));
473     EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, linuxFrequencyImp.getMaxVal(val));
474 
475     ON_CALL(*pSysfsAccess.get(), read(_, _))
476         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getMaxValReturnErrorUnknown));
477     EXPECT_EQ(ZE_RESULT_ERROR_UNKNOWN, linuxFrequencyImp.getMaxVal(val));
478 }
479 
TEST_F(SysmanDeviceFrequencyFixture,GivengetMaxValFunctionReturnsErrorWhenValidatingosFrequencyGetPropertiesThenAPIBehavesAsExpected)480 TEST_F(SysmanDeviceFrequencyFixture, GivengetMaxValFunctionReturnsErrorWhenValidatingosFrequencyGetPropertiesThenAPIBehavesAsExpected) {
481     zes_freq_properties_t properties = {};
482     PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 0, 0, ZES_FREQ_DOMAIN_GPU);
483     ON_CALL(*pSysfsAccess.get(), read(_, _))
484         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getMaxValReturnErrorNotAvailable));
485     EXPECT_EQ(ZE_RESULT_SUCCESS, linuxFrequencyImp.osFrequencyGetProperties(properties));
486     EXPECT_EQ(0, properties.canControl);
487 }
488 
TEST_F(SysmanDeviceFrequencyFixture,GivengetMinValFunctionReturnsErrorWhenValidatingosFrequencyGetPropertiesThenAPIBehavesAsExpected)489 TEST_F(SysmanDeviceFrequencyFixture, GivengetMinValFunctionReturnsErrorWhenValidatingosFrequencyGetPropertiesThenAPIBehavesAsExpected) {
490     zes_freq_properties_t properties = {};
491     PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 0, 0, ZES_FREQ_DOMAIN_GPU);
492     ON_CALL(*pSysfsAccess.get(), read(_, _))
493         .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::getMinValReturnErrorNotAvailable));
494     EXPECT_EQ(ZE_RESULT_SUCCESS, linuxFrequencyImp.osFrequencyGetProperties(properties));
495     EXPECT_EQ(0, properties.canControl);
496 }
497 
TEST_F(SysmanDeviceFrequencyFixture,GivenOnSubdeviceSetWhenValidatingAnyFrequencyAPIThenSuccessIsReturned)498 TEST_F(SysmanDeviceFrequencyFixture, GivenOnSubdeviceSetWhenValidatingAnyFrequencyAPIThenSuccessIsReturned) {
499     zes_freq_properties_t properties = {};
500     PublicLinuxFrequencyImp linuxFrequencyImp(pOsSysman, 1, 0, ZES_FREQ_DOMAIN_GPU);
501     EXPECT_EQ(ZE_RESULT_SUCCESS, linuxFrequencyImp.osFrequencyGetProperties(properties));
502     EXPECT_EQ(1, properties.canControl);
503 }
504 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeAndIfgetMaxFailsThenVerifyzesFrequencySetRangeTestCallFail)505 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeAndIfgetMaxFailsThenVerifyzesFrequencySetRangeTestCallFail) {
506     auto handles = get_freq_handles(handleComponentCount);
507     for (auto handle : handles) {
508         const double startingMax = 600.0;
509         const double newMin = 900.0;
510         zes_freq_range_t limits;
511 
512         pSysfsAccess->setVal(maxFreqFile, startingMax);
513         // If the new Min value is greater than the old Max
514         // value, the new Max must be set before the new Min
515         limits.min = newMin;
516         limits.max = maxFreq;
517         ON_CALL(*pSysfsAccess.get(), read(_, _))
518             .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValMaxReturnErrorNotAvailable));
519         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencySetRange(handle, &limits));
520     }
521 }
522 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeAndIfsetMaxFailsThenVerifyzesFrequencySetRangeTestCallFail)523 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencySetRangeAndIfsetMaxFailsThenVerifyzesFrequencySetRangeTestCallFail) {
524     auto handles = get_freq_handles(handleComponentCount);
525     for (auto handle : handles) {
526         const double startingMax = 600.0;
527         const double newMin = 900.0;
528         zes_freq_range_t limits;
529 
530         pSysfsAccess->setVal(maxFreqFile, startingMax);
531         // If the new Min value is greater than the old Max
532         // value, the new Max must be set before the new Min
533         limits.min = newMin;
534         limits.max = maxFreq;
535         ON_CALL(*pSysfsAccess.get(), write(_, _))
536             .WillByDefault(::testing::Invoke(pSysfsAccess.get(), &Mock<FrequencySysfsAccess>::setValMaxReturnErrorNotAvailable));
537         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencySetRange(handle, &limits));
538     }
539 }
540 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetFrequencyTargetThenVerifyTestCallFail)541 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetFrequencyTargetThenVerifyTestCallFail) {
542     auto handles = get_freq_handles(handleComponentCount);
543     for (auto handle : handles) {
544         double freqTarget = 0.0;
545         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcGetFrequencyTarget(handle, &freqTarget));
546     }
547 }
548 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetFrequencyTargetThenVerifyTestCallFail)549 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetFrequencyTargetThenVerifyTestCallFail) {
550     auto handles = get_freq_handles(handleComponentCount);
551     for (auto handle : handles) {
552         double freqTarget = 0.0;
553         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcSetFrequencyTarget(handle, freqTarget));
554     }
555 }
556 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetVoltageTargetThenVerifyTestCallFail)557 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetVoltageTargetThenVerifyTestCallFail) {
558     auto handles = get_freq_handles(handleComponentCount);
559     for (auto handle : handles) {
560         double voltTarget = 0.0, voltOffset = 0.0;
561         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcGetVoltageTarget(handle, &voltTarget, &voltOffset));
562     }
563 }
564 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetVoltageTargetThenVerifyTestCallFail)565 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetVoltageTargetThenVerifyTestCallFail) {
566     auto handles = get_freq_handles(handleComponentCount);
567     for (auto handle : handles) {
568         double voltTarget = 0.0, voltOffset = 0.0;
569         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcSetVoltageTarget(handle, voltTarget, voltOffset));
570     }
571 }
572 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetModeThenVerifyTestCallFail)573 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetModeThenVerifyTestCallFail) {
574     auto handles = get_freq_handles(handleComponentCount);
575     for (auto handle : handles) {
576         zes_oc_mode_t mode = ZES_OC_MODE_OFF;
577         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcSetMode(handle, mode));
578     }
579 }
580 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetModeThenVerifyTestCallFail)581 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetModeThenVerifyTestCallFail) {
582     auto handles = get_freq_handles(handleComponentCount);
583     for (auto handle : handles) {
584         zes_oc_mode_t mode = ZES_OC_MODE_OFF;
585         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcGetMode(handle, &mode));
586     }
587 }
588 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetCapabilitiesThenVerifyTestCallFail)589 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetCapabilitiesThenVerifyTestCallFail) {
590     auto handles = get_freq_handles(handleComponentCount);
591     for (auto handle : handles) {
592         zes_oc_capabilities_t caps = {};
593         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcGetCapabilities(handle, &caps));
594     }
595 }
596 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetIccMaxThenVerifyTestCallFail)597 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetIccMaxThenVerifyTestCallFail) {
598     auto handles = get_freq_handles(handleComponentCount);
599     for (auto handle : handles) {
600         double iccMax = 0.0;
601         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcGetIccMax(handle, &iccMax));
602     }
603 }
604 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetIccMaxThenVerifyTestCallFail)605 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetIccMaxThenVerifyTestCallFail) {
606     auto handles = get_freq_handles(handleComponentCount);
607     for (auto handle : handles) {
608         double iccMax = 0.0;
609         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcSetIccMax(handle, iccMax));
610     }
611 }
612 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetTjMaxThenVerifyTestCallFail)613 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcGetTjMaxThenVerifyTestCallFail) {
614     auto handles = get_freq_handles(handleComponentCount);
615     for (auto handle : handles) {
616         double tjMax = 0.0;
617         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcGetTjMax(handle, &tjMax));
618     }
619 }
620 
TEST_F(SysmanDeviceFrequencyFixture,GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetTjMaxThenVerifyTestCallFail)621 TEST_F(SysmanDeviceFrequencyFixture, GivenValidFrequencyHandleWhenCallingzesFrequencyOcSetTjMaxThenVerifyTestCallFail) {
622     auto handles = get_freq_handles(handleComponentCount);
623     for (auto handle : handles) {
624         double tjMax = 0.0;
625         EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFrequencyOcSetTjMax(handle, tjMax));
626     }
627 }
628 
TEST_F(SysmanMultiDeviceFixture,GivenValidDevicePointerWhenGettingFrequencyPropertiesThenValidSchedPropertiesRetrieved)629 TEST_F(SysmanMultiDeviceFixture, GivenValidDevicePointerWhenGettingFrequencyPropertiesThenValidSchedPropertiesRetrieved) {
630     zes_freq_properties_t properties = {};
631     ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES};
632     Device::fromHandle(device)->getProperties(&deviceProperties);
633     LinuxFrequencyImp *pLinuxFrequencyImp = new LinuxFrequencyImp(pOsSysman, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE,
634                                                                   deviceProperties.subdeviceId, ZES_FREQ_DOMAIN_GPU);
635     EXPECT_EQ(ZE_RESULT_SUCCESS, pLinuxFrequencyImp->osFrequencyGetProperties(properties));
636     EXPECT_EQ(properties.subdeviceId, deviceProperties.subdeviceId);
637     EXPECT_EQ(properties.onSubdevice, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE);
638     delete pLinuxFrequencyImp;
639 }
640 
641 } // namespace ult
642 } // namespace L0
643