mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-30 01:35:20 +08:00
Add new atomic operation
Related-To: NEO-5244 Signed-off-by: Zbigniew Zdanowicz <zbigniew.zdanowicz@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
3a91bcfb9b
commit
8f91fcdd73
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user