// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0

#include "hw/top_matcha/sw/autogen/top_matcha.h"
#include "sw/device/lib/arch/device.h"
#include "sw/device/lib/dif/dif_cam_ctrl.h"
#include "sw/device/lib/dif/dif_uart.h"
#include "sw/device/lib/runtime/hart.h"
#include "sw/device/lib/runtime/log.h"
#include "sw/device/lib/runtime/print.h"
#include "sw/device/lib/testing/test_framework/check.h"
#include "sw/device/lib/testing/test_framework/ottf_test_config.h"
#include "sw/device/lib/testing/test_framework/status.h"

OTTF_DEFINE_TEST_CONFIG();

static dif_uart_t uart;
static dif_cam_ctrl_t cam_ctrl;

void _ottf_main(void) {
  uint32_t en_result, regwen_result;

  CHECK_DIF_OK(
      dif_uart_init(mmio_region_from_addr(TOP_MATCHA_UART0_BASE_ADDR), &uart));
  CHECK_DIF_OK(
      dif_uart_configure(&uart, (dif_uart_config_t){
                                    .baudrate = kUartBaudrate,
                                    .clk_freq_hz = kClockFreqPeripheralHz,
                                    .parity_enable = kDifToggleDisabled,
                                    .parity = kDifUartParityEven,
                                }));
  base_uart_stdout(&uart);

  LOG_INFO("Hello Shodan!");

  // Start testing
  test_status_set(kTestStatusInTest);

  CHECK_DIF_OK(dif_cam_ctrl_init(
      mmio_region_from_addr(TOP_MATCHA_CAM_CTRL_BASE_ADDR), &cam_ctrl));

  CHECK_DIF_OK(dif_cam_ctrl_read_en(&cam_ctrl, &en_result));
  CHECK(en_result == 0, "cam_ctrl is not initilized: expected : 0 | actual: %d",
        en_result);

  CHECK_DIF_OK(dif_cam_ctrl_set_en(&cam_ctrl), "Set CAM_CTRL failed");

  CHECK_DIF_OK(dif_cam_ctrl_read_en(&cam_ctrl, &en_result));
  CHECK(en_result == 1, "cam_ctrl is not set: expected : 1 | actual: %d",
        en_result);

  CHECK_DIF_OK(dif_cam_ctrl_clear_en(&cam_ctrl), "Clear CAM_CTRL failed");

  CHECK_DIF_OK(dif_cam_ctrl_read_en(&cam_ctrl, &en_result));
  CHECK(en_result == 0, "cam_ctrl is not cleared: expected : 0 | actual: %d",
        en_result);

  test_status_set(kTestStatusPassed);
}
