From 00b1f1c5b5231101bfffcf184e6c18e5a2b96d75 Mon Sep 17 00:00:00 2001 From: Jitendra Sharma Date: Thu, 1 Feb 2024 12:47:02 +0000 Subject: [PATCH] fix: set runalone mode in xe only for render and compute Runalone mode in XE is supported only for RENDER and COMPUTE. Related-To: NEO-9139 Signed-off-by: Jitendra Sharma --- .../os_interface/linux/xe/ioctl_helper_xe.cpp | 14 ++++---- .../xe/ioctl_helper_xe_debugger_tests.cpp | 33 +++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp index 332e55cdca..5c11f3828b 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -1225,13 +1225,15 @@ int IoctlHelperXe::createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_ struct drm_xe_ext_set_property ext {}; auto &gfxCoreHelper = drm.getRootDeviceEnvironment().getHelper(); - if (gfxCoreHelper.isRunaloneModeRequired(drm.getRootDeviceEnvironment().executionEnvironment.getDebuggingMode())) { - ext.base.next_extension = 0; - ext.base.name = DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY; - ext.property = getRunaloneExtProperty(); - ext.value = 1; + if ((engine[0].engine_class == DRM_XE_ENGINE_CLASS_RENDER) || (engine[0].engine_class == DRM_XE_ENGINE_CLASS_COMPUTE)) { + if (gfxCoreHelper.isRunaloneModeRequired(drm.getRootDeviceEnvironment().executionEnvironment.getDebuggingMode())) { + ext.base.next_extension = 0; + ext.base.name = DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY; + ext.property = getRunaloneExtProperty(); + ext.value = 1; - create.extensions = castToUint64(&ext); + create.extensions = castToUint64(&ext); + } } int ret = IoctlHelper::ioctl(DrmIoctl::gemContextCreateExt, &create); diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp index 1584ee1ace..0e7f40bd82 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_debugger_tests.cpp @@ -232,6 +232,39 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenRunaloneModeRequiredReturnTrueWhenCreate EXPECT_EQ(ext.value, 1ULL); } +HWTEST_F(IoctlHelperXeTestFixture, GivenContextCreatedForCopyEngineWhenCreateDrmContextThenRunAloneContextIsNotRequested) { + DebugManagerStateRestore restorer; + struct MockGfxCoreHelperHw : NEO::GfxCoreHelperHw { + bool isRunaloneModeRequired(DebuggingMode debuggingMode) const override { + return true; + } + }; + + class DrmMockXeDebugTest : public DrmMockXeDebug { + public: + DrmMockXeDebugTest(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockXeDebug(rootDeviceEnvironment){}; + unsigned int bindDrmContext(uint32_t drmContextId, uint32_t deviceIndex, aub_stream::EngineType engineType, bool engineInstancedDevice) override { + return static_cast(DrmParam::execBlt); + } + }; + + auto executionEnvironment = std::make_unique(); + auto &rootDeviceEnvironment = *executionEnvironment->rootDeviceEnvironments[0]; + auto raiiFactory = RAIIGfxCoreHelperFactory(rootDeviceEnvironment); + rootDeviceEnvironment.osInterface = std::make_unique(); + rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique(mockFd, rootDeviceEnvironment)); + DrmMockXeDebugTest drm{*executionEnvironment->rootDeviceEnvironments[0]}; + auto xeIoctlHelper = std::make_unique(drm); + auto engineInfo = xeIoctlHelper->createEngineInfo(false); + ASSERT_NE(nullptr, engineInfo); + + OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor()); + xeIoctlHelper->createDrmContext(drm, osContext, 0, 0); + + auto ext = drm.receivedContextCreateSetParam; + EXPECT_NE(ext.property, static_cast(DRM_XE_EXEC_QUEUE_SET_PROPERTY_RUNALONE)); +} + TEST(IoctlHelperXeTest, GivenXeDriverThenDebugAttachReturnsTrue) { auto executionEnvironment = std::make_unique(); DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};