diff --git a/level_zero/core/source/driver/driver_handle_imp.cpp b/level_zero/core/source/driver/driver_handle_imp.cpp index 54ef71948f..9f335e7cdc 100644 --- a/level_zero/core/source/driver/driver_handle_imp.cpp +++ b/level_zero/core/source/driver/driver_handle_imp.cpp @@ -9,6 +9,7 @@ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/device/device.h" +#include "shared/source/helpers/string.h" #include "shared/source/memory_manager/memory_manager.h" #include "shared/source/os_interface/os_library.h" @@ -21,6 +22,7 @@ #include #include +#include #include namespace L0 { @@ -65,6 +67,9 @@ ze_result_t DriverHandleImp::getProperties(ze_driver_properties_t *properties) { ((versionMinor << 16) & 0x00FF0000) | (versionBuild & 0x0000FFFF); + uint64_t uniqueId = (properties->driverVersion) | (uuidTimestamp & 0xFFFFFFFF00000000); + memcpy_s(properties->uuid.id, sizeof(uniqueId), &uniqueId, sizeof(uniqueId)); + return ZE_RESULT_SUCCESS; } @@ -240,6 +245,8 @@ ze_result_t DriverHandleImp::initialize(std::vector extensionFunctionsLookupMap = getExtensionFunctionsLookupMap(); + uuidTimestamp = static_cast(std::chrono::system_clock::now().time_since_epoch().count()); + return ZE_RESULT_SUCCESS; } diff --git a/level_zero/core/source/driver/driver_handle_imp.h b/level_zero/core/source/driver/driver_handle_imp.h index d123f150c0..dfff703175 100644 --- a/level_zero/core/source/driver/driver_handle_imp.h +++ b/level_zero/core/source/driver/driver_handle_imp.h @@ -67,6 +67,7 @@ struct DriverHandleImp : public DriverHandle { std::vector devices; NEO::MemoryManager *memoryManager = nullptr; NEO::SVMAllocsManager *svmAllocsManager = nullptr; + uint64_t uuidTimestamp = 0u; // Environment Variables std::string affinityMaskString = ""; diff --git a/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp b/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp index d843831488..c738652354 100644 --- a/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp +++ b/level_zero/core/test/unit_tests/sources/driver/test_driver.cpp @@ -5,6 +5,7 @@ * */ +#include "shared/source/helpers/string.h" #include "shared/source/os_interface/device_factory.h" #include "shared/source/os_interface/hw_info_config.h" #include "shared/test/unit_test/helpers/debug_manager_state_restore.h" @@ -54,6 +55,52 @@ TEST_F(DriverVersionTest, returnsExpectedDriverVersion) { EXPECT_EQ(static_cast(strtoul(NEO_VERSION_BUILD, NULL, 10)), versionBuild); } +TEST_F(DriverVersionTest, givenCallToGetDriverPropertiesThenUuidIsSet) { + ze_driver_properties_t properties; + ze_result_t res = driverHandle->getProperties(&properties); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + + uint64_t uuid = 0u; + memcpy_s(&uuid, sizeof(uuid), properties.uuid.id, sizeof(uuid)); + + uint32_t uniqueId = static_cast((uuid & 0xFFFFFFFF00000000) >> 32); + uint32_t versionMajor = static_cast((uuid & 0xFF000000) >> 24); + uint32_t versionMinor = static_cast((uuid & 0x00FF0000) >> 16); + uint32_t versionBuild = static_cast(uuid & 0x0000FFFF); + + EXPECT_NE(0u, uniqueId); + EXPECT_EQ(static_cast(strtoul(L0_PROJECT_VERSION_MAJOR, NULL, 10)), versionMajor); + EXPECT_EQ(static_cast(strtoul(L0_PROJECT_VERSION_MINOR, NULL, 10)), versionMinor); + EXPECT_EQ(static_cast(strtoul(NEO_VERSION_BUILD, NULL, 10)), versionBuild); +} + +TEST_F(DriverVersionTest, whenCallingGetDriverPropertiesRepeatedlyThenTheSameUuidIsReturned) { + ze_driver_properties_t properties; + ze_result_t res = driverHandle->getProperties(&properties); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + + uint64_t uuid = 0u; + memcpy_s(&uuid, sizeof(uuid), properties.uuid.id, sizeof(uuid)); + + uint32_t uniqueId = static_cast((uuid & 0xFFFFFFFF00000000) >> 32); + uint32_t versionMajor = static_cast((uuid & 0xFF000000) >> 24); + uint32_t versionMinor = static_cast((uuid & 0x00FF0000) >> 16); + uint32_t versionBuild = static_cast(uuid & 0x0000FFFF); + + EXPECT_NE(0u, uniqueId); + EXPECT_EQ(static_cast(strtoul(L0_PROJECT_VERSION_MAJOR, NULL, 10)), versionMajor); + EXPECT_EQ(static_cast(strtoul(L0_PROJECT_VERSION_MINOR, NULL, 10)), versionMinor); + EXPECT_EQ(static_cast(strtoul(NEO_VERSION_BUILD, NULL, 10)), versionBuild); + + for (uint32_t i = 0; i < 32; i++) { + ze_driver_properties_t newProperties; + res = driverHandle->getProperties(&newProperties); + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + + EXPECT_EQ(0, memcmp(properties.uuid.id, newProperties.uuid.id, sizeof(uint64_t))); + } +} + TEST(DriverTestFamilySupport, whenInitializingDriverOnSupportedFamilyThenDriverIsCreated) { NEO::HardwareInfo hwInfo = *NEO::defaultHwInfo.get(); hwInfo.capabilityTable.levelZeroSupported = true;