/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2022-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 */

#ifndef INCLUDE_CAPTURE_IVC_H
#define INCLUDE_CAPTURE_IVC_H

#include <linux/types.h>
#include <linux/version.h>

/**
 * @brief Submit the control message binary blob to capture-IVC driver,
 *	which is to be transferred over control IVC channel to RTCPU.
 *
 * @param[in]	control_desc	binary blob containing control message
 *				descriptor, is opaque to capture-IVC driver.
 * @param[in]	len		size of control_desc.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_control_submit(
	const void *control_desc,
	size_t len);

/**
 * @brief Submit the capture message binary blob to capture-IVC driver,
 *	which is to be transferred over capture IVC channel to RTCPU.
 *
 * @param[in]	capture_desc	binary blob containing capture message
 *				descriptor, is opaque to KMDs.
 * @param[in]	len		size of capture_desc.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_capture_submit(
	const void *capture_desc,
	size_t len);

/**
 * @brief Callback function to be registered by client to receive the rtcpu
 *	notifications through control or capture IVC channel.
 *
 * @param[in]	resp_desc	binary blob containing the response message
 *				received from rtcpu through control or capture
 *				IVC channel, its opaque to KMDs.
 * @param[in]	priv_context	Client's private context, opaque to
 *				capture-IVC driver.
 */
typedef void (*tegra_capture_ivc_cb_func)(
	const void *resp_desc,
	const void *priv_context);

/**
 * @brief Register callback function to receive response messages from rtcpu
 *	through control IVC channel.
 *
 * @param[in]	control_resp_cb	callback function to be registered for
 *				control IVC channel.
 * @param[in]	priv_context	client's private context, opaque to
 *				capture-IVC driver.
 * @param[out]	trans_id	temporary id assigned by capture-IVC driver,
 *				for the clients whose unique chan_id is not
 *				yet allocated by RTCPU, to match their
 *				responses with the requests.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_register_control_cb(
	tegra_capture_ivc_cb_func control_resp_cb,
	uint32_t *trans_id,
	const void *priv_context);

/**
 * @brief Notify client’s channel ID to capture-IVC driver.
 *	Once client gets the newly allocated channel ID from RTCPU, it has to
 *	notify it to capture-IVC driver also, so that it can replace the
 *	temporary ID trans_id with the new channel ID chan_id in its internal
 *	context. IVC driver uses this unique channel ID for mapping upcoming
 *	responses with the client requests.
 *
 * @param[in]	chan_id		new channel id allocated by RTCPU for the
 *				client,	capture-IVC driver uses to refer the
 *				client for its future control responses.
 * @param[in]	trans_id	temporary id assigned by capture-IVC driver,
 *				for the client.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_notify_chan_id(
	uint32_t chan_id,
	uint32_t trans_id);

/**
 * @brief Register callback function to receive status-indication messages from
 *	rtcpu through capture IVC channel.
 *
 * @param[in]	capture_status_ind_cb	callback function to be registered for
 *					capture ivc channel.
 * @param[in]	chan_id			client's channel id, capture-IVC driver
 *					uses it refer the client for its capture
 *					responses.
 * @param[in]	priv_context		client's private context, opaque to
 *					capture-IVC driver.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_register_capture_cb(
	tegra_capture_ivc_cb_func capture_status_ind_cb,
	uint32_t chan_id,
	const void *priv_context);

/**
 * @brief Un-register callback function to stop receiving messages over
 *	control ivc channel.
 *
 * @param[in]	id	client's channel id or transaction id, for which the
 *			callback needs to be unregistered.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_unregister_control_cb(
	uint32_t id);

/**
 * @brief Un-register callback function to stop receiving messages over
 *	capture ivc channel.
 *
 * @param[in]	chan_id	client's channel id, for which the callback needs to be
 *			unregistered.
 *
 * @returns	0 (success), neg. errno (failure)
 */
int tegra_capture_ivc_unregister_capture_cb(
	uint32_t chan_id);
#endif /* INCLUDE_CAPTURE_IVC_H */
