/* * 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 using namespace NEO; using HostFunctionTests = Test; 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(stream, hostFunctionData, userCallback, userCallbackData); HardwareParse hwParser; hwParser.parseCommands(stream, 0); auto miStores = findAll(hwParser.cmdList.begin(), hwParser.cmdList.end()); EXPECT_EQ(3u, miStores.size()); auto miWait = findAll(hwParser.cmdList.begin(), hwParser.cmdList.end()); EXPECT_EQ(1u, miWait.size()); // program callback address auto miStoreUserHostFunction = genCmdCast(*miStores[0]); EXPECT_EQ(reinterpret_cast(&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(*miStores[1]); EXPECT_EQ(reinterpret_cast(&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(*miStores[2]); EXPECT_EQ(reinterpret_cast(&tagStored), miStoreSignalTag->getAddress()); EXPECT_EQ(static_cast(HostFunctionTagStatus::pending), miStoreSignalTag->getDataDword0()); EXPECT_FALSE(miStoreSignalTag->getStoreQword()); // wait for completion auto miWaitTag = genCmdCast(*miWait[0]); EXPECT_EQ(reinterpret_cast(&tagStored), miWaitTag->getSemaphoreGraphicsAddress()); EXPECT_EQ(static_cast(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()); }