Create a wrapper for drm_i915_gem_context_create_ext

Related-To: NEO-6852
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2022-05-24 14:36:24 +00:00
committed by Compute-Runtime-Automation
parent bd5dc1524c
commit 51d1752a68
12 changed files with 41 additions and 33 deletions

View File

@@ -432,7 +432,7 @@ void Drm::setUnrecoverableContext(uint32_t drmContextId) {
}
uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequested, bool isCooperativeContextRequested) {
drm_i915_gem_context_create_ext gcc = {};
GemContextCreateExt gcc{};
if (DebugManager.flags.DirectSubmissionDrmContext.get() != -1) {
isDirectSubmissionRequested = DebugManager.flags.DirectSubmissionDrmContext.get();
@@ -464,7 +464,7 @@ uint32_t Drm::createDrmContext(uint32_t drmVmId, bool isDirectSubmissionRequeste
auto ioctlResult = ioctl(DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
UNRECOVERABLE_IF(ioctlResult != 0);
return gcc.ctx_id;
return gcc.contextId;
}
void Drm::destroyDrmContext(uint32_t drmContextId) {

View File

@@ -114,4 +114,9 @@ static_assert(sizeof(GemContextCreateExtSetParam) == sizeof(drm_i915_gem_context
static_assert(offsetof(GemContextCreateExtSetParam, base) == offsetof(drm_i915_gem_context_create_ext_setparam, base));
static_assert(offsetof(GemContextCreateExtSetParam, param) == offsetof(drm_i915_gem_context_create_ext_setparam, param));
static_assert(sizeof(GemContextCreateExt) == sizeof(drm_i915_gem_context_create_ext));
static_assert(offsetof(GemContextCreateExt, contextId) == offsetof(drm_i915_gem_context_create_ext, ctx_id));
static_assert(offsetof(GemContextCreateExt, flags) == offsetof(drm_i915_gem_context_create_ext, flags));
static_assert(offsetof(GemContextCreateExt, extensions) == offsetof(drm_i915_gem_context_create_ext, extensions));
} // namespace NEO

View File

@@ -130,4 +130,10 @@ struct GemContextCreateExtSetParam {
GemContextParam param;
};
struct GemContextCreateExt {
uint32_t contextId;
uint32_t flags;
uint64_t extensions;
};
} // namespace NEO

View File

@@ -18,8 +18,6 @@
#include <string>
#include <vector>
struct drm_i915_gem_context_create_ext;
namespace NEO {
class Drm;
class IoctlHelper;
@@ -99,8 +97,8 @@ class IoctlHelper {
virtual std::optional<int> getHasPageFaultParamId() = 0;
virtual std::unique_ptr<uint8_t[]> createVmControlExtRegion(const std::optional<MemoryClassInstance> &regionInstanceClass) = 0;
virtual uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) = 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 uint32_t createContextWithAccessCounters(Drm *drm, GemContextCreateExt &gcc) = 0;
virtual uint32_t createCooperativeContext(Drm *drm, GemContextCreateExt &gcc) = 0;
virtual void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) = 0;
virtual void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) = 0;
virtual std::optional<uint64_t> getCopyClassSaturatePCIECapability() = 0;
@@ -156,8 +154,8 @@ class IoctlHelperUpstream : public IoctlHelper {
std::optional<int> getHasPageFaultParamId() override;
std::unique_ptr<uint8_t[]> createVmControlExtRegion(const std::optional<MemoryClassInstance> &regionInstanceClass) override;
uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) 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;
uint32_t createContextWithAccessCounters(Drm *drm, GemContextCreateExt &gcc) override;
uint32_t createCooperativeContext(Drm *drm, GemContextCreateExt &gcc) override;
void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override;
void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override;
std::optional<uint64_t> getCopyClassSaturatePCIECapability() override;
@@ -220,8 +218,8 @@ class IoctlHelperPrelim20 : public IoctlHelper {
std::optional<int> getHasPageFaultParamId() override;
std::unique_ptr<uint8_t[]> createVmControlExtRegion(const std::optional<MemoryClassInstance> &regionInstanceClass) override;
uint32_t getFlagsForVmCreate(bool disableScratch, bool enablePageFault, bool useVmBind) 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;
uint32_t createContextWithAccessCounters(Drm *drm, GemContextCreateExt &gcc) override;
uint32_t createCooperativeContext(Drm *drm, GemContextCreateExt &gcc) override;
void fillVmBindExtSetPat(VmBindExtSetPatT &vmBindExtSetPat, uint64_t patIndex, uint64_t nextExtension) override;
void fillVmBindExtUserFence(VmBindExtUserFenceT &vmBindExtUserFence, uint64_t fenceAddress, uint64_t fenceValue, uint64_t nextExtension) override;
std::optional<uint64_t> getCopyClassSaturatePCIECapability() override;

View File

@@ -393,17 +393,17 @@ uint32_t IoctlHelperPrelim20::getFlagsForVmCreate(bool disableScratch, bool enab
return flags;
}
uint32_t gemCreateContextExt(Drm *drm, drm_i915_gem_context_create_ext &gcc, GemContextCreateExtSetParam &extSetparam) {
uint32_t gemCreateContextExt(Drm *drm, GemContextCreateExt &gcc, GemContextCreateExtSetParam &extSetparam) {
gcc.flags |= I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS;
extSetparam.base.nextExtension = gcc.extensions;
gcc.extensions = reinterpret_cast<uint64_t>(&extSetparam);
auto ioctlResult = IoctlHelper::ioctl(drm, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &gcc);
UNRECOVERABLE_IF(ioctlResult != 0);
return gcc.ctx_id;
return gcc.contextId;
}
uint32_t gemCreateContextAcc(Drm *drm, drm_i915_gem_context_create_ext &gcc, uint16_t trigger, uint8_t granularity) {
uint32_t gemCreateContextAcc(Drm *drm, GemContextCreateExt &gcc, uint16_t trigger, uint8_t granularity) {
prelim_drm_i915_gem_context_param_acc paramAcc = {};
paramAcc.trigger = trigger;
paramAcc.notify = 1;
@@ -424,7 +424,7 @@ uint32_t gemCreateContextAcc(Drm *drm, drm_i915_gem_context_create_ext &gcc, uin
return gemCreateContextExt(drm, gcc, extSetparam);
}
uint32_t IoctlHelperPrelim20::createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
uint32_t IoctlHelperPrelim20::createContextWithAccessCounters(Drm *drm, GemContextCreateExt &gcc) {
uint16_t trigger = 0;
if (DebugManager.flags.AccessCountersTrigger.get() != -1) {
trigger = static_cast<uint16_t>(DebugManager.flags.AccessCountersTrigger.get());
@@ -436,7 +436,7 @@ uint32_t IoctlHelperPrelim20::createContextWithAccessCounters(Drm *drm, drm_i915
return gemCreateContextAcc(drm, gcc, trigger, granularity);
}
uint32_t IoctlHelperPrelim20::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
uint32_t IoctlHelperPrelim20::createCooperativeContext(Drm *drm, GemContextCreateExt &gcc) {
GemContextCreateExtSetParam extSetparam{};
extSetparam.base.name = I915_CONTEXT_CREATE_EXT_SETPARAM;
extSetparam.param.param = PRELIM_I915_CONTEXT_PARAM_RUNALONE;

View File

@@ -188,11 +188,11 @@ uint32_t IoctlHelperUpstream::getFlagsForVmCreate(bool disableScratch, bool enab
return 0u;
}
uint32_t IoctlHelperUpstream::createContextWithAccessCounters(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
uint32_t IoctlHelperUpstream::createContextWithAccessCounters(Drm *drm, GemContextCreateExt &gcc) {
return EINVAL;
}
uint32_t IoctlHelperUpstream::createCooperativeContext(Drm *drm, drm_i915_gem_context_create_ext &gcc) {
uint32_t IoctlHelperUpstream::createCooperativeContext(Drm *drm, GemContextCreateExt &gcc) {
return EINVAL;
}

View File

@@ -76,9 +76,8 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
if ((request == DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT) && (arg != nullptr)) {
ioctlCount.contextCreate++;
auto create = static_cast<drm_i915_gem_context_create_ext *>(arg);
auto contextCreate = static_cast<drm_i915_gem_context_create *>(arg);
contextCreate->ctx_id = this->storedDrmContextId;
auto create = static_cast<GemContextCreateExt *>(arg);
create->contextId = this->storedDrmContextId;
this->receivedContextCreateFlags = create->flags;
if (create->extensions == 0) {
return this->storedRetVal;

View File

@@ -58,7 +58,7 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
}
} break;
case DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT: {
auto create = static_cast<drm_i915_gem_context_create_ext *>(arg);
auto create = static_cast<GemContextCreateExt *>(arg);
auto setParam = reinterpret_cast<GemContextCreateExtSetParam *>(create->extensions);
if (setParam->param.param == PRELIM_I915_CONTEXT_PARAM_ACC) {
const auto paramAcc = reinterpret_cast<prelim_drm_i915_gem_context_param_acc *>(setParam->param.value);

View File

@@ -171,8 +171,8 @@ int DrmMockCustom::ioctl(unsigned long request, void *arg) {
} break;
case DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT: {
auto contextCreateParam = reinterpret_cast<drm_i915_gem_context_create_ext *>(arg);
contextCreateParam->ctx_id = ++ioctl_cnt.contextCreate;
auto contextCreateParam = static_cast<NEO::GemContextCreateExt *>(arg);
contextCreateParam->contextId = ++ioctl_cnt.contextCreate;
} break;
case DRM_IOCTL_I915_GEM_CONTEXT_DESTROY: {
ioctl_cnt.contextDestroy++;

View File

@@ -134,7 +134,7 @@ TEST_F(IoctlHelperPrelimFixture, givenPrelimsWhenCreateGemExtWithDebugFlagThenPr
}
TEST_F(IoctlHelperPrelimFixture, givenPrelimsWhenCallIoctlThenProperIoctlRegistered) {
drm_i915_gem_context_create_ext arg{};
GemContextCreateExt arg{};
auto ret = IoctlHelper::ioctl(drm.get(), DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, &arg);
EXPECT_EQ(0u, ret);
EXPECT_EQ(1u, drm->ioctlCallsCount);
@@ -398,7 +398,7 @@ TEST_F(IoctlHelperPrelimFixture, givenIoctlFailureWhenCreateContextWithAccessCou
drm->ioctlRetVal = EINVAL;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
GemContextCreateExt gcc{};
EXPECT_THROW(ioctlHelper->createContextWithAccessCounters(drm.get(), gcc), std::runtime_error);
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
@@ -407,7 +407,7 @@ TEST_F(IoctlHelperPrelimFixture, givenIoctlSuccessWhenCreateContextWithAccessCou
drm->ioctlRetVal = 0;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
GemContextCreateExt gcc{};
EXPECT_EQ(0u, ioctlHelper->createContextWithAccessCounters(drm.get(), gcc));
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
@@ -416,7 +416,7 @@ TEST_F(IoctlHelperPrelimFixture, givenIoctlFailureWhenCreateCooperativeContexIsC
drm->ioctlRetVal = EINVAL;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
GemContextCreateExt gcc{};
EXPECT_THROW(ioctlHelper->createCooperativeContext(drm.get(), gcc), std::runtime_error);
EXPECT_EQ(1u, drm->ioctlCallsCount);
}
@@ -425,7 +425,7 @@ TEST_F(IoctlHelperPrelimFixture, givenIoctlSuccessWhenCreateCooperativeContexIsC
drm->ioctlRetVal = 0u;
auto ioctlHelper = drm->getIoctlHelper();
drm_i915_gem_context_create_ext gcc{};
GemContextCreateExt gcc{};
EXPECT_EQ(0u, ioctlHelper->createCooperativeContext(drm.get(), gcc));
EXPECT_EQ(1u, drm->ioctlCallsCount);
}

View File

@@ -269,7 +269,7 @@ TEST(IoctlHelperTestsUpstream, whenCreateContextWithAccessCountersIsCalledThenEr
auto drm = std::make_unique<DrmTipMock>(*executionEnvironment->rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, drm);
drm_i915_gem_context_create_ext gcc{};
GemContextCreateExt gcc{};
IoctlHelperUpstream ioctlHelper{};
EXPECT_EQ(static_cast<uint32_t>(EINVAL), ioctlHelper.createContextWithAccessCounters(drm.get(), gcc));
@@ -280,7 +280,7 @@ TEST(IoctlHelperTestsUpstream, whenCreateCooperativeContexIsCalledThenErrorIsRet
auto drm = std::make_unique<DrmTipMock>(*executionEnvironment->rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, drm);
drm_i915_gem_context_create_ext gcc{};
GemContextCreateExt gcc{};
IoctlHelperUpstream ioctlHelper{};
EXPECT_EQ(static_cast<uint32_t>(EINVAL), ioctlHelper.createCooperativeContext(drm.get(), gcc));