From 3f65f75cc31b5723a3fb7da99abcf24e86346a44 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Thu, 11 Jul 2024 12:52:18 +0000 Subject: [PATCH] refactor: unify EngineInfo ctors remove redundant constructor create helper struct for numbers of engines adjust test scopes Related-To: NEO-10445 Signed-off-by: Mateusz Jablonski --- .../sources/engine/linux/mock_engine.h | 4 +- .../sources/engine/linux/mock_engine_prelim.h | 4 +- .../sources/engine/linux/mock_engine_xe.h | 3 +- .../sources/sysman/engine/linux/mock_engine.h | 4 +- .../sysman/engine/linux/mock_engine_prelim.h | 4 +- .../source/os_interface/linux/engine_info.cpp | 88 ++++++++----------- .../source/os_interface/linux/engine_info.h | 17 ++-- .../source/os_interface/linux/ioctl_helper.h | 12 +-- .../os_interface/linux/ioctl_helper_i915.cpp | 7 +- .../linux/ioctl_helper_prelim.cpp | 4 +- .../linux/ioctl_helper_upstream.cpp | 4 +- .../os_interface/linux/xe/ioctl_helper_xe.cpp | 4 +- .../os_interface/linux/xe/ioctl_helper_xe.h | 4 +- .../linux/drm_engine_info_prelim_tests.cpp | 22 +++-- .../linux/drm_engine_info_tests.cpp | 27 ++++-- 15 files changed, 114 insertions(+), 94 deletions(-) diff --git a/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine.h b/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine.h index 30af852faf..248e356fbc 100644 --- a/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine.h +++ b/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine.h @@ -65,7 +65,9 @@ struct MockEngineNeoDrm : public Drm { i915engineInfo[5].engine.engineClass = UINT16_MAX; i915engineInfo[5].engine.engineInstance = 0; - this->engineInfo.reset(new EngineInfo(this, i915engineInfo)); + StackVec, 2> engineInfosPerTile{i915engineInfo}; + + this->engineInfo.reset(new EngineInfo(this, engineInfosPerTile)); return true; } }; diff --git a/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_prelim.h b/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_prelim.h index 465b052e3b..a797ec962b 100644 --- a/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_prelim.h +++ b/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_prelim.h @@ -84,7 +84,9 @@ struct MockEngineNeoDrmPrelim : public Drm { i915QueryEngineInfo[6].engine.engineClass = invalidEngineClass; i915QueryEngineInfo[6].engine.engineInstance = 0; - this->engineInfo.reset(new EngineInfo(this, i915QueryEngineInfo)); + StackVec, 2> engineInfosPerTile{i915QueryEngineInfo}; + + this->engineInfo.reset(new EngineInfo(this, engineInfosPerTile)); return true; } diff --git a/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_xe.h b/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_xe.h index 69b4143086..0616b8522d 100644 --- a/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_xe.h +++ b/level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_xe.h @@ -47,7 +47,8 @@ class MockNeoDrm : public NEO::Drm { mockEngineInfo[5].engine.engineClass = UINT16_MAX; mockEngineInfo[5].engine.engineInstance = 0; - this->engineInfo.reset(new NEO::EngineInfo(this, mockEngineInfo)); + StackVec, 2> engineInfosPerTile{mockEngineInfo}; + this->engineInfo.reset(new NEO::EngineInfo(this, engineInfosPerTile)); return true; } }; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine.h b/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine.h index 73db2f6755..643d864ba4 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine.h @@ -55,7 +55,9 @@ struct MockEngineNeoDrm : public Drm { i915engineInfo[5].engine.engineClass = invalidEngineClass; i915engineInfo[5].engine.engineInstance = 0; - this->engineInfo.reset(new EngineInfo(this, i915engineInfo)); + StackVec, 2> engineInfosPerTile{i915engineInfo}; + + this->engineInfo.reset(new EngineInfo(this, engineInfosPerTile)); return true; } }; diff --git a/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine_prelim.h b/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine_prelim.h index 4aab273e9b..c0ca4357b3 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine_prelim.h +++ b/level_zero/tools/test/unit_tests/sources/sysman/engine/linux/mock_engine_prelim.h @@ -64,7 +64,9 @@ struct MockEngineNeoDrmPrelim : public Drm { i915QueryEngineInfo[6].engine.engineClass = invalidEngineClass; i915QueryEngineInfo[6].engine.engineInstance = 0; - this->engineInfo.reset(new EngineInfo(this, i915QueryEngineInfo)); + StackVec, 2> engineInfosPerTile{i915QueryEngineInfo}; + + this->engineInfo.reset(new EngineInfo(this, engineInfosPerTile)); return true; } diff --git a/shared/source/os_interface/linux/engine_info.cpp b/shared/source/os_interface/linux/engine_info.cpp index f07392a10c..6eaca6879f 100644 --- a/shared/source/os_interface/linux/engine_info.cpp +++ b/shared/source/os_interface/linux/engine_info.cpp @@ -63,86 +63,71 @@ uint32_t getBcsEngineMaskIndex(const aub_stream::EngineType *mappingCopyEngineIt } } // namespace -void EngineInfo::mapEngine(const NEO::IoctlHelper *ioctlHelper, const EngineClassInstance &engine, BcsInfoMask &bcsInfoMask, const NEO::RootDeviceEnvironment &rootDeviceEnvironment, - const aub_stream::EngineType *&mappingCopyEngineIt, uint32_t &computeEnginesCounter, uint32_t tileId) { +void EngineInfo::mapEngine(const NEO::IoctlHelper *ioctlHelper, const EngineCapabilities &engineInfo, const NEO::RootDeviceEnvironment &rootDeviceEnvironment, + const aub_stream::EngineType *&mappingCopyEngineIt, EngineCounters &engineCounters, uint32_t tileId) { + aub_stream::EngineType engineType = aub_stream::EngineType::NUM_ENGINES; + auto &engine = engineInfo.engine; tileToEngineMap.emplace(tileId, engine); if (engine.engineClass == ioctlHelper->getDrmParamValue(DrmParam::engineClassRender)) { - tileToEngineToInstanceMap[tileId][EngineHelpers::remapEngineTypeToHwSpecific(aub_stream::EngineType::ENGINE_RCS, rootDeviceEnvironment)] = engine; + engineType = EngineHelpers::remapEngineTypeToHwSpecific(aub_stream::EngineType::ENGINE_RCS, rootDeviceEnvironment); } else if (engine.engineClass == ioctlHelper->getDrmParamValue(DrmParam::engineClassCopy)) { - tileToEngineToInstanceMap[tileId][*(mappingCopyEngineIt)] = engine; - bcsInfoMask.set(getBcsEngineMaskIndex(mappingCopyEngineIt++), true); + + auto isIntergrated = rootDeviceEnvironment.getHardwareInfo()->capabilityTable.isIntegratedDevice; + auto &bcsInfoMask = rootDeviceEnvironment.getMutableHardwareInfo()->featureTable.ftrBcsInfo; + assignCopyEngine(EngineInfo::getBaseCopyEngineType(ioctlHelper, engineInfo.capabilities, isIntergrated), tileId, engine, + bcsInfoMask, engineCounters, mappingCopyEngineIt); + } else if (engine.engineClass == ioctlHelper->getDrmParamValue(DrmParam::engineClassCompute)) { - tileToEngineToInstanceMap[tileId][static_cast(aub_stream::ENGINE_CCS + computeEnginesCounter)] = engine; - computeEnginesCounter++; + + engineType = static_cast(aub_stream::ENGINE_CCS + engineCounters.numComputeEngines); + engineCounters.numComputeEngines++; } -} - -EngineInfo::EngineInfo(Drm *drm, const std::vector &engineInfos) : engines(engineInfos), tileToEngineToInstanceMap(1) { - auto computeEngines = 0u; - BcsInfoMask bcsInfoMask = 0; - uint32_t numHostLinkCopyEngines = 0; - uint32_t numScaleUpLinkCopyEngines = 0; - - auto ioctlHelper = drm->getIoctlHelper(); - - auto &rootDeviceEnvironment = drm->getRootDeviceEnvironment(); - for (const auto &engineInfo : engineInfos) { - auto &engine = engineInfo.engine; - tileToEngineMap.emplace(0, engine); - if (engine.engineClass == ioctlHelper->getDrmParamValue(DrmParam::engineClassRender)) { - tileToEngineToInstanceMap[0][EngineHelpers::remapEngineTypeToHwSpecific(aub_stream::EngineType::ENGINE_RCS, rootDeviceEnvironment)] = engine; - } else if (engine.engineClass == ioctlHelper->getDrmParamValue(DrmParam::engineClassCopy)) { - const auto &hwInfo = rootDeviceEnvironment.getHardwareInfo(); - assignCopyEngine(EngineInfo::getBaseCopyEngineType(ioctlHelper, engineInfo.capabilities, hwInfo->capabilityTable.isIntegratedDevice), 0, engine, - bcsInfoMask, numHostLinkCopyEngines, numScaleUpLinkCopyEngines); - } else if (engine.engineClass == ioctlHelper->getDrmParamValue(DrmParam::engineClassCompute)) { - tileToEngineToInstanceMap[0][static_cast(aub_stream::ENGINE_CCS + computeEngines)] = engine; - computeEngines++; - } + if (engineType != aub_stream::EngineType::NUM_ENGINES) { + tileToEngineToInstanceMap[tileId][engineType] = engine; } - setSupportedEnginesInfo(rootDeviceEnvironment, computeEngines, bcsInfoMask); } EngineInfo::EngineInfo(Drm *drm, const StackVec, 2> &engineInfosPerTile) : tileToEngineToInstanceMap(engineInfosPerTile.size()) { auto ioctlHelper = drm->getIoctlHelper(); auto &rootDeviceEnvironment = drm->getRootDeviceEnvironment(); - auto computeEnginesPerTile = 0u; - BcsInfoMask bcsInfoMask = {}; + EngineCounters engineCounters{}; + rootDeviceEnvironment.getMutableHardwareInfo()->featureTable.ftrBcsInfo = 0; for (auto tile = 0u; tile < engineInfosPerTile.size(); tile++) { - computeEnginesPerTile = 0u; + engineCounters.numComputeEngines = 0u; auto copyEnginesMappingIt = getCopyEnginesMappingIterator(rootDeviceEnvironment); for (const auto &engineCapabilities : engineInfosPerTile[tile]) { - mapEngine(ioctlHelper, engineCapabilities.engine, bcsInfoMask, rootDeviceEnvironment, copyEnginesMappingIt, computeEnginesPerTile, tile); + engines.push_back(engineCapabilities); + mapEngine(ioctlHelper, engineCapabilities, rootDeviceEnvironment, copyEnginesMappingIt, engineCounters, tile); } } - setSupportedEnginesInfo(rootDeviceEnvironment, computeEnginesPerTile, bcsInfoMask); + setSupportedEnginesInfo(rootDeviceEnvironment, engineCounters.numComputeEngines); } EngineInfo::EngineInfo(Drm *drm, uint32_t tileCount, const std::vector &distanceInfos, const std::vector &queryItems, const std::vector &engineInfos) : engines(engineInfos), tileToEngineToInstanceMap(tileCount) { auto tile = 0u; - auto computeEnginesPerTile = 0u; + EngineCounters engineCounters{}; auto ioctlHelper = drm->getIoctlHelper(); auto &rootDeviceEnvironment = drm->getRootDeviceEnvironment(); - BcsInfoMask bcsInfoMask = {}; + rootDeviceEnvironment.getMutableHardwareInfo()->featureTable.ftrBcsInfo = 0; auto copyEnginesMappingIt = getCopyEnginesMappingIterator(rootDeviceEnvironment); for (auto i = 0u; i < distanceInfos.size(); i++) { if (i > 0u && distanceInfos[i].region.memoryInstance != distanceInfos[i - 1u].region.memoryInstance) { tile++; - computeEnginesPerTile = 0u; + engineCounters.numComputeEngines = 0u; copyEnginesMappingIt = getCopyEnginesMappingIterator(rootDeviceEnvironment); } if (queryItems[i].length < 0 || distanceInfos[i].distance != 0) { continue; } - auto engine = distanceInfos[i].engine; - mapEngine(ioctlHelper, engine, bcsInfoMask, rootDeviceEnvironment, copyEnginesMappingIt, computeEnginesPerTile, tile); + EngineCapabilities engineInfo = {distanceInfos[i].engine, 0}; + mapEngine(ioctlHelper, engineInfo, rootDeviceEnvironment, copyEnginesMappingIt, engineCounters, tile); } - setSupportedEnginesInfo(rootDeviceEnvironment, computeEnginesPerTile, bcsInfoMask); + setSupportedEnginesInfo(rootDeviceEnvironment, engineCounters.numComputeEngines); } const EngineClassInstance *EngineInfo::getEngineInstance(uint32_t tile, aub_stream::EngineType engineType) const { @@ -157,7 +142,7 @@ const EngineClassInstance *EngineInfo::getEngineInstance(uint32_t tile, aub_stre return &iter->second; } -void EngineInfo::setSupportedEnginesInfo(const RootDeviceEnvironment &rootDeviceEnvironment, uint32_t numComputeEngines, const BcsInfoMask &bcsInfoMask) { +void EngineInfo::setSupportedEnginesInfo(const RootDeviceEnvironment &rootDeviceEnvironment, uint32_t numComputeEngines) { auto hwInfo = rootDeviceEnvironment.getMutableHardwareInfo(); auto &ccsInfo = hwInfo->gtSystemInfo.CCSInfo; @@ -175,7 +160,6 @@ void EngineInfo::setSupportedEnginesInfo(const RootDeviceEnvironment &rootDevice ccsInfo.NumberOfCCSEnabled = 0; ccsInfo.Instances.CCSEnableMask = 0; } - hwInfo->featureTable.ftrBcsInfo = bcsInfoMask; } uint32_t EngineInfo::getEngineTileIndex(const EngineClassInstance &engine) { @@ -205,23 +189,23 @@ const std::multimap &EngineInfo::getEngineTileInf } void EngineInfo::assignCopyEngine(aub_stream::EngineType baseEngineType, uint32_t tileId, const EngineClassInstance &engine, - BcsInfoMask &bcsInfoMask, uint32_t &numHostLinkCopyEngines, uint32_t &numScaleUpLinkCopyEngines) { + BcsInfoMask &bcsInfoMask, EngineCounters &engineCounters, const aub_stream::EngineType *&mappingCopyEngineIt) { // Link copy engines: if (baseEngineType == DrmEngineMappingHelper::baseForHostLinkCopyEngine) { - assignLinkCopyEngine(tileToEngineToInstanceMap, baseEngineType, tileId, engine, bcsInfoMask, numHostLinkCopyEngines); + assignLinkCopyEngine(tileToEngineToInstanceMap, baseEngineType, tileId, engine, bcsInfoMask, engineCounters.numHostLinkCopyEngines); return; } if (baseEngineType == DrmEngineMappingHelper::baseForScaleUpLinkCopyEngine) { - assignLinkCopyEngine(tileToEngineToInstanceMap, baseEngineType, tileId, engine, bcsInfoMask, numScaleUpLinkCopyEngines); + assignLinkCopyEngine(tileToEngineToInstanceMap, baseEngineType, tileId, engine, bcsInfoMask, engineCounters.numScaleUpLinkCopyEngines); return; } // Main copy engine: UNRECOVERABLE_IF(baseEngineType != DrmEngineMappingHelper::baseForMainCopyEngine); - UNRECOVERABLE_IF(bcsInfoMask.test(0)); - tileToEngineToInstanceMap[tileId][aub_stream::ENGINE_BCS] = engine; - bcsInfoMask.set(0, true); + auto engineType = *(mappingCopyEngineIt++); + tileToEngineToInstanceMap[tileId][engineType] = engine; + bcsInfoMask.set(getBcsEngineMaskIndex(&engineType), true); } bool EngineInfo::hasEngines() { @@ -233,7 +217,7 @@ const std::vector &EngineInfo::getEngineInfos() const { } // EngineIndex = (Base + EngineCounter - 1) -aub_stream::EngineType EngineInfo::getBaseCopyEngineType(IoctlHelper *ioctlHelper, uint64_t capabilities, bool isIntegratedDevice) { +aub_stream::EngineType EngineInfo::getBaseCopyEngineType(const IoctlHelper *ioctlHelper, uint64_t capabilities, bool isIntegratedDevice) { if (!isIntegratedDevice) { if (const auto capa = ioctlHelper->getCopyClassSaturatePCIECapability(); capa && isValueSet(capabilities, *capa)) { return DrmEngineMappingHelper::baseForHostLinkCopyEngine; diff --git a/shared/source/os_interface/linux/engine_info.h b/shared/source/os_interface/linux/engine_info.h index 6ee3bd6ea0..9ed37d57f0 100644 --- a/shared/source/os_interface/linux/engine_info.h +++ b/shared/source/os_interface/linux/engine_info.h @@ -26,7 +26,6 @@ struct EngineInfo { using EngineToInstanceMap = std::map; EngineInfo(Drm *drm, const StackVec, 2> &engineInfosPerTile); - EngineInfo(Drm *drm, const std::vector &engineInfos); EngineInfo(Drm *drm, uint32_t tileCount, const std::vector &distanceInfos, const std::vector &queryItems, const std::vector &engineInfos); ~EngineInfo() = default; @@ -39,13 +38,19 @@ struct EngineInfo { const std::vector &getEngineInfos() const; protected: - static aub_stream::EngineType getBaseCopyEngineType(IoctlHelper *ioctlHelper, uint64_t capabilities, bool isIntegratedDevice); - static void setSupportedEnginesInfo(const RootDeviceEnvironment &rootDeviceEnvironment, uint32_t numComputeEngines, const BcsInfoMask &bcsInfoMask); + struct EngineCounters { + uint32_t numHostLinkCopyEngines = 0; + uint32_t numScaleUpLinkCopyEngines = 0; + uint32_t numComputeEngines = 0; + }; + + static aub_stream::EngineType getBaseCopyEngineType(const IoctlHelper *ioctlHelper, uint64_t capabilities, bool isIntegratedDevice); + static void setSupportedEnginesInfo(const RootDeviceEnvironment &rootDeviceEnvironment, uint32_t numComputeEngines); void assignCopyEngine(aub_stream::EngineType baseEngineType, uint32_t tileId, const EngineClassInstance &engine, - BcsInfoMask &bcsInfoMask, uint32_t &numHostLinkCopyEngines, uint32_t &numScaleUpLinkCopyEngines); - void mapEngine(const NEO::IoctlHelper *ioctlHelper, const EngineClassInstance &engine, BcsInfoMask &bcsInfoMask, const NEO::RootDeviceEnvironment &rootDeviceEnvironment, - const aub_stream::EngineType *&mappingCopyEngineIt, uint32_t &computeEnginesCounter, uint32_t tileId = 0u); + BcsInfoMask &bcsInfoMask, EngineCounters &engineCounters, const aub_stream::EngineType *&mappingCopyEngineIt); + void mapEngine(const NEO::IoctlHelper *ioctlHelper, const EngineCapabilities &engineInfo, const NEO::RootDeviceEnvironment &rootDeviceEnvironment, + const aub_stream::EngineType *&mappingCopyEngineIt, EngineCounters &engineCounters, uint32_t tileId); std::vector engines; std::vector tileToEngineToInstanceMap; diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 8d13d7145a..960b39cb48 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -131,8 +131,8 @@ class IoctlHelper { virtual void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) = 0; virtual void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) = 0; virtual void setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT vmBindUserFence) = 0; - virtual std::optional getCopyClassSaturatePCIECapability() = 0; - virtual std::optional getCopyClassSaturateLinkCapability() = 0; + virtual std::optional getCopyClassSaturatePCIECapability() const = 0; + virtual std::optional getCopyClassSaturateLinkCapability() const = 0; virtual uint32_t getVmAdviseAtomicAttribute() = 0; virtual int vmBind(const VmBindParams &vmBindParams) = 0; virtual int vmUnbind(const VmBindParams &vmBindParams) = 0; @@ -284,8 +284,8 @@ class IoctlHelperUpstream : public IoctlHelperI915 { void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override; void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override; void setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT vmBindUserFence) override; - std::optional getCopyClassSaturatePCIECapability() override; - std::optional getCopyClassSaturateLinkCapability() override; + std::optional getCopyClassSaturatePCIECapability() const override; + std::optional getCopyClassSaturateLinkCapability() const override; uint32_t getVmAdviseAtomicAttribute() override; int vmBind(const VmBindParams &vmBindParams) override; int vmUnbind(const VmBindParams &vmBindParams) override; @@ -362,8 +362,8 @@ class IoctlHelperPrelim20 : public IoctlHelperI915 { void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override; void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override; void setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT vmBindUserFence) override; - std::optional getCopyClassSaturatePCIECapability() override; - std::optional getCopyClassSaturateLinkCapability() override; + std::optional getCopyClassSaturatePCIECapability() const override; + std::optional getCopyClassSaturateLinkCapability() const override; uint32_t getVmAdviseAtomicAttribute() override; int vmBind(const VmBindParams &vmBindParams) override; int vmUnbind(const VmBindParams &vmBindParams) override; diff --git a/shared/source/os_interface/linux/ioctl_helper_i915.cpp b/shared/source/os_interface/linux/ioctl_helper_i915.cpp index 6590694f0e..3b5bc85416 100644 --- a/shared/source/os_interface/linux/ioctl_helper_i915.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_i915.cpp @@ -197,12 +197,13 @@ std::unique_ptr IoctlHelperI915::createEngineInfo(bool isSysmanEnabl return {}; } auto engines = translateToEngineCaps(enginesQuery); + StackVec, 2> engineInfosPerTile{engines}; auto hwInfo = drm.getRootDeviceEnvironment().getMutableHardwareInfo(); auto memInfo = drm.getMemoryInfo(); if (!memInfo) { - return std::make_unique(&drm, engines); + return std::make_unique(&drm, engineInfosPerTile); } auto &memoryRegions = memInfo->getDrmRegionInfos(); @@ -234,7 +235,7 @@ std::unique_ptr IoctlHelperI915::createEngineInfo(bool isSysmanEnabl } if (tileCount == 0u) { - return std::make_unique(&drm, engines); + return std::make_unique(&drm, engineInfosPerTile); } std::vector queryItems{distanceInfos.size()}; @@ -247,7 +248,7 @@ std::unique_ptr IoctlHelperI915::createEngineInfo(bool isSysmanEnabl [](const QueryItem &item) { return item.length == -EINVAL; }); if (queryUnsupported) { DEBUG_BREAK_IF(tileCount != 1); - return std::make_unique(&drm, engines); + return std::make_unique(&drm, engineInfosPerTile); } memInfo->assignRegionsFromDistances(distanceInfos); diff --git a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp index 92da0e8624..1060731600 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -723,11 +723,11 @@ void IoctlHelperPrelim20::setVmBindUserFence(VmBindParams &vmBind, VmBindExtUser return; } -std::optional IoctlHelperPrelim20::getCopyClassSaturatePCIECapability() { +std::optional IoctlHelperPrelim20::getCopyClassSaturatePCIECapability() const { return PRELIM_I915_COPY_CLASS_CAP_SATURATE_PCIE; } -std::optional IoctlHelperPrelim20::getCopyClassSaturateLinkCapability() { +std::optional IoctlHelperPrelim20::getCopyClassSaturateLinkCapability() const { return PRELIM_I915_COPY_CLASS_CAP_SATURATE_LINK; } diff --git a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp index 858abd7982..94555c64d4 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -235,11 +235,11 @@ void IoctlHelperUpstream::fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtU void IoctlHelperUpstream::setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT vmBindUserFence){}; -std::optional IoctlHelperUpstream::getCopyClassSaturatePCIECapability() { +std::optional IoctlHelperUpstream::getCopyClassSaturatePCIECapability() const { return std::nullopt; } -std::optional IoctlHelperUpstream::getCopyClassSaturateLinkCapability() { +std::optional IoctlHelperUpstream::getCopyClassSaturateLinkCapability() const { return std::nullopt; } 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 8460349681..06c8258c52 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -861,12 +861,12 @@ void IoctlHelperXe::setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT return; } -std::optional IoctlHelperXe::getCopyClassSaturatePCIECapability() { +std::optional IoctlHelperXe::getCopyClassSaturatePCIECapability() const { xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__); return {}; } -std::optional IoctlHelperXe::getCopyClassSaturateLinkCapability() { +std::optional IoctlHelperXe::getCopyClassSaturateLinkCapability() const { xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__); return {}; } diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h index d069afffca..6c5267a6e7 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -74,8 +74,8 @@ class IoctlHelperXe : public IoctlHelper { void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override; void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override; void setVmBindUserFence(VmBindParams &vmBind, VmBindExtUserFenceT vmBindUserFence) override; - std::optional getCopyClassSaturatePCIECapability() override; - std::optional getCopyClassSaturateLinkCapability() override; + std::optional getCopyClassSaturatePCIECapability() const override; + std::optional getCopyClassSaturateLinkCapability() const override; uint32_t getVmAdviseAtomicAttribute() override; int vmBind(const VmBindParams &vmBindParams) override; int vmUnbind(const VmBindParams &vmBindParams) override; diff --git a/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp index 9b80afd484..15255f03e4 100644 --- a/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_engine_info_prelim_tests.cpp @@ -98,8 +98,9 @@ class MockIoctlHelperEngineInfoDetection : public IoctlHelperPrelim20 { std::unique_ptr createEngineInfo(bool isSysmanEnabled) override { std::vector engineInfo(0); + StackVec, 2> engineInfosPerTile{engineInfo}; - return std::make_unique(&drm, engineInfo); + return std::make_unique(&drm, engineInfosPerTile); } }; @@ -245,7 +246,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DrmTestXeHPAndLater, givenBcsEngineWhenBindingDrmCo EXPECT_EQ(ftrBcsInfoVal, hwInfo->featureTable.ftrBcsInfo.to_ulong()); } -HWCMDTEST_F(IGFX_XE_HP_CORE, DrmTestXeHPAndLater, givenLinkBcsEngineWhenBindingSingleTileDrmContextThenContextParamEngineIsSet) { +HWTEST2_F(DrmTestXeHPAndLater, givenLinkBcsEngineWhenBindingSingleTileDrmContextThenContextParamEngineIsSet, IsXeHpcCore) { HardwareInfo localHwInfo = *defaultHwInfo; localHwInfo.gtSystemInfo.MultiTileArchInfo.IsValid = false; localHwInfo.gtSystemInfo.MultiTileArchInfo.TileCount = 0; @@ -324,7 +325,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DrmTestXeHPAndLater, givenLinkBcsEngineWithoutMainC } } -HWCMDTEST_F(IGFX_XE_HP_CORE, DrmTestXeHPAndLater, giveNotAllLinkBcsEnginesWhenBindingSingleTileDrmContextThenContextParamEngineIsSet) { +HWTEST2_F(DrmTestXeHPAndLater, givenNotAllLinkBcsEnginesWhenBindingSingleTileDrmContextThenContextParamEngineIsSet, IsXeHpcCore) { DebugManagerStateRestore restore; debugManager.flags.UseDrmVirtualEnginesForBcs.set(1); HardwareInfo localHwInfo = *defaultHwInfo; @@ -415,7 +416,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, DrmTestXeHPAndLater, givenLinkBcsEngineWhenBindingM } } -HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesEnabledWhenCreatingContextThenEnableLoadBalancing, IsAtLeastXeHpcCore) { +HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesEnabledWhenCreatingContextThenEnableLoadBalancing, IsXeHpcCore) { DebugManagerStateRestore restore; debugManager.flags.UseDrmVirtualEnginesForBcs.set(1); HardwareInfo localHwInfo = *defaultHwInfo; @@ -444,7 +445,7 @@ HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesEnabledWhenCreatingContext } } -HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesEnabledWhenCreatingContextThenEnableLoadBalancingLimitedToMaxCount, IsAtLeastXeHpcCore) { +HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesEnabledWhenCreatingContextThenEnableLoadBalancingLimitedToMaxCount, IsXeHpcCore) { DebugManagerStateRestore restore; debugManager.flags.UseDrmVirtualEnginesForBcs.set(1); debugManager.flags.LimitEngineCountForVirtualBcs.set(3); @@ -474,7 +475,7 @@ HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesEnabledWhenCreatingContext } } -HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesDisabledWhenCreatingContextThenDisableLoadBalancing, IsAtLeastXeHpcCore) { +HWTEST2_F(DrmTestXeHPCAndLater, givenBcsVirtualEnginesDisabledWhenCreatingContextThenDisableLoadBalancing, IsXeHpcCore) { DebugManagerStateRestore restore; debugManager.flags.UseDrmVirtualEnginesForBcs.set(0); @@ -838,8 +839,8 @@ TEST(DrmTest, givenNewMemoryInfoQuerySupportedWhenQueryingEngineInfoThenEngineIn EXPECT_NE(nullptr, drm->engineInfo); } struct MockEngineInfo : EngineInfo { + using EngineInfo::EngineInfo; using EngineInfo::getBaseCopyEngineType; - MockEngineInfo(Drm *drm, const std::vector &engineInfos) : EngineInfo(drm, engineInfos){}; }; TEST(DrmTest, givenCapsWhenCallGetBaseCopyEngineTypeAndIsIntegratedGpuThenBcs0AlwaysIsReturned) { @@ -847,8 +848,9 @@ TEST(DrmTest, givenCapsWhenCallGetBaseCopyEngineTypeAndIsIntegratedGpuThenBcs0Al auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); drm->ioctlHelper = std::make_unique(*drm); std::vector i915engineInfo(1); + StackVec, 2> engineInfosPerTile{i915engineInfo}; - auto engineInfo = std::make_unique(drm.get(), i915engineInfo); + auto engineInfo = std::make_unique(drm.get(), engineInfosPerTile); bool isIntegratedGpu = true; auto caps = drm->ioctlHelper->getCopyClassSaturatePCIECapability(); EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS, engineInfo->getBaseCopyEngineType(drm->ioctlHelper.get(), *caps, isIntegratedGpu)); @@ -866,7 +868,9 @@ TEST(DrmTest, givenCapsWhenCallGetBaseCopyEngineTypeAndIsNotIntegratedGpuThenPro drm->ioctlHelper = std::make_unique(*drm); std::vector i915engineInfo(1); - auto engineInfo = std::make_unique(drm.get(), i915engineInfo); + StackVec, 2> engineInfosPerTile{i915engineInfo}; + + auto engineInfo = std::make_unique(drm.get(), engineInfosPerTile); bool isIntegratedGpu = false; auto caps = drm->ioctlHelper->getCopyClassSaturatePCIECapability(); EXPECT_EQ(aub_stream::EngineType::ENGINE_BCS1, engineInfo->getBaseCopyEngineType(drm->ioctlHelper.get(), *caps, isIntegratedGpu)); diff --git a/shared/test/unit_test/os_interface/linux/drm_engine_info_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_engine_info_tests.cpp index dbf3d5e34a..2c8c8ed76e 100644 --- a/shared/test/unit_test/os_interface/linux/drm_engine_info_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_engine_info_tests.cpp @@ -66,13 +66,21 @@ TEST(EngineInfoTest, whenCreateEngineInfoWithRcsThenCorrectHwInfoSet) { engines[0].capabilities = 0; engines[1].engine = {static_cast(ioctlHelper->getDrmParamValue(DrmParam::engineClassCopy)), 0}; engines[1].capabilities = 0; - auto engineInfo = std::make_unique(drm.get(), engines); + StackVec, 2> engineInfosPerTile{engines}; + auto engineInfo = std::make_unique(drm.get(), engineInfosPerTile); auto ccsInfo = hwInfo.gtSystemInfo.CCSInfo; EXPECT_FALSE(ccsInfo.IsValid); EXPECT_EQ(0u, ccsInfo.NumberOfCCSEnabled); EXPECT_EQ(0u, ccsInfo.Instances.CCSEnableMask); - EXPECT_EQ(1u, hwInfo.featureTable.ftrBcsInfo.to_ulong()); + + auto &productHelper = executionEnvironment->rootDeviceEnvironments[0]->getProductHelper(); + auto defaultCopyEngine = productHelper.getDefaultCopyEngine(); + if (defaultCopyEngine == aub_stream::EngineType::ENGINE_BCS) { + EXPECT_EQ(1u, hwInfo.featureTable.ftrBcsInfo.to_ulong()); + } else { + EXPECT_TRUE(hwInfo.featureTable.ftrBcsInfo.test(static_cast(defaultCopyEngine) - static_cast(aub_stream::EngineType::ENGINE_BCS1) + 1)); + } } TEST(EngineInfoTest, whenCallingGetEngineTileInfoCorrectValuesAreReturned) { @@ -83,7 +91,8 @@ TEST(EngineInfoTest, whenCallingGetEngineTileInfoCorrectValuesAreReturned) { std::vector engines(1); engines[0].engine = {static_cast(ioctlHelper->getDrmParamValue(DrmParam::engineClassRender)), 0}; engines[0].capabilities = 0; - auto engineInfo = std::make_unique(drm.get(), engines); + StackVec, 2> engineInfosPerTile{engines}; + auto engineInfo = std::make_unique(drm.get(), engineInfosPerTile); auto engineTileMap = engineInfo->getEngineTileInfo(); auto it = engineTileMap.begin(); @@ -103,13 +112,21 @@ TEST(EngineInfoTest, whenCreateEngineInfoWithCcsThenCorrectHwInfoSet) { engines[0].capabilities = 0; engines[1].engine = {static_cast(ioctlHelper->getDrmParamValue(DrmParam::engineClassCopy)), 0}; engines[1].capabilities = 0; - auto engineInfo = std::make_unique(drm.get(), engines); + StackVec, 2> engineInfosPerTile{engines}; + auto engineInfo = std::make_unique(drm.get(), engineInfosPerTile); auto ccsInfo = hwInfo.gtSystemInfo.CCSInfo; EXPECT_TRUE(ccsInfo.IsValid); EXPECT_EQ(1u, ccsInfo.NumberOfCCSEnabled); EXPECT_EQ(1u, ccsInfo.Instances.CCSEnableMask); - EXPECT_EQ(1u, hwInfo.featureTable.ftrBcsInfo.to_ulong()); + + auto &productHelper = executionEnvironment->rootDeviceEnvironments[0]->getProductHelper(); + auto defaultCopyEngine = productHelper.getDefaultCopyEngine(); + if (defaultCopyEngine == aub_stream::EngineType::ENGINE_BCS) { + EXPECT_EQ(1u, hwInfo.featureTable.ftrBcsInfo.to_ulong()); + } else { + EXPECT_TRUE(hwInfo.featureTable.ftrBcsInfo.test(static_cast(defaultCopyEngine) - static_cast(aub_stream::EngineType::ENGINE_BCS1) + 1)); + } } TEST(EngineInfoTest, whenGetEngineInstanceAndTileThenCorrectValuesReturned) {