@@ -76,6 +76,45 @@ ur_result_t getZesDeviceHandle(zes_uuid_t coreDeviceUuid,
76
76
return UR_RESULT_ERROR_INVALID_ARGUMENT;
77
77
}
78
78
79
+ ur_result_t checkDeviceIntelGPUIpVersionOrNewer (uint32_t ipVersion) {
80
+ uint32_t ZeDriverCount = 0 ;
81
+ ZE2UR_CALL (zeDriverGet, (&ZeDriverCount, nullptr ));
82
+ if (ZeDriverCount == 0 ) {
83
+ return UR_RESULT_SUCCESS;
84
+ }
85
+
86
+ std::vector<ze_driver_handle_t > ZeDrivers;
87
+ std::vector<ze_device_handle_t > ZeDevices;
88
+ ZeDrivers.resize (ZeDriverCount);
89
+
90
+ ZE2UR_CALL (zeDriverGet, (&ZeDriverCount, ZeDrivers.data ()));
91
+ for (uint32_t I = 0 ; I < ZeDriverCount; ++I) {
92
+ ze_device_properties_t device_properties{};
93
+ ze_device_ip_version_ext_t ipVersionExt{};
94
+ ipVersionExt.stype = ZE_STRUCTURE_TYPE_DEVICE_IP_VERSION_EXT;
95
+ ipVersionExt.pNext = nullptr ;
96
+ device_properties.stype = ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES;
97
+ device_properties.pNext = &ipVersionExt;
98
+ uint32_t ZeDeviceCount = 0 ;
99
+ ZE2UR_CALL (zeDeviceGet, (ZeDrivers[I], &ZeDeviceCount, nullptr ));
100
+ ZeDevices.resize (ZeDeviceCount);
101
+ ZE2UR_CALL (zeDeviceGet, (ZeDrivers[I], &ZeDeviceCount, ZeDevices.data ()));
102
+ // Check if this driver has GPU Devices that have this IP Version or newer.
103
+ for (uint32_t D = 0 ; D < ZeDeviceCount; ++D) {
104
+ ZE2UR_CALL (zeDeviceGetProperties, (ZeDevices[D], &device_properties));
105
+ if (device_properties.type == ZE_DEVICE_TYPE_GPU &&
106
+ device_properties.vendorId == 0x8086 ) {
107
+ ze_device_ip_version_ext_t *ipVersionExt =
108
+ (ze_device_ip_version_ext_t *)device_properties.pNext ;
109
+ if (ipVersionExt->ipVersion >= ipVersion) {
110
+ return UR_RESULT_SUCCESS;
111
+ }
112
+ }
113
+ }
114
+ }
115
+ return UR_RESULT_ERROR_UNSUPPORTED_VERSION;
116
+ }
117
+
79
118
/* *
80
119
* @brief Initializes the platforms by querying Level Zero drivers and devices.
81
120
*
@@ -282,11 +321,13 @@ ur_adapter_handle_t_::ur_adapter_handle_t_()
282
321
return ;
283
322
}
284
323
324
+ uint32_t UserForcedSysManInit = 0 ;
285
325
// Check if the user has disabled the default L0 Env initialization.
286
- const int UrSysManEnvInitEnabled = [] {
326
+ const int UrSysManEnvInitEnabled = [&UserForcedSysManInit ] {
287
327
const char *UrRet = std::getenv (" UR_L0_ENABLE_SYSMAN_ENV_DEFAULT" );
288
328
if (!UrRet)
289
329
return 1 ;
330
+ UserForcedSysManInit &= 1 ;
290
331
return std::atoi (UrRet);
291
332
}();
292
333
@@ -419,16 +460,25 @@ ur_adapter_handle_t_::ur_adapter_handle_t_()
419
460
#endif
420
461
421
462
// Check if the user has enabled the default L0 SysMan initialization.
422
- const int UrSysmanZesinitEnable = [] {
463
+ const int UrSysmanZesinitEnable = [&UserForcedSysManInit ] {
423
464
const char *UrRet = std::getenv (" UR_L0_ENABLE_ZESINIT_DEFAULT" );
424
465
if (!UrRet)
425
466
return 0 ;
467
+ UserForcedSysManInit &= 2 ;
426
468
return std::atoi (UrRet);
427
469
}();
428
470
429
- // Enable zesInit by default only if ZES_ENABLE_SYSMAN has not been set by
430
- // default and UrSysmanZesinitEnable is true.
431
- if (UrSysmanZesinitEnable && !UrSysManEnvInitEnabled) {
471
+ bool ZesInitNeeded = UrSysmanZesinitEnable && !UrSysManEnvInitEnabled;
472
+ // Unless the user has forced the SysMan init, we will check the device
473
+ // version to see if the zesInit is needed.
474
+ if (UserForcedSysManInit == 0 &&
475
+ checkDeviceIntelGPUIpVersionOrNewer (0x05004000 ) == UR_RESULT_SUCCESS) {
476
+ if (UrSysManEnvInitEnabled) {
477
+ setEnvVar (" ZES_ENABLE_SYSMAN" , " 0" );
478
+ }
479
+ ZesInitNeeded = true ;
480
+ }
481
+ if (ZesInitNeeded) {
432
482
GlobalAdapter->getDeviceByUUIdFunctionPtr =
433
483
(zes_pfnDriverGetDeviceByUuidExp_t)
434
484
ur_loader::LibLoader::getFunctionPtr (
0 commit comments