Skip to content

Commit f35ffc2

Browse files
committed
Add ULTs for multi drivers
Signed-off-by: Neil R. Spruit <[email protected]>
1 parent 7a5658d commit f35ffc2

File tree

11 files changed

+416
-27
lines changed

11 files changed

+416
-27
lines changed

scripts/templates/nullddi.cpp.mako

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,23 @@ namespace driver
5454
// generic implementation
5555
%if re.match("Init", obj['name']):
5656
%if re.match("InitDrivers", obj['name']):
57+
// Check compile-time definitions first
58+
bool is_npu = false;
59+
bool is_gpu = false;
60+
#ifdef ZEL_NULL_DRIVER_TYPE_NPU
61+
is_npu = true;
62+
#endif
63+
64+
#ifdef ZEL_NULL_DRIVER_TYPE_GPU
65+
is_gpu = true;
66+
#endif
5767
auto driver_type = getenv_string( "ZEL_TEST_NULL_DRIVER_TYPE" );
58-
if (std::strcmp(driver_type.c_str(), "GPU") == 0) {
68+
if (std::strcmp(driver_type.c_str(), "GPU") == 0 || is_gpu) {
5969
if (!(desc->flags & ZE_INIT_DRIVER_TYPE_FLAG_GPU)) {
6070
return ${X}_RESULT_ERROR_UNINITIALIZED;
6171
}
6272
}
63-
if (std::strcmp(driver_type.c_str(), "NPU") == 0) {
73+
if (std::strcmp(driver_type.c_str(), "NPU") == 0 || is_npu) {
6474
if (!(desc->flags & ZE_INIT_DRIVER_TYPE_FLAG_NPU)) {
6575
return ${X}_RESULT_ERROR_UNINITIALIZED;
6676
}

source/drivers/null/CMakeLists.txt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,67 @@ add_library(ze_null_test2 SHARED
4848
${CMAKE_CURRENT_SOURCE_DIR}/zer_nullddi.cpp
4949
)
5050

51+
if(BUILD_L0_LOADER_TESTS)
52+
# Add fake Intel GPU and NPU drivers for testing driver type initialization
53+
add_library(ze_intel_gpu SHARED
54+
${CMAKE_CURRENT_SOURCE_DIR}/ze_null.h
55+
${CMAKE_CURRENT_SOURCE_DIR}/ze_null.cpp
56+
${CMAKE_CURRENT_SOURCE_DIR}/ze_nullddi.cpp
57+
${CMAKE_CURRENT_SOURCE_DIR}/zet_nullddi.cpp
58+
${CMAKE_CURRENT_SOURCE_DIR}/zes_nullddi.cpp
59+
${CMAKE_CURRENT_SOURCE_DIR}/zer_nullddi.cpp
60+
)
61+
62+
add_library(ze_intel_npu SHARED
63+
${CMAKE_CURRENT_SOURCE_DIR}/ze_null.h
64+
${CMAKE_CURRENT_SOURCE_DIR}/ze_null.cpp
65+
${CMAKE_CURRENT_SOURCE_DIR}/ze_nullddi.cpp
66+
${CMAKE_CURRENT_SOURCE_DIR}/zet_nullddi.cpp
67+
${CMAKE_CURRENT_SOURCE_DIR}/zes_nullddi.cpp
68+
${CMAKE_CURRENT_SOURCE_DIR}/zer_nullddi.cpp
69+
)
70+
set_target_properties(ze_intel_gpu PROPERTIES
71+
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
72+
SOVERSION "${PROJECT_VERSION_MAJOR}"
73+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib_fake"
74+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin_fake"
75+
)
76+
77+
set_target_properties(ze_intel_npu PROPERTIES
78+
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
79+
SOVERSION "${PROJECT_VERSION_MAJOR}"
80+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib_fake"
81+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin_fake"
82+
)
83+
target_include_directories(ze_intel_gpu
84+
PUBLIC
85+
${CMAKE_CURRENT_SOURCE_DIR}
86+
)
87+
88+
target_include_directories(ze_intel_npu
89+
PUBLIC
90+
${CMAKE_CURRENT_SOURCE_DIR}
91+
)
92+
target_compile_definitions(ze_intel_gpu PUBLIC ZEL_NULL_DRIVER_ID=3 ZEL_NULL_DRIVER_TYPE_GPU=1)
93+
target_compile_definitions(ze_intel_npu PUBLIC ZEL_NULL_DRIVER_ID=4 ZEL_NULL_DRIVER_TYPE_NPU=1)
94+
95+
# Install fake drivers to separate directory
96+
if(INSTALL_NULL_DRIVER)
97+
install(TARGETS ze_intel_gpu
98+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}_fake COMPONENT level-zero-devel
99+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}_fake COMPONENT level-zero
100+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}_fake COMPONENT level-zero
101+
NAMELINK_COMPONENT level-zero-devel
102+
)
103+
install(TARGETS ze_intel_npu
104+
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}_fake COMPONENT level-zero-devel
105+
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}_fake COMPONENT level-zero
106+
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}_fake COMPONENT level-zero
107+
NAMELINK_COMPONENT level-zero-devel
108+
)
109+
endif()
110+
endif()
111+
51112
set_target_properties(ze_null_test1 PROPERTIES
52113
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
53114
SOVERSION "${PROJECT_VERSION_MAJOR}"

source/drivers/null/ze_null.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,9 +376,22 @@ namespace driver
376376
ze_device_properties_t deviceProperties = {};
377377
deviceProperties.stype = ZE_STRUCTURE_TYPE_DEVICE_PROPERTIES;
378378
deviceProperties.type = ZE_DEVICE_TYPE_GPU;
379+
380+
// Check compile-time definitions first
381+
#ifdef ZEL_NULL_DRIVER_TYPE_NPU
382+
deviceProperties.type = ZE_DEVICE_TYPE_VPU;
383+
#endif
384+
385+
#ifdef ZEL_NULL_DRIVER_TYPE_GPU
386+
deviceProperties.type = ZE_DEVICE_TYPE_GPU;
387+
#endif
388+
389+
// Environment variable can override
379390
auto driver_type = getenv_string( "ZEL_TEST_NULL_DRIVER_TYPE" );
380391
if (std::strcmp(driver_type.c_str(), "NPU") == 0) {
381392
deviceProperties.type = ZE_DEVICE_TYPE_VPU;
393+
} else if (std::strcmp(driver_type.c_str(), "GPU") == 0) {
394+
deviceProperties.type = ZE_DEVICE_TYPE_GPU;
382395
}
383396
#if defined(_WIN32)
384397
strcpy_s( deviceProperties.name, "Null Device" );

source/drivers/null/ze_nullddi.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,23 @@ namespace driver
107107
else
108108
{
109109
// generic implementation
110+
// Check compile-time definitions first
111+
bool is_npu = false;
112+
bool is_gpu = false;
113+
#ifdef ZEL_NULL_DRIVER_TYPE_NPU
114+
is_npu = true;
115+
#endif
116+
117+
#ifdef ZEL_NULL_DRIVER_TYPE_GPU
118+
is_gpu = true;
119+
#endif
110120
auto driver_type = getenv_string( "ZEL_TEST_NULL_DRIVER_TYPE" );
111-
if (std::strcmp(driver_type.c_str(), "GPU") == 0) {
121+
if (std::strcmp(driver_type.c_str(), "GPU") == 0 || is_gpu) {
112122
if (!(desc->flags & ZE_INIT_DRIVER_TYPE_FLAG_GPU)) {
113123
return ZE_RESULT_ERROR_UNINITIALIZED;
114124
}
115125
}
116-
if (std::strcmp(driver_type.c_str(), "NPU") == 0) {
126+
if (std::strcmp(driver_type.c_str(), "NPU") == 0 || is_npu) {
117127
if (!(desc->flags & ZE_INIT_DRIVER_TYPE_FLAG_NPU)) {
118128
return ZE_RESULT_ERROR_UNINITIALIZED;
119129
}

source/loader/windows/driver_discovery_win.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ std::vector<DriverLibraryPath> discoverEnabledDrivers() {
4444
while (ss.good()) {
4545
std::string substr;
4646
getline(ss, substr, ',');
47-
enabledDrivers.emplace_back(substr, true, false, false);
47+
enabledDrivers.emplace_back(substr, true, ZEL_DRIVER_TYPE_FORCE_UINT32);
4848
}
4949
}
5050

source/loader/ze_loader.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ namespace loader
419419
}
420420
bool integratedGPU = false;
421421
bool discreteGPU = false;
422+
bool npu = false;
422423
bool other = false;
423424
for( auto device : deviceHandles ) {
424425
ze_device_properties_t deviceProperties = {};
@@ -438,18 +439,26 @@ namespace loader
438439
} else {
439440
discreteGPU = true;
440441
}
442+
} else if (deviceProperties.type == ZE_DEVICE_TYPE_VPU) {
443+
npu = true;
441444
} else {
442445
other = true;
443446
}
444447
}
445-
if (integratedGPU && discreteGPU && other) {
448+
if (driver.driverType == ZEL_DRIVER_TYPE_NPU && npu == false) {
449+
// Driver was forced to NPU but no NPU devices found, skip updating type.
450+
continue;
451+
}
452+
if (integratedGPU && discreteGPU && (other || npu)) {
446453
driver.driverType = ZEL_DRIVER_TYPE_MIXED;
447454
} else if (integratedGPU && discreteGPU) {
448455
driver.driverType = ZEL_DRIVER_TYPE_GPU;
449456
} else if (integratedGPU) {
450457
driver.driverType = ZEL_DRIVER_TYPE_INTEGRATED_GPU;
451458
} else if (discreteGPU) {
452459
driver.driverType = ZEL_DRIVER_TYPE_DISCRETE_GPU;
460+
} else if (npu) {
461+
driver.driverType = ZEL_DRIVER_TYPE_NPU;
453462
} else if (other) {
454463
driver.driverType = ZEL_DRIVER_TYPE_OTHER;
455464
}
@@ -475,6 +484,10 @@ namespace loader
475484

476485
ze_result_t context_t::init_driver(driver_t &driver, ze_init_flags_t flags, ze_init_driver_type_desc_t* desc) {
477486
bool loadDriver = false;
487+
if (debugTraceEnabled) {
488+
std::string message = "Initializing driver " + driver.name + " with type " + std::to_string(driver.driverType);\
489+
debug_trace_message(message, "");
490+
}
478491
if ((!desc && (flags == 0 || flags & ZE_INIT_FLAG_GPU_ONLY)) || (desc && desc->flags & ZE_INIT_DRIVER_TYPE_FLAG_GPU)) {
479492
if (driver.driverType == ZEL_DRIVER_TYPE_GPU || driver.driverType == ZEL_DRIVER_TYPE_DISCRETE_GPU || driver.driverType == ZEL_DRIVER_TYPE_INTEGRATED_GPU) {
480493
if (debugTraceEnabled) {
@@ -695,6 +708,7 @@ namespace loader
695708
allDrivers.rbegin()->handle = nullptr;
696709
allDrivers.rbegin()->name = driverInfo.path;
697710
allDrivers.rbegin()->customDriver = driverInfo.customDriver;
711+
allDrivers.rbegin()->driverType = driverInfo.driverType;
698712
}
699713
}
700714
if(allDrivers.size()==0){

source/loader/zes_ldrddi.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ namespace loader
130130
if(drv.initStatus != ZE_RESULT_SUCCESS || drv.initSysManStatus != ZE_RESULT_SUCCESS)
131131
continue;
132132
if (!drv.handle || !drv.ddiInitialized) {
133-
auto res = loader::context->init_driver( drv, flags, nullptr);
133+
auto res = loader::context->init_driver( drv, flags, nullptr );
134134
if (res != ZE_RESULT_SUCCESS) {
135135
continue;
136136
}

test/CMakeLists.txt

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,19 @@ add_executable(
1111
# Only include driver_ordering_unit_tests for static builds or non-Windows platforms
1212
# as it requires internal loader symbols that are not exported in Windows DLLs
1313
if(BUILD_STATIC OR NOT WIN32)
14-
target_sources(tests PRIVATE driver_ordering_unit_tests.cpp init_driver_unit_tests.cpp)
14+
target_sources(tests PRIVATE driver_ordering_unit_tests.cpp)
15+
endif()
16+
17+
# For builds on non-Windows platforms, include init_driver_unit_tests
18+
# The tests rely on ablity to locate fake drivers by specific names which is not possible on Windows.
19+
if(NOT WIN32)
20+
target_sources(tests PRIVATE init_driver_unit_tests.cpp)
21+
endif()
22+
23+
# Only build init_driver_dynamic_unit_tests for dynamic builds on non-Windows platforms
24+
# as it requires internal loader symbols that are not exported in Windows DLLs
25+
if(NOT BUILD_STATIC AND NOT WIN32)
26+
target_sources(tests PRIVATE init_driver_dynamic_unit_tests.cpp)
1527
endif()
1628

1729
# For static builds, we need to include the loader source files directly
@@ -412,8 +424,8 @@ foreach(test_name IN ITEMS
412424
set_property(TEST ${test_name}_alt_drivers APPEND PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1;${ALT_DRIVERS_ENV}")
413425
endforeach()
414426

415-
add_test(NAME tests_sigle_driver_sysman_vf_management_api COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingSysManVfApisThenExpectNullDriverIsReachedSuccessfully)
416-
set_property(TEST tests_sigle_driver_sysman_vf_management_api PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")
427+
add_test(NAME tests_single_driver_sysman_vf_management_api COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingSysManVfApisThenExpectNullDriverIsReachedSuccessfully)
428+
set_property(TEST tests_single_driver_sysman_vf_management_api PROPERTY ENVIRONMENT "ZE_ENABLE_NULL_DRIVER=1")
417429

418430
add_test(NAME tests_multi_driver_sysman_vf_management_api COMMAND tests --gtest_filter=*GivenLevelZeroLoaderPresentWhenCallingSysManVfApisThenExpectNullDriverIsReachedSuccessfully)
419431
if (MSVC)
@@ -629,7 +641,13 @@ set_property(TEST driver_ordering_parse_driver_order PROPERTY ENVIRONMENT "ZE_EN
629641

630642
# Init Driver Unit Tests
631643
add_test(NAME init_driver_unit_tests COMMAND tests --gtest_filter=InitDriverUnitTest.*)
632-
set_property(TEST init_driver_unit_tests PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1")
644+
if (MSVC)
645+
set_property(TEST init_driver_unit_tests PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1;")
646+
elseif(NOT BUILD_STATIC)
647+
set_property(TEST init_driver_unit_tests PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1;LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib_fake:${CMAKE_BINARY_DIR}/lib/")
648+
else()
649+
set_property(TEST init_driver_unit_tests PROPERTY ENVIRONMENT "ZE_ENABLE_LOADER_DEBUG_TRACE=1;ZE_ENABLE_NULL_DRIVER=1;")
650+
endif()
633651

634652
# These tests are currently not supported on Windows. The reason is that the std::cerr is not being redirected to a pipe in Windows to be then checked against the expected output.
635653
if(NOT MSVC)

0 commit comments

Comments
 (0)