diff --git a/level_zero/sysman/source/api/events/linux/sysman_os_events_imp.cpp b/level_zero/sysman/source/api/events/linux/sysman_os_events_imp.cpp index f04893662d..977a307a54 100644 --- a/level_zero/sysman/source/api/events/linux/sysman_os_events_imp.cpp +++ b/level_zero/sysman/source/api/events/linux/sysman_os_events_imp.cpp @@ -189,13 +189,21 @@ bool LinuxEventsUtil::isResetRequired(void *dev, zes_event_type_flags_t &pEvent) return false; } - std::vector properties{"RESET_FAILED", "RESET_REQUIRED"}; + std::vector properties{"RESET_FAILED", "RESET_REQUIRED", "DEVICE_STATUS"}; for (auto &property : properties) { const char *propVal = nullptr; propVal = pUdevLib->getEventPropertyValue(dev, property.c_str()); - if (propVal && atoi(propVal) == 1) { - pEvent |= ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED; - return true; + if (propVal) { + std::string expectedStr = "NEEDS_RESET"; + if (property != "DEVICE_STATUS") { + if (atoi(propVal) == 1) { + pEvent |= ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED; + return true; + } + } else if (propVal == expectedStr) { + pEvent |= ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED; + return true; + } } } diff --git a/level_zero/sysman/test/unit_tests/sources/events/linux/CMakeLists.txt b/level_zero/sysman/test/unit_tests/sources/events/linux/CMakeLists.txt index c67b37a30c..01c05983c9 100644 --- a/level_zero/sysman/test/unit_tests/sources/events/linux/CMakeLists.txt +++ b/level_zero/sysman/test/unit_tests/sources/events/linux/CMakeLists.txt @@ -4,6 +4,12 @@ # SPDX-License-Identifier: MIT # +set(L0_TESTS_SYSMAN_EVENTS_LINUX + ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/test_zes_events.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/mock_events.h +) + if(UNIX) target_sources(${TARGET_NAME} PRIVATE diff --git a/level_zero/sysman/test/unit_tests/sources/events/linux/mock_events.h b/level_zero/sysman/test/unit_tests/sources/events/linux/mock_events.h index aace99b909..cfe9bf3e2a 100644 --- a/level_zero/sysman/test/unit_tests/sources/events/linux/mock_events.h +++ b/level_zero/sysman/test/unit_tests/sources/events/linux/mock_events.h @@ -270,7 +270,7 @@ struct MockEventNeoDrm : public Drm { mockMemoryType = memory; } - std::vector getMemoryRegionsReturnsEmpty() { + std::vector getMemoryRegionsReturnsEmpty() { return {}; } @@ -285,7 +285,7 @@ struct MockEventNeoDrm : public Drm { } uint32_t hwBlob[] = {INTEL_HWCONFIG_MAX_MEMORY_CHANNELS, 1, 8, INTEL_HWCONFIG_MEMORY_TYPE, 0, mockMemoryType}; - std::vector inputBlobData(reinterpret_cast(hwBlob), reinterpret_cast(hwBlob) + sizeof(hwBlob)); + std::vector inputBlobData(reinterpret_cast(hwBlob), reinterpret_cast(hwBlob) + sizeof(hwBlob)); this->systemInfo.reset(new SystemInfo(inputBlobData)); return returnValue; } diff --git a/level_zero/sysman/test/unit_tests/sources/events/linux/test_zes_events.cpp b/level_zero/sysman/test/unit_tests/sources/events/linux/test_zes_events.cpp index 038c074782..411ee0dc38 100644 --- a/level_zero/sysman/test/unit_tests/sources/events/linux/test_zes_events.cpp +++ b/level_zero/sysman/test/unit_tests/sources/events/linux/test_zes_events.cpp @@ -10,8 +10,6 @@ #include "level_zero/sysman/test/unit_tests/sources/events/linux/mock_events.h" #include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h" -extern bool sysmanUltsEnable; - namespace L0 { namespace Sysman { namespace ult { @@ -35,9 +33,6 @@ class SysmanEventsFixture : public SysmanDeviceFixture { L0::Sysman::SysmanDevice *device = nullptr; void SetUp() override { - if (!sysmanUltsEnable) { - GTEST_SKIP(); - } SysmanDeviceFixture::SetUp(); pFsAccessOriginal = pLinuxSysmanImp->pFsAccess; pFsAccess = std::make_unique(); @@ -67,14 +62,10 @@ class SysmanEventsFixture : public SysmanDeviceFixture { } pSysmanDeviceImp->pRasHandleContext->handleList.clear(); device = pSysmanDeviceImp; - ; getRasHandles(0); } void TearDown() override { - if (!sysmanUltsEnable) { - GTEST_SKIP(); - } if (nullptr != pEventsImp->pOsEvents) { delete pEventsImp->pOsEvents; } @@ -683,6 +674,56 @@ TEST_F(SysmanEventsFixture, GivenValidDeviceHandleWhenListeningForResetRequiredE delete pMockFwInterface; } +TEST_F(SysmanEventsFixture, GivenNeedsResetUeventPropertyIsSignalledWhenListeningForResetRequiredEventsThenEventListenAPIReturnsAfterReceivingEventWithinTimeout) { + VariableBackup backupFwUtil(&pLinuxSysmanImp->pFwUtilInterface); + auto pMockFwInterface = new MockEventsFwInterface; + pLinuxSysmanImp->pFwUtilInterface = pMockFwInterface; + + VariableBackup mockPipe(&SysCalls::sysCallsPipe, [](int pipeFd[2]) -> int { + pipeFd[0] = mockReadPipeFd; + pipeFd[1] = mockWritePipeFd; + return 1; + }); + VariableBackup mockPoll(&SysCalls::sysCallsPoll, [](struct pollfd *pollFd, unsigned long int numberOfFds, int timeout) -> int { + for (uint64_t i = 0; i < numberOfFds; i++) { + if (pollFd[i].fd == mockUdevFd) { + pollFd[i].revents = POLLIN; + } + } + return 1; + }); + + auto pPublicLinuxSysmanDriverImp = new PublicLinuxSysmanDriverImp(); + auto pOsSysmanDriverOriginal = driverHandle->pOsSysmanDriver; + driverHandle->pOsSysmanDriver = static_cast(pPublicLinuxSysmanDriverImp); + + auto pUdevLibLocal = new EventsUdevLibMock(); + int a = 0; + void *ptr = &a; // Initialize a void pointer with dummy data + pUdevLibLocal->allocateDeviceToReceiveDataResult = ptr; + pUdevLibLocal->getEventPropertyValueResult = "NEEDS_RESET"; + + auto pUdevLibOriginal = pPublicLinuxSysmanDriverImp->pUdevLib; + pPublicLinuxSysmanDriverImp->pUdevLib = pUdevLibLocal; + + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEventRegister(device->toHandle(), ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED)); + zes_device_handle_t *phDevices = new zes_device_handle_t[1]; + phDevices[0] = device->toHandle(); + uint32_t numDeviceEvents = 0; + zes_event_type_flags_t *pDeviceEvents = new zes_event_type_flags_t[1]; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDriverEventListen(driverHandle->toHandle(), 1u, 1u, phDevices, &numDeviceEvents, pDeviceEvents)); + EXPECT_EQ(1u, numDeviceEvents); + EXPECT_EQ(ZES_EVENT_TYPE_FLAG_DEVICE_RESET_REQUIRED, pDeviceEvents[0]); + + delete[] phDevices; + delete[] pDeviceEvents; + pPublicLinuxSysmanDriverImp->pUdevLib = pUdevLibOriginal; + driverHandle->pOsSysmanDriver = pOsSysmanDriverOriginal; + delete pPublicLinuxSysmanDriverImp; + delete pUdevLibLocal; + delete pMockFwInterface; +} + TEST_F(SysmanDeviceFixture, GivenValidDeviceHandleWhenEventRegisterIsCalledThenSuccessIsReturned) { auto pPublicLinuxSysmanDriverImp = new PublicLinuxSysmanDriverImp(); auto pOsSysmanDriverOriginal = driverHandle->pOsSysmanDriver;