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:
parent
4fd219cdbb
commit
e44c7f2627
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue