Files
linux-nv-oot/drivers/platform/tegra/rtcpu/capture-ivc-priv.h
Jerry Chang 7bca2b2466 tegra: rtcpu: revise copyright
incorrect use of NVIDIA Properitary License in Linux driver code

Bug 5197152

Change-Id: Id23b8cbd4fd6315664c77d7f42014206d1ef8d5c
Signed-off-by: Jerry Chang <jerchang@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3330623
Reviewed-by: svcacv <svcacv@nvidia.com>
Reviewed-by: Jon Hunter <jonathanh@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
2025-04-01 12:23:51 -07:00

138 lines
3.8 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* SPDX-FileCopyrightText: Copyright (c) 2017-2025 NVIDIA CORPORATION & AFFILIATES.
* All rights reserved.
*/
#ifndef __CAPTURE_IVC_PRIV_H__
#define __CAPTURE_IVC_PRIV_H__
/** Total number of capture channels (2 * VI + ISP). T234 has two VI units */
#define NUM_CAPTURE_CHANNELS 88
/** Temporary ids for the clients whose channel-id is not yet allocated */
#define NUM_CAPTURE_TRANSACTION_IDS NUM_CAPTURE_CHANNELS
/** Total number of channels including Temporary IDs */
#define TOTAL_CHANNELS (NUM_CAPTURE_CHANNELS + NUM_CAPTURE_TRANSACTION_IDS)
#define TRANS_ID_START_IDX NUM_CAPTURE_CHANNELS
/**
* @brief Callback context of an IVC channel.
*/
struct tegra_capture_ivc_cb_ctx {
/** Linked list of callback contexts */
struct list_head node;
/** Callback function registered by client */
tegra_capture_ivc_cb_func cb_func;
/** Private context of a VI/ISP capture context */
const void *priv_context;
struct semaphore sem_ch;
};
/**
* @brief IVC channel context.
*/
struct tegra_capture_ivc {
/** Pointer to IVC channel */
struct tegra_ivc_channel *chan;
/** Callback context lock */
struct mutex cb_ctx_lock;
/** Channel write lock */
struct mutex ivc_wr_lock;
/** Deferred work */
struct kthread_work work;
/** ivc worker thread **/
struct kthread_worker ivc_worker;
/** task struct **/
struct task_struct *ivc_kthread;
/** Channel work queue head */
wait_queue_head_t write_q;
/** Array holding callbacks registered by each channel */
struct tegra_capture_ivc_cb_ctx cb_ctx[TOTAL_CHANNELS];
/** spinlock protecting access to linked list */
spinlock_t avl_ctx_list_lock;
/** Linked list holding callback contexts */
struct list_head avl_ctx_list;
};
/**
* @brief Standard message header for all capture IVC messages.
*/
struct tegra_capture_ivc_msg_header {
/** Message identifier. */
uint32_t msg_id;
union {
/** Channel identifier. */
uint32_t channel_id;
/** Transaction id */
uint32_t transaction;
};
} __aligned(8);
/**
* @brief Response of IVC msg
*/
struct tegra_capture_ivc_resp {
/** IVC msg header. See @ref tegra_capture_ivc_msg_header */
struct tegra_capture_ivc_msg_header header;
};
/** Pointer holding the Control IVC channel context, created during probe call*/
static struct tegra_capture_ivc *__scivc_control;
/** Pointer holding the Capture IVC channel context, created during probe call*/
static struct tegra_capture_ivc *__scivc_capture;
/**
* @brief Worker thread to handle the asynchronous msgs on the IVC channel.
This will further calls callbacks registered by Channel drivers.
*
* @param[in] work kthread_work pointer
*/
static void tegra_capture_ivc_worker(
struct kthread_work *work);
/**
* @brief Implementation of IVC notify operation which gets called when we any
* new message on the bus for the channel. This signals the worker thread.
*
* @param[in] chan tegra_ivc_channel channel pointer
*/
static void tegra_capture_ivc_notify(
struct tegra_ivc_channel *chan);
/**
* @brief Implementation of probe operation which gets called during boot
*
* @param[in,out] chan tegra_ivc_channel channel pointer
*
* @returns 0 (success), neg. errno (failure)
*/
static int tegra_capture_ivc_probe(
struct tegra_ivc_channel *chan);
/**
* @brief Implementation of remove operation
*
* @param[in] chan tegra_ivc_channel channel pointer
*/
static void tegra_capture_ivc_remove(
struct tegra_ivc_channel *chan);
/**
* @brief Function to transmit the IVC msg after checking if it can write,
* using Tegra IVC core library APIs.
*
* @param[in] civc IVC channel on which the msg needs to be transmitted.
* @param[in] req IVC msg blob.
* @param[in] len IVC msg length.
*
* @returns 0 (success), neg. errno (failure)
*/
static int tegra_capture_ivc_tx(
struct tegra_capture_ivc *civc,
const void *req,
size_t len);
#endif /* __CAPTURE_IVC_PRIV_H__ */