feature(sysman): Fetch temp from PMT on windows

Related-To: NEO-10663

Signed-off-by: shubham kumar <shubham.kumar@intel.com>
This commit is contained in:
shubham kumar 2024-04-10 12:49:58 +00:00 committed by Compute-Runtime-Automation
parent f62b49a237
commit f673a255f7
12 changed files with 80 additions and 45 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2020-2023 Intel Corporation * Copyright (C) 2020-2024 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -7,6 +7,7 @@
#include "level_zero/sysman/source/api/temperature/windows/sysman_os_temperature_imp.h" #include "level_zero/sysman/source/api/temperature/windows/sysman_os_temperature_imp.h"
#include "level_zero/sysman/source/shared/windows/product_helper/sysman_product_helper.h"
#include "level_zero/sysman/source/shared/windows/sysman_kmd_sys_manager.h" #include "level_zero/sysman/source/shared/windows/sysman_kmd_sys_manager.h"
namespace L0 { namespace L0 {
@ -79,41 +80,8 @@ ze_result_t WddmTemperatureImp::getProperties(zes_temp_properties_t *pProperties
} }
ze_result_t WddmTemperatureImp::getSensorTemperature(double *pTemperature) { ze_result_t WddmTemperatureImp::getSensorTemperature(double *pTemperature) {
ze_result_t status = ZE_RESULT_SUCCESS; auto pSysmanProductHelper = pWddmSysmanImp->getSysmanProductHelper();
KmdSysman::RequestProperty request; return pSysmanProductHelper->getSensorTemperature(pTemperature, type, pWddmSysmanImp);
KmdSysman::ResponseProperty response;
request.commandId = KmdSysman::Command::Get;
request.componentId = KmdSysman::Component::TemperatureComponent;
request.requestId = KmdSysman::Requests::Temperature::CurrentTemperature;
switch (type) {
case ZES_TEMP_SENSORS_GLOBAL:
request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainPackage;
break;
case ZES_TEMP_SENSORS_GPU:
request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainDGPU;
break;
case ZES_TEMP_SENSORS_MEMORY:
request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainHBM;
break;
default:
*pTemperature = 0;
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
break;
}
status = pKmdSysManager->requestSingle(request, response);
if (status != ZE_RESULT_SUCCESS) {
return status;
}
uint32_t value = 0;
memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
*pTemperature = static_cast<double>(value);
return status;
} }
uint32_t WddmTemperatureImp::getNumTempDomainsSupported() { uint32_t WddmTemperatureImp::getNumTempDomainsSupported() {
@ -163,7 +131,7 @@ void WddmTemperatureImp::setSensorType(zes_temp_sensors_t sensorType) {
} }
WddmTemperatureImp::WddmTemperatureImp(OsSysman *pOsSysman) { WddmTemperatureImp::WddmTemperatureImp(OsSysman *pOsSysman) {
WddmSysmanImp *pWddmSysmanImp = static_cast<WddmSysmanImp *>(pOsSysman); pWddmSysmanImp = static_cast<WddmSysmanImp *>(pOsSysman);
pKmdSysManager = &pWddmSysmanImp->getKmdSysManager(); pKmdSysManager = &pWddmSysmanImp->getKmdSysManager();
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2020-2023 Intel Corporation * Copyright (C) 2020-2024 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -26,6 +26,7 @@ class WddmTemperatureImp : public OsTemperature, NEO::NonCopyableOrMovableClass
~WddmTemperatureImp() override = default; ~WddmTemperatureImp() override = default;
protected: protected:
WddmSysmanImp *pWddmSysmanImp = nullptr;
KmdSysManager *pKmdSysManager = nullptr; KmdSysManager *pKmdSysManager = nullptr;
zes_temp_sensors_t type = ZES_TEMP_SENSORS_GLOBAL; zes_temp_sensors_t type = ZES_TEMP_SENSORS_GLOBAL;
}; };

View File

@ -7,6 +7,7 @@
#pragma once #pragma once
#include "level_zero/sysman/source/shared/windows/zes_os_sysman_imp.h"
#include <level_zero/ze_api.h> #include <level_zero/ze_api.h>
#include <level_zero/zes_api.h> #include <level_zero/zes_api.h>
@ -39,6 +40,8 @@ class SysmanProductHelper {
} }
virtual ~SysmanProductHelper() = default; virtual ~SysmanProductHelper() = default;
// Temperature
virtual ze_result_t getSensorTemperature(double *pTemperature, zes_temp_sensors_t type, WddmSysmanImp *pWddmSysmanImp) = 0;
protected: protected:
SysmanProductHelper() = default; SysmanProductHelper() = default;

View File

@ -24,6 +24,9 @@ class SysmanProductHelperHw : public SysmanProductHelper {
~SysmanProductHelperHw() override = default; ~SysmanProductHelperHw() override = default;
// Temperature
ze_result_t getSensorTemperature(double *pTemperature, zes_temp_sensors_t type, WddmSysmanImp *pWddmSysmanImp) override;
protected: protected:
SysmanProductHelperHw() = default; SysmanProductHelperHw() = default;
}; };

View File

@ -11,5 +11,45 @@
namespace L0 { namespace L0 {
namespace Sysman { namespace Sysman {
template <PRODUCT_FAMILY gfxProduct>
ze_result_t SysmanProductHelperHw<gfxProduct>::getSensorTemperature(double *pTemperature, zes_temp_sensors_t type, WddmSysmanImp *pWddmSysmanImp) {
ze_result_t status = ZE_RESULT_SUCCESS;
KmdSysManager *pKmdSysManager = &pWddmSysmanImp->getKmdSysManager();
KmdSysman::RequestProperty request;
KmdSysman::ResponseProperty response;
request.commandId = KmdSysman::Command::Get;
request.componentId = KmdSysman::Component::TemperatureComponent;
request.requestId = KmdSysman::Requests::Temperature::CurrentTemperature;
switch (type) {
case ZES_TEMP_SENSORS_GLOBAL:
request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainPackage;
break;
case ZES_TEMP_SENSORS_GPU:
request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainDGPU;
break;
case ZES_TEMP_SENSORS_MEMORY:
request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainHBM;
break;
default:
*pTemperature = 0;
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
break;
}
status = pKmdSysManager->requestSingle(request, response);
if (status != ZE_RESULT_SUCCESS) {
return status;
}
uint32_t value = 0;
memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
*pTemperature = static_cast<double>(value);
return status;
}
} // namespace Sysman } // namespace Sysman
} // namespace L0 } // namespace L0

View File

@ -58,6 +58,10 @@ SysmanProductHelper *WddmSysmanImp::getSysmanProductHelper() {
return pSysmanProductHelper.get(); return pSysmanProductHelper.get();
} }
PlatformMonitoringTech *WddmSysmanImp::getSysmanPmt() {
return pPmt.get();
}
void WddmSysmanImp::createFwUtilInterface() { void WddmSysmanImp::createFwUtilInterface() {
const auto pciBusInfo = pParentSysmanDeviceImp->getRootDeviceEnvironment().osInterface->getDriverModel()->getPciBusInfo(); const auto pciBusInfo = pParentSysmanDeviceImp->getRootDeviceEnvironment().osInterface->getDriverModel()->getPciBusInfo();
const uint16_t domain = static_cast<uint16_t>(pciBusInfo.pciDomain); const uint16_t domain = static_cast<uint16_t>(pciBusInfo.pciDomain);

View File

@ -40,6 +40,7 @@ class WddmSysmanImp : public OsSysman, NEO::NonCopyableOrMovableClass {
const NEO::HardwareInfo &getHardwareInfo() const override { return pParentSysmanDeviceImp->getHardwareInfo(); } const NEO::HardwareInfo &getHardwareInfo() const override { return pParentSysmanDeviceImp->getHardwareInfo(); }
PRODUCT_FAMILY getProductFamily() const { return pParentSysmanDeviceImp->getProductFamily(); } PRODUCT_FAMILY getProductFamily() const { return pParentSysmanDeviceImp->getProductFamily(); }
SysmanProductHelper *getSysmanProductHelper(); SysmanProductHelper *getSysmanProductHelper();
PlatformMonitoringTech *getSysmanPmt();
protected: protected:
FirmwareUtil *pFwUtilInterface = nullptr; FirmwareUtil *pFwUtilInterface = nullptr;

View File

@ -1,5 +1,5 @@
# #
# Copyright (C) 2020-2023 Intel Corporation # Copyright (C) 2020-2024 Intel Corporation
# #
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
# #
@ -12,3 +12,4 @@ if(WIN32)
${CMAKE_CURRENT_SOURCE_DIR}/test_zes_temperature.cpp ${CMAKE_CURRENT_SOURCE_DIR}/test_zes_temperature.cpp
) )
endif() endif()
add_subdirectories()

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2020-2023 Intel Corporation * Copyright (C) 2020-2024 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -88,6 +88,12 @@ struct TemperatureKmdSysManager : public MockKmdSysManager {
} }
}; };
class PublicPlatformMonitoringTech : public L0::Sysman::PlatformMonitoringTech {
public:
PublicPlatformMonitoringTech(std::vector<wchar_t> deviceInterfaceList) : PlatformMonitoringTech(deviceInterfaceList) {}
using PlatformMonitoringTech::keyOffsetMap;
};
} // namespace ult } // namespace ult
} // namespace Sysman } // namespace Sysman
} // namespace L0 } // namespace L0

View File

@ -1,10 +1,12 @@
/* /*
* Copyright (C) 2020-2023 Intel Corporation * Copyright (C) 2020-2024 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
*/ */
#include "shared/test/common/test_macros/hw_test.h"
#include "level_zero/sysman/source/api/temperature/windows/sysman_os_temperature_imp.h" #include "level_zero/sysman/source/api/temperature/windows/sysman_os_temperature_imp.h"
#include "level_zero/sysman/test/unit_tests/sources/temperature/windows/mock_temperature.h" #include "level_zero/sysman/test/unit_tests/sources/temperature/windows/mock_temperature.h"
#include "level_zero/sysman/test/unit_tests/sources/windows/mock_sysman_fixture.h" #include "level_zero/sysman/test/unit_tests/sources/windows/mock_sysman_fixture.h"
@ -104,21 +106,21 @@ TEST_F(SysmanDeviceTemperatureFixture, GivenValidPowerHandleWhenGettingTemperatu
} }
} }
TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingMemoryTemperatureThenValidTemperatureReadingsRetrieved) { HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingMemoryTemperatureThenValidTemperatureReadingsRetrieved, IsAtMostDg2) {
auto handles = getTempHandles(temperatureHandleComponentCount); auto handles = getTempHandles(temperatureHandleComponentCount);
double temperature; double temperature;
ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_MEMORY], &temperature)); ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_MEMORY], &temperature));
EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempMemory)); EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempMemory));
} }
TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGPUTemperatureThenValidTemperatureReadingsRetrieved) { HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGPUTemperatureThenValidTemperatureReadingsRetrieved, IsAtMostDg2) {
auto handles = getTempHandles(temperatureHandleComponentCount); auto handles = getTempHandles(temperatureHandleComponentCount);
double temperature; double temperature;
ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_GPU], &temperature)); ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_GPU], &temperature));
EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempGPU)); EXPECT_EQ(temperature, static_cast<double>(pKmdSysManager->mockTempGPU));
} }
TEST_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGlobalTemperatureThenValidTemperatureReadingsRetrieved) { HWTEST2_F(SysmanDeviceTemperatureFixture, GivenValidTempHandleWhenGettingGlobalTemperatureThenValidTemperatureReadingsRetrieved, IsAtMostDg2) {
auto handles = getTempHandles(temperatureHandleComponentCount); auto handles = getTempHandles(temperatureHandleComponentCount);
double temperature; double temperature;
ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_GLOBAL], &temperature)); ASSERT_EQ(ZE_RESULT_SUCCESS, zesTemperatureGetState(handles[ZES_TEMP_SENSORS_GLOBAL], &temperature));

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2020-2023 Intel Corporation * Copyright (C) 2020-2024 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@ -27,6 +27,7 @@ class PublicWddmSysmanImp : public L0::Sysman::WddmSysmanImp {
public: public:
using WddmSysmanImp::pFwUtilInterface; using WddmSysmanImp::pFwUtilInterface;
using WddmSysmanImp::pKmdSysManager; using WddmSysmanImp::pKmdSysManager;
using WddmSysmanImp::pPmt;
}; };
class SysmanDeviceFixture : public ::testing::Test { class SysmanDeviceFixture : public ::testing::Test {

View File

@ -172,6 +172,11 @@ TEST_F(SysmanDevicePmtFixture, GivenInvalidPmtInterfaceWhenCallingCreateThenCall
EXPECT_EQ(nullptr, pPmt); EXPECT_EQ(nullptr, pPmt);
} }
TEST_F(SysmanDevicePmtFixture, GivenInvalidPmtInterfaceWhenCallingGetSysmanPmtThenCallReturnsNullPtr) {
PlatformMonitoringTech *pPmt = pWddmSysmanImp->getSysmanPmt();
EXPECT_EQ(nullptr, pPmt);
}
} // namespace ult } // namespace ult
} // namespace Sysman } // namespace Sysman
} // namespace L0 } // namespace L0