]>
Commit | Line | Data |
---|---|---|
ca791d7f TR |
1 | /* |
2 | * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify it | |
5 | * under the terms and conditions of the GNU General Public License, | |
6 | * version 2, as published by the Free Software Foundation. | |
7 | * | |
8 | * This program is distributed in the hope it will be useful, but WITHOUT | |
9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
11 | * more details. | |
12 | */ | |
13 | ||
14 | #ifndef __TEGRA_IVC_H | |
15 | ||
16 | #include <linux/device.h> | |
17 | #include <linux/dma-mapping.h> | |
18 | #include <linux/types.h> | |
19 | ||
20 | struct tegra_ivc_header; | |
21 | ||
22 | struct tegra_ivc { | |
23 | struct device *peer; | |
24 | ||
25 | struct { | |
26 | struct tegra_ivc_header *channel; | |
27 | unsigned int position; | |
28 | dma_addr_t phys; | |
29 | } rx, tx; | |
30 | ||
31 | void (*notify)(struct tegra_ivc *ivc, void *data); | |
32 | void *notify_data; | |
33 | ||
34 | unsigned int num_frames; | |
35 | size_t frame_size; | |
36 | }; | |
37 | ||
38 | /** | |
39 | * tegra_ivc_read_get_next_frame - Peek at the next frame to receive | |
40 | * @ivc pointer of the IVC channel | |
41 | * | |
42 | * Peek at the next frame to be received, without removing it from | |
43 | * the queue. | |
44 | * | |
45 | * Returns a pointer to the frame, or an error encoded pointer. | |
46 | */ | |
47 | void *tegra_ivc_read_get_next_frame(struct tegra_ivc *ivc); | |
48 | ||
49 | /** | |
50 | * tegra_ivc_read_advance - Advance the read queue | |
51 | * @ivc pointer of the IVC channel | |
52 | * | |
53 | * Advance the read queue | |
54 | * | |
55 | * Returns 0, or a negative error value if failed. | |
56 | */ | |
57 | int tegra_ivc_read_advance(struct tegra_ivc *ivc); | |
58 | ||
59 | /** | |
60 | * tegra_ivc_write_get_next_frame - Poke at the next frame to transmit | |
61 | * @ivc pointer of the IVC channel | |
62 | * | |
63 | * Get access to the next frame. | |
64 | * | |
65 | * Returns a pointer to the frame, or an error encoded pointer. | |
66 | */ | |
67 | void *tegra_ivc_write_get_next_frame(struct tegra_ivc *ivc); | |
68 | ||
69 | /** | |
70 | * tegra_ivc_write_advance - Advance the write queue | |
71 | * @ivc pointer of the IVC channel | |
72 | * | |
73 | * Advance the write queue | |
74 | * | |
75 | * Returns 0, or a negative error value if failed. | |
76 | */ | |
77 | int tegra_ivc_write_advance(struct tegra_ivc *ivc); | |
78 | ||
79 | /** | |
80 | * tegra_ivc_notified - handle internal messages | |
81 | * @ivc pointer of the IVC channel | |
82 | * | |
83 | * This function must be called following every notification. | |
84 | * | |
85 | * Returns 0 if the channel is ready for communication, or -EAGAIN if a channel | |
86 | * reset is in progress. | |
87 | */ | |
88 | int tegra_ivc_notified(struct tegra_ivc *ivc); | |
89 | ||
90 | /** | |
91 | * tegra_ivc_reset - initiates a reset of the shared memory state | |
92 | * @ivc pointer of the IVC channel | |
93 | * | |
94 | * This function must be called after a channel is reserved before it is used | |
95 | * for communication. The channel will be ready for use when a subsequent call | |
96 | * to notify the remote of the channel reset. | |
97 | */ | |
98 | void tegra_ivc_reset(struct tegra_ivc *ivc); | |
99 | ||
100 | size_t tegra_ivc_align(size_t size); | |
101 | unsigned tegra_ivc_total_queue_size(unsigned queue_size); | |
102 | int tegra_ivc_init(struct tegra_ivc *ivc, struct device *peer, void *rx, | |
103 | dma_addr_t rx_phys, void *tx, dma_addr_t tx_phys, | |
104 | unsigned int num_frames, size_t frame_size, | |
105 | void (*notify)(struct tegra_ivc *ivc, void *data), | |
106 | void *data); | |
107 | void tegra_ivc_cleanup(struct tegra_ivc *ivc); | |
108 | ||
109 | #endif /* __TEGRA_IVC_H */ |