diff --git a/opencl/source/gen8/device_queue_gen8.cpp b/opencl/source/gen8/device_queue_gen8.cpp index 399c1d32df..4de4e1e772 100644 --- a/opencl/source/gen8/device_queue_gen8.cpp +++ b/opencl/source/gen8/device_queue_gen8.cpp @@ -5,6 +5,7 @@ * */ +#include "shared/source/command_container/command_encoder.h" #include "shared/source/gen8/hw_cmds.h" #include "opencl/source/device_queue/device_queue_hw.h" @@ -32,14 +33,11 @@ void DeviceQueueHw::addArbCheckCmdWa() {} template <> void DeviceQueueHw::addMiAtomicCmdWa(uint64_t atomicOpPlaceholder) { - auto miAtomic = slbCS.getSpaceForCmd(); - *miAtomic = Family::cmdInitAtomic; - miAtomic->setAtomicOpcode(Family::MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_8B_INCREMENT); - miAtomic->setReturnDataControl(0x1); - miAtomic->setCsStall(0x1); - miAtomic->setDataSize(Family::MI_ATOMIC::DATA_SIZE::DATA_SIZE_QWORD); - miAtomic->setMemoryAddress(static_cast(atomicOpPlaceholder & 0x0000FFFFFFFFULL)); - miAtomic->setMemoryAddressHigh(static_cast((atomicOpPlaceholder >> 32) & 0x0000FFFFFFFFULL)); + EncodeAtomic::programMiAtomic(slbCS, + atomicOpPlaceholder, + Family::MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_8B_INCREMENT, + Family::MI_ATOMIC::DATA_SIZE::DATA_SIZE_QWORD, + 0x1u, 0x1u); } template <> diff --git a/opencl/source/gen9/device_queue_gen9.cpp b/opencl/source/gen9/device_queue_gen9.cpp index ef64d94105..cad14cf2ec 100644 --- a/opencl/source/gen9/device_queue_gen9.cpp +++ b/opencl/source/gen9/device_queue_gen9.cpp @@ -5,6 +5,7 @@ * */ +#include "shared/source/command_container/command_encoder.h" #include "shared/source/gen9/hw_cmds.h" #include "opencl/source/device_queue/device_queue_hw.h" @@ -38,14 +39,11 @@ void DeviceQueueHw::addArbCheckCmdWa() { template <> void DeviceQueueHw::addMiAtomicCmdWa(uint64_t atomicOpPlaceholder) { - auto miAtomic = slbCS.getSpaceForCmd(); - *miAtomic = Family::cmdInitAtomic; - miAtomic->setAtomicOpcode(Family::MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_8B_INCREMENT); - miAtomic->setReturnDataControl(0x1); - miAtomic->setCsStall(0x1); - miAtomic->setDataSize(Family::MI_ATOMIC::DATA_SIZE::DATA_SIZE_QWORD); - miAtomic->setMemoryAddress(static_cast(atomicOpPlaceholder & 0x0000FFFFFFFFULL)); - miAtomic->setMemoryAddressHigh(static_cast((atomicOpPlaceholder >> 32) & 0x0000FFFFFFFFULL)); + EncodeAtomic::programMiAtomic(slbCS, + atomicOpPlaceholder, + Family::MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_8B_INCREMENT, + Family::MI_ATOMIC::DATA_SIZE::DATA_SIZE_QWORD, + 0x1u, 0x1u); } template <> diff --git a/opencl/source/helpers/hardware_commands_helper.h b/opencl/source/helpers/hardware_commands_helper.h index b2447493b3..ebf386fac2 100644 --- a/opencl/source/helpers/hardware_commands_helper.h +++ b/opencl/source/helpers/hardware_commands_helper.h @@ -142,8 +142,6 @@ struct HardwareCommandsHelper : public PerThreadDataHelper { WALKER_TYPE *walkerCmd, uint32_t &interfaceDescriptorIndex); - static void programMiAtomic(LinearStream &commandStream, uint64_t writeAddress, typename MI_ATOMIC::ATOMIC_OPCODES opcode, typename MI_ATOMIC::DATA_SIZE dataSize); - static void programMiAtomic(MI_ATOMIC &atomic, uint64_t writeAddress, typename MI_ATOMIC::ATOMIC_OPCODES opcode, typename MI_ATOMIC::DATA_SIZE dataSize); static void programCacheFlushAfterWalkerCommand(LinearStream *commandStream, const CommandQueue &commandQueue, const Kernel *kernel, uint64_t postSyncAddress); static const size_t alignInterfaceDescriptorData = 64 * sizeof(uint8_t); diff --git a/opencl/source/helpers/hardware_commands_helper_base.inl b/opencl/source/helpers/hardware_commands_helper_base.inl index 536e728fc4..188bd392a3 100644 --- a/opencl/source/helpers/hardware_commands_helper_base.inl +++ b/opencl/source/helpers/hardware_commands_helper_base.inl @@ -382,27 +382,6 @@ void HardwareCommandsHelper::updatePerThreadDataTotal( DEBUG_BREAK_IF(sizePerThreadDataTotal == 0); // Hardware requires at least 1 GRF of perThreadData for each thread in thread group } -template -void HardwareCommandsHelper::programMiAtomic(LinearStream &commandStream, uint64_t writeAddress, - typename MI_ATOMIC::ATOMIC_OPCODES opcode, - typename MI_ATOMIC::DATA_SIZE dataSize) { - auto miAtomic = commandStream.getSpaceForCmd(); - MI_ATOMIC cmd = GfxFamily::cmdInitAtomic; - - HardwareCommandsHelper::programMiAtomic(cmd, writeAddress, opcode, dataSize); - *miAtomic = cmd; -} - -template -void HardwareCommandsHelper::programMiAtomic(MI_ATOMIC &atomic, uint64_t writeAddress, - typename MI_ATOMIC::ATOMIC_OPCODES opcode, - typename MI_ATOMIC::DATA_SIZE dataSize) { - atomic.setAtomicOpcode(opcode); - atomic.setDataSize(dataSize); - atomic.setMemoryAddress(static_cast(writeAddress & 0x0000FFFFFFFFULL)); - atomic.setMemoryAddressHigh(static_cast(writeAddress >> 32)); -} - template bool HardwareCommandsHelper::doBindingTablePrefetch() { return true; diff --git a/opencl/test/unit_test/helpers/hardware_commands_helper_tests.cpp b/opencl/test/unit_test/helpers/hardware_commands_helper_tests.cpp index aba1d2447f..78c76e6c69 100644 --- a/opencl/test/unit_test/helpers/hardware_commands_helper_tests.cpp +++ b/opencl/test/unit_test/helpers/hardware_commands_helper_tests.cpp @@ -1051,28 +1051,6 @@ HWCMDTEST_F(IGFX_GEN8_CORE, HardwareCommandsTest, GivenKernelWithSamplersWhenInd delete[] mockDsh; } -using HardwareCommandsHelperTests = ::testing::Test; - -HWTEST_F(HardwareCommandsHelperTests, whenProgrammingMiAtomicThenSetupAllFields) { - using MI_ATOMIC = typename FamilyType::MI_ATOMIC; - uint64_t writeAddress = 0x10000; - auto opcode = MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_DECREMENT; - auto dataSize = MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD; - - uint8_t buffer[1024] = {}; - LinearStream cmdStream(buffer, 1024); - - MI_ATOMIC referenceCommand = FamilyType::cmdInitAtomic; - HardwareCommandsHelper::programMiAtomic(referenceCommand, writeAddress, opcode, dataSize); - - HardwareCommandsHelper::programMiAtomic(cmdStream, writeAddress, opcode, dataSize); - auto miAtomic = genCmdCast(cmdStream.getCpuBase()); - ASSERT_NE(nullptr, miAtomic); - - EXPECT_EQ(sizeof(MI_ATOMIC), cmdStream.getUsed()); - EXPECT_EQ(0, memcmp(&referenceCommand, miAtomic, sizeof(MI_ATOMIC))); -} - typedef ExecutionModelKernelFixture ParentKernelCommandsFromBinaryTest; HWCMDTEST_P(IGFX_GEN8_CORE, ParentKernelCommandsFromBinaryTest, WhenGettingSizeRequiredForExecutionModelForSurfaceStatesThenReturnSizeOfBlocksPlusMaxBindingTableSizeForAllIdtEntriesAndSchedulerSshSize) { diff --git a/opencl/test/unit_test/mocks/mock_device_queue.h b/opencl/test/unit_test/mocks/mock_device_queue.h index ca149e0ddf..208bd2f6a4 100644 --- a/opencl/test/unit_test/mocks/mock_device_queue.h +++ b/opencl/test/unit_test/mocks/mock_device_queue.h @@ -6,6 +6,8 @@ */ #pragma once +#include "shared/source/command_container/command_encoder.h" + #include "opencl/source/device_queue/device_queue.h" #include "opencl/source/device_queue/device_queue_hw.h" #include "opencl/source/helpers/hardware_commands_helper.h" @@ -109,13 +111,13 @@ class MockDeviceQueueHw : public DeviceQueueHw { auto placeholder = (uint64_t)&igilCmdQueue->m_controls.m_DummyAtomicOperationPlaceholder; MI_ATOMIC miAtomic = GfxFamily::cmdInitAtomic; - miAtomic.setReturnDataControl(0x1); - miAtomic.setCsStall(0x1); - HardwareCommandsHelper::programMiAtomic(miAtomic, placeholder, MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_8B_INCREMENT, - MI_ATOMIC::DATA_SIZE::DATA_SIZE_QWORD); - + EncodeAtomic::programMiAtomic(&miAtomic, + placeholder, + MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_8B_INCREMENT, + MI_ATOMIC::DATA_SIZE::DATA_SIZE_QWORD, + 0x1u, 0x1u); return miAtomic; - }; + } MI_LOAD_REGISTER_IMM getExpectedLriCmd(bool arbCheck) { MI_LOAD_REGISTER_IMM lri = GfxFamily::cmdInitLoadRegisterImm; diff --git a/shared/source/command_container/command_encoder.h b/shared/source/command_container/command_encoder.h index 9e87915133..a881327796 100644 --- a/shared/source/command_container/command_encoder.h +++ b/shared/source/command_container/command_encoder.h @@ -248,9 +248,19 @@ struct EncodeAtomic { using ATOMIC_OPCODES = typename GfxFamily::MI_ATOMIC::ATOMIC_OPCODES; using DATA_SIZE = typename GfxFamily::MI_ATOMIC::DATA_SIZE; - static void programMiAtomic(MI_ATOMIC *atomic, uint64_t writeAddress, + static void programMiAtomic(LinearStream &commandStream, + uint64_t writeAddress, ATOMIC_OPCODES opcode, - DATA_SIZE dataSize); + DATA_SIZE dataSize, + uint32_t returnDataControl, + uint32_t csStall); + + static void programMiAtomic(MI_ATOMIC *atomic, + uint64_t writeAddress, + ATOMIC_OPCODES opcode, + DATA_SIZE dataSize, + uint32_t returnDataControl, + uint32_t csStall); }; template diff --git a/shared/source/command_container/command_encoder.inl b/shared/source/command_container/command_encoder.inl index 15853e5acd..a423ee2a21 100644 --- a/shared/source/command_container/command_encoder.inl +++ b/shared/source/command_container/command_encoder.inl @@ -424,18 +424,34 @@ size_t EncodeSempahore::getSizeMiSemaphoreWait() { } template -void EncodeAtomic::programMiAtomic(MI_ATOMIC *atomic, uint64_t writeAddress, +void EncodeAtomic::programMiAtomic(MI_ATOMIC *atomic, + uint64_t writeAddress, ATOMIC_OPCODES opcode, - DATA_SIZE dataSize) { + DATA_SIZE dataSize, + uint32_t returnDataControl, + uint32_t csStall) { MI_ATOMIC cmd = Family::cmdInitAtomic; cmd.setAtomicOpcode(opcode); cmd.setDataSize(dataSize); cmd.setMemoryAddress(static_cast(writeAddress & 0x0000FFFFFFFFULL)); cmd.setMemoryAddressHigh(static_cast(writeAddress >> 32)); + cmd.setReturnDataControl(returnDataControl); + cmd.setCsStall(csStall); *atomic = cmd; } +template +void EncodeAtomic::programMiAtomic(LinearStream &commandStream, + uint64_t writeAddress, + ATOMIC_OPCODES opcode, + DATA_SIZE dataSize, + uint32_t returnDataControl, + uint32_t csStall) { + auto miAtomic = commandStream.getSpaceForCmd(); + EncodeAtomic::programMiAtomic(miAtomic, writeAddress, opcode, dataSize, returnDataControl, csStall); +} + template void EncodeBatchBufferStartOrEnd::programBatchBufferStart(LinearStream *commandStream, uint64_t address, diff --git a/shared/source/helpers/timestamp_packet.h b/shared/source/helpers/timestamp_packet.h index 14018836d0..22298404d6 100644 --- a/shared/source/helpers/timestamp_packet.h +++ b/shared/source/helpers/timestamp_packet.h @@ -145,10 +145,10 @@ struct TimestampPacketHelper { for (uint32_t i = 0; i < numSupportedDevices; i++) { timestampPacketNode.incImplicitCpuDependenciesCount(); } - auto miAtomic = cmdStream.getSpaceForCmd(); - EncodeAtomic::programMiAtomic(miAtomic, dependenciesCountAddress, + EncodeAtomic::programMiAtomic(cmdStream, dependenciesCountAddress, MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT, - MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD); + MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD, + 0u, 0u); } } diff --git a/shared/test/unit_test/encoders/test_encode_atomic.cpp b/shared/test/unit_test/encoders/test_encode_atomic.cpp index 5804dd627a..89e969a715 100644 --- a/shared/test/unit_test/encoders/test_encode_atomic.cpp +++ b/shared/test/unit_test/encoders/test_encode_atomic.cpp @@ -5,6 +5,7 @@ * */ +#include "shared/source/command_stream/linear_stream.h" #include "shared/source/helpers/ptr_math.h" #include "shared/test/unit_test/cmd_parse/gen_cmd_parse.h" #include "shared/test/unit_test/fixtures/command_container_fixture.h" @@ -13,14 +14,28 @@ using namespace NEO; using CommandEncodeAtomic = Test; -HWTEST_F(CommandEncodeAtomic, programMiAtomic) { +HWTEST_F(CommandEncodeAtomic, WhenProgrammingMiAtomicThenExpectAllFieldsSetCorrectly) { using MI_ATOMIC = typename FamilyType::MI_ATOMIC; - MI_ATOMIC miAtomic; + using ATOMIC_OPCODES = typename FamilyType::MI_ATOMIC::ATOMIC_OPCODES; + using DATA_SIZE = typename FamilyType::MI_ATOMIC::DATA_SIZE; - EncodeAtomic::programMiAtomic(&miAtomic, 0x123400, MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_DECREMENT, - MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD); + constexpr size_t bufferSize = 128u; + uint8_t buffer[bufferSize]; - EXPECT_EQ(MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_DECREMENT, miAtomic.getAtomicOpcode()); - EXPECT_EQ(MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD, miAtomic.getDataSize()); - EXPECT_EQ(0x123400u, miAtomic.getMemoryAddress()); + LinearStream cmdbuffer(buffer, bufferSize); + + EncodeAtomic::programMiAtomic(cmdbuffer, + static_cast(0x123400), + ATOMIC_OPCODES::ATOMIC_4B_DECREMENT, + DATA_SIZE::DATA_SIZE_DWORD, + 0x1u, + 0x1u); + + MI_ATOMIC *miAtomicCmd = reinterpret_cast(cmdbuffer.getCpuBase()); + + EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_4B_DECREMENT, miAtomicCmd->getAtomicOpcode()); + EXPECT_EQ(DATA_SIZE::DATA_SIZE_DWORD, miAtomicCmd->getDataSize()); + EXPECT_EQ(0x123400u, miAtomicCmd->getMemoryAddress()); + EXPECT_EQ(0x1u, miAtomicCmd->getReturnDataControl()); + EXPECT_EQ(0x1u, miAtomicCmd->getCsStall()); }