55 *
66 */
77
8+ #include " shared/source/helpers/file_io.h"
9+ #include " shared/source/helpers/hw_info.h"
10+ #include " shared/source/os_interface/device_factory.h"
811#include " shared/source/os_interface/linux/os_context_linux.h"
12+ #include " shared/source/os_interface/os_interface.h"
913#include " shared/test/common/helpers/debug_manager_state_restore.h"
1014#include " shared/test/common/helpers/default_hw_info.h"
1115#include " shared/test/common/helpers/engine_descriptor_helper.h"
1216
17+ #include " opencl/test/unit_test/fixtures/memory_management_fixture.h"
1318#include " opencl/test/unit_test/mocks/mock_platform.h"
1419#include " opencl/test/unit_test/os_interface/linux/drm_mock.h"
1520
1621#include " gtest/gtest.h"
1722
23+ #include < fstream>
24+ #include < memory>
25+
1826using namespace NEO ;
1927
2028TEST (DrmTest, WhenGettingDeviceIdThenCorrectIdReturned) {
@@ -178,6 +186,46 @@ TEST(DrmTest, GivenDrmWhenAskedForContextThatFailsThenFalseIsReturned) {
178186 delete pDrm;
179187}
180188
189+ TEST (DrmTest, givenDrmWhenOsContextIsCreatedThenCreateAndDestroyNewDrmOsContext) {
190+ auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
191+ executionEnvironment->prepareRootDeviceEnvironments (1 );
192+ DrmMock drmMock (*executionEnvironment->rootDeviceEnvironments [0 ]);
193+ executionEnvironment->rootDeviceEnvironments [0 ]->setHwInfo (defaultHwInfo.get ());
194+
195+ {
196+ OsContextLinux osContext1 (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
197+ osContext1.ensureContextInitialized ();
198+
199+ EXPECT_EQ (1u , osContext1.getDrmContextIds ().size ());
200+ EXPECT_EQ (drmMock.receivedCreateContextId , osContext1.getDrmContextIds ()[0 ]);
201+ EXPECT_EQ (0u , drmMock.receivedDestroyContextId );
202+
203+ {
204+ OsContextLinux osContext2 (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
205+ osContext2.ensureContextInitialized ();
206+ EXPECT_EQ (1u , osContext2.getDrmContextIds ().size ());
207+ EXPECT_EQ (drmMock.receivedCreateContextId , osContext2.getDrmContextIds ()[0 ]);
208+ EXPECT_EQ (0u , drmMock.receivedDestroyContextId );
209+ }
210+ }
211+
212+ EXPECT_EQ (2u , drmMock.receivedContextParamRequestCount );
213+ }
214+
215+ TEST (DrmTest, whenCreatingDrmContextWithVirtualMemoryAddressSpaceThenProperVmIdIsSet) {
216+ auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
217+ executionEnvironment->prepareRootDeviceEnvironments (1 );
218+ executionEnvironment->rootDeviceEnvironments [0 ]->setHwInfo (defaultHwInfo.get ());
219+ DrmMock drmMock (*executionEnvironment->rootDeviceEnvironments [0 ]);
220+
221+ ASSERT_EQ (1u , drmMock.virtualMemoryIds .size ());
222+
223+ OsContextLinux osContext (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
224+ osContext.ensureContextInitialized ();
225+
226+ EXPECT_EQ (drmMock.receivedContextParamRequest .value , drmMock.getVirtualMemoryAddressSpace (0u ));
227+ }
228+
181229TEST (DrmTest, whenCreatingDrmContextWithNoVirtualMemoryAddressSpaceThenProperContextIdIsSet) {
182230 auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
183231 executionEnvironment->prepareRootDeviceEnvironments (1 );
@@ -194,6 +242,61 @@ TEST(DrmTest, whenCreatingDrmContextWithNoVirtualMemoryAddressSpaceThenProperCon
194242 EXPECT_EQ (0u , drmMock.receivedContextParamRequestCount );
195243}
196244
245+ TEST (DrmTest, givenDrmAndNegativeCheckNonPersistentContextsSupportWhenOsContextIsCreatedThenReceivedContextParamRequestCountReturnsCorrectValue) {
246+ auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
247+ executionEnvironment->prepareRootDeviceEnvironments (1 );
248+ executionEnvironment->rootDeviceEnvironments [0 ]->setHwInfo (defaultHwInfo.get ());
249+ DrmMock drmMock (*executionEnvironment->rootDeviceEnvironments [0 ]);
250+ auto expectedCount = 0u ;
251+
252+ {
253+ drmMock.storedRetValForPersistant = -1 ;
254+ drmMock.checkNonPersistentContextsSupport ();
255+ expectedCount += 2 ;
256+ OsContextLinux osContext (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
257+ osContext.ensureContextInitialized ();
258+ EXPECT_EQ (expectedCount, drmMock.receivedContextParamRequestCount );
259+ }
260+ {
261+ drmMock.storedRetValForPersistant = 0 ;
262+ drmMock.checkNonPersistentContextsSupport ();
263+ ++expectedCount;
264+ OsContextLinux osContext (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
265+ osContext.ensureContextInitialized ();
266+ expectedCount += 2 ;
267+ EXPECT_EQ (expectedCount, drmMock.receivedContextParamRequestCount );
268+ }
269+ }
270+
271+ TEST (DrmTest, givenDrmPreemptionEnabledAndLowPriorityEngineWhenCreatingOsContextThenCallSetContextPriorityIoctl) {
272+ auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
273+ executionEnvironment->prepareRootDeviceEnvironments (1 );
274+ executionEnvironment->rootDeviceEnvironments [0 ]->setHwInfo (defaultHwInfo.get ());
275+ DrmMock drmMock (*executionEnvironment->rootDeviceEnvironments [0 ]);
276+ drmMock.preemptionSupported = false ;
277+
278+ OsContextLinux osContext1 (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
279+ osContext1.ensureContextInitialized ();
280+ OsContextLinux osContext2 (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}));
281+ osContext2.ensureContextInitialized ();
282+
283+ EXPECT_EQ (2u , drmMock.receivedContextParamRequestCount );
284+
285+ drmMock.preemptionSupported = true ;
286+
287+ OsContextLinux osContext3 (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
288+ osContext3.ensureContextInitialized ();
289+ EXPECT_EQ (3u , drmMock.receivedContextParamRequestCount );
290+
291+ OsContextLinux osContext4 (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}));
292+ osContext4.ensureContextInitialized ();
293+ EXPECT_EQ (5u , drmMock.receivedContextParamRequestCount );
294+ EXPECT_EQ (drmMock.receivedCreateContextId , drmMock.receivedContextParamRequest .ctx_id );
295+ EXPECT_EQ (static_cast <uint64_t >(I915_CONTEXT_PARAM_PRIORITY), drmMock.receivedContextParamRequest .param );
296+ EXPECT_EQ (static_cast <uint64_t >(-1023 ), drmMock.receivedContextParamRequest .value );
297+ EXPECT_EQ (0u , drmMock.receivedContextParamRequest .size );
298+ }
299+
197300TEST (DrmTest, WhenGettingExecSoftPinThenCorrectValueIsReturned) {
198301 auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
199302 executionEnvironment->prepareRootDeviceEnvironments (1 );
@@ -474,6 +577,24 @@ TEST(DrmTest, givenPerContextVMRequiredWhenCreatingOsContextsForRootDeviceThenIm
474577 EXPECT_EQ (0u , drmVmIds[31 ]);
475578}
476579
580+ TEST (DrmTest, givenNoPerContextVmsDrmWhenCreatingOsContextsThenVmIdIsNotQueriedAndStored) {
581+ auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
582+ executionEnvironment->prepareRootDeviceEnvironments (1 );
583+ executionEnvironment->rootDeviceEnvironments [0 ]->setHwInfo (defaultHwInfo.get ());
584+ DrmMock drmMock (*executionEnvironment->rootDeviceEnvironments [0 ]);
585+ EXPECT_FALSE (drmMock.requirePerContextVM );
586+
587+ drmMock.storedRetValForVmId = 1 ;
588+
589+ OsContextLinux osContext (drmMock, 0u , EngineDescriptorHelper::getDefaultDescriptor ());
590+ osContext.ensureContextInitialized ();
591+ EXPECT_EQ (0u , drmMock.receivedCreateContextId );
592+ EXPECT_EQ (1u , drmMock.receivedContextParamRequestCount );
593+
594+ auto &drmVmIds = osContext.getDrmVmIds ();
595+ EXPECT_EQ (0u , drmVmIds.size ());
596+ }
597+
477598TEST (DrmTest, givenProgramDebuggingAndContextDebugAvailableWhenCreatingContextThenSetContextDebugFlagIsCalled) {
478599 auto executionEnvironment = std::make_unique<ExecutionEnvironment>();
479600 executionEnvironment->setDebuggingEnabled ();
0 commit comments