diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index 206852edc2..e033541301 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -801,7 +801,10 @@ ze_result_t DeviceImp::getProperties(ze_device_properties_t *pDeviceProperties) } if (isSubdevice) { - pDeviceProperties->flags |= ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE; + const auto &isReturnSubDevicesAsApiDevices = NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.get(); + if (isReturnSubDevicesAsApiDevices != 1) { + pDeviceProperties->flags |= ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE; + } } if (this->neoDevice->getDeviceInfo().errorCorrectionSupport) { diff --git a/level_zero/core/test/unit_tests/sources/device/test_device.cpp b/level_zero/core/test/unit_tests/sources/device/test_device.cpp index 007b98407e..2f6421d670 100644 --- a/level_zero/core/test/unit_tests/sources/device/test_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/test_device.cpp @@ -4248,5 +4248,102 @@ TEST_F(P2pBandwidthPropertiesTest, GivenFabricVerticesAreNotAvailableForDevicesW static_cast(device1)->fabricVertex = backupFabricVertex; } +TEST(DeviceReturnSubDevicesAsApiDevicesTest, GivenReturnSubDevicesAsApiDevicesIsSetThenFlagsOfDevicePropertiesIsCorrect) { + + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.ZE_AFFINITY_MASK.set("0,1.1,2"); + NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.set(1); + MultiDeviceFixture multiDeviceFixture{}; + multiDeviceFixture.setUp(); + + uint32_t count = 0; + std::vector hDevices; + EXPECT_EQ(multiDeviceFixture.driverHandle->getDevice(&count, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(count, 5u); + + hDevices.resize(count); + EXPECT_EQ(multiDeviceFixture.driverHandle->getDevice(&count, hDevices.data()), ZE_RESULT_SUCCESS); + + for (auto &hDevice : hDevices) { + ze_device_properties_t deviceProperties{}; + deviceProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES; + EXPECT_EQ(Device::fromHandle(hDevice)->getProperties(&deviceProperties), ZE_RESULT_SUCCESS); + EXPECT_NE(ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE); + + uint32_t subDeviceCount = 0; + EXPECT_EQ(Device::fromHandle(hDevice)->getSubDevices(&subDeviceCount, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(subDeviceCount, 0u); + } + + multiDeviceFixture.tearDown(); +} + +TEST(DeviceReturnSubDevicesAsApiDevicesTest, GivenReturnSubDevicesAsApiDevicesIsNotSetThenFlagsOfDevicePropertiesIsCorrect) { + + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.set(0); + MultiDeviceFixture multiDeviceFixture{}; + multiDeviceFixture.setUp(); + + uint32_t count = 0; + std::vector hDevices; + EXPECT_EQ(multiDeviceFixture.driverHandle->getDevice(&count, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(count, multiDeviceFixture.numRootDevices); + + hDevices.resize(count); + EXPECT_EQ(multiDeviceFixture.driverHandle->getDevice(&count, hDevices.data()), ZE_RESULT_SUCCESS); + + for (auto &hDevice : hDevices) { + + uint32_t subDeviceCount = 0; + EXPECT_EQ(Device::fromHandle(hDevice)->getSubDevices(&subDeviceCount, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(subDeviceCount, multiDeviceFixture.numSubDevices); + std::vector hSubDevices(multiDeviceFixture.numSubDevices); + EXPECT_EQ(Device::fromHandle(hDevice)->getSubDevices(&subDeviceCount, hSubDevices.data()), ZE_RESULT_SUCCESS); + + for (auto &hSubDevice : hSubDevices) { + ze_device_properties_t deviceProperties{}; + deviceProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES; + EXPECT_EQ(Device::fromHandle(hSubDevice)->getProperties(&deviceProperties), ZE_RESULT_SUCCESS); + EXPECT_EQ(ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE); + } + } + + multiDeviceFixture.tearDown(); +} + +TEST(DeviceReturnSubDevicesAsApiDevicesTest, GivenReturnSubDevicesAsApiDevicesIsDefaultSetThenFlagsOfDevicePropertiesIsCorrect) { + DebugManagerStateRestore restorer; + NEO::DebugManager.flags.ReturnSubDevicesAsApiDevices.set(-1); + MultiDeviceFixture multiDeviceFixture{}; + multiDeviceFixture.setUp(); + + uint32_t count = 0; + std::vector hDevices; + EXPECT_EQ(multiDeviceFixture.driverHandle->getDevice(&count, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(count, multiDeviceFixture.numRootDevices); + + hDevices.resize(count); + EXPECT_EQ(multiDeviceFixture.driverHandle->getDevice(&count, hDevices.data()), ZE_RESULT_SUCCESS); + + for (auto &hDevice : hDevices) { + + uint32_t subDeviceCount = 0; + EXPECT_EQ(Device::fromHandle(hDevice)->getSubDevices(&subDeviceCount, nullptr), ZE_RESULT_SUCCESS); + EXPECT_EQ(subDeviceCount, multiDeviceFixture.numSubDevices); + std::vector hSubDevices(multiDeviceFixture.numSubDevices); + EXPECT_EQ(Device::fromHandle(hDevice)->getSubDevices(&subDeviceCount, hSubDevices.data()), ZE_RESULT_SUCCESS); + + for (auto &hSubDevice : hSubDevices) { + ze_device_properties_t deviceProperties{}; + deviceProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES; + EXPECT_EQ(Device::fromHandle(hSubDevice)->getProperties(&deviceProperties), ZE_RESULT_SUCCESS); + EXPECT_EQ(ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE); + } + } + + multiDeviceFixture.tearDown(); +} + } // namespace ult } // namespace L0 diff --git a/level_zero/tools/source/sysman/engine/engine.cpp b/level_zero/tools/source/sysman/engine/engine.cpp index 79a4d962bc..c6d4b20321 100644 --- a/level_zero/tools/source/sysman/engine/engine.cpp +++ b/level_zero/tools/source/sysman/engine/engine.cpp @@ -39,7 +39,7 @@ void EngineHandleContext::init(std::vector &deviceHandles) { for (const auto &deviceHandle : deviceHandles) { uint32_t subDeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subDeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subDeviceId, onSubdevice, true); if (subDeviceId == itr->second.second) { createHandle(itr->first, itr->second.first, subDeviceId, onSubdevice); } diff --git a/level_zero/tools/source/sysman/frequency/frequency_imp.cpp b/level_zero/tools/source/sysman/frequency/frequency_imp.cpp index 5b683c3760..e624a0d060 100644 --- a/level_zero/tools/source/sysman/frequency/frequency_imp.cpp +++ b/level_zero/tools/source/sysman/frequency/frequency_imp.cpp @@ -118,7 +118,7 @@ void FrequencyImp::init() { FrequencyImp::FrequencyImp(OsSysman *pOsSysman, ze_device_handle_t handle, zes_freq_domain_t frequencyDomainNumber) : deviceHandle(handle) { uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, true); pOsFrequency = OsFrequency::create(pOsSysman, onSubdevice, subdeviceId, frequencyDomainNumber); UNRECOVERABLE_IF(nullptr == pOsFrequency); init(); diff --git a/level_zero/tools/source/sysman/linux/pmt/pmt.cpp b/level_zero/tools/source/sysman/linux/pmt/pmt.cpp index ea9570f798..bff94e9104 100644 --- a/level_zero/tools/source/sysman/linux/pmt/pmt.cpp +++ b/level_zero/tools/source/sysman/linux/pmt/pmt.cpp @@ -191,7 +191,7 @@ void PlatformMonitoringTech::create(const std::vector &devic for (const auto &deviceHandle : deviceHandles) { uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, true); auto productFamily = SysmanDeviceImp::getProductFamily(Device::fromHandle(deviceHandle)); auto pPmt = new PlatformMonitoringTech(pFsAccess, onSubdevice, subdeviceId); UNRECOVERABLE_IF(nullptr == pPmt); diff --git a/level_zero/tools/source/sysman/memory/memory_imp.cpp b/level_zero/tools/source/sysman/memory/memory_imp.cpp index b8ee68b919..bf96e0f82d 100644 --- a/level_zero/tools/source/sysman/memory/memory_imp.cpp +++ b/level_zero/tools/source/sysman/memory/memory_imp.cpp @@ -34,7 +34,7 @@ void MemoryImp::init() { MemoryImp::MemoryImp(OsSysman *pOsSysman, ze_device_handle_t handle) { uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(handle, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(handle, subdeviceId, onSubdevice, true); pOsMemory = OsMemory::create(pOsSysman, onSubdevice, subdeviceId); init(); } diff --git a/level_zero/tools/source/sysman/performance/performance_imp.cpp b/level_zero/tools/source/sysman/performance/performance_imp.cpp index 52a76d30be..213c86489d 100644 --- a/level_zero/tools/source/sysman/performance/performance_imp.cpp +++ b/level_zero/tools/source/sysman/performance/performance_imp.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 Intel Corporation + * Copyright (C) 2021-2022 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -9,6 +9,8 @@ #include "shared/source/helpers/debug_helpers.h" +#include "level_zero/tools/source/sysman/sysman_imp.h" + namespace L0 { ze_result_t PerformanceImp::performanceGetProperties(zes_perf_properties_t *pProperties) { @@ -32,10 +34,12 @@ void PerformanceImp::init() { } PerformanceImp::PerformanceImp(OsSysman *pOsSysman, ze_device_handle_t handle, zes_engine_type_flag_t domain) { - ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES}; - Device::fromHandle(handle)->getProperties(&deviceProperties); - pOsPerformance = OsPerformance::create(pOsSysman, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, - deviceProperties.subdeviceId, domain); + uint32_t subdeviceId = std::numeric_limits::max(); + ze_bool_t onSubdevice = false; + SysmanDeviceImp::getSysmanDeviceInfo(handle, subdeviceId, onSubdevice, false); + pOsPerformance = OsPerformance::create(pOsSysman, onSubdevice, + subdeviceId, domain); + UNRECOVERABLE_IF(nullptr == pOsPerformance); init(); } diff --git a/level_zero/tools/source/sysman/power/power_imp.cpp b/level_zero/tools/source/sysman/power/power_imp.cpp index 473812357b..c85ebb7885 100644 --- a/level_zero/tools/source/sysman/power/power_imp.cpp +++ b/level_zero/tools/source/sysman/power/power_imp.cpp @@ -9,6 +9,8 @@ #include "shared/source/helpers/debug_helpers.h" +#include "level_zero/tools/source/sysman/sysman_imp.h" + namespace L0 { ze_result_t PowerImp::powerGetProperties(zes_power_properties_t *pProperties) { @@ -58,10 +60,13 @@ ze_result_t PowerImp::powerSetEnergyThreshold(double threshold) { } PowerImp::PowerImp(OsSysman *pOsSysman, ze_device_handle_t handle) : deviceHandle(handle) { - ze_device_properties_t deviceProperties = {}; - Device::fromHandle(deviceHandle)->getProperties(&deviceProperties); - pOsPower = OsPower::create(pOsSysman, deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.subdeviceId); + + uint32_t subdeviceId = std::numeric_limits::max(); + ze_bool_t onSubdevice = false; + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, false); + pOsPower = OsPower::create(pOsSysman, onSubdevice, subdeviceId); UNRECOVERABLE_IF(nullptr == pOsPower); + init(); } diff --git a/level_zero/tools/source/sysman/ras/linux/os_ras_imp_fabric.cpp b/level_zero/tools/source/sysman/ras/linux/os_ras_imp_fabric.cpp index 5ad2dab895..11f4d47ea1 100644 --- a/level_zero/tools/source/sysman/ras/linux/os_ras_imp_fabric.cpp +++ b/level_zero/tools/source/sysman/ras/linux/os_ras_imp_fabric.cpp @@ -76,7 +76,7 @@ ze_result_t LinuxRasSourceFabric::getSupportedRasErrorTypes(std::set(pOsSysman); ze_bool_t onSubDevice = false; uint32_t subDeviceIndex = 0; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subDeviceIndex, onSubDevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subDeviceIndex, onSubDevice, true); std::vector nodes; getNodes(nodes, subDeviceIndex, pLinuxSysmanImp, ZES_RAS_ERROR_TYPE_UNCORRECTABLE); if (nodes.size()) { diff --git a/level_zero/tools/source/sysman/ras/linux/os_ras_imp_gt.cpp b/level_zero/tools/source/sysman/ras/linux/os_ras_imp_gt.cpp index a011ab8fd6..5d94ecd50c 100644 --- a/level_zero/tools/source/sysman/ras/linux/os_ras_imp_gt.cpp +++ b/level_zero/tools/source/sysman/ras/linux/os_ras_imp_gt.cpp @@ -132,7 +132,7 @@ static uint64_t convertHexToUint64(std::string strVal) { static bool getErrorType(std::map> categoryToListOfEvents, std::vector &eventList, ze_device_handle_t deviceHandle) { ze_bool_t onSubDevice = false; uint32_t subDeviceId = 0; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subDeviceId, onSubDevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subDeviceId, onSubDevice, true); // Naming convention of files containing config values for errors // error-- Ex:- error--engine-reset (config file with no subdevice) // error-gt-- Ex:- error-gt0--engine-reset (config file with subdevices) diff --git a/level_zero/tools/source/sysman/ras/ras_imp.cpp b/level_zero/tools/source/sysman/ras/ras_imp.cpp index eaa25d4364..97dbbe7c9b 100644 --- a/level_zero/tools/source/sysman/ras/ras_imp.cpp +++ b/level_zero/tools/source/sysman/ras/ras_imp.cpp @@ -40,7 +40,7 @@ void RasImp::init() { RasImp::RasImp(OsSysman *pOsSysman, zes_ras_error_type_t type, ze_device_handle_t handle) : deviceHandle(handle) { uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, true); pOsRas = OsRas::create(pOsSysman, type, onSubdevice, subdeviceId); init(); } diff --git a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp index 73911cc90d..5e48bea400 100644 --- a/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp +++ b/level_zero/tools/source/sysman/scheduler/linux/os_scheduler_imp_prelim.cpp @@ -508,10 +508,11 @@ ze_result_t OsScheduler::getNumEngineTypeAndInstances( LinuxSysmanImp *pLinuxSysmanImp = static_cast(pOsSysman); auto pDrm = &pLinuxSysmanImp->getDrm(); auto pSysfsAccess = &pLinuxSysmanImp->getSysfsAccess(); - ze_device_properties_t deviceProperties = {}; - Device::fromHandle(subdeviceHandle)->getProperties(&deviceProperties); - if (deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE) { - return getNumEngineTypeAndInstancesForSubDevices(mapOfEngines, pDrm, deviceProperties.subdeviceId); + uint32_t subdeviceId = std::numeric_limits::max(); + ze_bool_t onSubdevice = false; + SysmanDeviceImp::getSysmanDeviceInfo(subdeviceHandle, subdeviceId, onSubdevice, true); + if (onSubdevice) { + return getNumEngineTypeAndInstancesForSubDevices(mapOfEngines, pDrm, subdeviceId); } return getNumEngineTypeAndInstancesForDevice(mapOfEngines, pSysfsAccess); diff --git a/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp b/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp index 940ba09e75..072c94f822 100644 --- a/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp +++ b/level_zero/tools/source/sysman/scheduler/scheduler_imp.cpp @@ -10,6 +10,7 @@ #include "shared/source/helpers/debug_helpers.h" #include "level_zero/tools/source/sysman/sysman_const.h" +#include "level_zero/tools/source/sysman/sysman_imp.h" namespace L0 { @@ -51,10 +52,10 @@ void SchedulerImp::init() { } SchedulerImp::SchedulerImp(OsSysman *pOsSysman, zes_engine_type_flag_t engineType, std::vector &listOfEngines, ze_device_handle_t deviceHandle) { - ze_device_properties_t deviceProperties = {ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES}; - Device::fromHandle(deviceHandle)->getProperties(&deviceProperties); - pOsScheduler = OsScheduler::create(pOsSysman, engineType, listOfEngines, - deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.subdeviceId); + uint32_t subdeviceId = std::numeric_limits::max(); + ze_bool_t onSubdevice = false; + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, true); + pOsScheduler = OsScheduler::create(pOsSysman, engineType, listOfEngines, onSubdevice, subdeviceId); UNRECOVERABLE_IF(nullptr == pOsScheduler); init(); }; diff --git a/level_zero/tools/source/sysman/standby/standby_imp.cpp b/level_zero/tools/source/sysman/standby/standby_imp.cpp index 0894466c6d..4a89550bc4 100644 --- a/level_zero/tools/source/sysman/standby/standby_imp.cpp +++ b/level_zero/tools/source/sysman/standby/standby_imp.cpp @@ -34,7 +34,7 @@ void StandbyImp::init() { StandbyImp::StandbyImp(OsSysman *pOsSysman, ze_device_handle_t handle) : deviceHandle(handle) { uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, true); pOsStandby = OsStandby::create(pOsSysman, onSubdevice, subdeviceId); UNRECOVERABLE_IF(nullptr == pOsStandby); init(); diff --git a/level_zero/tools/source/sysman/sysman_imp.cpp b/level_zero/tools/source/sysman/sysman_imp.cpp index bb794d3e1b..3a709728ff 100644 --- a/level_zero/tools/source/sysman/sysman_imp.cpp +++ b/level_zero/tools/source/sysman/sysman_imp.cpp @@ -79,17 +79,19 @@ void SysmanDeviceImp::updateSubDeviceHandlesLocally() { } } -void SysmanDeviceImp::getSysmanDeviceInfo(zes_device_handle_t hDevice, uint32_t &subdeviceId, ze_bool_t &onSubdevice) { +void SysmanDeviceImp::getSysmanDeviceInfo(zes_device_handle_t hDevice, uint32_t &subdeviceId, ze_bool_t &onSubdevice, ze_bool_t useMultiArchEnabled) { NEO::Device *neoDevice = Device::fromHandle(hDevice)->getNEODevice(); - onSubdevice = static_cast(false); - if (NEO::GfxCoreHelper::getSubDevicesCount(&neoDevice->getHardwareInfo()) > 1) { - onSubdevice = static_cast(true); - } - if (!neoDevice->isSubDevice()) { // To get physical device or subdeviceIndex Index in case when the device does not support tile architecture is single tile device - UNRECOVERABLE_IF(neoDevice->getDeviceBitfield().count() != 1) // or the device is single tile device or AFFINITY_MASK only exposes single tile + onSubdevice = false; + + // Check for root device with 1 sub-device case + if (!neoDevice->isSubDevice() && neoDevice->getDeviceBitfield().count() == 1) { subdeviceId = Math::log2(static_cast(neoDevice->getDeviceBitfield().to_ulong())); - } else { + if ((NEO::GfxCoreHelper::getSubDevicesCount(&neoDevice->getHardwareInfo()) > 1) && useMultiArchEnabled) { + onSubdevice = true; + } + } else if (neoDevice->isSubDevice()) { subdeviceId = static_cast(neoDevice)->getSubDeviceIndex(); + onSubdevice = true; } } diff --git a/level_zero/tools/source/sysman/sysman_imp.h b/level_zero/tools/source/sysman/sysman_imp.h index 82b3788ad4..bc00563fa1 100644 --- a/level_zero/tools/source/sysman/sysman_imp.h +++ b/level_zero/tools/source/sysman/sysman_imp.h @@ -73,7 +73,7 @@ struct SysmanDeviceImp : SysmanDevice, NEO::NonCopyableOrMovableClass { ze_result_t deviceGetEccState(zes_device_ecc_properties_t *pState) override; ze_result_t deviceSetEccState(const zes_device_ecc_desc_t *newState, zes_device_ecc_properties_t *pState) override; bool deviceEventListen(zes_event_type_flags_t &pEvent, uint64_t timeout) override; - static void getSysmanDeviceInfo(zes_device_handle_t hDevice, uint32_t &subdeviceId, ze_bool_t &onSubdevice); + static void getSysmanDeviceInfo(zes_device_handle_t hDevice, uint32_t &subdeviceId, ze_bool_t &onSubdevice, ze_bool_t useMultiArchEnabled); static PRODUCT_FAMILY getProductFamily(Device *pDevice); void updateSubDeviceHandlesLocally(); diff --git a/level_zero/tools/source/sysman/temperature/temperature_imp.cpp b/level_zero/tools/source/sysman/temperature/temperature_imp.cpp index 209fb4cfd3..a30da0d223 100644 --- a/level_zero/tools/source/sysman/temperature/temperature_imp.cpp +++ b/level_zero/tools/source/sysman/temperature/temperature_imp.cpp @@ -39,7 +39,7 @@ void TemperatureImp::init() { TemperatureImp::TemperatureImp(const ze_device_handle_t &deviceHandle, OsSysman *pOsSysman, zes_temp_sensors_t type) { uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(deviceHandle, subdeviceId, onSubdevice, true); pOsTemperature = OsTemperature::create(pOsSysman, onSubdevice, subdeviceId, type); init(); diff --git a/level_zero/tools/test/unit_tests/sources/sysman/mocks/test_sysman_device_info.cpp b/level_zero/tools/test/unit_tests/sources/sysman/mocks/test_sysman_device_info.cpp index 5c0ad9f3ba..a727a61bb3 100644 --- a/level_zero/tools/test/unit_tests/sources/sysman/mocks/test_sysman_device_info.cpp +++ b/level_zero/tools/test/unit_tests/sources/sysman/mocks/test_sysman_device_info.cpp @@ -15,11 +15,21 @@ TEST_F(SysmanMultiDeviceInfoFixture, GivenDeviceWithMultipleTilesWhenOnlyTileOne neoDevice->deviceBitfield.set(1); uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(device->toHandle(), subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(device->toHandle(), subdeviceId, onSubdevice, true); EXPECT_EQ(subdeviceId, 1u); EXPECT_TRUE(onSubdevice); } +TEST_F(SysmanMultiDeviceInfoFixture, GivenDeviceWithMultipleTilesWhenOnlyTileOneIsEnabledAndMultiArchIsDisabledThenGetSysmanDeviceInfoReturnsExpectedValues) { + neoDevice->deviceBitfield.reset(); + neoDevice->deviceBitfield.set(1); + uint32_t subdeviceId = 0; + ze_bool_t onSubdevice = false; + SysmanDeviceImp::getSysmanDeviceInfo(device->toHandle(), subdeviceId, onSubdevice, false); + EXPECT_EQ(subdeviceId, 1u); + EXPECT_FALSE(onSubdevice); +} + TEST_F(SysmanMultiDeviceInfoFixture, GivenDeviceWithMultipleTilesEnabledThenGetSysmanDeviceInfoReturnsExpectedValues) { uint32_t subDeviceCount = 0; std::vector deviceHandles; @@ -34,7 +44,7 @@ TEST_F(SysmanMultiDeviceInfoFixture, GivenDeviceWithMultipleTilesEnabledThenGetS NEO::Device *neoDevice = Device::fromHandle(device)->getNEODevice(); uint32_t subdeviceId = 0; ze_bool_t onSubdevice = false; - SysmanDeviceImp::getSysmanDeviceInfo(device, subdeviceId, onSubdevice); + SysmanDeviceImp::getSysmanDeviceInfo(device, subdeviceId, onSubdevice, false); EXPECT_EQ(subdeviceId, static_cast(neoDevice)->getSubDeviceIndex()); EXPECT_TRUE(onSubdevice); }