blob: 4edec66a2c83dc39e1e972ac72ed4341bf74cd36 [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 "helper/platform_device_helper.h"
#include "platform_bus_mapper.h"
#include "gtest/gtest.h"
#include <vector>
class TestPlatformBusMapper {
public:
static void Basic(magma::PlatformBusMapper* mapper, uint32_t page_count)
{
std::unique_ptr<magma::PlatformBuffer> buffer =
magma::PlatformBuffer::Create(page_count * PAGE_SIZE, "test");
std::unique_ptr<magma::PlatformBusMapper::BusMapping> bus_mapping;
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, 0);
EXPECT_FALSE(bus_mapping);
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, page_count + 1);
EXPECT_FALSE(bus_mapping);
// Map each page individually, and release.
for (uint32_t i = 0; i < page_count; i++) {
bus_mapping = mapper->MapPageRangeBus(buffer.get(), i, 1);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(1u, bus_mapping->page_count());
EXPECT_EQ(i, bus_mapping->page_offset());
}
// Map the full range.
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, page_count);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(page_count, bus_mapping->page_count());
EXPECT_EQ(0u, bus_mapping->page_offset());
}
static void Overlapped(magma::PlatformBusMapper* mapper, uint32_t page_count)
{
std::unique_ptr<magma::PlatformBuffer> buffer =
magma::PlatformBuffer::Create(page_count * PAGE_SIZE, "test");
std::vector<std::unique_ptr<magma::PlatformBusMapper::BusMapping>> mappings;
for (uint32_t i = 0; i < 3; i++) { // A few times
auto bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, 1);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(0u, bus_mapping->page_offset());
EXPECT_EQ(1u, bus_mapping->page_count());
mappings.push_back(std::move(bus_mapping));
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, 1);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(0u, bus_mapping->page_offset());
EXPECT_EQ(1u, bus_mapping->page_count());
mappings.push_back(std::move(bus_mapping));
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, page_count / 2);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(0u, bus_mapping->page_offset());
EXPECT_EQ(page_count / 2, bus_mapping->page_count());
mappings.push_back(std::move(bus_mapping));
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 0, page_count);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(0u, bus_mapping->page_offset());
EXPECT_EQ(page_count, bus_mapping->page_count());
mappings.push_back(std::move(bus_mapping));
bus_mapping = mapper->MapPageRangeBus(buffer.get(), 1, page_count - 1);
ASSERT_TRUE(bus_mapping);
EXPECT_EQ(1u, bus_mapping->page_offset());
EXPECT_EQ(page_count - 1, bus_mapping->page_count());
mappings.push_back(std::move(bus_mapping));
mappings.clear();
}
}
};
TEST(PlatformPciDevice, BusMapperBasic)
{
magma::PlatformPciDevice* platform_device = TestPlatformPciDevice::GetInstance();
ASSERT_TRUE(platform_device);
auto mapper = magma::PlatformBusMapper::Create(platform_device->GetBusTransactionInitiator());
ASSERT_TRUE(mapper);
TestPlatformBusMapper::Basic(mapper.get(), 1);
TestPlatformBusMapper::Basic(mapper.get(), 2);
TestPlatformBusMapper::Basic(mapper.get(), 10);
}
TEST(PlatformPciDevice, BusMapperOverlapped)
{
magma::PlatformPciDevice* platform_device = TestPlatformPciDevice::GetInstance();
ASSERT_TRUE(platform_device);
auto mapper = magma::PlatformBusMapper::Create(platform_device->GetBusTransactionInitiator());
ASSERT_TRUE(mapper);
TestPlatformBusMapper::Overlapped(mapper.get(), 12);
}
TEST(PlatformDevice, BusMapperBasic)
{
magma::PlatformDevice* platform_device = TestPlatformDevice::GetInstance();
ASSERT_TRUE(platform_device);
auto mapper = magma::PlatformBusMapper::Create(platform_device->GetBusTransactionInitiator());
ASSERT_TRUE(mapper);
TestPlatformBusMapper::Basic(mapper.get(), 1);
TestPlatformBusMapper::Basic(mapper.get(), 2);
TestPlatformBusMapper::Basic(mapper.get(), 10);
}
TEST(PlatformDevice, BusMapperOverlapped)
{
magma::PlatformDevice* platform_device = TestPlatformDevice::GetInstance();
ASSERT_TRUE(platform_device);
auto mapper = magma::PlatformBusMapper::Create(platform_device->GetBusTransactionInitiator());
ASSERT_TRUE(mapper);
TestPlatformBusMapper::Overlapped(mapper.get(), 12);
}