mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-05 09:09:04 +08:00
Update SLM access offset behavior
Related-To: NEO-5998 Signed-off-by: Matias Cabral <matias.a.cabral@intel.com>
This commit is contained in:
committed by
Compute-Runtime-Automation
parent
3d1dba3d10
commit
4affe9907c
@@ -1282,16 +1282,13 @@ ze_result_t DebugSessionImp::readSLMMemory(EuThread::ThreadId threadId, const ze
|
||||
|
||||
uint64_t offset = desc->address & maxNBitValue(slmAddressSpaceTag);
|
||||
|
||||
// SIP accesses SLM in units of slmSendBytesSize at offset units of the same size
|
||||
uint32_t offsetUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(offset) / slmSendBytesSize));
|
||||
// SIP accesses SLM in units of slmSendBytesSize at offset allignment of slmSendBytesSize
|
||||
uint32_t frontPadding = offset % slmSendBytesSize;
|
||||
uint64_t alignedOffset = offset - frontPadding;
|
||||
uint32_t remainingSlmSendUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(size) / slmSendBytesSize));
|
||||
|
||||
if (frontPadding) {
|
||||
offsetUnits--;
|
||||
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
|
||||
remainingSlmSendUnits++;
|
||||
}
|
||||
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
|
||||
remainingSlmSendUnits++;
|
||||
}
|
||||
|
||||
uint32_t loops = static_cast<uint32_t>(std::ceil(static_cast<float>(remainingSlmSendUnits) / maxUnitsPerLoop));
|
||||
@@ -1300,7 +1297,7 @@ ze_result_t DebugSessionImp::readSLMMemory(EuThread::ThreadId threadId, const ze
|
||||
uint32_t readUnits = 0;
|
||||
uint32_t bytesAlreadyRead = 0;
|
||||
|
||||
sipCommand.offset = offsetUnits;
|
||||
sipCommand.offset = alignedOffset;
|
||||
|
||||
for (uint32_t loop = 0; loop < loops; loop++) {
|
||||
|
||||
@@ -1336,8 +1333,8 @@ ze_result_t DebugSessionImp::readSLMMemory(EuThread::ThreadId threadId, const ze
|
||||
memcpy_s(tmpBuffer.get() + bytesAlreadyRead, readUnits * slmSendBytesSize, sipCommand.buffer, readUnits * slmSendBytesSize);
|
||||
|
||||
remainingSlmSendUnits -= readUnits;
|
||||
sipCommand.offset += readUnits;
|
||||
bytesAlreadyRead += readUnits * slmSendBytesSize;
|
||||
sipCommand.offset += readUnits * slmSendBytesSize;
|
||||
}
|
||||
|
||||
memcpy_s(buffer, size, tmpBuffer.get() + frontPadding, size);
|
||||
@@ -1350,29 +1347,25 @@ ze_result_t DebugSessionImp::writeSLMMemory(EuThread::ThreadId threadId, const z
|
||||
SIP::sip_command sipCommand = {0};
|
||||
|
||||
uint64_t offset = desc->address & maxNBitValue(slmAddressSpaceTag);
|
||||
// SIP accesses SLM in units of slmSendBytesSize at offset units of the same size
|
||||
uint32_t offsetUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(offset) / slmSendBytesSize));
|
||||
// SIP accesses SLM in units of slmSendBytesSize at offset allignment of slmSendBytesSize
|
||||
uint32_t frontPadding = offset % slmSendBytesSize;
|
||||
uint64_t alignedOffset = offset - frontPadding;
|
||||
uint32_t remainingSlmSendUnits = static_cast<uint32_t>(std::ceil(static_cast<float>(size) / slmSendBytesSize));
|
||||
size_t tailPadding = (size % slmSendBytesSize) ? slmSendBytesSize - (size % slmSendBytesSize) : 0;
|
||||
|
||||
if (frontPadding) {
|
||||
offsetUnits--;
|
||||
|
||||
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
|
||||
remainingSlmSendUnits++;
|
||||
}
|
||||
if ((size + frontPadding) > (remainingSlmSendUnits * slmSendBytesSize)) {
|
||||
remainingSlmSendUnits++;
|
||||
}
|
||||
|
||||
std::unique_ptr<char[]> tmpBuffer(new char[remainingSlmSendUnits * slmSendBytesSize]);
|
||||
|
||||
if ((frontPadding || tailPadding)) {
|
||||
|
||||
zet_debug_memory_space_desc_t allignedDesc = *desc;
|
||||
allignedDesc.address = desc->address - frontPadding;
|
||||
size_t allignedSize = remainingSlmSendUnits * slmSendBytesSize;
|
||||
zet_debug_memory_space_desc_t alignedDesc = *desc;
|
||||
alignedDesc.address = desc->address - frontPadding;
|
||||
size_t alignedSize = remainingSlmSendUnits * slmSendBytesSize;
|
||||
|
||||
status = readSLMMemory(threadId, &allignedDesc, allignedSize, tmpBuffer.get());
|
||||
status = readSLMMemory(threadId, &alignedDesc, alignedSize, tmpBuffer.get());
|
||||
if (status != ZE_RESULT_SUCCESS) {
|
||||
return status;
|
||||
}
|
||||
@@ -1390,7 +1383,7 @@ ze_result_t DebugSessionImp::writeSLMMemory(EuThread::ThreadId threadId, const z
|
||||
uint32_t writeUnits = 0;
|
||||
uint32_t bytesAlreadyWritten = 0;
|
||||
|
||||
sipCommand.offset = offsetUnits;
|
||||
sipCommand.offset = alignedOffset;
|
||||
|
||||
for (uint32_t loop = 0; loop < loops; loop++) {
|
||||
|
||||
@@ -1420,8 +1413,8 @@ ze_result_t DebugSessionImp::writeSLMMemory(EuThread::ThreadId threadId, const z
|
||||
}
|
||||
|
||||
remainingSlmSendUnits -= writeUnits;
|
||||
sipCommand.offset += writeUnits;
|
||||
bytesAlreadyWritten += writeUnits * slmSendBytesSize;
|
||||
sipCommand.offset += writeUnits * slmSendBytesSize;
|
||||
}
|
||||
|
||||
return ZE_RESULT_SUCCESS;
|
||||
|
||||
@@ -251,13 +251,12 @@ struct MockDebugSession : public L0::DebugSessionImp {
|
||||
if (!forceSlmCmdNotReady) {
|
||||
if (cmdRegisterAccessCount == 3) { // SIP restores cmd to READY
|
||||
|
||||
uint64_t offset = command.offset * slmSendBytesSize;
|
||||
uint32_t size = command.size * slmSendBytesSize;
|
||||
|
||||
if (cmdResgisterWrittenForSLM == static_cast<uint32_t>(NEO::SipKernel::COMMAND::SLM_READ)) {
|
||||
memcpy_s(command.buffer, size, slMemory + offset, size);
|
||||
memcpy_s(command.buffer, size, slMemory + command.offset, size);
|
||||
} else if (cmdResgisterWrittenForSLM == static_cast<uint32_t>(NEO::SipKernel::COMMAND::SLM_WRITE)) {
|
||||
memcpy_s(slMemory + offset, size, command.buffer, size);
|
||||
memcpy_s(slMemory + command.offset, size, command.buffer, size);
|
||||
cmdRegisterAccessCount = 0;
|
||||
cmdResgisterWrittenForSLM = static_cast<uint32_t>(NEO::SipKernel::COMMAND::RESUME);
|
||||
}
|
||||
@@ -2185,15 +2184,17 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenReadingSLMThenReadis
|
||||
}
|
||||
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
|
||||
|
||||
desc.address = 0x10000005;
|
||||
int offset = 0x05;
|
||||
desc.address = 0x10000000 + offset;
|
||||
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
|
||||
for (i = 0; i < readSize; i++) {
|
||||
EXPECT_EQ(output[i], session->slMemory[i + 0x5]);
|
||||
EXPECT_EQ(output[i], session->slMemory[i + offset]);
|
||||
}
|
||||
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
|
||||
|
||||
desc.address = 0x1000000f;
|
||||
offset = 0x0f;
|
||||
desc.address = 0x10000000 + offset;
|
||||
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
|
||||
for (i = 0; i < readSize; i++) {
|
||||
@@ -2205,7 +2206,17 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenReadingSLMThenReadis
|
||||
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
|
||||
for (i = 0; i < readSize; i++) {
|
||||
EXPECT_EQ(output[i], session->slMemory[i + 0xf]);
|
||||
EXPECT_EQ(output[i], session->slMemory[i + offset]);
|
||||
}
|
||||
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
|
||||
|
||||
readSize = 230;
|
||||
offset = 0x0a;
|
||||
desc.address = 0x10000000 + offset;
|
||||
retVal = session->readSLMMemory(thread0, &desc, readSize, output);
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
|
||||
for (i = 0; i < readSize; i++) {
|
||||
EXPECT_EQ(output[i], session->slMemory[i + offset]);
|
||||
}
|
||||
memset(output, 0, EXCHANGE_BUFFER_SIZE * 3);
|
||||
|
||||
@@ -2305,8 +2316,8 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenWritingSLMThenWrites
|
||||
|
||||
session->skipWriteResumeCommand = false;
|
||||
|
||||
char input1[EXCHANGE_BUFFER_SIZE * 2];
|
||||
memset(input1, 0xff, EXCHANGE_BUFFER_SIZE * 2);
|
||||
char input1[EXCHANGE_BUFFER_SIZE * 3];
|
||||
memset(input1, 0xff, EXCHANGE_BUFFER_SIZE * 3);
|
||||
|
||||
int inputSize = 7;
|
||||
|
||||
@@ -2424,6 +2435,26 @@ TEST_F(DebugSessionRegistersAccessTest, GivenSipVersion2WhenWritingSLMThenWrites
|
||||
session->slMemory[i] = i & 127;
|
||||
}
|
||||
|
||||
inputSize = 230;
|
||||
offset = 0x0a;
|
||||
desc.address = 0x10000000 + offset;
|
||||
retVal = session->writeSLMMemory(thread0, &desc, inputSize, input1);
|
||||
EXPECT_EQ(ZE_RESULT_SUCCESS, retVal);
|
||||
|
||||
for (i = 0; i < offset; i++) {
|
||||
EXPECT_EQ(session->slMemory[i], i & 127);
|
||||
}
|
||||
for (i = 0; i < inputSize; i++) {
|
||||
EXPECT_EQ(session->slMemory[i + offset], input1[i]);
|
||||
}
|
||||
for (i = offset + inputSize + 1; i < session->slmSize; i++) {
|
||||
EXPECT_EQ(session->slMemory[i], i & 127);
|
||||
}
|
||||
// Restore SLM content
|
||||
for (i = 0; i < session->slmSize; i++) {
|
||||
session->slMemory[i] = i & 127;
|
||||
}
|
||||
|
||||
session->slmTesting = false;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user