From 29464fb9adc05906c778ef3dc3db4fb683c5d35d Mon Sep 17 00:00:00 2001 From: Jaime Arteaga Date: Sat, 4 Apr 2020 21:05:43 -0700 Subject: [PATCH] Correct root device index in SBA programming (2) Add ULT Related-To: NEO-3691 Change-Id: I61f6ba9b988b5245a2657c38c7bb0b94fbb3a295 Signed-off: Jaime Arteaga --- .../core/source/cmdqueue/cmdqueue_hw_base.inl | 8 +-- .../test/unit_tests/mocks/mock_cmdqueue.h | 3 + .../sources/cmdqueue/test_cmdqueue.cpp | 65 ++++++++++++++++++- shared/source/memory_manager/memory_manager.h | 2 +- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl b/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl index c3a9d36c72..2e49e49685 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl +++ b/level_zero/core/source/cmdqueue/cmdqueue_hw_base.inl @@ -41,8 +41,8 @@ void CommandQueueHw::programGeneralStateBaseAddress(uint64_t gsba pcCmd->setDcFlushEnable(true); pcCmd->setCommandStreamerStallEnable(true); - auto gmmHelper = device->getNEODevice()->getGmmHelper(); - NEO::EncodeWA::encodeAdditionalPipelineSelect(*device->getNEODevice(), commandStream, true); + NEO::Device *neoDevice = device->getNEODevice(); + NEO::EncodeWA::encodeAdditionalPipelineSelect(*neoDevice, commandStream, true); NEO::StateBaseAddressHelper::programStateBaseAddress(commandStream, nullptr, @@ -51,9 +51,9 @@ void CommandQueueHw::programGeneralStateBaseAddress(uint64_t gsba gsba, true, (device->getMOCS(true, false) >> 1), - device->getDriverHandle()->getMemoryManager()->getInternalHeapBaseAddress(device->getRootDeviceIndex()), + neoDevice->getMemoryManager()->getInternalHeapBaseAddress(device->getRootDeviceIndex()), true, - gmmHelper, + neoDevice->getGmmHelper(), false); gsbaInit = true; diff --git a/level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h b/level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h index 906118f54b..c6ae396843 100644 --- a/level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h +++ b/level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h @@ -56,6 +56,9 @@ struct Mock : public CommandQueue { template struct MockCommandQueueHw : public L0::CommandQueueHw { + using BaseClass = ::L0::CommandQueueHw; + using BaseClass::commandStream; + MockCommandQueueHw(L0::Device *device, NEO::CommandStreamReceiver *csr, const ze_command_queue_desc_t *desc) : L0::CommandQueueHw(device, csr, desc) { } ze_result_t synchronize(uint32_t timeout) override { diff --git a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp index b91370fec6..7078ddf856 100644 --- a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue.cpp @@ -5,10 +5,16 @@ * */ +#include "shared/source/helpers/state_base_address.h" +#include "shared/test/unit_test/helpers/debug_manager_state_restore.h" +#include "shared/test/unit_test/helpers/default_hw_info.h" + #include "test.h" -#include "level_zero/core/source/cmdqueue/cmdqueue_imp.h" +#include "level_zero/core/source/driver/driver_handle_imp.h" #include "level_zero/core/test/unit_tests/fixtures/device_fixture.h" +#include "level_zero/core/test/unit_tests/mocks/mock_cmdqueue.h" +#include "level_zero/core/test/unit_tests/mocks/mock_memory_manager.h" namespace L0 { namespace ult { @@ -40,5 +46,62 @@ TEST_F(CommandQueueCreate, whenCreatingCommandQueueThenItIsInitialized) { commandQueue->destroy(); } +using CommandQueueSBASupport = IsWithinProducts; + +struct MockMemoryManagerCommandQueueSBA : public MemoryManagerMock { + MockMemoryManagerCommandQueueSBA(NEO::ExecutionEnvironment &executionEnvironment) : MemoryManagerMock(const_cast(executionEnvironment)) {} + MOCK_METHOD1(getInternalHeapBaseAddress, uint64_t(uint32_t rootDeviceIndex)); +}; + +struct CommandQueueProgramSBATest : public ::testing::Test { + void SetUp() override { + executionEnvironment = new NEO::ExecutionEnvironment(); + executionEnvironment->prepareRootDeviceEnvironments(numRootDevices); + for (uint32_t i = 0; i < numRootDevices; i++) { + executionEnvironment->rootDeviceEnvironments[i]->setHwInfo(NEO::defaultHwInfo.get()); + } + + memoryManager = new ::testing::NiceMock(*executionEnvironment); + executionEnvironment->memoryManager.reset(memoryManager); + + neoDevice = NEO::MockDevice::create(executionEnvironment, rootDeviceIndex); + std::vector> devices; + devices.push_back(std::unique_ptr(neoDevice)); + + driverHandle = std::make_unique>(); + driverHandle->initialize(std::move(devices)); + + device = driverHandle->devices[0]; + } + void TearDown() override { + } + + NEO::ExecutionEnvironment *executionEnvironment = nullptr; + std::unique_ptr> driverHandle; + NEO::MockDevice *neoDevice = nullptr; + L0::Device *device = nullptr; + MockMemoryManagerCommandQueueSBA *memoryManager = nullptr; + const uint32_t rootDeviceIndex = 1u; + const uint32_t numRootDevices = 2u; +}; + +HWTEST2_F(CommandQueueProgramSBATest, whenCreatingCommandQueueThenItIsInitialized, CommandQueueSBASupport) { + ze_command_queue_desc_t desc = {}; + desc.version = ZE_COMMAND_QUEUE_DESC_VERSION_CURRENT; + auto csr = std::unique_ptr(neoDevice->createCommandStreamReceiver()); + auto commandQueue = new MockCommandQueueHw(device, csr.get(), &desc); + commandQueue->initialize(); + + uint32_t alignedSize = 4096u; + NEO::LinearStream child(commandQueue->commandStream->getSpace(alignedSize), alignedSize); + + EXPECT_CALL(*memoryManager, getInternalHeapBaseAddress(rootDeviceIndex)) + .Times(1); + + commandQueue->programGeneralStateBaseAddress(0u, child); + + commandQueue->destroy(); +} + } // namespace ult } // namespace L0 \ No newline at end of file diff --git a/shared/source/memory_manager/memory_manager.h b/shared/source/memory_manager/memory_manager.h index 829e850563..6c3cd86e85 100644 --- a/shared/source/memory_manager/memory_manager.h +++ b/shared/source/memory_manager/memory_manager.h @@ -98,7 +98,7 @@ class MemoryManager { virtual uint64_t getLocalMemorySize(uint32_t rootDeviceIndex) = 0; uint64_t getMaxApplicationAddress() { return is64bit ? MemoryConstants::max64BitAppAddress : MemoryConstants::max32BitAppAddress; }; - uint64_t getInternalHeapBaseAddress(uint32_t rootDeviceIndex) { return getGfxPartition(rootDeviceIndex)->getHeapBase(HeapIndex::HEAP_INTERNAL_DEVICE_MEMORY); } + MOCKABLE_VIRTUAL uint64_t getInternalHeapBaseAddress(uint32_t rootDeviceIndex) { return getGfxPartition(rootDeviceIndex)->getHeapBase(HeapIndex::HEAP_INTERNAL_DEVICE_MEMORY); } uint64_t getExternalHeapBaseAddress(uint32_t rootDeviceIndex) { return getGfxPartition(rootDeviceIndex)->getHeapBase(HeapIndex::HEAP_EXTERNAL); } bool isLimitedRange(uint32_t rootDeviceIndex) { return getGfxPartition(rootDeviceIndex)->isLimitedRange(); }