linux/include/soc/tegra/ivc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (c) 2016, NVIDIA CORPORATION.  All rights reserved.
   4 */
   5
   6#ifndef __TEGRA_IVC_H
   7
   8#include <linux/device.h>
   9#include <linux/dma-mapping.h>
  10#include <linux/types.h>
  11
  12struct tegra_ivc_header;
  13
  14struct tegra_ivc {
  15        struct device *peer;
  16
  17        struct {
  18                struct tegra_ivc_header *channel;
  19                unsigned int position;
  20                dma_addr_t phys;
  21        } rx, tx;
  22
  23        void (*notify)(struct tegra_ivc *ivc, void *data);
  24        void *notify_data;
  25
  26        unsigned int num_frames;
  27        size_t frame_size;
  28};
  29
  30/**
  31 * tegra_ivc_read_get_next_frame - Peek at the next frame to receive
  32 * @ivc         pointer of the IVC channel
  33 *
  34 * Peek at the next frame to be received, without removing it from
  35 * the queue.
  36 *
  37 * Returns a pointer to the frame, or an error encoded pointer.
  38 */
  39void *tegra_ivc_read_get_next_frame(struct tegra_ivc *ivc);
  40
  41/**
  42 * tegra_ivc_read_advance - Advance the read queue
  43 * @ivc         pointer of the IVC channel
  44 *
  45 * Advance the read queue
  46 *
  47 * Returns 0, or a negative error value if failed.
  48 */
  49int tegra_ivc_read_advance(struct tegra_ivc *ivc);
  50
  51/**
  52 * tegra_ivc_write_get_next_frame - Poke at the next frame to transmit
  53 * @ivc         pointer of the IVC channel
  54 *
  55 * Get access to the next frame.
  56 *
  57 * Returns a pointer to the frame, or an error encoded pointer.
  58 */
  59void *tegra_ivc_write_get_next_frame(struct tegra_ivc *ivc);
  60
  61/**
  62 * tegra_ivc_write_advance - Advance the write queue
  63 * @ivc         pointer of the IVC channel
  64 *
  65 * Advance the write queue
  66 *
  67 * Returns 0, or a negative error value if failed.
  68 */
  69int tegra_ivc_write_advance(struct tegra_ivc *ivc);
  70
  71/**
  72 * tegra_ivc_notified - handle internal messages
  73 * @ivc         pointer of the IVC channel
  74 *
  75 * This function must be called following every notification.
  76 *
  77 * Returns 0 if the channel is ready for communication, or -EAGAIN if a channel
  78 * reset is in progress.
  79 */
  80int tegra_ivc_notified(struct tegra_ivc *ivc);
  81
  82/**
  83 * tegra_ivc_reset - initiates a reset of the shared memory state
  84 * @ivc         pointer of the IVC channel
  85 *
  86 * This function must be called after a channel is reserved before it is used
  87 * for communication. The channel will be ready for use when a subsequent call
  88 * to notify the remote of the channel reset.
  89 */
  90void tegra_ivc_reset(struct tegra_ivc *ivc);
  91
  92size_t tegra_ivc_align(size_t size);
  93unsigned tegra_ivc_total_queue_size(unsigned queue_size);
  94int tegra_ivc_init(struct tegra_ivc *ivc, struct device *peer, void *rx,
  95                   dma_addr_t rx_phys, void *tx, dma_addr_t tx_phys,
  96                   unsigned int num_frames, size_t frame_size,
  97                   void (*notify)(struct tegra_ivc *ivc, void *data),
  98                   void *data);
  99void tegra_ivc_cleanup(struct tegra_ivc *ivc);
 100
 101#endif /* __TEGRA_IVC_H */
 102