Files
linux-nv-oot/include/media/fusa-capture/capture-vi-channel.h
Rakibul Hassan d4f85d7379 nvidia-oot: camera: vi: track syncpt threshold
This change does the following:
 - Keep the capture progress syncpt threshold up to date by
   incrementing it when a capture request is made
 - Fast forward the syncpoints via host1x api on reset

Bug 4882047

Change-Id: Ic2a677575d9ade45ae6b69de5fd49d40029f7053
Signed-off-by: Rakibul Hassan <rakibulh@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3248336
(cherry picked from commit 6343864b8b7f70f1bc87f8503f28b07a3bb024bc)
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3240448
Reviewed-by: Justin Kim (SW-TEGRA) <juskim@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: Shiva Dubey <sdubey@nvidia.com>
Tested-by: Justin Kim (SW-TEGRA) <juskim@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
2025-07-24 10:19:11 +00:00

213 lines
6.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/* SPDX-FileCopyrightText: Copyright (c) 2017-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved. */
/**
* @file include/media/fusa-capture/capture-vi-channel.h
*
* @brief VI channel character device driver header for the T234 Camera
* RTCPU platform.
*/
#ifndef __FUSA_CAPTURE_VI_CHANNEL_H__
#define __FUSA_CAPTURE_VI_CHANNEL_H__
#include <linux/of_platform.h>
struct vi_channel_drv;
/**
* @brief VI fops for Host1x syncpt/gos allocations
*
* This fops is a HAL for chip/IP generations, see the respective VI platform
* drivers for the implementations.
*/
struct vi_channel_drv_ops {
/**
* Request a syncpt allocation from Host1x.
*
* @param[in] pdev VI platform_device
* @param[in] name syncpt name
* @param[out] syncpt_id assigned syncpt id
*
* @returns 0 (success), neg. errno (failure)
*/
int (*alloc_syncpt)(
struct platform_device *pdev,
const char *name,
uint32_t *syncpt_id);
/**
* Release a syncpt to Host1x.
*
* @param[in] pdev VI platform_device
* @param[in] id syncpt id to free
*/
void (*release_syncpt)(
struct platform_device *pdev,
uint32_t id);
/**
* Fast forward a progres syncpt to Host1x.
*
* @param[in] pdev VI platform_device
* @param[in] id syncpt id to fast forward
* @param[in] threshold value to fast forward to
*/
void (*fast_forward_syncpt)(
struct platform_device *pdev,
uint32_t id,
uint32_t threshold);
/**
* Retrieve the GoS table allocated in the VI-THI carveout.
*
* @param[in] pdev VI platform_device
* @param[out] count No. of carveout devices
* @param[out] table GoS table pointer
*/
void (*get_gos_table)(
struct platform_device *pdev,
int *count,
const dma_addr_t **table);
/**
* Get a syncpt's GoS backing in the VI-THI carveout.
*
* @param[in] pdev VI platform_device
* @param[in] id syncpt id
* @param[out] gos_index GoS id
* @param[out] gos_offset Offset of syncpt within GoS [dword]
*
* @returns 0 (success), neg. errno (failure)
*/
int (*get_syncpt_gos_backing)(
struct platform_device *pdev,
uint32_t id,
dma_addr_t *syncpt_addr,
uint32_t *gos_index,
uint32_t *gos_offset);
};
/**
* @brief VI channel character device driver context.
*/
struct vi_channel_drv {
struct platform_device *vi_capture_pdev;
/**< Capture VI driver platform device */
struct device *dev; /**< VI kernel @em device */
struct platform_device *ndev; /**< VI kernel @em platform_device */
struct mutex lock; /**< VI channel driver context lock */
u8 num_channels; /**< No. of VI channel character devices */
const struct vi_channel_drv_ops *ops;
/**< VI fops for Host1x syncpt/gos allocations */
struct tegra_vi_channel __rcu *channels[];
/**< Allocated VI channel contexts */
};
/**
* @brief VI channel context (character device)
*/
struct tegra_vi_channel {
struct device *dev; /**< VI device */
struct platform_device *ndev; /**< VI nvhost platform_device */
struct platform_device *vi_capture_pdev;
/**< Capture VI driver platform device */
struct vi_channel_drv *drv; /**< VI channel driver context */
struct rcu_head rcu; /**< VI channel rcu */
struct vi_capture *capture_data; /**< VI channel capture context */
const struct vi_channel_drv_ops *ops; /**< VI syncpt/gos fops */
struct device *rtcpu_dev; /**< rtcpu device */
bool is_stream_opened; /**< Whether the NVCSI stream is opened */
};
/**
* @brief Create the VI channels driver contexts, and instantiate
* as many channel character device nodes as specified in the device tree.
*
* VI channel nodes appear in the filesystem as:
* /dev/capture-vi-channel{0..max_vi_channels-1}
*
* @param[in] ndev VI platform_device context
* @param[in] max_vi_channels Maximum number of VI channels
* @returns 0 (success), neg. errno (failure)
*/
int vi_channel_drv_register(
struct platform_device *ndev, unsigned int max_vi_channels);
/**
* @brief Destroy the VI channels driver and all character device nodes.
*
* The VI channels driver and associated channel contexts in memory are freed,
* rendering the VI platform driver unusable until re-initialized.
*
* @param[in] dev VI device context
*/
void vi_channel_drv_unregister(
struct device *dev);
/**
* @brief Register the chip specific syncpt/gos related function table
*
* @param[in] ops vi_channel_drv_ops fops
* @returns 0 (success), neg. errno (failure)
*/
int vi_channel_drv_fops_register(
const struct vi_channel_drv_ops *ops);
/**
* @brief Unpin and free the list of pinned capture_mapping's associated with a
* VI capture request.
*
* @param[in] chan VI channel context
* @param[in] buffer_index Capture descriptor queue index
*/
void vi_capture_request_unpin(
struct tegra_vi_channel *chan,
uint32_t buffer_index);
/*
* Internal APIs for V4L2 driver (aka. VI mode)
*/
/**
* @brief Open a VI channel character device node, power on the camera subsystem
* and initialize the channel driver context.
*
* The act of opening a VI channel character device node does not entail the
* reservation of a VI channel, VI_CAPTURE_SETUP must be called afterwards to
* request an allocation by RCE.
*
* @param[in] channel VI channel enumerated node iminor no.
* @param[in] is_mem_pinned Whether capture request memory will be pinned
*
* @returns tegra_vi_channel pointer (success), ERR_PTR (failure)
*/
struct tegra_vi_channel *vi_channel_open_ex(
unsigned int channel,
bool is_mem_pinned);
/**
* @brief Release a VI channel character device node, power off the camera
* subsystem and free the VI channel driver context.
*
* Under normal operation, the NVCSI stream and TPG source should be closed, and
* VI_CAPTURE_RESET followed by VI_CAPTURE_RELEASE should be called before
* releasing the file handle on the device node.
*
* If the user-mode client crashes, the operating system will call this
* @em release handler to perform all of those actions as part of the @em Abort
* functionality.
*
* @param[in] channel VI channel enumerated node iminor no.
* @param[in] chan VI channel context
*
* @returns 0
*/
int vi_channel_close_ex(
unsigned int channel,
struct tegra_vi_channel *chan);
int vi_channel_drv_init(void);
void vi_channel_drv_exit(void);
#endif /* __FUSA_CAPTURE_VI_CHANNEL_H__ */