Add new atomic operation

Related-To: NEO-5244

Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
Zbigniew Zdanowicz
2021-03-04 17:54:14 +00:00
committed by Compute-Runtime-Automation
parent 3a91bcfb9b
commit 8f91fcdd73
13 changed files with 249 additions and 15 deletions

View File

@@ -318,14 +318,21 @@ struct EncodeAtomic {
ATOMIC_OPCODES opcode,
DATA_SIZE dataSize,
uint32_t returnDataControl,
uint32_t csStall);
uint32_t csStall,
uint32_t operand1dword0,
uint32_t operand1dword1);
static void programMiAtomic(MI_ATOMIC *atomic,
uint64_t writeAddress,
ATOMIC_OPCODES opcode,
DATA_SIZE dataSize,
uint32_t returnDataControl,
uint32_t csStall);
uint32_t csStall,
uint32_t operand1dword0,
uint32_t operand1dword1);
static void setMiAtomicAddress(MI_ATOMIC &atomic, uint64_t writeAddress);
static uint64_t getMiAtomicAddress(MI_ATOMIC &atomic);
};
template <typename GfxFamily>

View File

@@ -569,20 +569,40 @@ size_t EncodeSempahore<Family>::getSizeMiSemaphoreWait() {
return sizeof(MI_SEMAPHORE_WAIT);
}
template <typename Family>
void EncodeAtomic<Family>::setMiAtomicAddress(MI_ATOMIC &atomic, uint64_t writeAddress) {
atomic.setMemoryAddress(static_cast<uint32_t>(writeAddress & 0x0000FFFFFFFFULL));
atomic.setMemoryAddressHigh(static_cast<uint32_t>(writeAddress >> 32));
}
template <typename Family>
uint64_t EncodeAtomic<Family>::getMiAtomicAddress(MI_ATOMIC &atomic) {
uint64_t address = (static_cast<uint64_t>(atomic.getMemoryAddressHigh()) << 32) | (atomic.getMemoryAddress());
return address;
}
template <typename Family>
void EncodeAtomic<Family>::programMiAtomic(MI_ATOMIC *atomic,
uint64_t writeAddress,
ATOMIC_OPCODES opcode,
DATA_SIZE dataSize,
uint32_t returnDataControl,
uint32_t csStall) {
uint32_t csStall,
uint32_t operand1dword0,
uint32_t operand1dword1) {
MI_ATOMIC cmd = Family::cmdInitAtomic;
cmd.setAtomicOpcode(opcode);
cmd.setDataSize(dataSize);
cmd.setMemoryAddress(static_cast<uint32_t>(writeAddress & 0x0000FFFFFFFFULL));
cmd.setMemoryAddressHigh(static_cast<uint32_t>(writeAddress >> 32));
EncodeAtomic<Family>::setMiAtomicAddress(cmd, writeAddress);
cmd.setReturnDataControl(returnDataControl);
cmd.setCsStall(csStall);
if (opcode == ATOMIC_OPCODES::ATOMIC_4B_MOVE ||
opcode == ATOMIC_OPCODES::ATOMIC_8B_MOVE) {
cmd.setDwordLength(MI_ATOMIC::DWORD_LENGTH::DWORD_LENGTH_INLINE_DATA_1);
cmd.setInlineData(0x1);
cmd.setOperand1DataDword0(operand1dword0);
cmd.setOperand1DataDword1(operand1dword1);
}
*atomic = cmd;
}
@@ -593,9 +613,11 @@ void EncodeAtomic<Family>::programMiAtomic(LinearStream &commandStream,
ATOMIC_OPCODES opcode,
DATA_SIZE dataSize,
uint32_t returnDataControl,
uint32_t csStall) {
uint32_t csStall,
uint32_t operand1dword0,
uint32_t operand1dword1) {
auto miAtomic = commandStream.getSpaceForCmd<MI_ATOMIC>();
EncodeAtomic<Family>::programMiAtomic(miAtomic, writeAddress, opcode, dataSize, returnDataControl, csStall);
EncodeAtomic<Family>::programMiAtomic(miAtomic, writeAddress, opcode, dataSize, returnDataControl, csStall, operand1dword0, operand1dword1);
}
template <typename Family>

View File

@@ -870,6 +870,7 @@ typedef struct tagMI_ATOMIC {
ATOMIC_4B_MOVE = 0x4,
ATOMIC_4B_INCREMENT = 0x5,
ATOMIC_4B_DECREMENT = 0x6,
ATOMIC_8B_MOVE = 0x24,
ATOMIC_8B_INCREMENT = 0x25,
ATOMIC_8B_DECREMENT = 0x26,
} ATOMIC_OPCODES;

View File

@@ -907,6 +907,7 @@ typedef struct tagMI_ATOMIC {
ATOMIC_4B_MOVE = 0x4,
ATOMIC_4B_INCREMENT = 0x5,
ATOMIC_4B_DECREMENT = 0x6,
ATOMIC_8B_MOVE = 0x24,
ATOMIC_8B_INCREMENT = 0x25,
ATOMIC_8B_DECREMENT = 0x26,
} ATOMIC_OPCODES;

View File

@@ -1008,6 +1008,7 @@ typedef struct tagMI_ATOMIC {
ATOMIC_4B_MOVE = 0x4,
ATOMIC_4B_INCREMENT = 0x5,
ATOMIC_4B_DECREMENT = 0x6,
ATOMIC_8B_MOVE = 0x24,
ATOMIC_8B_INCREMENT = 0x25,
ATOMIC_8B_DECREMENT = 0x26,
} ATOMIC_OPCODES;

View File

@@ -1005,6 +1005,7 @@ typedef struct tagMI_ATOMIC {
ATOMIC_4B_MOVE = 0x4,
ATOMIC_4B_INCREMENT = 0x5,
ATOMIC_4B_DECREMENT = 0x6,
ATOMIC_8B_MOVE = 0x24,
ATOMIC_8B_INCREMENT = 0x25,
ATOMIC_8B_DECREMENT = 0x26,
} ATOMIC_OPCODES;

View File

@@ -178,7 +178,7 @@ struct TimestampPacketHelper {
EncodeAtomic<GfxFamily>::programMiAtomic(cmdStream, dependenciesCountAddress,
MI_ATOMIC::ATOMIC_OPCODES::ATOMIC_4B_INCREMENT,
MI_ATOMIC::DATA_SIZE::DATA_SIZE_DWORD,
0u, 0u);
0u, 0u, 0x0u, 0x0u);
}
}