blob: 53563bef6e9ad97e10309813f9629aafed919071 [file] [log] [blame]
// Copyright 2018 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 "garnet/drivers/gpu/msd-vsl-gc/src/address_space_base.h"
#include "mock/mock_bus_mapper.h"
#include "gtest/gtest.h"
class TestAddressSpaceBase {
public:
class TestAddressSpace : public AddressSpaceBase {
public:
bool Insert(gpu_addr_t addr, magma::PlatformBusMapper::BusMapping* bus_mapping,
uint64_t page_count) override
{
return true;
}
bool Clear(gpu_addr_t addr, uint64_t page_count) override { return true; }
};
static void AddMapping()
{
MockBusMapper mock_bus_mapper;
auto address_space = std::make_shared<TestAddressSpace>();
auto buffer = std::shared_ptr<MsdVslBuffer>(MsdVslBuffer::Create(PAGE_SIZE, "Test"));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x1000)));
EXPECT_EQ(2u, buffer.use_count());
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x2000)));
EXPECT_EQ(3u, buffer.use_count());
}
static void OverlappedMapping()
{
constexpr uint32_t kPageCount = 2;
MockBusMapper mock_bus_mapper;
auto address_space = std::make_shared<TestAddressSpace>();
auto buffer =
std::shared_ptr<MsdVslBuffer>(MsdVslBuffer::Create(PAGE_SIZE * kPageCount, "Test"));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer,
mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, kPageCount), 0x1000)));
EXPECT_FALSE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer,
mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, kPageCount), 0x0000)));
EXPECT_FALSE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer,
mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, kPageCount), 0x1000)));
EXPECT_FALSE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer,
mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, kPageCount), 0x2000)));
}
static void RemoveMapping()
{
MockBusMapper mock_bus_mapper;
auto address_space = std::make_shared<TestAddressSpace>();
auto buffer = std::shared_ptr<MsdVslBuffer>(MsdVslBuffer::Create(PAGE_SIZE, "Test"));
EXPECT_FALSE(address_space->RemoveMapping(buffer->platform_buffer(), 0x1000));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x1000)));
EXPECT_EQ(2u, buffer.use_count());
EXPECT_TRUE(address_space->RemoveMapping(buffer->platform_buffer(), 0x1000));
EXPECT_EQ(1u, buffer.use_count());
}
static void ReleaseBuffer()
{
MockBusMapper mock_bus_mapper;
auto address_space = std::make_shared<TestAddressSpace>();
auto buffer = std::shared_ptr<MsdVslBuffer>(MsdVslBuffer::Create(PAGE_SIZE, "Test"));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x1000)));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x2000)));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x10000)));
EXPECT_EQ(4u, buffer.use_count());
uint32_t removed_count;
address_space->ReleaseBuffer(buffer->platform_buffer(), &removed_count);
EXPECT_EQ(3u, removed_count);
EXPECT_EQ(1u, buffer.use_count());
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x1000)));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x2000)));
EXPECT_TRUE(address_space->AddMapping(std::make_unique<GpuMapping>(
address_space, buffer, mock_bus_mapper.MapPageRangeBus(buffer->platform_buffer(), 0, 1),
0x10000)));
}
};
TEST(AddressSpaceBaseBase, AddMapping) { TestAddressSpaceBase::AddMapping(); }
TEST(AddressSpaceBaseBase, OverlappedMapping) { TestAddressSpaceBase::OverlappedMapping(); }
TEST(AddressSpaceBaseBase, RemoveMapping) { TestAddressSpaceBase::RemoveMapping(); }
TEST(AddressSpaceBaseBase, ReleaseBuffer) { TestAddressSpaceBase::ReleaseBuffer(); }