2020-01-24 21:58:15 +08:00
|
|
|
/*
|
2024-02-28 21:51:36 +08:00
|
|
|
* Copyright (C) 2020-2024 Intel Corporation
|
2020-01-24 21:58:15 +08:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2020-02-24 05:44:01 +08:00
|
|
|
#include "shared/source/command_stream/linear_stream.h"
|
|
|
|
#include "shared/source/helpers/ptr_math.h"
|
2021-01-21 20:10:13 +08:00
|
|
|
#include "shared/test/common/cmd_parse/hw_parse.h"
|
2023-02-09 19:28:14 +08:00
|
|
|
#include "shared/test/common/test_macros/hw_test.h"
|
2022-08-09 22:26:49 +08:00
|
|
|
#include "shared/test/unit_test/fixtures/command_container_fixture.h"
|
2020-02-24 17:22:30 +08:00
|
|
|
|
2020-01-24 21:58:15 +08:00
|
|
|
using namespace NEO;
|
|
|
|
|
2022-08-11 22:01:11 +08:00
|
|
|
using CommandEncodeSemaphore = Test<CommandEncodeStatesFixture>;
|
2020-01-24 21:58:15 +08:00
|
|
|
|
2021-05-26 20:17:53 +08:00
|
|
|
HWTEST_F(CommandEncodeSemaphore, WhenProgrammingThenMiSemaphoreWaitIsUsed) {
|
2020-01-24 21:58:15 +08:00
|
|
|
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
|
2023-03-04 03:01:14 +08:00
|
|
|
MI_SEMAPHORE_WAIT miSemaphore1;
|
2020-01-24 21:58:15 +08:00
|
|
|
|
2023-03-10 21:49:06 +08:00
|
|
|
EncodeSemaphore<FamilyType>::programMiSemaphoreWait(&miSemaphore1,
|
2020-01-24 21:58:15 +08:00
|
|
|
0x123400,
|
|
|
|
4,
|
2020-10-16 21:58:47 +08:00
|
|
|
MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_NOT_EQUAL_SDD,
|
2023-03-04 03:01:14 +08:00
|
|
|
false,
|
2023-09-11 23:39:43 +08:00
|
|
|
true,
|
2023-09-12 19:42:40 +08:00
|
|
|
false,
|
2023-09-11 23:39:43 +08:00
|
|
|
false);
|
2023-03-04 03:01:14 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_NOT_EQUAL_SDD, miSemaphore1.getCompareOperation());
|
|
|
|
EXPECT_EQ(4u, miSemaphore1.getSemaphoreDataDword());
|
|
|
|
EXPECT_EQ(0x123400u, miSemaphore1.getSemaphoreGraphicsAddress());
|
|
|
|
EXPECT_EQ(MI_SEMAPHORE_WAIT::WAIT_MODE::WAIT_MODE_POLLING_MODE, miSemaphore1.getWaitMode());
|
2020-01-24 21:58:15 +08:00
|
|
|
|
2023-03-04 03:01:14 +08:00
|
|
|
MI_SEMAPHORE_WAIT miSemaphore2;
|
2023-03-10 21:49:06 +08:00
|
|
|
EncodeSemaphore<FamilyType>::programMiSemaphoreWait(&miSemaphore2,
|
2023-03-04 03:01:14 +08:00
|
|
|
0x123400,
|
|
|
|
4,
|
|
|
|
MI_SEMAPHORE_WAIT::COMPARE_OPERATION::COMPARE_OPERATION_SAD_NOT_EQUAL_SDD,
|
|
|
|
false,
|
2023-09-11 23:39:43 +08:00
|
|
|
false,
|
2023-09-12 19:42:40 +08:00
|
|
|
false,
|
2023-03-04 03:01:14 +08:00
|
|
|
false);
|
|
|
|
EXPECT_EQ(MI_SEMAPHORE_WAIT::WAIT_MODE::WAIT_MODE_SIGNAL_MODE, miSemaphore2.getWaitMode());
|
2020-01-24 21:58:15 +08:00
|
|
|
}
|
2020-02-11 22:21:18 +08:00
|
|
|
|
|
|
|
HWTEST_F(CommandEncodeSemaphore, whenAddingMiSemaphoreCommandThenExpectCompareFieldsAreSetCorrectly) {
|
|
|
|
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
|
|
|
|
using COMPARE_OPERATION = typename FamilyType::MI_SEMAPHORE_WAIT::COMPARE_OPERATION;
|
|
|
|
using WAIT_MODE = typename FamilyType::MI_SEMAPHORE_WAIT::WAIT_MODE;
|
|
|
|
|
|
|
|
std::unique_ptr<uint8_t> buffer(new uint8_t[128]);
|
|
|
|
LinearStream stream(buffer.get(), 128);
|
|
|
|
COMPARE_OPERATION compareMode = COMPARE_OPERATION::COMPARE_OPERATION_SAD_GREATER_THAN_OR_EQUAL_SDD;
|
|
|
|
|
2023-03-10 21:49:06 +08:00
|
|
|
EncodeSemaphore<FamilyType>::addMiSemaphoreWaitCommand(stream,
|
2020-02-11 22:21:18 +08:00
|
|
|
0xFF00FF000u,
|
|
|
|
5u,
|
2024-02-28 21:51:36 +08:00
|
|
|
compareMode, false, false, false, nullptr);
|
2020-02-11 22:21:18 +08:00
|
|
|
|
2023-03-10 21:49:06 +08:00
|
|
|
EXPECT_EQ(NEO::EncodeSemaphore<FamilyType>::getSizeMiSemaphoreWait(), stream.getUsed());
|
2020-02-11 22:21:18 +08:00
|
|
|
|
|
|
|
HardwareParse hwParse;
|
|
|
|
hwParse.parseCommands<FamilyType>(stream);
|
|
|
|
MI_SEMAPHORE_WAIT *miSemaphore = hwParse.getCommand<MI_SEMAPHORE_WAIT>();
|
2020-02-15 00:39:13 +08:00
|
|
|
ASSERT_NE(nullptr, miSemaphore);
|
2020-02-11 22:21:18 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(compareMode, miSemaphore->getCompareOperation());
|
|
|
|
EXPECT_EQ(5u, miSemaphore->getSemaphoreDataDword());
|
|
|
|
EXPECT_EQ(0xFF00FF000u, miSemaphore->getSemaphoreGraphicsAddress());
|
|
|
|
EXPECT_EQ(WAIT_MODE::WAIT_MODE_POLLING_MODE, miSemaphore->getWaitMode());
|
|
|
|
}
|
|
|
|
|
2023-09-12 19:42:40 +08:00
|
|
|
HWTEST2_F(CommandEncodeSemaphore, givenIndirectModeSetWhenProgrammingSemaphoreThenSetIndirectBit, IsAtLeastXeHpCore) {
|
|
|
|
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
|
|
|
|
using COMPARE_OPERATION = typename FamilyType::MI_SEMAPHORE_WAIT::COMPARE_OPERATION;
|
|
|
|
using WAIT_MODE = typename FamilyType::MI_SEMAPHORE_WAIT::WAIT_MODE;
|
|
|
|
|
|
|
|
std::unique_ptr<uint8_t> buffer(new uint8_t[128]);
|
|
|
|
LinearStream stream(buffer.get(), 128);
|
|
|
|
COMPARE_OPERATION compareMode = COMPARE_OPERATION::COMPARE_OPERATION_SAD_GREATER_THAN_OR_EQUAL_SDD;
|
|
|
|
|
2024-02-28 21:51:36 +08:00
|
|
|
void *outSemWait = nullptr;
|
2023-09-12 19:42:40 +08:00
|
|
|
EncodeSemaphore<FamilyType>::addMiSemaphoreWaitCommand(stream,
|
|
|
|
0xFF00FF000u,
|
|
|
|
5u,
|
2024-02-28 21:51:36 +08:00
|
|
|
compareMode, false, false, true, &outSemWait);
|
2023-09-12 19:42:40 +08:00
|
|
|
|
|
|
|
EXPECT_EQ(NEO::EncodeSemaphore<FamilyType>::getSizeMiSemaphoreWait(), stream.getUsed());
|
|
|
|
|
|
|
|
HardwareParse hwParse;
|
|
|
|
hwParse.parseCommands<FamilyType>(stream);
|
|
|
|
MI_SEMAPHORE_WAIT *miSemaphore = hwParse.getCommand<MI_SEMAPHORE_WAIT>();
|
|
|
|
ASSERT_NE(nullptr, miSemaphore);
|
|
|
|
|
2024-02-28 21:51:36 +08:00
|
|
|
auto outSemWaitCmd = genCmdCast<MI_SEMAPHORE_WAIT *>(outSemWait);
|
|
|
|
ASSERT_NE(nullptr, outSemWaitCmd);
|
|
|
|
EXPECT_EQ(miSemaphore, outSemWaitCmd);
|
|
|
|
|
2023-09-12 19:42:40 +08:00
|
|
|
EXPECT_TRUE(miSemaphore->getIndirectSemaphoreDataDword());
|
|
|
|
}
|
|
|
|
|
2020-02-11 22:21:18 +08:00
|
|
|
HWTEST_F(CommandEncodeSemaphore, whenGettingMiSemaphoreCommandSizeThenExpectSingleMiSemaphoreCommandSize) {
|
|
|
|
using MI_SEMAPHORE_WAIT = typename FamilyType::MI_SEMAPHORE_WAIT;
|
2023-03-10 21:49:06 +08:00
|
|
|
size_t expectedSize = NEO::EncodeSemaphore<FamilyType>::getSizeMiSemaphoreWait();
|
|
|
|
size_t actualSize = EncodeSemaphore<FamilyType>::getSizeMiSemaphoreWait();
|
2020-02-11 22:21:18 +08:00
|
|
|
EXPECT_EQ(expectedSize, actualSize);
|
|
|
|
}
|