From 9d052cd8ee4026a2c899090e9e5af44b6f23537c Mon Sep 17 00:00:00 2001 From: Mateusz Hoppe Date: Mon, 17 Mar 2025 11:54:26 +0000 Subject: [PATCH] fix: pass rootDevice when creating secondary contexts - fix initialization of gfxCoreHelper in drm and wddm Related-To: NEO-7824, NEO-8171 Signed-off-by: Mateusz Hoppe --- shared/source/device/device.cpp | 6 ++++- shared/source/os_interface/linux/drm_neo.cpp | 1 + .../source/os_interface/windows/wddm/wddm.cpp | 1 + .../unit_test/device/neo_device_tests.cpp | 1 + .../os_interface/linux/drm_tests.cpp | 25 +++++++++++++++++++ 5 files changed, 33 insertions(+), 1 deletion(-) diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index e36ce9de89..4caefe41ee 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -489,6 +489,8 @@ bool Device::createEngine(EngineTypeUsage engineTypeUsage) { osContext->setIsPrimaryEngine(isPrimaryEngine); osContext->setIsDefaultEngine(isDefaultEngine); + DEBUG_BREAK_IF(getDeviceBitfield().count() > 1 && !osContext->isRootDevice()); + commandStreamReceiver->setupContext(*osContext); if (osContext->isImmediateContextInitializationEnabled(isDefaultEngine)) { @@ -562,13 +564,15 @@ bool Device::createSecondaryEngine(CommandStreamReceiver *primaryCsr, EngineType return false; } - EngineDescriptor engineDescriptor(engineTypeUsage, getDeviceBitfield(), preemptionMode, false); + EngineDescriptor engineDescriptor(engineTypeUsage, getDeviceBitfield(), preemptionMode, primaryCsr->getOsContext().isRootDevice()); auto osContext = executionEnvironment->memoryManager->createAndRegisterSecondaryOsContext(&primaryCsr->getOsContext(), commandStreamReceiver.get(), engineDescriptor); osContext->incRefInternal(); commandStreamReceiver->setupContext(*osContext); commandStreamReceiver->setPrimaryCsr(primaryCsr); + DEBUG_BREAK_IF(getDeviceBitfield().count() > 1 && !osContext->isRootDevice()); + EngineControl engine{commandStreamReceiver.get(), osContext}; secondaryEngines[engineTypeUsage.first].engines.push_back(engine); diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 158e2f1b8e..4916a3e317 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -468,6 +468,7 @@ int Drm::setupHardwareInfo(const DeviceDescriptor *device, bool setupFeatureTabl rootDeviceEnvironment.initProductHelper(); rootDeviceEnvironment.initGfxCoreHelper(); + rootDeviceEnvironment.initializeGfxCoreHelperFromProductHelper(); rootDeviceEnvironment.initApiGfxCoreHelper(); rootDeviceEnvironment.initCompilerProductHelper(); rootDeviceEnvironment.initAilConfigurationHelper(); diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 07825942cf..f454ba38ea 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -116,6 +116,7 @@ bool Wddm::init() { productHelper.adjustPlatformForProductFamily(hardwareInfo); rootDeviceEnvironment.initApiGfxCoreHelper(); rootDeviceEnvironment.initGfxCoreHelper(); + rootDeviceEnvironment.initializeGfxCoreHelperFromProductHelper(); rootDeviceEnvironment.initializeGfxCoreHelperFromHwInfo(); rootDeviceEnvironment.initAilConfigurationHelper(); if (false == rootDeviceEnvironment.initAilConfiguration()) { diff --git a/shared/test/unit_test/device/neo_device_tests.cpp b/shared/test/unit_test/device/neo_device_tests.cpp index 23948a6223..bcfb2b1e48 100644 --- a/shared/test/unit_test/device/neo_device_tests.cpp +++ b/shared/test/unit_test/device/neo_device_tests.cpp @@ -1423,6 +1423,7 @@ HWTEST_F(DeviceTests, givenRootDeviceWithCCSEngineAndContextGroupSizeEnabledWhen for (size_t i = 1; i < device->secondaryEngines[aub_stream::EngineType::ENGINE_CCS].engines.size(); i++) { EXPECT_EQ(secondaryEngines.engines[0].osContext, secondaryEngines.engines[i].osContext->getPrimaryContext()); EXPECT_TRUE(secondaryEngines.engines[i].osContext->isPartOfContextGroup()); + EXPECT_TRUE(secondaryEngines.engines[i].osContext->isRootDevice()); } EXPECT_EQ(0u, secondaryEngines.regularCounter.load()); 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 d5d3e3cccb..b5cb4ff7c7 100644 --- a/shared/test/unit_test/os_interface/linux/drm_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_tests.cpp @@ -20,6 +20,7 @@ #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/helpers/default_hw_info.h" #include "shared/test/common/helpers/engine_descriptor_helper.h" +#include "shared/test/common/helpers/raii_gfx_core_helper.h" #include "shared/test/common/helpers/variable_backup.h" #include "shared/test/common/libult/linux/drm_mock.h" #include "shared/test/common/mocks/linux/mock_drm_memory_manager.h" @@ -2267,3 +2268,27 @@ TEST(DrmTest, GivenProductSpecificIoctlHelperAvailableAndDebugFlagToIgnoreIsSetW EXPECT_EQ(0u, customFuncCalled); } + +using DrmHwTest = ::testing::Test; +HWTEST_F(DrmHwTest, GivenDrmWhenSetupHardwareInfoCalledThenGfxCoreHelperIsInitializedFromProductHelper) { + DebugManagerStateRestore restore; + struct MockGfxCoreHelper : NEO::GfxCoreHelperHw { + + void initializeFromProductHelper(const ProductHelper &productHelper) override { + initFromProductHelperCalled = true; + } + bool initFromProductHelperCalled = false; + }; + + auto executionEnvironment = std::make_unique(); + NEO::RAIIGfxCoreHelperFactory raii(*executionEnvironment->rootDeviceEnvironments[0]); + + DrmMock drm{*executionEnvironment->rootDeviceEnvironments[0]}; + auto setupHardwareInfo = [](HardwareInfo *, bool, const ReleaseHelper *) {}; + DeviceDescriptor device = {0, executionEnvironment->rootDeviceEnvironments[0]->getMutableHardwareInfo(), setupHardwareInfo}; + + drm.ioctlHelper = std::make_unique(drm); + drm.setupHardwareInfo(&device, false); + + EXPECT_TRUE(raii.mockGfxCoreHelper->initFromProductHelperCalled); +}