From aeb5e0d5ad50f094381273ce31412c25239e5cfc Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Fri, 23 Aug 2024 11:03:22 +0000 Subject: [PATCH] fix: pass vm_id to createMediaContext Related-To: NEO-9777 Signed-off-by: Bartosz Dunajski --- .../os_interface/linux/drm_memory_manager.cpp | 3 ++- shared/source/os_interface/linux/ioctl_helper.h | 2 +- shared/test/common/mocks/linux/mock_ioctl_helper.h | 2 +- .../linux/drm_memory_manager_tests.cpp | 14 +++++++++++++- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 9141f1f9b7..379316412c 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -2742,7 +2742,8 @@ bool DrmMemoryManager::releaseInterrupt(uint32_t outHandle, uint32_t rootDeviceI } bool DrmMemoryManager::createMediaContext(uint32_t rootDeviceIndex, void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) { - return getDrm(rootDeviceIndex).getIoctlHelper()->createMediaContext(controlSharedMemoryBuffer, controlSharedMemoryBufferSize, controlBatchBuffer, controlBatchBufferSize, outDoorbell); + auto &drm = getDrm(rootDeviceIndex); + return drm.getIoctlHelper()->createMediaContext(drm.getVirtualMemoryAddressSpace(0), controlSharedMemoryBuffer, controlSharedMemoryBufferSize, controlBatchBuffer, controlBatchBufferSize, outDoorbell); } bool DrmMemoryManager::releaseMediaContext(uint32_t rootDeviceIndex, uint64_t doorbellHandle) { diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 7a6470ff95..47333dd120 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -158,7 +158,7 @@ class IoctlHelper { virtual bool checkIfIoctlReinvokeRequired(int error, DrmIoctl ioctlRequest) const; virtual int createDrmContext(Drm &drm, OsContextLinux &osContext, uint32_t drmVmId, uint32_t deviceIndex, bool allocateInterrupt) = 0; - virtual bool createMediaContext(void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) { return false; } + virtual bool createMediaContext(uint32_t vmId, void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) { return false; } virtual bool releaseMediaContext(uint64_t doorbellHandle) { return false; } virtual uint32_t getNumMediaDecoders() const { return 0; } diff --git a/shared/test/common/mocks/linux/mock_ioctl_helper.h b/shared/test/common/mocks/linux/mock_ioctl_helper.h index bfd5076647..9e9e1227e9 100644 --- a/shared/test/common/mocks/linux/mock_ioctl_helper.h +++ b/shared/test/common/mocks/linux/mock_ioctl_helper.h @@ -35,7 +35,7 @@ class MockIoctlHelper : public IoctlHelperPrelim20 { ADDMETHOD_NOBASE(vmBind, int, 0, (const VmBindParams &)); ADDMETHOD_NOBASE(vmUnbind, int, 0, (const VmBindParams &)); ADDMETHOD_NOBASE(allocateInterrupt, bool, true, (uint32_t &)); - ADDMETHOD_NOBASE(createMediaContext, bool, true, (void *, uint32_t, void *, uint32_t, uint64_t &)); + ADDMETHOD_NOBASE(createMediaContext, bool, true, (uint32_t, void *, uint32_t, void *, uint32_t, uint64_t &)); ADDMETHOD_NOBASE(releaseMediaContext, bool, true, (uint64_t)); ADDMETHOD_CONST_NOBASE(getNumMediaDecoders, uint32_t, 0, ()); ADDMETHOD_CONST_NOBASE(getNumMediaEncoders, uint32_t, 0, ()); diff --git a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp index 305c940b0a..306bf1bc5e 100644 --- a/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/drm_memory_manager_tests.cpp @@ -1757,7 +1757,18 @@ TEST_F(DrmMemoryManagerTest, whenCallingAllocateAndReleaseInterruptThenCallIoctl } TEST_F(DrmMemoryManagerTest, whenCallingCreateAndReleaseMediaContextThenCallIoctlHelper) { - auto mockIoctlHelper = new MockIoctlHelper(*mock); + class MyMockIoctlHelper : public MockIoctlHelper { + public: + using MockIoctlHelper::MockIoctlHelper; + + bool createMediaContext(uint32_t vmId, void *controlSharedMemoryBuffer, uint32_t controlSharedMemoryBufferSize, void *controlBatchBuffer, uint32_t controlBatchBufferSize, uint64_t &outDoorbell) override { + mediaContextVmId = vmId; + return MockIoctlHelper::createMediaContext(vmId, controlSharedMemoryBuffer, controlSharedMemoryBufferSize, controlBatchBuffer, controlBatchBufferSize, outDoorbell); + } + + uint32_t mediaContextVmId = 0; + }; + auto mockIoctlHelper = new MyMockIoctlHelper(*mock); auto &drm = static_cast(memoryManager->getDrm(rootDeviceIndex)); drm.ioctlHelper.reset(mockIoctlHelper); @@ -1769,6 +1780,7 @@ TEST_F(DrmMemoryManagerTest, whenCallingCreateAndReleaseMediaContextThenCallIoct memoryManager->createMediaContext(rootDeviceIndex, nullptr, 0, nullptr, 0, handle); EXPECT_EQ(1u, mockIoctlHelper->createMediaContextCalled); + EXPECT_EQ(mock->getVirtualMemoryAddressSpace(0), mockIoctlHelper->mediaContextVmId); EXPECT_EQ(0u, mockIoctlHelper->releaseMediaContextCalled); memoryManager->releaseMediaContext(rootDeviceIndex, handle);