/*
 * Copyright (c) 2020 Google LLC.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Public APIs for Host Command backends that respond to host commands
 */

#ifndef ZEPHYR_INCLUDE_MGMT_EC_HOST_CMD_BACKEND_H_
#define ZEPHYR_INCLUDE_MGMT_EC_HOST_CMD_BACKEND_H_

#include <zephyr/sys/__assert.h>
#include <zephyr/device.h>
#include <zephyr/kernel.h>
#include <zephyr/types.h>

#ifdef __cplusplus
extern "C" {
#endif

struct ec_host_cmd_backend {
	/** API provided by the backed. */
	const struct ec_host_cmd_backend_api *api;
	/** Context for the backed. */
	void *ctx;
};

/**
 * @brief EC Host Command Interface
 * @defgroup ec_host_cmd_interface EC Host Command Interface
 * @ingroup io_interfaces
 * @{
 */

/**
 * @brief Context for host command backend and handler to pass rx data.
 */
struct ec_host_cmd_rx_ctx {
	/**
	 * Buffer to hold received data. The buffer is provided by the handler if
	 * CONFIG_EC_HOST_CMD_HANDLER_RX_BUFFER_SIZE > 0. Otherwise, the backend should provide
	 * the buffer on its own and overwrites @a buf pointer in the init function.
	 */
	uint8_t *buf;
	/** Number of bytes written to @a buf by backend. */
	size_t len;
	/**
	 * The backend gives @a handler_owns, when data in @a buf are ready.
	 * The handler takes @a handler_owns to read data in @a buf.
	 */
	struct k_sem handler_owns;
};

/**
 * @brief Context for host command backend and handler to pass tx data
 */
struct ec_host_cmd_tx_buf {
	/**
	 * Data to write to the host The buffer is provided by the handler if
	 * CONFIG_EC_HOST_CMD_HANDLER_TX_BUFFER_SIZE > 0. Otherwise, the backend should provide
	 * the buffer on its own and overwrites @a buf pointer and @a len_max
	 * in the init function.
	 */
	void *buf;
	/** Number of bytes to write from @a buf. */
	size_t len;
	/** Size of @a buf. */
	size_t len_max;
};

/**
 * @brief Initialize a host command backend
 *
 * This routine initializes a host command backend. It includes initialization
 * a device used to communication and setting up buffers.
 * This function is called by the ec_host_cmd_init function.
 *
 * @param[in]     backend Pointer to the backend structure for the driver instance.
 * @param[in,out] rx_ctx  Pointer to the receive context object. These objects are used to receive
 *                        data from the driver when the host sends data. The buf member can be
 *                        assigned by the backend.
 * @param[in,out] tx      Pointer to the transmit buffer object. The buf and len_max members can be
 *                        assigned by the backend. These objects are used to send data by the
 *                        backend with the ec_host_cmd_backend_api_send function.
 *
 * @retval 0 if successful
 */
typedef int (*ec_host_cmd_backend_api_init)(const struct ec_host_cmd_backend *backend,
					    struct ec_host_cmd_rx_ctx *rx_ctx,
					    struct ec_host_cmd_tx_buf *tx);

/**
 * @brief Sends data to the host
 *
 * Sends data from tx buf that was passed via ec_host_cmd_backend_api_init
 * function.
 *
 * @param backend Pointer to the backed to send data.
 *
 * @retval 0 if successful.
 */
typedef int (*ec_host_cmd_backend_api_send)(const struct ec_host_cmd_backend *backend);

__subsystem struct ec_host_cmd_backend_api {
	ec_host_cmd_backend_api_init init;
	ec_host_cmd_backend_api_send send;
};

/**
 * @brief Get the eSPI Host Command backend pointer
 *
 * Get the eSPI pointer backend and pass a pointer to eSPI device instance that will be used for
 * the Host Command communication.
 *
 * @param dev Pointer to eSPI device instance.
 *
 * @retval The eSPI backend pointer.
 */
struct ec_host_cmd_backend *ec_host_cmd_backend_get_espi(const struct device *dev);

/**
 * @brief Get the SHI NPCX Host Command backend pointer
 *
 * @retval the SHI NPCX backend pointer
 */
struct ec_host_cmd_backend *ec_host_cmd_backend_get_shi_npcx(void);

/**
 * @brief Get the SHI ITE Host Command backend pointer
 *
 * @retval the SHI ITE backend pointer
 */
struct ec_host_cmd_backend *ec_host_cmd_backend_get_shi_ite(void);

/**
 * @brief Get the UART Host Command backend pointer
 *
 * Get the UART pointer backend and pass a pointer to UART device instance that will be used for
 * the Host Command communication.
 *
 * @param dev Pointer to UART device instance.
 *
 * @retval The UART backend pointer.
 */
struct ec_host_cmd_backend *ec_host_cmd_backend_get_uart(const struct device *dev);

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_MGMT_EC_HOST_CMD_EC_HOST_CMD_BACKEND_H_ */
