@@ -25,6 +25,7 @@ using NEO::PrelimI915::drm_syncobj_destroy;
25
25
using NEO::PrelimI915::drm_syncobj_wait;
26
26
27
27
struct MockIoctlHelperXe : IoctlHelperXe {
28
+ using IoctlHelperXe::bindInfo;
28
29
using IoctlHelperXe::IoctlHelperXe;
29
30
using IoctlHelperXe::xeDecanonize;
30
31
using IoctlHelperXe::xeGetBindOpName;
@@ -593,15 +594,34 @@ class DrmMockXe : public DrmMockCustom {
593
594
};
594
595
ret = 0 ;
595
596
} break ;
597
+ case DrmIoctl::GemVmBind: {
598
+ ret = gemVmBindReturn;
599
+ auto vmBindInput = static_cast <drm_xe_vm_bind *>(arg);
600
+ vmBindInputs.push_back (*vmBindInput);
601
+
602
+ EXPECT_EQ (1u , vmBindInput->num_syncs );
603
+
604
+ auto &syncInput = reinterpret_cast <drm_xe_sync *>(vmBindInput->syncs )[0 ];
605
+ syncInputs.push_back (syncInput);
606
+ } break ;
607
+
608
+ case DrmIoctl::GemWaitUserFence: {
609
+ ret = waitUserFenceReturn;
610
+ auto waitUserFenceInput = static_cast <drm_xe_wait_user_fence *>(arg);
611
+ waitUserFenceInputs.push_back (*waitUserFenceInput);
612
+ } break ;
613
+
596
614
case DrmIoctl::GemContextSetparam:
597
615
case DrmIoctl::GemContextGetparam:
616
+
598
617
default :
599
618
break ;
600
619
}
601
620
return ret;
602
621
}
603
622
int forceIoctlAnswer = 0 ;
604
623
int setIoctlAnswer = 0 ;
624
+ int gemVmBindReturn = 0 ;
605
625
const drm_xe_engine_class_instance queryEngines[9 ] = {
606
626
{DRM_XE_ENGINE_CLASS_RENDER, 0 , 0 },
607
627
{DRM_XE_ENGINE_CLASS_COPY, 1 , 0 },
@@ -615,6 +635,11 @@ class DrmMockXe : public DrmMockCustom {
615
635
616
636
uint64_t queryMemUsage[37 ]{}; // 1 qword for num regions and 12 qwords per region
617
637
uint64_t queryGts[27 ]{}; // 1 qword for num gts and 13 qwords per gt
638
+
639
+ StackVec<drm_xe_wait_user_fence, 1 > waitUserFenceInputs;
640
+ StackVec<drm_xe_vm_bind, 1 > vmBindInputs;
641
+ StackVec<drm_xe_sync, 1 > syncInputs;
642
+ int waitUserFenceReturn = 0 ;
618
643
};
619
644
620
645
TEST (IoctlHelperXeTest, whenCallingIoctlThenProperValueIsReturned) {
@@ -977,3 +1002,136 @@ TEST(IoctlHelperXeTest, givenDisabledFtrMultiTileArchWhenCreatingEngineInfoThenM
977
1002
EXPECT_EQ (0u , hwInfo->gtSystemInfo .MultiTileArchInfo .TileMask );
978
1003
}
979
1004
}
1005
+
1006
+ TEST (IoctlHelperXeTest, whenCallingVmBindThenWaitUserFenceIsCalled) {
1007
+ DebugManagerStateRestore restorer;
1008
+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
1009
+ DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments [0 ]};
1010
+ auto xeIoctlHelper = std::make_unique<MockIoctlHelperXe>(drm);
1011
+
1012
+ uint64_t fenceAddress = 0x4321 ;
1013
+ uint64_t fenceValue = 0x789 ;
1014
+
1015
+ BindInfo mockBindInfo{};
1016
+ mockBindInfo.handle = 0x1234 ;
1017
+ xeIoctlHelper->bindInfo .push_back (mockBindInfo);
1018
+
1019
+ VmBindExtUserFenceT vmBindExtUserFence{};
1020
+
1021
+ xeIoctlHelper->fillVmBindExtUserFence (vmBindExtUserFence, fenceAddress, fenceValue, 0u );
1022
+
1023
+ VmBindParams vmBindParams{};
1024
+ vmBindParams.handle = mockBindInfo.handle ;
1025
+ vmBindParams.extensions = castToUint64 (&vmBindExtUserFence);
1026
+
1027
+ drm.vmBindInputs .clear ();
1028
+ drm.syncInputs .clear ();
1029
+ drm.waitUserFenceInputs .clear ();
1030
+ EXPECT_EQ (0 , xeIoctlHelper->vmBind (vmBindParams));
1031
+ EXPECT_EQ (1u , drm.vmBindInputs .size ());
1032
+ EXPECT_EQ (1u , drm.syncInputs .size ());
1033
+ EXPECT_EQ (1u , drm.waitUserFenceInputs .size ());
1034
+ {
1035
+ auto &sync = drm.syncInputs [0 ];
1036
+
1037
+ EXPECT_EQ (fenceAddress, sync.addr );
1038
+ EXPECT_EQ (fenceValue, sync.timeline_value );
1039
+
1040
+ auto &waitUserFence = drm.waitUserFenceInputs [0 ];
1041
+
1042
+ EXPECT_EQ (fenceAddress, waitUserFence.addr );
1043
+ EXPECT_EQ (static_cast <uint16_t >(DRM_XE_UFENCE_WAIT_EQ), waitUserFence.op );
1044
+ EXPECT_EQ (static_cast <uint16_t >(DRM_XE_UFENCE_WAIT_SOFT_OP), waitUserFence.flags );
1045
+ EXPECT_EQ (fenceValue, waitUserFence.value );
1046
+ EXPECT_EQ (static_cast <uint64_t >(DRM_XE_UFENCE_WAIT_U64), waitUserFence.mask );
1047
+ EXPECT_EQ (static_cast <uint16_t >(XE_ONE_SEC), waitUserFence.timeout );
1048
+ EXPECT_EQ (0u , waitUserFence.num_engines );
1049
+ EXPECT_EQ (0u , waitUserFence.instances );
1050
+ }
1051
+ drm.vmBindInputs .clear ();
1052
+ drm.syncInputs .clear ();
1053
+ drm.waitUserFenceInputs .clear ();
1054
+ EXPECT_EQ (0 , xeIoctlHelper->vmUnbind (vmBindParams));
1055
+ EXPECT_EQ (1u , drm.vmBindInputs .size ());
1056
+ EXPECT_EQ (1u , drm.syncInputs .size ());
1057
+ EXPECT_EQ (1u , drm.waitUserFenceInputs .size ());
1058
+ {
1059
+ auto &sync = drm.syncInputs [0 ];
1060
+
1061
+ EXPECT_EQ (fenceAddress, sync.addr );
1062
+ EXPECT_EQ (fenceValue, sync.timeline_value );
1063
+
1064
+ auto &waitUserFence = drm.waitUserFenceInputs [0 ];
1065
+
1066
+ EXPECT_EQ (fenceAddress, waitUserFence.addr );
1067
+ EXPECT_EQ (static_cast <uint16_t >(DRM_XE_UFENCE_WAIT_EQ), waitUserFence.op );
1068
+ EXPECT_EQ (static_cast <uint16_t >(DRM_XE_UFENCE_WAIT_SOFT_OP), waitUserFence.flags );
1069
+ EXPECT_EQ (fenceValue, waitUserFence.value );
1070
+ EXPECT_EQ (static_cast <uint64_t >(DRM_XE_UFENCE_WAIT_U64), waitUserFence.mask );
1071
+ EXPECT_EQ (static_cast <uint16_t >(XE_ONE_SEC), waitUserFence.timeout );
1072
+ EXPECT_EQ (0u , waitUserFence.num_engines );
1073
+ EXPECT_EQ (0u , waitUserFence.instances );
1074
+ }
1075
+ }
1076
+
1077
+ TEST (IoctlHelperXeTest, whenGemVmBindFailsThenErrorIsPropagated) {
1078
+ DebugManagerStateRestore restorer;
1079
+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
1080
+ DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments [0 ]};
1081
+ auto xeIoctlHelper = std::make_unique<MockIoctlHelperXe>(drm);
1082
+
1083
+ uint64_t fenceAddress = 0x4321 ;
1084
+ uint64_t fenceValue = 0x789 ;
1085
+
1086
+ BindInfo mockBindInfo{};
1087
+ mockBindInfo.handle = 0x1234 ;
1088
+ xeIoctlHelper->bindInfo .push_back (mockBindInfo);
1089
+
1090
+ VmBindExtUserFenceT vmBindExtUserFence{};
1091
+
1092
+ xeIoctlHelper->fillVmBindExtUserFence (vmBindExtUserFence, fenceAddress, fenceValue, 0u );
1093
+
1094
+ VmBindParams vmBindParams{};
1095
+ vmBindParams.handle = mockBindInfo.handle ;
1096
+ vmBindParams.extensions = castToUint64 (&vmBindExtUserFence);
1097
+
1098
+ drm.waitUserFenceInputs .clear ();
1099
+
1100
+ int errorValue = -1 ;
1101
+ drm.gemVmBindReturn = errorValue;
1102
+ EXPECT_EQ (errorValue, xeIoctlHelper->vmBind (vmBindParams));
1103
+ EXPECT_EQ (0u , drm.waitUserFenceInputs .size ());
1104
+
1105
+ EXPECT_EQ (errorValue, xeIoctlHelper->vmUnbind (vmBindParams));
1106
+ EXPECT_EQ (0u , drm.waitUserFenceInputs .size ());
1107
+ }
1108
+
1109
+ TEST (IoctlHelperXeTest, whenUserFenceFailsThenErrorIsPropagated) {
1110
+ DebugManagerStateRestore restorer;
1111
+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
1112
+ DrmMockXe drm{*executionEnvironment->rootDeviceEnvironments [0 ]};
1113
+ auto xeIoctlHelper = std::make_unique<MockIoctlHelperXe>(drm);
1114
+
1115
+ uint64_t fenceAddress = 0x4321 ;
1116
+ uint64_t fenceValue = 0x789 ;
1117
+
1118
+ BindInfo mockBindInfo{};
1119
+ mockBindInfo.handle = 0x1234 ;
1120
+ xeIoctlHelper->bindInfo .push_back (mockBindInfo);
1121
+
1122
+ VmBindExtUserFenceT vmBindExtUserFence{};
1123
+
1124
+ xeIoctlHelper->fillVmBindExtUserFence (vmBindExtUserFence, fenceAddress, fenceValue, 0u );
1125
+
1126
+ VmBindParams vmBindParams{};
1127
+ vmBindParams.handle = mockBindInfo.handle ;
1128
+ vmBindParams.extensions = castToUint64 (&vmBindExtUserFence);
1129
+
1130
+ drm.waitUserFenceInputs .clear ();
1131
+
1132
+ int errorValue = -1 ;
1133
+ drm.waitUserFenceReturn = errorValue;
1134
+
1135
+ EXPECT_EQ (errorValue, xeIoctlHelper->vmBind (vmBindParams));
1136
+ EXPECT_EQ (errorValue, xeIoctlHelper->vmUnbind (vmBindParams));
1137
+ }
0 commit comments