From 7a730200ee36e611c14f6eaa4cabbc6bfe898c4e Mon Sep 17 00:00:00 2001 From: Szymon Morek Date: Tue, 14 Dec 2021 12:41:38 +0000 Subject: [PATCH] Move appendDrmContextFlags to drm_neo.cpp Use flag for direct submission when prelim kernel is used. Signed-off-by: Szymon Morek --- .../linux/ioctl_helper_tests_prelim.cpp | 33 +++++++++++++++++++ .../linux/ioctl_helper_tests_upstream.cpp | 13 ++++++++ shared/source/os_interface/linux/drm_neo.cpp | 15 +++++++-- shared/source/os_interface/linux/drm_neo.h | 7 ++-- .../source/os_interface/linux/drm_query.cpp | 6 +--- .../source/os_interface/linux/ioctl_helper.h | 3 ++ .../linux/ioctl_helper_prelim.cpp | 4 +++ .../linux/ioctl_helper_upstream.cpp | 4 +++ 8 files changed, 73 insertions(+), 12 deletions(-) diff --git a/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp b/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp index 30f644590f..7fd267b8e1 100644 --- a/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp +++ b/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp @@ -257,3 +257,36 @@ TEST(IoctlHelperTestsPrelim, givenDrmAllocationWhenSetMemAdviseWithDevicePreferr } EXPECT_EQ(2u, drm.ioctlCallsCount); } + +TEST(IoctlHelperTestsPrelim, givenPrelimsWhenGetDirectSubmissionFlagThenCorrectValueReturned) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + + uint32_t ioctlVal = (1u << 31); + EXPECT_EQ(ioctlVal, IoctlHelper::get(drm.get())->getDirectSubmissionFlag()); +} + +TEST(IoctlHelperTestsPrelim, givenPrelimsWhenAppendDrmContextFlagsThenCorrectFlagsSet) { + DebugManagerStateRestore stateRestore; + DebugManager.flags.DirectSubmissionDrmContext.set(-1); + + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + uint32_t ioctlVal = (1u << 31); + + drm_i915_gem_context_create_ext ctx{}; + drm->appendDrmContextFlags(ctx, true); + EXPECT_EQ(ioctlVal, ctx.flags); + + ctx.flags = 0u; + DebugManager.flags.DirectSubmissionDrmContext.set(0); + + drm->appendDrmContextFlags(ctx, true); + EXPECT_EQ(0u, ctx.flags); + + DebugManager.flags.DirectSubmissionDrmContext.set(1); + drm->appendDrmContextFlags(ctx, false); + EXPECT_EQ(ioctlVal, ctx.flags); +} diff --git a/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp b/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp index 532eb20211..c3c45ba4c8 100644 --- a/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp +++ b/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp @@ -111,3 +111,16 @@ TEST(IoctlHelperTestsUpstream, givenUpstreamWhenSetVmBoAdviseThenReturnTrue) { auto ioctlHelper = IoctlHelper::get(drm.get()); EXPECT_TRUE(ioctlHelper->setVmBoAdvise(drm.get(), 0, 0, nullptr)); } + +TEST(IoctlHelperTestsUpstream, givenUpstreamWhenDirectSubmissionEnabledThenNoFlagsAdded) { + DebugManagerStateRestore stateRestore; + DebugManager.flags.DirectSubmissionDrmContext.set(1); + + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + + drm_i915_gem_context_create_ext ctx{}; + drm->appendDrmContextFlags(ctx, false); + EXPECT_EQ(0u, ctx.flags); +} diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index f2e00add83..45a4c904ea 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -392,12 +392,12 @@ void Drm::setUnrecoverableContext(uint32_t drmContextId) { ioctl(DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM, &contextParam); } -uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested, bool isCooperativeContextRequested) { +uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequested, bool isCooperativeContextRequested) { drm_i915_gem_context_create_ext gcc = {}; - this->appendDrmContextFlags(gcc, isSpecialContextRequested); + this->appendDrmContextFlags(gcc, isDirectSubmissionRequested); - auto retVal = this->createDrmContextExt(gcc, drmVmId, isSpecialContextRequested, isCooperativeContextRequested); + auto retVal = this->createDrmContextExt(gcc, drmVmId, isCooperativeContextRequested); UNRECOVERABLE_IF(retVal != 0); return gcc.ctx_id; @@ -928,4 +928,13 @@ bool Drm::querySystemInfo() { return true; } +void Drm::appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isDirectSubmissionRequested) { + if (DebugManager.flags.DirectSubmissionDrmContext.get() != -1) { + isDirectSubmissionRequested = DebugManager.flags.DirectSubmissionDrmContext.get(); + } + if (isDirectSubmissionRequested) { + gcc.flags |= IoctlHelper::get(this)->getDirectSubmissionFlag(); + } +} + } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index 86992e5df6..4f0ccb248c 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -119,8 +119,8 @@ class Drm : public DriverModel { int queryAdapterBDF(); int createDrmVirtualMemory(uint32_t &drmVmId); void destroyDrmVirtualMemory(uint32_t drmVmId); - uint32_t createDrmContext(uint32_t drmVmId, bool isSpecialContextRequested, bool isCooperativeContextRequested); - void appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isSpecialContextRequested); + uint32_t createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequested, bool isCooperativeContextRequested); + void appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isDirectSubmissionRequested); void destroyDrmContext(uint32_t drmContextId); int queryVmId(uint32_t drmContextId, uint32_t &vmId); void setLowPriorityContextParam(uint32_t drmContextId); @@ -254,8 +254,7 @@ class Drm : public DriverModel { protected: Drm(std::unique_ptr &&hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment); - uint32_t createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isSpecialContextRequested, - bool isCooperativeContextRequested); + uint32_t createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isCooperativeContextRequested); int getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu); bool translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, QueryTopologyData &data, TopologyMapping &mapping); std::string generateUUID(); diff --git a/shared/source/os_interface/linux/drm_query.cpp b/shared/source/os_interface/linux/drm_query.cpp index a4f99ee1fd..39f2b7c66f 100644 --- a/shared/source/os_interface/linux/drm_query.cpp +++ b/shared/source/os_interface/linux/drm_query.cpp @@ -126,8 +126,7 @@ bool Drm::isVmBindAvailable() { return this->bindAvailable; } -uint32_t Drm::createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isSpecialContextRequested, - bool isCooperativeContextRequested) { +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) { @@ -140,9 +139,6 @@ uint32_t Drm::createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t return ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc); } -void Drm::appendDrmContextFlags(drm_i915_gem_context_create_ext &gcc, bool isSpecialContextRequested) { -} - void Drm::queryPageFaultSupport() { } diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index bf8204892f..9013f36101 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -36,6 +36,7 @@ class IoctlHelper { virtual uint32_t getAtomicAdvise(bool isNonAtomic) = 0; virtual uint32_t getPreferredLocationAdvise() = 0; virtual bool setVmBoAdvise(Drm *drm, int32_t handle, uint32_t attribute, void *region) = 0; + virtual uint32_t getDirectSubmissionFlag() = 0; }; class IoctlHelperUpstream : public IoctlHelper { @@ -51,6 +52,7 @@ class IoctlHelperUpstream : public IoctlHelper { uint32_t getAtomicAdvise(bool isNonAtomic) override; uint32_t getPreferredLocationAdvise() override; bool setVmBoAdvise(Drm *drm, int32_t handle, uint32_t attribute, void *region) override; + uint32_t getDirectSubmissionFlag() override; }; template @@ -77,6 +79,7 @@ class IoctlHelperPrelim20 : public IoctlHelper { uint32_t getAtomicAdvise(bool isNonAtomic) override; uint32_t getPreferredLocationAdvise() override; bool setVmBoAdvise(Drm *drm, int32_t handle, uint32_t attribute, void *region) override; + uint32_t getDirectSubmissionFlag() 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 aa8cc2ffca..13d9d19f92 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -163,4 +163,8 @@ bool IoctlHelperPrelim20::setVmBoAdvise(Drm *drm, int32_t handle, uint32_t attri return true; } +uint32_t IoctlHelperPrelim20::getDirectSubmissionFlag() { + return PRELIM_I915_CONTEXT_CREATE_FLAGS_ULLS; +} + } // 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 dc1a64d761..64ef9ba68f 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -79,4 +79,8 @@ bool IoctlHelperUpstream::setVmBoAdvise(Drm *drm, int32_t handle, uint32_t attri return true; } +uint32_t IoctlHelperUpstream::getDirectSubmissionFlag() { + return 0u; +} + } // namespace NEO