diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 85ad19eb3b..a0e268cb55 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -27,7 +27,6 @@ #include "shared/source/os_interface/linux/drm_memory_operations_handler_bind.h" #include "shared/source/os_interface/linux/drm_wrappers.h" #include "shared/source/os_interface/linux/hw_device_id.h" -#include "shared/source/os_interface/linux/i915.h" #include "shared/source/os_interface/linux/ioctl_helper.h" #include "shared/source/os_interface/linux/os_context_linux.h" #include "shared/source/os_interface/linux/os_inc.h" @@ -229,7 +228,8 @@ bool Drm::isGpuHangDetected(OsContext &osContext) { void Drm::checkPreemptionSupport() { int value = 0; auto ret = getParamIoctl(DrmParam::ParamHasScheduler, &value); - preemptionSupported = ((0 == ret) && (value & I915_SCHEDULER_CAP_PREEMPTION)); + auto schedulerCapPreemption = ioctlHelper->getDrmParamValue(DrmParam::SchedulerCapPreemption); + preemptionSupported = ((0 == ret) && (value & schedulerCapPreemption)); } void Drm::checkQueueSliceSupport() { @@ -320,11 +320,11 @@ uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequeste GemContextCreateExtSetParam extSetparam = {}; if (drmVmId > 0) { - extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM; + extSetparam.base.name = ioctlHelper->getDrmParamValue(DrmParam::ContextCreateExtSetparam); extSetparam.param.param = ioctlHelper->getDrmParamValue(DrmParam::ContextParamVm); extSetparam.param.value = drmVmId; gcc.extensions = reinterpret_cast(&extSetparam); - gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS; + gcc.flags |= ioctlHelper->getDrmParamValue(DrmParam::ContextCreateFlagsUseExtensions); } if (DebugManager.flags.CreateContextWithAccessCounters.get() != -1) { @@ -543,7 +543,9 @@ std::string Drm::getDrmVersion(int fileDescriptor) { version.name = name; version.nameLen = 5; - int ret = SysCalls::ioctl(fileDescriptor, DRM_IOCTL_VERSION, &version); + auto requestValue = getIoctlRequestValue(DrmIoctl::Version, nullptr); + + int ret = SysCalls::ioctl(fileDescriptor, requestValue, &version); if (ret) { return {}; } @@ -1206,7 +1208,7 @@ unsigned int Drm::bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, au } if (setupVirtualEngines) { - balancer.base.name = I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE; + balancer.base.name = ioctlHelper->getDrmParamValue(DrmParam::ContextEnginesExtLoadBalance); contextEngines.extensions = castToUint64(&balancer); contextEngines.engines[0].engineClass = ioctlHelper->getDrmParamValue(DrmParam::EngineClassInvalid); contextEngines.engines[0].engineInstance = ioctlHelper->getDrmParamValue(DrmParam::EngineClassInvalidNone); diff --git a/shared/source/os_interface/linux/drm_wrappers.cpp b/shared/source/os_interface/linux/drm_wrappers.cpp index e34c57a1cf..07c668ba24 100644 --- a/shared/source/os_interface/linux/drm_wrappers.cpp +++ b/shared/source/os_interface/linux/drm_wrappers.cpp @@ -21,6 +21,8 @@ unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest, IoctlHelper *ioctlHelpe switch (ioctlRequest) { case DrmIoctl::Getparam: return DRM_IOCTL_I915_GETPARAM; + case DrmIoctl::Version: + return DRM_IOCTL_VERSION; default: UNRECOVERABLE_IF(true); return 0; @@ -69,4 +71,4 @@ std::string getIoctlString(DrmIoctl ioctlRequest, IoctlHelper *ioctlHelper) { return ""; } } -} // namespace NEO \ No newline at end of file +} // namespace NEO diff --git a/shared/source/os_interface/linux/drm_wrappers.h b/shared/source/os_interface/linux/drm_wrappers.h index 76432dd285..7459b2b366 100644 --- a/shared/source/os_interface/linux/drm_wrappers.h +++ b/shared/source/os_interface/linux/drm_wrappers.h @@ -245,9 +245,13 @@ enum class DrmIoctl { SyncobjCreate, SyncobjWait, SyncobjDestroy, + Version, }; enum class DrmParam { + ContextCreateExtSetparam, + ContextCreateFlagsUseExtensions, + ContextEnginesExtLoadBalance, ContextParamEngines, ContextParamGttSize, ContextParamPersistence, @@ -286,6 +290,7 @@ enum class DrmParam { QueryComputeSlices, QueryMemoryRegions, QueryTopologyInfo, + SchedulerCapPreemption, TilingNone, TilingY, }; diff --git a/shared/source/os_interface/linux/ioctl_helper.cpp b/shared/source/os_interface/linux/ioctl_helper.cpp index 8a64e9df85..0afe3495b2 100644 --- a/shared/source/os_interface/linux/ioctl_helper.cpp +++ b/shared/source/os_interface/linux/ioctl_helper.cpp @@ -197,6 +197,12 @@ unsigned int IoctlHelper::getIoctlRequestValueBase(DrmIoctl ioctlRequest) const int IoctlHelper::getDrmParamValueBase(DrmParam drmParam) const { switch (drmParam) { + case DrmParam::ContextCreateExtSetparam: + return I915_CONTEXT_CREATE_EXT_SETPARAM; + case DrmParam::ContextCreateFlagsUseExtensions: + return I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS; + case DrmParam::ContextEnginesExtLoadBalance: + return I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE; case DrmParam::ContextParamEngines: return I915_CONTEXT_PARAM_ENGINES; case DrmParam::ContextParamGttSize: @@ -263,6 +269,8 @@ int IoctlHelper::getDrmParamValueBase(DrmParam drmParam) const { return DRM_I915_QUERY_MEMORY_REGIONS; case DrmParam::QueryTopologyInfo: return DRM_I915_QUERY_TOPOLOGY_INFO; + case DrmParam::SchedulerCapPreemption: + return I915_SCHEDULER_CAP_PREEMPTION; case DrmParam::TilingNone: return I915_TILING_NONE; case DrmParam::TilingY: diff --git a/shared/test/unit_test/os_interface/linux/drm_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_tests.cpp index d233b9b96d..3fd601af0d 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -1367,6 +1367,10 @@ TEST(DrmWrapperTest, WhenGettingDrmIoctlGetparamValueThenIoctlHelperIsNotNeeded) EXPECT_THROW(getIoctlRequestValue(DrmIoctl::DG1GemCreateExt, nullptr), std::runtime_error); } +TEST(DrmWrapperTest, WhenGettingDrmIoctlVersionValueThenIoctlHelperIsNotNeeded) { + EXPECT_EQ(getIoctlRequestValue(DrmIoctl::Version, nullptr), static_cast(DRM_IOCTL_VERSION)); +} + TEST(DrmWrapperTest, WhenGettingChipsetIdParamValueThenIoctlHelperIsNotNeeded) { EXPECT_EQ(getDrmParamValue(DrmParam::ParamChipsetId, nullptr), static_cast(I915_PARAM_CHIPSET_ID)); } diff --git a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp index 7feddf96ba..b95b37145a 100644 --- a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp +++ b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp @@ -115,6 +115,9 @@ TEST_F(IoctlPrelimHelperTests, whenGettingIoctlRequestStringThenProperStringIsRe } TEST_F(IoctlPrelimHelperTests, whenGettingDrmParamValueThenPropertValueIsReturned) { + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextCreateExtSetparam), static_cast(I915_CONTEXT_CREATE_EXT_SETPARAM)); + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextCreateFlagsUseExtensions), static_cast(I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS)); + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextEnginesExtLoadBalance), static_cast(I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextParamEngines), static_cast(I915_CONTEXT_PARAM_ENGINES)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextParamGttSize), static_cast(I915_CONTEXT_PARAM_GTT_SIZE)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextParamPersistence), static_cast(I915_CONTEXT_PARAM_PERSISTENCE)); @@ -153,6 +156,7 @@ TEST_F(IoctlPrelimHelperTests, whenGettingDrmParamValueThenPropertValueIsReturne EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::QueryMemoryRegions), static_cast(DRM_I915_QUERY_MEMORY_REGIONS)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::QueryComputeSlices), static_cast(PRELIM_DRM_I915_QUERY_COMPUTE_SLICES)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::QueryTopologyInfo), static_cast(DRM_I915_QUERY_TOPOLOGY_INFO)); + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::SchedulerCapPreemption), static_cast(I915_SCHEDULER_CAP_PREEMPTION)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::TilingNone), static_cast(I915_TILING_NONE)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::TilingY), static_cast(I915_TILING_Y)); } 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 39925e3adb..72a6e57a6b 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 @@ -99,6 +99,9 @@ TEST(IoctlHelperUpstreamTest, whenGettingDrmParamValueThenPropertValueIsReturned auto executionEnvironment = std::make_unique(); auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); IoctlHelperUpstream ioctlHelper{*drm}; + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextCreateExtSetparam), static_cast(I915_CONTEXT_CREATE_EXT_SETPARAM)); + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextCreateFlagsUseExtensions), static_cast(I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS)); + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextEnginesExtLoadBalance), static_cast(I915_CONTEXT_ENGINES_EXT_LOAD_BALANCE)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextParamEngines), static_cast(I915_CONTEXT_PARAM_ENGINES)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextParamGttSize), static_cast(I915_CONTEXT_PARAM_GTT_SIZE)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::ContextParamPersistence), static_cast(I915_CONTEXT_PARAM_PERSISTENCE)); @@ -135,6 +138,7 @@ TEST(IoctlHelperUpstreamTest, whenGettingDrmParamValueThenPropertValueIsReturned EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::QueryMemoryRegions), static_cast(DRM_I915_QUERY_MEMORY_REGIONS)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::QueryTopologyInfo), static_cast(DRM_I915_QUERY_TOPOLOGY_INFO)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::QueryComputeSlices), 0); + EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::SchedulerCapPreemption), static_cast(I915_SCHEDULER_CAP_PREEMPTION)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::TilingNone), static_cast(I915_TILING_NONE)); EXPECT_EQ(ioctlHelper.getDrmParamValue(DrmParam::TilingY), static_cast(I915_TILING_Y)); }