Skip to content

Commit d8ea439

Browse files
Store non canonical SBA addresses
- fixes reading SBA addresses error Related-To: NEO-6221 Signed-off-by: Mateusz Hoppe <[email protected]>
1 parent 7e08e56 commit d8ea439

File tree

2 files changed

+113
-14
lines changed

2 files changed

+113
-14
lines changed

level_zero/core/source/debugger/debugger_l0.inl

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,50 +35,56 @@ void DebuggerL0Hw<GfxFamily>::programSbaTrackingCommands(NEO::LinearStream &cmdS
3535
sba.IndirectObjectBaseAddress, sba.InstructionBaseAddress, sba.BindlessSurfaceStateBaseAddress);
3636

3737
if (sba.GeneralStateBaseAddress) {
38+
auto generalStateBaseAddress = NEO::GmmHelper::decanonize(sba.GeneralStateBaseAddress);
3839
NEO::EncodeStoreMemory<GfxFamily>::programStoreDataImm(cmdStream,
3940
gpuAddress + offsetof(SbaTrackedAddresses, GeneralStateBaseAddress),
40-
static_cast<uint32_t>(sba.GeneralStateBaseAddress & 0x0000FFFFFFFFULL),
41-
static_cast<uint32_t>(sba.GeneralStateBaseAddress >> 32),
41+
static_cast<uint32_t>(generalStateBaseAddress & 0x0000FFFFFFFFULL),
42+
static_cast<uint32_t>(generalStateBaseAddress >> 32),
4243
true,
4344
false);
4445
}
4546
if (sba.SurfaceStateBaseAddress) {
47+
auto surfaceStateBaseAddress = NEO::GmmHelper::decanonize(sba.SurfaceStateBaseAddress);
4648
NEO::EncodeStoreMemory<GfxFamily>::programStoreDataImm(cmdStream,
4749
gpuAddress + offsetof(SbaTrackedAddresses, SurfaceStateBaseAddress),
48-
static_cast<uint32_t>(sba.SurfaceStateBaseAddress & 0x0000FFFFFFFFULL),
49-
static_cast<uint32_t>(sba.SurfaceStateBaseAddress >> 32),
50+
static_cast<uint32_t>(surfaceStateBaseAddress & 0x0000FFFFFFFFULL),
51+
static_cast<uint32_t>(surfaceStateBaseAddress >> 32),
5052
true,
5153
false);
5254
}
5355
if (sba.DynamicStateBaseAddress) {
56+
auto dynamicStateBaseAddress = NEO::GmmHelper::decanonize(sba.DynamicStateBaseAddress);
5457
NEO::EncodeStoreMemory<GfxFamily>::programStoreDataImm(cmdStream,
5558
gpuAddress + offsetof(SbaTrackedAddresses, DynamicStateBaseAddress),
56-
static_cast<uint32_t>(sba.DynamicStateBaseAddress & 0x0000FFFFFFFFULL),
57-
static_cast<uint32_t>(sba.DynamicStateBaseAddress >> 32),
59+
static_cast<uint32_t>(dynamicStateBaseAddress & 0x0000FFFFFFFFULL),
60+
static_cast<uint32_t>(dynamicStateBaseAddress >> 32),
5861
true,
5962
false);
6063
}
6164
if (sba.IndirectObjectBaseAddress) {
65+
auto indirectObjectBaseAddress = NEO::GmmHelper::decanonize(sba.IndirectObjectBaseAddress);
6266
NEO::EncodeStoreMemory<GfxFamily>::programStoreDataImm(cmdStream,
6367
gpuAddress + offsetof(SbaTrackedAddresses, IndirectObjectBaseAddress),
64-
static_cast<uint32_t>(sba.IndirectObjectBaseAddress & 0x0000FFFFFFFFULL),
65-
static_cast<uint32_t>(sba.IndirectObjectBaseAddress >> 32),
68+
static_cast<uint32_t>(indirectObjectBaseAddress & 0x0000FFFFFFFFULL),
69+
static_cast<uint32_t>(indirectObjectBaseAddress >> 32),
6670
true,
6771
false);
6872
}
6973
if (sba.InstructionBaseAddress) {
74+
auto instructionBaseAddress = NEO::GmmHelper::decanonize(sba.InstructionBaseAddress);
7075
NEO::EncodeStoreMemory<GfxFamily>::programStoreDataImm(cmdStream,
7176
gpuAddress + offsetof(SbaTrackedAddresses, InstructionBaseAddress),
72-
static_cast<uint32_t>(sba.InstructionBaseAddress & 0x0000FFFFFFFFULL),
73-
static_cast<uint32_t>(sba.InstructionBaseAddress >> 32),
77+
static_cast<uint32_t>(instructionBaseAddress & 0x0000FFFFFFFFULL),
78+
static_cast<uint32_t>(instructionBaseAddress >> 32),
7479
true,
7580
false);
7681
}
7782
if (sba.BindlessSurfaceStateBaseAddress) {
83+
auto bindlessSurfaceStateBaseAddress = NEO::GmmHelper::decanonize(sba.BindlessSurfaceStateBaseAddress);
7884
NEO::EncodeStoreMemory<GfxFamily>::programStoreDataImm(cmdStream,
7985
gpuAddress + offsetof(SbaTrackedAddresses, BindlessSurfaceStateBaseAddress),
80-
static_cast<uint32_t>(sba.BindlessSurfaceStateBaseAddress & 0x0000FFFFFFFFULL),
81-
static_cast<uint32_t>(sba.BindlessSurfaceStateBaseAddress >> 32),
86+
static_cast<uint32_t>(bindlessSurfaceStateBaseAddress & 0x0000FFFFFFFFULL),
87+
static_cast<uint32_t>(bindlessSurfaceStateBaseAddress >> 32),
8288
true,
8389
false);
8490
}

level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger.cpp

Lines changed: 95 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,8 +1320,10 @@ HWTEST_F(L0DebuggerSimpleTest, givenNonZeroGpuVasWhenProgrammingSbaTrackingThenC
13201320
cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
13211321

13221322
expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, DynamicStateBaseAddress);
1323-
EXPECT_EQ(static_cast<uint32_t>(dsba & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1324-
EXPECT_EQ(static_cast<uint32_t>(dsba >> 32), cmdSdi->getDataDword1());
1323+
1324+
auto decanonizedAddress = GmmHelper::decanonize(dsba);
1325+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1326+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
13251327
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
13261328
EXPECT_TRUE(cmdSdi->getStoreQword());
13271329

@@ -1353,6 +1355,97 @@ HWTEST_F(L0DebuggerSimpleTest, givenNonZeroGpuVasWhenProgrammingSbaTrackingThenC
13531355
EXPECT_TRUE(cmdSdi->getStoreQword());
13541356
}
13551357

1358+
HWTEST_F(L0DebuggerSimpleTest, givenCanonizedGpuVasWhenProgrammingSbaTrackingThenNonCanonicalAddressesAreStored) {
1359+
using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM;
1360+
auto debugger = std::make_unique<MockDebuggerL0Hw<FamilyType>>(neoDevice);
1361+
1362+
debugger->sbaTrackingGpuVa.address = 0x45670000;
1363+
auto expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, GeneralStateBaseAddress);
1364+
1365+
StackVec<char, 4096> buffer(4096);
1366+
NEO::LinearStream cmdStream(buffer.begin(), buffer.size());
1367+
uint64_t gsba = 0xffff800000060000;
1368+
uint64_t ssba = 0xffff801234567000;
1369+
uint64_t iba = 0xffff8000fff80000;
1370+
uint64_t ioba = 0xffff800008100000;
1371+
uint64_t dsba = 0xffff8000aaaa0000;
1372+
1373+
NEO::Debugger::SbaAddresses sbaAddresses = {};
1374+
sbaAddresses.GeneralStateBaseAddress = gsba;
1375+
sbaAddresses.SurfaceStateBaseAddress = ssba;
1376+
sbaAddresses.InstructionBaseAddress = iba;
1377+
sbaAddresses.IndirectObjectBaseAddress = ioba;
1378+
sbaAddresses.DynamicStateBaseAddress = dsba;
1379+
sbaAddresses.BindlessSurfaceStateBaseAddress = ssba;
1380+
1381+
debugger->programSbaTrackingCommands(cmdStream, sbaAddresses);
1382+
1383+
GenCmdList cmdList;
1384+
ASSERT_TRUE(FamilyType::PARSE::parseCommandBuffer(cmdList, cmdStream.getCpuBase(), cmdStream.getUsed()));
1385+
1386+
EXPECT_EQ(6 * sizeof(MI_STORE_DATA_IMM), cmdStream.getUsed());
1387+
1388+
auto sdiItor = find<MI_STORE_DATA_IMM *>(cmdList.begin(), cmdList.end());
1389+
ASSERT_NE(cmdList.end(), sdiItor);
1390+
auto cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
1391+
1392+
auto decanonizedAddress = GmmHelper::decanonize(gsba);
1393+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1394+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
1395+
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
1396+
EXPECT_TRUE(cmdSdi->getStoreQword());
1397+
1398+
sdiItor++;
1399+
cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
1400+
1401+
expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, SurfaceStateBaseAddress);
1402+
decanonizedAddress = GmmHelper::decanonize(ssba);
1403+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1404+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
1405+
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
1406+
EXPECT_TRUE(cmdSdi->getStoreQword());
1407+
1408+
sdiItor++;
1409+
cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
1410+
1411+
expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, DynamicStateBaseAddress);
1412+
decanonizedAddress = GmmHelper::decanonize(dsba);
1413+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1414+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
1415+
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
1416+
EXPECT_TRUE(cmdSdi->getStoreQword());
1417+
1418+
sdiItor++;
1419+
cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
1420+
1421+
expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, IndirectObjectBaseAddress);
1422+
decanonizedAddress = GmmHelper::decanonize(ioba);
1423+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1424+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
1425+
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
1426+
EXPECT_TRUE(cmdSdi->getStoreQword());
1427+
1428+
sdiItor++;
1429+
cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
1430+
1431+
expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, InstructionBaseAddress);
1432+
decanonizedAddress = GmmHelper::decanonize(iba);
1433+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1434+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
1435+
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
1436+
EXPECT_TRUE(cmdSdi->getStoreQword());
1437+
1438+
sdiItor++;
1439+
cmdSdi = genCmdCast<MI_STORE_DATA_IMM *>(*sdiItor);
1440+
1441+
expectedGpuVa = debugger->sbaTrackingGpuVa.address + offsetof(SbaTrackedAddresses, BindlessSurfaceStateBaseAddress);
1442+
decanonizedAddress = GmmHelper::decanonize(ssba);
1443+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress & 0x0000FFFFFFFFULL), cmdSdi->getDataDword0());
1444+
EXPECT_EQ(static_cast<uint32_t>(decanonizedAddress >> 32), cmdSdi->getDataDword1());
1445+
EXPECT_EQ(expectedGpuVa, cmdSdi->getAddress());
1446+
EXPECT_TRUE(cmdSdi->getStoreQword());
1447+
}
1448+
13561449
HWTEST_F(L0DebuggerSimpleTest, givenZeroGpuVasWhenProgrammingSbaTrackingThenStreamIsNotUsed) {
13571450
using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM;
13581451
auto debugger = std::make_unique<MockDebuggerL0Hw<FamilyType>>(neoDevice);

0 commit comments

Comments
 (0)