Move createDrmContextExt to drm_neo.cpp

add ioctl helper functions to create dedicated drm contexts

createContextWithAccessCounters
createCooperativeContext

Related-To: NEO-6591

Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2022-02-14 16:26:25 +00:00
committed by Compute-Runtime-Automation
parent 1e6a38035e
commit cf27583264
9 changed files with 173 additions and 13 deletions

View File

@@ -187,6 +187,9 @@ DECLARE_DEBUG_VARIABLE(int32_t, UseDrmVirtualEnginesForCcs, -1, "-1: default, 0:
DECLARE_DEBUG_VARIABLE(int32_t, UseDrmVirtualEnginesForBcs, -1, "-1: default, 0: disable, 1: enable, Combine all BCS nodes to single VE (per context)")
DECLARE_DEBUG_VARIABLE(int32_t, LimitEngineCountForVirtualBcs, -1, "-1: default, >0 Only use VirtualEngine with limited amount of engines, not max ")
DECLARE_DEBUG_VARIABLE(int32_t, LimitEngineCountForVirtualCcs, -1, "-1: default, >0 Only use VirtualEngine with limited amount of engines, not max ")
DECLARE_DEBUG_VARIABLE(int32_t, CreateContextWithAccessCounters, -1, "-1: default, 0: ignore, 1: create context with Access Counter programming")
DECLARE_DEBUG_VARIABLE(int32_t, AccessCountersTrigger, -1, "-1: default - disabled, 0: disabled, >= 0: triggering thresholds")
DECLARE_DEBUG_VARIABLE(int32_t, AccessCountersGranularity, -1, "-1: default - ACG_2MB, >= 0: granularites - 0: ACG_128K, 1: ACG_2M, 2: ACG_16M, 3: ACG_16M")
/*LOGGING FLAGS*/
DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level")
DECLARE_DEBUG_VARIABLE(bool, PrintOsContextInitializations, false, "print initialized OsContexts to standard output")
@@ -299,6 +302,7 @@ DECLARE_DEBUG_VARIABLE(bool, EnableFreeMemory, false, "Enable freeMemory in memo
DECLARE_DEBUG_VARIABLE(bool, ForceSamplerLowFilteringPrecision, false, "Force Low Filtering Precision Sampler mode")
DECLARE_DEBUG_VARIABLE(bool, EngineInstancedSubDevices, false, "Create subdevices assigned to specific engine")
DECLARE_DEBUG_VARIABLE(bool, AllowSingleTileEngineInstancedSubDevices, false, "Create subdevices assigned to specific engine on single tile config")
DECLARE_DEBUG_VARIABLE(int32_t, ForceRunAloneContext, -1, "Control creation of run-alone HW context, -1:default, 0:disable, 1:enable")
DECLARE_DEBUG_VARIABLE(int32_t, AddClGlSharing, -1, "Add cl-gl extension")
DECLARE_DEBUG_VARIABLE(int32_t, EnableKernelTunning, -1, "Perform a tunning of enqueue kernel, -1:default(disabled), 0:disable, 1:enable simple kernel tunning, 2:enable full kernel tunning")
DECLARE_DEBUG_VARIABLE(int32_t, EnableBOMmapCreate, -1, "Create BOs using mmap, -1:default, 0:disable(GEM_USERPTR), 1:enable")

View File

@@ -1151,4 +1151,28 @@ void Drm::waitForBind(uint32_t vmHandleId) {
waitUserFence(0u, castToUint64(&this->pagingFence[vmHandleId]), this->fenceVal[vmHandleId], ValueWidth::U64, -1, ioctlHelper->getWaitUserFenceSoftFlag());
}
uint32_t Drm::createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isCooperativeContextRequested) {
drm_i915_gem_context_create_ext_setparam extSetparam = {};
if (drmVmId > 0) {
extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM;
extSetparam.param.param = I915_CONTEXT_PARAM_VM;
extSetparam.param.value = drmVmId;
gcc.extensions = reinterpret_cast<uint64_t>(&extSetparam);
gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS;
}
if (DebugManager.flags.CreateContextWithAccessCounters.get() != -1) {
return ioctlHelper->createContextWithAccessCounters(this, gcc);
}
if (DebugManager.flags.ForceRunAloneContext.get() != -1) {
isCooperativeContextRequested = DebugManager.flags.ForceRunAloneContext.get();
}
if (isCooperativeContextRequested) {
return ioctlHelper->createCooperativeContext(this, gcc);
}
return ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
}
} // namespace NEO

View File

@@ -40,17 +40,4 @@ bool Drm::isVmBindAvailable() {
return this->bindAvailable;
}
uint32_t Drm::createDrmContextExt(drm_i915_gem_context_create_ext &gcc, uint32_t drmVmId, bool isCooperativeContextRequested) {
drm_i915_gem_context_create_ext_setparam extSetparam = {};
if (drmVmId > 0) {
extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM;
extSetparam.param.param = I915_CONTEXT_PARAM_VM;
extSetparam.param.value = drmVmId;
gcc.extensions = reinterpret_cast<uint64_t>(&extSetparam);
gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS;
}
return ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
}
} // namespace NEO

View File

@@ -18,6 +18,7 @@
#include <vector>
struct drm_i915_query_item;
struct drm_i915_gem_context_create_ext;
struct drm_i915_gem_execbuffer2;
namespace NEO {
@@ -88,6 +89,8 @@ class IoctlHelper {
virtual int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) = 0;
virtual bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) = 0;
virtual std::optional<int> 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;
};
class IoctlHelperUpstream : public IoctlHelper {
@@ -116,6 +119,8 @@ class IoctlHelperUpstream : public IoctlHelper {
int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override;
bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) override;
std::optional<int> 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;
};
template <PRODUCT_FAMILY gfxProduct>
@@ -159,6 +164,8 @@ class IoctlHelperPrelim20 : public IoctlHelper {
int execBuffer(Drm *drm, drm_i915_gem_execbuffer2 *execBuffer, uint64_t completionGpuAddress, uint32_t counterValue) override;
bool completionFenceExtensionSupported(Drm &drm, const HardwareInfo &hwInfo) override;
std::optional<int> 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;
};
} // namespace NEO

View File

@@ -303,4 +303,51 @@ std::optional<int> IoctlHelperPrelim20::getHasPageFaultParamId() {
return PRELIM_I915_PARAM_HAS_PAGE_FAULT;
};
uint32_t gemCreateContextExt(Drm *drm, drm_i915_gem_context_create_ext &gcc, drm_i915_gem_context_create_ext_setparam &extSetparam) {
gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS;
extSetparam.base.next_extension = gcc.extensions;
gcc.extensions = reinterpret_cast<uint64_t>(&extSetparam);
return IoctlHelper::ioctl(drm, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
}
uint32_t gemCreateContextAcc(Drm *drm, drm_i915_gem_context_create_ext &gcc, uint16_t trigger, uint8_t granularity) {
prelim_drm_i915_gem_context_param_acc paramAcc = {};
paramAcc.trigger = trigger;
paramAcc.notify = 1;
paramAcc.granularity = granularity;
i915_user_extension userExt = {};
userExt.name = I915_CONTEXT_CREATE_EXT_SETPARAM;
drm_i915_gem_context_param ctxParam = {};
ctxParam.param = PRELIM_I915_CONTEXT_PARAM_ACC;
ctxParam.ctx_id = 0;
ctxParam.size = sizeof(paramAcc);
ctxParam.value = reinterpret_cast<uint64_t>(&paramAcc);
drm_i915_gem_context_create_ext_setparam extSetparam = {};
extSetparam.base = userExt;
extSetparam.param = ctxParam;
return gemCreateContextExt(drm, gcc, extSetparam);
}
uint32_t IoctlHelperPrelim20::createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
uint16_t trigger = 0;
if (DebugManager.flags.AccessCountersTrigger.get() != -1) {
trigger = static_cast<uint16_t>(DebugManager.flags.AccessCountersTrigger.get());
}
uint8_t granularity = PRELIM_I915_CONTEXT_ACG_2M;
if (DebugManager.flags.AccessCountersGranularity.get() != -1) {
granularity = static_cast<uint8_t>(DebugManager.flags.AccessCountersGranularity.get());
}
return gemCreateContextAcc(drm, gcc, trigger, granularity);
}
uint32_t IoctlHelperPrelim20::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
struct drm_i915_gem_context_create_ext_setparam extSetparam = {};
extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM;
extSetparam.param.param = PRELIM_I915_CONTEXT_PARAM_RUNALONE;
return gemCreateContextExt(drm, gcc, extSetparam);
}
} // namespace NEO

View File

@@ -154,4 +154,10 @@ std::optional<int> IoctlHelperUpstream::getHasPageFaultParamId() {
return std::nullopt;
};
uint32_t IoctlHelperUpstream::createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
return EINVAL;
}
uint32_t IoctlHelperUpstream::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
return EINVAL;
}
} // namespace NEO

View File

@@ -313,3 +313,61 @@ TEST_F(IoctlHelperPrelimFixture, givenPrelimWhenQueryEngineInfoAndFailIoctlThenF
EXPECT_EQ(nullptr, engineInfo);
}
TEST_F(IoctlHelperPrelimFixture, givenIoctlFailureWhenCreateContextWithAccessCountersIsCalledThenErrorIsReturned) {
drm->ioctlRetVal = EINVAL;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
EXPECT_EQ(static_cast<uint32_t>(EINVAL), ioctlHelper->createContextWithAccessCounters(drm.get(), gcc));
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
TEST_F(IoctlHelperPrelimFixture, givenIoctlSuccessWhenCreateContextWithAccessCountersIsCalledThenSuccessIsReturned) {
drm->ioctlRetVal = 0;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
EXPECT_EQ(0u, ioctlHelper->createContextWithAccessCounters(drm.get(), gcc));
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
TEST_F(IoctlHelperPrelimFixture, givenIoctlFailureWhenCreateCooperativeContexIsCalledThenErrorIsReturned) {
drm->ioctlRetVal = EINVAL;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
EXPECT_EQ(static_cast<uint32_t>(EINVAL), ioctlHelper->createCooperativeContext(drm.get(), gcc));
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
TEST_F(IoctlHelperPrelimFixture, givenIoctlSuccessWhenCreateCooperativeContexIsCalledThenSuccessIsReturned) {
drm->ioctlRetVal = 0u;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
EXPECT_EQ(0u, ioctlHelper->createCooperativeContext(drm.get(), gcc));
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
TEST_F(IoctlHelperPrelimFixture, whenCreateDrmContextExtIsCalledThenIoctlIsCalledOnlyOnce) {
drm->ioctlRetVal = 0u;
DebugManagerStateRestore stateRestore;
for (auto &cooperativeContextRequested : {-1, 0, 1}) {
DebugManager.flags.ForceRunAloneContext.set(cooperativeContextRequested);
for (auto &accessCountersRequested : {-1, 0, 1}) {
DebugManager.flags.CreateContextWithAccessCounters.set(accessCountersRequested);
for (auto vmId = 0u; vmId < 3; vmId++) {
drm->ioctlCallsCount = 0u;
drm_i915_gem_context_create_ext gcc{};
drm->createDrmContextExt(gcc, vmId, true);
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
}
}
}

View File

@@ -9,6 +9,7 @@
#include "shared/source/os_interface/linux/ioctl_helper.h"
#include "shared/test/common/helpers/debug_manager_state_restore.h"
#include "shared/test/common/helpers/default_hw_info.h"
#include "shared/test/common/mocks/mock_execution_environment.h"
#include "shared/test/common/test_macros/test.h"
#include "shared/test/unit_test/os_interface/linux/drm_mock_impl.h"
@@ -200,3 +201,25 @@ TEST(IoctlHelperTestsUpstream, givenUpstreamWhenQueryEngineInfoWithDeviceMemoryA
ASSERT_NE(nullptr, engineInfo);
EXPECT_EQ(totalEnginesCount, engines.size());
}
TEST(IoctlHelperTestsUpstream, whenCreateContextWithAccessCountersIsCalledThenErrorIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
auto drm = std::make_unique<DrmTipMock>(*executionEnvironment->rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, drm);
drm_i915_gem_context_create_ext gcc{};
IoctlHelperUpstream ioctlHelper{};
EXPECT_EQ(static_cast<uint32_t>(EINVAL), ioctlHelper.createContextWithAccessCounters(drm.get(), gcc));
}
TEST(IoctlHelperTestsUpstream, whenCreateCooperativeContexIsCalledThenErrorIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
auto drm = std::make_unique<DrmTipMock>(*executionEnvironment->rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, drm);
drm_i915_gem_context_create_ext gcc{};
IoctlHelperUpstream ioctlHelper{};
EXPECT_EQ(static_cast<uint32_t>(EINVAL), ioctlHelper.createCooperativeContext(drm.get(), gcc));
}