diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index a94759ff7c..3d78870bb7 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -12,6 +12,7 @@ #include "shared/source/direct_submission/linux/drm_direct_submission.h" #include "shared/source/os_interface/linux/drm_allocation.h" #include "shared/source/os_interface/linux/drm_buffer_object.h" +#include "shared/source/os_interface/linux/drm_memory_manager.h" #include "shared/source/os_interface/linux/drm_memory_operations_handler.h" #include "shared/source/os_interface/linux/drm_neo.h" #include "shared/source/os_interface/linux/drm_wrappers.h" @@ -48,6 +49,10 @@ DrmDirectSubmission::DrmDirectSubmission(const DirectSubm auto &drm = osContextLinux->getDrm(); drm.setDirectSubmissionActive(true); + if (!drm.isVmBindAvailable()) { + static_cast(this->memoryManager)->disableForcePin(); + } + auto usePciBarrier = !this->hwInfo->capabilityTable.isIntegratedDevice; if (debugManager.flags.DirectSubmissionPCIBarrier.get() != -1) { usePciBarrier = debugManager.flags.DirectSubmissionPCIBarrier.get(); diff --git a/shared/source/os_interface/linux/drm_memory_manager.cpp b/shared/source/os_interface/linux/drm_memory_manager.cpp index 1d5db7b60b..55b3f07d0b 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.cpp +++ b/shared/source/os_interface/linux/drm_memory_manager.cpp @@ -1775,6 +1775,10 @@ void DrmMemoryManager::drainGemCloseWorker() const { } } +void DrmMemoryManager::disableForcePin() { + this->forcePinEnabled = false; +} + bool DrmMemoryManager::copyMemoryToAllocation(GraphicsAllocation *graphicsAllocation, size_t destinationOffset, const void *memoryToCopy, size_t sizeToCopy) { if (graphicsAllocation->getUnderlyingBuffer() && (graphicsAllocation->storageInfo.getNumBanks() == 1 || GraphicsAllocation::isDebugSurfaceAllocationType(graphicsAllocation->getAllocationType()))) { return MemoryManager::copyMemoryToAllocation(graphicsAllocation, destinationOffset, memoryToCopy, sizeToCopy); diff --git a/shared/source/os_interface/linux/drm_memory_manager.h b/shared/source/os_interface/linux/drm_memory_manager.h index 9fa74fd589..5a5e7a0dd4 100644 --- a/shared/source/os_interface/linux/drm_memory_manager.h +++ b/shared/source/os_interface/linux/drm_memory_manager.h @@ -130,6 +130,7 @@ class DrmMemoryManager : public MemoryManager { size_t getUserptrAlignment(); void drainGemCloseWorker() const override; + void disableForcePin(); decltype(&mmap) mmapFunction = mmap; decltype(&munmap) munmapFunction = munmap; diff --git a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp index 18120205ef..9026f49702 100644 --- a/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp +++ b/shared/test/unit_test/direct_submission/linux/drm_direct_submission_tests.cpp @@ -108,6 +108,26 @@ struct MockDrmDirectSubmission : public DrmDirectSubmission(executionEnvironment.memoryManager.get())->forcePinEnabled); + auto drm = static_cast(executionEnvironment.rootDeviceEnvironments[0]->osInterface->getDriverModel()->as()); + drm->bindAvailable = false; + MockDrmDirectSubmission> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + EXPECT_FALSE(static_cast(executionEnvironment.memoryManager.get())->forcePinEnabled); +} + +HWTEST_F(DrmDirectSubmissionTest, whenCreateDrmDirectSubmissionThenEnableForcePin) { + EXPECT_TRUE(static_cast(executionEnvironment.memoryManager.get())->forcePinEnabled); + auto drm = static_cast(executionEnvironment.rootDeviceEnvironments[0]->osInterface->getDriverModel()->as()); + drm->bindAvailable = true; + MockDrmDirectSubmission> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver); + EXPECT_TRUE(static_cast(executionEnvironment.memoryManager.get())->forcePinEnabled); +} + HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenCallingLinuxImplementationThenExpectInitialImplementationValues) { MockDrmDirectSubmission> drmDirectSubmission(*device->getDefaultEngine().commandStreamReceiver);