From f67663d8633b1b81ba5fce4e8b5ca064a3fcd7f9 Mon Sep 17 00:00:00 2001 From: Pratik Bari Date: Wed, 19 Mar 2025 11:24:11 +0000 Subject: [PATCH] fix(sysman): Create Engine Handles for multiple gt w.r.t Xe driver For the Xe driver, a single tile can have multiple gts. Now the Engine handles are created for multiple gts available on the single tile as in the case for the Xe driver. Related-To: NEO-14401 Signed-off-by: Pratik Bari --- .../api/engine/linux/sysman_os_engine_imp.cpp | 18 +-- .../api/engine/linux/sysman_os_engine_imp.h | 4 +- .../source/api/engine/sysman_engine.cpp | 16 +-- .../sysman/source/api/engine/sysman_engine.h | 2 +- .../source/api/engine/sysman_engine_imp.cpp | 6 +- .../source/api/engine/sysman_engine_imp.h | 2 +- .../engine/windows/sysman_os_engine_imp.cpp | 8 +- .../api/engine/windows/sysman_os_engine_imp.h | 2 +- .../kmd_interface/sysman_kmd_interface.h | 8 +- .../sysman_kmd_interface_i915_prelim.cpp | 10 +- .../sysman_kmd_interface_i915_upstream.cpp | 2 +- .../kmd_interface/sysman_kmd_interface_xe.cpp | 6 +- .../source/shared/linux/pmu/sysman_pmu.h | 2 +- .../shared/linux/pmu/sysman_pmu_imp.cpp | 2 +- .../source/shared/linux/pmu/sysman_pmu_imp.h | 2 +- .../sources/engine/linux/mock_engine_xe.h | 51 +++++--- .../engine/linux/test_zes_engine_prelim.cpp | 7 -- .../engine/linux/test_zes_engine_xe.cpp | 2 +- .../sources/shared/linux/mock_pmu_interface.h | 2 +- .../linux/product_helper/CMakeLists.txt | 1 + .../sysman_product_helper_engine_tests_xe.cpp | 109 ++++++++++++++++++ .../source/os_interface/linux/ioctl_helper.h | 2 +- .../linux/ioctl_helper_tests_prelim.cpp | 8 +- 23 files changed, 196 insertions(+), 76 deletions(-) create mode 100644 level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_engine_tests_xe.cpp diff --git a/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.cpp b/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.cpp index 662d919794..3d833e6585 100644 --- a/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.cpp +++ b/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.cpp @@ -69,14 +69,14 @@ ze_result_t OsEngine::getNumEngineTypeAndInstances(std::setgetEngineInfo(); auto engineTileMap = engineInfo->getEngineTileInfo(); for (auto itr = engineTileMap.begin(); itr != engineTileMap.end(); ++itr) { - uint32_t subDeviceId = itr->first; + uint32_t gtId = itr->first; auto engineGroupRange = engineClassToEngineGroup.equal_range(static_cast(itr->second.engineClass)); for (auto l0EngineEntryInMap = engineGroupRange.first; l0EngineEntryInMap != engineGroupRange.second; l0EngineEntryInMap++) { auto l0EngineType = l0EngineEntryInMap->second; - engineGroupInstance.insert({l0EngineType, {static_cast(itr->second.engineInstance), subDeviceId}}); + engineGroupInstance.insert({l0EngineType, {static_cast(itr->second.engineInstance), gtId}}); if (pSysmanKmdInterface->isGroupEngineInterfaceAvailable()) { - engineGroupInstance.insert({LinuxEngineImp::getGroupFromEngineType(l0EngineType), {0u, subDeviceId}}); - engineGroupInstance.insert({ZES_ENGINE_GROUP_ALL, {0u, subDeviceId}}); + engineGroupInstance.insert({LinuxEngineImp::getGroupFromEngineType(l0EngineType), {0u, gtId}}); + engineGroupInstance.insert({ZES_ENGINE_GROUP_ALL, {0u, gtId}}); } } } @@ -90,12 +90,12 @@ ze_result_t LinuxEngineImp::getActivity(zes_engine_stats_t *pStats) { ze_result_t LinuxEngineImp::getProperties(zes_engine_properties_t &properties) { properties.type = engineGroup; properties.onSubdevice = onSubDevice; - properties.subdeviceId = subDeviceId; + properties.subdeviceId = pDrm->getIoctlHelper()->getTileIdFromGtId(gtId); return ZE_RESULT_SUCCESS; } void LinuxEngineImp::init() { - initStatus = pSysmanKmdInterface->getEngineActivityFdList(engineGroup, engineInstance, subDeviceId, pPmuInterface, fdList); + initStatus = pSysmanKmdInterface->getEngineActivityFdList(engineGroup, engineInstance, gtId, pPmuInterface, fdList); } bool LinuxEngineImp::isEngineModuleSupported() { @@ -105,7 +105,7 @@ bool LinuxEngineImp::isEngineModuleSupported() { return true; } -LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubDevice) : engineGroup(type), engineInstance(engineInstance), subDeviceId(subDeviceId), onSubDevice(onSubDevice) { +LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubDevice) : engineGroup(type), engineInstance(engineInstance), gtId(gtId), onSubDevice(onSubDevice) { LinuxSysmanImp *pLinuxSysmanImp = static_cast(pOsSysman); pDrm = pLinuxSysmanImp->getDrm(); pDevice = pLinuxSysmanImp->getSysmanDeviceImp(); @@ -117,8 +117,8 @@ LinuxEngineImp::LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uin } } -std::unique_ptr OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubDevice) { - std::unique_ptr pLinuxEngineImp = std::make_unique(pOsSysman, type, engineInstance, subDeviceId, onSubDevice); +std::unique_ptr OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubDevice) { + std::unique_ptr pLinuxEngineImp = std::make_unique(pOsSysman, type, engineInstance, gtId, onSubDevice); return pLinuxEngineImp; } diff --git a/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.h b/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.h index 84e6daf9a6..d207a0771d 100644 --- a/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.h +++ b/level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.h @@ -30,7 +30,7 @@ class LinuxEngineImp : public OsEngine, NEO::NonCopyableAndNonMovableClass { bool isEngineModuleSupported() override; static zes_engine_group_t getGroupFromEngineType(zes_engine_group_t type); LinuxEngineImp() = default; - LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubDevice); + LinuxEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubDevice); ~LinuxEngineImp() override; void cleanup(); @@ -41,7 +41,7 @@ class LinuxEngineImp : public OsEngine, NEO::NonCopyableAndNonMovableClass { PmuInterface *pPmuInterface = nullptr; NEO::Drm *pDrm = nullptr; SysmanDeviceImp *pDevice = nullptr; - uint32_t subDeviceId = 0; + uint32_t gtId = 0; ze_bool_t onSubDevice = false; private: diff --git a/level_zero/sysman/source/api/engine/sysman_engine.cpp b/level_zero/sysman/source/api/engine/sysman_engine.cpp index 6748122ad7..4e7948f4ab 100644 --- a/level_zero/sysman/source/api/engine/sysman_engine.cpp +++ b/level_zero/sysman/source/api/engine/sysman_engine.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2024 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -24,15 +24,15 @@ EngineHandleContext::~EngineHandleContext() { releaseEngines(); } -void EngineHandleContext::createHandle(zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubdevice) { - std::unique_ptr pEngine = std::make_unique(pOsSysman, engineType, engineInstance, subDeviceId, onSubdevice); +void EngineHandleContext::createHandle(zes_engine_group_t engineType, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubdevice) { + std::unique_ptr pEngine = std::make_unique(pOsSysman, engineType, engineInstance, gtId, onSubdevice); if (pEngine->initSuccess == true) { handleList.push_back(std::move(pEngine)); } } void EngineHandleContext::init(uint32_t subDeviceCount) { - std::set> engineGroupInstance = {}; // set contains pair of engine group and struct containing engine instance and subdeviceId + std::set> engineGroupInstance = {}; // set contains pair of engine group and struct containing engine instance and gtId deviceEngineInitStatus = OsEngine::getNumEngineTypeAndInstances(engineGroupInstance, pOsSysman); if (deviceEngineInitStatus != ZE_RESULT_SUCCESS) { @@ -40,12 +40,8 @@ void EngineHandleContext::init(uint32_t subDeviceCount) { } for (auto itr = engineGroupInstance.begin(); itr != engineGroupInstance.end(); ++itr) { - for (uint32_t subDeviceId = 0; subDeviceId <= subDeviceCount; subDeviceId++) { - if (subDeviceId == itr->second.second) { - const auto isSubDevice = subDeviceCount > 0; - createHandle(itr->first, itr->second.first, subDeviceId, isSubDevice); - } - } + const auto isSubDevice = subDeviceCount > 0; + createHandle(itr->first, itr->second.first, itr->second.second, isSubDevice); } } diff --git a/level_zero/sysman/source/api/engine/sysman_engine.h b/level_zero/sysman/source/api/engine/sysman_engine.h index 051d6a13d4..5c40abf34a 100644 --- a/level_zero/sysman/source/api/engine/sysman_engine.h +++ b/level_zero/sysman/source/api/engine/sysman_engine.h @@ -47,7 +47,7 @@ struct EngineHandleContext { } private: - void createHandle(zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubdevice); + void createHandle(zes_engine_group_t engineType, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubdevice); std::once_flag initEngineOnce; bool engineInitDone = false; ze_result_t deviceEngineInitStatus = ZE_RESULT_SUCCESS; diff --git a/level_zero/sysman/source/api/engine/sysman_engine_imp.cpp b/level_zero/sysman/source/api/engine/sysman_engine_imp.cpp index e00d0918b3..720470f3c8 100644 --- a/level_zero/sysman/source/api/engine/sysman_engine_imp.cpp +++ b/level_zero/sysman/source/api/engine/sysman_engine_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -30,8 +30,8 @@ void EngineImp::init() { } } -EngineImp::EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubdevice) { - pOsEngine = OsEngine::create(pOsSysman, engineType, engineInstance, subDeviceId, onSubdevice); +EngineImp::EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubdevice) { + pOsEngine = OsEngine::create(pOsSysman, engineType, engineInstance, gtId, onSubdevice); init(); } diff --git a/level_zero/sysman/source/api/engine/sysman_engine_imp.h b/level_zero/sysman/source/api/engine/sysman_engine_imp.h index 8040fd707e..035e0b7f91 100644 --- a/level_zero/sysman/source/api/engine/sysman_engine_imp.h +++ b/level_zero/sysman/source/api/engine/sysman_engine_imp.h @@ -22,7 +22,7 @@ class EngineImp : public Engine, NEO::NonCopyableAndNonMovableClass { ze_result_t engineGetActivityExt(uint32_t *pCount, zes_engine_stats_t *pStats) override; EngineImp() = default; - EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubdevice); + EngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubdevice); ~EngineImp() override; std::unique_ptr pOsEngine; diff --git a/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.cpp b/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.cpp index b2f1ed63ac..2df1e8a235 100644 --- a/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.cpp +++ b/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Intel Corporation + * Copyright (C) 2020-2025 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -76,7 +76,7 @@ bool WddmEngineImp::isEngineModuleSupported() { return true; } -WddmEngineImp::WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId) : engineGroup(engineType), engineInstance(engineInstance) { +WddmEngineImp::WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t gtId) : engineGroup(engineType), engineInstance(engineInstance) { WddmSysmanImp *pWddmSysmanImp = static_cast(pOsSysman); const std::vector singleEngineGroups = { @@ -94,8 +94,8 @@ WddmEngineImp::WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t engineType, pKmdSysManager = &pWddmSysmanImp->getKmdSysManager(); } -std::unique_ptr OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t subDeviceId, ze_bool_t onSubDevice) { - std::unique_ptr pWddmEngineImp = std::make_unique(pOsSysman, engineType, engineInstance, subDeviceId); +std::unique_ptr OsEngine::create(OsSysman *pOsSysman, zes_engine_group_t engineType, uint32_t engineInstance, uint32_t gtId, ze_bool_t onSubDevice) { + std::unique_ptr pWddmEngineImp = std::make_unique(pOsSysman, engineType, engineInstance, gtId); return pWddmEngineImp; } diff --git a/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.h b/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.h index 2b8fdc72d5..ca52a72852 100644 --- a/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.h +++ b/level_zero/sysman/source/api/engine/windows/sysman_os_engine_imp.h @@ -22,7 +22,7 @@ class WddmEngineImp : public OsEngine, NEO::NonCopyableAndNonMovableClass { bool isEngineModuleSupported() override; WddmEngineImp() = default; - WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t subDeviceId); + WddmEngineImp(OsSysman *pOsSysman, zes_engine_group_t type, uint32_t engineInstance, uint32_t gtId); ~WddmEngineImp() override = default; protected: diff --git a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface.h b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface.h index 7e69f5d601..8e9cc0cab2 100644 --- a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface.h +++ b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface.h @@ -116,7 +116,7 @@ class SysmanKmdInterface { virtual std::string getSysfsFilePath(SysfsName sysfsName, uint32_t subDeviceId, bool baseDirectoryExists) = 0; virtual std::string getSysfsFilePathForPhysicalMemorySize(uint32_t subDeviceId) = 0; virtual std::string getEnergyCounterNodeFile(zes_power_domain_t powerDomain) = 0; - virtual ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) = 0; + virtual ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) = 0; virtual ze_result_t readBusynessFromGroupFd(PmuInterface *const &pPmuInterface, std::pair &fdPair, zes_engine_stats_t *pStats) = 0; virtual std::string getHwmonName(uint32_t subDeviceId, bool isSubdevice) const = 0; virtual bool isStandbyModeControlAvailable() const = 0; @@ -192,7 +192,7 @@ class SysmanKmdInterfaceI915Upstream : public SysmanKmdInterface, SysmanKmdInter std::string getSysfsFilePath(SysfsName sysfsName, uint32_t subDeviceId, bool baseDirectoryExists) override; std::string getSysfsFilePathForPhysicalMemorySize(uint32_t subDeviceId) override; std::string getEnergyCounterNodeFile(zes_power_domain_t powerDomain) override; - ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) override; + ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) override; ze_result_t readBusynessFromGroupFd(PmuInterface *const &pPmuInterface, std::pair &fdPair, zes_engine_stats_t *pStats) override; std::string getHwmonName(uint32_t subDeviceId, bool isSubdevice) const override; bool isStandbyModeControlAvailable() const override { return true; } @@ -242,7 +242,7 @@ class SysmanKmdInterfaceI915Prelim : public SysmanKmdInterface, SysmanKmdInterfa std::string getSysfsFilePath(SysfsName sysfsName, uint32_t subDeviceId, bool baseDirectoryExists) override; std::string getSysfsFilePathForPhysicalMemorySize(uint32_t subDeviceId) override; std::string getEnergyCounterNodeFile(zes_power_domain_t powerDomain) override; - ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) override; + ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) override; ze_result_t readBusynessFromGroupFd(PmuInterface *const &pPmuInterface, std::pair &fdPair, zes_engine_stats_t *pStats) override; std::string getHwmonName(uint32_t subDeviceId, bool isSubdevice) const override; bool isStandbyModeControlAvailable() const override { return true; } @@ -293,7 +293,7 @@ class SysmanKmdInterfaceXe : public SysmanKmdInterface { std::string getSysfsFilePathForPhysicalMemorySize(uint32_t subDeviceId) override; std::string getEngineBasePath(uint32_t subDeviceId) const override; std::string getEnergyCounterNodeFile(zes_power_domain_t powerDomain) override; - ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) override; + ze_result_t getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) override; ze_result_t readBusynessFromGroupFd(PmuInterface *const &pPmuInterface, std::pair &fdPair, zes_engine_stats_t *pStats) override; std::string getHwmonName(uint32_t subDeviceId, bool isSubdevice) const override; bool isStandbyModeControlAvailable() const override { return false; } diff --git a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_prelim.cpp b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_prelim.cpp index 4757863fb0..a106d7a651 100644 --- a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_prelim.cpp +++ b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_prelim.cpp @@ -104,21 +104,21 @@ std::string SysmanKmdInterfaceI915Prelim::getEnergyCounterNodeFile(zes_power_dom return filePath; } -ze_result_t SysmanKmdInterfaceI915Prelim::getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) { +ze_result_t SysmanKmdInterfaceI915Prelim::getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) { uint64_t config = UINT64_MAX; switch (engineGroup) { case ZES_ENGINE_GROUP_ALL: - config = __PRELIM_I915_PMU_ANY_ENGINE_GROUP_BUSY_TICKS(subDeviceId); + config = __PRELIM_I915_PMU_ANY_ENGINE_GROUP_BUSY_TICKS(gtId); break; case ZES_ENGINE_GROUP_COMPUTE_ALL: case ZES_ENGINE_GROUP_RENDER_ALL: - config = __PRELIM_I915_PMU_RENDER_GROUP_BUSY_TICKS(subDeviceId); + config = __PRELIM_I915_PMU_RENDER_GROUP_BUSY_TICKS(gtId); break; case ZES_ENGINE_GROUP_COPY_ALL: - config = __PRELIM_I915_PMU_COPY_GROUP_BUSY_TICKS(subDeviceId); + config = __PRELIM_I915_PMU_COPY_GROUP_BUSY_TICKS(gtId); break; case ZES_ENGINE_GROUP_MEDIA_ALL: - config = __PRELIM_I915_PMU_MEDIA_GROUP_BUSY_TICKS(subDeviceId); + config = __PRELIM_I915_PMU_MEDIA_GROUP_BUSY_TICKS(gtId); break; default: auto engineClass = engineGroupToEngineClass.find(engineGroup); diff --git a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_upstream.cpp b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_upstream.cpp index 45f0e7012e..44a98406f5 100644 --- a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_upstream.cpp +++ b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_i915_upstream.cpp @@ -97,7 +97,7 @@ std::string SysmanKmdInterfaceI915Upstream::getEnergyCounterNodeFile(zes_power_d return filePath; } -ze_result_t SysmanKmdInterfaceI915Upstream::getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) { +ze_result_t SysmanKmdInterfaceI915Upstream::getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) { uint64_t config = UINT64_MAX; auto engineClass = engineGroupToEngineClass.find(engineGroup); config = I915_PMU_ENGINE_BUSY(engineClass->second, engineInstance); diff --git a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_xe.cpp b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_xe.cpp index 6bf9035dc8..0f3619d222 100644 --- a/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_xe.cpp +++ b/level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface_xe.cpp @@ -104,7 +104,7 @@ std::string SysmanKmdInterfaceXe::getEnergyCounterNodeFile(zes_power_domain_t po return filePath; } -ze_result_t SysmanKmdInterfaceXe::getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t subDeviceId, PmuInterface *const &pPmuInterface, std::vector> &fdList) { +ze_result_t SysmanKmdInterfaceXe::getEngineActivityFdList(zes_engine_group_t engineGroup, uint32_t engineInstance, uint32_t gtId, PmuInterface *const &pPmuInterface, std::vector> &fdList) { ze_result_t result = ZE_RESULT_SUCCESS; @@ -134,14 +134,14 @@ ze_result_t SysmanKmdInterfaceXe::getEngineActivityFdList(zes_engine_group_t eng } const std::string formatDir = std::string(sysDevicesDir) + sysmanDeviceDirName + "/format/"; - ret = pPmuInterface->getConfigAfterFormat(formatDir, activeTicksConfig, engineClass->second, engineInstance, subDeviceId); + ret = pPmuInterface->getConfigAfterFormat(formatDir, activeTicksConfig, engineClass->second, engineInstance, gtId); if (ret < 0) { result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to get config for the active ticks after format and returning error:0x%x\n", __FUNCTION__, result); return result; } - ret = pPmuInterface->getConfigAfterFormat(formatDir, totalTicksConfig, engineClass->second, engineInstance, subDeviceId); + ret = pPmuInterface->getConfigAfterFormat(formatDir, totalTicksConfig, engineClass->second, engineInstance, gtId); if (ret < 0) { result = ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to get config for the total ticks after format and returning error:0x%x\n", __FUNCTION__, result); diff --git a/level_zero/sysman/source/shared/linux/pmu/sysman_pmu.h b/level_zero/sysman/source/shared/linux/pmu/sysman_pmu.h index b1c69eaf27..d5179f5594 100644 --- a/level_zero/sysman/source/shared/linux/pmu/sysman_pmu.h +++ b/level_zero/sysman/source/shared/linux/pmu/sysman_pmu.h @@ -19,7 +19,7 @@ class PmuInterface { virtual int64_t pmuInterfaceOpen(uint64_t config, int group, uint32_t format) = 0; virtual int32_t pmuRead(int fd, uint64_t *data, ssize_t sizeOfdata) = 0; virtual int32_t getConfigFromEventFile(const std::string_view &eventFile, uint64_t &config) = 0; - virtual int32_t getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint32_t engineClass, uint32_t engineInstance, uint32_t gt) = 0; + virtual int32_t getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint64_t engineClass, uint64_t engineInstance, uint64_t gt) = 0; static PmuInterface *create(LinuxSysmanImp *pLinuxSysmanImp); }; diff --git a/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.cpp b/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.cpp index 15d009357f..f9a0b70064 100644 --- a/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.cpp +++ b/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.cpp @@ -113,7 +113,7 @@ static ze_result_t getShiftValue(const std::string_view &readFile, FsAccessInter return result; } -int32_t PmuInterfaceImp::getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint32_t engineClass, uint32_t engineInstance, uint32_t gt) { +int32_t PmuInterfaceImp::getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint64_t engineClass, uint64_t engineInstance, uint64_t gt) { // The final config is computed by the bitwise OR operation of the config fetched from the event file and value obtained by shifting the parameters gt, // engineClass and engineInstance with the shift value fetched from the corresponding file in /sys/devices/xe_/format/ directory. diff --git a/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.h b/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.h index 836b9ef775..2cdbf24b37 100644 --- a/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.h +++ b/level_zero/sysman/source/shared/linux/pmu/sysman_pmu_imp.h @@ -26,7 +26,7 @@ class PmuInterfaceImp : public PmuInterface, NEO::NonCopyableAndNonMovableClass int64_t pmuInterfaceOpen(uint64_t config, int group, uint32_t format) override; int32_t pmuRead(int fd, uint64_t *data, ssize_t sizeOfdata) override; int32_t getConfigFromEventFile(const std::string_view &eventFile, uint64_t &config) override; - int32_t getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint32_t engineClass, uint32_t engineInstance, uint32_t gt) override; + int32_t getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint64_t engineClass, uint64_t engineInstance, uint64_t gt) override; protected: virtual int32_t getErrorNo(); 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 da74e1bcc6..78ef713ca5 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 @@ -17,6 +17,39 @@ namespace L0 { namespace Sysman { namespace ult { +struct MockIoctlHelperXe : public NEO::IoctlHelperXe { + + MockIoctlHelperXe(NEO::Drm &drmArg) : NEO::IoctlHelperXe(drmArg) {} + + int getTileIdFromGtId(int gtId) const override { + return 0; + } +}; + +struct MockXeEngineInfo : public NEO::EngineInfo { + + using NEO::EngineInfo::tileToEngineMap; + uint32_t count = 2; + + MockXeEngineInfo(NEO::Drm *drm, StackVec, 2> &engineInfosPerTile) : NEO::EngineInfo(drm, engineInfosPerTile) { + + std::vector mockEngineCapabilities(4); + mockEngineCapabilities[0].engine.engineClass = EngineClass::ENGINE_CLASS_RENDER; + mockEngineCapabilities[0].engine.engineInstance = 0; + mockEngineCapabilities[1].engine.engineClass = EngineClass::ENGINE_CLASS_COPY; + mockEngineCapabilities[1].engine.engineInstance = 0; + mockEngineCapabilities[2].engine.engineClass = EngineClass::ENGINE_CLASS_COMPUTE; + mockEngineCapabilities[2].engine.engineInstance = 0; + mockEngineCapabilities[3].engine.engineClass = EngineClass::ENGINE_CLASS_VIDEO_ENHANCE; + mockEngineCapabilities[3].engine.engineInstance = 0; + + tileToEngineMap.emplace(0, mockEngineCapabilities[0].engine); + tileToEngineMap.emplace(0, mockEngineCapabilities[1].engine); + tileToEngineMap.emplace(0, mockEngineCapabilities[2].engine); + tileToEngineMap.emplace(1, mockEngineCapabilities[3].engine); + } +}; + struct MockNeoDrm : public NEO::Drm { public: @@ -26,24 +59,10 @@ struct MockNeoDrm : public NEO::Drm { MockNeoDrm(NEO::RootDeviceEnvironment &rootDeviceEnvironment) : NEO::Drm(std::make_unique(mockFd, ""), rootDeviceEnvironment) {} - bool mockSysmanQueryEngineInfoReturnFalse = true; bool sysmanQueryEngineInfo() override { - if (mockSysmanQueryEngineInfoReturnFalse != true) { - return mockSysmanQueryEngineInfoReturnFalse; - } - std::vector mockEngineInfo(3); - mockEngineInfo[0].engine.engineClass = EngineClass::ENGINE_CLASS_RENDER; - mockEngineInfo[0].engine.engineInstance = 0; - mockEngineInfo[1].engine.engineClass = EngineClass::ENGINE_CLASS_COPY; - mockEngineInfo[1].engine.engineInstance = 0; - mockEngineInfo[2].engine.engineClass = EngineClass::ENGINE_CLASS_VIDEO_ENHANCE; - mockEngineInfo[2].engine.engineInstance = 0; - mockEngineInfo[3].engine.engineClass = UINT16_MAX; - mockEngineInfo[3].engine.engineInstance = 0; - - StackVec, 2> engineInfosPerTile{mockEngineInfo}; - this->engineInfo.reset(new NEO::EngineInfo(this, engineInfosPerTile)); + StackVec, 2> engineInfosPerTile{}; + this->engineInfo.reset(new MockXeEngineInfo(this, engineInfosPerTile)); return true; } }; 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 932fe6fb69..7e2fd7e593 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 @@ -456,37 +456,30 @@ TEST_F(ZesEngineMultiFixturePrelim, GivenValidEngineHandlesWhenCallingZesEngineG EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[0], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_ALL, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 0u); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[1], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_ALL, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 1u); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[2], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_ALL, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 1u); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[3], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_RENDER_SINGLE, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 0u); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[4], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 1u); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[5], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 1u); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[6], &properties)); EXPECT_EQ(ZES_ENGINE_GROUP_RENDER_ALL, properties.type); EXPECT_TRUE(properties.onSubdevice); - EXPECT_EQ(properties.subdeviceId, 0u); } TEST_F(ZesEngineMultiFixturePrelim, GivenHandleQueryItemCalledWhenPmuInterfaceOpenFailsThenzesDeviceEnumEngineGroupsSucceedsAndHandleCountIsZero) { diff --git a/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_xe.cpp b/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_xe.cpp index 8991bc685b..d850c7e657 100644 --- a/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_xe.cpp +++ b/level_zero/sysman/test/unit_tests/sources/engine/linux/test_zes_engine_xe.cpp @@ -18,7 +18,7 @@ namespace L0 { namespace Sysman { namespace ult { -constexpr uint32_t mockEngineHandleCount = 3u; +constexpr uint32_t mockEngineHandleCount = 4u; class ZesEngineFixtureXe : public SysmanDeviceFixture { protected: diff --git a/level_zero/sysman/test/unit_tests/sources/shared/linux/mock_pmu_interface.h b/level_zero/sysman/test/unit_tests/sources/shared/linux/mock_pmu_interface.h index b9d189f0e4..01713c9810 100644 --- a/level_zero/sysman/test/unit_tests/sources/shared/linux/mock_pmu_interface.h +++ b/level_zero/sysman/test/unit_tests/sources/shared/linux/mock_pmu_interface.h @@ -60,7 +60,7 @@ class MockPmuInterfaceImp : public L0::Sysman::PmuInterfaceImp { return returnValue; } - int32_t getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint32_t engineClass, uint32_t engineInstance, uint32_t gt) override { + int32_t getConfigAfterFormat(const std::string_view &formatDir, uint64_t &config, uint64_t engineClass, uint64_t engineInstance, uint64_t gt) override { int32_t returnValue = 0; if (!mockFormatConfigReturnValue.empty()) { returnValue = mockFormatConfigReturnValue.front(); diff --git a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt index 9fdd498d36..4624d69013 100644 --- a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt +++ b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/CMakeLists.txt @@ -19,6 +19,7 @@ if(UNIX) ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_device_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_pci_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_init_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/sysman_product_helper_engine_tests_xe.cpp ) endif() add_subdirectories() diff --git a/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_engine_tests_xe.cpp b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_engine_tests_xe.cpp new file mode 100644 index 0000000000..5b757e37a4 --- /dev/null +++ b/level_zero/sysman/test/unit_tests/sources/shared/linux/product_helper/sysman_product_helper_engine_tests_xe.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2025 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/os_interface/linux/xe/ioctl_helper_xe.h" +#include "shared/test/common/helpers/variable_backup.h" + +#include "level_zero/sysman/source/api/engine/linux/sysman_os_engine_imp.h" +#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper.h" +#include "level_zero/sysman/test/unit_tests/sources/engine/linux/mock_engine_xe.h" +#include "level_zero/sysman/test/unit_tests/sources/linux/mock_sysman_fixture.h" +#include "level_zero/sysman/test/unit_tests/sources/shared/linux/kmd_interface/mock_sysman_kmd_interface_xe.h" +#include "level_zero/sysman/test/unit_tests/sources/shared/linux/mock_pmu_interface.h" + +namespace L0 { +namespace Sysman { +namespace ult { + +constexpr uint32_t mockEngineHandleCount = 4u; + +class SysmanProductHelperEngineXeTestFixture : public SysmanDeviceFixture { + protected: + L0::Sysman::SysmanDevice *device = nullptr; + std::unique_ptr pPmuInterface; + L0::Sysman::PmuInterface *pOriginalPmuInterface = nullptr; + MockSysmanKmdInterfaceXe *pSysmanKmdInterface = nullptr; + + void SetUp() override { + SysmanDeviceFixture::SetUp(); + VariableBackup mockReadLink(&NEO::SysCalls::sysCallsReadlink, [](const char *path, char *buf, size_t bufsize) -> int { + std::string str = "../../devices/pci0000:37/0000:37:01.0/0000:38:00.0/0000:39:01.0/0000:3a:00.0/drm/renderD128"; + std::memcpy(buf, str.c_str(), str.size()); + return static_cast(str.size()); + }); + device = pSysmanDevice; + MockNeoDrm *pDrm = new MockNeoDrm(const_cast(pSysmanDeviceImp->getRootDeviceEnvironment())); + pDrm->ioctlHelper = std::make_unique(*pDrm); + auto &osInterface = pSysmanDeviceImp->getRootDeviceEnvironment().osInterface; + osInterface->setDriverModel(std::unique_ptr(pDrm)); + + pSysmanKmdInterface = new MockSysmanKmdInterfaceXe(pLinuxSysmanImp->getSysmanProductHelper()); + pLinuxSysmanImp->pSysmanKmdInterface.reset(pSysmanKmdInterface); + pLinuxSysmanImp->pSysmanKmdInterface->initFsAccessInterface(*pDrm); + + pPmuInterface = std::make_unique(pLinuxSysmanImp); + pPmuInterface->mockPmuFd = 10; + pPmuInterface->pSysmanKmdInterface = pLinuxSysmanImp->pSysmanKmdInterface.get(); + pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface; + pLinuxSysmanImp->pPmuInterface = pPmuInterface.get(); + + pSysmanDeviceImp->pEngineHandleContext->handleList.clear(); + bool isIntegratedDevice = true; + pLinuxSysmanImp->pSysmanKmdInterface->setSysmanDeviceDirName(isIntegratedDevice); + } + + void TearDown() override { + pLinuxSysmanImp->pPmuInterface = pOriginalPmuInterface; + SysmanDeviceFixture::TearDown(); + } +}; + +HWTEST2_F(SysmanProductHelperEngineXeTestFixture, GivenValidEngineHandlesWhenCallingZesEngineGetPropertiesThenSuccessIsReturned, IsBMG) { + + VariableBackup mockPread(&NEO::SysCalls::sysCallsPread, [](int fd, void *buf, size_t count, off_t offset) -> ssize_t { + uint32_t mockReadVal = 23; + std::ostringstream oStream; + oStream << mockReadVal; + std::string value = oStream.str(); + memcpy(buf, value.data(), count); + return count; + }); + + uint32_t count = 0u; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumEngineGroups(device->toHandle(), &count, nullptr)); + EXPECT_EQ(count, mockEngineHandleCount); + std::vector handles(count, nullptr); + EXPECT_EQ(ZE_RESULT_SUCCESS, zesDeviceEnumEngineGroups(device->toHandle(), &count, handles.data())); + for (auto handle : handles) { + ASSERT_NE(nullptr, handle); + } + + zes_engine_properties_t properties = {}; + EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[0], &properties)); + EXPECT_EQ(ZES_ENGINE_GROUP_COMPUTE_SINGLE, properties.type); + EXPECT_FALSE(properties.onSubdevice); + EXPECT_EQ(properties.subdeviceId, 0u); + + EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[1], &properties)); + EXPECT_EQ(ZES_ENGINE_GROUP_RENDER_SINGLE, properties.type); + EXPECT_FALSE(properties.onSubdevice); + EXPECT_EQ(properties.subdeviceId, 0u); + + EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[2], &properties)); + EXPECT_EQ(ZES_ENGINE_GROUP_COPY_SINGLE, properties.type); + EXPECT_FALSE(properties.onSubdevice); + EXPECT_EQ(properties.subdeviceId, 0u); + + EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handles[3], &properties)); + EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, properties.type); + EXPECT_FALSE(properties.onSubdevice); + EXPECT_EQ(properties.subdeviceId, 0u); +} + +} // namespace ult +} // namespace Sysman +} // namespace L0 diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index b913dad2f4..1a3127dbf1 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -275,7 +275,7 @@ class IoctlHelperI915 : public IoctlHelper { bool getGemTiling(void *setTiling) override; bool setGpuCpuTimes(TimeStampData *pGpuCpuTime, OSTime *osTime) override; void insertEngineToContextParams(ContextParamEngines<> &contextParamEngines, uint32_t engineId, const EngineClassInstance *engineClassInstance, uint32_t tileId, bool hasVirtualEngines) override; - int getTileIdFromGtId(int gtId) const override { return -1; } + int getTileIdFromGtId(int gtId) const override { return gtId; } bool hasContextFreqHint() override; void fillExtSetparamLowLatency(GemContextCreateExtSetParam &extSetparam) override; diff --git a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp index 771f13468b..03e14e3c89 100644 --- a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp +++ b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp @@ -995,13 +995,15 @@ TEST_F(IoctlPrelimHelperTests, whenCallingGetStatusAndFlagsForResetStatsThenExpe EXPECT_FALSE(ioctlHelper.validPageFault(0u)); } -TEST_F(IoctlPrelimHelperTests, whenCallingGetTileIdFromGtIdThenMinusOneIsReturned) { +TEST_F(IoctlPrelimHelperTests, whenCallingGetTileIdFromGtIdThenExpectedValueIsReturned) { auto executionEnvironment = std::make_unique(); auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); MockIoctlHelperPrelim20 ioctlHelper{*drm}; - EXPECT_EQ(-1, ioctlHelper.getTileIdFromGtId(0)); - EXPECT_EQ(-1, ioctlHelper.getTileIdFromGtId(1)); + int32_t gtId = 0; + EXPECT_EQ(gtId, ioctlHelper.getTileIdFromGtId(gtId)); + gtId = 1; + EXPECT_EQ(gtId, ioctlHelper.getTileIdFromGtId(gtId)); } TEST(DrmTest, GivenDrmWhenAskedForPreemptionThenCorrectValueReturned) {