@@ -3044,6 +3044,132 @@ TEST_F(IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmPrefetchThenVmBindIs
30443044 EXPECT_EQ (drm->vmBindInputs [0 ].bind .prefetch_mem_region_instance , targetMemoryRegion.memoryInstance );
30453045}
30463046
3047+ struct DrmMockXePrefetchFail : public DrmMockXe {
3048+ static auto create (RootDeviceEnvironment &rootDeviceEnvironment) {
3049+ auto drm = std::unique_ptr<DrmMockXePrefetchFail>(new DrmMockXePrefetchFail{rootDeviceEnvironment});
3050+ drm->initInstance ();
3051+ return drm;
3052+ }
3053+
3054+ int ioctl (DrmIoctl request, void *arg) override {
3055+ if (request == DrmIoctl::gemVmBind) {
3056+ return -1 ;
3057+ }
3058+ return DrmMockXe::ioctl (request, arg);
3059+ };
3060+
3061+ int gemVmAdviseReturn = 0 ;
3062+ StackVec<drm_xe_madvise, 4 > vmAdviseInputs;
3063+
3064+ protected:
3065+ // Don't call directly, use the create() function
3066+ DrmMockXePrefetchFail (RootDeviceEnvironment &rootDeviceEnvironment) : DrmMockXe(rootDeviceEnvironment) {}
3067+ };
3068+
3069+ TEST_F (IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchThenFailureIsReturned) {
3070+
3071+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
3072+ auto drm = DrmMockXePrefetchFail::create (*executionEnvironment->rootDeviceEnvironments [0 ]);
3073+ auto xeIoctlHelper = static_cast <MockIoctlHelperXe *>(drm->getIoctlHelper ());
3074+
3075+ uint64_t start = 0x12u ;
3076+ uint64_t length = 0x34u ;
3077+ uint32_t subDeviceId = 0u ;
3078+ uint32_t vmId = 1u ;
3079+
3080+ int memoryClassDevice = static_cast <int >(DrmParam::memoryClassDevice);
3081+ uint32_t region = (memoryClassDevice << 16u ) | subDeviceId;
3082+
3083+ EXPECT_FALSE (xeIoctlHelper->setVmSharedSystemMemPrefetch (start, length, region, vmId));
3084+ }
3085+
3086+ TEST_F (IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchThenMemRegionInstanceIsMemAdvisePreferredLocation) {
3087+ DebugManagerStateRestore restorer;
3088+ debugManager.flags .EnableLocalMemory .set (1 );
3089+
3090+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
3091+ auto drm = DrmMockXe::create (*executionEnvironment->rootDeviceEnvironments [0 ]);
3092+ auto xeIoctlHelper = static_cast <MockIoctlHelperXe *>(drm->getIoctlHelper ());
3093+ xeIoctlHelper->initialize ();
3094+
3095+ uint64_t start = 0x12u ;
3096+ uint64_t length = 0x34u ;
3097+ uint32_t subDeviceId = 0u ;
3098+ uint32_t vmId = 1u ;
3099+
3100+ int memoryClassDevice = static_cast <int >(DrmParam::memoryClassDevice);
3101+ uint32_t region = (memoryClassDevice << 16u ) | subDeviceId;
3102+
3103+ EXPECT_TRUE (xeIoctlHelper->setVmSharedSystemMemPrefetch (start, length, region, vmId));
3104+ EXPECT_EQ (1u , drm->vmBindInputs .size ());
3105+
3106+ EXPECT_EQ (drm->vmBindInputs [0 ].vm_id , vmId);
3107+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .addr , alignDown (start, MemoryConstants::pageSize));
3108+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .range , alignSizeWholePage (reinterpret_cast <void *>(start), length));
3109+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .prefetch_mem_region_instance , ((uint64_t )DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC) & 0xffffffff );
3110+ }
3111+
3112+ TEST_F (IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchWithDebugVarThenMemRegionInstanceIsDeviceLocal) {
3113+ DebugManagerStateRestore restorer;
3114+ debugManager.flags .EnableLocalMemory .set (1 );
3115+ debugManager.flags .OverrideMadviseSharedSystemPrefetchRegion .set (1 );
3116+
3117+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
3118+ auto drm = DrmMockXe::create (*executionEnvironment->rootDeviceEnvironments [0 ]);
3119+ auto xeIoctlHelper = static_cast <MockIoctlHelperXe *>(drm->getIoctlHelper ());
3120+ xeIoctlHelper->initialize ();
3121+
3122+ uint64_t start = 0x12u ;
3123+ uint64_t length = 0x34u ;
3124+ uint32_t subDeviceId = 0u ;
3125+ uint32_t vmId = 1u ;
3126+
3127+ auto memoryInfo = xeIoctlHelper->createMemoryInfo ();
3128+ ASSERT_NE (nullptr , memoryInfo);
3129+ MemoryClassInstance targetMemoryRegion = memoryInfo->getLocalMemoryRegions ()[subDeviceId].region ;
3130+ drm->memoryInfo .reset (memoryInfo.release ());
3131+ int memoryClassDevice = static_cast <int >(DrmParam::memoryClassDevice);
3132+ uint32_t region = (memoryClassDevice << 16u ) | subDeviceId;
3133+
3134+ EXPECT_TRUE (xeIoctlHelper->setVmSharedSystemMemPrefetch (start, length, region, vmId));
3135+ EXPECT_EQ (1u , drm->vmBindInputs .size ());
3136+
3137+ EXPECT_EQ (drm->vmBindInputs [0 ].vm_id , vmId);
3138+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .addr , alignDown (start, MemoryConstants::pageSize));
3139+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .range , alignSizeWholePage (reinterpret_cast <void *>(start), length));
3140+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .prefetch_mem_region_instance , targetMemoryRegion.memoryInstance );
3141+ }
3142+
3143+ TEST_F (IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmSharedSystemMemPrefetchWithDebugVarThenMemRegionInstanceIsSystem) {
3144+ DebugManagerStateRestore restorer;
3145+ debugManager.flags .EnableLocalMemory .set (1 );
3146+ debugManager.flags .OverrideMadviseSharedSystemPrefetchRegion .set (0 );
3147+
3148+ auto executionEnvironment = std::make_unique<MockExecutionEnvironment>();
3149+ auto drm = DrmMockXe::create (*executionEnvironment->rootDeviceEnvironments [0 ]);
3150+ auto xeIoctlHelper = static_cast <MockIoctlHelperXe *>(drm->getIoctlHelper ());
3151+ xeIoctlHelper->initialize ();
3152+
3153+ uint64_t start = 0x12u ;
3154+ uint64_t length = 0x34u ;
3155+ uint32_t subDeviceId = 0u ;
3156+ uint32_t vmId = 1u ;
3157+
3158+ auto memoryInfo = xeIoctlHelper->createMemoryInfo ();
3159+ ASSERT_NE (nullptr , memoryInfo);
3160+ drm->memoryInfo .reset (memoryInfo.release ());
3161+ int memoryClassDevice = static_cast <int >(DrmParam::memoryClassDevice);
3162+ uint32_t region = (memoryClassDevice << 16u ) | subDeviceId;
3163+
3164+ EXPECT_TRUE (xeIoctlHelper->setVmSharedSystemMemPrefetch (start, length, region, vmId));
3165+ EXPECT_EQ (1u , drm->vmBindInputs .size ());
3166+
3167+ EXPECT_EQ (drm->vmBindInputs [0 ].vm_id , vmId);
3168+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .addr , alignDown (start, MemoryConstants::pageSize));
3169+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .range , alignSizeWholePage (reinterpret_cast <void *>(start), length));
3170+ EXPECT_EQ (drm->vmBindInputs [0 ].bind .prefetch_mem_region_instance , 0u );
3171+ }
3172+
30473173TEST_F (IoctlHelperXeTest, givenIoctlHelperXeWhenCallingSetVmPrefetchOnSecondTileThenVmBindIsCalled) {
30483174 DebugManagerStateRestore restorer;
30493175 debugManager.flags .EnableLocalMemory .set (1 );
0 commit comments