/*
 * Copyright 2023 Google LLC
 * Copyright lowRISC contributors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef SW_DEVICE_LIB_DIF_DIF_ML_TOP_H_
#define SW_DEVICE_LIB_DIF_DIF_ML_TOP_H_

/**
 * @file
 * @brief <a href="/hw/ip/ml_top/doc/">ML_Top</a> Device Interface Functions
 */

#include <stdint.h>

#include "sw/device/lib/dif/autogen/dif_ml_top_autogen.h"

#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

// ML_Top Control Register
dif_result_t dif_ml_top_reset_ctrl_en(const dif_ml_top_t *ml_top);
dif_result_t dif_ml_top_release_ctrl_en(const dif_ml_top_t *ml_top);
dif_result_t dif_ml_top_resume_ctrl_en(const dif_ml_top_t *ml_top, uint32_t pc);
dif_result_t dif_ml_top_read_ctrl_en(const dif_ml_top_t *ml_top,
                                     uint32_t *result);

// ML_Top Interrupt Enable Register
dif_result_t dif_ml_top_reset_intr_en(const dif_ml_top_t *ml_top);
dif_result_t dif_ml_top_read_intr_en(const dif_ml_top_t *ml_top,
                                     uint32_t *result);

/**
 * Below functions are auto-generated. Keep them here for now for reference.
 */


/**
 * Runtime configuration for ML_Top.
 *
 * This struct describes (SOFTWARE) runtime information for one-time
 * configuration of the hardware.
 */
typedef struct dif_ml_top_config {
  // Fields, if necessary.
} dif_ml_top_config_t;


/**
 * Parameters for a ML_Top transaction.
 */
typedef struct dif_ml_top_transaction {
  // Your fields here.
} dif_ml_top_transaction_t;

/**
 * An output location for a ML_Top transaction.
 */
typedef struct dif_ml_top_output {
  // Your fields here.
} dif_ml_top_output_t;

/**
 * Configures ML_Top with runtime information.
 *
 * This function should only need to be called once for the lifetime of
 * `handle`.
 *
 * @param ml_top A ML_Top handle.
 * @param config Runtime configuration parameters.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_ml_top_configure(
  const dif_ml_top_t *ml_top,
  dif_ml_top_config_t config);

/**
 * Begins a ML_Top transaction.
 *
 * Each call to this function should be sequenced with a call to
 * `dif_ml_top_end()`.
 *
 * @param ml_top A ML_Top handle.
 * @param transaction Transaction configuration parameters.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_ml_top_start(
  const dif_ml_top_t *ml_top,
  dif_ml_top_transaction_t transaction);

/** Ends a ML_Top transaction, writing the results to the given output.
 *
 * @param ml_top A ML_Top handle.
 * @param output Transaction output parameters.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_ml_top_end(
  const dif_ml_top_t *ml_top,
  dif_ml_top_output_t output);

/**
 * Locks out ML_Top functionality.
 *
 * This function is reentrant: calling it while functionality is locked will
 * have no effect and return `kDifOk`.
 *
 * @param ml_top A ML_Top handle.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_ml_top_lock(
  const dif_ml_top_t *ml_top);

/**
 * Checks whether this ML_Top is locked.
 *
 * @param ml_top A ML_Top handle.
 * @param[out] is_locked Out-param for the locked state.
 * @return The result of the operation.
 */
OT_WARN_UNUSED_RESULT
dif_result_t dif_ml_top_is_locked(
  const dif_ml_top_t *ml_top,
  bool *is_locked);

#ifdef __cplusplus
}  // extern "C"
#endif  // __cplusplus

#endif  // SW_DEVICE_LIB_DIF_DIF_ML_TOP_H_
