diff --git a/runtime/aub/CMakeLists.txt b/runtime/aub/CMakeLists.txt index bd1c4f30b6..2458103d2f 100644 --- a/runtime/aub/CMakeLists.txt +++ b/runtime/aub/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright (C) 2018 Intel Corporation +# Copyright (C) 2018-2019 Intel Corporation # # SPDX-License-Identifier: MIT # @@ -11,6 +11,7 @@ set(RUNTIME_SRCS_AUB ${CMAKE_CURRENT_SOURCE_DIR}${BRANCH_DIR_SUFFIX}/aub_helper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/aub_helper.h ${CMAKE_CURRENT_SOURCE_DIR}/aub_helper.inl + ${CMAKE_CURRENT_SOURCE_DIR}/aub_helper_add_mmio.cpp ) target_sources(${NEO_STATIC_LIB_NAME} PRIVATE ${RUNTIME_SRCS_AUB}) set_property(GLOBAL PROPERTY RUNTIME_SRCS_AUB ${RUNTIME_SRCS_AUB}) diff --git a/runtime/aub/aub_center.cpp b/runtime/aub/aub_center.cpp index 51f0ac4084..02073048d6 100644 --- a/runtime/aub/aub_center.cpp +++ b/runtime/aub/aub_center.cpp @@ -9,12 +9,17 @@ #include "runtime/aub/aub_helper.h" #include "runtime/helpers/hw_info.h" #include "runtime/os_interface/debug_settings_manager.h" +#include "third_party/aub_stream/headers/options.h" namespace OCLRT { AubCenter::AubCenter(const HardwareInfo *pHwInfo, bool localMemoryEnabled, const std::string &aubFileName) { if (DebugManager.flags.UseAubStream.get()) { auto devicesCount = AubHelper::getDevicesCount(pHwInfo); auto memoryBankSize = AubHelper::getMemBankSize(); + if (DebugManager.flags.AubDumpAddMmioRegistersList.get() != "unk") { + AubDump::injectMMIOList = AubHelper::getAdditionalMmioList(); + } + aubManager.reset(createAubManager(pHwInfo->pPlatform->eRenderCoreFamily, devicesCount, memoryBankSize, localMemoryEnabled, aubFileName)); } addressMapper = std::make_unique(); diff --git a/runtime/aub/aub_helper.h b/runtime/aub/aub_helper.h index e39f3abed7..3d7327e04d 100644 --- a/runtime/aub/aub_helper.h +++ b/runtime/aub/aub_helper.h @@ -6,6 +6,7 @@ */ #pragma once +#include "runtime/gen_common/aub_mapper_base.h" #include "runtime/helpers/hw_info.h" #include "runtime/helpers/properties_helper.h" #include "runtime/memory_manager/graphics_allocation.h" @@ -32,6 +33,7 @@ class AubHelper : public NonCopyableOrMovableClass { static uint32_t getMemType(uint32_t addressSpace); static uint64_t getMemBankSize(); static uint32_t getDevicesCount(const HardwareInfo *pHwInfo); + static MMIOList getAdditionalMmioList(); virtual int getDataHintForPml4Entry() const = 0; virtual int getDataHintForPdpEntry() const = 0; @@ -42,6 +44,9 @@ class AubHelper : public NonCopyableOrMovableClass { virtual int getMemTraceForPdpEntry() const = 0; virtual int getMemTraceForPdEntry() const = 0; virtual int getMemTraceForPtEntry() const = 0; + + protected: + static MMIOList splitMMIORegisters(const std::string ®isters, char delimiter); }; template diff --git a/runtime/aub/aub_helper_add_mmio.cpp b/runtime/aub/aub_helper_add_mmio.cpp new file mode 100644 index 0000000000..572d152e6d --- /dev/null +++ b/runtime/aub/aub_helper_add_mmio.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018-2019 Intel Corporation + * + * SPDX-License-Identifier: MIT + * + */ + +#include "runtime/aub/aub_helper.h" +#include "runtime/os_interface/debug_settings_manager.h" +#include "third_party/aub_stream/headers/options.h" + +namespace OCLRT { + +MMIOList AubHelper::getAdditionalMmioList() { + return splitMMIORegisters(DebugManager.flags.AubDumpAddMmioRegistersList.get(), ';'); +} + +MMIOList AubHelper::splitMMIORegisters(const std::string ®isters, char delimiter) { + MMIOList result; + bool firstElementInPair = false; + std::string token; + uint32_t registerOffset = 0; + uint32_t registerValue = 0; + std::istringstream stream(""); + + for (std::string::const_iterator i = registers.begin();; i++) { + if (i == registers.end() || *i == delimiter) { + if (token.size() > 0) { + stream.str(token); + stream.clear(); + firstElementInPair = !firstElementInPair; + stream >> std::hex >> (firstElementInPair ? registerOffset : registerValue); + if (stream.fail()) { + result.clear(); + break; + } + token.clear(); + if (!firstElementInPair) { + result.push_back(std::pair(registerOffset, registerValue)); + registerValue = 0; + registerOffset = 0; + } + } + if (i == registers.end()) { + break; + } + } else { + token.push_back(*i); + } + } + return result; +} + +} // namespace OCLRT diff --git a/runtime/aub_mem_dump/aub_stream_stubs.cpp b/runtime/aub_mem_dump/aub_stream_stubs.cpp index 3c1ca72288..2d9b753af1 100644 --- a/runtime/aub_mem_dump/aub_stream_stubs.cpp +++ b/runtime/aub_mem_dump/aub_stream_stubs.cpp @@ -6,9 +6,12 @@ */ #include "third_party/aub_stream/headers/aub_manager.h" +#include "third_party/aub_stream/headers/options.h" namespace AubDump { +MMIOList injectMMIOList; + AubManager *AubManager::create(uint32_t gfxFamily, uint32_t devicesCount, uint64_t memoryBankSizeInGB, bool localMemorySupported, const std::string &aubFileName) { return nullptr; } diff --git a/runtime/command_stream/command_stream_receiver_simulated_common_hw.h b/runtime/command_stream/command_stream_receiver_simulated_common_hw.h index 2a0807c3de..519afeb88d 100644 --- a/runtime/command_stream/command_stream_receiver_simulated_common_hw.h +++ b/runtime/command_stream/command_stream_receiver_simulated_common_hw.h @@ -61,8 +61,5 @@ class CommandStreamReceiverSimulatedCommonHw : public CommandStreamReceiverHw::initGlobalMMIO() { } } -template -MMIOList CommandStreamReceiverSimulatedCommonHw::splitMMIORegisters(const std::string ®isters, char delimiter) { - MMIOList result; - bool firstElementInPair = false; - std::string token; - uint32_t registerOffset = 0; - uint32_t registerValue = 0; - std::istringstream stream(""); - - for (std::string::const_iterator i = registers.begin();; i++) { - if (i == registers.end() || *i == delimiter) { - if (token.size() > 0) { - stream.str(token); - stream.clear(); - firstElementInPair = !firstElementInPair; - stream >> std::hex >> (firstElementInPair ? registerOffset : registerValue); - if (stream.fail()) { - result.clear(); - break; - } - token.clear(); - if (!firstElementInPair) { - result.push_back(std::pair(registerOffset, registerValue)); - registerValue = 0; - registerOffset = 0; - } - } - if (i == registers.end()) { - break; - } - } else { - token.push_back(*i); - } - } - return result; -} - template void CommandStreamReceiverSimulatedCommonHw::initAdditionalMMIO() { if (DebugManager.flags.AubDumpAddMmioRegistersList.get() != "unk") { - auto mmioList = splitMMIORegisters(DebugManager.flags.AubDumpAddMmioRegistersList.get(), ';'); + auto mmioList = AubHelper::getAdditionalMmioList(); for (auto &mmioPair : mmioList) { stream->writeMMIO(mmioPair.first, mmioPair.second); } diff --git a/unit_tests/command_stream/aub_command_stream_receiver_2_tests.cpp b/unit_tests/command_stream/aub_command_stream_receiver_2_tests.cpp index 8ff1781ce9..1640c048c2 100644 --- a/unit_tests/command_stream/aub_command_stream_receiver_2_tests.cpp +++ b/unit_tests/command_stream/aub_command_stream_receiver_2_tests.cpp @@ -7,6 +7,7 @@ #include "runtime/aub_mem_dump/page_table_entry_bits.h" #include "test.h" +#include "third_party/aub_stream/headers/options.h" #include "unit_tests/fixtures/device_fixture.h" #include "unit_tests/helpers/debug_manager_state_restore.h" #include "unit_tests/mocks/mock_aub_csr.h" @@ -706,7 +707,23 @@ HWTEST_F(AubCommandStreamReceiverTests, givenAubCommandStreamReceiverWhenEngineI EXPECT_NE(0u, aubCsr->handle); } -HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioKeySetToZeroWhenInitAdditionalMmioCalledThenDoNotWriteMmio) { +struct InjectMmmioTest : public AubCommandStreamReceiverTests { + void SetUp() override { + AubCommandStreamReceiverTests::SetUp(); + injectMmioListCopy = AubDump::injectMMIOList; + } + + void TearDown() override { + AubCommandStreamReceiverTests::TearDown(); + AubDump::injectMMIOList = injectMmioListCopy; + AubDump::injectMMIOList.shrink_to_fit(); + } + + private: + MMIOList injectMmioListCopy; +}; + +HWTEST_F(InjectMmmioTest, givenAddMmioKeySetToZeroWhenInitAdditionalMmioCalledThenDoNotWriteMmio) { DebugManagerStateRestore stateRestore; DebugManager.flags.AubDumpAddMmioRegistersList.set(""); @@ -720,8 +737,8 @@ HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioKeySetToZeroWhenInitAddition EXPECT_EQ(0u, stream->mmioList.size()); } -HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioRegistersListSetWhenInitAdditionalMmioCalledThenWriteGivenMmio) { - std::string registers("0xdead;0xbeef"); +HWTEST_F(InjectMmmioTest, givenAddMmioRegistersListSetWhenInitAdditionalMmioCalledThenWriteGivenMmio) { + std::string registers("0xdead;0xbeef;and another very long string"); MMIOPair mmioPair(0xdead, 0xbeef); DebugManagerStateRestore stateRestore; @@ -738,7 +755,7 @@ HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioRegistersListSetWhenInitAddi EXPECT_TRUE(stream->isOnMmioList(mmioPair)); }; -HWTEST_F(AubCommandStreamReceiverTests, givenLongSequenceOfAddMmioRegistersListSetWhenInitAdditionalMmioCalledThenWriteGivenMmio) { +HWTEST_F(InjectMmmioTest, givenLongSequenceOfAddMmioRegistersListSetWhenInitAdditionalMmioCalledThenWriteGivenMmio) { std::string registers("1;1;2;2;3;3"); DebugManagerStateRestore stateRestore; @@ -754,7 +771,7 @@ HWTEST_F(AubCommandStreamReceiverTests, givenLongSequenceOfAddMmioRegistersListS EXPECT_EQ(3u, stream->mmioList.size()); } -HWTEST_F(AubCommandStreamReceiverTests, givenSequenceWithIncompletePairOfAddMmioRegistersListSetWhenInitAdditionalMmioCalledThenWriteGivenMmio) { +HWTEST_F(InjectMmmioTest, givenSequenceWithIncompletePairOfAddMmioRegistersListSetWhenInitAdditionalMmioCalledThenWriteGivenMmio) { std::string registers("0x1;0x1;0x2"); MMIOPair mmioPair0(0x1, 0x1); MMIOPair mmioPair1(0x2, 0x2); @@ -774,7 +791,7 @@ HWTEST_F(AubCommandStreamReceiverTests, givenSequenceWithIncompletePairOfAddMmio EXPECT_FALSE(stream->isOnMmioList(mmioPair1)); } -HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioRegistersListSetWithSemicolonAtTheEndWhenInitAdditionalMmioCalledThenWriteGivenMmio) { +HWTEST_F(InjectMmmioTest, givenAddMmioRegistersListSetWithSemicolonAtTheEndWhenInitAdditionalMmioCalledThenWriteGivenMmio) { std::string registers("0xdead;0xbeef;"); MMIOPair mmioPair(0xdead, 0xbeef); @@ -792,7 +809,7 @@ HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioRegistersListSetWithSemicolo EXPECT_TRUE(stream->isOnMmioList(mmioPair)); } -HWTEST_F(AubCommandStreamReceiverTests, givenAddMmioRegistersListSetWithInvalidValueWhenInitAdditionalMmioCalledThenMmioIsNotWritten) { +HWTEST_F(InjectMmmioTest, givenAddMmioRegistersListSetWithInvalidValueWhenInitAdditionalMmioCalledThenMmioIsNotWritten) { std::string registers("0xdead;invalid"); DebugManagerStateRestore stateRestore;