1 /*
2 * Copyright (C) 2020-2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.h"
9 #include "level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/mock_temperature.h"
10 #include "level_zero/tools/test/unit_tests/sources/sysman/windows/mock_sysman_fixture.h"
11
12 extern bool sysmanUltsEnable;
13
14 namespace L0 {
15 namespace ult {
16
17 constexpr uint32_t temperatureHandleComponentCount = 3u;
18 class SysmanDeviceTemperatureFixture : public SysmanDeviceFixture {
19
20 protected:
21 Mock<TemperatureKmdSysManager> *pKmdSysManager = nullptr;
22 KmdSysManager *pOriginalKmdSysManager = nullptr;
23 std::vector<ze_device_handle_t> deviceHandles;
SetUp()24 void SetUp() override {
25 if (!sysmanUltsEnable) {
26 GTEST_SKIP();
27 }
28 SysmanDeviceFixture::SetUp();
29
30 pKmdSysManager = new Mock<TemperatureKmdSysManager>;
31
32 EXPECT_CALL(*pKmdSysManager, escape(_, _, _, _, _))
33 .WillRepeatedly(::testing::Invoke(pKmdSysManager, &Mock<TemperatureKmdSysManager>::mock_escape));
34
35 pOriginalKmdSysManager = pWddmSysmanImp->pKmdSysManager;
36 pWddmSysmanImp->pKmdSysManager = pKmdSysManager;
37
38 for (auto handle : pSysmanDeviceImp->pTempHandleContext->handleList) {
39 delete handle;
40 }
41
42 pSysmanDeviceImp->pTempHandleContext->handleList.clear();
43 uint32_t subDeviceCount = 0;
44 // We received a device handle. Check for subdevices in this device
45 Device::fromHandle(device->toHandle())->getSubDevices(&subDeviceCount, nullptr);
46 if (subDeviceCount == 0) {
47 deviceHandles.resize(1, device->toHandle());
48 } else {
49 deviceHandles.resize(subDeviceCount, nullptr);
50 Device::fromHandle(device->toHandle())->getSubDevices(&subDeviceCount, deviceHandles.data());
51 }
52 pSysmanDeviceImp->pTempHandleContext->init(deviceHandles);
53 }
TearDown()54 void TearDown() override {
55 if (!sysmanUltsEnable) {
56 GTEST_SKIP();
57 }
58 SysmanDeviceFixture::TearDown();
59 pWddmSysmanImp->pKmdSysManager = pOriginalKmdSysManager;
60 if (pKmdSysManager != nullptr) {
61 delete pKmdSysManager;
62 pKmdSysManager = nullptr;
63 }
64 }
65
get_temp_handles(uint32_t count)66 std::vector<zes_temp_handle_t> get_temp_handles(uint32_t count) {
67 std::vector<zes_temp_handle_t> handles(count, nullptr);
68 EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, handles.data()), ZE_RESULT_SUCCESS);
69 return handles;
70 }
71 };
72
TEST_F(SysmanDeviceTemperatureFixture,GivenComponentCountZeroWhenEnumeratingTemperatureSensorsThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds)73 TEST_F(SysmanDeviceTemperatureFixture, GivenComponentCountZeroWhenEnumeratingTemperatureSensorsThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds) {
74 uint32_t count = 0;
75 EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS);
76 EXPECT_EQ(count, temperatureHandleComponentCount);
77 }
78
TEST_F(SysmanDeviceTemperatureFixture,GivenInvalidComponentCountWhenEnumeratingTemperatureSensorsThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds)79 TEST_F(SysmanDeviceTemperatureFixture, GivenInvalidComponentCountWhenEnumeratingTemperatureSensorsThenValidCountIsReturnedAndVerifySysmanPowerGetCallSucceeds) {
80 uint32_t count = 0;
81 EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS);
82 EXPECT_EQ(count, temperatureHandleComponentCount);
83
84 count = count + 1;
85 EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS);
86 EXPECT_EQ(count, temperatureHandleComponentCount);
87 }
88
TEST_F(SysmanDeviceTemperatureFixture,GivenComponentCountZeroWhenEnumeratingTemperatureSensorsThenValidPowerHandlesIsReturned)89 TEST_F(SysmanDeviceTemperatureFixture, GivenComponentCountZeroWhenEnumeratingTemperatureSensorsThenValidPowerHandlesIsReturned) {
90 uint32_t count = 0;
91 EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS);
92 EXPECT_EQ(count, temperatureHandleComponentCount);
93
94 std::vector<zes_temp_handle_t> handles(count, nullptr);
95 EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, handles.data()), ZE_RESULT_SUCCESS);
96 for (auto handle : handles) {
97 EXPECT_NE(handle, nullptr);
98 }
99 }
100
TEST_F(SysmanDeviceTemperatureFixture,GivenValidPowerHandleWhenGettingTemperaturePropertiesAllowSetToTrueThenCallSucceeds)101 TEST_F(SysmanDeviceTemperatureFixture, GivenValidPowerHandleWhenGettingTemperaturePropertiesAllowSetToTrueThenCallSucceeds) {
102 auto handles = get_temp_handles(temperatureHandleComponentCount);
103 uint32_t sensorTypeIndex = 0;
104 for (auto handle : handles) {
105 zes_temp_properties_t properties;
106
107 ze_result_t result = zesTemperatureGetProperties(handle, &properties);
108
109 EXPECT_EQ(ZE_RESULT_SUCCESS, result);
110 EXPECT_FALSE(properties.onSubdevice);
111 EXPECT_EQ(properties.subdeviceId, 0);
112 EXPECT_FALSE(properties.isCriticalTempSupported);
113 EXPECT_FALSE(properties.isThreshold1Supported);
114 EXPECT_FALSE(properties.isThreshold2Supported);
115 EXPECT_EQ(properties.maxTemperature, pKmdSysManager->mockMaxTemperature);
116 EXPECT_EQ(properties.type, pKmdSysManager->mockSensorTypes[sensorTypeIndex++]);
117 }
118 }
119
TEST_F(SysmanDeviceTemperatureFixture,GivenValidTempHandleWhenGettingMemoryTemperatureThenValidTemperatureReadingsRetrieved)120 TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingMemoryTemperatureThenValidTemperatureReadingsRetrieved) {
121 auto handles = get_temp_handles(temperatureHandleComponentCount);
122 double temperature;
123 ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_MEMORY], &temperature));
124 EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempMemory));
125 }
126
TEST_F(SysmanDeviceTemperatureFixture,GivenValidTempHandleWhenGettingGPUTemperatureThenValidTemperatureReadingsRetrieved)127 TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGPUTemperatureThenValidTemperatureReadingsRetrieved) {
128 auto handles = get_temp_handles(temperatureHandleComponentCount);
129 double temperature;
130 ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_GPU], &temperature));
131 EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempGPU));
132 }
133
TEST_F(SysmanDeviceTemperatureFixture,GivenValidTempHandleWhenGettingGlobalTemperatureThenValidTemperatureReadingsRetrieved)134 TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGlobalTemperatureThenValidTemperatureReadingsRetrieved) {
135 auto handles = get_temp_handles(temperatureHandleComponentCount);
136 double temperature;
137 ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_GLOBAL], &temperature));
138 EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempGlobal));
139 }
140
TEST_F(SysmanDeviceTemperatureFixture,GivenValidTempHandleWhenGettingUnsupportedSensorsTemperatureThenUnsupportedReturned)141 TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingUnsupportedSensorsTemperatureThenUnsupportedReturned) {
142 auto pTemperatureImpMemory = std::make_unique<TemperatureImp>(deviceHandles[0], pOsSysman, ZES_TEMP_SENSORS_GLOBAL_MIN);
143 auto pWddmTemperatureImp = static_cast<WddmTemperatureImp *>(pTemperatureImpMemory->pOsTemperature.get());
144 double pTemperature = 0;
145 EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pWddmTemperatureImp->getSensorTemperature(&pTemperature));
146 }
147
TEST_F(SysmanDeviceTemperatureFixture,GivenValidTempHandleWhenGettingTemperatureConfigThenUnsupportedIsReturned)148 TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingTemperatureConfigThenUnsupportedIsReturned) {
149 auto handles = get_temp_handles(temperatureHandleComponentCount);
150 for (auto handle : handles) {
151 zes_temp_config_t config = {};
152 EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesTemperatureGetConfig(handle, &config));
153 }
154 }
155
TEST_F(SysmanDeviceTemperatureFixture,GivenValidTempHandleWhenSettingTemperatureConfigThenUnsupportedIsReturned)156 TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenSettingTemperatureConfigThenUnsupportedIsReturned) {
157 auto handles = get_temp_handles(temperatureHandleComponentCount);
158 for (auto handle : handles) {
159 zes_temp_config_t config = {};
160 EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesTemperatureSetConfig(handle, &config));
161 }
162 }
163
164 } // namespace ult
165 } // namespace L0
166