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