@@ -1276,3 +1276,135 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, WalkerPartitionTests, givenStaticWalkerPartitionWhe
12761276 }
12771277 EXPECT_EQ (parsedOffset, totalBytesProgrammed);
12781278}
1279+
1280+ HWCMDTEST_F (IGFX_XE_HP_CORE, WalkerPartitionTests, givenStaticPartitionIsPreferredAndWalkerWithNonUniformStartWhenDynamicPartitionSelectedThenExpectReconfigureWparidToStatic) {
1281+ WalkerPartition::COMPUTE_WALKER<FamilyType> walker;
1282+ walker = FamilyType::cmdInitGpgpuWalker;
1283+ walker.setThreadGroupIdStartingX (1u );
1284+
1285+ checkForProperCmdBufferAddressOffset = false ;
1286+ bool preferredStaticPartitioning = true ;
1287+ bool staticPartitioning = false ;
1288+ auto partitionCount = computePartitionCountAndSetPartitionType<FamilyType>(&walker, 4u , preferredStaticPartitioning, false , &staticPartitioning);
1289+ EXPECT_FALSE (staticPartitioning);
1290+ EXPECT_EQ (1u , partitionCount);
1291+ EXPECT_EQ (FamilyType::COMPUTE_WALKER::PARTITION_TYPE::PARTITION_TYPE_DISABLED, walker.getPartitionType ());
1292+
1293+ testArgs.partitionCount = partitionCount;
1294+ testArgs.staticPartitioning = staticPartitioning;
1295+ testArgs.preferredStaticPartitioning = preferredStaticPartitioning;
1296+ testArgs.workPartitionAllocationGpuVa = 0x800BADA55000 ;
1297+
1298+ auto expectedCommandUsedSize = sizeof (WalkerPartition::LOAD_REGISTER_IMM<FamilyType>) +
1299+ sizeof (WalkerPartition::MI_ATOMIC<FamilyType>) * 2 +
1300+ sizeof (WalkerPartition::LOAD_REGISTER_REG<FamilyType>) +
1301+ sizeof (WalkerPartition::MI_SET_PREDICATE<FamilyType>) * 2 +
1302+ sizeof (WalkerPartition::BATCH_BUFFER_START<FamilyType>) * 3 +
1303+ sizeof (WalkerPartition::PIPE_CONTROL<FamilyType>) +
1304+ sizeof (WalkerPartition::COMPUTE_WALKER<FamilyType>) +
1305+ sizeof (WalkerPartition::MI_SEMAPHORE_WAIT<FamilyType>) +
1306+ sizeof (WalkerPartition::LOAD_REGISTER_MEM<FamilyType>);
1307+
1308+ EXPECT_EQ (expectedCommandUsedSize, computeControlSectionOffset<FamilyType>(testArgs));
1309+
1310+ auto walkerSectionCommands = sizeof (WalkerPartition::BATCH_BUFFER_START<FamilyType>) +
1311+ sizeof (WalkerPartition::COMPUTE_WALKER<FamilyType>);
1312+ auto totalProgrammedSize = expectedCommandUsedSize + sizeof (BatchBufferControlData);
1313+
1314+ testArgs.tileCount = 2 ;
1315+ uint64_t gpuVirtualAddress = 0x8000123000 ;
1316+ WalkerPartition::constructDynamicallyPartitionedCommandBuffer<FamilyType>(cmdBuffer,
1317+ gpuVirtualAddress,
1318+ &walker,
1319+ totalBytesProgrammed,
1320+ testArgs);
1321+
1322+ EXPECT_EQ (totalProgrammedSize, totalBytesProgrammed);
1323+
1324+ auto expectedMask = 0xFFFFu ;
1325+ auto expectedRegister = 0x21FCu ;
1326+ auto loadRegisterImmediate = genCmdCast<WalkerPartition::LOAD_REGISTER_IMM<FamilyType> *>(cmdBufferAddress);
1327+ ASSERT_NE (nullptr , loadRegisterImmediate);
1328+ EXPECT_EQ (expectedRegister, loadRegisterImmediate->getRegisterOffset ());
1329+ EXPECT_EQ (expectedMask, loadRegisterImmediate->getDataDword ());
1330+ auto parsedOffset = sizeof (WalkerPartition::LOAD_REGISTER_IMM<FamilyType>);
1331+
1332+ auto miAtomic = genCmdCast<WalkerPartition::MI_ATOMIC<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1333+ ASSERT_NE (nullptr , miAtomic);
1334+ auto miAtomicAddress = gpuVirtualAddress + expectedCommandUsedSize;
1335+ auto miAtomicProgrammedAddress = UnitTestHelper<FamilyType>::getAtomicMemoryAddress (*miAtomic);
1336+ EXPECT_EQ (miAtomicAddress, miAtomicProgrammedAddress);
1337+ EXPECT_TRUE (miAtomic->getReturnDataControl ());
1338+ EXPECT_EQ (MI_ATOMIC<FamilyType>::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT, miAtomic->getAtomicOpcode ());
1339+ parsedOffset += sizeof (WalkerPartition::MI_ATOMIC<FamilyType>);
1340+
1341+ auto loadRegisterReg = genCmdCast<WalkerPartition::LOAD_REGISTER_REG<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1342+ ASSERT_NE (nullptr , loadRegisterReg);
1343+ EXPECT_TRUE (loadRegisterReg->getMmioRemapEnableDestination ());
1344+ EXPECT_TRUE (loadRegisterReg->getMmioRemapEnableSource ());
1345+ EXPECT_EQ (wparidCCSOffset, loadRegisterReg->getDestinationRegisterAddress ());
1346+ EXPECT_EQ (generalPurposeRegister4, loadRegisterReg->getSourceRegisterAddress ());
1347+ parsedOffset += sizeof (WalkerPartition::LOAD_REGISTER_REG<FamilyType>);
1348+
1349+ auto miSetPredicate = genCmdCast<WalkerPartition::MI_SET_PREDICATE<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1350+ ASSERT_NE (nullptr , miSetPredicate);
1351+ EXPECT_EQ (MI_SET_PREDICATE<FamilyType>::PREDICATE_ENABLE_WPARID::PREDICATE_ENABLE_WPARID_NOOP_ON_NON_ZERO_VALUE, miSetPredicate->getPredicateEnableWparid ());
1352+ parsedOffset += sizeof (WalkerPartition::MI_SET_PREDICATE<FamilyType>);
1353+
1354+ auto batchBufferStart = genCmdCast<WalkerPartition::BATCH_BUFFER_START<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1355+ ASSERT_NE (nullptr , batchBufferStart);
1356+ EXPECT_TRUE (batchBufferStart->getPredicationEnable ());
1357+ // address routes to WALKER section which is before control section
1358+ auto address = batchBufferStart->getBatchBufferStartAddress ();
1359+ EXPECT_EQ (address, gpuVirtualAddress + expectedCommandUsedSize - walkerSectionCommands);
1360+ parsedOffset += sizeof (WalkerPartition::BATCH_BUFFER_START<FamilyType>);
1361+
1362+ miSetPredicate = genCmdCast<WalkerPartition::MI_SET_PREDICATE<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1363+ ASSERT_NE (nullptr , miSetPredicate);
1364+ EXPECT_EQ (MI_SET_PREDICATE<FamilyType>::PREDICATE_ENABLE_WPARID::PREDICATE_ENABLE_WPARID_NOOP_NEVER, miSetPredicate->getPredicateEnableWparid ());
1365+ EXPECT_EQ (MI_SET_PREDICATE<FamilyType>::PREDICATE_ENABLE::PREDICATE_ENABLE_PREDICATE_DISABLE, miSetPredicate->getPredicateEnable ());
1366+ parsedOffset += sizeof (WalkerPartition::MI_SET_PREDICATE<FamilyType>);
1367+
1368+ auto pipeControl = genCmdCast<WalkerPartition::PIPE_CONTROL<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1369+ EXPECT_TRUE (pipeControl->getCommandStreamerStallEnable ());
1370+ EXPECT_EQ (MemorySynchronizationCommands<FamilyType>::isDcFlushAllowed (), pipeControl->getDcFlushEnable ());
1371+ parsedOffset += sizeof (WalkerPartition::PIPE_CONTROL<FamilyType>);
1372+
1373+ miAtomic = genCmdCast<WalkerPartition::MI_ATOMIC<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1374+ ASSERT_NE (nullptr , miAtomic);
1375+ auto miAtomicTileAddress = gpuVirtualAddress + expectedCommandUsedSize + sizeof (uint32_t );
1376+ auto miAtomicTileProgrammedAddress = UnitTestHelper<FamilyType>::getAtomicMemoryAddress (*miAtomic);
1377+ EXPECT_EQ (miAtomicTileAddress, miAtomicTileProgrammedAddress);
1378+ EXPECT_FALSE (miAtomic->getReturnDataControl ());
1379+ EXPECT_EQ (MI_ATOMIC<FamilyType>::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT, miAtomic->getAtomicOpcode ());
1380+ parsedOffset += sizeof (WalkerPartition::MI_ATOMIC<FamilyType>);
1381+
1382+ auto miSemaphoreWait = genCmdCast<WalkerPartition::MI_SEMAPHORE_WAIT<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1383+ ASSERT_NE (nullptr , miSemaphoreWait);
1384+ EXPECT_EQ (miAtomicTileAddress, miSemaphoreWait->getSemaphoreGraphicsAddress ());
1385+ EXPECT_EQ (MI_SEMAPHORE_WAIT<FamilyType>::COMPARE_OPERATION::COMPARE_OPERATION_SAD_GREATER_THAN_OR_EQUAL_SDD, miSemaphoreWait->getCompareOperation ());
1386+ EXPECT_EQ (2u , miSemaphoreWait->getSemaphoreDataDword ());
1387+ parsedOffset += sizeof (WalkerPartition::MI_SEMAPHORE_WAIT<FamilyType>);
1388+
1389+ auto loadRegisterMem = genCmdCast<WalkerPartition::LOAD_REGISTER_MEM<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1390+ ASSERT_NE (nullptr , loadRegisterMem);
1391+ EXPECT_EQ (testArgs.workPartitionAllocationGpuVa , loadRegisterMem->getMemoryAddress ());
1392+ EXPECT_EQ (wparidCCSOffset, loadRegisterMem->getRegisterAddress ());
1393+ parsedOffset += sizeof (WalkerPartition::LOAD_REGISTER_MEM<FamilyType>);
1394+
1395+ // final batch buffer start that routes at the end of the batch buffer
1396+ auto batchBufferStartFinal = genCmdCast<WalkerPartition::BATCH_BUFFER_START<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1397+ EXPECT_NE (nullptr , batchBufferStartFinal);
1398+ EXPECT_EQ (batchBufferStartFinal->getBatchBufferStartAddress (), gpuVirtualAddress + totalProgrammedSize);
1399+ parsedOffset += sizeof (WalkerPartition::BATCH_BUFFER_START<FamilyType>);
1400+
1401+ auto computeWalker = genCmdCast<WalkerPartition::COMPUTE_WALKER<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1402+ ASSERT_NE (nullptr , computeWalker);
1403+ parsedOffset += sizeof (WalkerPartition::COMPUTE_WALKER<FamilyType>);
1404+
1405+ batchBufferStart = genCmdCast<WalkerPartition::BATCH_BUFFER_START<FamilyType> *>(ptrOffset (cmdBuffer, parsedOffset));
1406+ ASSERT_NE (nullptr , batchBufferStart);
1407+ EXPECT_FALSE (batchBufferStart->getPredicationEnable ());
1408+ EXPECT_EQ (gpuVirtualAddress, batchBufferStart->getBatchBufferStartAddress ());
1409+ parsedOffset += sizeof (WalkerPartition::BATCH_BUFFER_START<FamilyType>);
1410+ }
0 commit comments