Skip to content

Commit 58ec879

Browse files
luluu9Compute-Runtime-Automation
authored andcommitted
Add support for gem create extension to create VM_PRIVATE BOs
Add support for PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE extension to create VM_PRIVATE BOs. Related-to: NEO-6730 Signed-off-by: Naklicki, Mateusz <mateusz.naklicki@intel.com>
1 parent dc2e1df commit 58ec879

18 files changed

+165
-30
lines changed

shared/source/debug_settings/debug_variables_base.inl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,7 @@ DECLARE_DEBUG_VARIABLE(bool, EnableFreeMemory, false, "Enable freeMemory in memo
332332
DECLARE_DEBUG_VARIABLE(bool, ForceSamplerLowFilteringPrecision, false, "Force Low Filtering Precision Sampler mode")
333333
DECLARE_DEBUG_VARIABLE(bool, EngineInstancedSubDevices, false, "Create subdevices assigned to specific engine")
334334
DECLARE_DEBUG_VARIABLE(bool, AllowSingleTileEngineInstancedSubDevices, false, "Create subdevices assigned to specific engine on single tile config")
335+
DECLARE_DEBUG_VARIABLE(bool, EnablePrivateBO, false, "Enable PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE extension creating VM_PRIVATE BOs")
335336
DECLARE_DEBUG_VARIABLE(int32_t, ReturnSubDevicesAsApiDevices, -1, "Expose each subdevice as a separate device during clGetDeviceIDs or zeDeviceGet API call")
336337
DECLARE_DEBUG_VARIABLE(int32_t, ForceRunAloneContext, -1, "Control creation of run-alone HW context, -1:default, 0:disable, 1:enable")
337338
DECLARE_DEBUG_VARIABLE(int32_t, AddClGlSharing, -1, "Add cl-gl extension")

shared/source/os_interface/linux/drm_memory_manager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1839,7 +1839,7 @@ GraphicsAllocation *DrmMemoryManager::createSharedUnifiedMemoryAllocation(const
18391839
createMemoryRegionsForSharedAllocation(*pHwInfo, *memoryInfo, allocationData, memRegions);
18401840

18411841
uint32_t handle = 0;
1842-
auto ret = memoryInfo->createGemExt(&drm, memRegions, size, handle);
1842+
auto ret = memoryInfo->createGemExt(&drm, memRegions, size, handle, std::numeric_limits<uint32_t>::max());
18431843

18441844
if (ret) {
18451845
return nullptr;

shared/source/os_interface/linux/ioctl_helper.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class IoctlHelper {
7171
virtual IoctlHelper *clone() = 0;
7272

7373
virtual bool isVmBindAvailable(Drm *drm) = 0;
74-
virtual uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) = 0;
74+
virtual uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) = 0;
7575
virtual std::vector<MemoryRegion> translateToMemoryRegions(const std::vector<uint8_t> &regionInfo) = 0;
7676
virtual CacheRegion closAlloc(Drm *drm) = 0;
7777
virtual uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) = 0;
@@ -131,7 +131,7 @@ class IoctlHelperUpstream : public IoctlHelper {
131131
IoctlHelper *clone() override;
132132

133133
bool isVmBindAvailable(Drm *drm) override;
134-
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) override;
134+
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) override;
135135
std::vector<MemoryRegion> translateToMemoryRegions(const std::vector<uint8_t> &regionInfo) override;
136136
CacheRegion closAlloc(Drm *drm) override;
137137
uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override;
@@ -187,7 +187,7 @@ class IoctlHelperImpl : public IoctlHelperUpstream {
187187
}
188188
IoctlHelper *clone() override;
189189

190-
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) override;
190+
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) override;
191191
std::vector<MemoryRegion> translateToMemoryRegions(const std::vector<uint8_t> &regionInfo) override;
192192
unsigned int getIoctlRequestValue(DrmIoctl ioctlRequest) override;
193193
};
@@ -197,7 +197,7 @@ class IoctlHelperPrelim20 : public IoctlHelper {
197197
IoctlHelper *clone() override;
198198

199199
bool isVmBindAvailable(Drm *drm) override;
200-
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) override;
200+
uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) override;
201201
std::vector<MemoryRegion> translateToMemoryRegions(const std::vector<uint8_t> &regionInfo) override;
202202
CacheRegion closAlloc(Drm *drm) override;
203203
uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override;

shared/source/os_interface/linux/ioctl_helper_prelim.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ bool IoctlHelperPrelim20::isVmBindAvailable(Drm *drm) {
4040
return vmBindSupported;
4141
}
4242

43-
uint32_t IoctlHelperPrelim20::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) {
43+
uint32_t IoctlHelperPrelim20::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) {
4444
uint32_t regionsSize = static_cast<uint32_t>(memClassInstances.size());
4545
std::vector<prelim_drm_i915_gem_memory_class_instance> regions(regionsSize);
4646
for (uint32_t i = 0; i < regionsSize; i++) {
@@ -56,6 +56,13 @@ uint32_t IoctlHelperPrelim20::createGemExt(Drm *drm, const MemRegionsVec &memCla
5656
setparamRegion.base.name = PRELIM_I915_GEM_CREATE_EXT_SETPARAM;
5757
setparamRegion.param = regionParam;
5858

59+
prelim_drm_i915_gem_create_ext_vm_private vmPrivate{};
60+
if (vmId != std::numeric_limits<uint32_t>::max()) {
61+
vmPrivate.base.name = PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE;
62+
vmPrivate.vm_id = vmId;
63+
setparamRegion.base.next_extension = reinterpret_cast<uintptr_t>(&vmPrivate);
64+
}
65+
5966
prelim_drm_i915_gem_create_ext createExt{};
6067
createExt.size = allocSize;
6168
createExt.extensions = reinterpret_cast<uintptr_t>(&setparamRegion);

shared/source/os_interface/linux/ioctl_helper_upstream.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ bool IoctlHelperUpstream::isVmBindAvailable(Drm *drm) {
2323
return false;
2424
}
2525

26-
uint32_t IoctlHelperUpstream::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) {
26+
uint32_t IoctlHelperUpstream::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) {
2727
uint32_t regionsSize = static_cast<uint32_t>(memClassInstances.size());
2828
std::vector<drm_i915_gem_memory_class_instance> regions(regionsSize);
2929
for (uint32_t i = 0; i < regionsSize; i++) {

shared/source/os_interface/linux/local/dg1/ioctl_helper_dg1.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ IoctlHelper *IoctlHelperImpl<gfxProduct>::clone() {
2323
}
2424

2525
template <>
26-
uint32_t IoctlHelperImpl<gfxProduct>::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) {
27-
auto ret = IoctlHelperUpstream::createGemExt(drm, memClassInstances, allocSize, handle);
26+
uint32_t IoctlHelperImpl<gfxProduct>::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) {
27+
auto ret = IoctlHelperUpstream::createGemExt(drm, memClassInstances, allocSize, handle, vmId);
2828
if (ret == 0) {
2929
return ret;
3030
}

shared/source/os_interface/linux/memory_info.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,18 @@ void MemoryInfo::assignRegionsFromDistances(const std::vector<DistanceInfo> &dis
5353
}
5454
}
5555

56-
uint32_t MemoryInfo::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle) {
57-
return drm->getIoctlHelper()->createGemExt(drm, memClassInstances, allocSize, handle);
56+
uint32_t MemoryInfo::createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId) {
57+
return drm->getIoctlHelper()->createGemExt(drm, memClassInstances, allocSize, handle, vmId);
58+
}
59+
60+
uint32_t MemoryInfo::getTileIndex(uint32_t memoryBank, const HardwareInfo &hwInfo) {
61+
auto &hwHelper = HwHelper::get(hwInfo.platform.eRenderCoreFamily);
62+
auto tileIndex = Math::log2(memoryBank);
63+
tileIndex = hwHelper.isBankOverrideRequired(hwInfo) ? 0 : tileIndex;
64+
if (DebugManager.flags.OverrideDrmRegion.get() != -1) {
65+
tileIndex = DebugManager.flags.OverrideDrmRegion.get();
66+
}
67+
return tileIndex;
5868
}
5969

6070
MemoryClassInstance MemoryInfo::getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo) {
@@ -63,13 +73,7 @@ MemoryClassInstance MemoryInfo::getMemoryRegionClassAndInstance(uint32_t memoryB
6373
return systemMemoryRegion.region;
6474
}
6575

66-
auto index = Math::log2(memoryBank);
67-
68-
index = hwHelper.isBankOverrideRequired(hwInfo) ? 0 : index;
69-
70-
if (DebugManager.flags.OverrideDrmRegion.get() != -1) {
71-
index = DebugManager.flags.OverrideDrmRegion.get();
72-
}
76+
auto index = getTileIndex(memoryBank, hwInfo);
7377

7478
UNRECOVERABLE_IF(index >= localMemoryRegions.size());
7579

@@ -105,7 +109,14 @@ uint32_t MemoryInfo::createGemExtWithSingleRegion(Drm *drm, uint32_t memoryBanks
105109
auto pHwInfo = drm->getRootDeviceEnvironment().getHardwareInfo();
106110
auto regionClassAndInstance = getMemoryRegionClassAndInstance(memoryBanks, *pHwInfo);
107111
MemRegionsVec region = {regionClassAndInstance};
108-
auto ret = createGemExt(drm, region, allocSize, handle);
112+
uint32_t vmId = std::numeric_limits<uint32_t>::max();
113+
if (!drm->isPerContextVMRequired()) {
114+
if (memoryBanks != 0 && DebugManager.flags.EnablePrivateBO.get()) {
115+
auto tileIndex = getTileIndex(memoryBanks, *pHwInfo);
116+
vmId = drm->getVirtualMemoryAddressSpace(tileIndex);
117+
}
118+
}
119+
auto ret = createGemExt(drm, region, allocSize, handle, vmId);
109120
return ret;
110121
}
111122

shared/source/os_interface/linux/memory_info.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@ class MemoryInfo {
2626

2727
void assignRegionsFromDistances(const std::vector<DistanceInfo> &distances);
2828

29-
MOCKABLE_VIRTUAL uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle);
29+
MOCKABLE_VIRTUAL uint32_t createGemExt(Drm *drm, const MemRegionsVec &memClassInstances, size_t allocSize, uint32_t &handle, uint32_t vmId);
3030

3131
MemoryClassInstance getMemoryRegionClassAndInstance(uint32_t memoryBank, const HardwareInfo &hwInfo);
3232

3333
MOCKABLE_VIRTUAL size_t getMemoryRegionSize(uint32_t memoryBank);
3434

3535
void printRegionSizes();
3636

37+
uint32_t getTileIndex(uint32_t memoryBank, const HardwareInfo &hwInfo);
38+
3739
MOCKABLE_VIRTUAL uint32_t createGemExtWithSingleRegion(Drm *drm, uint32_t memoryBanks, size_t allocSize, uint32_t &handle);
3840

3941
const RegionContainer &getDrmRegionInfos() const { return drmQueryRegions; }

shared/test/common/libult/linux/drm_mock_prelim_context.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,14 @@ int DrmMockPrelimContext::handlePrelimRequest(DrmIoctl request, void *arg) {
156156
return EINVAL;
157157
}
158158

159+
prelim_drm_i915_gem_create_ext_vm_private *vmPrivateExt = nullptr;
160+
if (extension->base.next_extension != 0) {
161+
vmPrivateExt = reinterpret_cast<prelim_drm_i915_gem_create_ext_vm_private *>(extension->base.next_extension);
162+
if (vmPrivateExt->base.name != PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE) {
163+
return EINVAL;
164+
}
165+
}
166+
159167
auto data = reinterpret_cast<MemoryClassInstance *>(extension->param.data);
160168
if (!data) {
161169
return EINVAL;
@@ -165,6 +173,9 @@ int DrmMockPrelimContext::handlePrelimRequest(DrmIoctl request, void *arg) {
165173
createExt->handle = createExtHandle;
166174
receivedCreateGemExt = CreateGemExt{createExt->size, createExtHandle};
167175
receivedCreateGemExt->setParamExt = CreateGemExt::SetParam{extension->param.handle, extension->param.size, extension->param.param};
176+
if (vmPrivateExt != nullptr) {
177+
receivedCreateGemExt->vmPrivateExt = CreateGemExt::VmPrivate{vmPrivateExt->vm_id};
178+
}
168179

169180
receivedCreateGemExt->memoryRegions.clear();
170181
for (uint32_t i = 0; i < extension->param.size; i++) {

shared/test/common/libult/linux/drm_mock_prelim_context.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ struct CreateGemExt {
4343
uint16_t memoryInstance{0};
4444
};
4545
std::vector<MemoryClassInstance> memoryRegions{};
46+
47+
struct VmPrivate {
48+
uint32_t vmId{std::numeric_limits<uint32_t>::max()};
49+
};
50+
VmPrivate vmPrivateExt{};
4651
};
4752

4853
struct GemContextParamAcc {

0 commit comments

Comments
 (0)