// 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 "device.h"
#include "driver.h"
#include "macros.h"

#include <inttypes.h>
#include <limits>
#include <memory>
#include <string.h>
#include <utility>

#include <ddk/binding.h>
#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 <fbl/unique_ptr.h>
#include <lib/async-loop/cpp/loop.h>

zx_status_t sysmem_init(void** out_driver_ctx) {
    DRIVER_INFO("async_get_default_dispatcher(): %p\n",
                async_get_default_dispatcher());

    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_INFO("sysmem_bind()\n");
    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;
}();

// clang-format off
ZIRCON_DRIVER_BEGIN(sysmem, sysmem_driver_ops, "zircon", "0.1", 4)
    BI_ABORT_IF(NE, BIND_PROTOCOL, ZX_PROTOCOL_PDEV),
    BI_ABORT_IF(NE, BIND_PLATFORM_DEV_VID, PDEV_VID_GENERIC),
    BI_ABORT_IF(NE, BIND_PLATFORM_DEV_PID, PDEV_PID_GENERIC),
    BI_MATCH_IF(EQ, BIND_PLATFORM_DEV_DID, PDEV_DID_SYSMEM),
ZIRCON_DRIVER_END(sysmem)
// clang-format on
