diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index c33602612e..5bf4e4f5b4 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -1037,7 +1037,11 @@ void Drm::queryPageFaultSupport() { return; } - pageFaultSupported = this->ioctlHelper->isPageFaultSupported(); + if (const auto paramId = ioctlHelper->getHasPageFaultParamId(); paramId) { + int support = 0; + const auto ret = getParamIoctl(*paramId, &support); + pageFaultSupported = (0 == ret) && (support > 0); + } } bool Drm::hasPageFaultSupport() const { diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index df9d44ae03..2022172681 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -123,7 +123,7 @@ class IoctlHelper { virtual uint16_t getWaitUserFenceSoftFlag() = 0; virtual int execBuffer(ExecBuffer *execBuffer, uint64_t completionGpuAddress, TaskCountType counterValue) = 0; virtual bool completionFenceExtensionSupported(const bool isVmBindAvailable) = 0; - virtual bool isPageFaultSupported() = 0; + virtual std::optional getHasPageFaultParamId() = 0; virtual std::unique_ptr createVmControlExtRegion(const std::optional ®ionInstanceClass) = 0; virtual uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) = 0; virtual uint32_t createContextWithAccessCounters(GemContextCreateExt &gcc) = 0; @@ -274,7 +274,7 @@ class IoctlHelperUpstream : public IoctlHelperI915 { uint16_t getWaitUserFenceSoftFlag() override; int execBuffer(ExecBuffer *execBuffer, uint64_t completionGpuAddress, TaskCountType counterValue) override; bool completionFenceExtensionSupported(const bool isVmBindAvailable) override; - bool isPageFaultSupported() override; + std::optional getHasPageFaultParamId() override; std::unique_ptr createVmControlExtRegion(const std::optional ®ionInstanceClass) override; uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) override; uint32_t createContextWithAccessCounters(GemContextCreateExt &gcc) override; @@ -352,7 +352,7 @@ class IoctlHelperPrelim20 : public IoctlHelperI915 { uint16_t getWaitUserFenceSoftFlag() override; int execBuffer(ExecBuffer *execBuffer, uint64_t completionGpuAddress, TaskCountType counterValue) override; bool completionFenceExtensionSupported(const bool isVmBindAvailable) override; - bool isPageFaultSupported() override; + std::optional getHasPageFaultParamId() override; std::unique_ptr createVmControlExtRegion(const std::optional ®ionInstanceClass) override; uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) override; uint32_t createContextWithAccessCounters(GemContextCreateExt &gcc) override; diff --git a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp index 2c5dd1820d..93eb836226 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -557,19 +557,8 @@ int IoctlHelperPrelim20::queryDistances(std::vector &queryItems, std: return ret; } -bool IoctlHelperPrelim20::isPageFaultSupported() { - int pagefaultSupport{}; - GetParam getParam{}; - getParam.param = PRELIM_I915_PARAM_HAS_PAGE_FAULT; - getParam.value = &pagefaultSupport; - - int retVal = ioctl(DrmIoctl::getparam, &getParam); - if (debugManager.flags.PrintIoctlEntries.get()) { - printf("DRM_IOCTL_I915_GETPARAM: param: PRELIM_I915_PARAM_HAS_PAGE_FAULT, output value: %d, retCode:% d\n", - *getParam.value, - retVal); - } - return (retVal == 0) && (pagefaultSupport > 0); +std::optional IoctlHelperPrelim20::getHasPageFaultParamId() { + return DrmParam::paramHasPageFault; }; bool IoctlHelperPrelim20::getEuStallProperties(std::array &properties, uint64_t dssBufferSize, uint64_t samplingRate, diff --git a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp index ad8dbbe33e..858abd7982 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -191,8 +191,8 @@ bool IoctlHelperUpstream::completionFenceExtensionSupported(const bool isVmBindA return false; } -bool IoctlHelperUpstream::isPageFaultSupported() { - return false; +std::optional IoctlHelperUpstream::getHasPageFaultParamId() { + return std::nullopt; }; bool IoctlHelperUpstream::getEuStallProperties(std::array &properties, uint64_t dssBufferSize, diff --git a/shared/source/os_interface/linux/xe/CMakeLists.txt b/shared/source/os_interface/linux/xe/CMakeLists.txt index ee7abf3224..b39333f36a 100644 --- a/shared/source/os_interface/linux/xe/CMakeLists.txt +++ b/shared/source/os_interface/linux/xe/CMakeLists.txt @@ -11,7 +11,7 @@ set(NEO_CORE_OS_INTERFACE_LINUX_XE ${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe.h ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_query_hw_ip_version.cpp - ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_query_features.cpp + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_vm_bind_flags.cpp ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_perf.cpp ) diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp index dab06f21c3..d7957f1d0d 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.cpp @@ -794,10 +794,9 @@ int IoctlHelperXe::queryDistances(std::vector &queryItems, std::vecto return 0; } -bool IoctlHelperXe::isPageFaultSupported() { - xeLog(" -> IoctlHelperXe::%s %d\n", __FUNCTION__, supportedFeatures.flags.pageFault == true); - - return supportedFeatures.flags.pageFault; +std::optional IoctlHelperXe::getHasPageFaultParamId() { + xeLog(" -> IoctlHelperXe::%s\n", __FUNCTION__); + return {}; }; uint32_t IoctlHelperXe::getEuStallFdParameter() { diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h index 2cd35ffe28..201fbc1217 100644 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe.h +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe.h @@ -65,7 +65,7 @@ class IoctlHelperXe : public IoctlHelper { uint16_t getWaitUserFenceSoftFlag() override; int execBuffer(ExecBuffer *execBuffer, uint64_t completionGpuAddress, TaskCountType counterValue) override; bool completionFenceExtensionSupported(const bool isVmBindAvailable) override; - bool isPageFaultSupported() override; + std::optional getHasPageFaultParamId() override; std::unique_ptr createVmControlExtRegion(const std::optional ®ionInstanceClass) override; uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) override; uint32_t createContextWithAccessCounters(GemContextCreateExt &gcc) override; @@ -212,8 +212,7 @@ class IoctlHelperXe : public IoctlHelper { struct { uint32_t vmBindReadOnly : 1; uint32_t vmBindImmediate : 1; - uint32_t pageFault : 1; - uint32_t reserved : 29; + uint32_t reserved : 30; } flags; uint32_t allFlags = 0; }; diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe_query_features.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe_query_features.cpp deleted file mode 100644 index e0a377824a..0000000000 --- a/shared/source/os_interface/linux/xe/ioctl_helper_xe_query_features.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2024 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/source/os_interface/linux/xe/ioctl_helper_xe.h" - -#include "xe_drm.h" - -namespace NEO { -void IoctlHelperXe::querySupportedFeatures() { - auto checkVmCreateFlagsSupport = [&](uint32_t flags) -> bool { - struct drm_xe_vm_create vmCreate = {}; - vmCreate.flags = flags; - - auto ret = IoctlHelper::ioctl(DrmIoctl::gemVmCreate, &vmCreate); - if (ret == 0) { - struct drm_xe_vm_destroy vmDestroy = {}; - vmDestroy.vm_id = vmCreate.vm_id; - ret = IoctlHelper::ioctl(DrmIoctl::gemVmDestroy, &vmDestroy); - DEBUG_BREAK_IF(ret != 0); - return true; - } - return false; - }; - supportedFeatures.flags.pageFault = checkVmCreateFlagsSupport(DRM_XE_VM_CREATE_FLAG_LR_MODE | DRM_XE_VM_CREATE_FLAG_FAULT_MODE); -}; - -uint64_t IoctlHelperXe::getAdditionalFlagsForVmBind(bool bindImmediate, bool readOnlyResource) { - return 0; -} -} // namespace NEO \ No newline at end of file diff --git a/shared/source/os_interface/linux/xe/ioctl_helper_xe_vm_bind_flags.cpp b/shared/source/os_interface/linux/xe/ioctl_helper_xe_vm_bind_flags.cpp new file mode 100644 index 0000000000..aaafec3f61 --- /dev/null +++ b/shared/source/os_interface/linux/xe/ioctl_helper_xe_vm_bind_flags.cpp @@ -0,0 +1,16 @@ +/* + * Copyright (C) 2024 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/os_interface/linux/xe/ioctl_helper_xe.h" + +namespace NEO { +void IoctlHelperXe::querySupportedFeatures(){}; + +uint64_t IoctlHelperXe::getAdditionalFlagsForVmBind(bool bindImmediate, bool readOnlyResource) { + return 0; +} +} // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/os_interface/linux/xe/CMakeLists.txt b/shared/test/unit_test/os_interface/linux/xe/CMakeLists.txt index 0f471a9aae..4ed9936794 100644 --- a/shared/test/unit_test/os_interface/linux/xe/CMakeLists.txt +++ b/shared/test/unit_test/os_interface/linux/xe/CMakeLists.txt @@ -9,7 +9,6 @@ set(NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE ${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/ioctl_helper_xe_perf_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe_tests.h - ${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_xe_query_features_tests.cpp ) if(NEO_ENABLE_XE_EU_DEBUG_SUPPORT) list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX_XE diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_query_features_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_query_features_tests.cpp deleted file mode 100644 index 7e04c341b4..0000000000 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_query_features_tests.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 Intel Corporation - * - * SPDX-License-Identifier: MIT - * - */ - -#include "shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.h" - -class DrmMockXeQueryFeatures : public DrmMockXe { - public: - using DrmMockXe::DrmMockXe; - - int ioctl(DrmIoctl request, void *arg) override { - switch (request) { - case DrmIoctl::gemVmCreate: { - auto vmCreate = static_cast(arg); - - if ((vmCreate->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE) == DRM_XE_VM_CREATE_FLAG_FAULT_MODE && - (vmCreate->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE) == DRM_XE_VM_CREATE_FLAG_LR_MODE && - (!supportsRecoverablePageFault)) { - return -EINVAL; - } - return 0; - } break; - - default: - return DrmMockXe::ioctl(request, arg); - } - }; - bool supportsRecoverablePageFault = true; -}; - -TEST(IoctlHelperXeQueryFeaturesTest, whenInitializeIoctlHelperThenQueryRecoverablePageFaultSupport) { - auto executionEnvironment = std::make_unique(); - DrmMockXeQueryFeatures drm{*executionEnvironment->rootDeviceEnvironments[0]}; - - for (const auto &recoverablePageFault : ::testing::Bool()) { - drm.supportsRecoverablePageFault = recoverablePageFault; - auto xeIoctlHelper = std::make_unique(drm); - xeIoctlHelper->initialize(); - EXPECT_EQ(xeIoctlHelper->supportedFeatures.flags.pageFault, recoverablePageFault); - } -} \ No newline at end of file diff --git a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp index d4f9306050..ce9fe58556 100644 --- a/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp +++ b/shared/test/unit_test/os_interface/linux/xe/ioctl_helper_xe_tests.cpp @@ -279,7 +279,7 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingAnyMethodThenDummyValueIsRe EXPECT_FALSE(xeIoctlHelper->completionFenceExtensionSupported(false)); - EXPECT_EQ(false, xeIoctlHelper->isPageFaultSupported()); + EXPECT_EQ(std::nullopt, xeIoctlHelper->getHasPageFaultParamId()); EXPECT_EQ(nullptr, xeIoctlHelper->createVmControlExtRegion({}));