mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-07 12:42:54 +08:00
test: Add drm tests for memory and engine query
Signed-off-by: Brandon Yates <brandon.yates@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
3c51cea04a
commit
e59fc42cbe
@@ -31,7 +31,6 @@ add_executable(igdrcl_${target_name}
|
||||
${NEO_SHARED_DIRECTORY}/dll/linux/os_interface.cpp
|
||||
${NEO_SOURCE_DIR}/opencl/source/dll/command_queue_dll.cpp
|
||||
${NEO_SOURCE_DIR}/opencl/source/os_interface/linux/platform_teardown_linux.cpp
|
||||
${NEO_SOURCE_DIR}/opencl/test/unit_test/linux${BRANCH_DIR_SUFFIX}drm_other_requests.cpp
|
||||
)
|
||||
if(NEO__LIBVA_FOUND)
|
||||
target_sources(igdrcl_${target_name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/va_tests.cpp)
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2019-2021 Intel Corporation
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
int drmOtherRequests(unsigned long int request, ...) { return 0; }
|
||||
@@ -767,28 +767,6 @@ TEST_F(DrmTests, givenDrmIsCreatedWhenCreateVirtualMemoryFailsThenReturnVirtualM
|
||||
::testing::internal::GetCapturedStdout();
|
||||
}
|
||||
|
||||
TEST_F(DrmTests, givenDrmIsCreatedWithPerContextVmRequiredWhenCreateVirtualMemoryThenCapturedVirtualMemoryIsSettingScratchPageOptionCorrectly) {
|
||||
DebugManagerStateRestore dbgRestorer;
|
||||
debugManager.flags.PrintDebugMessages.set(true);
|
||||
debugManager.flags.DisableScratchPages.set(true);
|
||||
debugManager.flags.GpuFaultCheckThreshold.set(10);
|
||||
|
||||
VariableBackup<decltype(captureVirtualMemoryCreate)> backupCaptureVirtualMemoryCreate(&captureVirtualMemoryCreate);
|
||||
VariableBackup<decltype(capturedVmCreate)> backupCapturedVmCreate(&capturedVmCreate);
|
||||
|
||||
captureVirtualMemoryCreate = 1;
|
||||
capturedVmCreate = {};
|
||||
|
||||
auto drm = DrmWrap::createDrm(*mockRootDeviceEnvironment);
|
||||
EXPECT_NE(drm, nullptr);
|
||||
|
||||
auto disableScratch = drm.get()->checkToDisableScratchPage();
|
||||
auto ioctlHelper = drm.get()->getIoctlHelper();
|
||||
for (auto ctl : capturedVmCreate) {
|
||||
EXPECT_NE(0u, (ctl.flags & ioctlHelper->getFlagsForVmCreate(disableScratch, false, false)));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(SysCalls, WhenSysCallsPollCalledThenCallIsRedirectedToOs) {
|
||||
struct pollfd pollFd;
|
||||
pollFd.fd = 0;
|
||||
@@ -960,3 +938,42 @@ TEST_F(DrmTests, givenInValidPciPathThenNothingIsReturned) {
|
||||
hwDeviceIds = OSInterface::discoverDevices(mockExecutionEnvironment);
|
||||
EXPECT_TRUE(hwDeviceIds.empty());
|
||||
}
|
||||
|
||||
TEST_F(DrmTests, whenDrmIsCreatedAndQueryEngineInfoFailsThenWarningIsReported) {
|
||||
DebugManagerStateRestore dbgRestorer;
|
||||
debugManager.flags.PrintDebugMessages.set(true);
|
||||
|
||||
VariableBackup<decltype(DrmQueryConfig::failOnQueryEngineInfo)> backupFailOnFdSetParamEngineMap(&DrmQueryConfig::failOnQueryEngineInfo);
|
||||
DrmQueryConfig::failOnQueryEngineInfo = true;
|
||||
|
||||
::testing::internal::CaptureStderr();
|
||||
::testing::internal::CaptureStdout();
|
||||
|
||||
MockExecutionEnvironment mockExecutionEnvironment;
|
||||
auto drm = DrmWrap::createDrm(*mockExecutionEnvironment.rootDeviceEnvironments[0]);
|
||||
EXPECT_NE(drm, nullptr);
|
||||
|
||||
std::string errStr = ::testing::internal::GetCapturedStderr();
|
||||
EXPECT_TRUE(hasSubstr(errStr, std::string("WARNING: Failed to query engine info\n")));
|
||||
::testing::internal::GetCapturedStdout();
|
||||
}
|
||||
|
||||
TEST_F(DrmTests, whenDrmIsCreatedAndQueryMemoryInfoFailsThenWarningIsReported) {
|
||||
DebugManagerStateRestore dbgRestorer;
|
||||
debugManager.flags.PrintDebugMessages.set(true);
|
||||
debugManager.flags.EnableLocalMemory.set(true);
|
||||
|
||||
VariableBackup<decltype(DrmQueryConfig::failOnQueryMemoryInfo)> backupFailOnFdSetParamMemRegionMap(&DrmQueryConfig::failOnQueryMemoryInfo);
|
||||
DrmQueryConfig::failOnQueryMemoryInfo = true;
|
||||
|
||||
::testing::internal::CaptureStderr();
|
||||
::testing::internal::CaptureStdout();
|
||||
|
||||
MockExecutionEnvironment mockExecutionEnvironment;
|
||||
auto drm = DrmWrap::createDrm(*mockExecutionEnvironment.rootDeviceEnvironments[0]);
|
||||
EXPECT_NE(drm, nullptr);
|
||||
|
||||
std::string errStr = ::testing::internal::GetCapturedStderr();
|
||||
EXPECT_TRUE(hasSubstr(errStr, std::string("WARNING: Failed to query memory info\n")));
|
||||
::testing::internal::GetCapturedStdout();
|
||||
}
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
|
||||
#include "mock_os_layer.h"
|
||||
|
||||
#include "shared/source/helpers/basic_math.h"
|
||||
#include "shared/source/helpers/string.h"
|
||||
#include "shared/source/os_interface/linux/drm_neo.h"
|
||||
#include "shared/source/os_interface/linux/drm_wrappers.h"
|
||||
#include "shared/source/os_interface/linux/i915.h"
|
||||
#include "shared/source/os_interface/linux/i915_prelim.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <dirent.h>
|
||||
@@ -272,7 +273,8 @@ int drmQueryItem(NEO::Query *query) {
|
||||
return failOnEuTotal || failOnSubsliceTotal;
|
||||
}
|
||||
}
|
||||
return drmOtherRequests(DRM_IOCTL_I915_QUERY, query);
|
||||
|
||||
return drmQuery(query);
|
||||
}
|
||||
|
||||
int ioctl(int fd, unsigned long int request, ...) throw() {
|
||||
@@ -323,9 +325,6 @@ int ioctl(int fd, unsigned long int request, ...) throw() {
|
||||
case DRM_IOCTL_I915_QUERY:
|
||||
res = drmQueryItem(va_arg(vl, NEO::Query *));
|
||||
break;
|
||||
default:
|
||||
res = drmOtherRequests(request, vl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
va_end(vl);
|
||||
@@ -335,3 +334,92 @@ int ioctl(int fd, unsigned long int request, ...) throw() {
|
||||
va_end(vl);
|
||||
return -1;
|
||||
}
|
||||
|
||||
namespace DrmQueryConfig {
|
||||
int failOnQueryEngineInfo = 0;
|
||||
int failOnQueryMemoryInfo = 0;
|
||||
unsigned int retrieveQueryMemoryInfoRegionCount = 3;
|
||||
} // namespace DrmQueryConfig
|
||||
|
||||
uint32_t getTileFromEngineOrMemoryInstance(uint16_t instanceValue) {
|
||||
uint8_t tileMask = (instanceValue >> 8);
|
||||
|
||||
return Math::log2(static_cast<uint64_t>(tileMask));
|
||||
}
|
||||
|
||||
uint16_t getEngineOrMemoryInstanceValue(uint16_t tile) {
|
||||
return ((1 << tile) << 8);
|
||||
}
|
||||
|
||||
int drmQuery(NEO::Query *param) {
|
||||
auto expectedQueryEngineLength = static_cast<int32_t>(sizeof(drm_i915_query_engine_info) + (sizeof(drm_i915_engine_info) * DrmQueryConfig::retrieveQueryMemoryInfoRegionCount));
|
||||
assert(param);
|
||||
int ret = -1;
|
||||
int32_t requiredLength = 0u;
|
||||
|
||||
for (uint32_t i = 0; i < param->numItems; i++) {
|
||||
auto itemArray = reinterpret_cast<NEO::QueryItem *>(param->itemsPtr);
|
||||
auto item = &itemArray[i];
|
||||
switch (item->queryId) {
|
||||
case DRM_I915_QUERY_ENGINE_INFO:
|
||||
|
||||
if (0 == item->length) {
|
||||
item->length = expectedQueryEngineLength;
|
||||
} else {
|
||||
assert(expectedQueryEngineLength == item->length);
|
||||
auto queryEngineInfo = reinterpret_cast<drm_i915_query_engine_info *>(item->dataPtr);
|
||||
auto engineInfo = queryEngineInfo->engines;
|
||||
|
||||
for (uint32_t i = 0; i < DrmQueryConfig::retrieveQueryMemoryInfoRegionCount; i++) {
|
||||
engineInfo++->engine = {I915_ENGINE_CLASS_RENDER, getEngineOrMemoryInstanceValue(i)};
|
||||
}
|
||||
|
||||
queryEngineInfo->num_engines = DrmQueryConfig::retrieveQueryMemoryInfoRegionCount;
|
||||
}
|
||||
ret = DrmQueryConfig::failOnQueryEngineInfo ? -1 : 0;
|
||||
break;
|
||||
case DRM_I915_QUERY_MEMORY_REGIONS:
|
||||
requiredLength = static_cast<int32_t>(sizeof(drm_i915_query_memory_regions) +
|
||||
DrmQueryConfig::retrieveQueryMemoryInfoRegionCount * sizeof(drm_i915_memory_region_info));
|
||||
|
||||
if (0 == item->length) {
|
||||
item->length = requiredLength;
|
||||
} else {
|
||||
assert(requiredLength == item->length);
|
||||
auto region = reinterpret_cast<drm_i915_query_memory_regions *>(item->dataPtr);
|
||||
region->num_regions = DrmQueryConfig::retrieveQueryMemoryInfoRegionCount;
|
||||
for (uint32_t i = 0; i < DrmQueryConfig::retrieveQueryMemoryInfoRegionCount; i++) {
|
||||
drm_i915_memory_region_info regionInfo = {};
|
||||
regionInfo.region.memory_class = (i == 0) ? I915_MEMORY_CLASS_SYSTEM : I915_MEMORY_CLASS_DEVICE;
|
||||
if (i >= 1) {
|
||||
regionInfo.region.memory_instance = getEngineOrMemoryInstanceValue(i - 1);
|
||||
}
|
||||
region->regions[i] = regionInfo;
|
||||
}
|
||||
}
|
||||
ret = DrmQueryConfig::failOnQueryMemoryInfo ? -1 : 0;
|
||||
break;
|
||||
case PRELIM_DRM_I915_QUERY_DISTANCE_INFO:
|
||||
auto queryDistanceInfo = reinterpret_cast<prelim_drm_i915_query_distance_info *>(item->dataPtr);
|
||||
switch (queryDistanceInfo->region.memory_class) {
|
||||
case I915_MEMORY_CLASS_SYSTEM:
|
||||
queryDistanceInfo->distance = -1;
|
||||
break;
|
||||
case I915_MEMORY_CLASS_DEVICE: {
|
||||
auto engineTile = getTileFromEngineOrMemoryInstance(queryDistanceInfo->engine.engine_instance);
|
||||
auto memoryTile = getTileFromEngineOrMemoryInstance(queryDistanceInfo->region.memory_instance);
|
||||
|
||||
queryDistanceInfo->distance = (memoryTile == engineTile) ? 0 : 100;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
item->length = -EINVAL;
|
||||
break;
|
||||
}
|
||||
ret = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -23,8 +23,6 @@
|
||||
extern int (*openFunc)(const char *pathname, int flags, ...);
|
||||
extern int (*openFull)(const char *pathname, int flags, ...);
|
||||
|
||||
extern int drmOtherRequests(unsigned long int request, ...);
|
||||
|
||||
extern int fakeFd;
|
||||
extern int haveDri; // index of dri to serve, -1 - none
|
||||
extern int deviceId; // known DeviceID
|
||||
@@ -52,3 +50,14 @@ extern int readLinkCalledTimes;
|
||||
extern int fstatCalledTimes;
|
||||
extern bool forceExtraIoctlDuration;
|
||||
extern std::vector<NEO::GemVmControl> capturedVmCreate;
|
||||
extern int drmQuery(NEO::Query *param);
|
||||
|
||||
namespace NEO {
|
||||
struct Query;
|
||||
}
|
||||
|
||||
namespace DrmQueryConfig {
|
||||
extern int failOnQueryEngineInfo;
|
||||
extern int failOnQueryMemoryInfo;
|
||||
extern unsigned int retrieveQueryMemoryInfoRegionCount;
|
||||
} // namespace DrmQueryConfig
|
||||
|
||||
Reference in New Issue
Block a user