Add PhysicalAddressAllocatorHw tests

Signed-off-by: Bartosz Dunajski <bartosz.dunajski@intel.com>
This commit is contained in:
Bartosz Dunajski 2021-06-25 10:39:45 +00:00 committed by Compute-Runtime-Automation
parent bef4ca5cce
commit 67deb0377f
2 changed files with 146 additions and 0 deletions

View File

@ -19,6 +19,7 @@ target_sources(${TARGET_NAME} PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/gfx_partition_tests.inl
${CMAKE_CURRENT_SOURCE_DIR}/page_table_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/physical_address_allocator_tests.cpp
${CMAKE_CURRENT_SOURCE_DIR}/physical_address_allocator_hw_tests.cpp
)
add_subdirectories()

View File

@ -0,0 +1,145 @@
/*
* Copyright (C) 2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/memory_manager/memory_banks.h"
#include "shared/source/memory_manager/physical_address_allocator.h"
#include "shared/test/common/mocks/mock_physical_address_allocator.h"
#include "test.h"
using namespace NEO;
template <typename GfxFamily>
class MockPhysicalAddressAllocatorHw : public PhysicalAddressAllocatorHw<GfxFamily> {
public:
using PhysicalAddressAllocator::initialPageAddress;
using PhysicalAddressAllocator::mainAllocator;
using PhysicalAddressAllocatorHw<GfxFamily>::bankAllocators;
using PhysicalAddressAllocatorHw<GfxFamily>::memoryBankSize;
using PhysicalAddressAllocatorHw<GfxFamily>::numberOfBanks;
using PhysicalAddressAllocatorHw<GfxFamily>::PhysicalAddressAllocatorHw;
MockPhysicalAddressAllocatorHw() : PhysicalAddressAllocatorHw<GfxFamily>(MemoryConstants::gigaByte, 4) {}
};
struct PhysicalAddressAllocatorFixture {
void SetUp() {}
void TearDown() {}
};
typedef Test<PhysicalAddressAllocatorFixture> PhysicalAddressAllocatorHwTest;
HWTEST_F(PhysicalAddressAllocatorHwTest, givenZeroBanksWhenPageInBankIsReservedThenMainAllocatorIsUsed) {
size_t bankSize = 1024 * MemoryConstants::pageSize;
MockPhysicalAddressAllocatorHw<FamilyType> allocator(bankSize, 0);
auto physAddress = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(1));
EXPECT_NE(0u, physAddress);
auto address = allocator.mainAllocator.load();
auto physAddress1 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(1));
EXPECT_NE(0u, physAddress1);
EXPECT_NE(physAddress, physAddress1);
auto address1 = allocator.mainAllocator.load();
EXPECT_NE(address, address1);
}
HWTEST_F(PhysicalAddressAllocatorHwTest, given4BanksWhenAllocatorIsCreatedThen4AllocatorsAreCreated) {
MockPhysicalAddressAllocatorHw<FamilyType> allocator(2 * MemoryConstants::megaByte, 4);
EXPECT_NE(nullptr, allocator.bankAllocators);
EXPECT_EQ(4u, allocator.numberOfBanks);
EXPECT_EQ(2 * MemoryConstants::megaByte, allocator.memoryBankSize);
}
HWTEST_F(PhysicalAddressAllocatorHwTest, given4BanksWhenReservingFirstPageInBanksThenNonZeroAddressIsReturnedAndEachBankAddressIsDifferent) {
MockPhysicalAddressAllocatorHw<FamilyType> allocator(2 * MemoryConstants::megaByte, 4);
auto physAddress0 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(0));
EXPECT_NE(0u, physAddress0);
auto physAddress1 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(1));
EXPECT_NE(0u, physAddress1);
auto physAddress2 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(2));
EXPECT_NE(0u, physAddress2);
auto physAddress3 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(3));
EXPECT_NE(0u, physAddress3);
EXPECT_NE(physAddress0, physAddress1);
EXPECT_NE(physAddress0, physAddress2);
EXPECT_NE(physAddress0, physAddress3);
EXPECT_NE(physAddress1, physAddress2);
EXPECT_NE(physAddress1, physAddress3);
EXPECT_NE(physAddress2, physAddress3);
}
HWTEST_F(PhysicalAddressAllocatorHwTest, given4BanksWhenReservingFirstPageInBanksThenEveryNextBankAddressIsOffsetedByBankSize) {
size_t bankSize = 4 * 1024 * MemoryConstants::pageSize;
MockPhysicalAddressAllocatorHw<FamilyType> allocator(bankSize, 4);
auto physAddress0 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(0));
EXPECT_EQ(0x1000u, physAddress0);
auto physAddress1 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(1));
EXPECT_EQ(bankSize, physAddress1);
auto physAddress2 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(2));
EXPECT_EQ(2 * bankSize, physAddress2);
auto physAddress3 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(3));
EXPECT_EQ(3 * bankSize, physAddress3);
}
HWTEST_F(PhysicalAddressAllocatorHwTest, givenSpecificBankWhenReservingConsecutivePagesThenReturnedAddressesAreDifferent) {
auto bankSize = 4 * 1024 * MemoryConstants::pageSize;
MockPhysicalAddressAllocatorHw<FamilyType> allocator(bankSize, 4);
uint32_t banks[4] = {MemoryBanks::getBankForLocalMemory(0),
MemoryBanks::getBankForLocalMemory(1),
MemoryBanks::getBankForLocalMemory(2),
MemoryBanks::getBankForLocalMemory(3)};
for (uint32_t bankIndex = 0; bankIndex < 4; bankIndex++) {
auto physAddress = allocator.reserve4kPage(banks[bankIndex]);
EXPECT_NE(0u, physAddress);
auto physAddress1 = allocator.reserve4kPage(banks[bankIndex]);
EXPECT_NE(physAddress, physAddress1);
auto physAddress2 = allocator.reserve4kPage(banks[bankIndex]);
EXPECT_NE(physAddress1, physAddress2);
}
}
HWTEST_F(PhysicalAddressAllocatorHwTest, givenSingleBankWhen4kAnd64kPagesAreAllocatedAlternatelyThenCorrectAlignementIsSatisfied) {
size_t bankSize = 4 * 1024 * MemoryConstants::pageSize;
MockPhysicalAddressAllocatorHw<FamilyType> allocator(bankSize, 4);
auto physAddress0 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(0));
EXPECT_NE(0u, physAddress0);
EXPECT_EQ(0u, physAddress0 & MemoryConstants::pageMask);
auto physAddress1 = allocator.reserve64kPage(MemoryBanks::getBankForLocalMemory(0));
EXPECT_NE(0u, physAddress1);
EXPECT_EQ(0u, physAddress1 & MemoryConstants::page64kMask);
auto physAddress2 = allocator.reserve4kPage(MemoryBanks::getBankForLocalMemory(0));
EXPECT_NE(0u, physAddress2);
EXPECT_EQ(0u, physAddress2 & MemoryConstants::pageMask);
auto physAddress3 = allocator.reserve64kPage(MemoryBanks::getBankForLocalMemory(0));
EXPECT_NE(0u, physAddress3);
EXPECT_EQ(0u, physAddress3 & MemoryConstants::page64kMask);
}
TEST(MemoryBank, givenDifferentDeviceOrdinalsWhenGettingBankThenCorrectBanksAreReturned) {
auto bank = MemoryBanks::getBankForLocalMemory(0);
EXPECT_EQ(1u, bank);
bank = MemoryBanks::getBankForLocalMemory(1);
EXPECT_EQ(2u, bank);
bank = MemoryBanks::getBankForLocalMemory(2);
EXPECT_EQ(3u, bank);
bank = MemoryBanks::getBankForLocalMemory(3);
EXPECT_EQ(4u, bank);
}