| // 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/mmio/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_PAGE_SIZE * 2, 0, &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_PAGE_SIZE, kAlignmentLog2, &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_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_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_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_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_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_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_PAGE_SIZE * kPageCount); | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace ddk_fake_test |