/* * Copyright (C) 2018-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/command_stream/linear_stream.h" #include "shared/source/command_stream/preemption.h" #include "shared/source/device/device.h" #include "shared/source/helpers/aligned_memory.h" #include "shared/source/helpers/hw_helper.h" #include "shared/source/helpers/preamble.h" #include "shared/source/helpers/register_offsets.h" #include "hw_cmds.h" #include "reg_configs_common.h" #include namespace NEO { template void PreambleHelper::programThreadArbitration(LinearStream *pCommandStream, uint32_t requiredThreadArbitrationPolicy) { } template size_t PreambleHelper::getThreadArbitrationCommandsSize() { return 0; } template void PreambleHelper::programGenSpecificPreambleWorkArounds(LinearStream *pCommandStream, const HardwareInfo &hwInfo) { } template void PreambleHelper::programPerDssBackedBuffer(LinearStream *pCommandStream, const HardwareInfo &hwInfo, GraphicsAllocation *perDssBackBufferOffset) { } template size_t PreambleHelper::getPerDssBackedBufferCommandsSize(const HardwareInfo &hwInfo) { return 0; } template void PreambleHelper::programSemaphoreDelay(LinearStream *pCommandStream) { if (DebugManager.flags.ForceSemaphoreDelayBetweenWaits.get() > -1) { uint32_t valueOfNewSemaphoreDelay = DebugManager.flags.ForceSemaphoreDelayBetweenWaits.get(); LriHelper::program(pCommandStream, SEMA_WAIT_POLL, valueOfNewSemaphoreDelay, true); }; } template size_t PreambleHelper::getSemaphoreDelayCommandSize() { return sizeof(MI_LOAD_REGISTER_IMM); } template size_t PreambleHelper::getAdditionalCommandsSize(const Device &device) { size_t totalSize = PreemptionHelper::getRequiredPreambleSize(device); totalSize += getKernelDebuggingCommandsSize(device.isDebuggerActive()); return totalSize; } template size_t PreambleHelper::getCmdSizeForPipelineSelect(const HardwareInfo &hwInfo) { size_t size = 0; using PIPELINE_SELECT = typename GfxFamily::PIPELINE_SELECT; size += sizeof(PIPELINE_SELECT); if (MemorySynchronizationCommands::isPipeControlPriorToPipelineSelectWArequired(hwInfo)) { size += sizeof(PIPE_CONTROL); } return size; } template void PreambleHelper::programPreamble(LinearStream *pCommandStream, Device &device, uint32_t l3Config, uint32_t requiredThreadArbitrationPolicy, GraphicsAllocation *preemptionCsr, GraphicsAllocation *perDssBackedBuffer) { programL3(pCommandStream, l3Config); programThreadArbitration(pCommandStream, requiredThreadArbitrationPolicy); programPreemption(pCommandStream, device, preemptionCsr); if (device.isDebuggerActive()) { programKernelDebugging(pCommandStream); } programGenSpecificPreambleWorkArounds(pCommandStream, device.getHardwareInfo()); if (perDssBackedBuffer != nullptr) { programPerDssBackedBuffer(pCommandStream, device.getHardwareInfo(), perDssBackedBuffer); } programSemaphoreDelay(pCommandStream); } template void PreambleHelper::programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr) { PreemptionHelper::programCsrBaseAddress(*pCommandStream, device, preemptionCsr); } template void PreambleHelper::programKernelDebugging(LinearStream *pCommandStream) { LriHelper::program(pCommandStream, DebugModeRegisterOffset::registerOffset, DebugModeRegisterOffset::debugEnabledValue, false); LriHelper::program(pCommandStream, TdDebugControlRegisterOffset::registerOffset, TdDebugControlRegisterOffset::debugEnabledValue, false); } template size_t PreambleHelper::getKernelDebuggingCommandsSize(bool debuggingActive) { if (debuggingActive) { return 2 * sizeof(MI_LOAD_REGISTER_IMM); } return 0; } template bool PreambleHelper::isL3Configurable(const HardwareInfo &hwInfo) { return false; } template void PreambleHelper::programAdditionalFieldsInVfeState(VFE_STATE_TYPE *mediaVfeState, const HardwareInfo &hwInfo) { } template uint32_t PreambleHelper::getScratchSizeValueToProgramMediaVfeState(uint32_t scratchSize) { scratchSize >>= static_cast(MemoryConstants::kiloByteShiftSize); uint32_t valueToProgram = 0; while (scratchSize >>= 1) { valueToProgram++; } return valueToProgram; } } // namespace NEO