// 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.

#include <inttypes.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async/default.h>
#include <string.h>

#include <limits>
#include <memory>
#include <utility>

#include <ddk/debug.h>
#include <ddk/device.h>
#include <ddk/driver.h>
#include <ddk/io-buffer.h>
#include <ddk/platform-defs.h>
#include <fbl/alloc_checker.h>
#include <fbl/auto_lock.h>

#include "device.h"
#include "driver.h"
#include "macros.h"
#include "src/devices/sysmem/drivers/sysmem/sysmem-bind.h"

namespace sysmem_driver {
zx_status_t sysmem_init(void** out_driver_ctx) {
  auto driver = std::make_unique<Driver>();

  // For now at least, sysmem doesn't unload, so just release() the pointer
  // into *out_driver_ctx to remain allocated for life of this devhost
  // process.
  *out_driver_ctx = reinterpret_cast<void*>(driver.release());
  return ZX_OK;
}

zx_status_t sysmem_bind(void* driver_ctx, zx_device_t* parent_device) {
  DRIVER_DEBUG("sysmem_bind()");
  Driver* driver = reinterpret_cast<Driver*>(driver_ctx);

  auto device = std::make_unique<Device>(parent_device, driver);

  auto status = device->Bind();
  if (status != ZX_OK) {
    DRIVER_ERROR("Bind() failed - status: %d\n", status);
    return status;
  }
  ZX_DEBUG_ASSERT(status == ZX_OK);

  // For now at least, there's only one sysmem device and it isn't ever
  // removed, so just release() the pointer so it lives as long as this
  // devhost process.
  __UNUSED auto ptr = device.release();

  return ZX_OK;
}

// -Werror=missing-field-initializers is more paranoid than I want here.
zx_driver_ops_t sysmem_driver_ops = [] {
  zx_driver_ops_t tmp{};
  tmp.version = DRIVER_OPS_VERSION;
  tmp.init = sysmem_init;
  tmp.bind = sysmem_bind;
  return tmp;
}();

}  // namespace sysmem_driver

ZIRCON_DRIVER(sysmem, sysmem_driver::sysmem_driver_ops, "zircon", "0.1");
