fix: make misaligned user memory 2-Way coherent

Related-To: NEO-9004

Signed-off-by: Szymon Morek <szymon.morek@intel.com>
This commit is contained in:
Szymon Morek
2025-03-20 10:00:35 +00:00
committed by Compute-Runtime-Automation
parent 52ad8f44c8
commit bb10290828
17 changed files with 93 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2024 Intel Corporation
* Copyright (C) 2018-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -48,6 +48,10 @@ uint32_t MockGmmClientContextBase::cachePolicyGetPATIndex(GMM_RESOURCE_INFO *gmm
return MockPatIndex::uncached;
}
if (usage == GMM_RESOURCE_USAGE_HW_CONTEXT) {
return MockPatIndex::TwoWayCoherent;
}
return MockPatIndex::cached;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2024 Intel Corporation
* Copyright (C) 2018-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -14,6 +14,7 @@ class MockGmmClientContextBase : public GmmClientContext {
struct MockPatIndex {
static constexpr uint32_t uncached = 1;
static constexpr uint32_t cached = 2;
static constexpr uint32_t TwoWayCoherent = 3;
static constexpr uint32_t error = GMM_PAT_ERROR;
};

View File

@@ -3803,10 +3803,7 @@ TEST_F(DrmMemoryManagerBasic, givenSpecificAddressSpaceWhenInitializingMemoryMan
EXPECT_EQ(maxNBitValue(48 - 1), limit);
}
TEST_F(DrmMemoryManagerBasic, givenDisabledHostPtrTrackingWhenAllocateGraphicsMemoryForNonSvmHostPtrIsCalledWithNotAlignedPtrIsPassedThenAllocationIsCreated) {
DebugManagerStateRestore restore;
debugManager.flags.EnableHostPtrTracking.set(false);
TEST_F(DrmMemoryManagerBasic, givenUnalignedHostPtrWhenAllocateGraphicsMemoryThenSetCorrectPatIndex) {
AllocationData allocationData;
std::unique_ptr<TestedDrmMemoryManager> memoryManager(new (std::nothrow) TestedDrmMemoryManager(false, false, false, executionEnvironment));
@@ -3815,12 +3812,39 @@ TEST_F(DrmMemoryManagerBasic, givenDisabledHostPtrTrackingWhenAllocateGraphicsMe
allocationData.size = 13;
allocationData.hostPtr = reinterpret_cast<const void *>(0x5001);
allocationData.rootDeviceIndex = rootDeviceIndex;
auto allocation = memoryManager->allocateGraphicsMemoryForNonSvmHostPtr(allocationData);
auto allocation = static_cast<DrmAllocation *>(memoryManager->allocateGraphicsMemoryForNonSvmHostPtr(allocationData));
EXPECT_NE(nullptr, allocation);
EXPECT_EQ(0x5001u, reinterpret_cast<uint64_t>(allocation->getUnderlyingBuffer()));
EXPECT_EQ(13u, allocation->getUnderlyingBufferSize());
EXPECT_EQ(1u, allocation->getAllocationOffset());
auto &productHelper = executionEnvironment.rootDeviceEnvironments[0]->getHelper<ProductHelper>();
if (productHelper.isMisalignedUserPtr2WayCoherent()) {
EXPECT_EQ(MockGmmClientContextBase::MockPatIndex::TwoWayCoherent, allocation->getBO()->peekPatIndex());
} else {
EXPECT_EQ(MockGmmClientContextBase::MockPatIndex::cached, allocation->getBO()->peekPatIndex());
}
memoryManager->freeGraphicsMemory(allocation);
}
TEST_F(DrmMemoryManagerBasic, givenAlignedHostPtrWhenAllocateGraphicsMemoryThenSetCorrectPatIndex) {
AllocationData allocationData;
std::unique_ptr<TestedDrmMemoryManager> memoryManager(new (std::nothrow) TestedDrmMemoryManager(false, false, false, executionEnvironment));
memoryManager->forceLimitedRangeAllocator(MemoryConstants::max48BitAddress);
allocationData.size = MemoryConstants::cacheLineSize;
allocationData.hostPtr = reinterpret_cast<const void *>(MemoryConstants::pageSize);
allocationData.rootDeviceIndex = rootDeviceIndex;
auto allocation = static_cast<DrmAllocation *>(memoryManager->allocateGraphicsMemoryForNonSvmHostPtr(allocationData));
EXPECT_NE(nullptr, allocation);
EXPECT_EQ(MemoryConstants::pageSize, reinterpret_cast<uint64_t>(allocation->getUnderlyingBuffer()));
EXPECT_EQ(MemoryConstants::cacheLineSize, allocation->getUnderlyingBufferSize());
EXPECT_EQ(0u, allocation->getAllocationOffset());
EXPECT_EQ(MockGmmClientContextBase::MockPatIndex::cached, allocation->getBO()->peekPatIndex());
memoryManager->freeGraphicsMemory(allocation);
}

View File

@@ -1050,7 +1050,7 @@ TEST_F(WddmMemoryManagerSimpleTest, whenCreateAllocationFromHandleAndMapCallFail
EXPECT_EQ(1u, memoryManager->freeGraphicsMemoryImplCalled);
}
TEST_F(WddmMemoryManagerSimpleTest, givenAllocateGraphicsMemoryForNonSvmHostPtrIsCalledWhenNotAlignedPtrIsPassedThenAlignedGraphicsAllocationIsCreated) {
TEST_F(WddmMemoryManagerSimpleTest, givenAllocateGraphicsMemoryForNonSvmHostPtrIsCalledWhenNotAlignedPtrIsPassedThenAlignedGraphicsAllocationIsCreatedWithCorrectGmmResource) {
memoryManager.reset(new MockWddmMemoryManager(false, false, executionEnvironment));
auto size = 13u;
auto hostPtr = reinterpret_cast<const void *>(0x10001);
@@ -1063,6 +1063,14 @@ TEST_F(WddmMemoryManagerSimpleTest, givenAllocateGraphicsMemoryForNonSvmHostPtrI
EXPECT_EQ(hostPtr, allocation->getUnderlyingBuffer());
EXPECT_EQ(size, allocation->getUnderlyingBufferSize());
EXPECT_EQ(1u, allocation->getAllocationOffset());
const auto &productHelper = rootDeviceEnvironment->getHelper<ProductHelper>();
auto expectedUsage = GMM_RESOURCE_USAGE_OCL_SYSTEM_MEMORY_BUFFER;
if (productHelper.isMisalignedUserPtr2WayCoherent()) {
expectedUsage = GMM_RESOURCE_USAGE_HW_CONTEXT;
}
EXPECT_EQ(expectedUsage, allocation->getGmm(0)->resourceParams.Usage);
memoryManager->freeGraphicsMemory(allocation);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2018-2024 Intel Corporation
* Copyright (C) 2018-2025 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
@@ -62,6 +62,8 @@ struct SkuInfoBaseReference {
refWaTable.WaAuxTable16KGranular = 1;
refWaTable.WaAuxTable64KGranular = 1;
refWaTable.Wa_15010089951 = 1;
refWaTable.Wa_14018976079 = 1;
refWaTable.Wa_14018984349 = 1;
}
static void fillReferenceFtrToReceive(FeatureTable &refFtrTable) {
@@ -149,6 +151,8 @@ struct SkuInfoBaseReference {
refWaTable.flags.waDisableFusedThreadScheduling = true;
refWaTable.flags.waAuxTable64KGranular = true;
refWaTable.flags.wa_15010089951 = true;
refWaTable.flags.wa_14018976079 = true;
refWaTable.flags.wa_14018984349 = true;
}
}; // namespace SkuInfoBaseReference
} // namespace NEO