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