mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-03 06:49:52 +08:00
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:
committed by
Compute-Runtime-Automation
parent
1e6a38035e
commit
cf27583264
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>(¶mAcc);
|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user