/* * Copyright (C) 2019-2021 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/command_stream/preemption.h" #include "shared/source/command_stream/stream_properties.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/unit_test/preamble/preamble_fixture.h" #include "reg_configs_common.h" using namespace NEO; typedef PreambleFixture TglLpSlm; HWTEST2_F(TglLpSlm, givenTglLpWhenPreambleIsBeingProgrammedThenThreadArbitrationPolicyIsIgnored, IsTGLLP) { DebugManagerStateRestore dbgRestore; DebugManager.flags.ForcePreemptionMode.set(static_cast(PreemptionMode::Disabled)); typedef TGLLPFamily::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; LinearStream &cs = linearStream; uint32_t l3Config = PreambleHelper::getL3Config(pDevice->getHardwareInfo(), true); MockDevice mockDevice; PreambleHelper::programPreamble(&linearStream, mockDevice, l3Config, ThreadArbitrationPolicy::RoundRobin, nullptr); parseCommands(cs); // parse through commands and ensure that 0xE404 is not being programmed EXPECT_EQ(0U, countMmio(cmdList.begin(), cmdList.end(), 0xE404)); } HWTEST2_F(TglLpSlm, WhenCheckingL3IsConfigurableThenExpectItToBeFalse, IsTGLLP) { bool isL3Programmable = PreambleHelper::isL3Configurable(*defaultHwInfo); EXPECT_FALSE(isL3Programmable); } HWTEST2_F(TglLpSlm, WhenPreambleIsCreatedThenSlmIsDisabled, IsTGLLP) { typedef TGLLPFamily::MI_LOAD_REGISTER_IMM MI_LOAD_REGISTER_IMM; LinearStream &cs = linearStream; uint32_t l3Config = PreambleHelper::getL3Config(pDevice->getHardwareInfo(), true); PreambleHelper::programL3(&cs, l3Config); parseCommands(cs); auto itorLRI = find(cmdList.begin(), cmdList.end()); ASSERT_EQ(cmdList.end(), itorLRI); } typedef PreambleFixture Gen12LpUrbEntryAllocationSize; HWTEST2_F(Gen12LpUrbEntryAllocationSize, WhenPreambleIsCreatedThenUrbEntryAllocationSizeIsCorrect, IsTGLLP) { uint32_t actualVal = PreambleHelper::getUrbEntryAllocationSize(); EXPECT_EQ(1024u, actualVal); } typedef PreambleVfeState Gen12LpPreambleVfeState; HWTEST2_F(Gen12LpPreambleVfeState, GivenWaOffWhenProgrammingVfeStateThenProgrammingIsCorrect, IsTGLLP) { typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL; testWaTable->waSendMIFLUSHBeforeVFE = 0; LinearStream &cs = linearStream; auto pVfeCmd = PreambleHelper::getSpaceForVfeState(&linearStream, pPlatform->getClDevice(0)->getHardwareInfo(), EngineGroupType::RenderCompute); StreamProperties emptyProperties{}; PreambleHelper::programVfeState(pVfeCmd, pPlatform->getClDevice(0)->getHardwareInfo(), 0u, 0, 672u, emptyProperties); parseCommands(cs); auto itorPC = find(cmdList.begin(), cmdList.end()); ASSERT_NE(cmdList.end(), itorPC); const auto &pc = *reinterpret_cast(*itorPC); EXPECT_FALSE(pc.getRenderTargetCacheFlushEnable()); EXPECT_FALSE(pc.getDepthCacheFlushEnable()); EXPECT_FALSE(pc.getDepthStallEnable()); EXPECT_FALSE(pc.getDcFlushEnable()); EXPECT_EQ(1u, pc.getCommandStreamerStallEnable()); } HWTEST2_F(Gen12LpPreambleVfeState, givenCcsEngineWhenWaIsSetThenAppropriatePipeControlFlushesAreSet, IsTGLLP) { typedef typename FamilyType::PIPE_CONTROL PIPE_CONTROL; testWaTable->waSendMIFLUSHBeforeVFE = 1; LinearStream &cs = linearStream; auto pVfeCmd = PreambleHelper::getSpaceForVfeState(&linearStream, pPlatform->getClDevice(0)->getHardwareInfo(), EngineGroupType::Compute); StreamProperties emptyProperties{}; PreambleHelper::programVfeState(pVfeCmd, pPlatform->getClDevice(0)->getHardwareInfo(), 0u, 0, 672u, emptyProperties); parseCommands(cs); auto itorPC = find(cmdList.begin(), cmdList.end()); ASSERT_NE(cmdList.end(), itorPC); const auto &pc = *reinterpret_cast(*itorPC); EXPECT_FALSE(pc.getRenderTargetCacheFlushEnable()); EXPECT_FALSE(pc.getDepthCacheFlushEnable()); EXPECT_TRUE(pc.getDcFlushEnable()); EXPECT_EQ(1u, pc.getCommandStreamerStallEnable()); } HWTEST2_F(Gen12LpPreambleVfeState, givenRcsEngineWhenWaIsSetThenAppropriatePipeControlFlushesAreSet, IsTGLLP) { using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; testWaTable->waSendMIFLUSHBeforeVFE = 1; LinearStream &cs = linearStream; auto pVfeCmd = PreambleHelper::getSpaceForVfeState(&linearStream, pPlatform->getClDevice(0)->getHardwareInfo(), EngineGroupType::RenderCompute); StreamProperties emptyProperties{}; PreambleHelper::programVfeState(pVfeCmd, pPlatform->getClDevice(0)->getHardwareInfo(), 0u, 0, 672u, emptyProperties); parseCommands(cs); auto itorPC = find(cmdList.begin(), cmdList.end()); ASSERT_NE(cmdList.end(), itorPC); const auto &pc = *reinterpret_cast(*itorPC); EXPECT_TRUE(pc.getRenderTargetCacheFlushEnable()); EXPECT_TRUE(pc.getDepthCacheFlushEnable()); EXPECT_TRUE(pc.getDepthStallEnable()); EXPECT_TRUE(pc.getDcFlushEnable()); EXPECT_EQ(1u, pc.getCommandStreamerStallEnable()); } HWTEST2_F(Gen12LpPreambleVfeState, givenDefaultPipeControlWhenItIsProgrammedThenCsStallBitIsSet, IsTGLLP) { using PIPE_CONTROL = typename FamilyType::PIPE_CONTROL; PIPE_CONTROL *pipeControl = static_cast(linearStream.getSpace(sizeof(PIPE_CONTROL))); *pipeControl = FamilyType::cmdInitPipeControl; EXPECT_EQ(1u, pipeControl->getCommandStreamerStallEnable()); } HWTEST2_F(Gen12LpPreambleVfeState, givenCfeFusedEuDispatchFlagsWhenprogramAdditionalFieldsInVfeStateIsCalledThenGetDisableSlice0Subslice2ReturnsCorrectValues, IsTGLLP) { using MEDIA_VFE_STATE = typename FamilyType::MEDIA_VFE_STATE; DebugManagerStateRestore restorer; auto pHwInfo = pPlatform->getClDevice(0)->getRootDeviceEnvironment().getMutableHardwareInfo(); auto pMediaVfeState = reinterpret_cast(linearStream.getSpace(sizeof(MEDIA_VFE_STATE))); *pMediaVfeState = FamilyType::cmdInitMediaVfeState; auto &waTable = pHwInfo->workaroundTable; std::tuple testParams[]{ {false, false, 0}, {false, true, 0}, {false, false, -1}, {true, false, 1}, {true, true, -1}, {true, true, 1}}; for (auto &[expectedValue, waDisableFusedThreadScheduling, debugKeyValue] : testParams) { waTable.waDisableFusedThreadScheduling = waDisableFusedThreadScheduling; ::DebugManager.flags.CFEFusedEUDispatch.set(debugKeyValue); PreambleHelper::programAdditionalFieldsInVfeState(pMediaVfeState, *pHwInfo); EXPECT_EQ(expectedValue, pMediaVfeState->getDisableSlice0Subslice2()); } } HWTEST2_F(Gen12LpPreambleVfeState, givenMaxNumberOfDssDebugVariableWhenMediaVfeStateIsProgrammedThenFieldIsSet, IsTGLLP) { using MEDIA_VFE_STATE = typename FamilyType::MEDIA_VFE_STATE; DebugManagerStateRestore restorer; DebugManager.flags.MediaVfeStateMaxSubSlices.set(2); auto pHwInfo = pPlatform->getClDevice(0)->getRootDeviceEnvironment().getMutableHardwareInfo(); auto pMediaVfeState = reinterpret_cast(linearStream.getSpace(sizeof(MEDIA_VFE_STATE))); *pMediaVfeState = FamilyType::cmdInitMediaVfeState; PreambleHelper::programAdditionalFieldsInVfeState(pMediaVfeState, *pHwInfo); EXPECT_EQ(2u, pMediaVfeState->getMaximumNumberOfDualSubslices()); } typedef PreambleFixture ThreadArbitrationGen12Lp; GEN12LPTEST_F(ThreadArbitrationGen12Lp, givenPolicyWhenThreadArbitrationProgrammedThenDoNothing) { LinearStream &cs = linearStream; PreambleHelper::programThreadArbitration(&cs, ThreadArbitrationPolicy::RoundRobin); EXPECT_EQ(0u, cs.getUsed()); EXPECT_EQ(0u, HwHelperHw::get().getDefaultThreadArbitrationPolicy()); } GEN12LPTEST_F(ThreadArbitrationGen12Lp, whenGetSupportThreadArbitrationPoliciesIsCalledThenEmptyVectorIsReturned) { auto supportedPolicies = PreambleHelper::getSupportedThreadArbitrationPolicies(); EXPECT_EQ(0u, supportedPolicies.size()); } typedef PreambleFixture PreemptionWatermarkGen12LP; GEN12LPTEST_F(PreemptionWatermarkGen12LP, WhenPreambleIsCreatedThenPreambleWorkAroundsIsNotProgrammed) { PreambleHelper::programGenSpecificPreambleWorkArounds(&linearStream, pDevice->getHardwareInfo()); parseCommands(linearStream); auto cmd = findMmioCmd(cmdList.begin(), cmdList.end(), FfSliceCsChknReg2::address); ASSERT_EQ(nullptr, cmd); MockDevice mockDevice; mockDevice.setDebuggerActive(false); size_t expectedSize = PreemptionHelper::getRequiredPreambleSize(mockDevice); EXPECT_EQ(expectedSize, PreambleHelper::getAdditionalCommandsSize(mockDevice)); mockDevice.setDebuggerActive(true); expectedSize += PreambleHelper::getKernelDebuggingCommandsSize(mockDevice.isDebuggerActive()); EXPECT_EQ(expectedSize, PreambleHelper::getAdditionalCommandsSize(mockDevice)); }