diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index 52afdd609b..461432dc26 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -382,3 +382,7 @@ UseDrmVirtualEnginesForCcs = -1 UseDrmVirtualEnginesForBcs = -1 LimitEngineCountForVirtualBcs = -1 LimitEngineCountForVirtualCcs = -1 +ForceRunAloneContext = -1 +CreateContextWithAccessCounters = -1 +AccessCountersTrigger = -1 +AccessCountersGranularity = -1 diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 0384139cc5..b1dadbc104 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -187,6 +187,9 @@ DECLARE_DEBUG_VARIABLE(int32_t, UseDrmVirtualEnginesForCcs, -1, "-1: default, 0: DECLARE_DEBUG_VARIABLE(int32_t, UseDrmVirtualEnginesForBcs, -1, "-1: default, 0: disable, 1: enable, Combine all BCS nodes to single VE (per context)") DECLARE_DEBUG_VARIABLE(int32_t, LimitEngineCountForVirtualBcs, -1, "-1: default, >0 Only use VirtualEngine with limited amount of engines, not max ") DECLARE_DEBUG_VARIABLE(int32_t, LimitEngineCountForVirtualCcs, -1, "-1: default, >0 Only use VirtualEngine with limited amount of engines, not max ") +DECLARE_DEBUG_VARIABLE(int32_t, CreateContextWithAccessCounters, -1, "-1: default, 0: ignore, 1: create context with Access Counter programming") +DECLARE_DEBUG_VARIABLE(int32_t, AccessCountersTrigger, -1, "-1: default - disabled, 0: disabled, >= 0: triggering thresholds") +DECLARE_DEBUG_VARIABLE(int32_t, AccessCountersGranularity, -1, "-1: default - ACG_2MB, >= 0: granularites - 0: ACG_128K, 1: ACG_2M, 2: ACG_16M, 3: ACG_16M") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level") DECLARE_DEBUG_VARIABLE(bool, PrintOsContextInitializations, false, "print initialized OsContexts to standard output") @@ -299,6 +302,7 @@ DECLARE_DEBUG_VARIABLE(bool, EnableFreeMemory, false, "Enable freeMemory in memo DECLARE_DEBUG_VARIABLE(bool, ForceSamplerLowFilteringPrecision, false, "Force Low Filtering Precision Sampler mode") DECLARE_DEBUG_VARIABLE(bool, EngineInstancedSubDevices, false, "Create subdevices assigned to specific engine") DECLARE_DEBUG_VARIABLE(bool, AllowSingleTileEngineInstancedSubDevices, false, "Create subdevices assigned to specific engine on single tile config") +DECLARE_DEBUG_VARIABLE(int32_t, ForceRunAloneContext, -1, "Control creation of run-alone HW context, -1:default, 0:disable, 1:enable") DECLARE_DEBUG_VARIABLE(int32_t, AddClGlSharing, -1, "Add cl-gl extension") DECLARE_DEBUG_VARIABLE(int32_t, EnableKernelTunning, -1, "Perform a tunning of enqueue kernel, -1:default(disabled), 0:disable, 1:enable simple kernel tunning, 2:enable full kernel tunning") DECLARE_DEBUG_VARIABLE(int32_t, EnableBOMmapCreate, -1, "Create BOs using mmap, -1:default, 0:disable(GEM_USERPTR), 1:enable") diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index ccb392ed92..99b127e993 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -1151,4 +1151,28 @@ void Drm::waitForBind(uint32_t vmHandleId) { waitUserFence(0u, castToUint64(&this->pagingFence[vmHandleId]), this->fenceVal[vmHandleId], ValueWidth::U64, -1, ioctlHelper->getWaitUserFenceSoftFlag()); } +uint32_t Drm::createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isCooperativeContextRequested) { + drm_i915_gem_context_create_ext_setparam extSetparam = {}; + + if (drmVmId > 0) { + extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM; + extSetparam.param.param = I915_CONTEXT_PARAM_VM; + extSetparam.param.value = drmVmId; + gcc.extensions = reinterpret_cast(&extSetparam); + gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS; + } + + if (DebugManager.flags.CreateContextWithAccessCounters.get() != -1) { + return ioctlHelper->createContextWithAccessCounters(this, gcc); + } + + if (DebugManager.flags.ForceRunAloneContext.get() != -1) { + isCooperativeContextRequested = DebugManager.flags.ForceRunAloneContext.get(); + } + if (isCooperativeContextRequested) { + return ioctlHelper->createCooperativeContext(this, gcc); + } + return ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); +} + } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_query.cpp b/shared/source/os_interface/linux/drm_query.cpp index 435cb03326..f1a7d26b88 100644 --- a/shared/source/os_interface/linux/drm_query.cpp +++ b/shared/source/os_interface/linux/drm_query.cpp @@ -40,17 +40,4 @@ bool Drm::isVmBindAvailable() { return this->bindAvailable; } -uint32_t Drm::createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isCooperativeContextRequested) { - drm_i915_gem_context_create_ext_setparam extSetparam = {}; - - if (drmVmId > 0) { - extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM; - extSetparam.param.param = I915_CONTEXT_PARAM_VM; - extSetparam.param.value = drmVmId; - gcc.extensions = reinterpret_cast(&extSetparam); - gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS; - } - return ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); -} - } // namespace NEO diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 4d2fd6d7dd..32fbc983fb 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -18,6 +18,7 @@ #include struct drm_i915_query_item; +struct drm_i915_gem_context_create_ext; struct drm_i915_gem_execbuffer2; namespace NEO { @@ -88,6 +89,8 @@ class IoctlHelper { virtual int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) = 0; virtual bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) = 0; virtual std::optional getHasPageFaultParamId() = 0; + virtual uint32_t createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) = 0; + virtual uint32_t createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) = 0; }; class IoctlHelperUpstream : public IoctlHelper { @@ -116,6 +119,8 @@ class IoctlHelperUpstream : public IoctlHelper { int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override; bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) override; std::optional getHasPageFaultParamId() override; + uint32_t createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; + uint32_t createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; }; template @@ -159,6 +164,8 @@ class IoctlHelperPrelim20 : public IoctlHelper { int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override; bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) override; std::optional getHasPageFaultParamId() override; + uint32_t createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; + uint32_t createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; }; } // namespace NEO diff --git a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp index f215b4df95..f1a5c50fbc 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -303,4 +303,51 @@ std::optional IoctlHelperPrelim20::getHasPageFaultParamId() { return PRELIM_I915_PARAM_HAS_PAGE_FAULT; }; +uint32_t gemCreateContextExt(Drm *drm, drm_i915_gem_context_create_ext &gcc, drm_i915_gem_context_create_ext_setparam &extSetparam) { + gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS; + extSetparam.base.next_extension = gcc.extensions; + gcc.extensions = reinterpret_cast(&extSetparam); + + return IoctlHelper::ioctl(drm, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); +} + +uint32_t gemCreateContextAcc(Drm *drm, drm_i915_gem_context_create_ext &gcc, uint16_t trigger, uint8_t granularity) { + prelim_drm_i915_gem_context_param_acc paramAcc = {}; + paramAcc.trigger = trigger; + paramAcc.notify = 1; + paramAcc.granularity = granularity; + + i915_user_extension userExt = {}; + userExt.name = I915_CONTEXT_CREATE_EXT_SETPARAM; + + drm_i915_gem_context_param ctxParam = {}; + ctxParam.param = PRELIM_I915_CONTEXT_PARAM_ACC; + ctxParam.ctx_id = 0; + ctxParam.size = sizeof(paramAcc); + ctxParam.value = reinterpret_cast(¶mAcc); + + drm_i915_gem_context_create_ext_setparam extSetparam = {}; + extSetparam.base = userExt; + extSetparam.param = ctxParam; + + return gemCreateContextExt(drm, gcc, extSetparam); +} +uint32_t IoctlHelperPrelim20::createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) { + uint16_t trigger = 0; + if (DebugManager.flags.AccessCountersTrigger.get() != -1) { + trigger = static_cast(DebugManager.flags.AccessCountersTrigger.get()); + } + uint8_t granularity = PRELIM_I915_CONTEXT_ACG_2M; + if (DebugManager.flags.AccessCountersGranularity.get() != -1) { + granularity = static_cast(DebugManager.flags.AccessCountersGranularity.get()); + } + return gemCreateContextAcc(drm, gcc, trigger, granularity); +} + +uint32_t IoctlHelperPrelim20::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) { + struct drm_i915_gem_context_create_ext_setparam extSetparam = {}; + extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM; + extSetparam.param.param = PRELIM_I915_CONTEXT_PARAM_RUNALONE; + return gemCreateContextExt(drm, gcc, extSetparam); +} } // namespace NEO diff --git a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp index bf3d0308b8..293c911012 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -154,4 +154,10 @@ std::optional IoctlHelperUpstream::getHasPageFaultParamId() { return std::nullopt; }; +uint32_t IoctlHelperUpstream::createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) { + return EINVAL; +} +uint32_t IoctlHelperUpstream::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) { + return EINVAL; +} } // namespace NEO diff --git a/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp index 25e6d6cd8c..2fc7d5bd27 100644 --- a/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_with_prelim_tests.cpp @@ -313,3 +313,61 @@ TEST_F(IoctlHelperPrelimFixture, givenPrelimWhenQueryEngineInfoAndFailIoctlThenF EXPECT_EQ(nullptr, engineInfo); } + +TEST_F(IoctlHelperPrelimFixture, givenIoctlFailureWhenCreateContextWithAccessCountersIsCalledThenErrorIsReturned) { + drm->ioctlRetVal = EINVAL; + + auto ioctlHelper = drm->getIoctlHelper(); + drm_i915_gem_context_create_ext gcc{}; + EXPECT_EQ(static_cast(EINVAL), ioctlHelper->createContextWithAccessCounters(drm.get(), gcc)); + EXPECT_EQ(1u, drm->ioctlCallsCount); +} + +TEST_F(IoctlHelperPrelimFixture, givenIoctlSuccessWhenCreateContextWithAccessCountersIsCalledThenSuccessIsReturned) { + drm->ioctlRetVal = 0; + + auto ioctlHelper = drm->getIoctlHelper(); + drm_i915_gem_context_create_ext gcc{}; + EXPECT_EQ(0u, ioctlHelper->createContextWithAccessCounters(drm.get(), gcc)); + EXPECT_EQ(1u, drm->ioctlCallsCount); +} + +TEST_F(IoctlHelperPrelimFixture, givenIoctlFailureWhenCreateCooperativeContexIsCalledThenErrorIsReturned) { + drm->ioctlRetVal = EINVAL; + + auto ioctlHelper = drm->getIoctlHelper(); + drm_i915_gem_context_create_ext gcc{}; + EXPECT_EQ(static_cast(EINVAL), ioctlHelper->createCooperativeContext(drm.get(), gcc)); + EXPECT_EQ(1u, drm->ioctlCallsCount); +} + +TEST_F(IoctlHelperPrelimFixture, givenIoctlSuccessWhenCreateCooperativeContexIsCalledThenSuccessIsReturned) { + drm->ioctlRetVal = 0u; + + auto ioctlHelper = drm->getIoctlHelper(); + drm_i915_gem_context_create_ext gcc{}; + EXPECT_EQ(0u, ioctlHelper->createCooperativeContext(drm.get(), gcc)); + EXPECT_EQ(1u, drm->ioctlCallsCount); +} + +TEST_F(IoctlHelperPrelimFixture, whenCreateDrmContextExtIsCalledThenIoctlIsCalledOnlyOnce) { + drm->ioctlRetVal = 0u; + + DebugManagerStateRestore stateRestore; + + for (auto &cooperativeContextRequested : {-1, 0, 1}) { + DebugManager.flags.ForceRunAloneContext.set(cooperativeContextRequested); + for (auto &accessCountersRequested : {-1, 0, 1}) { + DebugManager.flags.CreateContextWithAccessCounters.set(accessCountersRequested); + for (auto vmId = 0u; vmId < 3; vmId++) { + drm->ioctlCallsCount = 0u; + + drm_i915_gem_context_create_ext gcc{}; + + drm->createDrmContextExt(gcc, vmId, true); + + EXPECT_EQ(1u, drm->ioctlCallsCount); + } + } + } +} diff --git a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp index 6a639c1ca9..7881853b0b 100644 --- a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp +++ b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp @@ -9,6 +9,7 @@ #include "shared/source/os_interface/linux/ioctl_helper.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/default_hw_info.h" +#include "shared/test/common/mocks/mock_execution_environment.h" #include "shared/test/common/test_macros/test.h" #include "shared/test/unit_test/os_interface/linux/drm_mock_impl.h" @@ -200,3 +201,25 @@ TEST(IoctlHelperTestsUpstream, givenUpstreamWhenQueryEngineInfoWithDeviceMemoryA ASSERT_NE(nullptr, engineInfo); EXPECT_EQ(totalEnginesCount, engines.size()); } + +TEST(IoctlHelperTestsUpstream, whenCreateContextWithAccessCountersIsCalledThenErrorIsReturned) { + auto executionEnvironment = std::make_unique(); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + ASSERT_NE(nullptr, drm); + + drm_i915_gem_context_create_ext gcc{}; + IoctlHelperUpstream ioctlHelper{}; + + EXPECT_EQ(static_cast(EINVAL), ioctlHelper.createContextWithAccessCounters(drm.get(), gcc)); +} + +TEST(IoctlHelperTestsUpstream, whenCreateCooperativeContexIsCalledThenErrorIsReturned) { + auto executionEnvironment = std::make_unique(); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + ASSERT_NE(nullptr, drm); + + drm_i915_gem_context_create_ext gcc{}; + IoctlHelperUpstream ioctlHelper{}; + + EXPECT_EQ(static_cast(EINVAL), ioctlHelper.createCooperativeContext(drm.get(), gcc)); +}