diff --git a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.cpp b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.cpp index 2bcc3df423..98265f1ab7 100644 --- a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.cpp +++ b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -17,6 +17,7 @@ const std::string LinuxSchedulerImp::timesliceDurationMilliSecs("timeslice_durat const std::string LinuxSchedulerImp::defaultTimesliceDurationMilliSecs(".defaults/timeslice_duration_ms"); const std::string LinuxSchedulerImp::heartbeatIntervalMilliSecs("heartbeat_interval_ms"); const std::string LinuxSchedulerImp::defaultHeartbeatIntervalMilliSecs(".defaults/heartbeat_interval_ms"); +const std::string LinuxSchedulerImp::enableEuDebug(""); const std::string LinuxSchedulerImp::engineDir("engine"); ze_result_t LinuxSchedulerImp::getProperties(zes_sched_properties_t &schedProperties) { @@ -170,6 +171,11 @@ ze_bool_t LinuxSchedulerImp::canControlScheduler() { return 1; } +ze_result_t LinuxSchedulerImp::setComputeUnitDebugMode(ze_bool_t *pNeedReload) { + *pNeedReload = false; + return pSysfsAccess->write(enableEuDebug, 1); +} + static const std::multimap level0EngineTypeToSysfsEngineMap = { {ZES_ENGINE_TYPE_FLAG_RENDER, "rcs"}, {ZES_ENGINE_TYPE_FLAG_DMA, "bcs"}, diff --git a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.h b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.h index 0e4b39ce39..a891c93f01 100644 --- a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.h +++ b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -30,6 +30,7 @@ class LinuxSchedulerImp : public OsScheduler, NEO::NonCopyableOrMovableClass { ze_result_t setHeartbeatInterval(uint64_t heartbeat) override; ze_bool_t canControlScheduler() override; ze_result_t getProperties(zes_sched_properties_t &properties) override; + ze_result_t setComputeUnitDebugMode(ze_bool_t *pNeedReload) override; LinuxSchedulerImp() = default; LinuxSchedulerImp(OsSysman *pOsSysman, zes_engine_type_flag_t type, std::vector &listOfEngines, ze_bool_t isSubdevice, uint32_t subdeviceId); @@ -50,6 +51,7 @@ class LinuxSchedulerImp : public OsScheduler, NEO::NonCopyableOrMovableClass { static const std::string defaultTimesliceDurationMilliSecs; static const std::string heartbeatIntervalMilliSecs; static const std::string defaultHeartbeatIntervalMilliSecs; + static const std::string enableEuDebug; std::vector listOfEngines = {}; }; diff --git a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp index 27d6f17154..59966163d8 100644 --- a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp +++ b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp @@ -21,6 +21,7 @@ const std::string LinuxSchedulerImp::defaultTimesliceDurationMilliSecs(".default const std::string LinuxSchedulerImp::heartbeatIntervalMilliSecs("heartbeat_interval_ms"); const std::string LinuxSchedulerImp::defaultHeartbeatIntervalMilliSecs(".defaults/heartbeat_interval_ms"); const std::string LinuxSchedulerImp::engineDir("engine"); +const std::string LinuxSchedulerImp::enableEuDebug("prelim_enable_eu_debug"); constexpr uint16_t milliSecsToMicroSecs = 1000; static const std::map<__u16, std::string> i915EngineClassToSysfsEngineMap = { @@ -208,6 +209,12 @@ ze_bool_t LinuxSchedulerImp::canControlScheduler() { return 1; } +ze_result_t LinuxSchedulerImp::setComputeUnitDebugMode(ze_bool_t *pNeedReload) { + *pNeedReload = false; + uint64_t val = 1; + return pSysfsAccess->write(enableEuDebug, val); +} + static ze_result_t getNumEngineTypeAndInstancesForSubDevices(std::map> &mapOfEngines, NEO::Drm *pDrm, uint32_t subdeviceId) { auto engineInfo = pDrm->getEngineInfo(); diff --git a/level_zero/tools/source/sysman/scheduler/os_scheduler.h b/level_zero/tools/source/sysman/scheduler/os_scheduler.h index d2007e6713..03f9b20bb3 100644 --- a/level_zero/tools/source/sysman/scheduler/os_scheduler.h +++ b/level_zero/tools/source/sysman/scheduler/os_scheduler.h @@ -1,12 +1,12 @@ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once -#include +#include #include #include @@ -18,6 +18,7 @@ using namespace std; class OsScheduler { public: + virtual ze_result_t setComputeUnitDebugMode(ze_bool_t *pNeedReload) = 0; virtual ze_result_t getPreemptTimeout(uint64_t &timeout, ze_bool_t getDefault) = 0; virtual ze_result_t getTimesliceDuration(uint64_t ×lice, ze_bool_t getDefault) = 0; virtual ze_result_t getHeartbeatInterval(uint64_t &heartbeat, ze_bool_t getDefault) = 0; diff --git a/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp b/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp index af0e9e5cd3..2d91126645 100644 --- a/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp +++ b/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2021 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -29,7 +29,12 @@ ze_result_t SchedulerImp::setExclusiveMode(ze_bool_t *pNeedReload) { } ze_result_t SchedulerImp::setComputeUnitDebugMode(ze_bool_t *pNeedReload) { - return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; + auto result = setExclusiveMode(pNeedReload); + if (result != ZE_RESULT_SUCCESS) { + return result; + } + result = pOsScheduler->setComputeUnitDebugMode(pNeedReload); + return result; } ze_result_t SchedulerImp::getCurrentMode(zes_sched_mode_t *pMode) { diff --git a/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.cpp b/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.cpp index 9a89f681db..f1dbb67a03 100644 --- a/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.cpp +++ b/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -43,6 +43,10 @@ ze_result_t WddmSchedulerImp::getProperties(zes_sched_properties_t &properties) return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } +ze_result_t WddmSchedulerImp::setComputeUnitDebugMode(ze_bool_t *pNeedReload) { + return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; +} + ze_result_t OsScheduler::getNumEngineTypeAndInstances(std::map> &listOfEngines, OsSysman *pOsSysman, ze_device_handle_t subdeviceHandle) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } diff --git a/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.h b/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.h index 71e050d0e8..c4e3250ac3 100644 --- a/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.h +++ b/level_zero/tools/source/sysman/scheduler/windows/os_scheduler_imp.h @@ -21,6 +21,7 @@ class WddmSchedulerImp : public OsScheduler { ze_result_t setHeartbeatInterval(uint64_t heartbeat) override; ze_bool_t canControlScheduler() override; ze_result_t getProperties(zes_sched_properties_t &properties) override; + ze_result_t setComputeUnitDebugMode(ze_bool_t *pNeedReload) override; }; } // namespace L0 diff --git a/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/CMakelists.txt b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/CMakelists.txt new file mode 100644 index 0000000000..50da5b7de8 --- /dev/null +++ b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/CMakelists.txt @@ -0,0 +1,14 @@ +# +# Copyright (C) 2022 Intel Corporation +# +# SPDX-License-Identifier: MIT +# + +if(WIN32) + target_sources(${TARGET_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt + ${CMAKE_CURRENT_SOURCE_DIR}/test_zes_sysman_scheduler.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/mock_zes_sysman_scheduler.h + ) +endif() \ No newline at end of file diff --git a/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/mock_zes_sysman_scheduler.h b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/mock_zes_sysman_scheduler.h new file mode 100644 index 0000000000..a5471632f5 --- /dev/null +++ b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/mock_zes_sysman_scheduler.h @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2022 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once +#include "level_zero/tools/source/sysman/scheduler/os_scheduler.h" +#include "level_zero/tools/source/sysman/scheduler/scheduler_imp.h" +#include "level_zero/tools/test/unit_tests/sources/sysman/windows/mock_sysman_fixture.h" + +namespace L0 { +namespace ult { + +struct OsSchedulerMock : public OsScheduler { + + OsSchedulerMock() = default; + + ADDMETHOD_NOBASE(setComputeUnitDebugMode, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (ze_bool_t * pNeedReload)); + ADDMETHOD_NOBASE(getPreemptTimeout, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (uint64_t & timeout, ze_bool_t getDefault)); + ADDMETHOD_NOBASE(getTimesliceDuration, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (uint64_t & timeslice, ze_bool_t getDefault)); + ADDMETHOD_NOBASE(getHeartbeatInterval, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (uint64_t & heartbeat, ze_bool_t getDefault)); + ADDMETHOD_NOBASE(setPreemptTimeout, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (uint64_t timeout)); + ADDMETHOD_NOBASE(setTimesliceDuration, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (uint64_t timeslice)); + ADDMETHOD_NOBASE(setHeartbeatInterval, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (uint64_t heartbeat)); + ADDMETHOD_NOBASE(canControlScheduler, ze_bool_t, false, ()); + ADDMETHOD_NOBASE(getProperties, ze_result_t, ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, (zes_sched_properties_t & properties)); +}; + +} // namespace ult +} // namespace L0 \ No newline at end of file diff --git a/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/test_zes_sysman_scheduler.cpp b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/test_zes_sysman_scheduler.cpp new file mode 100644 index 0000000000..4b883f2aa2 --- /dev/null +++ b/level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/test_zes_sysman_scheduler.cpp @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2022 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "level_zero/tools/test/unit_tests/sources/sysman/scheduler/windows/mock_zes_sysman_scheduler.h" + +extern bool sysmanUltsEnable; + +using ::testing::_; +namespace L0 { +namespace ult { + +class ZesSchedulerFixture : public SysmanDeviceFixture { + + protected: + std::unique_ptr pOsSchedulerMock; + FirmwareUtil *pFwUtilInterfaceOld = nullptr; + + void SetUp() override { + if (!sysmanUltsEnable) { + GTEST_SKIP(); + } + SysmanDeviceFixture::SetUp(); + } + void TearDown() override { + if (!sysmanUltsEnable) { + GTEST_SKIP(); + } + SysmanDeviceFixture::TearDown(); + } +}; + +TEST_F(ZesSchedulerFixture, GivenComponentCountZeroWhenQueryingSchedulerHandlesThenNoHandlesAreReturned) { + uint32_t count = 0; + EXPECT_EQ(zesDeviceEnumSchedulers(device->toHandle(), &count, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(count, 0u); +} + +TEST_F(ZesSchedulerFixture, GivenSetExclusiveModeNotFailWhenTryingToSetComputeUnitDebugModeThenErrorIsReturned) { + std::vector listOfEngines = {"rcs0"}; + auto pSchedulerImp = std::make_unique(pOsSysman, ZES_ENGINE_TYPE_FLAG_RENDER, listOfEngines, device->toHandle()); + auto pOsSchedulerBackup = pSchedulerImp->pOsScheduler; + auto pOsSchedulerMock = new OsSchedulerMock(); + pSchedulerImp->pOsScheduler = pOsSchedulerMock; + ze_bool_t pNeedReload = false; + EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pSchedulerImp->setComputeUnitDebugMode(&pNeedReload)); + pSchedulerImp->pOsScheduler = pOsSchedulerBackup; + delete pOsSchedulerMock; +} + +TEST_F(ZesSchedulerFixture, GivenSetExclusiveModeNotSuccessWhenTryingToSetComputeUnitDebugModeThenErrorIsReturned) { + std::vector listOfEngines = {"rcs0"}; + auto pSchedulerImp = std::make_unique(pOsSysman, ZES_ENGINE_TYPE_FLAG_RENDER, listOfEngines, device->toHandle()); + auto pOsSchedulerBackup = pSchedulerImp->pOsScheduler; + auto pOsSchedulerMock = new OsSchedulerMock(); + pOsSchedulerMock->setPreemptTimeoutResult = ZE_RESULT_SUCCESS; + pOsSchedulerMock->setTimesliceDurationResult = ZE_RESULT_SUCCESS; + pOsSchedulerMock->setHeartbeatIntervalResult = ZE_RESULT_SUCCESS; + pSchedulerImp->pOsScheduler = pOsSchedulerMock; + ze_bool_t pNeedReload = false; + EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pSchedulerImp->setComputeUnitDebugMode(&pNeedReload)); + pSchedulerImp->pOsScheduler = pOsSchedulerBackup; + delete pOsSchedulerMock; +} + +TEST_F(ZesSchedulerFixture, whenCallingOsSpecificSetComputeUnitDebugModeThenErrorIsReturned) { + std::vector listOfEngines = {"rcs0"}; + auto pSchedulerImp = std::make_unique(pOsSysman, ZES_ENGINE_TYPE_FLAG_RENDER, listOfEngines, device->toHandle()); + ze_bool_t pNeedReload = false; + EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, pSchedulerImp->pOsScheduler->setComputeUnitDebugMode(&pNeedReload)); +} + +} // namespace ult +} // namespace L0 \ No newline at end of file