Remove DrmMockImpl and use DrmMock instead

Related-To: NEO-4914
Signed-off-by: Fabian Zwolinski <fabian.zwolinski@intel.com>
This commit is contained in:
Fabian Zwolinski
2022-03-16 15:52:08 +00:00
committed by Compute-Runtime-Automation
parent 72828f62ba
commit 726b676983
10 changed files with 245 additions and 329 deletions

View File

@@ -20,8 +20,10 @@ const uint32_t DrmMockResources::registerResourceReturnHandle = 3;
int DrmMock::ioctl(unsigned long request, void *arg) {
ioctlCallsCount++;
ioctlCount.total++;
if ((request == DRM_IOCTL_I915_GETPARAM) && (arg != nullptr)) {
ioctlCount.contextGetParam++;
auto gp = static_cast<drm_i915_getparam_t *>(arg);
if (gp->param == I915_PARAM_EU_TOTAL) {
if (0 == this->storedRetValForEUVal) {
@@ -74,8 +76,10 @@ 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);
this->receivedCreateContextId = create->ctx_id;
auto contextCreate = static_cast<drm_i915_gem_context_create *>(arg);
contextCreate->ctx_id = this->storedDrmContextId;
this->receivedContextCreateFlags = create->flags;
if (create->extensions == 0) {
return this->storedRetVal;
@@ -91,12 +95,14 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
}
if ((request == DRM_IOCTL_I915_GEM_CONTEXT_DESTROY) && (arg != nullptr)) {
ioctlCount.contextDestroy++;
auto destroy = static_cast<drm_i915_gem_context_destroy *>(arg);
this->receivedDestroyContextId = destroy->ctx_id;
return this->storedRetVal;
}
if ((request == DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM) && (arg != nullptr)) {
ioctlCount.contextSetParam++;
receivedContextParamRequestCount++;
receivedContextParamRequest = *static_cast<drm_i915_gem_context_param *>(arg);
if (receivedContextParamRequest.param == I915_CONTEXT_PARAM_PRIORITY) {
@@ -124,6 +130,7 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
}
if ((request == DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM) && (arg != nullptr)) {
ioctlCount.contextGetParam++;
receivedContextParamRequestCount++;
receivedContextParamRequest = *static_cast<drm_i915_gem_context_param *>(arg);
if (receivedContextParamRequest.param == I915_CONTEXT_PARAM_GTT_SIZE) {
@@ -148,18 +155,24 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
}
if (request == DRM_IOCTL_I915_GEM_EXECBUFFER2) {
ioctlCount.execbuffer2++;
auto execbuf = static_cast<drm_i915_gem_execbuffer2 *>(arg);
this->execBuffer = *execbuf;
this->bbFlags = reinterpret_cast<drm_i915_gem_exec_object2 *>(execbuf->buffers_ptr)[execbuf->buffer_count - 1].flags;
auto execObjects = reinterpret_cast<const drm_i915_gem_exec_object2 *>(execbuf->buffers_ptr);
this->execBuffers.push_back(*execbuf);
for (uint32_t i = 0; i < execbuf->buffer_count; i++) {
this->receivedBos.push_back(execObjects[i]);
}
return 0;
}
if (request == DRM_IOCTL_I915_GEM_USERPTR) {
ioctlCount.gemUserptr++;
auto userPtrParams = static_cast<drm_i915_gem_userptr *>(arg);
userPtrParams->handle = returnHandle;
returnHandle++;
return 0;
}
if (request == DRM_IOCTL_I915_GEM_CREATE) {
ioctlCount.gemCreate++;
auto createParams = static_cast<drm_i915_gem_create *>(arg);
this->createParamsSize = createParams->size;
this->createParamsHandle = createParams->handle = 1u;
@@ -169,6 +182,7 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
return 0;
}
if (request == DRM_IOCTL_I915_GEM_SET_TILING) {
ioctlCount.gemSetTiling++;
auto setTilingParams = static_cast<drm_i915_gem_set_tiling *>(arg);
setTilingMode = setTilingParams->tiling_mode;
setTilingHandle = setTilingParams->handle;
@@ -176,6 +190,7 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
return 0;
}
if (request == DRM_IOCTL_PRIME_FD_TO_HANDLE) {
ioctlCount.primeFdToHandle++;
auto primeToHandleParams = static_cast<drm_prime_handle *>(arg);
//return BO
primeToHandleParams->handle = outputHandle;
@@ -183,28 +198,35 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
return fdToHandleRetVal;
}
if (request == DRM_IOCTL_PRIME_HANDLE_TO_FD) {
ioctlCount.handleToPrimeFd++;
auto primeToFdParams = static_cast<drm_prime_handle *>(arg);
primeToFdParams->fd = outputFd;
return 0;
}
if (request == DRM_IOCTL_I915_GEM_GET_APERTURE) {
ioctlCount.gemGetAperture++;
auto aperture = static_cast<drm_i915_gem_get_aperture *>(arg);
aperture->aper_available_size = gpuMemSize;
aperture->aper_size = gpuMemSize;
return 0;
}
if (request == DRM_IOCTL_I915_GEM_MMAP) {
ioctlCount.gemMmap++;
auto mmap_arg = static_cast<drm_i915_gem_mmap *>(arg);
mmap_arg->addr_ptr = reinterpret_cast<__u64>(lockedPtr);
return 0;
}
if (request == DRM_IOCTL_I915_GEM_WAIT) {
ioctlCount.gemWait++;
receivedGemWait = *static_cast<drm_i915_gem_wait *>(arg);
return 0;
}
if (request == DRM_IOCTL_GEM_CLOSE) {
return 0;
ioctlCount.gemClose++;
return storedRetValForGemClose;
}
if (request == DRM_IOCTL_I915_GET_RESET_STATS && arg != nullptr) {
ioctlCount.gemResetStats++;
auto outResetStats = static_cast<drm_i915_reset_stats *>(arg);
for (const auto &resetStats : resetStatsToReturn) {
if (resetStats.ctx_id == outResetStats->ctx_id) {
@@ -217,6 +239,7 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
}
if (request == DRM_IOCTL_I915_QUERY && arg != nullptr) {
ioctlCount.query++;
auto queryArg = static_cast<drm_i915_query *>(arg);
auto queryItemArg = reinterpret_cast<drm_i915_query_item *>(queryArg->items_ptr);
storedQueryItem = *queryItemArg;
@@ -252,7 +275,6 @@ int DrmMock::ioctl(unsigned long request, void *arg) {
return handleRemainingRequests(request, arg);
}
int DrmMock::waitUserFence(uint32_t ctxIdx, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags) {
waitUserFenceParams.push_back({ctxIdx, address, value, dataWidth, timeout, flags});
return Drm::waitUserFence(ctxIdx, address, value, dataWidth, timeout, flags);

View File

@@ -12,6 +12,9 @@
#include "shared/source/helpers/string.h"
#include "shared/source/os_interface/linux/drm_neo.h"
#include "shared/test/common/helpers/default_hw_info.h"
#include "shared/test/common/os_interface/linux/device_command_stream_fixture.h"
#include "gtest/gtest.h"
#include <cstdio>
#include <fstream>
@@ -63,6 +66,12 @@ class DrmMock : public Drm {
}
DrmMock(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMock(mockFd, rootDeviceEnvironment) {}
~DrmMock() {
if (expectIoctlCallsOnDestruction) {
EXPECT_EQ(expectedIoctlCallsOnDestruction, ioctlCallsCount);
}
}
int ioctl(unsigned long request, void *arg) override;
int getErrno() override {
if (baseErrno) {
@@ -177,7 +186,6 @@ class DrmMock : public Drm {
drm_i915_gem_context_create_ext_setparam receivedContextCreateSetParam = {};
uint32_t receivedContextCreateFlags = 0;
uint32_t receivedCreateContextId = 0;
uint32_t receivedDestroyContextId = 0;
uint32_t ioctlCallsCount = 0;
@@ -188,9 +196,8 @@ class DrmMock : public Drm {
bool queryPageFaultSupportCalled = false;
//DRM_IOCTL_I915_GEM_EXECBUFFER2
drm_i915_gem_execbuffer2 execBuffer = {0};
uint64_t bbFlags;
std::vector<drm_i915_gem_execbuffer2> execBuffers{};
std::vector<drm_i915_gem_exec_object2> receivedBos{};
//DRM_IOCTL_I915_GEM_CREATE
__u64 createParamsSize = 0;
__u32 createParamsHandle = 0;
@@ -211,10 +218,23 @@ class DrmMock : public Drm {
uint64_t lockedPtr[4];
//DRM_IOCTL_I915_QUERY
drm_i915_query_item storedQueryItem = {};
//DRM_IOCTL_I915_GEM_WAIT
drm_i915_gem_wait receivedGemWait = {};
//DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT
uint32_t storedDrmContextId{};
//DRM_IOCTL_GEM_CLOSE
int storedRetValForGemClose = 0;
uint64_t storedGTTSize = 1ull << 47;
uint64_t storedParamSseu = ULONG_MAX;
Ioctls ioctlCount{};
Ioctls ioctlTearDownExpected{};
bool ioctlTearDownExpects = false;
bool expectIoctlCallsOnDestruction = false;
uint32_t expectedIoctlCallsOnDestruction = 0u;
virtual int handleRemainingRequests(unsigned long request, void *arg) { return -1; }
struct WaitUserFenceParams {

View File

@@ -10,13 +10,15 @@
const int mockFd = 33;
const char *mockPciPath = "";
void DrmMockCustom::Ioctls::reset() {
void Ioctls::reset() {
total = 0;
query = 0;
execbuffer2 = 0;
gemUserptr = 0;
gemCreate = 0;
gemSetTiling = 0;
gemGetTiling = 0;
gemGetAperture = 0;
primeFdToHandle = 0;
handleToPrimeFd = 0;
gemMmap = 0;
@@ -24,9 +26,11 @@ void DrmMockCustom::Ioctls::reset() {
gemSetDomain = 0;
gemWait = 0;
gemClose = 0;
gemResetStats = 0;
regRead = 0;
getParam = 0;
contextGetParam = 0;
contextSetParam = 0;
contextCreate = 0;
contextDestroy = 0;
}

View File

@@ -28,12 +28,34 @@ using NEO::RootDeviceEnvironment;
extern const int mockFd;
extern const char *mockPciPath;
class DrmMockImpl : public Drm {
class Ioctls {
public:
using Drm::setupIoctlHelper;
DrmMockImpl(int fd, RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique<HwDeviceIdDrm>(fd, mockPciPath), rootDeviceEnvironment){};
MOCK_METHOD2(ioctl, int(unsigned long request, void *arg));
Ioctls() {
reset();
}
void reset();
std::atomic<int32_t> total;
std::atomic<int32_t> query;
std::atomic<int32_t> execbuffer2;
std::atomic<int32_t> gemUserptr;
std::atomic<int32_t> gemCreate;
std::atomic<int32_t> gemSetTiling;
std::atomic<int32_t> gemGetTiling;
std::atomic<int32_t> gemGetAperture;
std::atomic<int32_t> primeFdToHandle;
std::atomic<int32_t> handleToPrimeFd;
std::atomic<int32_t> gemMmap;
std::atomic<int32_t> gemMmapOffset;
std::atomic<int32_t> gemSetDomain;
std::atomic<int32_t> gemWait;
std::atomic<int32_t> gemClose;
std::atomic<int32_t> gemResetStats;
std::atomic<int32_t> regRead;
std::atomic<int32_t> getParam;
std::atomic<int32_t> contextGetParam;
std::atomic<int32_t> contextSetParam;
std::atomic<int32_t> contextCreate;
std::atomic<int32_t> contextDestroy;
};
class DrmMockSuccess : public Drm {
@@ -81,30 +103,6 @@ class DrmMockCustom : public Drm {
IoctlResExt(int32_t no, int32_t res) : no(1u, no), res(res) {}
};
class Ioctls {
public:
void reset();
std::atomic<int32_t> total;
std::atomic<int32_t> execbuffer2;
std::atomic<int32_t> gemUserptr;
std::atomic<int32_t> gemCreate;
std::atomic<int32_t> gemSetTiling;
std::atomic<int32_t> gemGetTiling;
std::atomic<int32_t> primeFdToHandle;
std::atomic<int32_t> handleToPrimeFd;
std::atomic<int32_t> gemMmap;
std::atomic<int32_t> gemMmapOffset;
std::atomic<int32_t> gemSetDomain;
std::atomic<int32_t> gemWait;
std::atomic<int32_t> gemClose;
std::atomic<int32_t> regRead;
std::atomic<int32_t> getParam;
std::atomic<int32_t> contextGetParam;
std::atomic<int32_t> contextCreate;
std::atomic<int32_t> contextDestroy;
};
struct WaitUserFenceCall {
uint64_t address = 0u;
uint64_t value = 0u;
@@ -154,8 +152,8 @@ class DrmMockCustom : public Drm {
virtual void execBufferExtensions(void *execbuf) {
}
Ioctls ioctl_cnt;
Ioctls ioctl_expected;
Ioctls ioctl_cnt{};
Ioctls ioctl_expected{};
IoctlResExt NONE = {-1, 0};

View File

@@ -124,7 +124,7 @@ class DrmMemoryManagerFixture : public MemoryManagementFixture {
RootDeviceEnvironment *rootDeviceEnvironment = nullptr;
DrmMockCustom::IoctlResExt ioctlResExt = {0, 0};
AllocationData allocationData{};
DrmMockCustom::Ioctls additionalDestroyDeviceIoctls{};
Ioctls additionalDestroyDeviceIoctls{};
EnvironmentWithCsrWrapper environmentWrapper;
DebugManagerStateRestore restore;
};