Update SLM access offset behavior

Related-To: NEO-5998

Signed-off-by: Matias Cabral <matias.a.cabral@intel.com>
This commit is contained in:
Matias Cabral
2022-10-14 15:38:58 +00:00
committed by Compute-Runtime-Automation
parent 3d1dba3d10
commit 4affe9907c
2 changed files with 56 additions and 32 deletions

View File

@@ -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;

View File

@@ -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;
}