forked from Minki/linux
2025cf9e19
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms and conditions of the gnu general public license version 2 as published by the free software foundation this program is distributed in the hope it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 263 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190529141901.208660670@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
102 lines
2.6 KiB
C
102 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
|
*/
|
|
|
|
#ifndef __TEGRA_IVC_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/dma-mapping.h>
|
|
#include <linux/types.h>
|
|
|
|
struct tegra_ivc_header;
|
|
|
|
struct tegra_ivc {
|
|
struct device *peer;
|
|
|
|
struct {
|
|
struct tegra_ivc_header *channel;
|
|
unsigned int position;
|
|
dma_addr_t phys;
|
|
} rx, tx;
|
|
|
|
void (*notify)(struct tegra_ivc *ivc, void *data);
|
|
void *notify_data;
|
|
|
|
unsigned int num_frames;
|
|
size_t frame_size;
|
|
};
|
|
|
|
/**
|
|
* tegra_ivc_read_get_next_frame - Peek at the next frame to receive
|
|
* @ivc pointer of the IVC channel
|
|
*
|
|
* Peek at the next frame to be received, without removing it from
|
|
* the queue.
|
|
*
|
|
* Returns a pointer to the frame, or an error encoded pointer.
|
|
*/
|
|
void *tegra_ivc_read_get_next_frame(struct tegra_ivc *ivc);
|
|
|
|
/**
|
|
* tegra_ivc_read_advance - Advance the read queue
|
|
* @ivc pointer of the IVC channel
|
|
*
|
|
* Advance the read queue
|
|
*
|
|
* Returns 0, or a negative error value if failed.
|
|
*/
|
|
int tegra_ivc_read_advance(struct tegra_ivc *ivc);
|
|
|
|
/**
|
|
* tegra_ivc_write_get_next_frame - Poke at the next frame to transmit
|
|
* @ivc pointer of the IVC channel
|
|
*
|
|
* Get access to the next frame.
|
|
*
|
|
* Returns a pointer to the frame, or an error encoded pointer.
|
|
*/
|
|
void *tegra_ivc_write_get_next_frame(struct tegra_ivc *ivc);
|
|
|
|
/**
|
|
* tegra_ivc_write_advance - Advance the write queue
|
|
* @ivc pointer of the IVC channel
|
|
*
|
|
* Advance the write queue
|
|
*
|
|
* Returns 0, or a negative error value if failed.
|
|
*/
|
|
int tegra_ivc_write_advance(struct tegra_ivc *ivc);
|
|
|
|
/**
|
|
* tegra_ivc_notified - handle internal messages
|
|
* @ivc pointer of the IVC channel
|
|
*
|
|
* This function must be called following every notification.
|
|
*
|
|
* Returns 0 if the channel is ready for communication, or -EAGAIN if a channel
|
|
* reset is in progress.
|
|
*/
|
|
int tegra_ivc_notified(struct tegra_ivc *ivc);
|
|
|
|
/**
|
|
* tegra_ivc_reset - initiates a reset of the shared memory state
|
|
* @ivc pointer of the IVC channel
|
|
*
|
|
* This function must be called after a channel is reserved before it is used
|
|
* for communication. The channel will be ready for use when a subsequent call
|
|
* to notify the remote of the channel reset.
|
|
*/
|
|
void tegra_ivc_reset(struct tegra_ivc *ivc);
|
|
|
|
size_t tegra_ivc_align(size_t size);
|
|
unsigned tegra_ivc_total_queue_size(unsigned queue_size);
|
|
int tegra_ivc_init(struct tegra_ivc *ivc, struct device *peer, void *rx,
|
|
dma_addr_t rx_phys, void *tx, dma_addr_t tx_phys,
|
|
unsigned int num_frames, size_t frame_size,
|
|
void (*notify)(struct tegra_ivc *ivc, void *data),
|
|
void *data);
|
|
void tegra_ivc_cleanup(struct tegra_ivc *ivc);
|
|
|
|
#endif /* __TEGRA_IVC_H */
|