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