From 854a77d1cfee3e78aabccb8f368015bdbac2b500 Mon Sep 17 00:00:00 2001 From: Szymon Morek Date: Tue, 14 Dec 2021 09:46:01 +0000 Subject: [PATCH] Move code from drm_query to drm_neo Move methods to drm_neo.cpp and hide kernel-specific implementations to IoctlHelper Related-To: NEO-6510 Signed-off-by: Szymon Morek --- .../linux/ioctl_helper_tests_prelim.cpp | 23 +++++++++++++ shared/source/os_interface/linux/drm_neo.cpp | 19 +++++++++++ .../source/os_interface/linux/drm_query.cpp | 18 ---------- .../source/os_interface/linux/ioctl_helper.h | 9 +++++ .../linux/ioctl_helper_prelim.cpp | 34 +++++++++++++++++++ .../linux/ioctl_helper_upstream.cpp | 11 +++++- 6 files changed, 95 insertions(+), 19 deletions(-) diff --git a/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp b/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp index 71f904308a..ad713594c3 100644 --- a/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp +++ b/opencl/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp @@ -172,3 +172,26 @@ TEST(IoctlHelperTestsPrelim, givenPrelimsAndInvalidIoctlReturnValWhenClosAllocWa EXPECT_EQ(0u, numWays); EXPECT_EQ(1u, drm->ioctlCallsCount); } + +TEST(IoctlHelperTestsPrelim, givenPrelimsWhenWaitUserFenceThenCorrectValueReturned) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + + uint64_t gpuAddress = 0x1020304000ull; + uint64_t value = 0x98765ull; + auto ioctlHelper = IoctlHelper::get(drm.get()); + for (uint32_t i = 0u; i < 4; i++) { + auto ret = ioctlHelper->waitUserFence(drm.get(), 10u, gpuAddress, value, i, -1, 0u); + EXPECT_EQ(0, ret); + } +} + +TEST(IoctlHelperTestsPrelim, givenPrelimsWhenGetHwConfigIoctlValThenCorrectValueReturned) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + auto drm = std::make_unique(*executionEnvironment->rootDeviceEnvironments[0]); + + uint32_t ioctlVal = (1 << 16) | 6; + EXPECT_EQ(ioctlVal, IoctlHelper::get(drm.get())->getHwConfigIoctlVal()); +} diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 16c1280af3..f2e00add83 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -19,6 +19,7 @@ #include "shared/source/os_interface/linux/drm_gem_close_worker.h" #include "shared/source/os_interface/linux/drm_memory_manager.h" #include "shared/source/os_interface/linux/hw_device_id.h" +#include "shared/source/os_interface/linux/ioctl_helper.h" #include "shared/source/os_interface/linux/os_context_linux.h" #include "shared/source/os_interface/linux/os_inc.h" #include "shared/source/os_interface/linux/pci_path.h" @@ -909,4 +910,22 @@ void Drm::getPrelimVersion(std::string &prelimVersion) { ifs.close(); } +int Drm::waitUserFence(uint32_t ctxId, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags) { + return IoctlHelper::get(this)->waitUserFence(this, ctxId, address, value, static_cast(dataWidth), timeout, flags); +} + +bool Drm::querySystemInfo() { + auto length = 0; + auto request = IoctlHelper::get(this)->getHwConfigIoctlVal(); + auto deviceBlobQuery = this->query(request, DrmQueryItemFlags::empty, length); + auto deviceBlob = reinterpret_cast(deviceBlobQuery.get()); + if (!deviceBlob) { + PRINT_DEBUG_STRING(DebugManager.flags.PrintDebugMessages.get(), stdout, "%s", "INFO: System Info query failed!\n"); + return false; + } + this->systemInfo.reset(new SystemInfo(deviceBlob, length)); + + return true; +} + } // namespace NEO diff --git a/shared/source/os_interface/linux/drm_query.cpp b/shared/source/os_interface/linux/drm_query.cpp index 5e66bb8c59..a4f99ee1fd 100644 --- a/shared/source/os_interface/linux/drm_query.cpp +++ b/shared/source/os_interface/linux/drm_query.cpp @@ -107,20 +107,6 @@ bool Drm::isDebugAttachAvailable() { return false; } -bool Drm::querySystemInfo() { - auto length = 0; - - auto deviceBlobQuery = this->query(DRM_I915_QUERY_HWCONFIG_TABLE, DrmQueryItemFlags::empty, length); - auto deviceBlob = reinterpret_cast(deviceBlobQuery.get()); - if (!deviceBlob) { - PRINT_DEBUG_STRING(DebugManager.flags.PrintDebugMessages.get(), stdout, "%s", "INFO: System Info query failed!\n"); - return false; - } - this->systemInfo.reset(new SystemInfo(deviceBlob, length)); - - return true; -} - void Drm::setupCacheInfo(const HardwareInfo &hwInfo) { this->cacheInfo.reset(new CacheInfoImpl()); } @@ -136,10 +122,6 @@ int Drm::unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObj void Drm::waitForBind(uint32_t vmHandleId) { } -int Drm::waitUserFence(uint32_t ctx, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags) { - return 0; -} - bool Drm::isVmBindAvailable() { return this->bindAvailable; } diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index de7e671447..bebfd628c4 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -30,6 +30,9 @@ class IoctlHelper { virtual CacheRegion closAlloc(Drm *drm) = 0; virtual uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) = 0; virtual CacheRegion closFree(Drm *drm, CacheRegion closIndex) = 0; + virtual int waitUserFence(Drm *drm, uint32_t ctxId, uint64_t address, + uint64_t value, uint32_t dataWidth, int64_t timeout, uint16_t flags) = 0; + virtual uint32_t getHwConfigIoctlVal() = 0; }; class IoctlHelperUpstream : public IoctlHelper { @@ -39,6 +42,9 @@ class IoctlHelperUpstream : public IoctlHelper { CacheRegion closAlloc(Drm *drm) override; uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override; CacheRegion closFree(Drm *drm, CacheRegion closIndex) override; + int waitUserFence(Drm *drm, uint32_t ctxId, uint64_t address, + uint64_t value, uint32_t dataWidth, int64_t timeout, uint16_t flags) override; + uint32_t getHwConfigIoctlVal() override; }; template @@ -59,6 +65,9 @@ class IoctlHelperPrelim20 : public IoctlHelper { CacheRegion closAlloc(Drm *drm) override; uint16_t closAllocWays(Drm *drm, CacheRegion closIndex, uint16_t cacheLevel, uint16_t numWays) override; CacheRegion closFree(Drm *drm, CacheRegion closIndex) override; + int waitUserFence(Drm *drm, uint32_t ctxId, uint64_t address, + uint64_t value, uint32_t dataWidth, int64_t timeout, uint16_t flags) override; + uint32_t getHwConfigIoctlVal() override; }; } // namespace NEO diff --git a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp index e92a72474d..74a3100a7a 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -101,4 +101,38 @@ CacheRegion IoctlHelperPrelim20::closFree(Drm *drm, CacheRegion closIndex) { return closIndex; } +int IoctlHelperPrelim20::waitUserFence(Drm *drm, uint32_t ctxId, uint64_t address, + uint64_t value, uint32_t dataWidth, int64_t timeout, uint16_t flags) { + prelim_drm_i915_gem_wait_user_fence wait = {}; + + wait.ctx_id = ctxId; + wait.flags = flags; + + switch (dataWidth) { + case 3u: + wait.mask = PRELIM_I915_UFENCE_WAIT_U64; + break; + case 2u: + wait.mask = PRELIM_I915_UFENCE_WAIT_U32; + break; + case 1u: + wait.mask = PRELIM_I915_UFENCE_WAIT_U16; + break; + default: + wait.mask = PRELIM_I915_UFENCE_WAIT_U8; + break; + } + + wait.op = PRELIM_I915_UFENCE_WAIT_GTE; + wait.addr = address; + wait.value = value; + wait.timeout = timeout; + + return IoctlHelper::ioctl(drm, PRELIM_DRM_IOCTL_I915_GEM_WAIT_USER_FENCE, &wait); +} + +uint32_t IoctlHelperPrelim20::getHwConfigIoctlVal() { + return PRELIM_DRM_I915_QUERY_HWCONFIG_TABLE; +} + } // namespace NEO diff --git a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp index 38d152f6e1..88c54b0da5 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -14,7 +14,7 @@ namespace NEO { uint32_t IoctlHelperUpstream::createGemExt(Drm *drm, void *data, uint32_t dataSize, size_t allocSize, uint32_t &handle) { - drm_i915_gem_create_ext_memory_regions memRegions; + drm_i915_gem_create_ext_memory_regions memRegions{}; memRegions.num_regions = dataSize; memRegions.regions = reinterpret_cast(data); memRegions.base.name = I915_GEM_CREATE_EXT_MEMORY_REGIONS; @@ -58,4 +58,13 @@ CacheRegion IoctlHelperUpstream::closFree(Drm *drm, CacheRegion closIndex) { return CacheRegion::None; } +int IoctlHelperUpstream::waitUserFence(Drm *drm, uint32_t ctxId, uint64_t address, + uint64_t value, uint32_t dataWidth, int64_t timeout, uint16_t flags) { + return 0; +} + +uint32_t IoctlHelperUpstream::getHwConfigIoctlVal() { + return DRM_I915_QUERY_HWCONFIG_TABLE; +} + } // namespace NEO