mirror of
https://github.com/intel/compute-runtime.git
synced 2026-01-06 10:26:29 +08:00
AUB CSR: Ensured PTE bits be set correctly for Global GTT
This commit fixes the issue with setting reserved bits in PTE for GGTT. Change-Id: I08582e20914419a3363c9e61085dcf03ba355a61
This commit is contained in:
committed by
sys_ocldev
parent
3e65a39c62
commit
fb10f666e9
@@ -25,6 +25,5 @@
|
|||||||
|
|
||||||
struct AubGTTData {
|
struct AubGTTData {
|
||||||
bool present;
|
bool present;
|
||||||
bool writable;
|
bool localMemory;
|
||||||
bool userSupervisor;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -79,7 +79,18 @@ union IAPageTableEntry {
|
|||||||
uint64_t uiData;
|
uint64_t uiData;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef IAPageTableEntry MiGttEntry;
|
union MiGttEntry {
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint64_t Present : 1; //[0]
|
||||||
|
uint64_t LocalMemory : 1; //[1]
|
||||||
|
uint64_t FunctionNumber : 10; //[11:2]
|
||||||
|
uint64_t PhysicalAddress : 35; //[46:12]
|
||||||
|
uint64_t Ignored : 17; //[63:47]
|
||||||
|
} pageConfig;
|
||||||
|
uint32_t dwordData[2];
|
||||||
|
uint64_t uiData;
|
||||||
|
};
|
||||||
|
|
||||||
// Use the latest DeviceValues enumerations available
|
// Use the latest DeviceValues enumerations available
|
||||||
typedef CmdServicesMemTraceVersion::DeviceValues DeviceValues;
|
typedef CmdServicesMemTraceVersion::DeviceValues DeviceValues;
|
||||||
@@ -282,7 +293,7 @@ struct AubDump : public TypeSelector<AubPageTableHelper32<TraitsIn>, AubPageTabl
|
|||||||
static uint64_t reserveAddressGGTT(Stream &stream, uint32_t addr, size_t size, uint64_t physStart, AubGTTData data);
|
static uint64_t reserveAddressGGTT(Stream &stream, uint32_t addr, size_t size, uint64_t physStart, AubGTTData data);
|
||||||
static uint64_t reserveAddressGGTT(Stream &stream, const void *memory, size_t size, uint64_t physStart, AubGTTData data);
|
static uint64_t reserveAddressGGTT(Stream &stream, const void *memory, size_t size, uint64_t physStart, AubGTTData data);
|
||||||
static void reserveAddressGGTTAndWriteMmeory(Stream &stream, uintptr_t gfxAddress, const void *memory, uint64_t physAddress, size_t size, size_t offset, uint64_t additionalBits);
|
static void reserveAddressGGTTAndWriteMmeory(Stream &stream, uintptr_t gfxAddress, const void *memory, uint64_t physAddress, size_t size, size_t offset, uint64_t additionalBits);
|
||||||
static void setGttEntry(IAPageTableEntry &entry, uint64_t address, AubGTTData data);
|
static void setGttEntry(MiGttEntry &entry, uint64_t address, AubGTTData data);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static uint64_t reserveAddress(Stream &stream, uint32_t addr, size_t size, unsigned int addressSpace /* = AddressSpaceValues::TraceGttEntry*/, uint64_t physStart, AubGTTData data);
|
static uint64_t reserveAddress(Stream &stream, uint32_t addr, size_t size, unsigned int addressSpace /* = AddressSpaceValues::TraceGttEntry*/, uint64_t physStart, AubGTTData data);
|
||||||
|
|||||||
@@ -141,12 +141,11 @@ void AubDump<Traits>::reserveAddressGGTTAndWriteMmeory(typename Traits::Stream &
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Traits>
|
template <typename Traits>
|
||||||
void AubDump<Traits>::setGttEntry(IAPageTableEntry &entry, uint64_t address, AubGTTData data) {
|
void AubDump<Traits>::setGttEntry(MiGttEntry &entry, uint64_t address, AubGTTData data) {
|
||||||
entry.uiData = 0;
|
entry.uiData = 0;
|
||||||
entry.pageConfig.PhysicalAddress = address / 4096;
|
entry.pageConfig.PhysicalAddress = address / 4096;
|
||||||
entry.pageConfig.Present = data.present;
|
entry.pageConfig.Present = data.present;
|
||||||
entry.pageConfig.Writable = data.writable;
|
entry.pageConfig.LocalMemory = data.localMemory;
|
||||||
entry.pageConfig.UserSupervisor = data.userSupervisor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Traits>
|
template <typename Traits>
|
||||||
|
|||||||
@@ -627,8 +627,7 @@ uint64_t AUBCommandStreamReceiverHw<GfxFamily>::getPPGTTAdditionalBits(GraphicsA
|
|||||||
template <typename GfxFamily>
|
template <typename GfxFamily>
|
||||||
void AUBCommandStreamReceiverHw<GfxFamily>::getGTTData(void *memory, AubGTTData &data) {
|
void AUBCommandStreamReceiverHw<GfxFamily>::getGTTData(void *memory, AubGTTData &data) {
|
||||||
data.present = true;
|
data.present = true;
|
||||||
data.writable = true;
|
data.localMemory = false;
|
||||||
data.userSupervisor = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace OCLRT
|
} // namespace OCLRT
|
||||||
|
|||||||
@@ -395,7 +395,6 @@ uint64_t TbxCommandStreamReceiverHw<GfxFamily>::getPPGTTAdditionalBits(GraphicsA
|
|||||||
template <typename GfxFamily>
|
template <typename GfxFamily>
|
||||||
void TbxCommandStreamReceiverHw<GfxFamily>::getGTTData(void *memory, AubGTTData &data) {
|
void TbxCommandStreamReceiverHw<GfxFamily>::getGTTData(void *memory, AubGTTData &data) {
|
||||||
data.present = true;
|
data.present = true;
|
||||||
data.writable = true;
|
data.localMemory = false;
|
||||||
data.userSupervisor = true;
|
|
||||||
}
|
}
|
||||||
} // namespace OCLRT
|
} // namespace OCLRT
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ HWTEST_F(AubMemDumpTests, writeVerifyOneByteGGTT) {
|
|||||||
|
|
||||||
uint8_t byte = 0xbf;
|
uint8_t byte = 0xbf;
|
||||||
uint64_t physAddress = reinterpret_cast<uint64_t>(&byte) & 0xFFFFFFFF;
|
uint64_t physAddress = reinterpret_cast<uint64_t>(&byte) & 0xFFFFFFFF;
|
||||||
AubGTTData data = {true, true, true};
|
AubGTTData data = {true, false};
|
||||||
AUB::reserveAddressGGTT(aubFile, &byte, sizeof(byte), physAddress, data);
|
AUB::reserveAddressGGTT(aubFile, &byte, sizeof(byte), physAddress, data);
|
||||||
AUB::addMemoryWrite(aubFile, physAddress, &byte, sizeof(byte), AubMemDump::AddressSpaceValues::TraceNonlocal);
|
AUB::addMemoryWrite(aubFile, physAddress, &byte, sizeof(byte), AubMemDump::AddressSpaceValues::TraceNonlocal);
|
||||||
aubFile.expectMemory(physAddress, &byte, sizeof(byte));
|
aubFile.expectMemory(physAddress, &byte, sizeof(byte));
|
||||||
@@ -153,7 +153,7 @@ HWTEST_F(AubMemDumpTests, writeVerifySevenBytesGGTT) {
|
|||||||
|
|
||||||
uint8_t bytes[] = {0, 1, 2, 3, 4, 5, 6};
|
uint8_t bytes[] = {0, 1, 2, 3, 4, 5, 6};
|
||||||
uint64_t physAddress = reinterpret_cast<uint64_t>(bytes) & 0xFFFFFFFF;
|
uint64_t physAddress = reinterpret_cast<uint64_t>(bytes) & 0xFFFFFFFF;
|
||||||
AubGTTData data = {true, true, true};
|
AubGTTData data = {true, false};
|
||||||
AUB::reserveAddressGGTT(aubFile, bytes, sizeof(bytes), physAddress, data);
|
AUB::reserveAddressGGTT(aubFile, bytes, sizeof(bytes), physAddress, data);
|
||||||
AUB::addMemoryWrite(aubFile, physAddress, bytes, sizeof(bytes), AubMemDump::AddressSpaceValues::TraceNonlocal);
|
AUB::addMemoryWrite(aubFile, physAddress, bytes, sizeof(bytes), AubMemDump::AddressSpaceValues::TraceNonlocal);
|
||||||
aubFile.expectMemory(physAddress, bytes, sizeof(bytes));
|
aubFile.expectMemory(physAddress, bytes, sizeof(bytes));
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ void setupAUB(const OCLRT::Device *pDevice, OCLRT::EngineType engineType) {
|
|||||||
auto pGlobalHWStatusPage = alignedMalloc(sizeHWSP, alignHWSP);
|
auto pGlobalHWStatusPage = alignedMalloc(sizeHWSP, alignHWSP);
|
||||||
|
|
||||||
uint32_t ggttGlobalHardwareStatusPage = (uint32_t)((uintptr_t)pGlobalHWStatusPage);
|
uint32_t ggttGlobalHardwareStatusPage = (uint32_t)((uintptr_t)pGlobalHWStatusPage);
|
||||||
AubGTTData data = {true, true, true};
|
AubGTTData data = {true, false};
|
||||||
AUB::reserveAddressGGTT(aubFile, ggttGlobalHardwareStatusPage, sizeHWSP, physAddress, data);
|
AUB::reserveAddressGGTT(aubFile, ggttGlobalHardwareStatusPage, sizeHWSP, physAddress, data);
|
||||||
physAddress += sizeHWSP;
|
physAddress += sizeHWSP;
|
||||||
|
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ void setupAUBWithBatchBuffer(const OCLRT::Device *pDevice, OCLRT::EngineType eng
|
|||||||
auto pGlobalHWStatusPage = alignedMalloc(sizeHWSP, alignHWSP);
|
auto pGlobalHWStatusPage = alignedMalloc(sizeHWSP, alignHWSP);
|
||||||
|
|
||||||
uint32_t ggttGlobalHardwareStatusPage = (uint32_t)((uintptr_t)pGlobalHWStatusPage);
|
uint32_t ggttGlobalHardwareStatusPage = (uint32_t)((uintptr_t)pGlobalHWStatusPage);
|
||||||
AubGTTData data = {true, true, true};
|
AubGTTData data = {true, false};
|
||||||
AUB::reserveAddressGGTT(aubFile, ggttGlobalHardwareStatusPage, sizeHWSP, physAddress, data);
|
AUB::reserveAddressGGTT(aubFile, ggttGlobalHardwareStatusPage, sizeHWSP, physAddress, data);
|
||||||
physAddress += sizeHWSP;
|
physAddress += sizeHWSP;
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "runtime/aub_mem_dump/aub_mem_dump.h"
|
||||||
#include "runtime/command_stream/aub_command_stream_receiver_hw.h"
|
#include "runtime/command_stream/aub_command_stream_receiver_hw.h"
|
||||||
#include "runtime/helpers/dispatch_info.h"
|
#include "runtime/helpers/dispatch_info.h"
|
||||||
#include "runtime/helpers/flat_batch_buffer_helper_hw.h"
|
#include "runtime/helpers/flat_batch_buffer_helper_hw.h"
|
||||||
@@ -1543,6 +1544,28 @@ HWTEST_F(AubCommandStreamReceiverTests, givenDbgDeviceIdFlagIsSetWhenAubCsrIsCre
|
|||||||
EXPECT_EQ(9u, aubCsr->aubDeviceId);
|
EXPECT_EQ(9u, aubCsr->aubDeviceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HWTEST_F(AubCommandStreamReceiverTests, givenAubCommandStreamReceiverWhenGetGTTDataIsCalledThenLocalMemoryShouldBeDisabled) {
|
||||||
|
const HardwareInfo &hwInfoIn = *platformDevices[0];
|
||||||
|
std::unique_ptr<MockAubCsr<FamilyType>> aubCsr(new MockAubCsr<FamilyType>(hwInfoIn, true));
|
||||||
|
AubGTTData data = {};
|
||||||
|
aubCsr->getGTTData(nullptr, data);
|
||||||
|
EXPECT_TRUE(data.present);
|
||||||
|
EXPECT_FALSE(data.localMemory);
|
||||||
|
}
|
||||||
|
|
||||||
|
HWTEST_F(AubCommandStreamReceiverTests, givenPhysicalAddressWhenSetGttEntryIsCalledThenGttEntrysBitFieldsShouldBePopulated) {
|
||||||
|
typedef typename AUBFamilyMapper<FamilyType>::AUB AUB;
|
||||||
|
|
||||||
|
AubMemDump::MiGttEntry entry = {};
|
||||||
|
uint64_t address = 0x0123456789;
|
||||||
|
AubGTTData data = {true, false};
|
||||||
|
AUB::setGttEntry(entry, address, data);
|
||||||
|
|
||||||
|
EXPECT_EQ(entry.pageConfig.PhysicalAddress, address / 4096);
|
||||||
|
EXPECT_TRUE(entry.pageConfig.Present);
|
||||||
|
EXPECT_FALSE(entry.pageConfig.LocalMemory);
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user