// 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 <fuchsia/hardware/platform/bus/c/banjo.h>
#include <fuchsia/sysmem/c/banjo.h>
#include <lib/ddk/debug.h>
#include <lib/ddk/device.h>
#include <lib/ddk/platform-defs.h>

#include <soc/mt8167/mt8167-hw.h>

#include "mt8167.h"

namespace board_mt8167 {

zx_status_t Mt8167::SysmemInit() {
  static const pbus_bti_t sysmem_btis[] = {
      {
          .iommu_index = 0,
          .bti_id = BTI_SYSMEM,
      },
  };

  static const sysmem_metadata_t sysmem_metadata = {
      .vid = PDEV_VID_MEDIATEK,
      .pid = PDEV_PID_MEDIATEK_8167S_REF,
      .protected_memory_size = 0,
      .contiguous_memory_size = 0,
  };

  static const pbus_metadata_t sysmem_metadata_list[] = {{
      .type = SYSMEM_METADATA,
      .data_buffer = reinterpret_cast<const uint8_t*>(&sysmem_metadata),
      .data_size = sizeof(sysmem_metadata),
  }};

  static const pbus_dev_t sysmem_dev = [] {
    pbus_dev_t ret = {};
    ret.name = "sysmem";
    ret.vid = PDEV_VID_GENERIC;
    ret.pid = PDEV_PID_GENERIC;
    ret.did = PDEV_DID_SYSMEM;
    ret.bti_list = sysmem_btis;
    ret.bti_count = countof(sysmem_btis);
    ret.metadata_list = sysmem_metadata_list;
    ret.metadata_count = countof(sysmem_metadata_list);
    return ret;
  }();

  zx_status_t status = pbus_.DeviceAdd(&sysmem_dev);
  if (status != ZX_OK) {
    zxlogf(ERROR, "%s: ProtocolDeviceAdd failed %d", __FUNCTION__, status);
    return status;
  }

  return ZX_OK;
}

}  // namespace board_mt8167
