Skip to content

Commit de0361c

Browse files
Test prelim VM bind, debug
Signed-off-by: Daniel Chabrowski [email protected] Related-To: NEO-6591
1 parent 439389a commit de0361c

File tree

5 files changed

+341
-3
lines changed

5 files changed

+341
-3
lines changed

shared/test/common/libult/linux/drm_mock_prelim_context.cpp

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
6161
if (setParam->param.param == PRELIM_I915_CONTEXT_PARAM_ACC) {
6262
const auto paramAcc = reinterpret_cast<prelim_drm_i915_gem_context_param_acc *>(setParam->param.value);
6363
receivedContextParamAcc = GemContextParamAcc{paramAcc->trigger, paramAcc->notify, paramAcc->granularity};
64+
} else if (setParam->param.param == PRELIM_I915_CONTEXT_PARAM_RUNALONE) {
65+
receivedContextCreateExtSetParamRunaloneCount++;
6466
}
6567
return 0;
6668
} break;
@@ -110,11 +112,21 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
110112
vmBind->flags,
111113
vmBind->extensions,
112114
};
115+
storeVmBindExtensions(vmBind->extensions);
113116
return vmBindReturn;
114117
} break;
115118
case PRELIM_DRM_IOCTL_I915_GEM_VM_UNBIND: {
116119
vmUnbindCalled++;
117-
vmUnbindHandle = reinterpret_cast<prelim_drm_i915_gem_vm_bind *>(arg)->handle;
120+
const auto vmBind = reinterpret_cast<prelim_drm_i915_gem_vm_bind *>(arg);
121+
receivedVmUnbind = VmBindParams{
122+
vmBind->vm_id,
123+
vmBind->handle,
124+
vmBind->start,
125+
vmBind->offset,
126+
vmBind->length,
127+
vmBind->flags,
128+
vmBind->extensions,
129+
};
118130
return vmUnbindReturn;
119131
} break;
120132
case PRELIM_DRM_IOCTL_I915_GEM_CREATE_EXT: {
@@ -172,6 +184,15 @@ int DrmMockPrelimContext::handlePrelimRequest(unsigned long request, void *arg)
172184
};
173185
return 0;
174186
} break;
187+
case DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM: {
188+
const auto req = reinterpret_cast<drm_i915_gem_context_param *>(arg);
189+
if (req->param == PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAGS) {
190+
receivedSetContextParamValue = req->value;
191+
receivedSetContextParamCtxId = req->ctx_id;
192+
}
193+
194+
return !contextDebugSupported ? EINVAL : 0;
195+
} break;
175196
case PRELIM_DRM_IOCTL_I915_UUID_REGISTER: {
176197
auto uuidControl = reinterpret_cast<prelim_drm_i915_uuid_control *>(arg);
177198

@@ -374,6 +395,26 @@ bool DrmMockPrelimContext::handlePrelimQueryItem(void *arg) {
374395
return true;
375396
}
376397

398+
void DrmMockPrelimContext::storeVmBindExtensions(uint64_t ptr) {
399+
if (ptr == 0) {
400+
return;
401+
}
402+
403+
size_t uuidIndex{0};
404+
auto baseExt = reinterpret_cast<i915_user_extension *>(ptr);
405+
while (baseExt) {
406+
if (baseExt->name == PRELIM_I915_VM_BIND_EXT_SYNC_FENCE) {
407+
const auto *ext = reinterpret_cast<prelim_drm_i915_vm_bind_ext_sync_fence *>(baseExt);
408+
receivedVmBindSyncFence = {ext->addr, ext->val};
409+
} else if (baseExt->name == PRELIM_I915_VM_BIND_EXT_UUID) {
410+
const auto *ext = reinterpret_cast<prelim_drm_i915_vm_bind_ext_uuid *>(baseExt);
411+
receivedVmBindUuidExt[uuidIndex++] = UuidVmBindExt{ext->uuid_handle, ext->base.next_extension};
412+
}
413+
414+
baseExt = reinterpret_cast<i915_user_extension *>(baseExt->next_extension);
415+
}
416+
}
417+
377418
uint32_t DrmPrelimHelper::getQueryComputeSlicesIoctl() {
378419
return PRELIM_DRM_I915_QUERY_COMPUTE_SLICES;
379420
}
@@ -433,3 +474,11 @@ uint64_t DrmPrelimHelper::getCaptureVmBindFlag() {
433474
uint64_t DrmPrelimHelper::getImmediateVmBindFlag() {
434475
return PRELIM_I915_GEM_VM_BIND_IMMEDIATE;
435476
}
477+
478+
uint64_t DrmPrelimHelper::getMakeResidentVmBindFlag() {
479+
return PRELIM_I915_GEM_VM_BIND_MAKE_RESIDENT;
480+
}
481+
482+
uint64_t DrmPrelimHelper::getSIPContextParamDebugFlag() {
483+
return PRELIM_I915_CONTEXT_PARAM_DEBUG_FLAG_SIP;
484+
}

shared/test/common/libult/linux/drm_mock_prelim_context.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@ struct WaitUserFence {
5555
int64_t timeout{0};
5656
};
5757

58+
struct SyncFenceVmBindExt {
59+
uint64_t addr;
60+
uint64_t val;
61+
};
62+
63+
struct UuidVmBindExt {
64+
uint32_t handle;
65+
uint64_t nextExtension;
66+
};
67+
5868
struct DrmMockPrelimContext {
5969
const HardwareInfo *hwInfo;
6070
const RootDeviceEnvironment &rootDeviceEnvironment;
@@ -67,16 +77,22 @@ struct DrmMockPrelimContext {
6777
uint16_t maxNumWays{32};
6878
uint32_t allocNumWays{0};
6979

80+
uint64_t receivedSetContextParamValue{0};
81+
uint64_t receivedSetContextParamCtxId{0};
82+
uint64_t receivedContextCreateExtSetParamRunaloneCount{0};
83+
7084
size_t vmBindQueryCalled{0};
7185
int vmBindQueryValue{0};
7286
int vmBindQueryReturn{0};
7387

7488
size_t vmBindCalled{0};
7589
std::optional<VmBindParams> receivedVmBind{};
90+
std::optional<SyncFenceVmBindExt> receivedVmBindSyncFence{};
91+
std::optional<UuidVmBindExt> receivedVmBindUuidExt[2]{};
7692
int vmBindReturn{0};
7793

7894
size_t vmUnbindCalled{0};
79-
std::optional<uint32_t> vmUnbindHandle{};
95+
std::optional<VmBindParams> receivedVmUnbind{};
8096
int vmUnbindReturn{0};
8197

8298
int hasPageFaultQueryValue{0};
@@ -101,6 +117,7 @@ struct DrmMockPrelimContext {
101117

102118
int handlePrelimRequest(unsigned long request, void *arg);
103119
bool handlePrelimQueryItem(void *arg);
120+
void storeVmBindExtensions(uint64_t ptr);
104121
};
105122

106123
namespace DrmPrelimHelper {
@@ -119,4 +136,6 @@ uint64_t getU8WaitUserFenceFlag();
119136
uint64_t getU16WaitUserFenceFlag();
120137
uint64_t getCaptureVmBindFlag();
121138
uint64_t getImmediateVmBindFlag();
139+
uint64_t getMakeResidentVmBindFlag();
140+
uint64_t getSIPContextParamDebugFlag();
122141
}; // namespace DrmPrelimHelper

shared/test/unit_test/os_interface/linux/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ set(NEO_CORE_OS_INTERFACE_TESTS_LINUX
1010
${CMAKE_CURRENT_SOURCE_DIR}/device_factory_tests_linux.h
1111
${CMAKE_CURRENT_SOURCE_DIR}/drm_bind_tests.cpp
1212
${CMAKE_CURRENT_SOURCE_DIR}/drm_command_stream_l0_tests.cpp
13-
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_debug_tests.cpp
1413
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_engine_info_tests.cpp
1514
${CMAKE_CURRENT_SOURCE_DIR}/drm_mock_impl.h
1615
${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}drm_query_tests.cpp
@@ -28,6 +27,7 @@ if(NEO_ENABLE_i915_PRELIM_DETECTION)
2827
${CMAKE_CURRENT_SOURCE_DIR}/drm_query_topology_prelim_tests.cpp
2928
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_info_prelim_tests.cpp
3029
${CMAKE_CURRENT_SOURCE_DIR}/drm_with_prelim_tests.cpp
30+
${CMAKE_CURRENT_SOURCE_DIR}/drm_vm_bind_prelim_tests.cpp
3131
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_prelim.cpp
3232
${CMAKE_CURRENT_SOURCE_DIR}/prelim_helper_func.cpp
3333
)
@@ -41,6 +41,7 @@ endif()
4141

4242
if("${BRANCH_TYPE}" STREQUAL "")
4343
list(APPEND NEO_CORE_OS_INTERFACE_TESTS_LINUX
44+
${CMAKE_CURRENT_SOURCE_DIR}/drm_debug_tests.cpp
4445
${CMAKE_CURRENT_SOURCE_DIR}/drm_memory_info_tests.cpp
4546
${CMAKE_CURRENT_SOURCE_DIR}/ioctl_helper_tests_upstream.cpp
4647
)

shared/test/unit_test/os_interface/linux/drm_debug_prelim_tests.cpp

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66
*/
77

88
#include "shared/source/os_interface/linux/drm_debug.h"
9+
#include "shared/source/os_interface/linux/os_context_linux.h"
10+
#include "shared/test/common/helpers/engine_descriptor_helper.h"
911
#include "shared/test/common/libult/linux/drm_query_mock.h"
12+
#include "shared/test/common/mocks/linux/mock_drm_allocation.h"
13+
#include "shared/test/common/mocks/linux/mock_drm_memory_manager.h"
1014
#include "shared/test/common/test_macros/matchers.h"
1115
#include "shared/test/common/test_macros/test.h"
1216

@@ -234,3 +238,142 @@ TEST(DrmPrelimTest, givenContextDebugNotAvailableWhenCheckedForSupportThenTrueIs
234238
EXPECT_FALSE(drm->isContextDebugSupported());
235239
EXPECT_EQ(prevIoctls + 1u, drm->ioctlCallsCount);
236240
}
241+
242+
TEST_F(DrmDebugPrelimTest, givenAddedBindExtHandlesInBoWhenBindingWithinDefaultEngineContextThenExtensionsArePassedToVmBindIoctl) {
243+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
244+
executionEnvironment->prepareRootDeviceEnvironments(1);
245+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(NEO::defaultHwInfo.get());
246+
executionEnvironment->initializeMemoryManager();
247+
DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
248+
249+
MockBufferObject bo(&drm, 0, 0, 1);
250+
bo.addBindExtHandle(4);
251+
bo.addBindExtHandle(5);
252+
253+
OsContextLinux osContext(drm, 0u, EngineDescriptorHelper::getDefaultDescriptor());
254+
osContext.ensureContextInitialized();
255+
bo.bind(&osContext, 0);
256+
257+
EXPECT_NE(0u, drm.context.receivedVmBind->extensions);
258+
259+
EXPECT_EQ(4u, drm.context.receivedVmBindUuidExt[0]->handle);
260+
EXPECT_NE(0u, drm.context.receivedVmBindUuidExt[0]->nextExtension);
261+
262+
EXPECT_EQ(5u, drm.context.receivedVmBindUuidExt[1]->handle);
263+
EXPECT_EQ(0u, drm.context.receivedVmBindUuidExt[1]->nextExtension);
264+
}
265+
266+
TEST_F(DrmDebugPrelimTest, givenAddedBindExtHandlesInBoWhenBindingWithinInternalContextThenExtensionsAreNotPassedToVmBindIoctl) {
267+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
268+
executionEnvironment->prepareRootDeviceEnvironments(1);
269+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(NEO::defaultHwInfo.get());
270+
executionEnvironment->initializeMemoryManager();
271+
DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
272+
273+
MockBufferObject bo(&drm, 0, 0, 1);
274+
bo.addBindExtHandle(4);
275+
bo.addBindExtHandle(5);
276+
277+
OsContextLinux osContext(drm, 0u, {{aub_stream::EngineType::ENGINE_RCS, EngineUsage::Internal}, 1 /*deviceBitfield*/, PreemptionMode::Disabled, true /* isRootDevice*/, false /* isEngineInstanced*/});
278+
osContext.ensureContextInitialized();
279+
bo.bind(&osContext, 0);
280+
281+
EXPECT_FALSE(drm.context.receivedVmBindUuidExt[0]);
282+
}
283+
284+
TEST_F(DrmDebugPrelimTest, givenAddedBindExtHandlesInBoWhenBindingWithinCopyEngineContextThenExtensionsAreNotPassedToVmBindIoctl) {
285+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
286+
executionEnvironment->prepareRootDeviceEnvironments(1);
287+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(NEO::defaultHwInfo.get());
288+
executionEnvironment->initializeMemoryManager();
289+
DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
290+
291+
MockBufferObject bo(&drm, 0, 0, 1);
292+
bo.addBindExtHandle(4);
293+
bo.addBindExtHandle(5);
294+
295+
drm.context.receivedVmBindUuidExt[0].reset();
296+
297+
OsContextLinux osContext(drm, 0u, {{aub_stream::EngineType::ENGINE_BCS, EngineUsage::Regular}, 1 /*deviceBitfield*/, PreemptionMode::Disabled, true /* isRootDevice*/, false /* isEngineInstanced*/});
298+
osContext.ensureContextInitialized();
299+
bo.bind(&osContext, 0);
300+
301+
EXPECT_FALSE(drm.context.receivedVmBindUuidExt[0]);
302+
}
303+
304+
HWTEST_F(DrmDebugPrelimTest, givenAddedBindExtHandlesInBoWhenUnbindingThenExtensionsAreNotSet) {
305+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
306+
executionEnvironment->prepareRootDeviceEnvironments(1);
307+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(NEO::defaultHwInfo.get());
308+
executionEnvironment->initializeMemoryManager();
309+
DrmQueryMock drm{*executionEnvironment->rootDeviceEnvironments[0]};
310+
311+
MockBufferObject bo(&drm, 0, 0, 1);
312+
bo.addBindExtHandle(4);
313+
bo.addBindExtHandle(5);
314+
315+
OsContextLinux osContext(drm, 0u, EngineDescriptorHelper::getDefaultDescriptor());
316+
osContext.ensureContextInitialized();
317+
bo.bind(&osContext, 0);
318+
EXPECT_NE(0u, drm.context.receivedVmBind->extensions);
319+
320+
drm.context.receivedVmUnbind->extensions = 0;
321+
322+
bo.unbind(&osContext, 0);
323+
if (HwHelperHw<FamilyType>::get().getNumCacheRegions() > 0) {
324+
EXPECT_NE(0u, drm.context.receivedVmUnbind->extensions);
325+
} else {
326+
EXPECT_EQ(0u, drm.context.receivedVmUnbind->extensions);
327+
}
328+
EXPECT_EQ(1u, drm.context.vmUnbindCalled);
329+
}
330+
331+
TEST(DrmPrelimTest, givenProgramDebuggingAndContextDebugAvailableAndCCSEnginesWhenCreatingContextThenDebugFlagSipParamIsSet) {
332+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
333+
executionEnvironment->setDebuggingEnabled();
334+
executionEnvironment->prepareRootDeviceEnvironments(1);
335+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
336+
executionEnvironment->calculateMaxOsContextCount();
337+
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
338+
339+
DrmQueryMock *drm = new DrmQueryMock(*executionEnvironment->rootDeviceEnvironments[0]);
340+
drm->contextDebugSupported = true;
341+
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
342+
343+
OsContextLinux osContext(*drm, 5u, EngineDescriptorHelper::getDefaultDescriptor());
344+
osContext.ensureContextInitialized();
345+
346+
EXPECT_EQ(DrmPrelimHelper::getSIPContextParamDebugFlag() << 32 | DrmPrelimHelper::getSIPContextParamDebugFlag(), drm->context.receivedSetContextParamValue);
347+
// drmMock returns ctxId == 0
348+
EXPECT_EQ(0u, drm->context.receivedSetContextParamCtxId);
349+
EXPECT_EQ(0u, drm->passedContextDebugId);
350+
}
351+
352+
TEST(DrmPrelimTest, givenProgramDebuggingAndContextDebugAvailableAndCCSEnginesWhenCreatingContextThenContextRunaloneIsSetOnlyIfCCSEnginesArePresent) {
353+
auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
354+
executionEnvironment->setDebuggingEnabled();
355+
executionEnvironment->prepareRootDeviceEnvironments(1);
356+
executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get());
357+
executionEnvironment->calculateMaxOsContextCount();
358+
executionEnvironment->rootDeviceEnvironments[0]->osInterface = std::make_unique<OSInterface>();
359+
360+
DrmQueryMock *drm = new DrmQueryMock(*executionEnvironment->rootDeviceEnvironments[0]);
361+
drm->contextDebugSupported = true;
362+
executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr<DriverModel>(drm));
363+
364+
OsContextLinux osContext(*drm, 5u, EngineDescriptorHelper::getDefaultDescriptor());
365+
osContext.ensureContextInitialized();
366+
367+
EXPECT_EQ(DrmPrelimHelper::getSIPContextParamDebugFlag() << 32 | DrmPrelimHelper::getSIPContextParamDebugFlag(), drm->context.receivedSetContextParamValue);
368+
// drmMock returns ctxId == 0
369+
EXPECT_EQ(0u, drm->context.receivedSetContextParamCtxId);
370+
EXPECT_EQ(0u, drm->passedContextDebugId);
371+
372+
if (executionEnvironment->rootDeviceEnvironments[0]->getHardwareInfo()->gtSystemInfo.CCSInfo.NumberOfCCSEnabled > 0) {
373+
EXPECT_EQ(4u, drm->receivedContextParamRequestCount);
374+
EXPECT_EQ(1u, drm->context.receivedContextCreateExtSetParamRunaloneCount);
375+
} else {
376+
EXPECT_EQ(3u, drm->receivedContextParamRequestCount);
377+
EXPECT_EQ(0u, drm->context.receivedContextCreateExtSetParamRunaloneCount);
378+
}
379+
}

0 commit comments

Comments
 (0)