blob: 55f7c9bfbec65d1d3615c349875281019bf8221c [file] [log] [blame]
// Copyright 2024 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/driver/fake-mmio-reg/cpp/fake-mmio-reg.h>
namespace fake_mmio {
fdf::MmioBuffer FakeMmioRegRegion::GetMmioBuffer() {
static constexpr fdf::MmioBufferOps kFakeMmioOps = {
.Read8 = FakeMmioRegRegion::Read8,
.Read16 = FakeMmioRegRegion::Read16,
.Read32 = FakeMmioRegRegion::Read32,
.Read64 = FakeMmioRegRegion::Read64,
.Write8 = FakeMmioRegRegion::Write8,
.Write16 = FakeMmioRegRegion::Write16,
.Write32 = FakeMmioRegRegion::Write32,
.Write64 = FakeMmioRegRegion::Write64,
};
size_t size = reg_size_ * reg_count_;
zx::vmo vmo;
ZX_ASSERT(zx::vmo::create(/*size=*/size, 0, &vmo) == ZX_OK);
mmio_buffer_t mmio{};
ZX_ASSERT(mmio_buffer_init(&mmio, 0, size, vmo.release(), ZX_CACHE_POLICY_CACHED) == ZX_OK);
return fdf::MmioBuffer(mmio, &kFakeMmioOps, this);
}
uint8_t FakeMmioRegRegion::Read8(const void* ctx, const mmio_buffer_t& mmio, zx_off_t offs) {
auto& reg_region = *reinterpret_cast<FakeMmioRegRegion*>(const_cast<void*>(ctx));
return static_cast<uint8_t>(reg_region[offs + mmio.offset].Read());
}
uint16_t FakeMmioRegRegion::Read16(const void* ctx, const mmio_buffer_t& mmio, zx_off_t offs) {
auto& reg_region = *reinterpret_cast<FakeMmioRegRegion*>(const_cast<void*>(ctx));
return static_cast<uint16_t>(reg_region[offs + mmio.offset].Read());
}
uint32_t FakeMmioRegRegion::Read32(const void* ctx, const mmio_buffer_t& mmio, zx_off_t offs) {
auto& reg_region = *reinterpret_cast<FakeMmioRegRegion*>(const_cast<void*>(ctx));
return static_cast<uint32_t>(reg_region[offs + mmio.offset].Read());
}
uint64_t FakeMmioRegRegion::Read64(const void* ctx, const mmio_buffer_t& mmio, zx_off_t offs) {
auto& reg_region = *reinterpret_cast<FakeMmioRegRegion*>(const_cast<void*>(ctx));
return reg_region[offs + mmio.offset].Read();
}
void FakeMmioRegRegion::Write8(const void* ctx, const mmio_buffer_t& mmio, uint8_t val,
zx_off_t offs) {
Write64(ctx, mmio, val, offs);
}
void FakeMmioRegRegion::Write16(const void* ctx, const mmio_buffer_t& mmio, uint16_t val,
zx_off_t offs) {
Write64(ctx, mmio, val, offs);
}
void FakeMmioRegRegion::Write32(const void* ctx, const mmio_buffer_t& mmio, uint32_t val,
zx_off_t offs) {
Write64(ctx, mmio, val, offs);
}
void FakeMmioRegRegion::Write64(const void* ctx, const mmio_buffer_t& mmio, uint64_t val,
zx_off_t offs) {
auto& reg_region = *reinterpret_cast<FakeMmioRegRegion*>(const_cast<void*>(ctx));
reg_region[offs + mmio.offset].Write(val);
}
} // namespace fake_mmio