fix: BCS MMIO programming

When remap is enabled, we must set different base offset for copy engines.
Copy engines must use BCS0 base.

Related-To: NEO-10678

Signed-off-by: Andrzej Koska <andrzej.koska@intel.com>
This commit is contained in:
Andrzej Koska 2024-05-07 10:19:55 +00:00 committed by Compute-Runtime-Automation
parent 4fd219cdbb
commit e44c7f2627
5 changed files with 70 additions and 2 deletions

View File

@ -234,13 +234,15 @@ bool InOrderCmdListFixture::verifyInOrderDependency(GenCmdList::iterator &cmd, u
if (!lri) {
return false;
}
uint32_t base = (isBcs) ? RegisterOffsets::bcs0Base : 0x0;
EXPECT_EQ(getLowPart(counter), lri->getDataDword());
EXPECT_EQ(RegisterOffsets::csGprR0, lri->getRegisterOffset());
EXPECT_EQ(RegisterOffsets::csGprR0 + base, lri->getRegisterOffset());
lri++;
EXPECT_EQ(getHighPart(counter), lri->getDataDword());
EXPECT_EQ(RegisterOffsets::csGprR0 + 4, lri->getRegisterOffset());
EXPECT_EQ(RegisterOffsets::csGprR0 + 4 + base, lri->getRegisterOffset());
std::advance(cmd, 2);
}

View File

@ -18,6 +18,7 @@ inline bool GfxCoreHelperHw<GfxFamily>::isFusedEuDispatchEnabled(const HardwareI
template <typename GfxFamily>
void *LriHelper<GfxFamily>::program(MI_LOAD_REGISTER_IMM *lriCmd, uint32_t address, uint32_t value, bool remap, bool isBcs) {
MI_LOAD_REGISTER_IMM cmd = GfxFamily::cmdInitLoadRegisterImm;
address += (isBcs && remap) ? RegisterOffsets::bcs0Base : 0x0;
cmd.setRegisterOffset(address);
cmd.setDataDword(value);

View File

@ -24,6 +24,7 @@ inline bool GfxCoreHelperHw<GfxFamily>::isFusedEuDispatchEnabled(const HardwareI
template <typename GfxFamily>
void *LriHelper<GfxFamily>::program(MI_LOAD_REGISTER_IMM *lriCmd, uint32_t address, uint32_t value, bool remap, bool isBcs) {
MI_LOAD_REGISTER_IMM cmd = Family::cmdInitLoadRegisterImm;
address += (isBcs && remap) ? RegisterOffsets::bcs0Base : 0x0;
cmd.setRegisterOffset(address);
cmd.setDataDword(value);
cmd.setMmioRemapEnable(remap);

View File

@ -40,6 +40,7 @@ inline constexpr uint32_t csGprR11 = 0x2658;
inline constexpr uint32_t csGprR12 = 0x2660;
inline constexpr uint32_t csGprR13 = 0x2668;
inline constexpr uint32_t csGprR14 = 0x2670;
inline constexpr uint32_t bcs0Base = 0x20000;
inline constexpr uint32_t csPredicateResult = 0x2418;
inline constexpr uint32_t csPredicateResult2 = 0x23BC;

View File

@ -237,6 +237,69 @@ HWTEST_F(LriHelperTests, givenAddressAndOffsetWhenHelperIsUsedThenProgramCmdStre
EXPECT_EQ(data, lri->getDataDword());
}
HWTEST_F(LriHelperTests, givenAddressAndOffsetAndRemapAndNotBlitterWhenHelperIsUsedThenProgramCmdStream) {
using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM;
std::unique_ptr<uint8_t> buffer(new uint8_t[128]);
LinearStream stream(buffer.get(), 128);
uint32_t address = 0x8888;
uint32_t data = 0x1234;
auto expectedLri = FamilyType::cmdInitLoadRegisterImm;
expectedLri.setRegisterOffset(address);
expectedLri.setDataDword(data);
LriHelper<FamilyType>::program(&stream, address, data, true, false);
auto lri = genCmdCast<MI_LOAD_REGISTER_IMM *>(stream.getCpuBase());
ASSERT_NE(nullptr, lri);
EXPECT_EQ(sizeof(MI_LOAD_REGISTER_IMM), stream.getUsed());
EXPECT_EQ(address, lri->getRegisterOffset());
EXPECT_EQ(data, lri->getDataDword());
}
HWTEST_F(LriHelperTests, givenAddressAndOffsetAndNotRemapAndBlitterWhenHelperIsUsedThenProgramCmdStream) {
using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM;
std::unique_ptr<uint8_t> buffer(new uint8_t[128]);
LinearStream stream(buffer.get(), 128);
uint32_t address = 0x8888;
uint32_t data = 0x1234;
auto expectedLri = FamilyType::cmdInitLoadRegisterImm;
expectedLri.setRegisterOffset(address);
expectedLri.setDataDword(data);
LriHelper<FamilyType>::program(&stream, address, data, false, true);
auto lri = genCmdCast<MI_LOAD_REGISTER_IMM *>(stream.getCpuBase());
ASSERT_NE(nullptr, lri);
EXPECT_EQ(sizeof(MI_LOAD_REGISTER_IMM), stream.getUsed());
EXPECT_EQ(address, lri->getRegisterOffset());
EXPECT_EQ(data, lri->getDataDword());
}
HWTEST_F(LriHelperTests, givenAddressAndOffsetAndRemapAndBlitterWhenHelperIsUsedThenProgramCmdStream) {
using MI_LOAD_REGISTER_IMM = typename FamilyType::MI_LOAD_REGISTER_IMM;
std::unique_ptr<uint8_t> buffer(new uint8_t[128]);
LinearStream stream(buffer.get(), 128);
uint32_t address = 0x8888;
uint32_t data = 0x1234;
auto expectedLri = FamilyType::cmdInitLoadRegisterImm;
expectedLri.setRegisterOffset(address);
expectedLri.setDataDword(data);
LriHelper<FamilyType>::program(&stream, address, data, true, true);
auto lri = genCmdCast<MI_LOAD_REGISTER_IMM *>(stream.getCpuBase());
ASSERT_NE(nullptr, lri);
EXPECT_EQ(sizeof(MI_LOAD_REGISTER_IMM), stream.getUsed());
EXPECT_EQ(address + RegisterOffsets::bcs0Base, lri->getRegisterOffset());
EXPECT_EQ(data, lri->getDataDword());
}
using PipeControlHelperTests = ::testing::Test;
HWTEST_F(PipeControlHelperTests, givenPostSyncWriteTimestampModeWhenHelperIsUsedThenProperFieldsAreProgrammed) {