From e6a18aac73c2993719b32777f948311137d4b7d4 Mon Sep 17 00:00:00 2001 From: Slawomir Milczarek Date: Tue, 24 Nov 2020 16:00:33 +0100 Subject: [PATCH] Add query system info implementation stub on Linux Related-To: NEO-4998 Signed-off-by: Slawomir Milczarek --- .../os_interface/linux/CMakeLists.txt | 1 + .../unit_test/os_interface/linux/drm_mock.h | 1 + .../linux/drm_system_info_tests.cpp | 104 ++++++++++++++++++ .../source/os_interface/linux/CMakeLists.txt | 2 + shared/source/os_interface/linux/drm_neo.cpp | 28 +++++ shared/source/os_interface/linux/drm_neo.h | 8 ++ .../source/os_interface/linux/drm_query.cpp | 4 + .../os_interface/linux/drm_query_dg1.cpp | 4 + .../source/os_interface/linux/system_info.h | 35 ++++++ .../os_interface/linux/system_info_impl.h | 35 ++++++ 10 files changed, 222 insertions(+) create mode 100644 opencl/test/unit_test/os_interface/linux/drm_system_info_tests.cpp create mode 100644 shared/source/os_interface/linux/system_info.h create mode 100644 shared/source/os_interface/linux/system_info_impl.h diff --git a/opencl/test/unit_test/os_interface/linux/CMakeLists.txt b/opencl/test/unit_test/os_interface/linux/CMakeLists.txt index ed9ec39315..a3a54418bd 100644 --- a/opencl/test/unit_test/os_interface/linux/CMakeLists.txt +++ b/opencl/test/unit_test/os_interface/linux/CMakeLists.txt @@ -25,6 +25,7 @@ set(IGDRCL_SRCS_tests_os_interface_linux ${CMAKE_CURRENT_SOURCE_DIR}/drm_neo_create.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drm_os_memory_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drm_residency_handler_tests.cpp + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/drm_system_info_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/drm_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/file_logger_linux_tests.cpp ${CMAKE_CURRENT_SOURCE_DIR}/hw_info_config_linux_tests.cpp diff --git a/opencl/test/unit_test/os_interface/linux/drm_mock.h b/opencl/test/unit_test/os_interface/linux/drm_mock.h index ab22812a08..ed996c3286 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_mock.h +++ b/opencl/test/unit_test/os_interface/linux/drm_mock.h @@ -41,6 +41,7 @@ class DrmMock : public Drm { using Drm::query; using Drm::requirePerContextVM; using Drm::sliceCountChangeSupported; + using Drm::systemInfo; using Drm::virtualMemoryIds; DrmMock(int fd, RootDeviceEnvironment &rootDeviceEnvironment) : Drm(std::make_unique(fd, ""), rootDeviceEnvironment) { diff --git a/opencl/test/unit_test/os_interface/linux/drm_system_info_tests.cpp b/opencl/test/unit_test/os_interface/linux/drm_system_info_tests.cpp new file mode 100644 index 0000000000..1e1f775b0a --- /dev/null +++ b/opencl/test/unit_test/os_interface/linux/drm_system_info_tests.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "shared/source/os_interface/linux/system_info_impl.h" +#include "shared/test/unit_test/helpers/debug_manager_state_restore.h" +#include "shared/test/unit_test/helpers/default_hw_info.h" + +#include "opencl/test/unit_test/helpers/gtest_helpers.h" +#include "opencl/test/unit_test/os_interface/linux/drm_mock.h" + +#include "gmock/gmock.h" + +using namespace NEO; + +TEST(DrmSystemInfoTest, whenQueryingSystemInfoThenSystemInfoIsNotCreatedAndNoIoctlsAreCalled) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + DrmMock drm(*executionEnvironment->rootDeviceEnvironments[0]); + + EXPECT_TRUE(drm.querySystemInfo()); + + EXPECT_EQ(nullptr, drm.getSystemInfo()); + EXPECT_EQ(0u, drm.ioctlCallsCount); +} + +TEST(DrmSystemInfoTest, givenSystemInfoCreatedWhenQueryingSpecificAtrributesThenReturnZero) { + SystemInfoImpl systemInfo(nullptr, 0); + + EXPECT_EQ(0u, systemInfo.getL3CacheSizeInKb()); + EXPECT_EQ(0u, systemInfo.getL3BankCount()); + EXPECT_EQ(0u, systemInfo.getMaxFillRate()); + EXPECT_EQ(0u, systemInfo.getTotalVsThreads()); + EXPECT_EQ(0u, systemInfo.getTotalHsThreads()); + EXPECT_EQ(0u, systemInfo.getTotalDsThreads()); + EXPECT_EQ(0u, systemInfo.getTotalGsThreads()); + EXPECT_EQ(0u, systemInfo.getTotalPsThreads()); + EXPECT_EQ(0u, systemInfo.getMaxEuPerDualSubSlice()); + EXPECT_EQ(0u, systemInfo.getMaxSlicesSupported()); + EXPECT_EQ(0u, systemInfo.getMaxDualSubSlicesSupported()); + EXPECT_EQ(0u, systemInfo.getMaxRCS()); + EXPECT_EQ(0u, systemInfo.getMaxCCS()); +} + +TEST(DrmSystemInfoTest, givenSetupHardwareInfoWhenQuerySystemInfoFailsThenSystemInfoIsNotCreatedAndDebugMessageIsPrinted) { + struct DrmMockToFailQuerySystemInfo : public DrmMock { + DrmMockToFailQuerySystemInfo(RootDeviceEnvironment &rootDeviceEnvironment) + : DrmMock(rootDeviceEnvironment) {} + bool querySystemInfo() override { return false; } + }; + + DebugManagerStateRestore restorer; + DebugManager.flags.PrintDebugMessages.set(true); + + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + DrmMockToFailQuerySystemInfo drm(*executionEnvironment->rootDeviceEnvironments[0]); + + HardwareInfo hwInfo; + auto setupHardwareInfo = [](HardwareInfo *, bool) {}; + DeviceDescriptor device = {0, &hwInfo, setupHardwareInfo, GTTYPE_UNDEFINED}; + + ::testing::internal::CaptureStdout(); + + int ret = drm.setupHardwareInfo(&device, false); + EXPECT_EQ(ret, 0); + EXPECT_EQ(nullptr, drm.getSystemInfo()); + + EXPECT_THAT(::testing::internal::GetCapturedStdout(), ::testing::HasSubstr("INFO: System Info query failed!\n")); +} + +TEST(DrmSystemInfoTest, givenSetupHardwareInfoWhenSystemInfoIsCreatedThenSetHardwareInfoAttributesWithZeros) { + auto executionEnvironment = std::make_unique(); + executionEnvironment->prepareRootDeviceEnvironments(1); + executionEnvironment->rootDeviceEnvironments[0]->setHwInfo(defaultHwInfo.get()); + DrmMock drm(*executionEnvironment->rootDeviceEnvironments[0]); + + HardwareInfo hwInfo; + auto setupHardwareInfo = [](HardwareInfo *, bool) {}; + GT_SYSTEM_INFO >SystemInfo = hwInfo.gtSystemInfo; + DeviceDescriptor device = {0, &hwInfo, setupHardwareInfo, GTTYPE_UNDEFINED}; + + drm.systemInfo.reset(new SystemInfoImpl(nullptr, 0)); + int ret = drm.setupHardwareInfo(&device, false); + EXPECT_EQ(ret, 0); + + EXPECT_EQ_VAL(0u, gtSystemInfo.L3CacheSizeInKb); + EXPECT_EQ(0u, gtSystemInfo.L3BankCount); + EXPECT_EQ(0u, gtSystemInfo.MaxFillRate); + EXPECT_EQ(0u, gtSystemInfo.TotalVsThreads); + EXPECT_EQ(0u, gtSystemInfo.TotalHsThreads); + EXPECT_EQ(0u, gtSystemInfo.TotalDsThreads); + EXPECT_EQ(0u, gtSystemInfo.TotalGsThreads); + EXPECT_EQ(0u, gtSystemInfo.TotalPsThreadsWindowerRange); + EXPECT_EQ(0u, gtSystemInfo.TotalDsThreads); + EXPECT_EQ(0u, gtSystemInfo.MaxEuPerSubSlice); + EXPECT_EQ(0u, gtSystemInfo.MaxSlicesSupported); + EXPECT_EQ(0u, gtSystemInfo.MaxSubSlicesSupported); + EXPECT_EQ(0u, gtSystemInfo.MaxDualSubSlicesSupported); +} diff --git a/shared/source/os_interface/linux/CMakeLists.txt b/shared/source/os_interface/linux/CMakeLists.txt index 52abcb9a98..384af4b0b0 100644 --- a/shared/source/os_interface/linux/CMakeLists.txt +++ b/shared/source/os_interface/linux/CMakeLists.txt @@ -57,6 +57,8 @@ set(NEO_CORE_OS_INTERFACE_LINUX ${CMAKE_CURRENT_SOURCE_DIR}/print.cpp ${CMAKE_CURRENT_SOURCE_DIR}/settings_reader_create.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sys_calls.h + ${CMAKE_CURRENT_SOURCE_DIR}/system_info.h + ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/system_info_impl.h ) if(SUPPORT_DG1 AND "${BRANCH_TYPE}" STREQUAL "") diff --git a/shared/source/os_interface/linux/drm_neo.cpp b/shared/source/os_interface/linux/drm_neo.cpp index 7b3d1af81c..5a66c60de9 100644 --- a/shared/source/os_interface/linux/drm_neo.cpp +++ b/shared/source/os_interface/linux/drm_neo.cpp @@ -18,6 +18,7 @@ #include "shared/source/os_interface/linux/hw_device_id.h" #include "shared/source/os_interface/linux/os_inc.h" #include "shared/source/os_interface/linux/sys_calls.h" +#include "shared/source/os_interface/linux/system_info.h" #include "shared/source/os_interface/os_environment.h" #include "shared/source/os_interface/os_interface.h" #include "shared/source/utilities/directory.h" @@ -302,10 +303,37 @@ int Drm::setupHardwareInfo(DeviceDescriptor *device, bool setupFeatureTableAndWo hwInfo->gtSystemInfo.SliceCount = static_cast(sliceTotal); hwInfo->gtSystemInfo.SubSliceCount = static_cast(subSliceTotal); hwInfo->gtSystemInfo.EUCount = static_cast(euTotal); + + status = querySystemInfo(); + if (!status) { + PRINT_DEBUG_STRING(DebugManager.flags.PrintDebugMessages.get(), stdout, "%s", "INFO: System Info query failed!\n"); + } + if (systemInfo) { + setupSystemInfo(hwInfo, *systemInfo); + } + device->setupHardwareInfo(hwInfo, setupFeatureTableAndWorkaroundTable); + return 0; } +void Drm::setupSystemInfo(HardwareInfo *hwInfo, SystemInfo &sysInfo) { + GT_SYSTEM_INFO *gtSysInfo = &hwInfo->gtSystemInfo; + gtSysInfo->ThreadCount = gtSysInfo->EUCount * sysInfo.getNumThreadsPerEu(); + gtSysInfo->L3CacheSizeInKb = sysInfo.getL3CacheSizeInKb(); + gtSysInfo->L3BankCount = sysInfo.getL3BankCount(); + gtSysInfo->MaxFillRate = sysInfo.getMaxFillRate(); + gtSysInfo->TotalVsThreads = sysInfo.getTotalVsThreads(); + gtSysInfo->TotalHsThreads = sysInfo.getTotalHsThreads(); + gtSysInfo->TotalDsThreads = sysInfo.getTotalDsThreads(); + gtSysInfo->TotalGsThreads = sysInfo.getTotalGsThreads(); + gtSysInfo->TotalPsThreadsWindowerRange = sysInfo.getTotalPsThreads(); + gtSysInfo->MaxEuPerSubSlice = sysInfo.getMaxEuPerDualSubSlice(); + gtSysInfo->MaxSlicesSupported = sysInfo.getMaxSlicesSupported(); + gtSysInfo->MaxSubSlicesSupported = sysInfo.getMaxDualSubSlicesSupported(); + gtSysInfo->MaxDualSubSlicesSupported = sysInfo.getMaxDualSubSlicesSupported(); +} + void appendHwDeviceId(std::vector> &hwDeviceIds, int fileDescriptor, const char *pciPath) { if (fileDescriptor >= 0) { if (Drm::isi915Version(fileDescriptor)) { diff --git a/shared/source/os_interface/linux/drm_neo.h b/shared/source/os_interface/linux/drm_neo.h index e0b5096532..552de9329e 100644 --- a/shared/source/os_interface/linux/drm_neo.h +++ b/shared/source/os_interface/linux/drm_neo.h @@ -37,6 +37,7 @@ class DeviceFactory; class OsContext; struct HardwareInfo; struct RootDeviceEnvironment; +struct SystemInfo; struct DeviceDescriptor { // NOLINT(clang-analyzer-optin.performance.Padding) unsigned short deviceId; @@ -96,6 +97,7 @@ class Drm { bool setQueueSliceCount(uint64_t sliceCount); void checkQueueSliceSupport(); uint64_t getSliceMask(uint64_t sliceCount); + MOCKABLE_VIRTUAL bool querySystemInfo(); MOCKABLE_VIRTUAL bool queryEngineInfo(); MOCKABLE_VIRTUAL bool queryMemoryInfo(); bool queryTopology(int &sliceCount, int &subSliceCount, int &euCount); @@ -105,6 +107,7 @@ class Drm { int bindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo); int unbindBufferObject(OsContext *osContext, uint32_t vmHandleId, BufferObject *bo); int setupHardwareInfo(DeviceDescriptor *, bool); + void setupSystemInfo(HardwareInfo *hwInfo, SystemInfo &sysInfo); bool areNonPersistentContextsSupported() const { return nonPersistentContextsSupported; } void checkNonPersistentContextsSupport(); @@ -123,6 +126,10 @@ class Drm { MOCKABLE_VIRTUAL void unregisterResource(uint32_t handle); MOCKABLE_VIRTUAL uint32_t registerIsaCookie(uint32_t isaHandle); + SystemInfo *getSystemInfo() const { + return systemInfo.get(); + } + MemoryInfo *getMemoryInfo() const { return memoryInfo.get(); } @@ -167,6 +174,7 @@ class Drm { uint64_t uuid = 0; Drm(std::unique_ptr hwDeviceIdIn, RootDeviceEnvironment &rootDeviceEnvironment); + std::unique_ptr systemInfo; std::unique_ptr engineInfo; std::unique_ptr memoryInfo; std::vector virtualMemoryIds; diff --git a/shared/source/os_interface/linux/drm_query.cpp b/shared/source/os_interface/linux/drm_query.cpp index 2917048a7f..034540bacd 100644 --- a/shared/source/os_interface/linux/drm_query.cpp +++ b/shared/source/os_interface/linux/drm_query.cpp @@ -31,6 +31,10 @@ int Drm::getMaxGpuFrequency(HardwareInfo &hwInfo, int &maxGpuFrequency) { return 0; } +bool Drm::querySystemInfo() { + return true; +} + bool Drm::queryEngineInfo() { auto length = 0; auto dataQuery = this->query(DRM_I915_QUERY_ENGINE_INFO, DrmQueryItemFlags::empty, length); diff --git a/shared/source/os_interface/linux/drm_query_dg1.cpp b/shared/source/os_interface/linux/drm_query_dg1.cpp index c3be04240b..2d27ac13f9 100644 --- a/shared/source/os_interface/linux/drm_query_dg1.cpp +++ b/shared/source/os_interface/linux/drm_query_dg1.cpp @@ -33,6 +33,10 @@ int Drm::getMaxGpuFrequency(HardwareInfo &hwInfo, int &maxGpuFrequency) { return 0; } +bool Drm::querySystemInfo() { + return true; +} + bool Drm::queryEngineInfo() { auto length = 0; auto dataQuery = this->query(DRM_I915_QUERY_ENGINE_INFO, DrmQueryItemFlags::empty, length); diff --git a/shared/source/os_interface/linux/system_info.h b/shared/source/os_interface/linux/system_info.h new file mode 100644 index 0000000000..27b14790d3 --- /dev/null +++ b/shared/source/os_interface/linux/system_info.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once +#include + +namespace NEO { + +struct SystemInfo { + SystemInfo() = default; + virtual ~SystemInfo() = 0; + + virtual uint32_t getMaxSlicesSupported() const = 0; + virtual uint32_t getMaxDualSubSlicesSupported() const = 0; + virtual uint32_t getMaxEuPerDualSubSlice() const = 0; + virtual uint32_t getL3CacheSizeInKb() const = 0; + virtual uint32_t getL3BankCount() const = 0; + virtual uint32_t getNumThreadsPerEu() const = 0; + virtual uint32_t getTotalVsThreads() const = 0; + virtual uint32_t getTotalHsThreads() const = 0; + virtual uint32_t getTotalDsThreads() const = 0; + virtual uint32_t getTotalGsThreads() const = 0; + virtual uint32_t getTotalPsThreads() const = 0; + virtual uint32_t getMaxFillRate() const = 0; + virtual uint32_t getMaxRCS() const = 0; + virtual uint32_t getMaxCCS() const = 0; +}; + +inline SystemInfo::~SystemInfo() {} + +} // namespace NEO diff --git a/shared/source/os_interface/linux/system_info_impl.h b/shared/source/os_interface/linux/system_info_impl.h new file mode 100644 index 0000000000..411d778506 --- /dev/null +++ b/shared/source/os_interface/linux/system_info_impl.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2020 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#pragma once +#include "shared/source/os_interface/linux/system_info.h" + +namespace NEO { + +struct SystemInfoImpl : public SystemInfo { + ~SystemInfoImpl() override = default; + + SystemInfoImpl(const uint32_t *data, int32_t length) { + } + + uint32_t getMaxSlicesSupported() const override { return 0; } + uint32_t getMaxDualSubSlicesSupported() const override { return 0; } + uint32_t getMaxEuPerDualSubSlice() const override { return 0; } + uint32_t getL3CacheSizeInKb() const override { return 0; } + uint32_t getL3BankCount() const override { return 0; } + uint32_t getNumThreadsPerEu() const override { return 0; } + uint32_t getTotalVsThreads() const override { return 0; } + uint32_t getTotalHsThreads() const override { return 0; } + uint32_t getTotalDsThreads() const override { return 0; } + uint32_t getTotalGsThreads() const override { return 0; } + uint32_t getTotalPsThreads() const override { return 0; } + uint32_t getMaxFillRate() const override { return 0; } + uint32_t getMaxRCS() const override { return 0; } + uint32_t getMaxCCS() const override { return 0; } +}; + +} // namespace NEO