diff --git a/level_zero/core/source/device/bcs_split.cpp b/level_zero/core/source/device/bcs_split.cpp index 1af3e46267..d7b9dd3f65 100644 --- a/level_zero/core/source/device/bcs_split.cpp +++ b/level_zero/core/source/device/bcs_split.cpp @@ -20,7 +20,7 @@ namespace L0 { bool BcsSplit::setupDevice(uint32_t productFamily, bool internalUsage, const ze_command_queue_desc_t *desc, NEO::CommandStreamReceiver *csr) { auto &productHelper = this->device.getProductHelper(); - auto bcsSplitSettings = productHelper.getBcsSplitSettings(); + auto bcsSplitSettings = productHelper.getBcsSplitSettings(this->device.getHwInfo()); if (NEO::debugManager.flags.SplitBcsRequiredTileCount.get() != -1) { bcsSplitSettings.requiredTileCount = static_cast(NEO::debugManager.flags.SplitBcsRequiredTileCount.get()); @@ -70,6 +70,10 @@ bool BcsSplit::setupQueues(const NEO::BcsSplitSettings &settings, uint32_t produ csrs.push_back(engine->commandStreamReceiver); } } + + if (csrs.size() >= settings.minRequiredTotalCsrCount) { + break; + } } } diff --git a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_blit.cpp b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_blit.cpp index 55db349988..c02e213629 100644 --- a/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_blit.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdlist/test_cmdlist_blit.cpp @@ -1090,6 +1090,19 @@ struct AggregatedBcsSplitTests : public ::testing::Test { uint32_t expectedNumRootDevices = 1; }; +HWTEST2_F(AggregatedBcsSplitTests, givenLimitedEnginesCountWhenCreatingBcsSplitThenCreateCorrectQueues, IsAtLeastXeHpcCore) { + expectedEnginesCount = 2; + debugManager.flags.SplitBcsRequiredEnginesCount.set(expectedEnginesCount); + + BcsSplit bcsSplit(static_cast(*device)); + + bcsSplit.setupDevice(device->getHwInfo().platform.eProductFamily, false, nullptr, cmdList->getCsr(false)); + + EXPECT_EQ(expectedEnginesCount, bcsSplit.cmdQs.size()); + + bcsSplit.releaseResources(); +} + HWTEST_F(AggregatedBcsSplitTests, givenTransferDirectionWhenAskingIfSplitIsNeededThenReturnCorrectValue) { debugManager.flags.SplitBcsTransferDirectionMask.set(-1); diff --git a/shared/source/device/device.cpp b/shared/source/device/device.cpp index 85c30fff9b..a9e1a5ce46 100644 --- a/shared/source/device/device.cpp +++ b/shared/source/device/device.cpp @@ -693,7 +693,7 @@ uint64_t Device::getProfilingTimerClock() { bool Device::isBcsSplitSupported() { auto &productHelper = getProductHelper(); - auto bcsSplit = productHelper.getBcsSplitSettings().enabled && Device::isBlitSplitEnabled(); + auto bcsSplit = productHelper.getBcsSplitSettings(getHardwareInfo()).enabled && Device::isBlitSplitEnabled(); if (debugManager.flags.SplitBcsCopy.get() != -1) { bcsSplit = debugManager.flags.SplitBcsCopy.get(); diff --git a/shared/source/os_interface/product_helper.h b/shared/source/os_interface/product_helper.h index 691e21ffc8..707be88181 100644 --- a/shared/source/os_interface/product_helper.h +++ b/shared/source/os_interface/product_helper.h @@ -156,7 +156,7 @@ class ProductHelper { virtual bool isTilePlacementResourceWaRequired(const HardwareInfo &hwInfo) const = 0; virtual bool allowMemoryPrefetch(const HardwareInfo &hwInfo) const = 0; virtual bool isBcsReportWaRequired(const HardwareInfo &hwInfo) const = 0; - virtual BcsSplitSettings getBcsSplitSettings() const = 0; + virtual BcsSplitSettings getBcsSplitSettings(const HardwareInfo &hwInfo) const = 0; virtual bool isBlitCopyRequiredForLocalMemory(const RootDeviceEnvironment &rootDeviceEnvironment, const GraphicsAllocation &allocation) const = 0; virtual bool isInitDeviceWithFirstSubmissionRequired(const HardwareInfo &hwInfo) const = 0; virtual bool isImplicitScalingSupported(const HardwareInfo &hwInfo) const = 0; diff --git a/shared/source/os_interface/product_helper.inl b/shared/source/os_interface/product_helper.inl index 2fbdf38553..77b025a787 100644 --- a/shared/source/os_interface/product_helper.inl +++ b/shared/source/os_interface/product_helper.inl @@ -561,7 +561,7 @@ bool ProductHelperHw::isBcsReportWaRequired(const HardwareInfo &hwIn } template -BcsSplitSettings ProductHelperHw::getBcsSplitSettings() const { +BcsSplitSettings ProductHelperHw::getBcsSplitSettings(const HardwareInfo &hwInfo) const { return {}; } diff --git a/shared/source/os_interface/product_helper_hw.h b/shared/source/os_interface/product_helper_hw.h index f01a79d64e..7876520a86 100644 --- a/shared/source/os_interface/product_helper_hw.h +++ b/shared/source/os_interface/product_helper_hw.h @@ -96,7 +96,7 @@ class ProductHelperHw : public ProductHelper { bool isCooperativeEngineSupported(const HardwareInfo &hwInfo) const override; bool isTimestampWaitSupportedForEvents() const override; bool isTilePlacementResourceWaRequired(const HardwareInfo &hwInfo) const override; - BcsSplitSettings getBcsSplitSettings() const override; + BcsSplitSettings getBcsSplitSettings(const HardwareInfo &hwInfo) const override; bool isInitDeviceWithFirstSubmissionRequired(const HardwareInfo &hwInfo) const override; bool allowMemoryPrefetch(const HardwareInfo &hwInfo) const override; bool isBcsReportWaRequired(const HardwareInfo &hwInfo) const override; diff --git a/shared/source/xe_hpc_core/pvc/os_agnostic_product_helper_pvc.inl b/shared/source/xe_hpc_core/pvc/os_agnostic_product_helper_pvc.inl index ccfc99b6d6..e430581b23 100644 --- a/shared/source/xe_hpc_core/pvc/os_agnostic_product_helper_pvc.inl +++ b/shared/source/xe_hpc_core/pvc/os_agnostic_product_helper_pvc.inl @@ -175,7 +175,7 @@ bool ProductHelperHw::isTlbFlushRequired() const { } template <> -BcsSplitSettings ProductHelperHw::getBcsSplitSettings() const { +BcsSplitSettings ProductHelperHw::getBcsSplitSettings(const HardwareInfo &hwInfo) const { constexpr BcsInfoMask oddLinkedCopyEnginesMask = NEO::EngineHelpers::oddLinkedCopyEnginesMask; return { diff --git a/shared/test/unit_test/os_interface/product_helper_tests.cpp b/shared/test/unit_test/os_interface/product_helper_tests.cpp index 13d0108769..a2d5b35b67 100644 --- a/shared/test/unit_test/os_interface/product_helper_tests.cpp +++ b/shared/test/unit_test/os_interface/product_helper_tests.cpp @@ -100,7 +100,7 @@ HWTEST_F(ProductHelperTest, givenProductHelperWhenGettingSharedSystemMemCapabili HWTEST_F(ProductHelperTest, givenProductHelperWhenAskedIfIsBlitSplitEnqueueWARequiredThenReturnFalse) { - EXPECT_FALSE(productHelper->getBcsSplitSettings().enabled); + EXPECT_FALSE(productHelper->getBcsSplitSettings(pInHwInfo).enabled); } HWTEST_F(ProductHelperTest, givenProductHelperWhenGettingMemoryCapabilitiesThenCorrectValueIsReturned) { diff --git a/shared/test/unit_test/xe_hpc_core/pvc/linux/product_helper_tests_pvc.cpp b/shared/test/unit_test/xe_hpc_core/pvc/linux/product_helper_tests_pvc.cpp index be15920b05..f622c7cba0 100644 --- a/shared/test/unit_test/xe_hpc_core/pvc/linux/product_helper_tests_pvc.cpp +++ b/shared/test/unit_test/xe_hpc_core/pvc/linux/product_helper_tests_pvc.cpp @@ -96,7 +96,7 @@ PVCTEST_F(PvcProductHelperLinux, givenOsInterfaceIsNullWhenGetDeviceMemoryPhysic } PVCTEST_F(PvcProductHelperLinux, givenProductHelperWhenAskedIsBlitSplitEnqueueWARequiredThenReturnTrue) { - auto bcsSplitSettings = productHelper->getBcsSplitSettings(); + auto bcsSplitSettings = productHelper->getBcsSplitSettings(pInHwInfo); EXPECT_TRUE(bcsSplitSettings.enabled); EXPECT_EQ(NEO::EngineHelpers::oddLinkedCopyEnginesMask, bcsSplitSettings.allEngines.to_ulong());