From 0b5269d4ae000959c8ce33640d9fe158b71d3439 Mon Sep 17 00:00:00 2001 From: Bartosz Dunajski Date: Wed, 22 Jun 2022 12:10:21 +0000 Subject: [PATCH] Use LogicalStateHelper to program CSR allocation Signed-off-by: Bartosz Dunajski --- .../core/source/cmdqueue/cmdqueue_hw.inl | 2 +- .../command_stream_receiver_hw_base.inl | 2 +- shared/source/command_stream/preemption.h | 5 ++++- shared/source/command_stream/preemption.inl | 21 ++++++++++++------- .../preemption_xehp_and_later.inl | 2 +- shared/source/gen11/preemption_gen11.cpp | 3 ++- shared/source/gen12lp/preemption_gen12lp.cpp | 3 ++- shared/source/gen8/preemption_gen8.cpp | 6 +++++- shared/source/gen9/preemption_gen9.cpp | 3 ++- shared/source/helpers/preamble.h | 5 +++-- shared/source/helpers/preamble_base.inl | 8 +++---- .../test/common/gen11/test_preamble_gen11.cpp | 2 +- .../common/gen12lp/test_preamble_gen12lp.cpp | 2 +- .../test/common/gen9/preamble_tests_gen9.cpp | 2 +- .../unit_test/preamble/preamble_tests.cpp | 6 +++--- .../unit_test/preemption/preemption_tests.cpp | 2 +- .../xe_hp_sdv/test_preamble_xe_hp_sdv.cpp | 2 +- 17 files changed, 46 insertions(+), 30 deletions(-) diff --git a/level_zero/core/source/cmdqueue/cmdqueue_hw.inl b/level_zero/core/source/cmdqueue/cmdqueue_hw.inl index 657f72d6de..4cc18a7687 100644 --- a/level_zero/core/source/cmdqueue/cmdqueue_hw.inl +++ b/level_zero/core/source/cmdqueue/cmdqueue_hw.inl @@ -329,7 +329,7 @@ ze_result_t CommandQueueHw::executeCommandLists( } if (initialPreemptionMode) { - NEO::PreemptionHelper::programCsrBaseAddress(child, *neoDevice, csr->getPreemptionAllocation()); + NEO::PreemptionHelper::programCsrBaseAddress(child, *neoDevice, csr->getPreemptionAllocation(), csr->getLogicalStateHelper()); } if (stateSipRequired) { diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index 3026062721..913e1cc455 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -925,7 +925,7 @@ inline void CommandStreamReceiverHw::programStateSip(LinearStream &cm template inline void CommandStreamReceiverHw::programPreamble(LinearStream &csr, Device &device, uint32_t &newL3Config) { if (!this->isPreambleSent) { - PreambleHelper::programPreamble(&csr, device, newL3Config, this->preemptionAllocation); + PreambleHelper::programPreamble(&csr, device, newL3Config, this->preemptionAllocation, logicalStateHelper.get()); this->isPreambleSent = true; this->lastSentL3Config = newL3Config; } diff --git a/shared/source/command_stream/preemption.h b/shared/source/command_stream/preemption.h index 210a2304aa..7e067ea93b 100644 --- a/shared/source/command_stream/preemption.h +++ b/shared/source/command_stream/preemption.h @@ -55,7 +55,7 @@ class PreemptionHelper { static size_t getRequiredStateSipCmdSize(Device &device, bool isRcs); template - static void programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr); + static void programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); template static void programStateSip(LinearStream &preambleCmdStream, Device &device, LogicalStateHelper *logicalStateHelper); @@ -85,6 +85,9 @@ class PreemptionHelper { static void programInterfaceDescriptorDataPreemption(INTERFACE_DESCRIPTOR_DATA *idd, PreemptionMode preemptionMode); protected: + template + static void programCsrBaseAddressCmd(LinearStream &preambleCmdStream, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); + template static void programStateSipCmd(LinearStream &preambleCmdStream, GraphicsAllocation *sipAllocation, LogicalStateHelper *logicalStateHelper); }; diff --git a/shared/source/command_stream/preemption.inl b/shared/source/command_stream/preemption.inl index 28eca10050..a3b1bb6a01 100644 --- a/shared/source/command_stream/preemption.inl +++ b/shared/source/command_stream/preemption.inl @@ -16,19 +16,24 @@ namespace NEO { template -void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr) { - using GPGPU_CSR_BASE_ADDRESS = typename GfxFamily::GPGPU_CSR_BASE_ADDRESS; - bool isMidThreadPreemption = device.getPreemptionMode() == PreemptionMode::MidThread; - if (isMidThreadPreemption) { +void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { + if (device.getPreemptionMode() == PreemptionMode::MidThread) { UNRECOVERABLE_IF(nullptr == preemptionCsr); - auto csr = reinterpret_cast(preambleCmdStream.getSpace(sizeof(GPGPU_CSR_BASE_ADDRESS))); - GPGPU_CSR_BASE_ADDRESS cmd = GfxFamily::cmdInitGpgpuCsrBaseAddress; - cmd.setGpgpuCsrBaseAddress(preemptionCsr->getGpuAddressToPatch()); - *csr = cmd; + programCsrBaseAddressCmd(preambleCmdStream, preemptionCsr, logicalStateHelper); } } +template +void PreemptionHelper::programCsrBaseAddressCmd(LinearStream &preambleCmdStream, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { + using GPGPU_CSR_BASE_ADDRESS = typename GfxFamily::GPGPU_CSR_BASE_ADDRESS; + + auto csr = reinterpret_cast(preambleCmdStream.getSpace(sizeof(GPGPU_CSR_BASE_ADDRESS))); + GPGPU_CSR_BASE_ADDRESS cmd = GfxFamily::cmdInitGpgpuCsrBaseAddress; + cmd.setGpgpuCsrBaseAddress(preemptionCsr->getGpuAddressToPatch()); + *csr = cmd; +} + template void PreemptionHelper::programStateSip(LinearStream &preambleCmdStream, Device &device, LogicalStateHelper *logicalStateHelper) { using STATE_SIP = typename GfxFamily::STATE_SIP; diff --git a/shared/source/command_stream/preemption_xehp_and_later.inl b/shared/source/command_stream/preemption_xehp_and_later.inl index c426d7f632..b27c93229c 100644 --- a/shared/source/command_stream/preemption_xehp_and_later.inl +++ b/shared/source/command_stream/preemption_xehp_and_later.inl @@ -6,7 +6,7 @@ */ template <> -void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr) { +void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { } template <> diff --git a/shared/source/gen11/preemption_gen11.cpp b/shared/source/gen11/preemption_gen11.cpp index 29467cf5b6..8245befe8d 100644 --- a/shared/source/gen11/preemption_gen11.cpp +++ b/shared/source/gen11/preemption_gen11.cpp @@ -16,7 +16,8 @@ using GfxFamily = ICLFamily; template void PreemptionHelper::programCmdStream(LinearStream &cmdStream, PreemptionMode newPreemptionMode, PreemptionMode oldPreemptionMode, GraphicsAllocation *preemptionCsr); template size_t PreemptionHelper::getRequiredPreambleSize(const Device &device); -template void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr); +template void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); +template void PreemptionHelper::programCsrBaseAddressCmd(LinearStream &preambleCmdStream, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); template void PreemptionHelper::programStateSip(LinearStream &preambleCmdStream, Device &device, LogicalStateHelper *logicalStateHelper); template void PreemptionHelper::programStateSipCmd(LinearStream &preambleCmdStream, GraphicsAllocation *sipAllocation, LogicalStateHelper *logicalStateHelper); template size_t PreemptionHelper::getRequiredStateSipCmdSize(Device &device, bool isRcs); diff --git a/shared/source/gen12lp/preemption_gen12lp.cpp b/shared/source/gen12lp/preemption_gen12lp.cpp index 4b52c2cd0c..e95fc4bf6a 100644 --- a/shared/source/gen12lp/preemption_gen12lp.cpp +++ b/shared/source/gen12lp/preemption_gen12lp.cpp @@ -16,7 +16,8 @@ using GfxFamily = TGLLPFamily; template void PreemptionHelper::programCmdStream(LinearStream &cmdStream, PreemptionMode newPreemptionMode, PreemptionMode oldPreemptionMode, GraphicsAllocation *preemptionCsr); template size_t PreemptionHelper::getRequiredPreambleSize(const Device &device); -template void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr); +template void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); +template void PreemptionHelper::programCsrBaseAddressCmd(LinearStream &preambleCmdStream, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); template void PreemptionHelper::programStateSip(LinearStream &preambleCmdStream, Device &device, LogicalStateHelper *logicalStateHelper); template void PreemptionHelper::programStateSipCmd(LinearStream &preambleCmdStream, GraphicsAllocation *sipAllocation, LogicalStateHelper *logicalStateHelper); template size_t PreemptionHelper::getRequiredStateSipCmdSize(Device &device, bool isRcs); diff --git a/shared/source/gen8/preemption_gen8.cpp b/shared/source/gen8/preemption_gen8.cpp index da9d2a0e41..5b3e9fafdf 100644 --- a/shared/source/gen8/preemption_gen8.cpp +++ b/shared/source/gen8/preemption_gen8.cpp @@ -54,7 +54,11 @@ size_t PreemptionHelper::getRequiredStateSipCmdSize(Device &device, b } template <> -void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr) { +void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { +} + +template <> +void PreemptionHelper::programCsrBaseAddressCmd(LinearStream &preambleCmdStream, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { } template <> diff --git a/shared/source/gen9/preemption_gen9.cpp b/shared/source/gen9/preemption_gen9.cpp index 3aac37be08..7efe6b73b3 100644 --- a/shared/source/gen9/preemption_gen9.cpp +++ b/shared/source/gen9/preemption_gen9.cpp @@ -70,7 +70,8 @@ template void PreemptionHelper::programCmdStream(LinearStream &cmdStr PreemptionMode oldPreemptionMode, GraphicsAllocation *preemptionCsr); template size_t PreemptionHelper::getRequiredPreambleSize(const Device &device); -template void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr); +template void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); +template void PreemptionHelper::programCsrBaseAddressCmd(LinearStream &preambleCmdStream, const GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); template void PreemptionHelper::programStateSip(LinearStream &preambleCmdStream, Device &device, LogicalStateHelper *logicalStateHelper); template void PreemptionHelper::programStateSipCmd(LinearStream &preambleCmdStream, GraphicsAllocation *sipAllocation, LogicalStateHelper *logicalStateHelper); template size_t PreemptionHelper::getRequiredStateSipCmdSize(Device &device, bool isRcs); diff --git a/shared/source/helpers/preamble.h b/shared/source/helpers/preamble.h index b3ca42902a..3b702e42cf 100644 --- a/shared/source/helpers/preamble.h +++ b/shared/source/helpers/preamble.h @@ -24,6 +24,7 @@ class Device; struct DispatchFlags; class GraphicsAllocation; class LinearStream; +class LogicalStateHelper; struct PipelineSelectArgs; struct StreamProperties; @@ -38,7 +39,7 @@ struct PreambleHelper { const PipelineSelectArgs &pipelineSelectArgs, const HardwareInfo &hwInfo); static void appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo); - static void programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr); + static void programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); static void addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType); static void appendProgramVFEState(const HardwareInfo &hwInfo, const StreamProperties &streamProperties, void *cmd); static void *getSpaceForVfeState(LinearStream *pCommandStream, @@ -53,7 +54,7 @@ struct PreambleHelper { static uint64_t getScratchSpaceAddressOffsetForVfeState(LinearStream *pCommandStream, void *pVfeState); static void programAdditionalFieldsInVfeState(VFE_STATE_TYPE *mediaVfeState, const HardwareInfo &hwInfo, bool disableEUFusion); static void programPreamble(LinearStream *pCommandStream, Device &device, uint32_t l3Config, - GraphicsAllocation *preemptionCsr); + GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper); static void programKernelDebugging(LinearStream *pCommandStream); static void programSemaphoreDelay(LinearStream *pCommandStream); static uint32_t getL3Config(const HardwareInfo &hwInfo, bool useSLM); diff --git a/shared/source/helpers/preamble_base.inl b/shared/source/helpers/preamble_base.inl index 4bb4f42b82..75ea8e018b 100644 --- a/shared/source/helpers/preamble_base.inl +++ b/shared/source/helpers/preamble_base.inl @@ -66,9 +66,9 @@ size_t PreambleHelper::getCmdSizeForPipelineSelect(const HardwareInfo template void PreambleHelper::programPreamble(LinearStream *pCommandStream, Device &device, uint32_t l3Config, - GraphicsAllocation *preemptionCsr) { + GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { programL3(pCommandStream, l3Config); - programPreemption(pCommandStream, device, preemptionCsr); + programPreemption(pCommandStream, device, preemptionCsr, logicalStateHelper); if (device.isDebuggerActive()) { programKernelDebugging(pCommandStream); } @@ -77,8 +77,8 @@ void PreambleHelper::programPreamble(LinearStream *pCommandStream, De } template -void PreambleHelper::programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr) { - PreemptionHelper::programCsrBaseAddress(*pCommandStream, device, preemptionCsr); +void PreambleHelper::programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr, LogicalStateHelper *logicalStateHelper) { + PreemptionHelper::programCsrBaseAddress(*pCommandStream, device, preemptionCsr, logicalStateHelper); } template diff --git a/shared/test/common/gen11/test_preamble_gen11.cpp b/shared/test/common/gen11/test_preamble_gen11.cpp index 2873a0cb06..74cd28c75f 100644 --- a/shared/test/common/gen11/test_preamble_gen11.cpp +++ b/shared/test/common/gen11/test_preamble_gen11.cpp @@ -125,7 +125,7 @@ GEN11TEST_F(ThreadArbitrationGen11, givenPreambleWhenItIsProgrammedThenThreadArb uint32_t l3Config = PreambleHelper::getL3Config(*defaultHwInfo, true); MockDevice mockDevice; PreambleHelper::programPreamble(&linearStream, mockDevice, l3Config, - nullptr); + nullptr, nullptr); parseCommands(cs); diff --git a/shared/test/common/gen12lp/test_preamble_gen12lp.cpp b/shared/test/common/gen12lp/test_preamble_gen12lp.cpp index 2c02d8f8cc..07170389fa 100644 --- a/shared/test/common/gen12lp/test_preamble_gen12lp.cpp +++ b/shared/test/common/gen12lp/test_preamble_gen12lp.cpp @@ -24,7 +24,7 @@ HWTEST2_F(TglLpSlm, givenTglLpWhenPreambleIsBeingProgrammedThenThreadArbitration uint32_t l3Config = PreambleHelper::getL3Config(pDevice->getHardwareInfo(), true); MockDevice mockDevice; PreambleHelper::programPreamble(&linearStream, mockDevice, l3Config, - nullptr); + nullptr, nullptr); parseCommands(cs); diff --git a/shared/test/common/gen9/preamble_tests_gen9.cpp b/shared/test/common/gen9/preamble_tests_gen9.cpp index a65be81dd9..9893b34ea7 100644 --- a/shared/test/common/gen9/preamble_tests_gen9.cpp +++ b/shared/test/common/gen9/preamble_tests_gen9.cpp @@ -74,7 +74,7 @@ GEN9TEST_F(ThreadArbitrationGen9, givenPreambleWhenItIsProgrammedThenThreadArbit uint32_t l3Config = PreambleHelper::getL3Config(*defaultHwInfo, true); MockDevice mockDevice; PreambleHelper::programPreamble(&linearStream, mockDevice, l3Config, - nullptr); + nullptr, nullptr); parseCommands(cs); diff --git a/shared/test/unit_test/preamble/preamble_tests.cpp b/shared/test/unit_test/preamble/preamble_tests.cpp index 00e936197e..54771f8234 100644 --- a/shared/test/unit_test/preamble/preamble_tests.cpp +++ b/shared/test/unit_test/preamble/preamble_tests.cpp @@ -75,7 +75,7 @@ HWCMDTEST_F(IGFX_GEN8_CORE, PreambleTest, givenMidThreadPreemptionWhenPreambleIs uintptr_t minCsrAlignment = 2 * 256 * MemoryConstants::kiloByte; MockGraphicsAllocation csrSurface(reinterpret_cast(minCsrAlignment), 1024); - PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, &csrSurface); + PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, &csrSurface, nullptr); PreemptionHelper::programStateSip(preemptionStream, *mockDevice, nullptr); @@ -144,7 +144,7 @@ HWTEST_F(PreambleTest, givenKernelDebuggingActiveWhenPreambleIsProgrammedThenPro StackVec preambleBuffer(8192); LinearStream preambleStream(&*preambleBuffer.begin(), preambleBuffer.size()); - PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, nullptr); + PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, nullptr, nullptr); HardwareParse hwParser; hwParser.parseCommands(preambleStream); @@ -157,7 +157,7 @@ HWTEST_F(PreambleTest, givenKernelDebuggingActiveWhenPreambleIsProgrammedThenPro StackVec preambleBuffer2(8192); preambleStream.replaceBuffer(&*preambleBuffer2.begin(), preambleBuffer2.size()); - PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, preemptionAllocation); + PreambleHelper::programPreamble(&preambleStream, *mockDevice, 0U, preemptionAllocation, nullptr); HardwareParse hwParser2; hwParser2.parseCommands(preambleStream); cmdList = hwParser2.getCommandsList(); diff --git a/shared/test/unit_test/preemption/preemption_tests.cpp b/shared/test/unit_test/preemption/preemption_tests.cpp index d27a09d206..19454d8e07 100644 --- a/shared/test/unit_test/preemption/preemption_tests.cpp +++ b/shared/test/unit_test/preemption/preemption_tests.cpp @@ -229,7 +229,7 @@ HWTEST_P(PreemptionTest, whenInNonMidThreadModeThenCsrBaseAddressIsNotProgrammed StackVec buffer(requiredSize); LinearStream cmdStream(buffer.begin(), buffer.size()); - PreemptionHelper::programCsrBaseAddress(cmdStream, *mockDevice, nullptr); + PreemptionHelper::programCsrBaseAddress(cmdStream, *mockDevice, nullptr, nullptr); EXPECT_EQ(0u, cmdStream.getUsed()); } diff --git a/shared/test/unit_test/xe_hp_core/xe_hp_sdv/test_preamble_xe_hp_sdv.cpp b/shared/test/unit_test/xe_hp_core/xe_hp_sdv/test_preamble_xe_hp_sdv.cpp index 6be791cbc1..3efc5aac31 100644 --- a/shared/test/unit_test/xe_hp_core/xe_hp_sdv/test_preamble_xe_hp_sdv.cpp +++ b/shared/test/unit_test/xe_hp_core/xe_hp_sdv/test_preamble_xe_hp_sdv.cpp @@ -35,7 +35,7 @@ XEHPTEST_F(XeHPSlm, givenTglWhenPreambleIsBeingProgrammedThenThreadArbitrationPo uint32_t l3Config = PreambleHelper::getL3Config(*defaultHwInfo, true); MockDevice mockDevice; PreambleHelper::programPreamble(&linearStream, mockDevice, l3Config, - nullptr); + nullptr, nullptr); parseCommands(cs);