diff --git a/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.cpp b/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.cpp index 823e509239..8c01ededc1 100644 --- a/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.cpp +++ b/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.cpp @@ -116,10 +116,37 @@ ze_result_t WddmTemperatureImp::getSensorTemperature(double *pTemperature) { return status; } +uint32_t WddmTemperatureImp::getNumTempDomainsSupported() { + ze_result_t status = ZE_RESULT_SUCCESS; + KmdSysman::RequestProperty request; + KmdSysman::ResponseProperty response = {}; + uint32_t value = 0; + + request.paramInfo = static_cast(type); + request.commandId = KmdSysman::Command::Get; + request.componentId = KmdSysman::Component::TemperatureComponent; + request.requestId = KmdSysman::Requests::Temperature::NumTemperatureDomains; + + status = pKmdSysManager->requestSingle(request, response); + + if (status == ZE_RESULT_SUCCESS) { + if (response.returnCode == KmdSysman::KmdSysmanSuccess) { + memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t)); + } + } + + return value; +} + bool WddmTemperatureImp::isTempModuleSupported() { if ((type == ZES_TEMP_SENSORS_GLOBAL_MIN) || (type == ZES_TEMP_SENSORS_GPU_MIN)) { return false; } + + if (getNumTempDomainsSupported() == 0) { + return false; + } + KmdSysman::RequestProperty request; KmdSysman::ResponseProperty response; diff --git a/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.h b/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.h index 4aeb74a906..85c8a25949 100644 --- a/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.h +++ b/level_zero/sysman/source/temperature/windows/sysman_os_temperature_imp.h @@ -19,6 +19,7 @@ class WddmTemperatureImp : public OsTemperature, NEO::NonCopyableOrMovableClass ze_result_t getProperties(zes_temp_properties_t *pProperties) override; ze_result_t getSensorTemperature(double *pTemperature) override; bool isTempModuleSupported() override; + uint32_t getNumTempDomainsSupported(); void setSensorType(zes_temp_sensors_t sensorType); WddmTemperatureImp(OsSysman *pOsSysman); WddmTemperatureImp() = default; diff --git a/level_zero/sysman/test/unit_tests/sources/temperature/windows/mock_temperature.h b/level_zero/sysman/test/unit_tests/sources/temperature/windows/mock_temperature.h index 81ae170b2f..10107f5d6a 100644 --- a/level_zero/sysman/test/unit_tests/sources/temperature/windows/mock_temperature.h +++ b/level_zero/sysman/test/unit_tests/sources/temperature/windows/mock_temperature.h @@ -22,6 +22,7 @@ struct TemperatureKmdSysManager : public MockKmdSysManager { uint32_t mockTempGPU = 25; uint32_t mockTempMemory = 23; uint32_t mockMaxTemperature = 100; + bool isIntegrated = false; zes_temp_sensors_t mockSensorTypes[3] = {ZES_TEMP_SENSORS_GLOBAL, ZES_TEMP_SENSORS_GPU, ZES_TEMP_SENSORS_MEMORY}; void getTemperatureProperty(KmdSysman::GfxSysmanReqHeaderIn *pRequest, KmdSysman::GfxSysmanReqHeaderOut *pResponse) override { @@ -39,7 +40,11 @@ struct TemperatureKmdSysManager : public MockKmdSysManager { switch (pRequest->inRequestId) { case KmdSysman::Requests::Temperature::NumTemperatureDomains: { uint32_t *pValue = reinterpret_cast(pBuffer); - *pValue = mockTempDomainCount; + if (isIntegrated == true) { + *pValue = 0; + } else { + *pValue = mockTempDomainCount; + } pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess; pResponse->outDataSize = sizeof(uint32_t); } break; diff --git a/level_zero/sysman/test/unit_tests/sources/temperature/windows/test_zes_temperature.cpp b/level_zero/sysman/test/unit_tests/sources/temperature/windows/test_zes_temperature.cpp index 32603672c2..3dca6e15ea 100644 --- a/level_zero/sysman/test/unit_tests/sources/temperature/windows/test_zes_temperature.cpp +++ b/level_zero/sysman/test/unit_tests/sources/temperature/windows/test_zes_temperature.cpp @@ -70,6 +70,13 @@ TEST_F(SysmanDeviceTemperatureFixture, GivenComponentCountZeroWhenEnumeratingTem } } +TEST_F(SysmanDeviceTemperatureFixture, GivenValidDeviceHandleWhenEnumeratingTemperatureSensorsOnIntegratedDeviceThenZeroCountIsReturned) { + uint32_t count = 0; + pKmdSysManager->isIntegrated = true; + EXPECT_EQ(zesDeviceEnumTemperatureSensors(pSysmanDevice->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(count, 0); +} + TEST_F(SysmanDeviceTemperatureFixture, GivenValidPowerHandleWhenGettingTemperaturePropertiesAllowSetToTrueThenCallSucceeds) { auto handles = getTempHandles(temperatureHandleComponentCount); uint32_t sensorTypeIndex = 0; diff --git a/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.cpp b/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.cpp index a306ce6eec..7db5ced484 100644 --- a/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.cpp +++ b/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.cpp @@ -115,10 +115,37 @@ ze_result_t WddmTemperatureImp::getSensorTemperature(double *pTemperature) { return status; } +uint32_t WddmTemperatureImp::getNumTempDomainsSupported() { + ze_result_t status = ZE_RESULT_SUCCESS; + KmdSysman::RequestProperty request; + KmdSysman::ResponseProperty response = {}; + uint32_t value = 0; + + request.paramInfo = static_cast(type); + request.commandId = KmdSysman::Command::Get; + request.componentId = KmdSysman::Component::TemperatureComponent; + request.requestId = KmdSysman::Requests::Temperature::NumTemperatureDomains; + + status = pKmdSysManager->requestSingle(request, response); + + if (status == ZE_RESULT_SUCCESS) { + if (response.returnCode == KmdSysman::KmdSysmanSuccess) { + memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t)); + } + } + + return value; +} + bool WddmTemperatureImp::isTempModuleSupported() { if ((type == ZES_TEMP_SENSORS_GLOBAL_MIN) || (type == ZES_TEMP_SENSORS_GPU_MIN)) { return false; } + + if (getNumTempDomainsSupported() == 0) { + return false; + } + KmdSysman::RequestProperty request; KmdSysman::ResponseProperty response; diff --git a/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.h b/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.h index 326b198ed7..b0706530fa 100644 --- a/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.h +++ b/level_zero/tools/source/sysman/temperature/windows/os_temperature_imp.h @@ -18,7 +18,7 @@ class WddmTemperatureImp : public OsTemperature, NEO::NonCopyableOrMovableClass ze_result_t getProperties(zes_temp_properties_t *pProperties) override; ze_result_t getSensorTemperature(double *pTemperature) override; bool isTempModuleSupported() override; - + uint32_t getNumTempDomainsSupported(); void setSensorType(zes_temp_sensors_t sensorType); WddmTemperatureImp(OsSysman *pOsSysman); WddmTemperatureImp() = default; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/mock_temperature.h b/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/mock_temperature.h index b8729a10e7..52dc6589f4 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/mock_temperature.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/mock_temperature.h @@ -23,6 +23,7 @@ struct Mock : public TemperatureKmdSysManager { uint32_t mockTempGPU = 25; uint32_t mockTempMemory = 23; uint32_t mockMaxTemperature = 100; + bool isIntegrated = false; zes_temp_sensors_t mockSensorTypes[3] = {ZES_TEMP_SENSORS_GLOBAL, ZES_TEMP_SENSORS_GPU, ZES_TEMP_SENSORS_MEMORY}; void getTemperatureProperty(KmdSysman::GfxSysmanReqHeaderIn *pRequest, KmdSysman::GfxSysmanReqHeaderOut *pResponse) override { @@ -40,7 +41,11 @@ struct Mock : public TemperatureKmdSysManager { switch (pRequest->inRequestId) { case KmdSysman::Requests::Temperature::NumTemperatureDomains: { uint32_t *pValue = reinterpret_cast(pBuffer); - *pValue = mockTempDomainCount; + if (isIntegrated == true) { + *pValue = 0; + } else { + *pValue = mockTempDomainCount; + } pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess; pResponse->outDataSize = sizeof(uint32_t); } break; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/test_zes_temperature.cpp b/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/test_zes_temperature.cpp index c55000b22f..e8a263b924 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/test_zes_temperature.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/temperature/windows/test_zes_temperature.cpp @@ -87,6 +87,13 @@ TEST_F(SysmanDeviceTemperatureFixture, GivenComponentCountZeroWhenEnumeratingTem } } +TEST_F(SysmanDeviceTemperatureFixture, GivenValidDeviceHandleWhenEnumeratingTemperatureSensorsOnIntegratedDeviceThenZeroCountIsReturned) { + uint32_t count = 0; + pKmdSysManager->isIntegrated = true; + EXPECT_EQ(zesDeviceEnumTemperatureSensors(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(count, 0); +} + TEST_F(SysmanDeviceTemperatureFixture, GivenValidPowerHandleWhenGettingTemperaturePropertiesAllowSetToTrueThenCallSucceeds) { auto handles = getTempHandles(temperatureHandleComponentCount); uint32_t sensorTypeIndex = 0;