feature(sysman): Add a function to get KMD driver name xe/i915/wddm

Related-To: NEO-16010

Signed-off-by: Sarbojit Sarkar <sarbojit.sarkar@intel.com>
This commit is contained in:
Sarbojit Sarkar
2025-10-23 07:00:52 +00:00
committed by Compute-Runtime-Automation
parent 421b1861e5
commit 4087c80f37
13 changed files with 100 additions and 3 deletions

View File

@@ -56,5 +56,6 @@ using zes_structure_type_ext_t = uint32_t;
// Sysman structure types
#define ZES_INTEL_PCI_LINK_SPEED_DOWNGRADE_EXP_STATE static_cast<zes_structure_type_ext_t>(0x00040001)
#define ZES_INTEL_PCI_LINK_SPEED_DOWNGRADE_EXP_PROPERTIES static_cast<zes_structure_type_ext_t>(0x00040002)
#define ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES static_cast<zes_structure_type_ext_t>(0x00040003)
#endif

View File

@@ -64,6 +64,26 @@ ze_result_t ZE_APICALL zesIntelDevicePciLinkSpeedUpdateExp(
zes_device_action_t *pendingAction ///< [out] Pending action
);
///////////////////////////////////////////////////////////////////////////////
/// @brief Query driver name extension Version(s)
typedef enum _zes_intel_driver_name_exp_properties_version_t {
ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES_VERSION_1_0 = ZE_MAKE_VERSION(1, 0), ///< version 1.0
ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES_VERSION_CURRENT = ZE_MAKE_VERSION(1, 0), ///< latest known version
ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES_VERSION_FORCE_UINT32 = 0x7fffffff
} zes_intel_driver_name_exp_properties_version_t;
///////////////////////////////////////////////////////////////////////////////
/// @brief Query driver name.
/// This structure can be passed in the 'pNext' of zes_device_properties_t
typedef struct _zes_intel_driver_name_exp_properties_t {
zes_structure_type_ext_t stype; ///< [in] type of this structure
void *pNext; ///< [in][optional] must be null or a pointer to an extension-specific
///< structure (i.e. contains stype and pNext).
char driverName[ZES_STRING_PROPERTY_SIZE]; ///< [out] Installed driver name (NULL terminated string value). Will be
///< set to the string "unknown" if this cannot be determined for the
///< device.
} zes_intel_driver_name_exp_properties_t;
#if defined(__cplusplus)
} // extern "C"
#endif

View File

@@ -285,6 +285,16 @@ ze_result_t LinuxGlobalOperationsImp::getSubDeviceProperties(uint32_t *pCount, z
return ZE_RESULT_SUCCESS;
}
void LinuxGlobalOperationsImp::getDriverName(char (&driverVersion)[ZES_STRING_PROPERTY_SIZE]) {
std::string version = pLinuxSysmanImp->getDriverName();
if (!version.empty()) {
std::strncpy(driverVersion, version.c_str(), ZES_STRING_PROPERTY_SIZE);
} else {
NEO::printDebugString(NEO::debugManager.flags.PrintDebugMessages.get(), stderr, "Error@ %s(): Failed to get driver name from drm \n", __FUNCTION__);
std::strncpy(driverVersion, unknown.data(), ZES_STRING_PROPERTY_SIZE);
}
}
ze_result_t LinuxGlobalOperationsImp::reset(ze_bool_t force) {
auto hwInfo = pLinuxSysmanImp->getParentSysmanDeviceImp()->getHardwareInfo();
auto resetType = hwInfo.capabilityTable.isIntegratedDevice ? ZES_RESET_TYPE_FLR : ZES_RESET_TYPE_WARM;

View File

@@ -38,6 +38,7 @@ class LinuxGlobalOperationsImp : public OsGlobalOperations, NEO::NonCopyableAndN
void getModelName(char (&modelName)[ZES_STRING_PROPERTY_SIZE]) override;
void getVendorName(char (&vendorName)[ZES_STRING_PROPERTY_SIZE]) override;
void getDriverVersion(char (&driverVersion)[ZES_STRING_PROPERTY_SIZE]) override;
void getDriverName(char (&driverName)[ZES_STRING_PROPERTY_SIZE]) override;
void getRepairStatus(zes_device_state_t *pState) override;
void getTimerResolution(double *pTimerResolution) override;
ze_result_t reset(ze_bool_t force) override;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2023-2024 Intel Corporation
* Copyright (C) 2023-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -10,6 +10,7 @@
#include "shared/source/helpers/debug_helpers.h"
#include "shared/source/helpers/string.h"
#include "level_zero/include/level_zero/zes_intel_gpu_sysman.h"
#include "level_zero/sysman/source/sysman_const.h"
#include <algorithm>
@@ -117,6 +118,9 @@ ze_result_t GlobalOperationsImp::deviceGetProperties(zes_device_properties_t *pP
if (uuidValid) {
std::copy_n(std::begin(deviceUuid), ZE_MAX_DEVICE_UUID_SIZE, std::begin(extendedProperties->uuid.id));
}
} else if (pNext->stype == ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES) {
auto driverNameProperties = reinterpret_cast<zes_intel_driver_name_exp_properties_t *>(pNext);
pOsGlobalOperations->getDriverName(driverNameProperties->driverName);
}
pNext = static_cast<zes_base_properties_t *>(pNext->pNext);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2023-2024 Intel Corporation
* Copyright (C) 2023-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -29,6 +29,7 @@ class OsGlobalOperations {
virtual void getModelName(char (&modelName)[ZES_STRING_PROPERTY_SIZE]) = 0;
virtual void getVendorName(char (&vendorName)[ZES_STRING_PROPERTY_SIZE]) = 0;
virtual void getDriverVersion(char (&driverVersion)[ZES_STRING_PROPERTY_SIZE]) = 0;
virtual void getDriverName(char (&driverName)[ZES_STRING_PROPERTY_SIZE]) = 0;
virtual void getRepairStatus(zes_device_state_t *pState) = 0;
virtual void getTimerResolution(double *pTimerResolution) = 0;
virtual bool getUuid(std::array<uint8_t, NEO::ProductHelper::uuidSize> &uuid) = 0;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2023-2024 Intel Corporation
* Copyright (C) 2023-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -124,6 +124,12 @@ ze_result_t WddmGlobalOperationsImp::getSubDeviceProperties(uint32_t *pCount, ze
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
}
void WddmGlobalOperationsImp::getDriverName(char (&driverVersion)[ZES_STRING_PROPERTY_SIZE]) {
std::string driverName = "WDDM";
strncpy_s(driverVersion, ZES_STRING_PROPERTY_SIZE, driverName.c_str(), driverName.size());
driverVersion[driverName.size()] = '\0';
}
ze_result_t WddmGlobalOperationsImp::reset(ze_bool_t force) {
uint32_t value = 0;
KmdSysman::RequestProperty request;

View File

@@ -23,6 +23,7 @@ class WddmGlobalOperationsImp : public OsGlobalOperations, NEO::NonCopyableAndNo
void getModelName(char (&modelName)[ZES_STRING_PROPERTY_SIZE]) override;
void getVendorName(char (&vendorName)[ZES_STRING_PROPERTY_SIZE]) override;
void getDriverVersion(char (&driverVersion)[ZES_STRING_PROPERTY_SIZE]) override;
void getDriverName(char (&driverName)[ZES_STRING_PROPERTY_SIZE]) override;
void getRepairStatus(zes_device_state_t *pState) override;
void getTimerResolution(double *pTimerResolution) override;
ze_result_t reset(ze_bool_t force) override;

View File

@@ -74,6 +74,8 @@ ze_result_t LinuxSysmanImp::init() {
pSysfsAccess->getRealPath(deviceDir, gtDevicePath);
pPmuInterface = PmuInterface::create(this);
setDriverName(getDrm()->getDrmVersion(getDrm()->getFileDescriptor()));
return result;
}
@@ -93,6 +95,10 @@ std::string &LinuxSysmanImp::getDeviceName() {
return deviceName;
}
std::string &LinuxSysmanImp::getDriverName() {
return driverName;
}
SysmanHwDeviceIdDrm::SingleInstance LinuxSysmanImp::getSysmanHwDeviceIdInstance() {
UNRECOVERABLE_IF(!getDrm() || !getDrm()->getHwDeviceId());
return static_cast<SysmanHwDeviceIdDrm *>(getDrm()->getHwDeviceId().get())->getSingleInstance();

View File

@@ -73,6 +73,9 @@ class LinuxSysmanImp : public OsSysman, NEO::NonCopyableAndNonMovableClass {
SysmanDeviceImp *getParentSysmanDeviceImp() { return pParentSysmanDeviceImp; }
std::string &getPciRootPath() { return rootPath; }
std::string &getDeviceName();
std::string &getDriverName();
void setDriverName(const std::string &driverName) { this->driverName = driverName; }
std::string devicePciBdf = "";
NEO::ExecutionEnvironment *executionEnvironment = nullptr;
uint32_t rootDeviceIndex;
bool diagnosticsReset = false;
@@ -118,6 +121,7 @@ class LinuxSysmanImp : public OsSysman, NEO::NonCopyableAndNonMovableClass {
ze_result_t resizeVfBar(uint8_t size);
std::mutex fwLock;
std::string deviceName;
std::string driverName;
};
} // namespace Sysman

View File

@@ -11,6 +11,7 @@
#include "shared/test/common/mocks/mock_product_helper.h"
#include "shared/test/common/os_interface/linux/sys_calls_linux_ult.h"
#include "level_zero/include/level_zero/zes_intel_gpu_sysman.h"
#include "level_zero/sysman/source/shared/linux/kmd_interface/sysman_kmd_interface.h"
#include "level_zero/sysman/source/shared/linux/product_helper/sysman_product_helper_hw.h"
#include "level_zero/sysman/test/unit_tests/sources/global_operations/linux/mock_global_operations.h"
@@ -676,6 +677,31 @@ TEST_F(SysmanGlobalOperationsFixture,
EXPECT_TRUE(0 == unknown.compare(properties.driverVersion));
}
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDriverHandleWhenCallingZesDeviceGetPropertiesForCheckingDriverNameWhenDriverNameNotPassedVerifyzesDeviceGetPropertiesCallSucceeds) {
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_intel_driver_name_exp_properties_t drvName = {ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES};
properties.pNext = &drvName;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_STREQ("unknown", drvName.driverName);
}
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDriverHandleWhenCallingZesDeviceGetPropertiesForCheckingDriverNameWhenValidDriverNameSetVerifyValidDriverNameIsReturned) {
pLinuxSysmanImp->setDriverName("i915");
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_intel_driver_name_exp_properties_t drvName = {ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES};
properties.pNext = &drvName;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_STREQ("i915", drvName.driverName);
}
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingZesDeviceGetPropertiesForCheckingDevicePropertiesWhenVendorIsUnKnownThenVerifyzesDeviceGetPropertiesCallSucceeds) {
pSysfsAccess->mockReadVal[static_cast<int>(MockGlobalOperationsSysfsAccess::Index::mockSubsystemVendor)] = "0xa086";

View File

@@ -10,6 +10,7 @@
#include "shared/test/common/mocks/mock_product_helper.h"
#include "shared/test/common/test_macros/hw_test.h"
#include "level_zero/include/level_zero/zes_intel_gpu_sysman.h"
#include "level_zero/sysman/source/api/global_operations/windows/sysman_os_global_operations_imp.h"
#include "level_zero/sysman/test/unit_tests/sources/global_operations/windows/mock_global_operations.h"
#include "level_zero/sysman/test/unit_tests/sources/windows/mock_sysman_fixture.h"
@@ -364,6 +365,19 @@ TEST_F(SysmanDevicePropertiesFixture,
EXPECT_FALSE(properties.core.flags & ZE_DEVICE_PROPERTY_FLAG_ONDEMANDPAGING);
}
TEST_F(SysmanDevicePropertiesFixture,
GivenValidDriverHandleWhenCallingZesDeviceGetPropertiesForCheckingDriverNameVerifyDriverNameIsReturned) {
std::string driverName = "WDDM";
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_intel_driver_name_exp_properties_t drvName = {ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES};
properties.pNext = &drvName;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(0 == driverName.compare(drvName.driverName));
}
HWTEST2_F(SysmanDevicePropertiesFixture,
GivenValidDeviceHandleWhenCallingGetPropertiesnAndIsNotIntegratedDeviceThenFlagIsNotSetInCoreProperties, IsXeHpgCore) {
auto mockHardwareInfo = device->getHardwareInfo();

View File

@@ -1505,6 +1505,8 @@ void testSysmanGlobalOperations(ze_device_handle_t &device) {
std::cout << std::endl
<< " ---- Global Operations tests ---- " << std::endl;
zes_device_properties_t properties = {};
zes_intel_driver_name_exp_properties_t drvName = {ZES_INTEL_DRIVER_NAME_EXP_PROPERTIES};
properties.pNext = &drvName;
VALIDATECALL(zesDeviceGetProperties(device, &properties));
if (verbose) {
std::cout << "properties.numSubdevices = " << properties.numSubdevices << std::endl;
@@ -1534,6 +1536,7 @@ void testSysmanGlobalOperations(ze_device_handle_t &device) {
}
std::cout << std::endl;
std::cout << "properties.core.name = " << properties.core.name << std::endl;
std::cout << "driver name = " << drvName.driverName << std::endl;
}
uint32_t count = 0;