feature(sysman): Add support for device type and flags

Related-To: NEO-8590

Signed-off-by: Aravind Gopalakrishnan <aravind.gopalakrishnan@intel.com>
This commit is contained in:
Aravind Gopalakrishnan 2023-10-04 16:11:27 +00:00 committed by Compute-Runtime-Automation
parent 25195ebc96
commit 18e45b2b42
7 changed files with 169 additions and 31 deletions

View File

@ -44,14 +44,52 @@ ze_result_t GlobalOperationsImp::processesGetState(uint32_t *pCount, zes_process
ze_result_t GlobalOperationsImp::deviceGetProperties(zes_device_properties_t *pProperties) {
initGlobalOperations();
sysmanProperties.numSubdevices = pOsSysman->getSubDeviceCount();
pProperties->numSubdevices = pOsSysman->getSubDeviceCount();
std::array<uint8_t, NEO::ProductHelper::uuidSize> deviceUuid;
bool uuidValid = pOsGlobalOperations->getUuid(deviceUuid);
if (uuidValid) {
std::copy_n(std::begin(deviceUuid), ZE_MAX_DEVICE_UUID_SIZE, std::begin(sysmanProperties.core.uuid.id));
std::copy_n(std::begin(deviceUuid), ZE_MAX_DEVICE_UUID_SIZE, std::begin(pProperties->core.uuid.id));
}
*pProperties = sysmanProperties;
zes_base_properties_t *pNext = static_cast<zes_base_properties_t *>(pProperties->pNext);
while (pNext) {
if (pNext->stype == ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES) {
auto extendedProperties = reinterpret_cast<zes_device_ext_properties_t *>(pNext);
extendedProperties->type = ZES_DEVICE_TYPE_GPU;
auto &hardwareInfo = pOsSysman->getHardwareInfo();
if (hardwareInfo.capabilityTable.isIntegratedDevice) {
extendedProperties->flags |= ZES_DEVICE_PROPERTY_FLAG_INTEGRATED;
}
if (hardwareInfo.capabilityTable.supportsOnDemandPageFaults) {
extendedProperties->flags |= ZES_DEVICE_PROPERTY_FLAG_ONDEMANDPAGING;
}
if (uuidValid) {
std::copy_n(std::begin(deviceUuid), ZE_MAX_DEVICE_UUID_SIZE, std::begin(extendedProperties->uuid.id));
}
}
pNext = static_cast<zes_base_properties_t *>(pNext->pNext);
}
pOsGlobalOperations->getVendorName(pProperties->vendorName);
pOsGlobalOperations->getDriverVersion(pProperties->driverVersion);
pOsGlobalOperations->getModelName(pProperties->modelName);
pOsGlobalOperations->getBrandName(pProperties->brandName);
memset(pProperties->boardNumber, 0, ZES_STRING_PROPERTY_SIZE);
if (!pOsGlobalOperations->getBoardNumber(pProperties->boardNumber)) {
memcpy_s(pProperties->boardNumber, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), unknown.length() + 1);
}
memset(pProperties->serialNumber, 0, ZES_STRING_PROPERTY_SIZE);
if (!pOsGlobalOperations->getSerialNumber(pProperties->serialNumber)) {
memcpy_s(pProperties->serialNumber, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), unknown.length() + 1);
}
return ZE_RESULT_SUCCESS;
}
@ -70,18 +108,6 @@ void GlobalOperationsImp::init() {
pOsGlobalOperations = OsGlobalOperations::create(pOsSysman);
}
UNRECOVERABLE_IF(nullptr == pOsGlobalOperations);
pOsGlobalOperations->getVendorName(sysmanProperties.vendorName);
pOsGlobalOperations->getDriverVersion(sysmanProperties.driverVersion);
pOsGlobalOperations->getModelName(sysmanProperties.modelName);
pOsGlobalOperations->getBrandName(sysmanProperties.brandName);
memset(sysmanProperties.boardNumber, 0, ZES_STRING_PROPERTY_SIZE);
if (!pOsGlobalOperations->getBoardNumber(sysmanProperties.boardNumber)) {
memcpy_s(sysmanProperties.boardNumber, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), unknown.length() + 1);
}
memset(sysmanProperties.serialNumber, 0, ZES_STRING_PROPERTY_SIZE);
if (!pOsGlobalOperations->getSerialNumber(sysmanProperties.serialNumber)) {
memcpy_s(sysmanProperties.serialNumber, ZES_STRING_PROPERTY_SIZE, unknown.c_str(), unknown.length() + 1);
}
}
void GlobalOperationsImp::initGlobalOperations() {
std::call_once(initGlobalOpOnce, [this]() {

View File

@ -31,7 +31,6 @@ class GlobalOperationsImp : public GlobalOperations, NEO::NonCopyableOrMovableCl
private:
OsSysman *pOsSysman = nullptr;
zes_device_properties_t sysmanProperties = {};
std::once_flag initGlobalOpOnce;
void initGlobalOperations();
};

View File

@ -7,6 +7,7 @@
#pragma once
#include "shared/source/execution_environment/execution_environment.h"
#include "shared/source/helpers/hw_info.h"
#include "shared/source/helpers/non_copyable_or_moveable.h"
#include "shared/source/os_interface/linux/sys_calls.h"
@ -49,6 +50,7 @@ class LinuxSysmanImp : public OsSysman, NEO::NonCopyableOrMovableClass {
SysmanDeviceImp *getSysmanDeviceImp();
SysmanProductHelper *getSysmanProductHelper();
uint32_t getSubDeviceCount() override;
const NEO::HardwareInfo &getHardwareInfo() const override { return pParentSysmanDeviceImp->getHardwareInfo(); }
std::string getPciCardBusDirectoryPath(std::string realPciPath);
uint32_t getMemoryType();
static std::string getPciRootPortDirectoryPath(std::string realPciPath);

View File

@ -6,6 +6,8 @@
*/
#pragma once
#include "shared/source/helpers/hw_info.h"
#include <level_zero/zes_api.h>
#include <vector>
@ -21,6 +23,7 @@ struct OsSysman {
virtual ze_result_t init() = 0;
static OsSysman *create(SysmanDeviceImp *pSysmanImp);
virtual uint32_t getSubDeviceCount() = 0;
virtual const NEO::HardwareInfo &getHardwareInfo() const = 0;
};
} // namespace Sysman

View File

@ -6,6 +6,7 @@
*/
#pragma once
#include "shared/source/helpers/hw_info.h"
#include "shared/source/helpers/non_copyable_or_moveable.h"
#include "level_zero/sysman/source/firmware_util/sysman_firmware_util.h"
@ -34,6 +35,7 @@ class WddmSysmanImp : public OsSysman, NEO::NonCopyableOrMovableClass {
uint32_t getSubDeviceCount() override;
SysmanDeviceImp *getSysmanDeviceImp();
const NEO::HardwareInfo &getHardwareInfo() const override { return pParentSysmanDeviceImp->getHardwareInfo(); }
protected:
FirmwareUtil *pFwUtilInterface = nullptr;

View File

@ -200,7 +200,7 @@ TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleWhenCallingzesGlobal
});
pLinuxSysmanImp->rootPath = NEO::getPciRootPath(pLinuxSysmanImp->getDrm()->getFileDescriptor()).value_or("");
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
const std::string expectedSerialNumber("0x3e8c9dfe1c2e4d5c");
const std::string expectedBoardNumber("1280WTPV001900191280WTPV00190019");
ze_result_t result = zesDeviceGetProperties(device, &properties);
@ -273,7 +273,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return -1;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(0 == unknown.compare(properties.serialNumber));
@ -330,7 +330,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return -1;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -389,7 +389,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return -1;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -446,7 +446,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return -1;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -475,7 +475,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return 0;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -498,7 +498,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return -1;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -513,7 +513,7 @@ TEST_F(SysmanGlobalOperationsFixture,
return -1;
});
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -523,7 +523,7 @@ TEST_F(SysmanGlobalOperationsFixture,
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDriverVersionWhenAgmaFileIsAbsentThenVerifyzesDeviceGetPropertiesCallSucceeds) {
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
std::string test;
test = srcVersion;
pFsAccess->mockReadVal = srcVersion;
@ -534,7 +534,7 @@ TEST_F(SysmanGlobalOperationsFixture,
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDriverVersionWhenAgmaFileAndSrcFileIsAbsentThenVerifyzesDeviceGetPropertiesCallSucceeds) {
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
pFsAccess->mockReadError = ZE_RESULT_ERROR_NOT_AVAILABLE;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -543,7 +543,7 @@ TEST_F(SysmanGlobalOperationsFixture,
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDriverVersionWhenDriverVersionFileIsNotAvaliableThenVerifyzesDeviceGetPropertiesCallSucceeds) {
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
pFsAccess->mockReadError = ZE_RESULT_ERROR_NOT_AVAILABLE;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -552,7 +552,7 @@ TEST_F(SysmanGlobalOperationsFixture,
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDriverVersionWhenDriverVersionFileReadFailsThenVerifyzesDeviceGetPropertiesCallSucceeds) {
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
pFsAccess->mockReadError = ZE_RESULT_ERROR_UNKNOWN;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -563,7 +563,7 @@ TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDevicePropertiesWhenVendorIsUnKnownThenVerifyzesDeviceGetPropertiesCallSucceeds) {
pSysfsAccess->mockReadVal[static_cast<int>(MockGlobalOperationsSysfsAccess::Index::MockSubsystemVendor)] = "0xa086";
pSysfsAccess->mockReadVal[static_cast<int>(MockGlobalOperationsSysfsAccess::Index::MockVendor)] = "0x1806"; // Unknown Vendor id
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(0 == unknown.compare(properties.vendorName));
@ -572,7 +572,7 @@ TEST_F(SysmanGlobalOperationsFixture,
TEST_F(SysmanGlobalOperationsFixture,
GivenValidDeviceHandleWhenCallingzesDeviceGetPropertiesForCheckingDriverVersionWhenAccessingAgamaFileOrSrcFileGotPermissionDeniedThenVerifyzesDeviceGetPropertiesCallSucceeds) {
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
pFsAccess->mockReadError = ZE_RESULT_ERROR_INSUFFICIENT_PERMISSIONS;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
@ -955,6 +955,111 @@ TEST_F(SysmanGlobalOperationsIntegratedFixture, GivenProcessStartsMidResetWhenCa
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
}
using SysmanDevicePropertiesExtensionTest = SysmanGlobalOperationsFixture;
TEST_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionThenDeviceTypeIsGpu) {
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(ZES_DEVICE_TYPE_GPU, extProperties.type);
}
HWTEST2_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionAndOnDemandPageFaultSupportedThenFlagIsSetCorrectly, IsAtMostGen11) {
auto mockHardwareInfo = device->getHardwareInfo();
mockHardwareInfo.capabilityTable.supportsOnDemandPageFaults = true;
device->getExecutionEnvironment()->rootDeviceEnvironments[device->getRootDeviceIndex()]->setHwInfoAndInitHelpers(&mockHardwareInfo);
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_ONDEMANDPAGING);
EXPECT_TRUE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_INTEGRATED);
}
TEST_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionAndOnDemandPageFaultNotSupportedThenFlagIsNotSet) {
auto mockHardwareInfo = device->getHardwareInfo();
mockHardwareInfo.capabilityTable.supportsOnDemandPageFaults = false;
device->getExecutionEnvironment()->rootDeviceEnvironments[device->getRootDeviceIndex()]->setHwInfoAndInitHelpers(&mockHardwareInfo);
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_FALSE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_ONDEMANDPAGING);
}
HWTEST2_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionAndIsIntegratedDeviceThenFlagIsSet, IsAtMostGen11) {
auto mockHardwareInfo = device->getHardwareInfo();
mockHardwareInfo.capabilityTable.isIntegratedDevice = true;
device->getExecutionEnvironment()->rootDeviceEnvironments[device->getRootDeviceIndex()]->setHwInfoAndInitHelpers(&mockHardwareInfo);
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_INTEGRATED);
}
HWTEST2_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionAndIsNotIntegratedDeviceThenFlagIsNotSet, IsXeHpgCore) {
auto mockHardwareInfo = device->getHardwareInfo();
mockHardwareInfo.capabilityTable.isIntegratedDevice = false;
device->getExecutionEnvironment()->rootDeviceEnvironments[device->getRootDeviceIndex()]->setHwInfoAndInitHelpers(&mockHardwareInfo);
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_FALSE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_INTEGRATED);
}
HWTEST2_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionAndIsNotSubDeviceThenFlagIsNotSet, IsAtMostGen11) {
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_INTEGRATED);
}
TEST_F(SysmanDevicePropertiesExtensionTest,
GivenValidDeviceHandleWhenCallingGetPropertiesWithIncorrectStypeThenExtensionPropertiesNotSet) {
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_ENGINE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_EQ(0u, extProperties.flags);
}
using SysmanDevicePropertiesExtensionTestMultiDevice = SysmanMultiDeviceFixture;
HWTEST2_F(SysmanDevicePropertiesExtensionTestMultiDevice,
GivenValidDeviceHandleWhenCallingGetPropertiesForExtensionThenSubDeviceFlagSetCorrectly, IsXeHpcCore) {
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
zes_device_ext_properties_t extProperties = {ZES_STRUCTURE_TYPE_DEVICE_EXT_PROPERTIES};
properties.pNext = &extProperties;
ze_result_t result = zesDeviceGetProperties(pSysmanDevice, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_FALSE(extProperties.flags & ZES_DEVICE_PROPERTY_FLAG_INTEGRATED);
}
TEST_F(SysmanDeviceFixture, GivenValidDeviceHandleWhenCallingDeviceGetStateThenSuccessResultIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();

View File

@ -510,7 +510,8 @@ TEST_F(SysmanGlobalOperationsFixture, GivenValidDeviceHandleAndOpenSysCallFailsW
auto pOriginalDrm = pLinuxSysmanImp->pDrm;
pLinuxSysmanImp->pDrm = pDrmMock.get();
zes_device_properties_t properties;
zes_device_properties_t properties = {ZES_STRUCTURE_TYPE_DEVICE_PROPERTIES};
properties.pNext = nullptr;
ze_result_t result = zesDeviceGetProperties(device, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result);