diff --git a/shared/source/direct_submission/linux/drm_direct_submission.inl b/shared/source/direct_submission/linux/drm_direct_submission.inl index 3697afe409..281dfb8f4c 100644 --- a/shared/source/direct_submission/linux/drm_direct_submission.inl +++ b/shared/source/direct_submission/linux/drm_direct_submission.inl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020 Intel Corporation + * Copyright (C) 2020-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -24,7 +24,11 @@ inline std::unique_ptr> DirectSubmissi template DrmDirectSubmission::DrmDirectSubmission(Device &device, OsContext &osContext) - : DirectSubmissionHw(device, osContext){}; + : DirectSubmissionHw(device, osContext) { + + auto osContextLinux = static_cast(&this->osContext); + osContextLinux->getDrm().setDirectSubmissionActive(true); +}; template inline DrmDirectSubmission::~DrmDirectSubmission() { @@ -55,6 +59,8 @@ bool DrmDirectSubmission::submit(uint64_t gpuAddress, siz drm_i915_gem_exec_object2 execObject{}; + this->handleResidency(); + bool ret = false; uint32_t drmContextId = 0u; for (auto drmIterator = 0u; drmIterator < osContextLinux->getDeviceBitfield().size(); drmIterator++) { @@ -78,6 +84,8 @@ bool DrmDirectSubmission::submit(uint64_t gpuAddress, siz template bool DrmDirectSubmission::handleResidency() { + auto osContextLinux = static_cast(&this->osContext); + osContextLinux->waitForPagingFence(); return true; } diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 54a72245fb..09ab634e81 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -60,6 +60,8 @@ constexpr const char *getIoctlParamString(int param) { } // namespace IoctlHelper Drm::Drm(std::unique_ptr hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment) : hwDeviceId(std::move(hwDeviceIdIn)), rootDeviceEnvironment(rootDeviceEnvironment) { + pagingFence.fill(0u); + fenceVal.fill(0u); } int Drm::ioctl(unsigned long request, void *arg) { diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index b7c16da734..7de52422f1 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -15,6 +15,7 @@ #include "shared/source/utilities/stackvec.h" #include "drm/i915_drm.h" +#include "engine_limits.h" #include "engine_node.h" #include "igfxfmid.h" @@ -125,6 +126,9 @@ class Drm { bool isContextDebugSupported() { return contextDebugSupported; } MOCKABLE_VIRTUAL void setContextDebugFlag(uint32_t drmContextId); + void setDirectSubmissionActive(bool value) { this->directSubmissionActive = value; } + bool isDirectSubmissionActive() { return this->directSubmissionActive; } + MOCKABLE_VIRTUAL bool isVmBindAvailable(); MOCKABLE_VIRTUAL bool registerResourceClasses(); @@ -169,6 +173,10 @@ class Drm { return hwDeviceId->getPciPath(); } + void waitForBind(uint32_t vmHandleId); + uint64_t getNextFenceVal(uint32_t vmHandleId) { return ++fenceVal[vmHandleId]; } + uint64_t *getFenceAddr(uint32_t vmHandleId) { return &pagingFence[vmHandleId]; } + protected: int getQueueSliceCount(drm_i915_gem_context_param_sseu *sseu); bool translateTopologyInfo(const drm_i915_query_topology_info *queryTopologyInfo, int &sliceCount, int &subSliceCount, int &euCount); @@ -180,6 +188,7 @@ class Drm { bool nonPersistentContextsSupported = false; bool requirePerContextVM = false; bool bindAvailable = false; + bool directSubmissionActive = false; bool contextDebugSupported = false; std::once_flag checkBindOnce; std::unique_ptr hwDeviceId; @@ -196,6 +205,9 @@ class Drm { std::unique_ptr memoryInfo; std::vector virtualMemoryIds; + std::array pagingFence; + std::array fenceVal; + std::string getSysFsPciPath(); std::unique_ptr query(uint32_t queryId, uint32_t queryItemFlags, int32_t &length); diff --git a/shared/source/os_interface/linux/drm_query.cpp b/shared/source/os_interface/linux/drm_query.cpp index 2e42f98a34..49f614196f 100644 --- a/shared/source/os_interface/linux/drm_query.cpp +++ b/shared/source/os_interface/linux/drm_query.cpp @@ -63,6 +63,9 @@ int Drm::unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObj return 0; } +void Drm::waitForBind(uint32_t vmHandleId) { +} + bool Drm::isVmBindAvailable() { return this->bindAvailable; } diff --git a/shared/source/os_interface/linux/drm_query_dg1.cpp b/shared/source/os_interface/linux/drm_query_dg1.cpp index 2cf828e646..7f2a9ba28b 100644 --- a/shared/source/os_interface/linux/drm_query_dg1.cpp +++ b/shared/source/os_interface/linux/drm_query_dg1.cpp @@ -72,6 +72,9 @@ int Drm::unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObj return 0; } +void Drm::waitForBind(uint32_t vmHandleId) { +} + bool Drm::isVmBindAvailable() { return this->bindAvailable; } diff --git a/shared/source/os_interface/linux/os_context_linux.cpp b/shared/source/os_interface/linux/os_context_linux.cpp index 803c736204..ba550335b3 100644 --- a/shared/source/os_interface/linux/os_context_linux.cpp +++ b/shared/source/os_interface/linux/os_context_linux.cpp @@ -64,6 +64,14 @@ Drm &OsContextLinux::getDrm() const { return this->drm; } +void OsContextLinux::waitForPagingFence() { + for (auto drmIterator = 0u; drmIterator < this->deviceBitfield.size(); drmIterator++) { + if (this->deviceBitfield.test(drmIterator)) { + drm.waitForBind(drmIterator); + } + } +} + OsContextLinux::~OsContextLinux() { for (auto drmContextId : drmContextIds) { drm.destroyDrmContext(drmContextId); diff --git a/shared/source/os_interface/linux/os_context_linux.h b/shared/source/os_interface/linux/os_context_linux.h index c1a9d0c77a..6bebad42ce 100644 --- a/shared/source/os_interface/linux/os_context_linux.h +++ b/shared/source/os_interface/linux/os_context_linux.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -26,6 +26,7 @@ class OsContextLinux : public OsContext { const std::vector &getDrmContextIds() const { return drmContextIds; } const std::vector &getDrmVmIds() const { return drmVmIds; } Drm &getDrm() const; + void waitForPagingFence(); protected: unsigned int engineFlag = 0; 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 9445ceb5f1..61bcf49e28 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 @@ -88,9 +88,9 @@ HWTEST_F(DrmDirectSubmissionTest, givenDrmDirectSubmissionWhenDestructObjectThen auto drmDirectSubmission = std::make_unique>>(*device.get(), *osContext.get()); auto drm = static_cast(executionEnvironment.rootDeviceEnvironments[0]->osInterface->get()->getDrm()); - drm->ioctlCallsCount = 0u; drmDirectSubmission->initialize(true); + drm->ioctlCallsCount = 0u; drmDirectSubmission.reset(); - EXPECT_EQ(drm->ioctlCallsCount, 11u); + EXPECT_EQ(drm->ioctlCallsCount, 7u); }