1 /*
2 * Copyright (C) 2020-2021 Intel Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 */
7
8 #include "sysman/temperature/windows/os_temperature_imp.h"
9
10 namespace L0 {
11
getProperties(zes_temp_properties_t * pProperties)12 ze_result_t WddmTemperatureImp::getProperties(zes_temp_properties_t *pProperties) {
13 uint32_t value = 0;
14 std::vector<KmdSysman::RequestProperty> vRequests = {};
15 std::vector<KmdSysman::ResponseProperty> vResponses = {};
16 KmdSysman::RequestProperty request = {};
17
18 pProperties->type = this->type;
19 pProperties->onSubdevice = false;
20 pProperties->subdeviceId = 0;
21
22 request.commandId = KmdSysman::Command::Get;
23 request.componentId = KmdSysman::Component::TemperatureComponent;
24
25 switch (this->type) {
26 case ZES_TEMP_SENSORS_GLOBAL:
27 request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainPackage;
28 break;
29 case ZES_TEMP_SENSORS_GPU:
30 request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainDGPU;
31 break;
32 case ZES_TEMP_SENSORS_MEMORY:
33 request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainPackage;
34 break;
35 default:
36 return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
37 break;
38 }
39
40 request.requestId = KmdSysman::Requests::Temperature::TempCriticalEventSupported;
41 vRequests.push_back(request);
42
43 request.requestId = KmdSysman::Requests::Temperature::TempThreshold1EventSupported;
44 vRequests.push_back(request);
45
46 request.requestId = KmdSysman::Requests::Temperature::TempThreshold2EventSupported;
47 vRequests.push_back(request);
48
49 request.requestId = KmdSysman::Requests::Temperature::MaxTempSupported;
50 vRequests.push_back(request);
51
52 ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses);
53
54 if ((status != ZE_RESULT_SUCCESS) || (vResponses.size() != vRequests.size())) {
55 return status;
56 }
57
58 if (vResponses[0].returnCode == KmdSysman::Success) {
59 memcpy_s(&pProperties->isCriticalTempSupported, sizeof(ze_bool_t), vResponses[0].dataBuffer, sizeof(ze_bool_t));
60 }
61
62 if (vResponses[1].returnCode == KmdSysman::Success) {
63 memcpy_s(&pProperties->isThreshold1Supported, sizeof(ze_bool_t), vResponses[1].dataBuffer, sizeof(ze_bool_t));
64 }
65
66 if (vResponses[2].returnCode == KmdSysman::Success) {
67 memcpy_s(&pProperties->isThreshold2Supported, sizeof(ze_bool_t), vResponses[2].dataBuffer, sizeof(ze_bool_t));
68 }
69
70 if (vResponses[3].returnCode == KmdSysman::Success) {
71 memcpy_s(&value, sizeof(uint32_t), vResponses[3].dataBuffer, sizeof(uint32_t));
72 pProperties->maxTemperature = static_cast<double>(value);
73 }
74
75 return ZE_RESULT_SUCCESS;
76 }
77
getSensorTemperature(double * pTemperature)78 ze_result_t WddmTemperatureImp::getSensorTemperature(double *pTemperature) {
79 ze_result_t status = ZE_RESULT_SUCCESS;
80 KmdSysman::RequestProperty request;
81 KmdSysman::ResponseProperty response;
82
83 request.commandId = KmdSysman::Command::Get;
84 request.componentId = KmdSysman::Component::TemperatureComponent;
85 request.requestId = KmdSysman::Requests::Temperature::CurrentTemperature;
86
87 switch (type) {
88 case ZES_TEMP_SENSORS_GLOBAL:
89 request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainPackage;
90 break;
91 case ZES_TEMP_SENSORS_GPU:
92 request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainDGPU;
93 break;
94 case ZES_TEMP_SENSORS_MEMORY:
95 request.paramInfo = KmdSysman::TemperatureDomainsType::TemperatureDomainHBM;
96 break;
97 default:
98 *pTemperature = 0;
99 return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
100 break;
101 }
102
103 status = pKmdSysManager->requestSingle(request, response);
104
105 if (status != ZE_RESULT_SUCCESS) {
106 return status;
107 }
108
109 uint32_t value = 0;
110 memcpy_s(&value, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
111 *pTemperature = static_cast<double>(value);
112
113 return status;
114 }
115
isTempModuleSupported()116 bool WddmTemperatureImp::isTempModuleSupported() {
117 if ((type == ZES_TEMP_SENSORS_GLOBAL_MIN) || (type == ZES_TEMP_SENSORS_GPU_MIN)) {
118 return false;
119 }
120 KmdSysman::RequestProperty request;
121 KmdSysman::ResponseProperty response;
122
123 request.paramInfo = static_cast<uint32_t>(type);
124 request.commandId = KmdSysman::Command::Get;
125 request.componentId = KmdSysman::Component::TemperatureComponent;
126 request.requestId = KmdSysman::Requests::Temperature::CurrentTemperature;
127
128 return (pKmdSysManager->requestSingle(request, response) == ZE_RESULT_SUCCESS);
129 }
130
setSensorType(zes_temp_sensors_t sensorType)131 void WddmTemperatureImp::setSensorType(zes_temp_sensors_t sensorType) {
132 type = sensorType;
133 }
134
WddmTemperatureImp(OsSysman * pOsSysman)135 WddmTemperatureImp::WddmTemperatureImp(OsSysman *pOsSysman) {
136 WddmSysmanImp *pWddmSysmanImp = static_cast<WddmSysmanImp *>(pOsSysman);
137 pKmdSysManager = &pWddmSysmanImp->getKmdSysManager();
138 }
139
create(OsSysman * pOsSysman,ze_bool_t onSubdevice,uint32_t subdeviceId,zes_temp_sensors_t sensorType)140 std::unique_ptr<OsTemperature> OsTemperature::create(OsSysman *pOsSysman, ze_bool_t onSubdevice, uint32_t subdeviceId, zes_temp_sensors_t sensorType) {
141 std::unique_ptr<WddmTemperatureImp> pWddmTemperatureImp = std::make_unique<WddmTemperatureImp>(pOsSysman);
142 pWddmTemperatureImp->setSensorType(sensorType);
143 return std::move(pWddmTemperatureImp);
144 }
145
146 } // namespace L0