From c2b4699cb6f370db61332b34ef0234a65a8a9658 Mon Sep 17 00:00:00 2001 From: Maciej Bielski Date: Mon, 15 Apr 2024 11:09:00 +0000 Subject: [PATCH] feature: Add mask of tiles to each memory region in Xe * Derive that information from GT list * Use it to compute local memory size given the mask of tiles to account for * Leverage IoctlHelper to dispatch execution (i915 vs Xe) Related-To: NEO-9754 Signed-off-by: Maciej Bielski --- .../os_interface/linux/drm_memory_manager.cpp | 13 +--- .../source/os_interface/linux/ioctl_helper.h | 3 + .../os_interface/linux/ioctl_helper_i915.cpp | 13 ++++ .../source/os_interface/linux/memory_info.cpp | 8 +-- .../source/os_interface/linux/memory_info.h | 9 +-- .../os_interface/linux/xe/ioctl_helper_xe.cpp | 54 +++++++++++---- .../os_interface/linux/xe/ioctl_helper_xe.h | 1 + .../linux/drm_memory_manager_fixture.h | 2 +- .../linux/xe/ioctl_helper_xe_tests.cpp | 68 +++++++++++++++---- .../linux/xe/ioctl_helper_xe_tests.h | 13 +++- 10 files changed, 134 insertions(+), 50 deletions(-) diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 704bd2cb60..dd50595a44 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -1554,20 +1554,11 @@ uint64_t DrmMemoryManager::getLocalMemorySize(uint32_t rootDeviceIndex, uint32_t if (!memoryInfo) { return 0; } - auto hwInfo = executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->getHardwareInfo(); uint32_t subDevicesCount = GfxCoreHelper::getSubDevicesCount(hwInfo); - size_t size = 0; - for (uint32_t i = 0; i < subDevicesCount; i++) { - auto memoryBank = (1 << i); - - if (deviceBitfield & memoryBank) { - size += memoryInfo->getMemoryRegionSize(memoryBank); - } - } - - return size; + auto ioctlHelper = getDrm(rootDeviceIndex).getIoctlHelper(); + return ioctlHelper->getLocalMemoryRegionsSize(memoryInfo, subDevicesCount, deviceBitfield); } bool DrmMemoryManager::copyMemoryToAllocation(GraphicsAllocation *graphicsAllocation, size_t destinationOffset, const void *memoryToCopy, size_t sizeToCopy) { diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 6145a83f60..00a91aec8a 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -43,6 +43,7 @@ struct MemoryRegion { MemoryClassInstance region; uint64_t probedSize; uint64_t unallocatedSize; + std::bitset<4> tilesMask; }; struct EngineCapabilities { @@ -174,6 +175,7 @@ class IoctlHelper { uint32_t getFlagsForPrimeHandleToFd() const; virtual std::unique_ptr createMemoryInfo() = 0; + virtual size_t getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t deviceBitfield) const = 0; virtual std::unique_ptr createEngineInfo(bool isSysmanEnabled) = 0; virtual bool getTopologyDataAndMap(const HardwareInfo &hwInfo, DrmQueryTopologyData &topologyData, TopologyMap &topologyMap) = 0; virtual void fillBindInfoForIpcHandle(uint32_t handle, size_t size) = 0; @@ -213,6 +215,7 @@ class IoctlHelperI915 : public IoctlHelper { std::vector translateToEngineCaps(const std::vector &data); std::unique_ptr createEngineInfo(bool isSysmanEnabled) override; std::unique_ptr createMemoryInfo() override; + size_t getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t deviceBitfield) const override; bool setDomainCpu(uint32_t handle, bool writeEnable) override; unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) const override; std::string getDrmParamString(DrmParam param) const override; diff --git a/shared/source/os_interface/linux/ioctl_helper_i915.cpp b/shared/source/os_interface/linux/ioctl_helper_i915.cpp index 67e86c9bd8..9eb1a1f42d 100644 --- a/shared/source/os_interface/linux/ioctl_helper_i915.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_i915.cpp @@ -327,6 +327,19 @@ std::unique_ptr IoctlHelperI915::createMemoryInfo() { return {}; } +size_t IoctlHelperI915::getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t deviceBitfield) const { + size_t size = 0; + + for (uint32_t i = 0; i < subDevicesCount; i++) { + auto memoryBank = (1 << i); + + if (deviceBitfield & memoryBank) { + size += memoryInfo->getMemoryRegionSize(memoryBank); + } + } + return size; +} + std::string IoctlHelperI915::getDrmParamString(DrmParam drmParam) const { switch (drmParam) { case DrmParam::paramChipsetId: diff --git a/shared/source/os_interface/linux/memory_info.cpp b/shared/source/os_interface/linux/memory_info.cpp index 04329a676a..91078daafa 100644 --- a/shared/source/os_interface/linux/memory_info.cpp +++ b/shared/source/os_interface/linux/memory_info.cpp @@ -78,7 +78,7 @@ int MemoryInfo::createGemExt(const MemRegionsVec &memClassInstances, size_t allo } } -uint32_t MemoryInfo::getTileIndex(uint32_t memoryBank) { +uint32_t MemoryInfo::getTileIndex(uint32_t memoryBank) const { auto &hwInfo = *this->drm.getRootDeviceEnvironment().getHardwareInfo(); auto &gfxCoreHelper = this->drm.getRootDeviceEnvironment().getHelper(); auto &productHelper = this->drm.getRootDeviceEnvironment().getHelper(); @@ -101,7 +101,7 @@ MemoryClassInstance MemoryInfo::getMemoryRegionClassAndInstance(uint32_t memoryB return getMemoryRegion(memoryBank).region; } -const MemoryRegion &MemoryInfo::getMemoryRegion(uint32_t memoryBank) { +const MemoryRegion &MemoryInfo::getMemoryRegion(uint32_t memoryBank) const { if (memoryBank == 0) { return systemMemoryRegion; } @@ -112,14 +112,14 @@ const MemoryRegion &MemoryInfo::getMemoryRegion(uint32_t memoryBank) { return localMemoryRegions[index]; } -size_t MemoryInfo::getMemoryRegionSize(uint32_t memoryBank) { +size_t MemoryInfo::getMemoryRegionSize(uint32_t memoryBank) const { if (debugManager.flags.PrintMemoryRegionSizes.get()) { printRegionSizes(); } return getMemoryRegion(memoryBank).probedSize; } -void MemoryInfo::printRegionSizes() { +void MemoryInfo::printRegionSizes() const { for (auto ®ion : drmQueryRegions) { std::cout << "Memory type: " << region.region.memoryClass << ", memory instance: " << region.region.memoryInstance diff --git a/shared/source/os_interface/linux/memory_info.h b/shared/source/os_interface/linux/memory_info.h index aa49f1b480..b330713861 100644 --- a/shared/source/os_interface/linux/memory_info.h +++ b/shared/source/os_interface/linux/memory_info.h @@ -30,18 +30,19 @@ class MemoryInfo { MemoryClassInstance getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo); - MOCKABLE_VIRTUAL size_t getMemoryRegionSize(uint32_t memoryBank); + MOCKABLE_VIRTUAL size_t getMemoryRegionSize(uint32_t memoryBank) const; - const MemoryRegion &getMemoryRegion(uint32_t memoryBank); + const MemoryRegion &getMemoryRegion(uint32_t memoryBank) const; - void printRegionSizes(); + void printRegionSizes() const; - uint32_t getTileIndex(uint32_t memoryBank); + uint32_t getTileIndex(uint32_t memoryBank) const; MOCKABLE_VIRTUAL int createGemExtWithSingleRegion(uint32_t memoryBanks, size_t allocSize, uint32_t &handle, uint64_t patIndex, int32_t pairHandle, bool isUSMHostAllocation); MOCKABLE_VIRTUAL int createGemExtWithMultipleRegions(uint32_t memoryBanks, size_t allocSize, uint32_t &handle, uint64_t patIndex, bool isUSMHostAllocation); MOCKABLE_VIRTUAL int createGemExtWithMultipleRegions(uint32_t memoryBanks, size_t allocSize, uint32_t &handle, uint64_t patIndex, int32_t pairHandle, bool isChunked, uint32_t numOfChunks, bool isUSMHostAllocation); + const RegionContainer &getLocalMemoryRegions() const { return localMemoryRegions; } const RegionContainer &getDrmRegionInfos() const { return drmQueryRegions; } bool isMemPolicySupported() const { return memPolicySupported; } diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp index 5350df3274..bb0dd70ca4 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -34,6 +34,7 @@ #include #include +#include #include #define STRINGIFY_ME(X) return #X @@ -264,12 +265,13 @@ std::unique_ptr IoctlHelperXe::createEngineInfo(bool isSysmanEnabled return std::make_unique(&drm, enginesPerTile); } -inline MemoryRegion createMemoryRegionFromXeMemRegion(const drm_xe_mem_region &xeMemRegion) { +inline MemoryRegion createMemoryRegionFromXeMemRegion(const drm_xe_mem_region &xeMemRegion, std::bitset<4> tilesMask) { MemoryRegion memoryRegion{}; memoryRegion.region.memoryInstance = xeMemRegion.instance; memoryRegion.region.memoryClass = xeMemRegion.mem_class; memoryRegion.probedSize = xeMemRegion.total_size; memoryRegion.unallocatedSize = xeMemRegion.total_size - xeMemRegion.used; + memoryRegion.tilesMask = tilesMask; return memoryRegion; } @@ -280,16 +282,36 @@ std::unique_ptr IoctlHelperXe::createMemoryInfo() { return {}; } + std::array, 64> regionTilesMask{}; + + for (auto i{0u}; i < xeGtListData->num_gt; i++) { + const auto >Entry = xeGtListData->gt_list[i]; + if (gtEntry.type != DRM_XE_QUERY_GT_TYPE_MAIN) { + continue; + } + + uint64_t nearMemRegions{gtEntry.near_mem_regions}; + auto regionIndex{Math::log2(nearMemRegions)}; + regionTilesMask[regionIndex].set(gtEntry.tile_id); + } + MemoryInfo::RegionContainer regionsContainer{}; + size_t sysmemRegionsAdded{0u}; + auto xeMemRegionsData = reinterpret_cast(memUsageData.data()); - - std::array memoryRegionInstances{}; - for (auto i = 0u; i < xeMemRegionsData->num_mem_regions; i++) { - auto ®ion = xeMemRegionsData->mem_regions[i]; - memoryRegionInstances[region.instance] = ®ion; - if (region.mem_class == DRM_XE_MEM_REGION_CLASS_SYSMEM) { - regionsContainer.push_back(createMemoryRegionFromXeMemRegion(region)); + auto &xeMemRegion{xeMemRegionsData->mem_regions[i]}; + + if (xeMemRegion.mem_class == DRM_XE_MEM_REGION_CLASS_SYSMEM) { + // Make sure sysmem is always put at the first position + regionsContainer.insert(regionsContainer.begin(), createMemoryRegionFromXeMemRegion(xeMemRegion, 0u)); + ++sysmemRegionsAdded; + } else { + auto regionIndex = xeMemRegion.instance; + UNRECOVERABLE_IF(regionIndex >= regionTilesMask.size()); + if (auto tilesMask = regionTilesMask[regionIndex]; tilesMask.any()) { + regionsContainer.insert(regionsContainer.begin() + sysmemRegionsAdded, createMemoryRegionFromXeMemRegion(xeMemRegion, tilesMask)); + } } } @@ -297,15 +319,17 @@ std::unique_ptr IoctlHelperXe::createMemoryInfo() { return {}; } - for (auto i = 0u; i < xeGtListData->num_gt; i++) { - if (xeGtListData->gt_list[i].type != DRM_XE_QUERY_GT_TYPE_MEDIA) { - uint64_t nearMemRegions = xeGtListData->gt_list[i].near_mem_regions; - auto regionIndex = Math::log2(nearMemRegions); - UNRECOVERABLE_IF(!memoryRegionInstances[regionIndex]); - regionsContainer.push_back(createMemoryRegionFromXeMemRegion(*memoryRegionInstances[regionIndex])); + return std::make_unique(regionsContainer, drm); +} + +size_t IoctlHelperXe::getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t tileMask) const { + size_t size = 0; + for (const auto &memoryRegion : memoryInfo->getLocalMemoryRegions()) { + if ((memoryRegion.tilesMask & std::bitset<4>{tileMask}).any()) { + size += memoryRegion.probedSize; } } - return std::make_unique(regionsContainer, drm); + return size; } bool IoctlHelperXe::setGpuCpuTimes(TimeStampData *pGpuCpuTime, OSTime *osTime) { diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h index 1e1c54e4c4..683e9b133d 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -105,6 +105,7 @@ class IoctlHelperXe : public IoctlHelper { bool isWaitBeforeBindRequired(bool bind) const override; std::unique_ptr createEngineInfo(bool isSysmanEnabled) override; std::unique_ptr createMemoryInfo() override; + size_t getLocalMemoryRegionsSize(const MemoryInfo *memoryInfo, uint32_t subDevicesCount, uint32_t deviceBitfield) const override; void getTopologyData(size_t nTiles, std::vector> *geomDss, std::vector> *computeDss, std::vector> *euDss, DrmQueryTopologyData &topologyData, bool &isComputeDssEmpty); void getTopologyMap(size_t nTiles, std::vector> *dssInfo, TopologyMap &topologyMap); diff --git a/shared/test/common/os_interface/linux/drm_memory_manager_fixture.h b/shared/test/common/os_interface/linux/drm_memory_manager_fixture.h index 9318f7b89f..840e74d5ad 100644 --- a/shared/test/common/os_interface/linux/drm_memory_manager_fixture.h +++ b/shared/test/common/os_interface/linux/drm_memory_manager_fixture.h @@ -66,7 +66,7 @@ struct MockedMemoryInfo : public NEO::MemoryInfo { using NEO::MemoryInfo::MemoryInfo; ~MockedMemoryInfo() override = default; - size_t getMemoryRegionSize(uint32_t memoryBank) override { + size_t getMemoryRegionSize(uint32_t memoryBank) const override { return 1024u; } int createGemExt(const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint64_t patIndex, std::optional vmId, int32_t pairHandle, bool isChunked, uint32_t numOfChunks, bool isUSMHostAllocation) override { diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp index fc68fee8e0..f3b433faf0 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp @@ -9,6 +9,7 @@ #include "shared/source/os_interface/linux/os_context_linux.h" #include "shared/test/common/helpers/engine_descriptor_helper.h" +#include "shared/test/common/mocks/linux/mock_drm_memory_manager.h" using namespace NEO; @@ -694,7 +695,7 @@ TEST(IoctlHelperXeTest, givenGeomDssWhenGetTopologyDataAndMapThenResultsAreCorre xeIoctlHelper->initialize(); uint16_t tileId = 0; - for (auto gtId = 0u; gtId < 3u; gtId++) { + for (auto gtId = 0u; gtId < 4u; gtId++) { drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0b11'1111, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); @@ -744,7 +745,7 @@ TEST(IoctlHelperXeTest, givenUnknownTopologyTypeWhenGetTopologyDataAndMapThenNot constexpr int16_t unknownTopology = -1; uint16_t tileId = 0; - for (auto gtId = 0u; gtId < 3u; gtId++) { + for (auto gtId = 0u; gtId < 4u; gtId++) { drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0b11'1111, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0b1111'1111, 0, 0, 0, 0, 0, 0}); @@ -793,7 +794,7 @@ TEST(IoctlHelperXeTest, givenComputeDssWhenGetTopologyDataAndMapThenResultsAreCo xeIoctlHelper->initialize(); uint16_t tileId = 0; - for (auto gtId = 0u; gtId < 3u; gtId++) { + for (auto gtId = 0u; gtId < 4u; gtId++) { drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_GEOMETRY, 8, {0, 0, 0, 0, 0, 0, 0, 0}); drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_DSS_COMPUTE, 8, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}); drm.addMockedQueryTopologyData(gtId, DRM_XE_TOPO_EU_PER_DSS, 8, {0b1111'1111, 0, 0, 0, 0, 0, 0, 0}); @@ -965,7 +966,7 @@ TEST(IoctlHelperXeTest, givenMainAndMediaTypesWhenGetTopologyDataAndMapThenResul struct DrmMockXe2T : public DrmMockXe { DrmMockXe2T(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockXe(rootDeviceEnvironment) { auto xeQueryMemUsage = reinterpret_cast(queryMemUsage); - xeQueryMemUsage->num_mem_regions = 3; + xeQueryMemUsage->num_mem_regions = 2; xeQueryMemUsage->mem_regions[0] = { DRM_XE_MEM_REGION_CLASS_VRAM, // class 1, // instance @@ -980,16 +981,9 @@ struct DrmMockXe2T : public DrmMockXe { MemoryConstants::gigaByte, // total size MemoryConstants::kiloByte // used size }; - xeQueryMemUsage->mem_regions[2] = { - DRM_XE_MEM_REGION_CLASS_VRAM, // class - 2, // instance - MemoryConstants::pageSize, // min page size - 4 * MemoryConstants::gigaByte, // total size - MemoryConstants::gigaByte // used size - }; - queryGtList.resize(25); + queryGtList.resize(37); auto xeQueryGtList = reinterpret_cast(queryGtList.begin()); - xeQueryGtList->num_gt = 2; + xeQueryGtList->num_gt = 3; xeQueryGtList->gt_list[0] = { DRM_XE_QUERY_GT_TYPE_MAIN, // type 0, // tile_id @@ -1008,6 +1002,15 @@ struct DrmMockXe2T : public DrmMockXe { 0b010, // native mem regions 0x101, // slow mem regions }; + xeQueryGtList->gt_list[2] = { + DRM_XE_QUERY_GT_TYPE_MAIN, // type + 1, // tile_id + 2, // gt_id + {0}, // padding + 12500000, // reference_clock + 0b100, // native mem regions + 0x011, // slow mem regions + }; } }; @@ -1393,6 +1396,45 @@ TEST(IoctlHelperXeTest, whenCreatingMemoryInfoThenProperMemoryBanksAreDiscovered EXPECT_EQ(2 * MemoryConstants::gigaByte - MemoryConstants::megaByte, memoryRegions[2].unallocatedSize); } +TEST(IoctlHelperXeTest, givenXeDrmMemoryManagerWhenGetLocalMemorySizeIsCalledThenReturnMemoryRegionSizeCorrectly) { + DebugManagerStateRestore restorer; + debugManager.flags.EnableLocalMemory.set(1); + + constexpr auto tileCount{3u}; + + auto executionEnvironment{std::make_unique()}; + auto &rootDeviceEnv{*executionEnvironment->rootDeviceEnvironments[0]}; + auto *hwInfo = rootDeviceEnv.getMutableHardwareInfo(); + hwInfo->gtSystemInfo.MultiTileArchInfo.IsValid = true; + hwInfo->gtSystemInfo.MultiTileArchInfo.TileCount = tileCount; + rootDeviceEnv.osInterface.reset(new OSInterface{}); + rootDeviceEnv.osInterface->setDriverModel(std::make_unique(rootDeviceEnv)); + + auto *drm{rootDeviceEnv.osInterface->getDriverModel()->as()}; + + auto xeIoctlHelper = std::make_unique(*drm); + xeIoctlHelper->initialize(); + auto memoryInfo = xeIoctlHelper->createMemoryInfo(); + ASSERT_NE(nullptr, memoryInfo); + std::vector lmemSizes{}; + for (const auto ®ion : memoryInfo->getLocalMemoryRegions()) { + lmemSizes.push_back(region.probedSize); + } + + drm->memoryInfo.reset(memoryInfo.release()); + drm->ioctlHelper.reset(xeIoctlHelper.release()); + + TestedDrmMemoryManager memoryManager(*executionEnvironment); + uint32_t tileMask = static_cast(maxNBitValue(tileCount)); + EXPECT_EQ(memoryManager.getLocalMemorySize(0, tileMask), lmemSizes[0] + lmemSizes[1]); + tileMask = static_cast(0b01); + EXPECT_EQ(memoryManager.getLocalMemorySize(0, tileMask), lmemSizes[0]); + tileMask = static_cast(0b10); + EXPECT_EQ(memoryManager.getLocalMemorySize(0, tileMask), lmemSizes[1]); + tileMask = static_cast(0b100); + EXPECT_EQ(memoryManager.getLocalMemorySize(0, tileMask), lmemSizes[0]); +} + TEST(IoctlHelperXeTest, givenIoctlFailureWhenCreatingMemoryInfoThenNoMemoryBanksAreDiscovered) { DebugManagerStateRestore restorer; auto executionEnvironment = std::make_unique(); diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h index df2bed208a..d696978d92 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h @@ -99,9 +99,9 @@ class DrmMockXe : public DrmMockCustom { MemoryConstants::gigaByte // used size }; - queryGtList.resize(37); // 1 qword for num gts and 12 qwords per gt + queryGtList.resize(49); // 1 qword for num gts and 12 qwords per gt auto xeQueryGtList = reinterpret_cast(queryGtList.begin()); - xeQueryGtList->num_gt = 3; + xeQueryGtList->num_gt = 4; xeQueryGtList->gt_list[0] = { DRM_XE_QUERY_GT_TYPE_MAIN, // type 0, // tile_id @@ -129,6 +129,15 @@ class DrmMockXe : public DrmMockCustom { 0b010, // native mem regions 0x101, // slow mem regions }; + xeQueryGtList->gt_list[3] = { + DRM_XE_QUERY_GT_TYPE_MAIN, // type + 2, // tile_id + 3, // gt_id + {0}, // padding + mockTimestampFrequency, // reference_clock + 0b100, // native mem regions + 0x011, // slow mem regions + }; } void testMode(int f, int a = 0) {