Update sysman engine and scheduler as per lastest spec

Signed-off-by: Mayank Raghuwanshi <mayank.raghuwanshi@intel.com>
This commit is contained in:
Mayank Raghuwanshi
2021-03-31 11:24:22 +05:30
committed by Compute-Runtime-Automation
parent 4c6e38c9e5
commit 1c3107fc7e
8 changed files with 87 additions and 26 deletions

View File

@@ -13,28 +13,30 @@
namespace L0 { namespace L0 {
static const std::multimap<drm_i915_gem_engine_class, zes_engine_group_t> i915ToEngineMap = { static const std::multimap<__u16, zes_engine_group_t> i915ToEngineMap = {
{I915_ENGINE_CLASS_RENDER, ZES_ENGINE_GROUP_RENDER_SINGLE}, {static_cast<__u16>(I915_ENGINE_CLASS_RENDER), ZES_ENGINE_GROUP_RENDER_SINGLE},
{I915_ENGINE_CLASS_VIDEO, ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE}, {static_cast<__u16>(I915_ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE},
{I915_ENGINE_CLASS_VIDEO, ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE}, {static_cast<__u16>(I915_ENGINE_CLASS_VIDEO), ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE},
{I915_ENGINE_CLASS_COPY, ZES_ENGINE_GROUP_COPY_SINGLE}}; {static_cast<__u16>(I915_ENGINE_CLASS_COPY), ZES_ENGINE_GROUP_COPY_SINGLE},
{static_cast<__u16>(I915_ENGINE_CLASS_VIDEO_ENHANCE), ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE}};
static const std::multimap<zes_engine_group_t, drm_i915_gem_engine_class> engineToI915Map = { static const std::multimap<zes_engine_group_t, __u16> engineToI915Map = {
{ZES_ENGINE_GROUP_RENDER_SINGLE, I915_ENGINE_CLASS_RENDER}, {ZES_ENGINE_GROUP_RENDER_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_RENDER)},
{ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, I915_ENGINE_CLASS_VIDEO}, {ZES_ENGINE_GROUP_MEDIA_DECODE_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_VIDEO)},
{ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, I915_ENGINE_CLASS_VIDEO}, {ZES_ENGINE_GROUP_MEDIA_ENCODE_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_VIDEO)},
{ZES_ENGINE_GROUP_COPY_SINGLE, I915_ENGINE_CLASS_COPY}}; {ZES_ENGINE_GROUP_COPY_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_COPY)},
{ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, static_cast<__u16>(I915_ENGINE_CLASS_VIDEO_ENHANCE)}};
ze_result_t OsEngine::getNumEngineTypeAndInstances(std::multimap<zes_engine_group_t, uint32_t> &engineGroupInstance, OsSysman *pOsSysman) { ze_result_t OsEngine::getNumEngineTypeAndInstances(std::multimap<zes_engine_group_t, uint32_t> &engineGroupInstance, OsSysman *pOsSysman) {
LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman); LinuxSysmanImp *pLinuxSysmanImp = static_cast<LinuxSysmanImp *>(pOsSysman);
NEO::Drm *pDrm = &pLinuxSysmanImp->getDrm(); NEO::Drm *pDrm = &pLinuxSysmanImp->getDrm();
if (pDrm->queryEngineInfo() == false) { if (pDrm->sysmanQueryEngineInfo() == false) {
return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE;
} }
auto engineInfo = static_cast<NEO::EngineInfoImpl *>(pDrm->getEngineInfo()); auto engineInfo = static_cast<NEO::EngineInfoImpl *>(pDrm->getEngineInfo());
for (auto itr = engineInfo->engines.begin(); itr != engineInfo->engines.end(); ++itr) { for (auto itr = engineInfo->engines.begin(); itr != engineInfo->engines.end(); ++itr) {
auto L0EngineEntryInMap = i915ToEngineMap.find(static_cast<drm_i915_gem_engine_class>(itr->engine.engine_class)); auto L0EngineEntryInMap = i915ToEngineMap.find(static_cast<__u16>(itr->engine.engine_class));
if (L0EngineEntryInMap == i915ToEngineMap.end()) { if (L0EngineEntryInMap == i915ToEngineMap.end()) {
continue; continue;
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2020 Intel Corporation * Copyright (C) 2020-2021 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@@ -171,7 +171,7 @@ ze_bool_t LinuxSchedulerImp::canControlScheduler() {
} }
static const std::multimap<zes_engine_type_flag_t, std::string> level0EngineTypeToSysfsEngineMap = { static const std::multimap<zes_engine_type_flag_t, std::string> level0EngineTypeToSysfsEngineMap = {
{ZES_ENGINE_TYPE_FLAG_COMPUTE, "rcs"}, {ZES_ENGINE_TYPE_FLAG_RENDER, "rcs"},
{ZES_ENGINE_TYPE_FLAG_DMA, "bcs"}, {ZES_ENGINE_TYPE_FLAG_DMA, "bcs"},
{ZES_ENGINE_TYPE_FLAG_MEDIA, "vcs"}, {ZES_ENGINE_TYPE_FLAG_MEDIA, "vcs"},
{ZES_ENGINE_TYPE_FLAG_OTHER, "vecs"}}; {ZES_ENGINE_TYPE_FLAG_OTHER, "vecs"}};

View File

@@ -8,6 +8,8 @@
#pragma once #pragma once
#include "shared/source/os_interface/linux/engine_info_impl.h" #include "shared/source/os_interface/linux/engine_info_impl.h"
#include "opencl/test/unit_test/os_interface/linux/drm_mock.h"
#include "level_zero/core/test/unit_tests/mock.h" #include "level_zero/core/test/unit_tests/mock.h"
#include "level_zero/core/test/unit_tests/mocks/mock_memory_manager.h" #include "level_zero/core/test/unit_tests/mocks/mock_memory_manager.h"
#include "level_zero/tools/source/sysman/engine/linux/os_engine_imp.h" #include "level_zero/tools/source/sysman/engine/linux/os_engine_imp.h"
@@ -23,13 +25,14 @@ constexpr int64_t mockPmuFd = 10;
constexpr uint64_t mockTimestamp = 87654321; constexpr uint64_t mockTimestamp = 87654321;
constexpr uint64_t mockActiveTime = 987654321; constexpr uint64_t mockActiveTime = 987654321;
const uint32_t microSecondsToNanoSeconds = 1000u; const uint32_t microSecondsToNanoSeconds = 1000u;
constexpr uint16_t I915_INVALID_ENGINE_CLASS = UINT16_MAX;
const std::string deviceDir("device"); const std::string deviceDir("device");
struct MockMemoryManagerInEngineSysman : public MemoryManagerMock { struct MockMemoryManagerInEngineSysman : public MemoryManagerMock {
MockMemoryManagerInEngineSysman(NEO::ExecutionEnvironment &executionEnvironment) : MemoryManagerMock(const_cast<NEO::ExecutionEnvironment &>(executionEnvironment)) {} MockMemoryManagerInEngineSysman(NEO::ExecutionEnvironment &executionEnvironment) : MemoryManagerMock(const_cast<NEO::ExecutionEnvironment &>(executionEnvironment)) {}
}; };
class EngineNeoDrm : public Drm { class EngineNeoDrm : public Drm {
public: public:
using Drm::engineInfo; using Drm::getEngineInfo;
const int mockFd = 0; const int mockFd = 0;
EngineNeoDrm(RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceId>(mockFd, ""), rootDeviceEnvironment) {} EngineNeoDrm(RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceId>(mockFd, ""), rootDeviceEnvironment) {}
}; };
@@ -38,7 +41,7 @@ struct Mock<EngineNeoDrm> : public EngineNeoDrm {
Mock<EngineNeoDrm>(RootDeviceEnvironment &rootDeviceEnvironment) : EngineNeoDrm(rootDeviceEnvironment) {} Mock<EngineNeoDrm>(RootDeviceEnvironment &rootDeviceEnvironment) : EngineNeoDrm(rootDeviceEnvironment) {}
bool queryEngineInfoMockPositiveTest() { bool queryEngineInfoMockPositiveTest() {
drm_i915_engine_info i915engineInfo[5] = {}; drm_i915_engine_info i915engineInfo[6] = {};
i915engineInfo[0].engine.engine_class = I915_ENGINE_CLASS_RENDER; i915engineInfo[0].engine.engine_class = I915_ENGINE_CLASS_RENDER;
i915engineInfo[0].engine.engine_instance = 0; i915engineInfo[0].engine.engine_instance = 0;
i915engineInfo[1].engine.engine_class = I915_ENGINE_CLASS_VIDEO; i915engineInfo[1].engine.engine_class = I915_ENGINE_CLASS_VIDEO;
@@ -49,8 +52,10 @@ struct Mock<EngineNeoDrm> : public EngineNeoDrm {
i915engineInfo[3].engine.engine_instance = 0; i915engineInfo[3].engine.engine_instance = 0;
i915engineInfo[4].engine.engine_class = I915_ENGINE_CLASS_VIDEO_ENHANCE; i915engineInfo[4].engine.engine_class = I915_ENGINE_CLASS_VIDEO_ENHANCE;
i915engineInfo[4].engine.engine_instance = 0; i915engineInfo[4].engine.engine_instance = 0;
i915engineInfo[5].engine.engine_class = I915_INVALID_ENGINE_CLASS;
i915engineInfo[5].engine.engine_instance = 0;
this->engineInfo.reset(new EngineInfoImpl(i915engineInfo, 5)); this->engineInfo.reset(new EngineInfoImpl(i915engineInfo, 6));
return true; return true;
} }
@@ -58,7 +63,7 @@ struct Mock<EngineNeoDrm> : public EngineNeoDrm {
return false; return false;
} }
MOCK_METHOD(bool, queryEngineInfo, (), (override)); MOCK_METHOD(bool, sysmanQueryEngineInfo, (), (override));
}; };
class MockPmuInterfaceImp : public PmuInterfaceImp { class MockPmuInterfaceImp : public PmuInterfaceImp {
@@ -121,5 +126,12 @@ struct Mock<EngineSysfsAccess> : public EngineSysfsAccess {
Mock<EngineSysfsAccess>() = default; Mock<EngineSysfsAccess>() = default;
}; };
class DrmMockEngineInfoFailing : public DrmMock {
public:
using DrmMock::DrmMock;
DrmMockEngineInfoFailing(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMock(rootDeviceEnvironment) {}
int handleRemainingRequests(unsigned long request, void *arg) override { return -1; }
};
} // namespace ult } // namespace ult
} // namespace L0 } // namespace L0

View File

@@ -14,7 +14,7 @@ using ::testing::Return;
class OsEngine; class OsEngine;
namespace L0 { namespace L0 {
namespace ult { namespace ult {
constexpr uint32_t handleComponentCount = 4u; constexpr uint32_t handleComponentCount = 5u;
class ZesEngineFixture : public SysmanDeviceFixture { class ZesEngineFixture : public SysmanDeviceFixture {
protected: protected:
std::unique_ptr<Mock<EngineNeoDrm>> pDrm; std::unique_ptr<Mock<EngineNeoDrm>> pDrm;
@@ -50,7 +50,7 @@ class ZesEngineFixture : public SysmanDeviceFixture {
pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface; pOriginalPmuInterface = pLinuxSysmanImp->pPmuInterface;
pLinuxSysmanImp->pDrm = pDrm.get(); pLinuxSysmanImp->pDrm = pDrm.get();
pLinuxSysmanImp->pPmuInterface = pPmuInterface.get(); pLinuxSysmanImp->pPmuInterface = pPmuInterface.get();
ON_CALL(*pDrm.get(), queryEngineInfo()) ON_CALL(*pDrm.get(), sysmanQueryEngineInfo())
.WillByDefault(::testing::Invoke(pDrm.get(), &Mock<EngineNeoDrm>::queryEngineInfoMockPositiveTest)); .WillByDefault(::testing::Invoke(pDrm.get(), &Mock<EngineNeoDrm>::queryEngineInfoMockPositiveTest));
ON_CALL(*pPmuInterface.get(), perfEventOpen(_, _, _, _, _)) ON_CALL(*pPmuInterface.get(), perfEventOpen(_, _, _, _, _))
@@ -116,6 +116,10 @@ TEST_F(ZesEngineFixture, GivenValidEngineHandlesWhenCallingZesEngineGetPropertie
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[3], &properties)); EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[3], &properties));
EXPECT_EQ(ZES_ENGINE_GROUP_COPY_SINGLE, properties.type); EXPECT_EQ(ZES_ENGINE_GROUP_COPY_SINGLE, properties.type);
EXPECT_FALSE(properties.onSubdevice); EXPECT_FALSE(properties.onSubdevice);
EXPECT_EQ(ZE_RESULT_SUCCESS, zesEngineGetProperties(handle[4], &properties));
EXPECT_EQ(ZES_ENGINE_GROUP_MEDIA_ENHANCEMENT_SINGLE, properties.type);
EXPECT_FALSE(properties.onSubdevice);
} }
TEST_F(ZesEngineFixture, GivenValidEngineHandleAndIntegratedDeviceWhenCallingZesEngineGetActivityThenVerifyCallReturnsSuccess) { TEST_F(ZesEngineFixture, GivenValidEngineHandleAndIntegratedDeviceWhenCallingZesEngineGetActivityThenVerifyCallReturnsSuccess) {
@@ -201,11 +205,35 @@ TEST_F(ZesEngineFixture, GivenValidEngineHandleWhenCallingZesEngineGetActivityAn
TEST_F(ZesEngineFixture, GivenValidOsSysmanPointerWhenRetrievingEngineTypeAndInstancesAndIfEngineInfoQueryFailsThenErrorIsReturned) { TEST_F(ZesEngineFixture, GivenValidOsSysmanPointerWhenRetrievingEngineTypeAndInstancesAndIfEngineInfoQueryFailsThenErrorIsReturned) {
std::multimap<zes_engine_group_t, uint32_t> engineGroupInstance; std::multimap<zes_engine_group_t, uint32_t> engineGroupInstance;
ON_CALL(*pDrm.get(), queryEngineInfo()) ON_CALL(*pDrm.get(), sysmanQueryEngineInfo())
.WillByDefault(::testing::Invoke(pDrm.get(), &Mock<EngineNeoDrm>::queryEngineInfoMockReturnFalse)); .WillByDefault(::testing::Invoke(pDrm.get(), &Mock<EngineNeoDrm>::queryEngineInfoMockReturnFalse));
EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, OsEngine::getNumEngineTypeAndInstances(engineGroupInstance, pOsSysman)); EXPECT_EQ(ZE_RESULT_ERROR_UNSUPPORTED_FEATURE, OsEngine::getNumEngineTypeAndInstances(engineGroupInstance, pOsSysman));
} }
TEST_F(ZesEngineFixture, givenEngineInfoQuerySupportedWhenQueryingEngineInfoThenEngineInfoIsCreatedWithEngines) {
auto drm = std::make_unique<DrmMockEngine>((const_cast<NEO::RootDeviceEnvironment &>(neoDevice->getRootDeviceEnvironment())));
ASSERT_NE(nullptr, drm);
drm->sysmanQueryEngineInfo();
auto engineInfo = static_cast<EngineInfoImpl *>(drm->getEngineInfo());
ASSERT_NE(nullptr, engineInfo);
EXPECT_EQ(2u, engineInfo->engines.size());
}
TEST_F(ZesEngineFixture, GivenEngineInfoWithVideoQuerySupportedWhenQueryingEngineInfoWithVideoThenEngineInfoIsCreatedWithEngines) {
auto drm = std::make_unique<DrmMockEngine>((const_cast<NEO::RootDeviceEnvironment &>(neoDevice->getRootDeviceEnvironment())));
ASSERT_NE(nullptr, drm);
drm->sysmanQueryEngineInfo();
auto engineInfo = static_cast<EngineInfoImpl *>(drm->getEngineInfo());
ASSERT_NE(nullptr, engineInfo);
EXPECT_EQ(2u, engineInfo->engines.size());
}
TEST_F(ZesEngineFixture, GivenEngineInfoWithVideoQueryFailsThenFailureIsReturned) {
auto drm = std::make_unique<DrmMockEngineInfoFailing>((const_cast<NEO::RootDeviceEnvironment &>(neoDevice->getRootDeviceEnvironment())));
ASSERT_NE(nullptr, drm);
EXPECT_FALSE(drm->sysmanQueryEngineInfo());
}
} // namespace ult } // namespace ult
} // namespace L0 } // namespace L0

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2020 Intel Corporation * Copyright (C) 2020-2021 Intel Corporation
* *
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
* *
@@ -442,7 +442,7 @@ TEST_F(SysmanDeviceSchedulerFixture, GivenValidDeviceHandleWhenCallingzesSchedul
ze_result_t result = zesSchedulerGetProperties(handle, &properties); ze_result_t result = zesSchedulerGetProperties(handle, &properties);
EXPECT_EQ(ZE_RESULT_SUCCESS, result); EXPECT_EQ(ZE_RESULT_SUCCESS, result);
EXPECT_TRUE(properties.canControl); EXPECT_TRUE(properties.canControl);
EXPECT_LE(properties.engines, ZES_ENGINE_TYPE_FLAG_DMA); EXPECT_LE(properties.engines, ZES_ENGINE_TYPE_FLAG_RENDER);
EXPECT_EQ(properties.supportedModes, static_cast<uint32_t>((1 << ZES_SCHED_MODE_TIMEOUT) | (1 << ZES_SCHED_MODE_TIMESLICE) | (1 << ZES_SCHED_MODE_EXCLUSIVE))); EXPECT_EQ(properties.supportedModes, static_cast<uint32_t>((1 << ZES_SCHED_MODE_TIMEOUT) | (1 << ZES_SCHED_MODE_TIMESLICE) | (1 << ZES_SCHED_MODE_EXCLUSIVE)));
} }
} }
@@ -452,7 +452,7 @@ TEST_F(SysmanMultiDeviceFixture, GivenValidDevicePointerWhenGettingSchedProperti
std::vector<std::string> listOfEngines; std::vector<std::string> listOfEngines;
ze_device_properties_t deviceProperties = {}; ze_device_properties_t deviceProperties = {};
Device::fromHandle(device)->getProperties(&deviceProperties); Device::fromHandle(device)->getProperties(&deviceProperties);
LinuxSchedulerImp *pLinuxSchedulerImp = new LinuxSchedulerImp(pOsSysman, ZES_ENGINE_TYPE_FLAG_COMPUTE, listOfEngines, LinuxSchedulerImp *pLinuxSchedulerImp = new LinuxSchedulerImp(pOsSysman, ZES_ENGINE_TYPE_FLAG_RENDER, listOfEngines,
deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.subdeviceId); deviceProperties.flags & ZE_DEVICE_PROPERTY_FLAG_SUBDEVICE, deviceProperties.subdeviceId);
EXPECT_EQ(ZE_RESULT_SUCCESS, pLinuxSchedulerImp->getProperties(properties)); EXPECT_EQ(ZE_RESULT_SUCCESS, pLinuxSchedulerImp->getProperties(properties));
EXPECT_EQ(properties.subdeviceId, deviceProperties.subdeviceId); EXPECT_EQ(properties.subdeviceId, deviceProperties.subdeviceId);

View File

@@ -115,6 +115,8 @@ class Drm {
uint64_t getSliceMask(uint64_t sliceCount); uint64_t getSliceMask(uint64_t sliceCount);
MOCKABLE_VIRTUAL bool querySystemInfo(); MOCKABLE_VIRTUAL bool querySystemInfo();
MOCKABLE_VIRTUAL bool queryEngineInfo(); MOCKABLE_VIRTUAL bool queryEngineInfo();
MOCKABLE_VIRTUAL bool sysmanQueryEngineInfo();
MOCKABLE_VIRTUAL bool queryEngineInfo(bool isSysmanEnabled);
MOCKABLE_VIRTUAL bool queryMemoryInfo(); MOCKABLE_VIRTUAL bool queryMemoryInfo();
bool queryTopology(const HardwareInfo &hwInfo, QueryTopologyData &data); bool queryTopology(const HardwareInfo &hwInfo, QueryTopologyData &data);
bool createVirtualMemoryAddressSpace(uint32_t vmCount); bool createVirtualMemoryAddressSpace(uint32_t vmCount);
@@ -167,6 +169,7 @@ class Drm {
EngineInfo *getEngineInfo() const { EngineInfo *getEngineInfo() const {
return engineInfo.get(); return engineInfo.get();
} }
RootDeviceEnvironment &getRootDeviceEnvironment() { RootDeviceEnvironment &getRootDeviceEnvironment() {
return rootDeviceEnvironment; return rootDeviceEnvironment;
} }

View File

@@ -37,7 +37,7 @@ bool Drm::querySystemInfo() {
return true; return true;
} }
bool Drm::queryEngineInfo() { bool Drm::queryEngineInfo(bool isSysmanEnabled) {
auto length = 0; auto length = 0;
auto dataQuery = this->query(DRM_I915_QUERY_ENGINE_INFO, DrmQueryItemFlags::empty, length); auto dataQuery = this->query(DRM_I915_QUERY_ENGINE_INFO, DrmQueryItemFlags::empty, length);
auto data = reinterpret_cast<drm_i915_query_engine_info *>(dataQuery.get()); auto data = reinterpret_cast<drm_i915_query_engine_info *>(dataQuery.get());
@@ -48,6 +48,14 @@ bool Drm::queryEngineInfo() {
return false; return false;
} }
bool Drm::queryEngineInfo() {
return Drm::queryEngineInfo(false);
}
bool Drm::sysmanQueryEngineInfo() {
return Drm::queryEngineInfo(true);
}
bool Drm::queryMemoryInfo() { bool Drm::queryMemoryInfo() {
return true; return true;
} }

View File

@@ -39,7 +39,7 @@ bool Drm::querySystemInfo() {
return true; return true;
} }
bool Drm::queryEngineInfo() { bool Drm::queryEngineInfo(bool isSysmanEnabled) {
auto length = 0; auto length = 0;
auto dataQuery = this->query(DRM_I915_QUERY_ENGINE_INFO, DrmQueryItemFlags::empty, length); auto dataQuery = this->query(DRM_I915_QUERY_ENGINE_INFO, DrmQueryItemFlags::empty, length);
auto data = reinterpret_cast<drm_i915_query_engine_info *>(dataQuery.get()); auto data = reinterpret_cast<drm_i915_query_engine_info *>(dataQuery.get());
@@ -50,6 +50,14 @@ bool Drm::queryEngineInfo() {
return false; return false;
} }
bool Drm::queryEngineInfo() {
return Drm::queryEngineInfo(false);
}
bool Drm::sysmanQueryEngineInfo() {
return Drm::queryEngineInfo(true);
}
bool Drm::queryMemoryInfo() { bool Drm::queryMemoryInfo() {
auto length = 0; auto length = 0;
auto dataQuery = this->query(DRM_I915_QUERY_MEMORY_REGIONS, DrmQueryItemFlags::empty, length); auto dataQuery = this->query(DRM_I915_QUERY_MEMORY_REGIONS, DrmQueryItemFlags::empty, length);