diff --git a/level_zero/sysman/source/engine/linux/sysman_os_engine_imp.h b/level_zero/sysman/source/engine/linux/sysman_os_engine_imp.h index 526ad431bd..d9ee109096 100644 --- a/level_zero/sysman/source/engine/linux/sysman_os_engine_imp.h +++ b/level_zero/sysman/source/engine/linux/sysman_os_engine_imp.h @@ -17,6 +17,7 @@ namespace L0 { namespace Sysman { +class SysmanKmdInterface; class PmuInterface; struct Device; class LinuxEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass { @@ -35,6 +36,7 @@ class LinuxEngineImp : public OsEngine, NEO::NonCopyableOrMovableClass { } protected: + SysmanKmdInterface *pSysmanKmdInterface = nullptr; zes_engine_group_t engineGroup = ZES_ENGINE_GROUP_ALL; uint32_t engineInstance = 0; PmuInterface *pPmuInterface = nullptr; diff --git a/level_zero/sysman/source/engine/linux/sysman_os_engine_imp_prelim.cpp b/level_zero/sysman/source/engine/linux/sysman_os_engine_imp_prelim.cpp index c1e487f1d7..ba5da88ab2 100644 --- a/level_zero/sysman/source/engine/linux/sysman_os_engine_imp_prelim.cpp +++ b/level_zero/sysman/source/engine/linux/sysman_os_engine_imp_prelim.cpp @@ -13,29 +13,11 @@ #include "level_zero/sysman/source/linux/pmu/sysman_pmu_imp.h" #include "level_zero/sysman/source/linux/sysman_hw_device_id_linux.h" #include "level_zero/sysman/source/linux/zes_os_sysman_imp.h" -#include "level_zero/sysman/source/sysman_const.h" +#include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h" namespace L0 { namespace Sysman { -using NEO::PrelimI915::I915_SAMPLE_BUSY; - -static const std::multimap<__u16, zes_engine_group_t> i915ToEngineMap = { - {static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_RENDER), ZES_ENGINE_GROUP_RENDER_SINGLE}, - {static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE}, - {static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE}, - {static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_COPY), ZES_ENGINE_GROUP_COPY_SINGLE}, - {static_cast<__u16>(prelim_drm_i915_gem_engine_class::PRELIM_I915_ENGINE_CLASS_COMPUTE), ZES_ENGINE_GROUP_COMPUTE_SINGLE}, - {static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO_ENHANCE), ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE}}; - -static const std::multimap engineToI915Map = { - {ZES_ENGINE_GROUP_RENDER_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_RENDER)}, - {ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO)}, - {ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO)}, - {ZES_ENGINE_GROUP_COPY_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_COPY)}, - {ZES_ENGINE_GROUP_COMPUTE_SINGLE, static_cast<__u16>(prelim_drm_i915_gem_engine_class::PRELIM_I915_ENGINE_CLASS_COMPUTE)}, - {ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, static_cast<__u16>(drm_i915_gem_engine_class::I915_ENGINE_CLASS_VIDEO_ENHANCE)}}; - zes_engine_group_t LinuxEngineImp::getGroupFromEngineType(zes_engine_group_t type) { if (type == ZES_ENGINE_GROUP_RENDER_SINGLE) { return ZES_ENGINE_GROUP_RENDER_ALL; @@ -66,12 +48,13 @@ ze_result_t OsEngine::getNumEngineTypeAndInstances(std::setgetEngineInfo(); - for (auto itr = engineInfo->engines.begin(); itr != engineInfo->engines.end(); ++itr) { - uint32_t subDeviceId = engineInfo->getEngineTileIndex(itr->engine); - auto i915ToEngineMapRange = i915ToEngineMap.equal_range(static_cast<__u16>(itr->engine.engineClass)); - for (auto l0EngineEntryInMap = i915ToEngineMapRange.first; l0EngineEntryInMap != i915ToEngineMapRange.second; l0EngineEntryInMap++) { + auto engineTileMap = engineInfo->getEngineTileInfo(); + for (auto itr = engineTileMap.begin(); itr != engineTileMap.end(); ++itr) { + uint32_t subDeviceId = itr->first; + auto engineGroupRange = engineClassToEngineGroup.equal_range(static_cast<__u16>(itr->second.engineClass)); + for (auto l0EngineEntryInMap = engineGroupRange.first; l0EngineEntryInMap != engineGroupRange.second; l0EngineEntryInMap++) { auto l0EngineType = l0EngineEntryInMap->second; - engineGroupInstance.insert({l0EngineType, {static_cast(itr->engine.engineInstance), subDeviceId}}); + engineGroupInstance.insert({l0EngineType, {static_cast(itr->second.engineInstance), subDeviceId}}); engineGroupInstance.insert({LinuxEngineImp::getGroupFromEngineType(l0EngineType), {0u, subDeviceId}}); engineGroupInstance.insert({ZES_ENGINE_GROUP_ALL, {0u, subDeviceId}}); } @@ -104,27 +87,7 @@ ze_result_t LinuxEngineImp::getProperties(zes_engine_properties_t &properties) { } void LinuxEngineImp::init() { - uint64_t config = UINT64_MAX; - switch (engineGroup) { - case ZES_ENGINE_GROUP_ALL: - config = __PRELIM_I915_PMU_ANY_ENGINE_GROUP_BUSY(subDeviceId); - break; - case ZES_ENGINE_GROUP_COMPUTE_ALL: - case ZES_ENGINE_GROUP_RENDER_ALL: - config = __PRELIM_I915_PMU_RENDER_GROUP_BUSY(subDeviceId); - break; - case ZES_ENGINE_GROUP_COPY_ALL: - config = __PRELIM_I915_PMU_COPY_GROUP_BUSY(subDeviceId); - break; - case ZES_ENGINE_GROUP_MEDIA_ALL: - config = __PRELIM_I915_PMU_MEDIA_GROUP_BUSY(subDeviceId); - break; - default: - auto i915EngineClass = engineToI915Map.find(engineGroup); - config = I915_PMU_ENGINE_BUSY(i915EngineClass->second, engineInstance); - break; - } - fd = pPmuInterface->pmuInterfaceOpen(config, -1, PERF_FORMAT_TOTAL_TIME_ENABLED); + fd = pSysmanKmdInterface->getEngineActivityFd(engineGroup, engineInstance, subDeviceId, pPmuInterface); } bool LinuxEngineImp::isEngineModuleSupported() { @@ -140,6 +103,7 @@ LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uin pDrm = pLinuxSysmanImp->getDrm(); pDevice = pLinuxSysmanImp->getSysmanDeviceImp(); pPmuInterface = pLinuxSysmanImp->getPmuInterface(); + pSysmanKmdInterface = pLinuxSysmanImp->getSysmanKmdInterface(); init(); } @@ -149,4 +113,4 @@ std::unique_ptr OsEngine::create(OsSysman *pOsSysman, zes_engine_group } } // namespace Sysman -} // namespace L0 +} // namespace L0 \ No newline at end of file diff --git a/level_zero/sysman/source/shared/linux/sysman_kmd_interface.cpp b/level_zero/sysman/source/shared/linux/sysman_kmd_interface.cpp index 3d433164fd..a939a006d8 100644 --- a/level_zero/sysman/source/shared/linux/sysman_kmd_interface.cpp +++ b/level_zero/sysman/source/shared/linux/sysman_kmd_interface.cpp @@ -8,9 +8,13 @@ #include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h" #include "shared/source/os_interface/linux/drm_neo.h" +#include "shared/source/os_interface/linux/i915_prelim.h" + +#include "level_zero/sysman/source/linux/pmu/sysman_pmu_imp.h" namespace L0 { namespace Sysman { +using NEO::PrelimI915::I915_SAMPLE_BUSY; std::unique_ptr SysmanKmdInterface::create(const NEO::Drm &drm) { std::unique_ptr pSysmanKmdInterface; @@ -79,5 +83,33 @@ std::string SysmanKmdInterfaceXe::getSysfsFilePath(SysfsName sysfsName, int subD return filePath; } +int64_t SysmanKmdInterfaceI915::getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface) { + uint64_t config = UINT64_MAX; + switch (engineGroup) { + case ZES_ENGINE_GROUP_ALL: + config = __PRELIM_I915_PMU_ANY_ENGINE_GROUP_BUSY(subDeviceId); + break; + case ZES_ENGINE_GROUP_COMPUTE_ALL: + case ZES_ENGINE_GROUP_RENDER_ALL: + config = __PRELIM_I915_PMU_RENDER_GROUP_BUSY(subDeviceId); + break; + case ZES_ENGINE_GROUP_COPY_ALL: + config = __PRELIM_I915_PMU_COPY_GROUP_BUSY(subDeviceId); + break; + case ZES_ENGINE_GROUP_MEDIA_ALL: + config = __PRELIM_I915_PMU_MEDIA_GROUP_BUSY(subDeviceId); + break; + default: + auto engineClass = engineGroupToEngineClass.find(engineGroup); + config = I915_PMU_ENGINE_BUSY(engineClass->second, engineInstance); + break; + } + return pPmuInterface->pmuInterfaceOpen(config, -1, PERF_FORMAT_TOTAL_TIME_ENABLED); +} + +int64_t SysmanKmdInterfaceXe::getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface) { + return -1; +} + } // namespace Sysman } // namespace L0 \ No newline at end of file diff --git a/level_zero/sysman/source/shared/linux/sysman_kmd_interface.h b/level_zero/sysman/source/shared/linux/sysman_kmd_interface.h index 6e920fe856..555791017d 100644 --- a/level_zero/sysman/source/shared/linux/sysman_kmd_interface.h +++ b/level_zero/sysman/source/shared/linux/sysman_kmd_interface.h @@ -7,6 +7,8 @@ #pragma once +#include + #include #include @@ -17,8 +19,34 @@ class Drm; namespace L0 { namespace Sysman { +class PmuInterface; typedef std::pair valuePair; +enum EngineClass { + ENGINE_CLASS_RENDER = 0, + ENGINE_CLASS_COPY = 1, + ENGINE_CLASS_VIDEO = 2, + ENGINE_CLASS_VIDEO_ENHANCE = 3, + ENGINE_CLASS_COMPUTE = 4, + ENGINE_CLASS_INVALID = -1 +}; + +const std::multimap engineClassToEngineGroup = { + {static_cast(EngineClass::ENGINE_CLASS_RENDER), ZES_ENGINE_GROUP_RENDER_SINGLE}, + {static_cast(EngineClass::ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE}, + {static_cast(EngineClass::ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE}, + {static_cast(EngineClass::ENGINE_CLASS_COPY), ZES_ENGINE_GROUP_COPY_SINGLE}, + {static_cast(EngineClass::ENGINE_CLASS_COMPUTE), ZES_ENGINE_GROUP_COMPUTE_SINGLE}, + {static_cast(EngineClass::ENGINE_CLASS_VIDEO_ENHANCE), ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE}}; + +const std::multimap engineGroupToEngineClass = { + {ZES_ENGINE_GROUP_RENDER_SINGLE, static_cast(EngineClass::ENGINE_CLASS_RENDER)}, + {ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, static_cast(EngineClass::ENGINE_CLASS_VIDEO)}, + {ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, static_cast(EngineClass::ENGINE_CLASS_VIDEO)}, + {ZES_ENGINE_GROUP_COPY_SINGLE, static_cast(EngineClass::ENGINE_CLASS_COPY)}, + {ZES_ENGINE_GROUP_COMPUTE_SINGLE, static_cast(EngineClass::ENGINE_CLASS_COMPUTE)}, + {ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, static_cast(EngineClass::ENGINE_CLASS_VIDEO_ENHANCE)}}; + enum class SysfsName { sysfsNameMinFrequency, sysfsNameMaxFrequency, @@ -45,6 +73,7 @@ class SysmanKmdInterface { virtual std::string getBasePath(int subDeviceId) const = 0; virtual std::string getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) = 0; + virtual int64_t getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pmuInterface) = 0; }; class SysmanKmdInterfaceI915 : public SysmanKmdInterface { @@ -54,6 +83,7 @@ class SysmanKmdInterfaceI915 : public SysmanKmdInterface { std::string getBasePath(int subDeviceId) const override; std::string getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) override; + int64_t getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pmuInterface) override; protected: std::map sysfsNameToFileMap; @@ -67,6 +97,7 @@ class SysmanKmdInterfaceXe : public SysmanKmdInterface { std::string getBasePath(int subDeviceId) const override; std::string getSysfsFilePath(SysfsName sysfsName, int subDeviceId, bool baseDirectoryExists) override; + int64_t getEngineActivityFd(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pmuInterface) override; protected: std::map sysfsNameToFileMap; diff --git a/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_prelim.cpp b/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_prelim.cpp index 5eeda31bf1..52439bf993 100644 --- a/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_prelim.cpp +++ b/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_prelim.cpp @@ -7,6 +7,7 @@ #include "shared/test/common/libult/linux/drm_mock.h" +#include "level_zero/sysman/source/shared/linux/sysman_kmd_interface.h" #include "level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_prelim.h" #include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h" #include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_hw_device_id.h" @@ -27,6 +28,7 @@ class ZesEngineFixture : public SysmanDeviceFixture { L0::Sysman::SysfsAccess *pSysfsAccessOriginal = nullptr; std::unique_ptr pFsAccess; L0::Sysman::FsAccess *pFsAccessOriginal = nullptr; + std::unique_ptr pSysmanKmdInterface; L0::Sysman::SysmanDevice *device = nullptr; @@ -49,6 +51,8 @@ class ZesEngineFixture : public SysmanDeviceFixture { pPmuInterface = std::make_unique(pLinuxSysmanImp); pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface; pLinuxSysmanImp->pPmuInterface = pPmuInterface.get(); + pSysmanKmdInterface = std::make_unique(); + std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface); pSysmanDeviceImp->pEngineHandleContext->handleList.clear(); pSysmanDeviceImp->getRootDeviceEnvironment().getMutableHardwareInfo()->capabilityTable.isIntegratedDevice = true; @@ -60,6 +64,7 @@ class ZesEngineFixture : public SysmanDeviceFixture { pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface; pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOriginal; pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface); SysmanDeviceFixture::TearDown(); } @@ -278,6 +283,7 @@ class ZesEngineMultiFixture : public SysmanMultiDeviceFixture { std::unique_ptr pFsAccess; L0::Sysman::FsAccess *pFsAccessOriginal = nullptr; L0::Sysman::SysmanDevice *device = nullptr; + std::unique_ptr pSysmanKmdInterface; void SetUp() override { SysmanMultiDeviceFixture::SetUp(); @@ -297,6 +303,8 @@ class ZesEngineMultiFixture : public SysmanMultiDeviceFixture { pPmuInterface = std::make_unique(pLinuxSysmanImp); pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface; pLinuxSysmanImp->pPmuInterface = pPmuInterface.get(); + pSysmanKmdInterface = std::make_unique(); + std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface); pDrm->mockReadSysmanQueryEngineInfoMultiDevice = true; pSysfsAccess->mockReadSymLinkSuccess = true; @@ -312,6 +320,7 @@ class ZesEngineMultiFixture : public SysmanMultiDeviceFixture { pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface; pLinuxSysmanImp->pSysfsAccess = pSysfsAccessOriginal; pLinuxSysmanImp->pFsAccess = pFsAccessOriginal; + std::swap(pLinuxSysmanImp->pSysmanKmdInterface, pSysmanKmdInterface); } std::vector getEngineHandles(uint32_t count) { diff --git a/level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h b/level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h index 49a06cb2de..6e42b5ca61 100644 --- a/level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h +++ b/level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h @@ -40,6 +40,7 @@ class PublicLinuxSysmanImp : public L0::Sysman::LinuxSysmanImp { using LinuxSysmanImp::pPmuInterface; using LinuxSysmanImp::pProcfsAccess; using LinuxSysmanImp::pSysfsAccess; + using LinuxSysmanImp::pSysmanKmdInterface; using LinuxSysmanImp::rootPath; }; diff --git a/shared/source/os_interface/linux/engine_info.cpp b/shared/source/os_interface/linux/engine_info.cpp index 65a1cbd883..ca0d5855d1 100644 --- a/shared/source/os_interface/linux/engine_info.cpp +++ b/shared/source/os_interface/linux/engine_info.cpp @@ -188,6 +188,10 @@ void EngineInfo::getListOfEnginesOnATile(uint32_t tile, std::vector EngineInfo::getEngineTileInfo() { + return tileToEngineMap; +} + void EngineInfo::assignCopyEngine(aub_stream::EngineType baseEngineType, uint32_t tileId, const EngineClassInstance &engine, BcsInfoMask &bcsInfoMask, uint32_t &numHostLinkCopyEngines, uint32_t &numScaleUpLinkCopyEngines) { // Link copy engines: diff --git a/shared/source/os_interface/linux/engine_info.h b/shared/source/os_interface/linux/engine_info.h index 45fd92ffe6..a5dccd6cbc 100644 --- a/shared/source/os_interface/linux/engine_info.h +++ b/shared/source/os_interface/linux/engine_info.h @@ -34,6 +34,7 @@ struct EngineInfo { const EngineClassInstance *getEngineInstance(uint32_t tile, aub_stream::EngineType engineType) const; uint32_t getEngineTileIndex(const EngineClassInstance &engine); void getListOfEnginesOnATile(uint32_t tile, std::vector &listOfEngines); + std::multimap getEngineTileInfo(); std::vector engines; protected: 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 a10bb19614..2fad5650d3 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 @@ -72,6 +72,22 @@ TEST(EngineInfoTest, whenCreateEngineInfoWithRcsThenCorrectHwInfoSet) { EXPECT_EQ(1u, hwInfo.featureTable.ftrBcsInfo.to_ulong()); } +TEST(EngineInfoTest, whenCallingGetEngineTileInfoCorrectValuesAreReturned) { + auto executionEnvironment = std::make_unique(); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + auto ioctlHelper = drm->getIoctlHelper(); + + 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); + + auto engineTileMap = engineInfo->getEngineTileInfo(); + auto it = engineTileMap.begin(); + EXPECT_EQ(it->second.engineClass, engines[0].engine.engineClass); + EXPECT_EQ(it->second.engineInstance, engines[0].engine.engineInstance); +} + TEST(EngineInfoTest, whenCreateEngineInfoWithCcsThenCorrectHwInfoSet) { auto executionEnvironment = std::make_unique(); auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]);