// Copyright 2018 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 SRC_GRAPHICS_DISPLAY_DRIVERS_AML_CANVAS_AML_CANVAS_H_
#define SRC_GRAPHICS_DISPLAY_DRIVERS_AML_CANVAS_AML_CANVAS_H_

#include <fidl/fuchsia.hardware.amlogiccanvas/cpp/wire.h>
#include <lib/driver/outgoing/cpp/outgoing_directory.h>
#include <lib/inspect/component/cpp/component.h>
#include <lib/inspect/cpp/inspect.h>
#include <lib/mmio/mmio.h>
#include <lib/zx/bti.h>
#include <lib/zx/pmt.h>
#include <zircon/compiler.h>

#include <array>
#include <cstdint>
#include <memory>

#include <fbl/mutex.h>

namespace aml_canvas {

constexpr size_t kNumCanvasEntries = 256;

struct CanvasEntry {
  CanvasEntry() = default;

  CanvasEntry(CanvasEntry&&) = default;
  CanvasEntry& operator=(CanvasEntry&& right) {
    if (this == &right)
      return *this;
    if (pmt)
      pmt.unpin();
    pmt = std::move(right.pmt);
    vmo = std::move(right.vmo);
    node = std::move(right.node);
    return *this;
  }

  ~CanvasEntry() {
    if (pmt)
      pmt.unpin();
  }

  zx::pmt pmt;
  // Hold a handle to the VMO so the memory diagnostic tools can realize that it's in use by this
  // process.  See https://fxbug.dev/42155718.
  zx::vmo vmo;
  inspect::Node node;
};

class AmlCanvas : public fidl::WireServer<fuchsia_hardware_amlogiccanvas::Device> {
 public:
  // `mmio` is the region documented as DMC in Section 8.1 "Memory Map" of the
  // AMLogic A311D datasheet.
  AmlCanvas(fdf::MmioBuffer mmio, zx::bti bti, inspect::Inspector inspector);

  AmlCanvas(const AmlCanvas&) = delete;
  AmlCanvas(AmlCanvas&&) = delete;
  AmlCanvas& operator=(const AmlCanvas&) = delete;
  AmlCanvas& operator=(AmlCanvas&&) = delete;

  ~AmlCanvas();

  // fidl::WireServer<fuchsia_hardware_amlogiccanvas::Device>
  void Config(ConfigRequestView request, ConfigCompleter::Sync& completer) override;
  void Free(FreeRequestView request, FreeCompleter::Sync& completer) override;

  zx_status_t ServeOutgoing(std::shared_ptr<fdf::OutgoingDirectory>& outgoing);

 private:
  inspect::Inspector inspector_;
  inspect::Node inspect_root_;
  fbl::Mutex lock_;
  fdf::MmioBuffer dmc_regs_ __TA_GUARDED(lock_);
  zx::bti bti_ __TA_GUARDED(lock_);
  std::array<CanvasEntry, kNumCanvasEntries> entries_ __TA_GUARDED(lock_);
  async_dispatcher_t* dispatcher_{fdf::Dispatcher::GetCurrent()->async_dispatcher()};
  fidl::ServerBindingGroup<fuchsia_hardware_amlogiccanvas::Device> bindings_;
};

}  // namespace aml_canvas

#endif  // SRC_GRAPHICS_DISPLAY_DRIVERS_AML_CANVAS_AML_CANVAS_H_
