blob: 0fc57c0b78be41d5612c69e31e077c46087a795e [file] [edit]
// Copyright 2020 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 <lib/dma-buffer/buffer.h>
#include <lib/driver/mmio/cpp/mmio.h>
#include <fake-dma-buffer/fake-dma-buffer.h>
#include <fbl/algorithm.h>
#include <zxtest/zxtest.h>
namespace ddk_fake_test {
const zx::bti kFakeBti(42);
constexpr auto kAlignmentLog2 = 12;
TEST(FakeDmaBuffer, ContiguousBufferMultiPage) {
auto factory = ddk_fake::CreateBufferFactory();
std::unique_ptr<dma_buffer::ContiguousBuffer> buffer;
ASSERT_EQ(factory->CreateContiguous(kFakeBti, zx_system_get_page_size() * 2, 0, true, &buffer),
ZX_ERR_NOT_SUPPORTED);
}
TEST(FakeDmaBuffer, ContiguousBuffer) {
auto factory = ddk_fake::CreateBufferFactory();
std::unique_ptr<dma_buffer::ContiguousBuffer> buffer;
ASSERT_OK(factory->CreateContiguous(kFakeBti, zx_system_get_page_size(), kAlignmentLog2, true,
&buffer));
ASSERT_EQ(ddk_fake::PhysToVirt(buffer->phys()), buffer->virt());
auto& page = ddk_fake::GetPage(buffer->phys());
ASSERT_EQ(page.alignment_log2, kAlignmentLog2);
ASSERT_EQ(page.bti, kFakeBti.get());
ASSERT_TRUE(page.contiguous);
ASSERT_TRUE(page.enable_cache);
ASSERT_EQ(page.size, zx_system_get_page_size());
}
TEST(FakeDmaBuffer, UncachedContiguousBuffer) {
auto factory = ddk_fake::CreateBufferFactory();
std::unique_ptr<dma_buffer::ContiguousBuffer> buffer;
ASSERT_OK(factory->CreateContiguous(kFakeBti, zx_system_get_page_size(), kAlignmentLog2, false,
&buffer));
ASSERT_EQ(ddk_fake::PhysToVirt(buffer->phys()), buffer->virt());
auto& page = ddk_fake::GetPage(buffer->phys());
ASSERT_EQ(page.alignment_log2, kAlignmentLog2);
ASSERT_EQ(page.bti, kFakeBti.get());
ASSERT_TRUE(page.contiguous);
ASSERT_FALSE(page.enable_cache);
ASSERT_EQ(page.size, zx_system_get_page_size());
}
TEST(FakeDmaBuffer, UncachedPagedBuffer) {
auto factory = ddk_fake::CreateBufferFactory();
std::unique_ptr<dma_buffer::PagedBuffer> buffer;
constexpr auto kPageCount = 4;
ASSERT_OK(factory->CreatePaged(kFakeBti, zx_system_get_page_size() * kPageCount, false, &buffer));
for (size_t i = 0; i < kPageCount; i++) {
ASSERT_EQ(ddk_fake::PhysToVirt(buffer->phys()[i]),
static_cast<uint8_t*>(buffer->virt()) + (i * zx_system_get_page_size()));
auto& page = ddk_fake::GetPage(buffer->phys()[i]);
ASSERT_EQ(page.bti, kFakeBti.get());
ASSERT_FALSE(page.contiguous);
ASSERT_FALSE(page.enable_cache);
ASSERT_EQ(page.size, zx_system_get_page_size() * kPageCount);
}
}
TEST(FakeDmaBuffer, CachedPagedBuffer) {
auto factory = ddk_fake::CreateBufferFactory();
std::unique_ptr<dma_buffer::PagedBuffer> buffer;
constexpr auto kPageCount = 4;
ASSERT_OK(factory->CreatePaged(kFakeBti, zx_system_get_page_size() * kPageCount, true, &buffer));
for (size_t i = 0; i < kPageCount; i++) {
ASSERT_EQ(ddk_fake::PhysToVirt(buffer->phys()[i]),
static_cast<uint8_t*>(buffer->virt()) + (i * zx_system_get_page_size()));
auto& page = ddk_fake::GetPage(buffer->phys()[i]);
ASSERT_EQ(page.bti, kFakeBti.get());
ASSERT_FALSE(page.contiguous);
ASSERT_TRUE(page.enable_cache);
ASSERT_EQ(page.size, zx_system_get_page_size() * kPageCount);
}
}
} // namespace ddk_fake_test