// Copyright 2019 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_DEVICES_BOARD_DRIVERS_X86_X86_H_
#define SRC_DEVICES_BOARD_DRIVERS_X86_X86_H_

#include <fuchsia/hardware/acpi/llcpp/fidl.h>
#include <threads.h>

#include <memory>

#include <ddk/device.h>
#include <ddktl/device.h>
#include <ddktl/protocol/platform/bus.h>
#include <fbl/macros.h>
#include <fbl/vector.h>

#include "iommu.h"

namespace x86 {

// This is the main class for the X86 platform bus driver.
class X86 : public ddk::Device<X86, ddk::Messageable>,
            public ::llcpp::fuchsia::hardware::acpi::Acpi::Interface {
 public:
  explicit X86(zx_device_t* parent, pbus_protocol_t* pbus, zx_device_t* sys_root)
      : ddk::Device<X86, ddk::Messageable>(parent), pbus_(pbus), sys_root_(sys_root) {}
  ~X86();

  static zx_status_t Create(void* ctx, zx_device_t* parent, std::unique_ptr<X86>* out);
  static zx_status_t CreateAndBind(void* ctx, zx_device_t* parent);
  static bool RunUnitTests(void* ctx, zx_device_t* parent, zx_handle_t channel);

  // Device protocol implementation.
  void DdkRelease();
  zx_status_t DdkMessage(fidl_msg*, fidl_txn*);

  // ACPI protocol FIDL interface implementation.
  void ListTableEntries(ListTableEntriesCompleter::Sync completer) override;
  void ReadNamedTable(fidl::Array<uint8_t, 4> name, uint32_t instance, ::zx::vmo result,
                      ReadNamedTableCompleter::Sync completer) override;

  // Performs ACPICA initialization.
  zx_status_t EarlyAcpiInit();

  zx_status_t EarlyInit();

  // Add the list of ACPI entries present in the system to |entries|.
  //
  // Requires that ACPI has been initialised.
  zx_status_t GetAcpiTableEntries(
      fbl::Vector<::llcpp::fuchsia::hardware::acpi::TableInfo>* entries);

 private:
  X86(const X86&) = delete;
  X86(X86&&) = delete;
  X86& operator=(const X86&) = delete;
  X86& operator=(X86&&) = delete;

  zx_status_t SysmemInit();

  // Register this instance with devmgr and launch the deferred initialization in Thread.
  zx_status_t Bind();
  zx_status_t Start();
  int Thread();

  IommuManager iommu_manager_;

  ddk::PBusProtocolClient pbus_;

  // This is our parents parent.
  zx_device_t* sys_root_;

  thrd_t thread_;

  // Whether the global ACPICA initialization has been performed or not
  bool acpica_initialized_ = false;
};

}  // namespace x86

#endif  // SRC_DEVICES_BOARD_DRIVERS_X86_X86_H_
