/* * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/command_stream/preemption.h" #include "shared/source/command_stream/preemption.inl" namespace NEO { using GfxFamily = BDWFamily; template <> struct PreemptionConfig { static constexpr uint32_t mmioAddress = 0x2248; static constexpr uint32_t maskVal = 0; static constexpr uint32_t maskShift = 0; static constexpr uint32_t mask = 0; static constexpr uint32_t threadGroupVal = 0; static constexpr uint32_t cmdLevelVal = (1 << 2); static constexpr uint32_t midThreadVal = 0; }; template <> void PreemptionHelper::programCmdStream(LinearStream &cmdStream, PreemptionMode newPreemptionMode, PreemptionMode oldPreemptionMode, GraphicsAllocation *preemptionCsr) { if (newPreemptionMode == oldPreemptionMode) { return; } uint32_t regVal = 0; if (newPreemptionMode == PreemptionMode::ThreadGroup) { regVal = PreemptionConfig::threadGroupVal; } else { regVal = PreemptionConfig::cmdLevelVal; } LriHelper::program(&cmdStream, PreemptionConfig::mmioAddress, regVal, false); } template <> size_t PreemptionHelper::getRequiredPreambleSize(const Device &device) { return 0; } template <> size_t PreemptionHelper::getRequiredStateSipCmdSize(const Device &device) { return 0; } template <> void PreemptionHelper::programCsrBaseAddress(LinearStream &preambleCmdStream, Device &device, const GraphicsAllocation *preemptionCsr) { } template <> void PreemptionHelper::programStateSip(LinearStream &preambleCmdStream, Device &device) { } template <> size_t PreemptionHelper::getPreemptionWaCsSize(const Device &device) { typedef typename GfxFamily::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; size_t size = 0; PreemptionMode preemptionMode = device.getPreemptionMode(); if (preemptionMode == PreemptionMode::ThreadGroup || preemptionMode == PreemptionMode::MidThread) { if (device.getHardwareInfo().workaroundTable.waModifyVFEStateAfterGPGPUPreemption) { size += 2 * sizeof(MI_LOAD_REGISTER_IMM); } } return size; } template <> void PreemptionHelper::applyPreemptionWaCmdsBegin(LinearStream *pCommandStream, const Device &device) { typedef typename GfxFamily::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; PreemptionMode preemptionMode = device.getPreemptionMode(); if (preemptionMode == PreemptionMode::ThreadGroup || preemptionMode == PreemptionMode::MidThread) { if (device.getHardwareInfo().workaroundTable.waModifyVFEStateAfterGPGPUPreemption) { auto pCmd = reinterpret_cast(pCommandStream->getSpace(sizeof(MI_LOAD_REGISTER_IMM))); MI_LOAD_REGISTER_IMM cmd = GfxFamily::cmdInitLoadRegisterImm; cmd.setRegisterOffset(CS_GPR_R0); cmd.setDataDword(GPGPU_WALKER_COOKIE_VALUE_BEFORE_WALKER); *pCmd = cmd; } } } template <> void PreemptionHelper::applyPreemptionWaCmdsEnd(LinearStream *pCommandStream, const Device &device) { typedef typename GfxFamily::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; PreemptionMode preemptionMode = device.getPreemptionMode(); if (preemptionMode == PreemptionMode::ThreadGroup || preemptionMode == PreemptionMode::MidThread) { if (device.getHardwareInfo().workaroundTable.waModifyVFEStateAfterGPGPUPreemption) { auto pCmd = reinterpret_cast(pCommandStream->getSpace(sizeof(MI_LOAD_REGISTER_IMM))); MI_LOAD_REGISTER_IMM cmd = GfxFamily::cmdInitLoadRegisterImm; cmd.setRegisterOffset(CS_GPR_R0); cmd.setDataDword(GPGPU_WALKER_COOKIE_VALUE_AFTER_WALKER); *pCmd = cmd; } } } template <> void PreemptionHelper::programInterfaceDescriptorDataPreemption(INTERFACE_DESCRIPTOR_DATA *idd, PreemptionMode preemptionMode) { } template size_t PreemptionHelper::getRequiredCmdStreamSize(PreemptionMode newPreemptionMode, PreemptionMode oldPreemptionMode); } // namespace NEO