blob: b8e9f43b86f5658611b8b375994f561451538d6c [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cache_config.h"
#include "instructions.h"
#include "msd_intel_buffer.h"
#include "registers.h"
#include "gtest/gtest.h"
using namespace registers;
class TestCacheConfig {
public:
class Writer : public InstructionWriter {
public:
Writer(uint32_t* ptr) : ptr_(ptr) {}
void write_dword(uint32_t dword) override { *ptr_++ = dword; }
private:
uint32_t* ptr_;
};
static void Test()
{
const uint64_t expected_size =
(MiLoadDataImmediate::dword_count(CacheConfig::kMemoryObjectControlStateEntries) +
MiLoadDataImmediate::dword_count(CacheConfig::kLncfMemoryObjectControlStateEntries) +
MiNoop::kDwordCount * 2 + MiBatchBufferEnd::kDwordCount) *
sizeof(uint32_t);
EXPECT_EQ(expected_size, CacheConfig::InstructionBytesRequired());
std::shared_ptr<MsdIntelBuffer> buffer = MsdIntelBuffer::Create(PAGE_SIZE, "test");
uint32_t* ptr;
ASSERT_TRUE(buffer->platform_buffer()->MapCpu(reinterpret_cast<void**>(&ptr)));
Writer writer(ptr);
EXPECT_TRUE(CacheConfig::InitCacheConfig(&writer, RENDER_COMMAND_STREAMER));
constexpr uint32_t kMocsLoadRegisterImmediate =
MiLoadDataImmediate::kCommandType |
(CacheConfig::kMemoryObjectControlStateEntries * 2 + 1 - 2);
DLOG("0x%x", ptr[0]);
EXPECT_EQ(kMocsLoadRegisterImmediate, *ptr++);
constexpr uint32_t kMocsUncached =
(MemoryObjectControlState::LRU_0 << MemoryObjectControlState::kLruManagementShift) |
(MemoryObjectControlState::LLC_ELLC << MemoryObjectControlState::kCacheShift) |
(MemoryObjectControlState::UNCACHED << MemoryObjectControlState::kCacheabilityShift);
constexpr uint32_t kMocsPageTable =
(MemoryObjectControlState::LRU_3 << MemoryObjectControlState::kLruManagementShift) |
(MemoryObjectControlState::LLC_ELLC << MemoryObjectControlState::kCacheShift) |
(MemoryObjectControlState::PAGETABLE << MemoryObjectControlState::kCacheabilityShift);
constexpr uint32_t kMocsCached =
(MemoryObjectControlState::LRU_3 << MemoryObjectControlState::kLruManagementShift) |
(MemoryObjectControlState::LLC_ELLC << MemoryObjectControlState::kCacheShift) |
(MemoryObjectControlState::WRITEBACK << MemoryObjectControlState::kCacheabilityShift);
for (uint32_t i = 0; i < CacheConfig::kMemoryObjectControlStateEntries; i++) {
const uint32_t kOffset =
MemoryObjectControlState::kGraphicsOffset + i * sizeof(uint32_t);
DLOG("0x%x: 0x%08x", ptr[0], ptr[1]);
EXPECT_EQ(*ptr++, kOffset);
switch (i) {
case 1:
EXPECT_EQ(*ptr++, kMocsPageTable);
break;
case 2:
EXPECT_EQ(*ptr++, kMocsCached);
break;
case 0:
default:
EXPECT_EQ(*ptr++, kMocsUncached);
}
}
DLOG("0x%x", ptr[0]);
EXPECT_EQ((uint32_t)MiNoop::kCommandType, *ptr++);
constexpr uint32_t kLncfLoadRegisterImmediate =
MiLoadDataImmediate::kCommandType |
(CacheConfig::kLncfMemoryObjectControlStateEntries * 2 + 1 - 2);
DLOG("0x%x", ptr[0]);
EXPECT_EQ(kLncfLoadRegisterImmediate, *ptr++);
constexpr uint32_t kIndexZero = (LncfMemoryObjectControlState::WRITEBACK
<< LncfMemoryObjectControlState::kCacheabilityShift)
<< 16 |
(LncfMemoryObjectControlState::UNCACHED
<< LncfMemoryObjectControlState::kCacheabilityShift);
constexpr uint32_t kIndexOne = (LncfMemoryObjectControlState::UNCACHED
<< LncfMemoryObjectControlState::kCacheabilityShift)
<< 16 |
(LncfMemoryObjectControlState::WRITEBACK
<< LncfMemoryObjectControlState::kCacheabilityShift);
constexpr uint32_t kIndexOther = (LncfMemoryObjectControlState::UNCACHED
<< LncfMemoryObjectControlState::kCacheabilityShift)
<< 16 |
(LncfMemoryObjectControlState::UNCACHED
<< LncfMemoryObjectControlState::kCacheabilityShift);
for (uint32_t i = 0; i < CacheConfig::kLncfMemoryObjectControlStateEntries; i++) {
const uint32_t kOffset = LncfMemoryObjectControlState::kOffset + i * sizeof(uint32_t);
DLOG("0x%x: 0x%08x", ptr[0], ptr[1]);
EXPECT_EQ(*ptr++, kOffset);
switch (i) {
case 0:
EXPECT_EQ(*ptr++, kIndexZero);
break;
case 1:
EXPECT_EQ(*ptr++, kIndexOne);
break;
default:
EXPECT_EQ(*ptr++, kIndexOther);
}
}
DLOG("0x%x", ptr[0]);
EXPECT_EQ((uint32_t)MiNoop::kCommandType, *ptr++);
}
};
TEST(CacheConfig, Test) { TestCacheConfig::Test(); }