Files
compute-runtime/shared/test/unit_test/command_stream/host_function_tests.cpp
Kamil Kopryk d20c9264e5 feature: add hostFunctions data layout
Related-To: NEO-14577
Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com>
2025-09-11 11:46:59 +02:00

76 lines
3.2 KiB
C++

/*
* Copyright (C) 2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/command_stream/host_function.h"
#include "shared/test/common/cmd_parse/hw_parse.h"
#include "shared/test/common/fixtures/device_fixture.h"
#include "shared/test/common/test_macros/hw_test.h"
#include <cstddef>
using namespace NEO;
using HostFunctionTests = Test<DeviceFixture>;
HWTEST_F(HostFunctionTests, givenHostFunctionDataStoredWhenProgramHostFunctionIsCalledThenMiStoresAndSemaphoreWaitAreProgrammedCorrectlyInCorrectOrder) {
using MI_STORE_DATA_IMM = typename FamilyType::MI_STORE_DATA_IMM;
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
constexpr auto size = 1024u;
std::byte buff[size] = {};
LinearStream stream(buff, size);
uint64_t userHostFunctionStored = 10u;
uint64_t userDataStored = 20u;
uint32_t tagStored = 0;
HostFunctionData hostFunctionData{
.entry = &userHostFunctionStored,
.userData = &userDataStored,
.internalTag = &tagStored};
uint64_t userCallback = 0xAAAA'0000ull;
uint64_t userCallbackData = 0xBBBB'000ull;
HostFunctionHelper::programHostFunction<FamilyType>(stream, hostFunctionData, userCallback, userCallbackData);
HardwareParse hwParser;
hwParser.parseCommands<FamilyType>(stream, 0);
auto miStores = findAll<MI_STORE_DATA_IMM *>(hwParser.cmdList.begin(), hwParser.cmdList.end());
EXPECT_EQ(3u, miStores.size());
auto miWait = findAll<MI_SEMAPHORE_WAIT *>(hwParser.cmdList.begin(), hwParser.cmdList.end());
EXPECT_EQ(1u, miWait.size());
// program callback address
auto miStoreUserHostFunction = genCmdCast<MI_STORE_DATA_IMM *>(*miStores[0]);
EXPECT_EQ(reinterpret_cast<uint64_t>(&userHostFunctionStored), miStoreUserHostFunction->getAddress());
EXPECT_EQ(getLowPart(userCallback), miStoreUserHostFunction->getDataDword0());
EXPECT_EQ(getHighPart(userCallback), miStoreUserHostFunction->getDataDword1());
EXPECT_TRUE(miStoreUserHostFunction->getStoreQword());
// program callback data
auto miStoreUserData = genCmdCast<MI_STORE_DATA_IMM *>(*miStores[1]);
EXPECT_EQ(reinterpret_cast<uint64_t>(&userDataStored), miStoreUserData->getAddress());
EXPECT_EQ(getLowPart(userCallbackData), miStoreUserData->getDataDword0());
EXPECT_EQ(getHighPart(userCallbackData), miStoreUserData->getDataDword1());
EXPECT_TRUE(miStoreUserData->getStoreQword());
// signal pending job
auto miStoreSignalTag = genCmdCast<MI_STORE_DATA_IMM *>(*miStores[2]);
EXPECT_EQ(reinterpret_cast<uint64_t>(&tagStored), miStoreSignalTag->getAddress());
EXPECT_EQ(static_cast<uint32_t>(HostFunctionTagStatus::pending), miStoreSignalTag->getDataDword0());
EXPECT_FALSE(miStoreSignalTag->getStoreQword());
// wait for completion
auto miWaitTag = genCmdCast<MI_SEMAPHORE_WAIT *>(*miWait[0]);
EXPECT_EQ(reinterpret_cast<uint64_t>(&tagStored), miWaitTag->getSemaphoreGraphicsAddress());
EXPECT_EQ(static_cast<uint32_t>(HostFunctionTagStatus::completed), miWaitTag->getSemaphoreDataDword());
EXPECT_EQ(MI_SEMAPHORE_WAIT::COMPARE_OPERATION_SAD_EQUAL_SDD, miWaitTag->getCompareOperation());
EXPECT_EQ(MI_SEMAPHORE_WAIT::WAIT_MODE_POLLING_MODE, miWaitTag->getWaitMode());
}