test: stop abusing ctors in DrmMockCustom and derived types

Calling virtual functions from within constructors is incorrect, the
virtualization mechanism does not work until a constructor completes.
So, instead of performing many operations in constructors, make them
small and use static `create()` methods to construct the object properly
and only then perform additional setup.

Mocks are a prominent example how such practice degrades the code.
A function called from a constructor is basically unmockable. Despite
being overriden by derived type (to alter the execution path as per
needs of a given test-case) the parent versions are always called.

This was making test development more and more painful as at some point
there is no hack to compensate for the lack of standard mechanism.

Related-To: NEO-9754
Signed-off-by: Maciej Bielski <maciej.bielski@intel.com>
This commit is contained in:
Maciej Bielski
2024-07-09 22:01:01 +00:00
committed by Compute-Runtime-Automation
parent ae49a4f1fd
commit 005b273b1e
25 changed files with 619 additions and 572 deletions

View File

@@ -40,12 +40,22 @@ inline constexpr int testValueMapOff = 0x7788;
inline constexpr int testValuePrime = 0x4321;
inline constexpr uint32_t testValueGemCreate = 0x8273;
class DrmMockXeDebug : public DrmMockCustom {
public:
struct DrmMockXeDebug : public DrmMockCustom {
using Drm::engineInfo;
DrmMockXeDebug(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockCustom(rootDeviceEnvironment) {
this->ioctlHelper = std::make_unique<IoctlHelperXe>(*this);
auto xeQueryEngines = reinterpret_cast<drm_xe_query_engines *>(queryEngines);
static auto create(RootDeviceEnvironment &rootDeviceEnvironment) {
auto drm = std::unique_ptr<DrmMockXeDebug>(new DrmMockXeDebug{rootDeviceEnvironment});
drm->reset();
auto &gfxCoreHelper = rootDeviceEnvironment.getHelper<NEO::GfxCoreHelper>();
drm->ioctlExpected.contextCreate = static_cast<int>(gfxCoreHelper.getGpgpuEngineInstances(rootDeviceEnvironment).size());
drm->ioctlExpected.contextDestroy = drm->ioctlExpected.contextCreate.load();
drm->ioctlHelper = std::make_unique<MockIoctlHelperXeDebug>(*drm);
drm->isVmBindAvailable();
drm->reset();
drm->ioctlHelper = std::make_unique<IoctlHelperXe>(*drm);
auto xeQueryEngines = reinterpret_cast<drm_xe_query_engines *>(drm->queryEngines);
xeQueryEngines->num_engines = 11;
xeQueryEngines->engines[0] = {{DRM_XE_ENGINE_CLASS_RENDER, 0, 0}, {}};
xeQueryEngines->engines[1] = {{DRM_XE_ENGINE_CLASS_COPY, 1, 0}, {}};
@@ -58,7 +68,9 @@ class DrmMockXeDebug : public DrmMockCustom {
xeQueryEngines->engines[8] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 8, 1}, {}};
xeQueryEngines->engines[9] = {{DRM_XE_ENGINE_CLASS_VIDEO_DECODE, 9, 1}, {}};
xeQueryEngines->engines[10] = {{DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE, 10, 0}, {}};
};
return drm;
}
int getErrno() override {
if (baseErrno) {
@@ -195,4 +207,9 @@ class DrmMockXeDebug : public DrmMockCustom {
// Debugger ioctls
int debuggerOpenRetval = 10; // debugFd
uint32_t debuggerOpenVersion = 0;
protected:
// Don't call directly, use the create() function
DrmMockXeDebug(RootDeviceEnvironment &rootDeviceEnvironment)
: DrmMockCustom(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {}
};

View File

@@ -52,9 +52,9 @@ TestedDrmMemoryManager::TestedDrmMemoryManager(bool enableLocalMemory,
BufferObject *TestedDrmMemoryManager::findAndReferenceSharedBufferObject(int boHandle, uint32_t rootDeviceIndex) {
if (failOnfindAndReferenceSharedBufferObject) {
DrmMockCustom drmMock(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]);
auto patIndex = drmMock.getPatIndex(nullptr, AllocationType::buffer, CacheRegion::defaultRegion, CachePolicy::writeBack, false, false);
return new (std::nothrow) BufferObject(rootDeviceIndex, &drmMock, patIndex, boHandle, 4096u, 2u);
auto drmMock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]);
auto patIndex = drmMock->getPatIndex(nullptr, AllocationType::buffer, CacheRegion::defaultRegion, CachePolicy::writeBack, false, false);
return new (std::nothrow) BufferObject(rootDeviceIndex, drmMock.release(), patIndex, boHandle, 4096u, 2u);
}
return MemoryManagerCreate<DrmMemoryManager>::findAndReferenceSharedBufferObject(boHandle, rootDeviceIndex);
}

View File

@@ -226,18 +226,28 @@ int DrmMockCustom::ioctl(DrmIoctl request, void *arg) {
return ioctlRes.load();
}
DrmMockCustom::DrmMockCustom(RootDeviceEnvironment &rootDeviceEnvironment)
: Drm(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {
reset();
auto &gfxCoreHelper = rootDeviceEnvironment.getHelper<NEO::GfxCoreHelper>();
ioctlExpected.contextCreate = static_cast<int>(gfxCoreHelper.getGpgpuEngineInstances(rootDeviceEnvironment).size());
ioctlExpected.contextDestroy = ioctlExpected.contextCreate.load();
setupIoctlHelper(rootDeviceEnvironment.getHardwareInfo()->platform.eProductFamily);
createVirtualMemoryAddressSpace(NEO::GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()));
isVmBindAvailable(); // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
reset();
std::unique_ptr<DrmMockCustom> DrmMockCustom::create(RootDeviceEnvironment &rootDeviceEnvironment) {
return DrmMockCustom::create(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment);
}
std::unique_ptr<DrmMockCustom> DrmMockCustom::create(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment) {
auto drm{new DrmMockCustom{std::move(hwDeviceId), rootDeviceEnvironment}};
drm->reset();
auto &gfxCoreHelper = rootDeviceEnvironment.getHelper<NEO::GfxCoreHelper>();
drm->ioctlExpected.contextCreate = static_cast<int>(gfxCoreHelper.getGpgpuEngineInstances(rootDeviceEnvironment).size());
drm->ioctlExpected.contextDestroy = drm->ioctlExpected.contextCreate.load();
drm->setupIoctlHelper(rootDeviceEnvironment.getHardwareInfo()->platform.eProductFamily);
drm->createVirtualMemoryAddressSpace(NEO::GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()));
drm->isVmBindAvailable();
drm->reset();
return std::unique_ptr<DrmMockCustom>{drm};
}
DrmMockCustom::DrmMockCustom(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment)
: Drm(std::move(hwDeviceId), rootDeviceEnvironment) {}
int DrmMockCustom::waitUserFence(uint32_t ctxId, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags, bool userInterrupt, uint32_t externalInterruptId, NEO::GraphicsAllocation *allocForInterruptWait) {
waitUserFenceCall.called++;
waitUserFenceCall.ctxId = ctxId;

View File

@@ -96,10 +96,12 @@ class DrmMockTime : public DrmMockSuccess {
}
};
class DrmMockCustom : public Drm {
public:
struct DrmMockCustom : public Drm {
static constexpr NEO::DriverModelType driverModelType = NEO::DriverModelType::drm;
static std::unique_ptr<DrmMockCustom> create(RootDeviceEnvironment &rootDeviceEnvironment);
static std::unique_ptr<DrmMockCustom> create(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment);
using Drm::bindAvailable;
using Drm::cacheInfo;
using Drm::checkToDisableScratchPage;
@@ -150,8 +152,6 @@ class DrmMockCustom : public Drm {
uint32_t called = 0u;
};
DrmMockCustom(RootDeviceEnvironment &rootDeviceEnvironment);
int waitUserFence(uint32_t ctxId, uint64_t address, uint64_t value, ValueWidth dataWidth, int64_t timeout, uint16_t flags, bool userInterrupt, uint32_t externalInterruptId, NEO::GraphicsAllocation *allocForInterruptWait) override;
bool getSetPairAvailable() override;
@@ -280,4 +280,8 @@ class DrmMockCustom : public Drm {
bool returnIoctlExtraErrorValue = false;
bool callBaseQueryGttSize = false;
protected:
// Don't call directly, use the create() function
DrmMockCustom(std::unique_ptr<HwDeviceIdDrm> &&hwDeviceId, RootDeviceEnvironment &rootDeviceEnvironment);
};

View File

@@ -7,17 +7,29 @@
#pragma once
#include "shared/source/helpers/gfx_core_helper.h"
#include "shared/test/common/os_interface/linux/device_command_stream_fixture.h"
#include "shared/test/common/os_interface/linux/device_command_stream_fixture_context.h"
class DrmMockCustomPrelim : public DrmMockCustom {
public:
struct DrmMockCustomPrelim : public DrmMockCustom {
using Drm::cacheInfo;
using Drm::ioctlHelper;
using Drm::memoryInfo;
DrmMockCustomPrelim(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockCustom(rootDeviceEnvironment) {
this->ioctlHelper = std::make_unique<IoctlHelperPrelim20>(*this);
static auto create(RootDeviceEnvironment &rootDeviceEnvironment) {
auto drm = std::unique_ptr<DrmMockCustomPrelim>(new DrmMockCustomPrelim{rootDeviceEnvironment});
drm->reset();
auto &gfxCoreHelper = rootDeviceEnvironment.getHelper<NEO::GfxCoreHelper>();
drm->ioctlExpected.contextCreate = static_cast<int>(gfxCoreHelper.getGpgpuEngineInstances(rootDeviceEnvironment).size());
drm->ioctlExpected.contextDestroy = drm->ioctlExpected.contextCreate.load();
drm->ioctlHelper = std::make_unique<IoctlHelperPrelim20>(*drm);
drm->createVirtualMemoryAddressSpace(NEO::GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()));
drm->isVmBindAvailable();
drm->reset();
return drm;
}
int ioctlExtra(DrmIoctl request, void *arg) override {
@@ -33,4 +45,9 @@ class DrmMockCustomPrelim : public DrmMockCustom {
}
DrmMockCustomPrelimContext context{};
protected:
// Don't call directly, use the create() function
DrmMockCustomPrelim(RootDeviceEnvironment &rootDeviceEnvironment)
: DrmMockCustom(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {}
};

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2023 Intel Corporation
* Copyright (C) 2022-2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -76,7 +76,7 @@ class DrmBufferObjectFixture {
const uint32_t rootDeviceIndex = 0u;
void setUp() {
this->mock = std::make_unique<DrmClass>(*executionEnvironment.rootDeviceEnvironments[0]);
this->mock = DrmClass::create(*executionEnvironment.rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, this->mock);
executionEnvironment.rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock.get(), 0u, false);
osContext.reset(new OsContextLinux(*this->mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor()));

View File

@@ -126,7 +126,7 @@ class DrmCommandStreamEnhancedTemplate : public ::testing::Test {
// make sure this is disabled, we don't want to test this now
debugManager.flags.EnableForcePin.set(false);
mock = new DrmType(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]);
mock = DrmType::create(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]).release();
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock, rootDeviceIndex, false);
@@ -207,7 +207,7 @@ class DrmCommandStreamEnhancedWithFailingExecTemplate : public ::testing::Test {
// make sure this is disabled, we don't want to test this now
debugManager.flags.EnableForcePin.set(false);
mock = new T(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]);
mock = T::create(*executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]).release();
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock, rootDeviceIndex, false);

View File

@@ -35,7 +35,7 @@ void DrmMemoryManagerFixture::setUp() {
MemoryManagementFixture::setUp();
executionEnvironment = MockDevice::prepareExecutionEnvironment(defaultHwInfo.get(), numRootDevices - 1);
setUp(new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]), false);
setUp(DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]).release(), false);
} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
void DrmMemoryManagerFixture::setUp(DrmMockCustom *mock, bool localMemoryEnabled) {
@@ -51,7 +51,7 @@ void DrmMemoryManagerFixture::setUp(DrmMockCustom *mock, bool localMemoryEnabled
auto rootDeviceEnvironment = executionEnvironment->rootDeviceEnvironments[i].get();
rootDeviceEnvironment->setHwInfoAndInitHelpers(defaultHwInfo.get());
rootDeviceEnvironment->osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment->osInterface->setDriverModel(std::unique_ptr<DriverModel>(new DrmMockCustom(*rootDeviceEnvironment)));
rootDeviceEnvironment->osInterface->setDriverModel(DrmMockCustom::create(*rootDeviceEnvironment));
rootDeviceEnvironment->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*rootDeviceEnvironment->osInterface->getDriverModel()->as<Drm>(), i, false);
MockRootDeviceEnvironment::resetBuiltins(rootDeviceEnvironment, new MockBuiltins);
rootDeviceEnvironment->initGmm();
@@ -113,7 +113,7 @@ void DrmMemoryManagerWithLocalMemoryFixture::setUp() {
MemoryManagementFixture::setUp();
executionEnvironment = MockDevice::prepareExecutionEnvironment(defaultHwInfo.get(), numRootDevices - 1);
auto drmMock = new DrmMockCustom{*executionEnvironment->rootDeviceEnvironments[1]};
auto drmMock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[1]).release();
drmMock->memoryInfo.reset(new MockMemoryInfo{*drmMock});
DrmMemoryManagerFixture::setUp(drmMock, true);
drmMock->reset();
@@ -138,7 +138,7 @@ void DrmMemoryManagerFixtureWithoutQuietIoctlExpectation::setUp(bool enableLocal
for (auto &rootDeviceEnvironment : executionEnvironment->rootDeviceEnvironments) {
rootDeviceEnvironment->setHwInfoAndInitHelpers(defaultHwInfo.get());
rootDeviceEnvironment->osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment->osInterface->setDriverModel(std::unique_ptr<DriverModel>(new DrmMockCustom(*rootDeviceEnvironment)));
rootDeviceEnvironment->osInterface->setDriverModel(DrmMockCustom::create(*rootDeviceEnvironment));
rootDeviceEnvironment->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*rootDeviceEnvironment->osInterface->getDriverModel()->as<Drm>(), i, false);
rootDeviceEnvironment->initGmm();
i++;

View File

@@ -102,7 +102,7 @@ class DrmMemoryManagerLocalMemoryWithCustomPrelimMockTest : public ::testing::Te
executionEnvironment->prepareRootDeviceEnvironments(1);
executionEnvironment->rootDeviceEnvironments[0]->setHwInfoAndInitHelpers(defaultHwInfo.get());
mock = new DrmMockCustomPrelim(*executionEnvironment->rootDeviceEnvironments[0]);
mock = DrmMockCustomPrelim::create(*executionEnvironment->rootDeviceEnvironments[0]).release();
mock->memoryInfo.reset(new MockMemoryInfo{*mock});
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
@@ -127,7 +127,7 @@ class DrmMemoryManagerFixturePrelim : public DrmMemoryManagerFixture {
MemoryManagementFixture::setUp();
executionEnvironment = MockDevice::prepareExecutionEnvironment(defaultHwInfo.get(), numRootDevices - 1);
mock = new DrmMockCustomPrelim(*executionEnvironment->rootDeviceEnvironments[0]);
mock = DrmMockCustomPrelim::create(*executionEnvironment->rootDeviceEnvironments[0]).release();
mock->memoryInfo.reset(new MemoryInfo(regionInfo, *mock));
DrmMemoryManagerFixture::setUp(mock, true);

View File

@@ -230,7 +230,7 @@ TEST_F(DrmBufferObjectTest, whenPrintExecutionBufferIsSetToTrueThenMessageFoundI
TEST(DrmBufferObjectSimpleTest, givenInvalidBoWhenValidateHostptrIsCalledThenErrorIsReturned) {
std::unique_ptr<uint32_t[]> buff(new uint32_t[256]);
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> mock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto mock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
executionEnvironment.rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock.get(), 0u, false);
OsContextLinux osContext(*mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
ASSERT_NE(nullptr, mock.get());
@@ -255,7 +255,7 @@ TEST(DrmBufferObjectSimpleTest, givenInvalidBoWhenValidateHostptrIsCalledThenErr
TEST(DrmBufferObjectSimpleTest, givenInvalidBoWhenPinIsCalledThenErrorIsReturned) {
std::unique_ptr<uint32_t[]> buff(new uint32_t[256]);
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> mock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto mock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
executionEnvironment.rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock.get(), 0u, false);
OsContextLinux osContext(*mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
ASSERT_NE(nullptr, mock.get());
@@ -279,7 +279,7 @@ TEST(DrmBufferObjectSimpleTest, givenInvalidBoWhenPinIsCalledThenErrorIsReturned
TEST(DrmBufferObjectSimpleTest, givenBufferObjectWhenConstructedWithASizeThenTheSizeIsInitialized) {
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> drmMock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto drmMock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
std::unique_ptr<BufferObject> bo(new BufferObject(0u, drmMock.get(), 3, 1, 0x1000, 1));
EXPECT_EQ(0x1000u, bo->peekSize());
@@ -289,7 +289,7 @@ TEST(DrmBufferObjectSimpleTest, givenArrayOfBosWhenPinnedThenAllBosArePinned) {
const auto rootDeviceIndex = 0u;
std::unique_ptr<uint32_t[]> buff(new uint32_t[256]);
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> mock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto mock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, mock.get());
OsContextLinux osContext(*mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
@@ -324,7 +324,7 @@ TEST(DrmBufferObjectSimpleTest, givenArrayOfBosWhenValidatedThenAllBosArePinned)
const auto rootDeviceIndex = 0u;
std::unique_ptr<uint32_t[]> buff(new uint32_t[256]);
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> mock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto mock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, mock.get());
OsContextLinux osContext(*mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2023 Intel Corporation
* Copyright (C) 2018-2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -42,7 +42,7 @@ HWTEST_F(DrmCommandStreamMMTest, GivenForcePinThenMemoryManagerCreatesPinBb) {
debugManager.flags.EnableForcePin.set(true);
MockExecutionEnvironment executionEnvironment;
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
executionEnvironment.rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
executionEnvironment.rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
@@ -62,7 +62,7 @@ HWTEST_F(DrmCommandStreamMMTest, givenForcePinDisabledWhenMemoryManagerIsCreated
debugManager.flags.EnableForcePin.set(false);
MockExecutionEnvironment executionEnvironment;
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
executionEnvironment.rootDeviceEnvironments[0]->setHwInfoAndInitHelpers(defaultHwInfo.get());
executionEnvironment.rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
@@ -85,7 +85,7 @@ HWTEST_F(DrmCommandStreamMMTest, givenExecutionEnvironmentWithMoreThanOneRootDev
executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->setHwInfoAndInitHelpers(defaultHwInfo.get());
executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->osInterface = std::make_unique<OSInterface>();
executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->initGmm();
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
executionEnvironment.rootDeviceEnvironments[rootDeviceIndex]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*drm, 0u, false);
}

View File

@@ -1001,7 +1001,7 @@ HWTEST_TEMPLATED_F(DrmCommandStreamTest, givenDrmCommandStreamReceiverWhenCreate
executionEnvironment.rootDeviceEnvironments[1]->setHwInfoAndInitHelpers(defaultHwInfo.get());
executionEnvironment.rootDeviceEnvironments[1]->initGmm();
executionEnvironment.rootDeviceEnvironments[1]->osInterface = std::make_unique<OSInterface>();
executionEnvironment.rootDeviceEnvironments[1]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0])));
executionEnvironment.rootDeviceEnvironments[1]->osInterface->setDriverModel(DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]));
auto csr = std::make_unique<MockDrmCsr<FamilyType>>(executionEnvironment, 1, 1, GemCloseWorkerMode::gemCloseWorkerActive);
auto pageTableManager = csr->createPageTableManager();
EXPECT_EQ(csr->pageTableManager.get(), pageTableManager);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2022-2023 Intel Corporation
* Copyright (C) 2022-2024 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -40,7 +40,7 @@ struct DrmCommandStreamMultiTileMemExecFixture {
executionEnvironment->incRefInternal();
executionEnvironment->initGmm();
mock = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
mock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]).release();
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock, 0, false);

View File

@@ -43,7 +43,7 @@ class DrmMemoryManagerFixtureImpl : public DrmMemoryManagerFixture {
MemoryManagementFixture::setUp();
executionEnvironment = MockDevice::prepareExecutionEnvironment(defaultHwInfo.get(), numRootDevices - 1);
mockExp = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
mockExp = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]).release();
DrmMemoryManagerFixture::setUp(mockExp, true);
}
@@ -92,7 +92,7 @@ class DrmMemoryManagerLocalMemoryWithCustomMockTest : public ::testing::Test {
executionEnvironment = new ExecutionEnvironment;
executionEnvironment->prepareRootDeviceEnvironments(1);
executionEnvironment->rootDeviceEnvironments[0]->setHwInfoAndInitHelpers(defaultHwInfo.get());
mock = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
mock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]).release();
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));

View File

@@ -1308,9 +1308,8 @@ TEST(DrmMemoryManagerTest2, givenDrmMemoryManagerWhengetSystemSharedMemoryIsCall
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
executionEnvironment->prepareRootDeviceEnvironments(4u);
for (auto i = 0u; i < 4u; i++) {
auto mock = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
executionEnvironment->rootDeviceEnvironments[i]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]));
executionEnvironment->rootDeviceEnvironments[i]->setHwInfoAndInitHelpers(defaultHwInfo.get());
executionEnvironment->rootDeviceEnvironments[i]->initGmm();
}
@@ -1345,9 +1344,8 @@ TEST(DrmMemoryManagerTest2, WhenGetMinimumSystemSharedMemoryThenCorrectValueIsRe
executionEnvironment->prepareRootDeviceEnvironments(4u);
for (auto i = 0u; i < 4u; i++) {
executionEnvironment->rootDeviceEnvironments[i]->setHwInfoAndInitHelpers(defaultHwInfo.get());
auto mock = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
executionEnvironment->rootDeviceEnvironments[i]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]));
executionEnvironment->rootDeviceEnvironments[i]->initGmm();
}
@@ -2465,8 +2463,8 @@ TEST_F(DrmMemoryManagerTest, givenDrmMemoryManagerWhenUnlockResourceIsCalledOnAl
DrmMemoryManagerToTestUnlockResource drmMemoryManager(*executionEnvironment, true, MemoryConstants::pageSize);
DrmMockCustom drmMock(*executionEnvironment->rootDeviceEnvironments[1]);
auto bo = new BufferObject(rootDeviceIndex, &drmMock, 3, 1, 0, 1);
auto drmMock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[1]);
auto bo = new BufferObject(rootDeviceIndex, drmMock.get(), 3, 1, 0, 1);
auto drmAllocation = new DrmAllocation(rootDeviceIndex, 1u /*num gmms*/, AllocationType::unknown, bo, nullptr, 0u, static_cast<osHandle>(0u), MemoryPool::localMemory);
drmMemoryManager.unlockResourceImpl(*drmAllocation);
@@ -2489,8 +2487,8 @@ TEST_F(DrmMemoryManagerTest, givenDrmMemoryManagerWhenSetDomainCpuIsCalledButFai
this->ioctlResExt = {mock->ioctlCnt.total, -1};
mock->ioctlResExt = &ioctlResExt;
DrmMockCustom drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
BufferObject bo(0u, &drmMock, 3, 1, 0, 1);
auto drmMock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]);
BufferObject bo(0u, drmMock.get(), 3, 1, 0, 1);
DrmAllocation drmAllocation(rootDeviceIndex, 1u /*num gmms*/, AllocationType::unknown, &bo, nullptr, 0u, static_cast<osHandle>(0u), MemoryPool::memoryNull);
EXPECT_NE(nullptr, drmAllocation.getBO());
@@ -2502,8 +2500,8 @@ TEST_F(DrmMemoryManagerTest, givenDrmMemoryManagerWhenSetDomainCpuIsCalledButFai
TEST_F(DrmMemoryManagerTest, givenDrmMemoryManagerWhenSetDomainCpuIsCalledOnAllocationThenReturnSetWriteDomain) {
mock->ioctlExpected.gemSetDomain = 1;
DrmMockCustom drmMock(*executionEnvironment->rootDeviceEnvironments[0]);
BufferObject bo(rootDeviceIndex, &drmMock, 3, 1, 0, 1);
auto drmMock = DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]);
BufferObject bo(rootDeviceIndex, drmMock.get(), 3, 1, 0, 1);
DrmAllocation drmAllocation(rootDeviceIndex, 1u /*num gmms*/, AllocationType::unknown, &bo, nullptr, 0u, static_cast<osHandle>(0u), MemoryPool::memoryNull);
EXPECT_NE(nullptr, drmAllocation.getBO());
@@ -3698,9 +3696,8 @@ TEST(DrmMemoryManagerWithExplicitExpectationsTest2, whenObtainFdFromHandleIsCall
executionEnvironment->prepareRootDeviceEnvironments(4u);
for (auto i = 0u; i < 4u; i++) {
executionEnvironment->rootDeviceEnvironments[i]->setHwInfoAndInitHelpers(defaultHwInfo.get());
auto mock = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
executionEnvironment->rootDeviceEnvironments[i]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]));
executionEnvironment->rootDeviceEnvironments[i]->initGmm();
}
auto memoryManager = std::make_unique<TestedDrmMemoryManager>(false, false, false, *executionEnvironment);
@@ -3722,9 +3719,8 @@ TEST(DrmMemoryManagerWithExplicitExpectationsTest2, whenFailingToObtainFdFromHan
executionEnvironment->prepareRootDeviceEnvironments(4u);
for (auto i = 0u; i < 4u; i++) {
executionEnvironment->rootDeviceEnvironments[i]->setHwInfoAndInitHelpers(defaultHwInfo.get());
auto mock = new DrmMockCustom(*executionEnvironment->rootDeviceEnvironments[0]);
executionEnvironment->rootDeviceEnvironments[i]->osInterface = std::make_unique<OSInterface>();
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(mock));
executionEnvironment->rootDeviceEnvironments[i]->osInterface->setDriverModel(DrmMockCustom::create(*executionEnvironment->rootDeviceEnvironments[0]));
executionEnvironment->rootDeviceEnvironments[i]->initGmm();
}
auto memoryManager = std::make_unique<TestedDrmMemoryManager>(false, false, false, *executionEnvironment);

View File

@@ -898,7 +898,7 @@ TEST_F(IoctlPrelimHelperTests, givenInvalidDrmWhenGettingGpuTimeThenFails) {
TEST_F(IoctlPrelimHelperTests, whenGettingTimeThenTimeIsCorrect) {
MockExecutionEnvironment executionEnvironment{};
auto drm = std::make_unique<DrmMockCustom>(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, drm);
MockIoctlHelperPrelim ioctlHelper{*drm};
@@ -930,7 +930,7 @@ TEST_F(IoctlPrelimHelperTests, givenInitializeGetGpuTimeFunctionNotCalledWhenSet
auto &rootDeviceEnvironment = *executionEnvironment.rootDeviceEnvironments[0];
rootDeviceEnvironment.osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique<DrmMockTime>(mockFd, rootDeviceEnvironment));
auto drm = std::make_unique<DrmMockCustom>(rootDeviceEnvironment);
auto drm = DrmMockCustom::create(rootDeviceEnvironment);
IoctlHelperPrelim20 ioctlHelper{*drm};
drm->ioctlRes = -1;

View File

@@ -797,7 +797,7 @@ TEST(IoctlHelperTestsUpstream, givenInvalidDrmWhenGettingGpuTimeThenFails) {
TEST(IoctlHelperTestsUpstream, whenGettingTimeThenTimeIsCorrect) {
MockExecutionEnvironment executionEnvironment{};
auto drm = std::make_unique<DrmMockCustom>(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
ASSERT_NE(nullptr, drm);
MockIoctlHelperUpstream ioctlHelper{*drm};
@@ -829,7 +829,7 @@ TEST(IoctlHelperTestsUpstream, givenInitializeGetGpuTimeFunctionNotCalledWhenSet
auto &rootDeviceEnvironment = *executionEnvironment.rootDeviceEnvironments[0];
rootDeviceEnvironment.osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique<DrmMockTime>(mockFd, rootDeviceEnvironment));
auto drm = std::make_unique<DrmMockCustom>(rootDeviceEnvironment);
auto drm = DrmMockCustom::create(rootDeviceEnvironment);
IoctlHelperUpstream ioctlHelper{*drm};
drm->ioctlRes = -1;

View File

@@ -22,7 +22,7 @@ using namespace NEO;
TEST(OSContextLinux, givenReinitializeContextWhenContextIsInitThenContextIsStillIinitializedAfter) {
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> mock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto mock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
executionEnvironment.rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock.get(), 0u, false);
OsContextLinux osContext(*mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());
EXPECT_NO_THROW(osContext.reInitializeContext());
@@ -42,7 +42,7 @@ TEST(OSContextLinux, givenInitializeContextWhenContextCreateIoctlFailsThenContex
TEST(OSContextLinux, givenOsContextLinuxWhenQueryingForOfflineDumpContextIdThenCorrectValueIsReturned) {
MockExecutionEnvironment executionEnvironment;
std::unique_ptr<DrmMockCustom> mock(new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]));
auto mock = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]);
executionEnvironment.rootDeviceEnvironments[0]->memoryOperationsInterface = DrmMemoryOperationsHandler::create(*mock.get(), 0u, false);
MockOsContextLinux osContext(*mock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor());

View File

@@ -200,7 +200,7 @@ TEST_F(DrmTimeTest, GivenInvalidFuncTimeWhenGettingGpuCpuTimeCpuThenFails) {
TEST_F(DrmTimeTest, givenGpuTimestampResolutionQueryWhenIoctlFailsThenDefaultResolutionIsReturned) {
auto defaultResolution = defaultHwInfo->capabilityTable.defaultProfilingTimerResolution;
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
osTime->updateDrm(drm);
drm->getParamRetValue = 0;
@@ -213,7 +213,7 @@ TEST_F(DrmTimeTest, givenGpuTimestampResolutionQueryWhenIoctlFailsThenDefaultRes
TEST_F(DrmTimeTest, givenGetDynamicDeviceTimerClockWhenIoctlFailsThenDefaultClockIsReturned) {
auto defaultResolution = defaultHwInfo->capabilityTable.defaultProfilingTimerResolution;
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
osTime->updateDrm(drm);
drm->getParamRetValue = 0;
@@ -225,7 +225,7 @@ TEST_F(DrmTimeTest, givenGetDynamicDeviceTimerClockWhenIoctlFailsThenDefaultCloc
}
TEST_F(DrmTimeTest, givenGetDynamicDeviceTimerClockWhenIoctlSucceedsThenNonDefaultClockIsReturned) {
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
osTime->updateDrm(drm);
uint64_t frequency = 1500;
@@ -236,7 +236,7 @@ TEST_F(DrmTimeTest, givenGetDynamicDeviceTimerClockWhenIoctlSucceedsThenNonDefau
}
TEST_F(DrmTimeTest, givenGpuTimestampResolutionQueryWhenIoctlSuccedsThenCorrectResolutionIsReturned) {
auto drm = new DrmMockCustom(*executionEnvironment.rootDeviceEnvironments[0]);
auto drm = DrmMockCustom::create(*executionEnvironment.rootDeviceEnvironments[0]).release();
osTime->updateDrm(drm);
// 19200000 is frequency yelding 52.083ns resolution

View File

@@ -32,14 +32,14 @@ TEST(IoctlHelperXeTest, whenCallingDebuggerOpenIoctlThenProperValueIsReturned) {
int ret;
DebugManagerStateRestore restorer;
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto mockXeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto mockXeIoctlHelper = drm->ioctlHelper.get();
drm.reset();
drm->reset();
drm_xe_eudebug_connect test = {};
ret = mockXeIoctlHelper->ioctl(DrmIoctl::debuggerOpen, &test);
EXPECT_EQ(ret, drm.debuggerOpenRetval);
EXPECT_EQ(ret, drm->debuggerOpenRetval);
}
TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetIoctForDebuggerThenCorrectValueReturned) {
@@ -60,8 +60,8 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetIoctForDebuggerThenCorre
TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingaddDebugMetadataThenDataIsAdded) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
uint64_t temp = 0;
xeIoctlHelper->addDebugMetadata(DrmResourceClass::moduleHeapDebugArea, &temp, 8000u);
ASSERT_EQ(1u, xeIoctlHelper->debugMetadata.size());
@@ -76,8 +76,8 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingaddDebugMetadataThenDataIsA
TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingVmCreateThenDebugMetadadaIsAttached) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
executionEnvironment->setDebuggingMode(DebuggingMode::offline);
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
uint64_t temp = 0;
xeIoctlHelper->addDebugMetadata(DrmResourceClass::moduleHeapDebugArea, &temp, 8000u);
xeIoctlHelper->addDebugMetadata(DrmResourceClass::contextSaveArea, &temp, 8000u);
@@ -88,31 +88,31 @@ TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingVmCreateThenDebugMetadadaIs
GemVmControl test = {};
xeIoctlHelper->ioctl(DrmIoctl::gemVmCreate, &test);
ASSERT_EQ(4u, drm.vmCreateMetadata.size());
ASSERT_EQ(drm.vmCreateMetadata[0].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_MODULE_AREA));
ASSERT_EQ(drm.vmCreateMetadata[0].offset, reinterpret_cast<unsigned long long>(&temp));
ASSERT_EQ(drm.vmCreateMetadata[0].len, 8000ul);
ASSERT_EQ(4u, drm->vmCreateMetadata.size());
ASSERT_EQ(drm->vmCreateMetadata[0].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_MODULE_AREA));
ASSERT_EQ(drm->vmCreateMetadata[0].offset, reinterpret_cast<unsigned long long>(&temp));
ASSERT_EQ(drm->vmCreateMetadata[0].len, 8000ul);
ASSERT_EQ(drm.vmCreateMetadata[1].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_SIP_AREA));
ASSERT_EQ(drm.vmCreateMetadata[1].offset, reinterpret_cast<unsigned long long>(&temp));
ASSERT_EQ(drm.vmCreateMetadata[1].len, 8000ul);
ASSERT_EQ(drm->vmCreateMetadata[1].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_SIP_AREA));
ASSERT_EQ(drm->vmCreateMetadata[1].offset, reinterpret_cast<unsigned long long>(&temp));
ASSERT_EQ(drm->vmCreateMetadata[1].len, 8000ul);
ASSERT_EQ(drm.vmCreateMetadata[2].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_SBA_AREA));
ASSERT_EQ(drm.vmCreateMetadata[2].offset, reinterpret_cast<unsigned long long>(&temp));
ASSERT_EQ(drm.vmCreateMetadata[2].len, 8000ul);
ASSERT_EQ(drm->vmCreateMetadata[2].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_SBA_AREA));
ASSERT_EQ(drm->vmCreateMetadata[2].offset, reinterpret_cast<unsigned long long>(&temp));
ASSERT_EQ(drm->vmCreateMetadata[2].len, 8000ul);
ASSERT_EQ(drm.vmCreateMetadata[3].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_COOKIE));
ASSERT_EQ(drm.vmCreateMetadata[3].offset, 123ul);
ASSERT_EQ(drm.vmCreateMetadata[3].len, 0ul);
ASSERT_EQ(drm.vmCreateMetadata[3].base.next_extension, 0ul);
ASSERT_EQ(drm->vmCreateMetadata[3].type, static_cast<unsigned long long>(DRM_XE_VM_DEBUG_METADATA_COOKIE));
ASSERT_EQ(drm->vmCreateMetadata[3].offset, 123ul);
ASSERT_EQ(drm->vmCreateMetadata[3].len, 0ul);
ASSERT_EQ(drm->vmCreateMetadata[3].base.next_extension, 0ul);
}
TEST(IoctlHelperXeTest, givenFreeDebugMetadataWhenVmCreateHasMultipleExtTypesThenOnlyDebugMetadataIsDeleted) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
executionEnvironment->setDebuggingMode(DebuggingMode::offline);
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
drm_xe_ext_vm_set_debug_metadata *node1 = new drm_xe_ext_vm_set_debug_metadata();
drm_xe_ext_vm_set_debug_metadata *node2 = new drm_xe_ext_vm_set_debug_metadata();
@@ -174,8 +174,8 @@ TEST(IoctlHelperXeTest, givenFreeDebugMetadataWhenVmCreateHasMultipleExtTypesThe
TEST(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingGetRunaloneExtPropertyThenCorrectValueReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
executionEnvironment->setDebuggingMode(DebuggingMode::offline);
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
EXPECT_EQ(xeIoctlHelper->getRunaloneExtProperty(), DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG);
}
@@ -193,19 +193,18 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenRunaloneModeRequiredReturnFalseWhenCreat
auto raiiFactory = RAIIGfxCoreHelperFactory<MockGfxCoreHelperHw>(rootDeviceEnvironment);
rootDeviceEnvironment.osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique<DrmMockTime>(mockFd, rootDeviceEnvironment));
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
drm.ioctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm.getIoctlHelper());
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
auto engineInfo = xeIoctlHelper->createEngineInfo(false);
ASSERT_NE(nullptr, engineInfo);
drm.engineInfo = std::move(engineInfo);
drm->engineInfo = std::move(engineInfo);
OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular}));
OsContextLinux osContext(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular}));
uint16_t deviceIndex = 1;
xeIoctlHelper->createDrmContext(drm, osContext, 0, deviceIndex, false);
xeIoctlHelper->createDrmContext(*drm, osContext, 0, deviceIndex, false);
auto ext = drm.receivedContextCreateSetParam;
auto ext = drm->receivedContextCreateSetParam;
EXPECT_NE(ext.property, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG));
}
@@ -215,28 +214,27 @@ HWTEST_F(IoctlHelperXeTestFixture, givenDeviceIndexWhenCreatingContextThenSetCor
rootDeviceEnvironment.osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique<DrmMockTime>(mockFd, rootDeviceEnvironment));
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
drm.ioctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm.getIoctlHelper());
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
xeIoctlHelper->initialize();
auto engineInfo = xeIoctlHelper->createEngineInfo(false);
ASSERT_NE(nullptr, engineInfo);
drm.engineInfo = std::move(engineInfo);
drm->engineInfo = std::move(engineInfo);
auto engineDescriptor = EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular});
engineDescriptor.isEngineInstanced = true;
OsContextLinux osContext(drm, 0, 0u, engineDescriptor);
OsContextLinux osContext(*drm, 0, 0u, engineDescriptor);
uint16_t tileId = 1u;
uint16_t expectedGtId = xeIoctlHelper->tileIdToGtId[tileId];
xeIoctlHelper->createDrmContext(drm, osContext, 0, tileId, false);
xeIoctlHelper->createDrmContext(*drm, osContext, 0, tileId, false);
EXPECT_EQ(1u, drm.execQueueCreateParams.num_placements);
ASSERT_EQ(1u, drm.execQueueEngineInstances.size());
EXPECT_EQ(1u, drm->execQueueCreateParams.num_placements);
ASSERT_EQ(1u, drm->execQueueEngineInstances.size());
EXPECT_EQ(expectedGtId, drm.execQueueEngineInstances[0].gt_id);
EXPECT_EQ(expectedGtId, drm->execQueueEngineInstances[0].gt_id);
}
HWTEST_F(IoctlHelperXeTestFixture, GivenRunaloneModeRequiredReturnTrueWhenCreateDrmContextThenRunAloneContextIsRequested) {
@@ -252,18 +250,17 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenRunaloneModeRequiredReturnTrueWhenCreate
auto raiiFactory = RAIIGfxCoreHelperFactory<MockGfxCoreHelperHw>(rootDeviceEnvironment);
rootDeviceEnvironment.osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique<DrmMockTime>(mockFd, rootDeviceEnvironment));
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
drm.ioctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm.getIoctlHelper());
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
auto engineInfo = xeIoctlHelper->createEngineInfo(false);
ASSERT_NE(nullptr, engineInfo);
drm.engineInfo = std::move(engineInfo);
drm->engineInfo = std::move(engineInfo);
OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular}));
xeIoctlHelper->createDrmContext(drm, osContext, 0, 1, false);
OsContextLinux osContext(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_CCS, EngineUsage::regular}));
xeIoctlHelper->createDrmContext(*drm, osContext, 0, 1, false);
auto ext = drm.receivedContextCreateSetParam;
auto ext = drm->receivedContextCreateSetParam;
EXPECT_EQ(ext.base.name, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY));
EXPECT_EQ(ext.base.next_extension, 0ULL);
EXPECT_EQ(ext.property, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG));
@@ -283,25 +280,24 @@ HWTEST_F(IoctlHelperXeTestFixture, GivenContextCreatedForCopyEngineWhenCreateDrm
auto raiiFactory = RAIIGfxCoreHelperFactory<MockGfxCoreHelperHw>(rootDeviceEnvironment);
rootDeviceEnvironment.osInterface = std::make_unique<OSInterface>();
rootDeviceEnvironment.osInterface->setDriverModel(std::make_unique<DrmMockTime>(mockFd, rootDeviceEnvironment));
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
drm.ioctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm.getIoctlHelper());
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
auto engineInfo = xeIoctlHelper->createEngineInfo(false);
ASSERT_NE(nullptr, engineInfo);
drm.engineInfo = std::move(engineInfo);
drm->engineInfo = std::move(engineInfo);
OsContextLinux osContext(drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_BCS1, EngineUsage::regular}));
xeIoctlHelper->createDrmContext(drm, osContext, 0, 0, false);
OsContextLinux osContext(*drm, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({aub_stream::EngineType::ENGINE_BCS1, EngineUsage::regular}));
xeIoctlHelper->createDrmContext(*drm, osContext, 0, 0, false);
auto ext = drm.receivedContextCreateSetParam;
auto ext = drm->receivedContextCreateSetParam;
EXPECT_NE(ext.property, static_cast<uint32_t>(DRM_XE_EXEC_QUEUE_SET_PROPERTY_EUDEBUG));
}
TEST(IoctlHelperXeTest, GivenXeDriverThenDebugAttachReturnsTrue) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
EXPECT_TRUE(xeIoctlHelper->isDebugAttachAvailable());
}
@@ -312,8 +308,8 @@ TEST(IoctlHelperXeTest, givenXeEnableEuDebugThenReturnCorrectValue) {
VariableBackup<char *> mockFreadBufferBackup(&IoFunctions::mockFreadBuffer, buffer.get());
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
buffer[0] = '1';
int enableEuDebug = xeIoctlHelper->getEuDebugSysFsEnable();
@@ -330,8 +326,8 @@ TEST(IoctlHelperXeTest, givenXeEnableEuDebugWithInvalidPathThenReturnCorrectValu
VariableBackup<char *> mockFreadBufferBackup(&IoFunctions::mockFreadBuffer, buffer.get());
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
buffer[0] = '1';
VariableBackup<FILE *> mockFopenReturnBackup(&IoFunctions::mockFopenReturned, nullptr);
@@ -342,65 +338,67 @@ TEST(IoctlHelperXeTest, givenXeEnableEuDebugWithInvalidPathThenReturnCorrectValu
TEST(IoctlHelperXeTest, givenXeRegisterResourceThenCorrectIoctlCalled) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
constexpr size_t bufferSize = 20;
uint8_t buffer[bufferSize];
auto id = xeIoctlHelper->registerResource(DrmResourceClass::elf, buffer, bufferSize);
EXPECT_EQ(drm.metadataID, id);
EXPECT_EQ(drm.metadataAddr, buffer);
EXPECT_EQ(drm.metadataSize, bufferSize);
EXPECT_EQ(drm.metadataType, static_cast<uint64_t>(DRM_XE_DEBUG_METADATA_ELF_BINARY));
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(DRM_XE_DEBUG_METADATA_ELF_BINARY));
drm.metadataID = 0;
drm.metadataAddr = nullptr;
drm.metadataSize = 0;
drm->metadataID = 0;
drm->metadataAddr = nullptr;
drm->metadataSize = 0;
id = xeIoctlHelper->registerResource(DrmResourceClass::l0ZebinModule, buffer, bufferSize);
EXPECT_EQ(drm.metadataID, id);
EXPECT_EQ(drm.metadataAddr, buffer);
EXPECT_EQ(drm.metadataSize, bufferSize);
EXPECT_EQ(drm.metadataType, static_cast<uint64_t>(DRM_XE_DEBUG_METADATA_PROGRAM_MODULE));
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(DRM_XE_DEBUG_METADATA_PROGRAM_MODULE));
drm.metadataID = 0;
drm.metadataAddr = nullptr;
drm.metadataSize = 0;
drm->metadataID = 0;
drm->metadataAddr = nullptr;
drm->metadataSize = 0;
id = xeIoctlHelper->registerResource(DrmResourceClass::contextSaveArea, buffer, bufferSize);
EXPECT_EQ(drm.metadataID, id);
EXPECT_EQ(drm.metadataAddr, buffer);
EXPECT_EQ(drm.metadataSize, bufferSize);
EXPECT_EQ(drm.metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA));
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SIP_AREA));
drm.metadataID = 0;
drm.metadataAddr = nullptr;
drm.metadataSize = 0;
drm->metadataID = 0;
drm->metadataAddr = nullptr;
drm->metadataSize = 0;
id = xeIoctlHelper->registerResource(DrmResourceClass::sbaTrackingBuffer, buffer, bufferSize);
EXPECT_EQ(drm.metadataID, id);
EXPECT_EQ(drm.metadataAddr, buffer);
EXPECT_EQ(drm.metadataSize, bufferSize);
EXPECT_EQ(drm.metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SBA_AREA));
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_SBA_AREA));
drm.metadataID = 0;
drm.metadataAddr = nullptr;
drm.metadataSize = 0;
drm->metadataID = 0;
drm->metadataAddr = nullptr;
drm->metadataSize = 0;
id = xeIoctlHelper->registerResource(DrmResourceClass::moduleHeapDebugArea, buffer, bufferSize);
EXPECT_EQ(drm.metadataID, id);
EXPECT_EQ(drm.metadataAddr, buffer);
EXPECT_EQ(drm.metadataSize, bufferSize);
EXPECT_EQ(drm.metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_MODULE_AREA));
EXPECT_EQ(drm->metadataID, id);
EXPECT_EQ(drm->metadataAddr, buffer);
EXPECT_EQ(drm->metadataSize, bufferSize);
EXPECT_EQ(drm->metadataType, static_cast<uint64_t>(WORK_IN_PROGRESS_DRM_XE_DEBUG_METADATA_MODULE_AREA));
}
TEST(IoctlHelperXeTest, givenXeunregisterResourceThenCorrectIoctlCalled) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
xeIoctlHelper->unregisterResource(0x1234);
EXPECT_EQ(drm.metadataID, 0x1234u);
EXPECT_EQ(drm->metadataID, 0x1234u);
}
TEST(IoctlHelperXeTest, whenGettingVmBindExtFromHandlesThenProperStructsAreReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXeDebug drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<MockIoctlHelperXeDebug>(drm);
auto drm = DrmMockXeDebug::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = static_cast<MockIoctlHelperXeDebug *>(drm->ioctlHelper.get());
StackVec<uint32_t, 2> bindExtHandles;
bindExtHandles.push_back(1u);
bindExtHandles.push_back(2u);

View File

@@ -15,8 +15,8 @@ using namespace NEO;
TEST(IoctlHelperXeTest, whenCallingGetEuStallPropertiesThenFailueIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
std::array<uint64_t, 12u> properties = {};
EXPECT_FALSE(xeIoctlHelper.get()->getEuStallProperties(properties, 0x101, 0x102, 0x103, 1, 20u));
@@ -24,8 +24,8 @@ TEST(IoctlHelperXeTest, whenCallingGetEuStallPropertiesThenFailueIsReturned) {
TEST(IoctlHelperXeTest, whenCallingPerfOpenEuStallStreamThenFailueIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
int32_t invalidFd = -1;
std::array<uint64_t, 12u> properties = {};
@@ -34,8 +34,8 @@ TEST(IoctlHelperXeTest, whenCallingPerfOpenEuStallStreamThenFailueIsReturned) {
TEST(IoctlHelperXeTest, whenCallingPerfDisableEuStallStreamThenFailueIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
int32_t invalidFd = -1;
EXPECT_FALSE(xeIoctlHelper.get()->perfDisableEuStallStream(&invalidFd));
@@ -43,56 +43,56 @@ TEST(IoctlHelperXeTest, whenCallingPerfDisableEuStallStreamThenFailueIsReturned)
TEST(IoctlHelperXeTest, whenCallingGetIoctlRequestValuePerfOpenThenZeroisReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
EXPECT_EQ(0u, xeIoctlHelper.get()->getIoctlRequestValuePerf(DrmIoctl::perfOpen));
}
TEST(IoctlHelperXeTest, whenCallingGetIoctlRequestValuePerfEnableThenZeroisReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
EXPECT_EQ(0u, xeIoctlHelper.get()->getIoctlRequestValuePerf(DrmIoctl::perfEnable));
}
TEST(IoctlHelperXeTest, whenCallingGetIoctlRequestValuePerfDisableThenZeroisReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
EXPECT_EQ(0u, xeIoctlHelper.get()->getIoctlRequestValuePerf(DrmIoctl::perfDisable));
}
TEST(IoctlHelperXeTest, whenCallingPerfOpenIoctlWithInvalidValuesThenZeroisReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
EXPECT_EQ(0, xeIoctlHelper.get()->perfOpenIoctl(DrmIoctl::perfOpen, nullptr));
}
TEST(IoctlHelperXeTest, whenCallingGetIoctlRequestValueWithInvalidValueThenErrorReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
EXPECT_EQ(0u, xeIoctlHelper.get()->getIoctlRequestValuePerf(DrmIoctl::version));
}
TEST(IoctlHelperXeTest, whenCallingPerfOpenIoctlThenProperValueIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
EXPECT_EQ(0, xeIoctlHelper.get()->ioctl(DrmIoctl::perfOpen, nullptr));
}
TEST(IoctlHelperXeTest, whenCallingPerfDisableIoctlThenProperValueIsReturned) {
auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments[0]};
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(drm);
auto drm = DrmMockXe::create(*executionEnvironment->rootDeviceEnvironments[0]);
auto xeIoctlHelper = std::make_unique<IoctlHelperXe>(*drm);
EXPECT_NE(nullptr, xeIoctlHelper);
int32_t invalidFd = -1;
EXPECT_EQ(0, xeIoctlHelper.get()->ioctl(invalidFd, DrmIoctl::perfDisable, nullptr));

View File

@@ -77,93 +77,13 @@ inline constexpr int testValueVmId = 0x5764;
inline constexpr int testValueMapOff = 0x7788;
inline constexpr int testValuePrime = 0x4321;
inline constexpr uint32_t testValueGemCreate = 0x8273;
class DrmMockXe : public DrmMockCustom {
public:
DrmMockXe(RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockCustom(rootDeviceEnvironment) {
struct DrmMockXe : public DrmMockCustom {
auto xeQueryConfig = reinterpret_cast<drm_xe_query_config *>(queryConfig);
xeQueryConfig->num_params = 6;
xeQueryConfig->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] = (revId << 16) | devId;
xeQueryConfig->info[DRM_XE_QUERY_CONFIG_VA_BITS] = 48;
xeQueryConfig->info[DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY] = mockMaxExecQueuePriority;
static auto create(RootDeviceEnvironment &rootDeviceEnvironment) {
auto drm = std::unique_ptr<DrmMockXe>(new DrmMockXe{rootDeviceEnvironment});
drm->initInstance();
auto xeQueryEngines = reinterpret_cast<drm_xe_query_engines *>(queryEngines);
xeQueryEngines->num_engines = 11;
xeQueryEngines->engines[0] = {{DRM_XE_ENGINE_CLASS_RENDER, 0, 0}, {}};
xeQueryEngines->engines[1] = {{DRM_XE_ENGINE_CLASS_COPY, 1, 0}, {}};
xeQueryEngines->engines[2] = {{DRM_XE_ENGINE_CLASS_COPY, 2, 0}, {}};
xeQueryEngines->engines[3] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 3, 0}, {}};
xeQueryEngines->engines[4] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 4, 0}, {}};
xeQueryEngines->engines[5] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 5, 1}, {}};
xeQueryEngines->engines[6] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 6, 1}, {}};
xeQueryEngines->engines[7] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 7, 1}, {}};
xeQueryEngines->engines[8] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 8, 1}, {}};
xeQueryEngines->engines[9] = {{DRM_XE_ENGINE_CLASS_VIDEO_DECODE, 9, 1}, {}};
xeQueryEngines->engines[10] = {{DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE, 10, 0}, {}};
auto xeQueryMemUsage = reinterpret_cast<drm_xe_query_mem_regions *>(queryMemUsage);
xeQueryMemUsage->num_mem_regions = 3;
xeQueryMemUsage->mem_regions[0] = {
DRM_XE_MEM_REGION_CLASS_VRAM, // class
1, // instance
MemoryConstants::pageSize, // min page size
2 * MemoryConstants::gigaByte, // total size
MemoryConstants::megaByte // used size
};
xeQueryMemUsage->mem_regions[1] = {
DRM_XE_MEM_REGION_CLASS_SYSMEM, // class
0, // instance
MemoryConstants::pageSize, // min page size
MemoryConstants::gigaByte, // total size
MemoryConstants::kiloByte // used size
};
xeQueryMemUsage->mem_regions[2] = {
DRM_XE_MEM_REGION_CLASS_VRAM, // class
2, // instance
MemoryConstants::pageSize, // min page size
4 * MemoryConstants::gigaByte, // total size
MemoryConstants::gigaByte // used size
};
queryGtList.resize(49); // 1 qword for num gts and 12 qwords per gt
auto xeQueryGtList = reinterpret_cast<drm_xe_query_gt_list *>(queryGtList.begin());
xeQueryGtList->num_gt = 4;
xeQueryGtList->gt_list[0] = {
DRM_XE_QUERY_GT_TYPE_MAIN, // type
0, // tile_id
0, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b100, // native mem regions
0x011, // slow mem regions
};
xeQueryGtList->gt_list[1] = {
DRM_XE_QUERY_GT_TYPE_MEDIA, // type
1, // tile_id
1, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b001, // native mem regions
0x110, // slow mem regions
};
xeQueryGtList->gt_list[2] = {
DRM_XE_QUERY_GT_TYPE_MAIN, // type
1, // tile_id
2, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b010, // native mem regions
0x101, // slow mem regions
};
xeQueryGtList->gt_list[3] = {
DRM_XE_QUERY_GT_TYPE_MAIN, // type
2, // tile_id
3, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b100, // native mem regions
0x011, // slow mem regions
};
return drm;
}
void testMode(int f, int a = 0) {
@@ -393,4 +313,106 @@ class DrmMockXe : public DrmMockCustom {
uint16_t createParamsCpuCaching = 0u;
uint32_t createParamsPlacement = 0u;
bool ioctlCalled = false;
protected:
// Don't call directly, use the create() function
DrmMockXe(RootDeviceEnvironment &rootDeviceEnvironment)
: DrmMockCustom(std::make_unique<HwDeviceIdDrm>(mockFd, mockPciPath), rootDeviceEnvironment) {}
virtual void initInstance() {
this->reset();
auto &gfxCoreHelper = rootDeviceEnvironment.getHelper<NEO::GfxCoreHelper>();
this->ioctlExpected.contextCreate = static_cast<int>(gfxCoreHelper.getGpgpuEngineInstances(rootDeviceEnvironment).size());
this->ioctlExpected.contextDestroy = this->ioctlExpected.contextCreate.load();
this->ioctlHelper = std::make_unique<MockIoctlHelperXe>(*this);
this->createVirtualMemoryAddressSpace(NEO::GfxCoreHelper::getSubDevicesCount(rootDeviceEnvironment.getHardwareInfo()));
this->isVmBindAvailable();
auto xeQueryConfig = reinterpret_cast<drm_xe_query_config *>(this->queryConfig);
xeQueryConfig->num_params = 6;
xeQueryConfig->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] = (this->revId << 16) | this->devId;
xeQueryConfig->info[DRM_XE_QUERY_CONFIG_VA_BITS] = 48;
xeQueryConfig->info[DRM_XE_QUERY_CONFIG_MAX_EXEC_QUEUE_PRIORITY] = mockMaxExecQueuePriority;
auto xeQueryEngines = reinterpret_cast<drm_xe_query_engines *>(this->queryEngines);
xeQueryEngines->num_engines = 11;
xeQueryEngines->engines[0] = {{DRM_XE_ENGINE_CLASS_RENDER, 0, 0}, {}};
xeQueryEngines->engines[1] = {{DRM_XE_ENGINE_CLASS_COPY, 1, 0}, {}};
xeQueryEngines->engines[2] = {{DRM_XE_ENGINE_CLASS_COPY, 2, 0}, {}};
xeQueryEngines->engines[3] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 3, 0}, {}};
xeQueryEngines->engines[4] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 4, 0}, {}};
xeQueryEngines->engines[5] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 5, 1}, {}};
xeQueryEngines->engines[6] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 6, 1}, {}};
xeQueryEngines->engines[7] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 7, 1}, {}};
xeQueryEngines->engines[8] = {{DRM_XE_ENGINE_CLASS_COMPUTE, 8, 1}, {}};
xeQueryEngines->engines[9] = {{DRM_XE_ENGINE_CLASS_VIDEO_DECODE, 9, 1}, {}};
xeQueryEngines->engines[10] = {{DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE, 10, 0}, {}};
auto xeQueryMemUsage = reinterpret_cast<drm_xe_query_mem_regions *>(this->queryMemUsage);
xeQueryMemUsage->num_mem_regions = 3;
xeQueryMemUsage->mem_regions[0] = {
DRM_XE_MEM_REGION_CLASS_VRAM, // class
1, // instance
MemoryConstants::pageSize, // min page size
2 * MemoryConstants::gigaByte, // total size
MemoryConstants::megaByte // used size
};
xeQueryMemUsage->mem_regions[1] = {
DRM_XE_MEM_REGION_CLASS_SYSMEM, // class
0, // instance
MemoryConstants::pageSize, // min page size
MemoryConstants::gigaByte, // total size
MemoryConstants::kiloByte // used size
};
xeQueryMemUsage->mem_regions[2] = {
DRM_XE_MEM_REGION_CLASS_VRAM, // class
2, // instance
MemoryConstants::pageSize, // min page size
4 * MemoryConstants::gigaByte, // total size
MemoryConstants::gigaByte // used size
};
this->queryGtList.resize(49); // 1 qword for num gts and 12 qwords per gt
auto xeQueryGtList = reinterpret_cast<drm_xe_query_gt_list *>(this->queryGtList.begin());
xeQueryGtList->num_gt = 4;
xeQueryGtList->gt_list[0] = {
DRM_XE_QUERY_GT_TYPE_MAIN, // type
0, // tile_id
0, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b100, // native mem regions
0x011, // slow mem regions
};
xeQueryGtList->gt_list[1] = {
DRM_XE_QUERY_GT_TYPE_MEDIA, // type
1, // tile_id
1, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b001, // native mem regions
0x110, // slow mem regions
};
xeQueryGtList->gt_list[2] = {
DRM_XE_QUERY_GT_TYPE_MAIN, // type
1, // tile_id
2, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b010, // native mem regions
0x101, // slow mem regions
};
xeQueryGtList->gt_list[3] = {
DRM_XE_QUERY_GT_TYPE_MAIN, // type
2, // tile_id
3, // gt_id
{0}, // padding
mockTimestampFrequency, // reference_clock
0b100, // native mem regions
0x011, // slow mem regions
};
this->reset();
}
};