011ad8d105a166fde5d6dc387847f8ef2ad9704c
[linux-3.10.git] / drivers / staging / nvshm / nvshm_iobuf.h
1 /*
2  * Copyright (C) 2012 NVIDIA Corporation.
3  *
4  * This software is licensed under the terms of the GNU General Public
5  * License version 2, as published by the Free Software Foundation, and
6  * may be copied, distributed, and modified under those terms.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  */
14
15 #ifndef _NVSHM_IOBUF_H
16 #define _NVSHM_IOBUF_H
17
18 /* Baseband base address in BB memory space - this is a constant */
19 #define NVSHM_IPC_BB_BASE (0x8C000000)
20
21 /**
22  * NVSHM_B2A convert from Baseband address space
23  * to AP virtual kernel space (cached)
24  *
25  * All iobuf conversion are done from/to cached kernel space
26  *
27  * @param h : struct nvshm_handle pointer
28  * @param x : address to convert
29  * @return : void * pointer in cached kernel space
30  */
31 #define NVSHM_B2A(h, x) ((void *)(x) + ((int)(h)->ipc_base_virt) \
32                          - NVSHM_IPC_BB_BASE)
33
34 /**
35  * NVSHM_A2B convert from AP kernel space (cached) to Baseband address space
36  *
37  * All iobuf conversion are done from/to cached kernel space
38  *
39  * @param h : struct nvshm_handle pointer
40  * @param x : address to convert
41  * @return : void * pointer in BB memory space
42  */
43 #define NVSHM_A2B(h, x) ((void *)(x) - ((int)(h)->ipc_base_virt) \
44                          + NVSHM_IPC_BB_BASE)
45
46 /**
47  * Alloc a nvshm_iobuf descriptor to be used for write operation
48  * Failure of allocation is considered as an Xoff situation and
49  * will be followed by a call to (*start_tx)() operation when flow
50  * control return to Xon. If excessive size is requested, call to
51  * (*error_event)() with NVSHM_IOBUF_ERROR will be raised synchronously
52  *
53  * @param struct nvshm_channel handle
54  * @param size - data size requested in bytes
55  * @return iobuf pointer or
56  * NULL if no iobuf can be allocated (flow control Xoff)
57  */
58 struct nvshm_iobuf *nvshm_iobuf_alloc(struct nvshm_channel *handle, int size);
59
60 /**
61  * Free a nvshm_iobuf descriptor given in rx_event
62  * pointers are not followed and cleared on free
63  *
64  * @param struct nvshm_iobuf descriptor to free
65  *
66  */
67 void nvshm_iobuf_free(struct nvshm_iobuf *iob);
68
69 /**
70  * Free a nvshm_iobuf descriptor list given in rx_event
71  * both ->next and ->sg_next are followed
72  *
73  * @param struct nvshm_iobuf list of descriptor to free
74  *
75  */
76 void nvshm_iobuf_free_cluster(struct nvshm_iobuf *list);
77
78 /**
79  * clear/set nvshm_iobuf internal flags (unused/unspecified for now)
80  *
81  * @param struct nvshm_iobuf descriptor
82  * @param unsigned int set value
83  * @param unsigned int clear value
84  * @return 0 if no error
85  */
86 int nvshm_iobuf_update_bits(struct nvshm_iobuf *iob,
87                             unsigned int clear, unsigned int set);
88
89 /**
90  * Increase reference count of iobuf
91  *
92  * @param struct nvshm_iobuf descriptor
93  * @return previous ref value
94  */
95 int nvshm_iobuf_ref(struct nvshm_iobuf *iob);
96
97 /**
98  * Decrease reference count of iobuf
99  *
100  * @param struct nvshm_iobuf descriptor
101  * @return previous ref value
102  */
103 int nvshm_iobuf_unref(struct nvshm_iobuf *iob);
104
105 /**
106  * Increase reference count of iobuf cluster
107  *
108  * @param struct nvshm_iobuf descriptor
109  * @return previous maximum ref value
110  */
111 int nvshm_iobuf_ref_cluster(struct nvshm_iobuf *iob);
112
113 /**
114  * Decrease reference count of iobuf cluster
115  *
116  * @param struct nvshm_iobuf descriptor
117  * @return previous maximum ref value
118  */
119 int nvshm_iobuf_unref_cluster(struct nvshm_iobuf *iob);
120
121 /**
122  * Check if iobuf pointers are sane
123  *
124  * @param handle to nvshm channel
125  * @param struct nvshm_iobuf to check
126  * @return 0 if sane
127  */
128 int nvshm_iobuf_check(struct nvshm_channel *chan, struct nvshm_iobuf *iob);
129
130 /**
131  * Init iobuf subsystem
132  *
133  * @param handle to nvshm channel
134  * @return 0 if ok negative otherwise
135  */
136 int nvshm_iobuf_init(struct nvshm_handle *handle);
137
138 #endif /* _NVSHM_IOBUF_H */