From 2f63131f0d6e786362d40d6c1dc179393ae232bc Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Thu, 19 May 2022 16:56:01 +0000 Subject: [PATCH] Create wrappers for drm_i915_gem_mmap and drm_i915_gem_mmap_offset Related-To: NEO-6852 Signed-off-by: Mateusz Jablonski --- .../os_interface/linux/drm_memory_manager.cpp | 10 +++++----- .../source/os_interface/linux/drm_wrappers.cpp | 14 ++++++++++++++ shared/source/os_interface/linux/drm_wrappers.h | 16 ++++++++++++++++ shared/test/common/libult/linux/drm_mock.cpp | 4 ++-- .../libult/linux/drm_mock_prelim_context.cpp | 2 +- .../linux/device_command_stream_fixture.cpp | 6 +++--- .../unit_test/os_interface/linux/drm_mock_impl.h | 2 +- 7 files changed, 42 insertions(+), 12 deletions(-) diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 155a3858f8..cb75d4c3cc 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -853,13 +853,13 @@ GraphicsAllocation *DrmMemoryManager::createPaddedAllocation(GraphicsAllocation auto drmInputAllocation = static_cast(inputGraphicsAllocation); if (drmInputAllocation->getMmapPtr()) { auto bo = drmInputAllocation->getBO(); - drm_i915_gem_mmap mmapArg = {}; + GemMmap mmapArg = {}; mmapArg.handle = bo->peekHandle(); mmapArg.size = bo->peekSize(); if (getDrm(rootDeviceIndex).ioctl(DRM_IOCTL_I915_GEM_MMAP, &mmapArg) != 0) { return nullptr; } - srcPtr = addrToPtr(mmapArg.addr_ptr); + srcPtr = addrToPtr(mmapArg.addrPtr); inputGraphicsAllocation->lock(srcPtr); } else { srcPtr = inputGraphicsAllocation->getUnderlyingBuffer(); @@ -1099,14 +1099,14 @@ void *DrmMemoryManager::lockResourceImpl(GraphicsAllocation &graphicsAllocation) if (bo == nullptr) return nullptr; - drm_i915_gem_mmap mmapArg = {}; + GemMmap mmapArg = {}; mmapArg.handle = bo->peekHandle(); mmapArg.size = bo->peekSize(); if (getDrm(graphicsAllocation.getRootDeviceIndex()).ioctl(DRM_IOCTL_I915_GEM_MMAP, &mmapArg) != 0) { return nullptr; } - bo->setLockedAddress(reinterpret_cast(mmapArg.addr_ptr)); + bo->setLockedAddress(reinterpret_cast(mmapArg.addrPtr)); [[maybe_unused]] auto success = setDomainCpu(graphicsAllocation, false); DEBUG_BREAK_IF(!success); @@ -1634,7 +1634,7 @@ bool DrmMemoryManager::createDrmAllocation(Drm *drm, DrmAllocation *allocation, bool DrmMemoryManager::retrieveMmapOffsetForBufferObject(uint32_t rootDeviceIndex, BufferObject &bo, uint64_t flags, uint64_t &offset) { constexpr uint64_t mmapOffsetFixed = 4; - drm_i915_gem_mmap_offset mmapOffset = {}; + GemMmapOffset mmapOffset = {}; mmapOffset.handle = bo.peekHandle(); mmapOffset.flags = isLocalMemorySupported(rootDeviceIndex) ? mmapOffsetFixed : flags; auto &drm = getDrm(rootDeviceIndex); diff --git a/shared/source/os_interface/linux/drm_wrappers.cpp b/shared/source/os_interface/linux/drm_wrappers.cpp index 4582d0e45c..1425ffcebb 100644 --- a/shared/source/os_interface/linux/drm_wrappers.cpp +++ b/shared/source/os_interface/linux/drm_wrappers.cpp @@ -78,4 +78,18 @@ static_assert(sizeof(MemoryClassInstance) == sizeof(drm_i915_gem_memory_class_in static_assert(offsetof(MemoryClassInstance, memoryClass) == offsetof(drm_i915_gem_memory_class_instance, memory_class)); static_assert(offsetof(MemoryClassInstance, memoryInstance) == offsetof(drm_i915_gem_memory_class_instance, memory_instance)); +static_assert(sizeof(GemMmapOffset) == sizeof(drm_i915_gem_mmap_offset)); +static_assert(offsetof(GemMmapOffset, handle) == offsetof(drm_i915_gem_mmap_offset, handle)); +static_assert(offsetof(GemMmapOffset, pad) == offsetof(drm_i915_gem_mmap_offset, pad)); +static_assert(offsetof(GemMmapOffset, offset) == offsetof(drm_i915_gem_mmap_offset, offset)); +static_assert(offsetof(GemMmapOffset, flags) == offsetof(drm_i915_gem_mmap_offset, flags)); +static_assert(offsetof(GemMmapOffset, extensions) == offsetof(drm_i915_gem_mmap_offset, extensions)); + +static_assert(sizeof(GemMmap) == sizeof(drm_i915_gem_mmap)); +static_assert(offsetof(GemMmap, handle) == offsetof(drm_i915_gem_mmap, handle)); +static_assert(offsetof(GemMmap, pad) == offsetof(drm_i915_gem_mmap, pad)); +static_assert(offsetof(GemMmap, offset) == offsetof(drm_i915_gem_mmap, offset)); +static_assert(offsetof(GemMmap, size) == offsetof(drm_i915_gem_mmap, size)); +static_assert(offsetof(GemMmap, addrPtr) == offsetof(drm_i915_gem_mmap, addr_ptr)); +static_assert(offsetof(GemMmap, flags) == offsetof(drm_i915_gem_mmap, flags)); } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_wrappers.h b/shared/source/os_interface/linux/drm_wrappers.h index f2ad6a08b2..5cde4ce5c9 100644 --- a/shared/source/os_interface/linux/drm_wrappers.h +++ b/shared/source/os_interface/linux/drm_wrappers.h @@ -88,4 +88,20 @@ struct MemoryClassInstance { uint16_t memoryInstance; }; +struct GemMmapOffset { + uint32_t handle; + uint32_t pad; + uint64_t offset; + uint64_t flags; + uint64_t extensions; +}; + +struct GemMmap { + uint32_t handle; + uint32_t pad; + uint64_t offset; + uint64_t size; + uint64_t addrPtr; + uint64_t flags; +}; } // namespace NEO diff --git a/shared/test/common/libult/linux/drm_mock.cpp b/shared/test/common/libult/linux/drm_mock.cpp index f58486a67d..ab4e765ec2 100644 --- a/shared/test/common/libult/linux/drm_mock.cpp +++ b/shared/test/common/libult/linux/drm_mock.cpp @@ -211,8 +211,8 @@ int DrmMock::ioctl(unsigned long request, void *arg) { } if (request == DRM_IOCTL_I915_GEM_MMAP) { ioctlCount.gemMmap++; - auto mmapArg = static_cast(arg); - mmapArg->addr_ptr = reinterpret_cast<__u64>(lockedPtr); + auto mmapArg = static_cast(arg); + mmapArg->addrPtr = reinterpret_cast(lockedPtr); return 0; } if (request == DRM_IOCTL_I915_GEM_WAIT) { diff --git a/shared/test/common/libult/linux/drm_mock_prelim_context.cpp b/shared/test/common/libult/linux/drm_mock_prelim_context.cpp index d9d3c24845..98a99bac32 100644 --- a/shared/test/common/libult/linux/drm_mock_prelim_context.cpp +++ b/shared/test/common/libult/linux/drm_mock_prelim_context.cpp @@ -69,7 +69,7 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg) return 0; } break; case DRM_IOCTL_I915_GEM_MMAP_OFFSET: { - auto mmapArg = static_cast(arg); + auto mmapArg = static_cast(arg); mmapArg->offset = 0; return mmapOffsetReturn; } break; diff --git a/shared/test/common/os_interface/linux/device_command_stream_fixture.cpp b/shared/test/common/os_interface/linux/device_command_stream_fixture.cpp index 950a67a5f4..3980958e7b 100644 --- a/shared/test/common/os_interface/linux/device_command_stream_fixture.cpp +++ b/shared/test/common/os_interface/linux/device_command_stream_fixture.cpp @@ -122,13 +122,13 @@ int DrmMockCustom::ioctl(unsigned long request, void *arg) { ioctl_cnt.handleToPrimeFd++; } break; case DRM_IOCTL_I915_GEM_MMAP: { - auto mmapParams = (drm_i915_gem_mmap *)arg; + auto mmapParams = static_cast(arg); mmapHandle = mmapParams->handle; mmapPad = mmapParams->pad; mmapOffset = mmapParams->offset; mmapSize = mmapParams->size; mmapFlags = mmapParams->flags; - mmapParams->addr_ptr = mmapAddrPtr; + mmapParams->addrPtr = mmapAddrPtr; ioctl_cnt.gemMmap++; } break; case DRM_IOCTL_I915_GEM_SET_DOMAIN: { @@ -178,7 +178,7 @@ int DrmMockCustom::ioctl(unsigned long request, void *arg) { ioctl_cnt.contextDestroy++; } break; case DRM_IOCTL_I915_GEM_MMAP_OFFSET: { - auto mmapOffsetParams = reinterpret_cast(arg); + auto mmapOffsetParams = reinterpret_cast(arg); mmapOffsetParams->handle = mmapOffsetHandle; mmapOffsetParams->offset = mmapOffsetExpected; mmapOffsetFlags = mmapOffsetParams->flags; diff --git a/shared/test/unit_test/os_interface/linux/drm_mock_impl.h b/shared/test/unit_test/os_interface/linux/drm_mock_impl.h index e032805c6f..67d485e7a3 100644 --- a/shared/test/unit_test/os_interface/linux/drm_mock_impl.h +++ b/shared/test/unit_test/os_interface/linux/drm_mock_impl.h @@ -56,7 +56,7 @@ class DrmTipMock : public DrmMock { } return 0; } else if (request == DRM_IOCTL_I915_GEM_MMAP_OFFSET) { - auto mmapArg = static_cast(arg); + auto mmapArg = static_cast(arg); mmapOffsetFlagsReceived = mmapArg->flags; mmapArg->offset = offset; return mmapOffsetRetVal;