diff --git a/shared/source/os_interface/linux/ioctl_helper.h b/shared/source/os_interface/linux/ioctl_helper.h index 30d630742a..0ed143ca88 100644 --- a/shared/source/os_interface/linux/ioctl_helper.h +++ b/shared/source/os_interface/linux/ioctl_helper.h @@ -94,6 +94,10 @@ class IoctlHelper { virtual std::optional getHasPageFaultParamId() = 0; virtual uint32_t createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) = 0; virtual uint32_t createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) = 0; + virtual std::unique_ptr createVmBindExtSetPat() = 0; + virtual void fillVmBindExtSetPat(const std::unique_ptr &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) = 0; + virtual std::unique_ptr createVmBindExtSyncFence() = 0; + virtual void fillVmBindExtSyncFence(const std::unique_ptr &vmBindExtSyncFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) = 0; }; class IoctlHelperUpstream : public IoctlHelper { @@ -127,6 +131,10 @@ class IoctlHelperUpstream : public IoctlHelper { std::optional getHasPageFaultParamId() override; uint32_t createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; uint32_t createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; + std::unique_ptr createVmBindExtSetPat() override; + void fillVmBindExtSetPat(const std::unique_ptr &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override; + std::unique_ptr createVmBindExtSyncFence() override; + void fillVmBindExtSyncFence(const std::unique_ptr &vmBindExtSyncFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override; }; template @@ -175,6 +183,10 @@ class IoctlHelperPrelim20 : public IoctlHelper { std::optional getHasPageFaultParamId() override; uint32_t createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; uint32_t createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) override; + std::unique_ptr createVmBindExtSetPat() override; + void fillVmBindExtSetPat(const std::unique_ptr &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override; + std::unique_ptr createVmBindExtSyncFence() override; + void fillVmBindExtSyncFence(const std::unique_ptr &vmBindExtSyncFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) 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 eb7260f3bb..3aef7a30d2 100644 --- a/shared/source/os_interface/linux/ioctl_helper_prelim.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_prelim.cpp @@ -392,4 +392,29 @@ uint32_t IoctlHelperPrelim20::createCooperativeContext(Drm *drm, drm_i915_gem_co extSetparam.param.param = PRELIM_I915_CONTEXT_PARAM_RUNALONE; return gemCreateContextExt(drm, gcc, extSetparam); } + +std::unique_ptr IoctlHelperPrelim20::createVmBindExtSetPat() { + return std::make_unique(sizeof(prelim_drm_i915_vm_bind_ext_set_pat)); +}; + +void IoctlHelperPrelim20::fillVmBindExtSetPat(const std::unique_ptr &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) { + auto prelimVmBindExtSetPat = reinterpret_cast(vmBindExtSetPat.get()); + UNRECOVERABLE_IF(!prelimVmBindExtSetPat); + prelimVmBindExtSetPat->base.name = PRELIM_I915_VM_BIND_EXT_SET_PAT; + prelimVmBindExtSetPat->pat_index = patIndex; + prelimVmBindExtSetPat->base.next_extension = nextExtension; +} + +std::unique_ptr IoctlHelperPrelim20::createVmBindExtSyncFence() { + return std::make_unique(sizeof(prelim_drm_i915_vm_bind_ext_sync_fence)); +} + +void IoctlHelperPrelim20::fillVmBindExtSyncFence(const std::unique_ptr &vmBindExtSyncFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) { + auto prelimVmBindExtSyncFence = reinterpret_cast(vmBindExtSyncFence.get()); + UNRECOVERABLE_IF(!prelimVmBindExtSyncFence); + prelimVmBindExtSyncFence->base.name = PRELIM_I915_VM_BIND_EXT_SYNC_FENCE; + prelimVmBindExtSyncFence->base.next_extension = nextExtension; + prelimVmBindExtSyncFence->addr = fenceAddress; + prelimVmBindExtSyncFence->val = fenceValue; +} } // 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 fa1a120001..dd54cc955a 100644 --- a/shared/source/os_interface/linux/ioctl_helper_upstream.cpp +++ b/shared/source/os_interface/linux/ioctl_helper_upstream.cpp @@ -171,4 +171,12 @@ uint32_t IoctlHelperUpstream::createContextWithAccessCounters(Drm *drm, drm_i915 uint32_t IoctlHelperUpstream::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) { return EINVAL; } +std::unique_ptr IoctlHelperUpstream::createVmBindExtSetPat() { + return {}; +}; +void IoctlHelperUpstream::fillVmBindExtSetPat(const std::unique_ptr &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) {} +std::unique_ptr IoctlHelperUpstream::createVmBindExtSyncFence() { + return {}; +} +void IoctlHelperUpstream::fillVmBindExtSyncFence(const std::unique_ptr &vmBindExtSyncFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) {} } // namespace NEO diff --git a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp index 6dd2e24236..30f3e97176 100644 --- a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp +++ b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_prelim.cpp @@ -148,3 +148,53 @@ TEST_F(IoctlPrelimHelperTests, givenPrelimsWhenTranslateToEngineCapsThenReturnSa TEST_F(IoctlPrelimHelperTests, givenPrelimsWhenGettingFlagForWaitUserFenceSoftThenProperFlagIsReturned) { EXPECT_EQ(PRELIM_I915_UFENCE_WAIT_SOFT, ioctlHelper.getWaitUserFenceSoftFlag()); } + +TEST_F(IoctlPrelimHelperTests, whenCreateVmBindSetPatThenValidPointerIsReturned) { + EXPECT_NE(nullptr, ioctlHelper.createVmBindExtSetPat()); +} + +TEST_F(IoctlPrelimHelperTests, whenCreateVmBindSyncFenceThenValidPointerIsReturned) { + EXPECT_NE(nullptr, ioctlHelper.createVmBindExtSyncFence()); +} + +TEST_F(IoctlPrelimHelperTests, givenNullptrWhenFillVmBindSetPatThenUnrecoverableIsThrown) { + std::unique_ptr vmBindExtSetPat{}; + EXPECT_THROW(ioctlHelper.fillVmBindExtSetPat(vmBindExtSetPat, 0u, 0u), std::runtime_error); +} + +TEST_F(IoctlPrelimHelperTests, givenNullptrWhenFillVmBindSyncFenceThenUnrecoverableIsThrown) { + std::unique_ptr vmBindExtSyncFence{}; + EXPECT_THROW(ioctlHelper.fillVmBindExtSyncFence(vmBindExtSyncFence, 0u, 0u, 0u), std::runtime_error); +} + +TEST_F(IoctlPrelimHelperTests, givenValidInputWhenFillVmBindSetPatThenProperValuesAreSet) { + std::unique_ptr vmBindExtSetPat{}; + prelim_drm_i915_vm_bind_ext_set_pat prelimVmBindExtSetPat{}; + vmBindExtSetPat.reset(reinterpret_cast(&prelimVmBindExtSetPat)); + + uint64_t expectedPatIndex = 2; + uint64_t expectedNextExtension = 3; + ioctlHelper.fillVmBindExtSetPat(vmBindExtSetPat, expectedPatIndex, expectedNextExtension); + EXPECT_EQ(static_cast(PRELIM_I915_VM_BIND_EXT_SET_PAT), prelimVmBindExtSetPat.base.name); + EXPECT_EQ(expectedPatIndex, prelimVmBindExtSetPat.pat_index); + EXPECT_EQ(expectedNextExtension, prelimVmBindExtSetPat.base.next_extension); + + vmBindExtSetPat.release(); +} + +TEST_F(IoctlPrelimHelperTests, givenValidInputWhenFillVmBindSyncFenceThenProperValuesAreSet) { + std::unique_ptr vmBindExtSyncFence{}; + prelim_drm_i915_vm_bind_ext_sync_fence prelimVmBindExtSyncFence{}; + vmBindExtSyncFence.reset(reinterpret_cast(&prelimVmBindExtSyncFence)); + + uint64_t expectedAddress = 0xdead; + uint64_t expectedValue = 0xc0de; + uint64_t expectedNextExtension = 1234; + ioctlHelper.fillVmBindExtSyncFence(vmBindExtSyncFence, expectedAddress, expectedValue, expectedNextExtension); + EXPECT_EQ(static_cast(PRELIM_I915_VM_BIND_EXT_SYNC_FENCE), prelimVmBindExtSyncFence.base.name); + EXPECT_EQ(expectedAddress, prelimVmBindExtSyncFence.addr); + EXPECT_EQ(expectedValue, prelimVmBindExtSyncFence.val); + EXPECT_EQ(expectedNextExtension, prelimVmBindExtSyncFence.base.next_extension); + + vmBindExtSyncFence.release(); +} diff --git a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp index 7f205a62f1..03cc4a2c4d 100644 --- a/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp +++ b/shared/test/unit_test/os_interface/linux/ioctl_helper_tests_upstream.cpp @@ -250,3 +250,25 @@ TEST(IoctlHelperTestsUpstream, whenCreateCooperativeContexIsCalledThenErrorIsRet EXPECT_EQ(static_cast(EINVAL), ioctlHelper.createCooperativeContext(drm.get(), gcc)); } + +TEST(IoctlHelperTestsUpstream, whenCreateVmBindSetPatThenNullptrIsReturned) { + IoctlHelperUpstream ioctlHelper{}; + EXPECT_EQ(nullptr, ioctlHelper.createVmBindExtSetPat()); +} + +TEST(IoctlHelperTestsUpstream, whenCreateVmBindSyncFenceThenNullptrIsReturned) { + IoctlHelperUpstream ioctlHelper{}; + EXPECT_EQ(nullptr, ioctlHelper.createVmBindExtSyncFence()); +} + +TEST(IoctlHelperTestsUpstream, givenNullptrWhenFillVmBindSetPatThenNothingThrows) { + IoctlHelperUpstream ioctlHelper{}; + auto vmBindExtSetPat = ioctlHelper.createVmBindExtSetPat(); + EXPECT_NO_THROW(ioctlHelper.fillVmBindExtSetPat(vmBindExtSetPat, 0u, 0u)); +} + +TEST(IoctlHelperTestsUpstream, givenNullptrWhenFillVmBindSyncFenceThenNothingThrows) { + IoctlHelperUpstream ioctlHelper{}; + auto vmBindExtSyncFence = ioctlHelper.createVmBindExtSyncFence(); + EXPECT_NO_THROW(ioctlHelper.fillVmBindExtSyncFence(vmBindExtSyncFence, 0u, 0u, 0u)); +}