blob: 7cc53b1e4ac0a5f00538e94bcaf60bd83ad96665 [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 "src/graphics/display/drivers/aml-canvas/board-resources.h"
#include <fidl/fuchsia.hardware.platform.device/cpp/wire.h>
#include <lib/driver/compat/cpp/logging.h>
#include <lib/mmio/mmio-buffer.h>
#include <lib/zx/bti.h>
#include <lib/zx/result.h>
#include <zircon/assert.h>
#include <zircon/status.h>
namespace aml_canvas {
zx::result<fdf::MmioBuffer> MapMmio(
MmioResourceIndex mmio_index,
fidl::UnownedClientEnd<fuchsia_hardware_platform_device::Device> pdev) {
std::optional<fdf::MmioBuffer> mmio;
fidl::WireResult result = fidl::WireCall(pdev)->GetMmioById(static_cast<uint32_t>(mmio_index));
if (!result.ok()) {
zxlogf(ERROR, "Failed to map MMIO resource #%" PRIu32 ": FIDL call failed: %s",
static_cast<uint32_t>(mmio_index), result.status_string());
return zx::error(result.status());
}
if (result->is_error()) {
zxlogf(ERROR, "Failed to map MMIO resource #%" PRIu32 ": Platform device failed %s",
static_cast<uint32_t>(mmio_index), zx_status_get_string(result->error_value()));
return zx::error(result->error_value());
}
const fuchsia_hardware_platform_device::wire::Mmio* mmio_params = result->value();
if (!mmio_params->has_offset() || !mmio_params->has_size() || !mmio_params->has_vmo()) {
zxlogf(ERROR, "Failed to map MMIO resource #%" PRIu32 ": Platform device provided invalid MMIO",
static_cast<uint32_t>(mmio_index));
return zx::error(ZX_ERR_BAD_STATE);
};
zx::result<fdf::MmioBuffer> create_mmio_result = fdf::MmioBuffer::Create(
mmio_params->offset(), mmio_params->size(), std::move(mmio_params->vmo()),
/*cache_policy=*/ZX_CACHE_POLICY_UNCACHED_DEVICE);
if (create_mmio_result.is_error()) {
zxlogf(ERROR, "Failed to create fdf::MmioBuffer: %s", create_mmio_result.status_string());
return create_mmio_result.take_error();
}
return zx::ok(std::move(create_mmio_result).value());
}
zx::result<zx::bti> GetBti(BtiResourceIndex bti_index,
fidl::UnownedClientEnd<fuchsia_hardware_platform_device::Device> pdev) {
fidl::WireResult result = fidl::WireCall(pdev)->GetBtiById(static_cast<uint32_t>(bti_index));
if (result.status() != ZX_OK) {
zxlogf(ERROR, "Failed to get BTI resource #%" PRIu32 ": FIDL failed %s",
static_cast<uint32_t>(bti_index), result.status_string());
return zx::error(result.status());
}
if (!result->is_ok()) {
zxlogf(ERROR, "Failed to get BTI resource #%" PRIu32 ": Platform device failed %s",
static_cast<uint32_t>(bti_index), zx_status_get_string(result->error_value()));
return zx::error(result->error_value());
}
zx::bti bti = std::move(result->value()->bti);
ZX_DEBUG_ASSERT_MSG(bti.is_valid(), "GetBti() succeeded but didn't populate the out-param");
return zx::ok(std::move(bti));
}
} // namespace aml_canvas