2020-01-24 14:58:15 +01:00
|
|
|
/*
|
2024-03-27 16:03:11 +00:00
|
|
|
* Copyright (C) 2020-2024 Intel Corporation
|
2020-01-24 14:58:15 +01:00
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
2020-10-01 21:08:46 +02:00
|
|
|
#include "shared/source/command_stream/linear_stream.h"
|
2020-02-23 22:44:01 +01:00
|
|
|
#include "shared/source/helpers/ptr_math.h"
|
2021-01-21 13:10:13 +01:00
|
|
|
#include "shared/test/common/cmd_parse/gen_cmd_parse.h"
|
2021-06-09 10:00:13 +00:00
|
|
|
#include "shared/test/common/helpers/unit_test_helper.h"
|
2023-02-09 11:28:14 +00:00
|
|
|
#include "shared/test/common/test_macros/hw_test.h"
|
2022-08-09 14:26:49 +00:00
|
|
|
#include "shared/test/unit_test/fixtures/command_container_fixture.h"
|
2020-02-24 10:22:30 +01:00
|
|
|
|
2020-01-24 14:58:15 +01:00
|
|
|
using namespace NEO;
|
|
|
|
|
|
2022-08-11 14:01:11 +00:00
|
|
|
using CommandEncodeAtomic = Test<CommandEncodeStatesFixture>;
|
2020-01-24 14:58:15 +01:00
|
|
|
|
2020-10-01 21:08:46 +02:00
|
|
|
HWTEST_F(CommandEncodeAtomic, WhenProgrammingMiAtomicThenExpectAllFieldsSetCorrectly) {
|
2020-01-24 14:58:15 +01:00
|
|
|
using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
|
2020-10-01 21:08:46 +02:00
|
|
|
using ATOMIC_OPCODES = typename FamilyType::MI_ATOMIC::ATOMIC_OPCODES;
|
|
|
|
|
using DATA_SIZE = typename FamilyType::MI_ATOMIC::DATA_SIZE;
|
2020-01-24 14:58:15 +01:00
|
|
|
|
2020-10-01 21:08:46 +02:00
|
|
|
constexpr size_t bufferSize = 128u;
|
|
|
|
|
uint8_t buffer[bufferSize];
|
2021-03-04 17:54:14 +00:00
|
|
|
uint64_t address = static_cast<uint64_t>(0x123400);
|
2020-10-01 21:08:46 +02:00
|
|
|
LinearStream cmdbuffer(buffer, bufferSize);
|
|
|
|
|
|
|
|
|
|
EncodeAtomic<FamilyType>::programMiAtomic(cmdbuffer,
|
2021-03-04 17:54:14 +00:00
|
|
|
address,
|
2020-10-01 21:08:46 +02:00
|
|
|
ATOMIC_OPCODES::ATOMIC_4B_DECREMENT,
|
|
|
|
|
DATA_SIZE::DATA_SIZE_DWORD,
|
|
|
|
|
0x1u,
|
2021-03-04 17:54:14 +00:00
|
|
|
0x1u,
|
|
|
|
|
0x0u,
|
|
|
|
|
0x0u);
|
2020-10-01 21:08:46 +02:00
|
|
|
|
|
|
|
|
MI_ATOMIC *miAtomicCmd = reinterpret_cast<MI_ATOMIC *>(cmdbuffer.getCpuBase());
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_4B_DECREMENT, miAtomicCmd->getAtomicOpcode());
|
|
|
|
|
EXPECT_EQ(DATA_SIZE::DATA_SIZE_DWORD, miAtomicCmd->getDataSize());
|
2021-06-09 10:00:13 +00:00
|
|
|
EXPECT_EQ(address, UnitTestHelper<FamilyType>::getAtomicMemoryAddress(*miAtomicCmd));
|
2020-10-01 21:08:46 +02:00
|
|
|
EXPECT_EQ(0x1u, miAtomicCmd->getReturnDataControl());
|
|
|
|
|
EXPECT_EQ(0x1u, miAtomicCmd->getCsStall());
|
2020-01-24 14:58:15 +01:00
|
|
|
}
|
2021-03-04 17:54:14 +00:00
|
|
|
|
|
|
|
|
HWTEST_F(CommandEncodeAtomic, WhenProgrammingMiAtomicMoveOperationThenExpectInlineDataSet) {
|
|
|
|
|
using MI_ATOMIC = typename FamilyType::MI_ATOMIC;
|
|
|
|
|
using ATOMIC_OPCODES = typename FamilyType::MI_ATOMIC::ATOMIC_OPCODES;
|
|
|
|
|
using DATA_SIZE = typename FamilyType::MI_ATOMIC::DATA_SIZE;
|
|
|
|
|
using DWORD_LENGTH = typename FamilyType::MI_ATOMIC::DWORD_LENGTH;
|
|
|
|
|
|
2024-05-21 14:14:07 +00:00
|
|
|
constexpr size_t bufferSize = sizeof(MI_ATOMIC) * 4;
|
2021-03-04 17:54:14 +00:00
|
|
|
uint8_t buffer[bufferSize];
|
|
|
|
|
uint64_t address = (static_cast<uint64_t>(3) << 32) + 0x123400;
|
|
|
|
|
LinearStream cmdbuffer(buffer, bufferSize);
|
|
|
|
|
|
2024-03-27 16:03:11 +00:00
|
|
|
constexpr uint32_t operand1DataLow = 0x10u;
|
|
|
|
|
constexpr uint32_t operand1DataHigh = 0x20u;
|
|
|
|
|
constexpr uint64_t operand1Data = (static_cast<uint64_t>(operand1DataHigh) << 32) | operand1DataLow;
|
|
|
|
|
|
|
|
|
|
constexpr uint32_t operand2DataLow = 0x1fu;
|
|
|
|
|
constexpr uint32_t operand2DataHigh = 0x2fu;
|
|
|
|
|
constexpr uint64_t operand2Data = (static_cast<uint64_t>(operand2DataHigh) << 32) | operand2DataLow;
|
|
|
|
|
|
2021-03-04 17:54:14 +00:00
|
|
|
EncodeAtomic<FamilyType>::programMiAtomic(cmdbuffer,
|
|
|
|
|
address,
|
|
|
|
|
ATOMIC_OPCODES::ATOMIC_4B_MOVE,
|
|
|
|
|
DATA_SIZE::DATA_SIZE_DWORD,
|
|
|
|
|
0x0u,
|
|
|
|
|
0x0u,
|
2024-03-27 16:03:11 +00:00
|
|
|
operand1Data,
|
|
|
|
|
operand2Data);
|
2021-03-04 17:54:14 +00:00
|
|
|
|
|
|
|
|
EncodeAtomic<FamilyType>::programMiAtomic(cmdbuffer,
|
|
|
|
|
address,
|
|
|
|
|
ATOMIC_OPCODES::ATOMIC_8B_MOVE,
|
|
|
|
|
DATA_SIZE::DATA_SIZE_QWORD,
|
|
|
|
|
0x0u,
|
|
|
|
|
0x0u,
|
2024-03-27 16:03:11 +00:00
|
|
|
operand1Data,
|
|
|
|
|
operand2Data);
|
|
|
|
|
|
|
|
|
|
EncodeAtomic<FamilyType>::programMiAtomic(cmdbuffer,
|
|
|
|
|
address,
|
|
|
|
|
ATOMIC_OPCODES::ATOMIC_8B_CMP_WR,
|
|
|
|
|
DATA_SIZE::DATA_SIZE_QWORD,
|
|
|
|
|
0x0u,
|
|
|
|
|
0x0u,
|
|
|
|
|
operand1Data,
|
|
|
|
|
operand2Data);
|
2021-03-04 17:54:14 +00:00
|
|
|
|
2024-05-21 14:14:07 +00:00
|
|
|
EncodeAtomic<FamilyType>::programMiAtomic(cmdbuffer,
|
|
|
|
|
address,
|
|
|
|
|
ATOMIC_OPCODES::ATOMIC_8B_ADD,
|
|
|
|
|
DATA_SIZE::DATA_SIZE_QWORD,
|
|
|
|
|
0x0u,
|
|
|
|
|
0x0u,
|
|
|
|
|
operand1Data,
|
|
|
|
|
operand2Data);
|
|
|
|
|
|
2021-03-04 17:54:14 +00:00
|
|
|
MI_ATOMIC *miAtomicCmd = reinterpret_cast<MI_ATOMIC *>(cmdbuffer.getCpuBase());
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_4B_MOVE, miAtomicCmd->getAtomicOpcode());
|
|
|
|
|
EXPECT_EQ(DATA_SIZE::DATA_SIZE_DWORD, miAtomicCmd->getDataSize());
|
2021-06-09 10:00:13 +00:00
|
|
|
EXPECT_EQ(address, UnitTestHelper<FamilyType>::getAtomicMemoryAddress(*miAtomicCmd));
|
2021-03-04 17:54:14 +00:00
|
|
|
EXPECT_EQ(0x0u, miAtomicCmd->getReturnDataControl());
|
|
|
|
|
EXPECT_EQ(DWORD_LENGTH::DWORD_LENGTH_INLINE_DATA_1, miAtomicCmd->getDwordLength());
|
|
|
|
|
EXPECT_EQ(0x1u, miAtomicCmd->getInlineData());
|
2024-03-27 16:03:11 +00:00
|
|
|
EXPECT_EQ(operand1DataLow, miAtomicCmd->getOperand1DataDword0());
|
|
|
|
|
EXPECT_EQ(operand1DataHigh, miAtomicCmd->getOperand1DataDword1());
|
|
|
|
|
EXPECT_EQ(operand2DataLow, miAtomicCmd->getOperand2DataDword0());
|
|
|
|
|
EXPECT_EQ(operand2DataHigh, miAtomicCmd->getOperand2DataDword1());
|
2021-03-04 17:54:14 +00:00
|
|
|
|
|
|
|
|
miAtomicCmd++;
|
|
|
|
|
EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_8B_MOVE, miAtomicCmd->getAtomicOpcode());
|
|
|
|
|
EXPECT_EQ(DATA_SIZE::DATA_SIZE_QWORD, miAtomicCmd->getDataSize());
|
2021-06-09 10:00:13 +00:00
|
|
|
EXPECT_EQ(address, UnitTestHelper<FamilyType>::getAtomicMemoryAddress(*miAtomicCmd));
|
2021-03-04 17:54:14 +00:00
|
|
|
EXPECT_EQ(0x0u, miAtomicCmd->getReturnDataControl());
|
|
|
|
|
EXPECT_EQ(DWORD_LENGTH::DWORD_LENGTH_INLINE_DATA_1, miAtomicCmd->getDwordLength());
|
|
|
|
|
EXPECT_EQ(0x1u, miAtomicCmd->getInlineData());
|
2024-03-27 16:03:11 +00:00
|
|
|
EXPECT_EQ(operand1DataLow, miAtomicCmd->getOperand1DataDword0());
|
|
|
|
|
EXPECT_EQ(operand1DataHigh, miAtomicCmd->getOperand1DataDword1());
|
|
|
|
|
EXPECT_EQ(operand2DataLow, miAtomicCmd->getOperand2DataDword0());
|
|
|
|
|
EXPECT_EQ(operand2DataHigh, miAtomicCmd->getOperand2DataDword1());
|
|
|
|
|
|
|
|
|
|
miAtomicCmd++;
|
|
|
|
|
EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_8B_CMP_WR, miAtomicCmd->getAtomicOpcode());
|
|
|
|
|
EXPECT_EQ(DATA_SIZE::DATA_SIZE_QWORD, miAtomicCmd->getDataSize());
|
|
|
|
|
EXPECT_EQ(address, UnitTestHelper<FamilyType>::getAtomicMemoryAddress(*miAtomicCmd));
|
|
|
|
|
EXPECT_EQ(0x0u, miAtomicCmd->getReturnDataControl());
|
|
|
|
|
EXPECT_EQ(DWORD_LENGTH::DWORD_LENGTH_INLINE_DATA_1, miAtomicCmd->getDwordLength());
|
|
|
|
|
EXPECT_EQ(0x1u, miAtomicCmd->getInlineData());
|
|
|
|
|
EXPECT_EQ(operand1DataLow, miAtomicCmd->getOperand1DataDword0());
|
|
|
|
|
EXPECT_EQ(operand1DataHigh, miAtomicCmd->getOperand1DataDword1());
|
|
|
|
|
EXPECT_EQ(operand2DataLow, miAtomicCmd->getOperand2DataDword0());
|
|
|
|
|
EXPECT_EQ(operand2DataHigh, miAtomicCmd->getOperand2DataDword1());
|
2024-05-21 14:14:07 +00:00
|
|
|
|
|
|
|
|
miAtomicCmd++;
|
|
|
|
|
EXPECT_EQ(ATOMIC_OPCODES::ATOMIC_8B_ADD, miAtomicCmd->getAtomicOpcode());
|
|
|
|
|
EXPECT_EQ(DATA_SIZE::DATA_SIZE_QWORD, miAtomicCmd->getDataSize());
|
|
|
|
|
EXPECT_EQ(address, UnitTestHelper<FamilyType>::getAtomicMemoryAddress(*miAtomicCmd));
|
|
|
|
|
EXPECT_EQ(0x0u, miAtomicCmd->getReturnDataControl());
|
|
|
|
|
EXPECT_EQ(DWORD_LENGTH::DWORD_LENGTH_INLINE_DATA_1, miAtomicCmd->getDwordLength());
|
|
|
|
|
EXPECT_EQ(0x1u, miAtomicCmd->getInlineData());
|
|
|
|
|
EXPECT_EQ(operand1DataLow, miAtomicCmd->getOperand1DataDword0());
|
|
|
|
|
EXPECT_EQ(operand1DataHigh, miAtomicCmd->getOperand1DataDword1());
|
|
|
|
|
EXPECT_EQ(operand2DataLow, miAtomicCmd->getOperand2DataDword0());
|
|
|
|
|
EXPECT_EQ(operand2DataHigh, miAtomicCmd->getOperand2DataDword1());
|
2021-03-04 17:54:14 +00:00
|
|
|
}
|