Implement FanGetConfig sysman API for windows

Signed-off-by: Ezhilsivam Shanmugam <ezhilsivam.shanmugam@intel.com>
This commit is contained in:
Ezhilsivam Shanmugam
2022-10-12 09:34:56 +00:00
committed by Compute-Runtime-Automation
parent 95c3ef28fc
commit 0a7166d10e
3 changed files with 123 additions and 5 deletions

View File

@@ -62,8 +62,45 @@ ze_result_t WddmFanImp::getProperties(zes_fan_properties_t *pProperties) {
return ZE_RESULT_SUCCESS;
}
ze_result_t WddmFanImp::getConfig(zes_fan_config_t *pConfig) {
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
KmdSysman::RequestProperty request;
KmdSysman::ResponseProperty response;
request.commandId = KmdSysman::Command::Get;
request.componentId = KmdSysman::Component::FanComponent;
request.requestId = KmdSysman::Requests::Fans::CurrentNumOfControlPoints;
ze_result_t status = pKmdSysManager->requestSingle(request, response);
if (status != ZE_RESULT_SUCCESS) {
return status;
} else {
uint32_t value = 0;
memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
if (value == 0) {
pConfig->mode = ZES_FAN_SPEED_MODE_DEFAULT;
} else {
pConfig->mode = ZES_FAN_SPEED_MODE_TABLE;
pConfig->speedTable.numPoints = value;
request.requestId = KmdSysman::Requests::Fans::CurrentFanPoint;
for (int32_t i = 0; i < pConfig->speedTable.numPoints; i++) {
if (pKmdSysManager->requestSingle(request, response) == ZE_RESULT_SUCCESS) {
FanPoint point = {};
memcpy_s(&point.data, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
pConfig->speedTable.table[i].speed.speed = point.fanSpeedPercent;
pConfig->speedTable.table[i].speed.units = ZES_FAN_SPEED_UNITS_PERCENT;
pConfig->speedTable.table[i].temperature = point.temperatureDegreesCelsius;
}
}
}
}
return ZE_RESULT_SUCCESS;
}
ze_result_t WddmFanImp::setDefaultMode() {
@@ -120,7 +157,6 @@ ze_result_t WddmFanImp::setSpeedTableMode(const zes_fan_speed_table_t *pSpeedTab
}
return pKmdSysManager->requestMultiple(vRequests, vResponses);
;
}
ze_result_t WddmFanImp::getState(zes_fan_speed_units_t units, int32_t *pSpeed) {

View File

@@ -18,7 +18,14 @@ class FanKmdSysManager : public Mock<MockKmdSysManager> {};
template <>
struct Mock<FanKmdSysManager> : public FanKmdSysManager {
union {
struct
{
uint32_t TemperatureDegreesCelsius : 16;
uint32_t FanSpeedPercent : 16;
};
uint32_t Data;
} mockFanTempSpeed;
uint32_t mockFanMaxPoints = 10;
uint32_t mockFanCurrentPulses = 523436;
uint32_t mockFanCurrentFanPoints = 0;
@@ -45,6 +52,20 @@ struct Mock<FanKmdSysManager> : public FanKmdSysManager {
pResponse->outReturnCode = KmdSysman::KmdSysmanFail;
}
} break;
case KmdSysman::Requests::Fans::CurrentNumOfControlPoints: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
*pValue = mockFanCurrentFanPoints;
pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess;
pResponse->outDataSize = sizeof(uint32_t);
} break;
case KmdSysman::Requests::Fans::CurrentFanPoint: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
mockFanTempSpeed.FanSpeedPercent = 25;
mockFanTempSpeed.TemperatureDegreesCelsius = 50;
*pValue = mockFanTempSpeed.Data;
pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess;
pResponse->outDataSize = sizeof(uint32_t);
} break;
default: {
pResponse->outDataSize = 0;
pResponse->outReturnCode = KmdSysman::KmdSysmanFail;
@@ -69,6 +90,12 @@ struct Mock<FanKmdSysManager> : public FanKmdSysManager {
pResponse->outReturnCode = KmdSysman::KmdSysmanFail;
}
} break;
case KmdSysman::Requests::Fans::CurrentFanPoint: {
uint32_t *pValue = reinterpret_cast<uint32_t *>(pBuffer);
mockFanTempSpeed.Data = *pValue;
pResponse->outDataSize = 0;
pResponse->outReturnCode = KmdSysman::KmdSysmanSuccess;
} break;
default: {
pResponse->outDataSize = 0;
pResponse->outReturnCode = KmdSysman::KmdSysmanFail;

View File

@@ -160,7 +160,7 @@ TEST_F(SysmanDeviceFanFixture, GivenValidFanHandleWhenGettingFanPropertiesAllowS
}
}
TEST_F(SysmanDeviceFanFixture, GivenValidFanHandleWhenGettingFanConfigThenUnsupportedIsReturned) {
TEST_F(SysmanDeviceFanFixture, GivenValidFanHandleWhenGettingFanConfigThenSuccessIsReturnedDefaultFanTable) {
// Setting allow set calls or not
init(true, true);
@@ -168,7 +168,62 @@ TEST_F(SysmanDeviceFanFixture, GivenValidFanHandleWhenGettingFanConfigThenUnsupp
for (auto handle : handles) {
zes_fan_config_t fanConfig;
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, zesFanGetConfig(handle, &fanConfig));
EXPECT_EQ(ZE_RESULT_SUCCESS, zesFanSetDefaultMode(handle));
EXPECT_EQ(ZE_RESULT_SUCCESS, zesFanGetConfig(handle, &fanConfig));
EXPECT_EQ(fanConfig.mode, ZES_FAN_SPEED_MODE_DEFAULT);
}
}
TEST_F(SysmanDeviceFanFixture, GivenValidFanHandleWhenGettingFanConfigThenFirstSingleRequestFails) {
// Setting allow set calls or not
init(true, true);
auto handles = getFanHandles();
pKmdSysManager->mockRequestSingle = TRUE;
pKmdSysManager->mockRequestSingleResult = ZE_RESULT_ERROR_NOT_AVAILABLE;
for (auto handle : handles) {
zes_fan_config_t fanConfig;
EXPECT_EQ(ZE_RESULT_ERROR_NOT_AVAILABLE, zesFanGetConfig(handle, &fanConfig));
}
}
TEST_F(SysmanDeviceFanFixture, GivenValidFanHandleWhenGettingFanConfigWithValidFanPointsSuccessCustomFanTable) {
// Setting allow set calls or not
init(true, true);
auto handles = getFanHandles();
for (auto handle : handles) {
zes_fan_speed_table_t fanSpeedTable = {0};
fanSpeedTable.numPoints = 4;
fanSpeedTable.table[0].speed.speed = 65;
fanSpeedTable.table[0].speed.units = ZES_FAN_SPEED_UNITS_PERCENT;
fanSpeedTable.table[0].temperature = 30;
fanSpeedTable.table[1].speed.speed = 75;
fanSpeedTable.table[1].speed.units = ZES_FAN_SPEED_UNITS_PERCENT;
fanSpeedTable.table[1].temperature = 45;
fanSpeedTable.table[2].speed.speed = 85;
fanSpeedTable.table[2].speed.units = ZES_FAN_SPEED_UNITS_PERCENT;
fanSpeedTable.table[2].temperature = 60;
fanSpeedTable.table[3].speed.speed = 100;
fanSpeedTable.table[3].speed.units = ZES_FAN_SPEED_UNITS_PERCENT;
fanSpeedTable.table[3].temperature = 90;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesFanSetSpeedTableMode(handle, &fanSpeedTable));
zes_fan_config_t fanConfig;
EXPECT_EQ(ZE_RESULT_SUCCESS, zesFanGetConfig(handle, &fanConfig));
EXPECT_EQ(fanConfig.mode, ZES_FAN_SPEED_MODE_TABLE);
EXPECT_EQ(fanConfig.speedTable.numPoints, 4);
EXPECT_EQ(fanConfig.speedTable.table[0].speed.units, ZES_FAN_SPEED_UNITS_PERCENT);
EXPECT_EQ(fanConfig.speedTable.table[1].speed.units, ZES_FAN_SPEED_UNITS_PERCENT);
EXPECT_EQ(fanConfig.speedTable.table[2].speed.units, ZES_FAN_SPEED_UNITS_PERCENT);
EXPECT_EQ(fanConfig.speedTable.table[3].speed.units, ZES_FAN_SPEED_UNITS_PERCENT);
}
}