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