Skip to content

Commit dbe0ba2

Browse files
Daniel EnriquezCompute-Runtime-Automation
authored andcommitted
Sysman for Windows: Multiple fixes and optimizations
Signed-off-by: Daniel Enriquez <[email protected]>
1 parent 0418c12 commit dbe0ba2

File tree

16 files changed

+619
-511
lines changed

16 files changed

+619
-511
lines changed

level_zero/tools/source/sysman/events/windows/os_events_imp.cpp

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,12 @@ ze_result_t WddmEventsImp::eventRegister(zes_event_type_flags_t events) {
8282
registerEvents(ZES_EVENT_TYPE_FLAG_DEVICE_SLEEP_STATE_EXIT, KmdSysman::Events::EnterD0);
8383
}
8484

85-
if (events & ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED) {
86-
registerEvents(ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED, KmdSysman::Events::EnterTDR);
85+
if (events & ZES_EVENT_TYPE_FLAG_DEVICE_DETACH) {
86+
registerEvents(ZES_EVENT_TYPE_FLAG_DEVICE_DETACH, KmdSysman::Events::EnterTDR);
87+
}
88+
89+
if (events & ZES_EVENT_TYPE_FLAG_DEVICE_ATTACH) {
90+
registerEvents(ZES_EVENT_TYPE_FLAG_DEVICE_ATTACH, KmdSysman::Events::ExitTDR);
8791
}
8892

8993
return (eventList.size() == 0) ? ZE_RESULT_ERROR_UNSUPPORTED_FEATURE : ZE_RESULT_SUCCESS;
@@ -93,32 +97,39 @@ bool WddmEventsImp::eventListen(zes_event_type_flags_t &pEvent, uint64_t timeout
9397
HANDLE events[MAXIMUM_WAIT_OBJECTS];
9498
pEvent = 0;
9599

96-
if (eventList.size() == 0) {
97-
return false;
100+
// Note: whatever happens on this function, it should return true. If that's not the case, the upper loop in sysman.cpp will
101+
// cause an infinite loop for the case of "Infinite timeout". This may work on Linux since the implementation is poll based,
102+
// windows uses WaitForMultipleObjects, which is a blocking call.
103+
104+
// no events no listen. Less than MAXIMUM_WAIT_OBJECTS - 2 to left space for the exit handle.
105+
if (eventList.size() == 0 || (eventList.size() >= (MAXIMUM_WAIT_OBJECTS - 2))) {
106+
pEvent = ZES_EVENT_TYPE_FLAG_FORCE_UINT32;
107+
return true;
98108
}
99109

110+
// set every handle from pos 1 onwards...
100111
for (uint32_t i = 0; i < eventList.size(); i++) {
101112
events[i] = eventList[i].windowsHandle;
102113
}
103-
104114
events[eventList.size()] = exitHandle;
105115

106116
// Setting the last handle for the exit handle, then the exit handle is signaled, it breaks from the wait.
107117
uint32_t signaledEvent = WaitForMultipleObjects(static_cast<uint32_t>(eventList.size() + 1), events, FALSE, static_cast<uint32_t>(timeout));
108118

109-
// Was a timeout
119+
ResetEvent(exitHandle);
120+
// Was a timeout, exit event loop.
110121
if (signaledEvent == WAIT_TIMEOUT) {
111-
return false;
122+
return true;
112123
}
113124

114-
// Was the exit event
115-
if (signaledEvent >= eventList.size()) {
116-
ResetEvent(exitHandle);
117-
return false;
125+
// Was the exit event and exit event loop.
126+
if (signaledEvent == eventList.size()) {
127+
pEvent = ZES_EVENT_TYPE_FLAG_FORCE_UINT32;
128+
} else {
129+
pEvent = eventList[signaledEvent].id;
118130
}
119131

120-
pEvent = eventList[signaledEvent].id;
121-
132+
// Whatever reason exit the loop, WaitForMultipleObjects exited, exit from the loop must follow.
122133
return true;
123134
}
124135

level_zero/tools/source/sysman/fan/windows/os_fan_imp.cpp

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ ze_result_t WddmFanImp::getProperties(zes_fan_properties_t *pProperties) {
2323
pProperties->onSubdevice = false;
2424
pProperties->subdeviceId = 0;
2525

26-
KmdSysman::RequestProperty request;
27-
KmdSysman::ResponseProperty response;
26+
std::vector<KmdSysman::RequestProperty> vRequests = {};
27+
std::vector<KmdSysman::ResponseProperty> vResponses = {};
28+
KmdSysman::RequestProperty request = {};
2829

2930
request.commandId = KmdSysman::Command::Set;
3031
request.componentId = KmdSysman::Component::FanComponent;
@@ -34,23 +35,27 @@ ze_result_t WddmFanImp::getProperties(zes_fan_properties_t *pProperties) {
3435
uint32_t FanPoints = 2;
3536
memcpy_s(request.dataBuffer, sizeof(uint32_t), &FanPoints, sizeof(uint32_t));
3637

37-
ze_result_t status = pKmdSysManager->requestSingle(request, response);
38+
vRequests.push_back(request);
3839

39-
pProperties->canControl = (status == ZE_RESULT_SUCCESS);
4040
request.dataSize = 0;
4141
memset(request.dataBuffer, request.dataSize, sizeof(request.dataBuffer));
42-
4342
request.commandId = KmdSysman::Command::Get;
4443
request.requestId = KmdSysman::Requests::Fans::MaxFanControlPointsSupported;
4544

46-
status = pKmdSysManager->requestSingle(request, response);
45+
vRequests.push_back(request);
4746

48-
if (status != ZE_RESULT_SUCCESS) {
47+
ze_result_t status = pKmdSysManager->requestMultiple(vRequests, vResponses);
48+
49+
if ((status != ZE_RESULT_SUCCESS) || (vResponses.size() != vRequests.size())) {
4950
return status;
5051
}
5152

52-
memcpy_s(&FanPoints, sizeof(uint32_t), response.dataBuffer, sizeof(uint32_t));
53-
pProperties->maxPoints = maxPoints = static_cast<int32_t>(FanPoints);
53+
pProperties->canControl = (vResponses[0].returnCode == KmdSysman::Success);
54+
55+
if (vResponses[1].returnCode == KmdSysman::Success) {
56+
memcpy_s(&FanPoints, sizeof(uint32_t), vResponses[1].dataBuffer, sizeof(uint32_t));
57+
pProperties->maxPoints = maxPoints = static_cast<int32_t>(FanPoints);
58+
}
5459
pProperties->maxRPM = -1;
5560
pProperties->supportedModes = zes_fan_speed_mode_t::ZES_FAN_SPEED_MODE_TABLE;
5661
pProperties->supportedUnits = zes_fan_speed_units_t::ZES_FAN_SPEED_UNITS_PERCENT;
@@ -80,38 +85,31 @@ ze_result_t WddmFanImp::setSpeedTableMode(const zes_fan_speed_table_t *pSpeedTab
8085
}
8186
}
8287

83-
KmdSysman::RequestProperty request;
84-
KmdSysman::ResponseProperty response;
88+
std::vector<KmdSysman::RequestProperty> vRequests = {};
89+
std::vector<KmdSysman::ResponseProperty> vResponses = {};
90+
KmdSysman::RequestProperty request = {};
91+
8592
uint32_t value = pSpeedTable->numPoints;
8693

8794
request.commandId = KmdSysman::Command::Set;
8895
request.componentId = KmdSysman::Component::FanComponent;
8996
request.requestId = KmdSysman::Requests::Fans::CurrentNumOfControlPoints;
9097
request.dataSize = sizeof(uint32_t);
91-
9298
memcpy_s(request.dataBuffer, sizeof(uint32_t), &value, sizeof(uint32_t));
93-
94-
ze_result_t status = pKmdSysManager->requestSingle(request, response);
95-
96-
if (status != ZE_RESULT_SUCCESS) {
97-
return status;
98-
}
99+
vRequests.push_back(request);
99100

100101
request.requestId = KmdSysman::Requests::Fans::CurrentFanPoint;
101-
102102
for (int32_t i = 0; i < pSpeedTable->numPoints; i++) {
103-
FanPoint point;
103+
FanPoint point = {};
104104
point.fanSpeedPercent = pSpeedTable->table[i].speed.speed;
105105
point.temperatureDegreesCelsius = pSpeedTable->table[i].temperature;
106106
value = point.data;
107107
memcpy_s(request.dataBuffer, sizeof(uint32_t), &value, sizeof(uint32_t));
108-
status = pKmdSysManager->requestSingle(request, response);
109-
if (status != ZE_RESULT_SUCCESS) {
110-
return status;
111-
}
108+
vRequests.push_back(request);
112109
}
113110

114-
return ZE_RESULT_SUCCESS;
111+
return pKmdSysManager->requestMultiple(vRequests, vResponses);
112+
;
115113
}
116114

117115
ze_result_t WddmFanImp::getState(zes_fan_speed_units_t units, int32_t *pSpeed) {
@@ -141,7 +139,14 @@ ze_result_t WddmFanImp::getState(zes_fan_speed_units_t units, int32_t *pSpeed) {
141139
}
142140

143141
bool WddmFanImp::isFanModuleSupported() {
144-
return true;
142+
KmdSysman::RequestProperty request = {};
143+
KmdSysman::ResponseProperty response = {};
144+
145+
request.commandId = KmdSysman::Command::Get;
146+
request.componentId = KmdSysman::Component::FanComponent;
147+
request.requestId = KmdSysman::Requests::Fans::CurrentFanSpeed;
148+
149+
return (pKmdSysManager->requestSingle(request, response) == ZE_RESULT_SUCCESS);
145150
}
146151

147152
WddmFanImp::WddmFanImp(OsSysman *pOsSysman) {

0 commit comments

Comments
 (0)