blob: 113b8fa56fd95b16f41ad5c02637c37f56171eb9 [file] [log] [blame]
// Copyright 2022 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.
#ifndef FUCHSIA_SDK_EXAMPLES_ACPI_MULTIPLY_DRIVER_MULTIPLIER_H_
#define FUCHSIA_SDK_EXAMPLES_ACPI_MULTIPLY_DRIVER_MULTIPLIER_H_
#include <fidl/fuchsia.hardware.acpi/cpp/wire.h>
#include <lib/async/cpp/irq.h>
#include <lib/driver/component/cpp/driver_cpp.h>
#include <lib/mmio/mmio-buffer.h>
#include <lib/zx/interrupt.h>
#include <list>
namespace acpi_multiply {
// Invokes ACPI methods using a fuchsia.hardware.acpi client.
class AcpiMultiplier {
public:
explicit AcpiMultiplier(driver::Logger* logger, async_dispatcher_t* dispatcher,
fidl::WireSyncClient<fuchsia_hardware_acpi::Device> acpi)
: logger_(logger), dispatcher_(dispatcher), acpi_(std::move(acpi)) {}
zx::result<> SetupMmioAndInterrupts();
// Structure to return operation results to FIDL callers.
struct MultiplyResult {
uint32_t value;
uint32_t overflow;
};
// Structure to receive operation requests from FIDL callers.
struct Operation {
// Operands to the multiply.
uint32_t a;
uint32_t b;
// Operation callback.
fit::callback<void(zx::result<MultiplyResult>)> callback;
};
void QueueMultiplyOperation(Operation operation);
private:
void HandleIrq(async_dispatcher_t* dispatcher, async::IrqBase* irq, zx_status_t status,
const zx_packet_interrupt_t* interrupt);
void DoMultiply(Operation operation);
driver::Logger* logger_;
async_dispatcher_t* const dispatcher_;
std::optional<fdf::MmioBuffer> mmio_;
zx::interrupt irq_;
async::IrqMethod<AcpiMultiplier, &AcpiMultiplier::HandleIrq> irq_method_{this};
fidl::WireSyncClient<fuchsia_hardware_acpi::Device> acpi_;
std::optional<Operation> current_op_;
std::list<Operation> operation_queue_;
};
} // namespace acpi_multiply
#endif // FUCHSIA_SDK_EXAMPLES_ACPI_MULTIPLY_DRIVER_MULTIPLIER_H_