xref: /OK3568_Linux_fs/kernel/include/linux/kfifo.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * A generic kernel FIFO implementation
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2013 Stefani Seibold <stefani@seibold.net>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #ifndef _LINUX_KFIFO_H
9*4882a593Smuzhiyun #define _LINUX_KFIFO_H
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /*
12*4882a593Smuzhiyun  * How to porting drivers to the new generic FIFO API:
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * - Modify the declaration of the "struct kfifo *" object into a
15*4882a593Smuzhiyun  *   in-place "struct kfifo" object
16*4882a593Smuzhiyun  * - Init the in-place object with kfifo_alloc() or kfifo_init()
17*4882a593Smuzhiyun  *   Note: The address of the in-place "struct kfifo" object must be
18*4882a593Smuzhiyun  *   passed as the first argument to this functions
19*4882a593Smuzhiyun  * - Replace the use of __kfifo_put into kfifo_in and __kfifo_get
20*4882a593Smuzhiyun  *   into kfifo_out
21*4882a593Smuzhiyun  * - Replace the use of kfifo_put into kfifo_in_spinlocked and kfifo_get
22*4882a593Smuzhiyun  *   into kfifo_out_spinlocked
23*4882a593Smuzhiyun  *   Note: the spinlock pointer formerly passed to kfifo_init/kfifo_alloc
24*4882a593Smuzhiyun  *   must be passed now to the kfifo_in_spinlocked and kfifo_out_spinlocked
25*4882a593Smuzhiyun  *   as the last parameter
26*4882a593Smuzhiyun  * - The formerly __kfifo_* functions are renamed into kfifo_*
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun  * Note about locking: There is no locking required until only one reader
31*4882a593Smuzhiyun  * and one writer is using the fifo and no kfifo_reset() will be called.
32*4882a593Smuzhiyun  * kfifo_reset_out() can be safely used, until it will be only called
33*4882a593Smuzhiyun  * in the reader thread.
34*4882a593Smuzhiyun  * For multiple writer and one reader there is only a need to lock the writer.
35*4882a593Smuzhiyun  * And vice versa for only one writer and multiple reader there is only a need
36*4882a593Smuzhiyun  * to lock the reader.
37*4882a593Smuzhiyun  */
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun #include <linux/kernel.h>
40*4882a593Smuzhiyun #include <linux/spinlock.h>
41*4882a593Smuzhiyun #include <linux/stddef.h>
42*4882a593Smuzhiyun #include <linux/scatterlist.h>
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun struct __kfifo {
45*4882a593Smuzhiyun 	unsigned int	in;
46*4882a593Smuzhiyun 	unsigned int	out;
47*4882a593Smuzhiyun 	unsigned int	mask;
48*4882a593Smuzhiyun 	unsigned int	esize;
49*4882a593Smuzhiyun 	void		*data;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define __STRUCT_KFIFO_COMMON(datatype, recsize, ptrtype) \
53*4882a593Smuzhiyun 	union { \
54*4882a593Smuzhiyun 		struct __kfifo	kfifo; \
55*4882a593Smuzhiyun 		datatype	*type; \
56*4882a593Smuzhiyun 		const datatype	*const_type; \
57*4882a593Smuzhiyun 		char		(*rectype)[recsize]; \
58*4882a593Smuzhiyun 		ptrtype		*ptr; \
59*4882a593Smuzhiyun 		ptrtype const	*ptr_const; \
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #define __STRUCT_KFIFO(type, size, recsize, ptrtype) \
63*4882a593Smuzhiyun { \
64*4882a593Smuzhiyun 	__STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
65*4882a593Smuzhiyun 	type		buf[((size < 2) || (size & (size - 1))) ? -1 : size]; \
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define STRUCT_KFIFO(type, size) \
69*4882a593Smuzhiyun 	struct __STRUCT_KFIFO(type, size, 0, type)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define __STRUCT_KFIFO_PTR(type, recsize, ptrtype) \
72*4882a593Smuzhiyun { \
73*4882a593Smuzhiyun 	__STRUCT_KFIFO_COMMON(type, recsize, ptrtype); \
74*4882a593Smuzhiyun 	type		buf[0]; \
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #define STRUCT_KFIFO_PTR(type) \
78*4882a593Smuzhiyun 	struct __STRUCT_KFIFO_PTR(type, 0, type)
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun /*
81*4882a593Smuzhiyun  * define compatibility "struct kfifo" for dynamic allocated fifos
82*4882a593Smuzhiyun  */
83*4882a593Smuzhiyun struct kfifo __STRUCT_KFIFO_PTR(unsigned char, 0, void);
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define STRUCT_KFIFO_REC_1(size) \
86*4882a593Smuzhiyun 	struct __STRUCT_KFIFO(unsigned char, size, 1, void)
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define STRUCT_KFIFO_REC_2(size) \
89*4882a593Smuzhiyun 	struct __STRUCT_KFIFO(unsigned char, size, 2, void)
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /*
92*4882a593Smuzhiyun  * define kfifo_rec types
93*4882a593Smuzhiyun  */
94*4882a593Smuzhiyun struct kfifo_rec_ptr_1 __STRUCT_KFIFO_PTR(unsigned char, 1, void);
95*4882a593Smuzhiyun struct kfifo_rec_ptr_2 __STRUCT_KFIFO_PTR(unsigned char, 2, void);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /*
98*4882a593Smuzhiyun  * helper macro to distinguish between real in place fifo where the fifo
99*4882a593Smuzhiyun  * array is a part of the structure and the fifo type where the array is
100*4882a593Smuzhiyun  * outside of the fifo structure.
101*4882a593Smuzhiyun  */
102*4882a593Smuzhiyun #define	__is_kfifo_ptr(fifo) \
103*4882a593Smuzhiyun 	(sizeof(*fifo) == sizeof(STRUCT_KFIFO_PTR(typeof(*(fifo)->type))))
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun /**
106*4882a593Smuzhiyun  * DECLARE_KFIFO_PTR - macro to declare a fifo pointer object
107*4882a593Smuzhiyun  * @fifo: name of the declared fifo
108*4882a593Smuzhiyun  * @type: type of the fifo elements
109*4882a593Smuzhiyun  */
110*4882a593Smuzhiyun #define DECLARE_KFIFO_PTR(fifo, type)	STRUCT_KFIFO_PTR(type) fifo
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /**
113*4882a593Smuzhiyun  * DECLARE_KFIFO - macro to declare a fifo object
114*4882a593Smuzhiyun  * @fifo: name of the declared fifo
115*4882a593Smuzhiyun  * @type: type of the fifo elements
116*4882a593Smuzhiyun  * @size: the number of elements in the fifo, this must be a power of 2
117*4882a593Smuzhiyun  */
118*4882a593Smuzhiyun #define DECLARE_KFIFO(fifo, type, size)	STRUCT_KFIFO(type, size) fifo
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /**
121*4882a593Smuzhiyun  * INIT_KFIFO - Initialize a fifo declared by DECLARE_KFIFO
122*4882a593Smuzhiyun  * @fifo: name of the declared fifo datatype
123*4882a593Smuzhiyun  */
124*4882a593Smuzhiyun #define INIT_KFIFO(fifo) \
125*4882a593Smuzhiyun (void)({ \
126*4882a593Smuzhiyun 	typeof(&(fifo)) __tmp = &(fifo); \
127*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
128*4882a593Smuzhiyun 	__kfifo->in = 0; \
129*4882a593Smuzhiyun 	__kfifo->out = 0; \
130*4882a593Smuzhiyun 	__kfifo->mask = __is_kfifo_ptr(__tmp) ? 0 : ARRAY_SIZE(__tmp->buf) - 1;\
131*4882a593Smuzhiyun 	__kfifo->esize = sizeof(*__tmp->buf); \
132*4882a593Smuzhiyun 	__kfifo->data = __is_kfifo_ptr(__tmp) ?  NULL : __tmp->buf; \
133*4882a593Smuzhiyun })
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /**
136*4882a593Smuzhiyun  * DEFINE_KFIFO - macro to define and initialize a fifo
137*4882a593Smuzhiyun  * @fifo: name of the declared fifo datatype
138*4882a593Smuzhiyun  * @type: type of the fifo elements
139*4882a593Smuzhiyun  * @size: the number of elements in the fifo, this must be a power of 2
140*4882a593Smuzhiyun  *
141*4882a593Smuzhiyun  * Note: the macro can be used for global and local fifo data type variables.
142*4882a593Smuzhiyun  */
143*4882a593Smuzhiyun #define DEFINE_KFIFO(fifo, type, size) \
144*4882a593Smuzhiyun 	DECLARE_KFIFO(fifo, type, size) = \
145*4882a593Smuzhiyun 	(typeof(fifo)) { \
146*4882a593Smuzhiyun 		{ \
147*4882a593Smuzhiyun 			{ \
148*4882a593Smuzhiyun 			.in	= 0, \
149*4882a593Smuzhiyun 			.out	= 0, \
150*4882a593Smuzhiyun 			.mask	= __is_kfifo_ptr(&(fifo)) ? \
151*4882a593Smuzhiyun 				  0 : \
152*4882a593Smuzhiyun 				  ARRAY_SIZE((fifo).buf) - 1, \
153*4882a593Smuzhiyun 			.esize	= sizeof(*(fifo).buf), \
154*4882a593Smuzhiyun 			.data	= __is_kfifo_ptr(&(fifo)) ? \
155*4882a593Smuzhiyun 				NULL : \
156*4882a593Smuzhiyun 				(fifo).buf, \
157*4882a593Smuzhiyun 			} \
158*4882a593Smuzhiyun 		} \
159*4882a593Smuzhiyun 	}
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun static inline unsigned int __must_check
__kfifo_uint_must_check_helper(unsigned int val)163*4882a593Smuzhiyun __kfifo_uint_must_check_helper(unsigned int val)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	return val;
166*4882a593Smuzhiyun }
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun static inline int __must_check
__kfifo_int_must_check_helper(int val)169*4882a593Smuzhiyun __kfifo_int_must_check_helper(int val)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun 	return val;
172*4882a593Smuzhiyun }
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun /**
175*4882a593Smuzhiyun  * kfifo_initialized - Check if the fifo is initialized
176*4882a593Smuzhiyun  * @fifo: address of the fifo to check
177*4882a593Smuzhiyun  *
178*4882a593Smuzhiyun  * Return %true if fifo is initialized, otherwise %false.
179*4882a593Smuzhiyun  * Assumes the fifo was 0 before.
180*4882a593Smuzhiyun  */
181*4882a593Smuzhiyun #define kfifo_initialized(fifo) ((fifo)->kfifo.mask)
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /**
184*4882a593Smuzhiyun  * kfifo_esize - returns the size of the element managed by the fifo
185*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
186*4882a593Smuzhiyun  */
187*4882a593Smuzhiyun #define kfifo_esize(fifo)	((fifo)->kfifo.esize)
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun /**
190*4882a593Smuzhiyun  * kfifo_recsize - returns the size of the record length field
191*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
192*4882a593Smuzhiyun  */
193*4882a593Smuzhiyun #define kfifo_recsize(fifo)	(sizeof(*(fifo)->rectype))
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /**
196*4882a593Smuzhiyun  * kfifo_size - returns the size of the fifo in elements
197*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
198*4882a593Smuzhiyun  */
199*4882a593Smuzhiyun #define kfifo_size(fifo)	((fifo)->kfifo.mask + 1)
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun /**
202*4882a593Smuzhiyun  * kfifo_reset - removes the entire fifo content
203*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
204*4882a593Smuzhiyun  *
205*4882a593Smuzhiyun  * Note: usage of kfifo_reset() is dangerous. It should be only called when the
206*4882a593Smuzhiyun  * fifo is exclusived locked or when it is secured that no other thread is
207*4882a593Smuzhiyun  * accessing the fifo.
208*4882a593Smuzhiyun  */
209*4882a593Smuzhiyun #define kfifo_reset(fifo) \
210*4882a593Smuzhiyun (void)({ \
211*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
212*4882a593Smuzhiyun 	__tmp->kfifo.in = __tmp->kfifo.out = 0; \
213*4882a593Smuzhiyun })
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /**
216*4882a593Smuzhiyun  * kfifo_reset_out - skip fifo content
217*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
218*4882a593Smuzhiyun  *
219*4882a593Smuzhiyun  * Note: The usage of kfifo_reset_out() is safe until it will be only called
220*4882a593Smuzhiyun  * from the reader thread and there is only one concurrent reader. Otherwise
221*4882a593Smuzhiyun  * it is dangerous and must be handled in the same way as kfifo_reset().
222*4882a593Smuzhiyun  */
223*4882a593Smuzhiyun #define kfifo_reset_out(fifo)	\
224*4882a593Smuzhiyun (void)({ \
225*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
226*4882a593Smuzhiyun 	__tmp->kfifo.out = __tmp->kfifo.in; \
227*4882a593Smuzhiyun })
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun /**
230*4882a593Smuzhiyun  * kfifo_len - returns the number of used elements in the fifo
231*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
232*4882a593Smuzhiyun  */
233*4882a593Smuzhiyun #define kfifo_len(fifo) \
234*4882a593Smuzhiyun ({ \
235*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmpl = (fifo); \
236*4882a593Smuzhiyun 	__tmpl->kfifo.in - __tmpl->kfifo.out; \
237*4882a593Smuzhiyun })
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /**
240*4882a593Smuzhiyun  * kfifo_is_empty - returns true if the fifo is empty
241*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
242*4882a593Smuzhiyun  */
243*4882a593Smuzhiyun #define	kfifo_is_empty(fifo) \
244*4882a593Smuzhiyun ({ \
245*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmpq = (fifo); \
246*4882a593Smuzhiyun 	__tmpq->kfifo.in == __tmpq->kfifo.out; \
247*4882a593Smuzhiyun })
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /**
250*4882a593Smuzhiyun  * kfifo_is_empty_spinlocked - returns true if the fifo is empty using
251*4882a593Smuzhiyun  * a spinlock for locking
252*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
253*4882a593Smuzhiyun  * @lock: spinlock to be used for locking
254*4882a593Smuzhiyun  */
255*4882a593Smuzhiyun #define kfifo_is_empty_spinlocked(fifo, lock) \
256*4882a593Smuzhiyun ({ \
257*4882a593Smuzhiyun 	unsigned long __flags; \
258*4882a593Smuzhiyun 	bool __ret; \
259*4882a593Smuzhiyun 	spin_lock_irqsave(lock, __flags); \
260*4882a593Smuzhiyun 	__ret = kfifo_is_empty(fifo); \
261*4882a593Smuzhiyun 	spin_unlock_irqrestore(lock, __flags); \
262*4882a593Smuzhiyun 	__ret; \
263*4882a593Smuzhiyun })
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /**
266*4882a593Smuzhiyun  * kfifo_is_empty_spinlocked_noirqsave  - returns true if the fifo is empty
267*4882a593Smuzhiyun  * using a spinlock for locking, doesn't disable interrupts
268*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
269*4882a593Smuzhiyun  * @lock: spinlock to be used for locking
270*4882a593Smuzhiyun  */
271*4882a593Smuzhiyun #define kfifo_is_empty_spinlocked_noirqsave(fifo, lock) \
272*4882a593Smuzhiyun ({ \
273*4882a593Smuzhiyun 	bool __ret; \
274*4882a593Smuzhiyun 	spin_lock(lock); \
275*4882a593Smuzhiyun 	__ret = kfifo_is_empty(fifo); \
276*4882a593Smuzhiyun 	spin_unlock(lock); \
277*4882a593Smuzhiyun 	__ret; \
278*4882a593Smuzhiyun })
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /**
281*4882a593Smuzhiyun  * kfifo_is_full - returns true if the fifo is full
282*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
283*4882a593Smuzhiyun  */
284*4882a593Smuzhiyun #define	kfifo_is_full(fifo) \
285*4882a593Smuzhiyun ({ \
286*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmpq = (fifo); \
287*4882a593Smuzhiyun 	kfifo_len(__tmpq) > __tmpq->kfifo.mask; \
288*4882a593Smuzhiyun })
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /**
291*4882a593Smuzhiyun  * kfifo_avail - returns the number of unused elements in the fifo
292*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
293*4882a593Smuzhiyun  */
294*4882a593Smuzhiyun #define	kfifo_avail(fifo) \
295*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
296*4882a593Smuzhiyun ({ \
297*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmpq = (fifo); \
298*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmpq->rectype); \
299*4882a593Smuzhiyun 	unsigned int __avail = kfifo_size(__tmpq) - kfifo_len(__tmpq); \
300*4882a593Smuzhiyun 	(__recsize) ? ((__avail <= __recsize) ? 0 : \
301*4882a593Smuzhiyun 	__kfifo_max_r(__avail - __recsize, __recsize)) : \
302*4882a593Smuzhiyun 	__avail; \
303*4882a593Smuzhiyun }) \
304*4882a593Smuzhiyun )
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun /**
307*4882a593Smuzhiyun  * kfifo_skip - skip output data
308*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
309*4882a593Smuzhiyun  */
310*4882a593Smuzhiyun #define	kfifo_skip(fifo) \
311*4882a593Smuzhiyun (void)({ \
312*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
313*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
314*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
315*4882a593Smuzhiyun 	if (__recsize) \
316*4882a593Smuzhiyun 		__kfifo_skip_r(__kfifo, __recsize); \
317*4882a593Smuzhiyun 	else \
318*4882a593Smuzhiyun 		__kfifo->out++; \
319*4882a593Smuzhiyun })
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun /**
322*4882a593Smuzhiyun  * kfifo_peek_len - gets the size of the next fifo record
323*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
324*4882a593Smuzhiyun  *
325*4882a593Smuzhiyun  * This function returns the size of the next fifo record in number of bytes.
326*4882a593Smuzhiyun  */
327*4882a593Smuzhiyun #define kfifo_peek_len(fifo) \
328*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
329*4882a593Smuzhiyun ({ \
330*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
331*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
332*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
333*4882a593Smuzhiyun 	(!__recsize) ? kfifo_len(__tmp) * sizeof(*__tmp->type) : \
334*4882a593Smuzhiyun 	__kfifo_len_r(__kfifo, __recsize); \
335*4882a593Smuzhiyun }) \
336*4882a593Smuzhiyun )
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun /**
339*4882a593Smuzhiyun  * kfifo_alloc - dynamically allocates a new fifo buffer
340*4882a593Smuzhiyun  * @fifo: pointer to the fifo
341*4882a593Smuzhiyun  * @size: the number of elements in the fifo, this must be a power of 2
342*4882a593Smuzhiyun  * @gfp_mask: get_free_pages mask, passed to kmalloc()
343*4882a593Smuzhiyun  *
344*4882a593Smuzhiyun  * This macro dynamically allocates a new fifo buffer.
345*4882a593Smuzhiyun  *
346*4882a593Smuzhiyun  * The number of elements will be rounded-up to a power of 2.
347*4882a593Smuzhiyun  * The fifo will be release with kfifo_free().
348*4882a593Smuzhiyun  * Return 0 if no error, otherwise an error code.
349*4882a593Smuzhiyun  */
350*4882a593Smuzhiyun #define kfifo_alloc(fifo, size, gfp_mask) \
351*4882a593Smuzhiyun __kfifo_int_must_check_helper( \
352*4882a593Smuzhiyun ({ \
353*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
354*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
355*4882a593Smuzhiyun 	__is_kfifo_ptr(__tmp) ? \
356*4882a593Smuzhiyun 	__kfifo_alloc(__kfifo, size, sizeof(*__tmp->type), gfp_mask) : \
357*4882a593Smuzhiyun 	-EINVAL; \
358*4882a593Smuzhiyun }) \
359*4882a593Smuzhiyun )
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun /**
362*4882a593Smuzhiyun  * kfifo_free - frees the fifo
363*4882a593Smuzhiyun  * @fifo: the fifo to be freed
364*4882a593Smuzhiyun  */
365*4882a593Smuzhiyun #define kfifo_free(fifo) \
366*4882a593Smuzhiyun ({ \
367*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
368*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
369*4882a593Smuzhiyun 	if (__is_kfifo_ptr(__tmp)) \
370*4882a593Smuzhiyun 		__kfifo_free(__kfifo); \
371*4882a593Smuzhiyun })
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun /**
374*4882a593Smuzhiyun  * kfifo_init - initialize a fifo using a preallocated buffer
375*4882a593Smuzhiyun  * @fifo: the fifo to assign the buffer
376*4882a593Smuzhiyun  * @buffer: the preallocated buffer to be used
377*4882a593Smuzhiyun  * @size: the size of the internal buffer, this have to be a power of 2
378*4882a593Smuzhiyun  *
379*4882a593Smuzhiyun  * This macro initializes a fifo using a preallocated buffer.
380*4882a593Smuzhiyun  *
381*4882a593Smuzhiyun  * The number of elements will be rounded-up to a power of 2.
382*4882a593Smuzhiyun  * Return 0 if no error, otherwise an error code.
383*4882a593Smuzhiyun  */
384*4882a593Smuzhiyun #define kfifo_init(fifo, buffer, size) \
385*4882a593Smuzhiyun ({ \
386*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
387*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
388*4882a593Smuzhiyun 	__is_kfifo_ptr(__tmp) ? \
389*4882a593Smuzhiyun 	__kfifo_init(__kfifo, buffer, size, sizeof(*__tmp->type)) : \
390*4882a593Smuzhiyun 	-EINVAL; \
391*4882a593Smuzhiyun })
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun /**
394*4882a593Smuzhiyun  * kfifo_put - put data into the fifo
395*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
396*4882a593Smuzhiyun  * @val: the data to be added
397*4882a593Smuzhiyun  *
398*4882a593Smuzhiyun  * This macro copies the given value into the fifo.
399*4882a593Smuzhiyun  * It returns 0 if the fifo was full. Otherwise it returns the number
400*4882a593Smuzhiyun  * processed elements.
401*4882a593Smuzhiyun  *
402*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
403*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
404*4882a593Smuzhiyun  */
405*4882a593Smuzhiyun #define	kfifo_put(fifo, val) \
406*4882a593Smuzhiyun ({ \
407*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
408*4882a593Smuzhiyun 	typeof(*__tmp->const_type) __val = (val); \
409*4882a593Smuzhiyun 	unsigned int __ret; \
410*4882a593Smuzhiyun 	size_t __recsize = sizeof(*__tmp->rectype); \
411*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
412*4882a593Smuzhiyun 	if (__recsize) \
413*4882a593Smuzhiyun 		__ret = __kfifo_in_r(__kfifo, &__val, sizeof(__val), \
414*4882a593Smuzhiyun 			__recsize); \
415*4882a593Smuzhiyun 	else { \
416*4882a593Smuzhiyun 		__ret = !kfifo_is_full(__tmp); \
417*4882a593Smuzhiyun 		if (__ret) { \
418*4882a593Smuzhiyun 			(__is_kfifo_ptr(__tmp) ? \
419*4882a593Smuzhiyun 			((typeof(__tmp->type))__kfifo->data) : \
420*4882a593Smuzhiyun 			(__tmp->buf) \
421*4882a593Smuzhiyun 			)[__kfifo->in & __tmp->kfifo.mask] = \
422*4882a593Smuzhiyun 				*(typeof(__tmp->type))&__val; \
423*4882a593Smuzhiyun 			smp_wmb(); \
424*4882a593Smuzhiyun 			__kfifo->in++; \
425*4882a593Smuzhiyun 		} \
426*4882a593Smuzhiyun 	} \
427*4882a593Smuzhiyun 	__ret; \
428*4882a593Smuzhiyun })
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun /**
431*4882a593Smuzhiyun  * kfifo_get - get data from the fifo
432*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
433*4882a593Smuzhiyun  * @val: address where to store the data
434*4882a593Smuzhiyun  *
435*4882a593Smuzhiyun  * This macro reads the data from the fifo.
436*4882a593Smuzhiyun  * It returns 0 if the fifo was empty. Otherwise it returns the number
437*4882a593Smuzhiyun  * processed elements.
438*4882a593Smuzhiyun  *
439*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
440*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
441*4882a593Smuzhiyun  */
442*4882a593Smuzhiyun #define	kfifo_get(fifo, val) \
443*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
444*4882a593Smuzhiyun ({ \
445*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
446*4882a593Smuzhiyun 	typeof(__tmp->ptr) __val = (val); \
447*4882a593Smuzhiyun 	unsigned int __ret; \
448*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
449*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
450*4882a593Smuzhiyun 	if (__recsize) \
451*4882a593Smuzhiyun 		__ret = __kfifo_out_r(__kfifo, __val, sizeof(*__val), \
452*4882a593Smuzhiyun 			__recsize); \
453*4882a593Smuzhiyun 	else { \
454*4882a593Smuzhiyun 		__ret = !kfifo_is_empty(__tmp); \
455*4882a593Smuzhiyun 		if (__ret) { \
456*4882a593Smuzhiyun 			*(typeof(__tmp->type))__val = \
457*4882a593Smuzhiyun 				(__is_kfifo_ptr(__tmp) ? \
458*4882a593Smuzhiyun 				((typeof(__tmp->type))__kfifo->data) : \
459*4882a593Smuzhiyun 				(__tmp->buf) \
460*4882a593Smuzhiyun 				)[__kfifo->out & __tmp->kfifo.mask]; \
461*4882a593Smuzhiyun 			smp_wmb(); \
462*4882a593Smuzhiyun 			__kfifo->out++; \
463*4882a593Smuzhiyun 		} \
464*4882a593Smuzhiyun 	} \
465*4882a593Smuzhiyun 	__ret; \
466*4882a593Smuzhiyun }) \
467*4882a593Smuzhiyun )
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun /**
470*4882a593Smuzhiyun  * kfifo_peek - get data from the fifo without removing
471*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
472*4882a593Smuzhiyun  * @val: address where to store the data
473*4882a593Smuzhiyun  *
474*4882a593Smuzhiyun  * This reads the data from the fifo without removing it from the fifo.
475*4882a593Smuzhiyun  * It returns 0 if the fifo was empty. Otherwise it returns the number
476*4882a593Smuzhiyun  * processed elements.
477*4882a593Smuzhiyun  *
478*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
479*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
480*4882a593Smuzhiyun  */
481*4882a593Smuzhiyun #define	kfifo_peek(fifo, val) \
482*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
483*4882a593Smuzhiyun ({ \
484*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
485*4882a593Smuzhiyun 	typeof(__tmp->ptr) __val = (val); \
486*4882a593Smuzhiyun 	unsigned int __ret; \
487*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
488*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
489*4882a593Smuzhiyun 	if (__recsize) \
490*4882a593Smuzhiyun 		__ret = __kfifo_out_peek_r(__kfifo, __val, sizeof(*__val), \
491*4882a593Smuzhiyun 			__recsize); \
492*4882a593Smuzhiyun 	else { \
493*4882a593Smuzhiyun 		__ret = !kfifo_is_empty(__tmp); \
494*4882a593Smuzhiyun 		if (__ret) { \
495*4882a593Smuzhiyun 			*(typeof(__tmp->type))__val = \
496*4882a593Smuzhiyun 				(__is_kfifo_ptr(__tmp) ? \
497*4882a593Smuzhiyun 				((typeof(__tmp->type))__kfifo->data) : \
498*4882a593Smuzhiyun 				(__tmp->buf) \
499*4882a593Smuzhiyun 				)[__kfifo->out & __tmp->kfifo.mask]; \
500*4882a593Smuzhiyun 			smp_wmb(); \
501*4882a593Smuzhiyun 		} \
502*4882a593Smuzhiyun 	} \
503*4882a593Smuzhiyun 	__ret; \
504*4882a593Smuzhiyun }) \
505*4882a593Smuzhiyun )
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun /**
508*4882a593Smuzhiyun  * kfifo_in - put data into the fifo
509*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
510*4882a593Smuzhiyun  * @buf: the data to be added
511*4882a593Smuzhiyun  * @n: number of elements to be added
512*4882a593Smuzhiyun  *
513*4882a593Smuzhiyun  * This macro copies the given buffer into the fifo and returns the
514*4882a593Smuzhiyun  * number of copied elements.
515*4882a593Smuzhiyun  *
516*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
517*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
518*4882a593Smuzhiyun  */
519*4882a593Smuzhiyun #define	kfifo_in(fifo, buf, n) \
520*4882a593Smuzhiyun ({ \
521*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
522*4882a593Smuzhiyun 	typeof(__tmp->ptr_const) __buf = (buf); \
523*4882a593Smuzhiyun 	unsigned long __n = (n); \
524*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
525*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
526*4882a593Smuzhiyun 	(__recsize) ?\
527*4882a593Smuzhiyun 	__kfifo_in_r(__kfifo, __buf, __n, __recsize) : \
528*4882a593Smuzhiyun 	__kfifo_in(__kfifo, __buf, __n); \
529*4882a593Smuzhiyun })
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun /**
532*4882a593Smuzhiyun  * kfifo_in_spinlocked - put data into the fifo using a spinlock for locking
533*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
534*4882a593Smuzhiyun  * @buf: the data to be added
535*4882a593Smuzhiyun  * @n: number of elements to be added
536*4882a593Smuzhiyun  * @lock: pointer to the spinlock to use for locking
537*4882a593Smuzhiyun  *
538*4882a593Smuzhiyun  * This macro copies the given values buffer into the fifo and returns the
539*4882a593Smuzhiyun  * number of copied elements.
540*4882a593Smuzhiyun  */
541*4882a593Smuzhiyun #define	kfifo_in_spinlocked(fifo, buf, n, lock) \
542*4882a593Smuzhiyun ({ \
543*4882a593Smuzhiyun 	unsigned long __flags; \
544*4882a593Smuzhiyun 	unsigned int __ret; \
545*4882a593Smuzhiyun 	spin_lock_irqsave(lock, __flags); \
546*4882a593Smuzhiyun 	__ret = kfifo_in(fifo, buf, n); \
547*4882a593Smuzhiyun 	spin_unlock_irqrestore(lock, __flags); \
548*4882a593Smuzhiyun 	__ret; \
549*4882a593Smuzhiyun })
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun /**
552*4882a593Smuzhiyun  * kfifo_in_spinlocked_noirqsave - put data into fifo using a spinlock for
553*4882a593Smuzhiyun  * locking, don't disable interrupts
554*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
555*4882a593Smuzhiyun  * @buf: the data to be added
556*4882a593Smuzhiyun  * @n: number of elements to be added
557*4882a593Smuzhiyun  * @lock: pointer to the spinlock to use for locking
558*4882a593Smuzhiyun  *
559*4882a593Smuzhiyun  * This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock()
560*4882a593Smuzhiyun  * for locking and doesn't disable interrupts.
561*4882a593Smuzhiyun  */
562*4882a593Smuzhiyun #define kfifo_in_spinlocked_noirqsave(fifo, buf, n, lock) \
563*4882a593Smuzhiyun ({ \
564*4882a593Smuzhiyun 	unsigned int __ret; \
565*4882a593Smuzhiyun 	spin_lock(lock); \
566*4882a593Smuzhiyun 	__ret = kfifo_in(fifo, buf, n); \
567*4882a593Smuzhiyun 	spin_unlock(lock); \
568*4882a593Smuzhiyun 	__ret; \
569*4882a593Smuzhiyun })
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun /* alias for kfifo_in_spinlocked, will be removed in a future release */
572*4882a593Smuzhiyun #define kfifo_in_locked(fifo, buf, n, lock) \
573*4882a593Smuzhiyun 		kfifo_in_spinlocked(fifo, buf, n, lock)
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun /**
576*4882a593Smuzhiyun  * kfifo_out - get data from the fifo
577*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
578*4882a593Smuzhiyun  * @buf: pointer to the storage buffer
579*4882a593Smuzhiyun  * @n: max. number of elements to get
580*4882a593Smuzhiyun  *
581*4882a593Smuzhiyun  * This macro get some data from the fifo and return the numbers of elements
582*4882a593Smuzhiyun  * copied.
583*4882a593Smuzhiyun  *
584*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
585*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
586*4882a593Smuzhiyun  */
587*4882a593Smuzhiyun #define	kfifo_out(fifo, buf, n) \
588*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
589*4882a593Smuzhiyun ({ \
590*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
591*4882a593Smuzhiyun 	typeof(__tmp->ptr) __buf = (buf); \
592*4882a593Smuzhiyun 	unsigned long __n = (n); \
593*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
594*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
595*4882a593Smuzhiyun 	(__recsize) ?\
596*4882a593Smuzhiyun 	__kfifo_out_r(__kfifo, __buf, __n, __recsize) : \
597*4882a593Smuzhiyun 	__kfifo_out(__kfifo, __buf, __n); \
598*4882a593Smuzhiyun }) \
599*4882a593Smuzhiyun )
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun /**
602*4882a593Smuzhiyun  * kfifo_out_spinlocked - get data from the fifo using a spinlock for locking
603*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
604*4882a593Smuzhiyun  * @buf: pointer to the storage buffer
605*4882a593Smuzhiyun  * @n: max. number of elements to get
606*4882a593Smuzhiyun  * @lock: pointer to the spinlock to use for locking
607*4882a593Smuzhiyun  *
608*4882a593Smuzhiyun  * This macro get the data from the fifo and return the numbers of elements
609*4882a593Smuzhiyun  * copied.
610*4882a593Smuzhiyun  */
611*4882a593Smuzhiyun #define	kfifo_out_spinlocked(fifo, buf, n, lock) \
612*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
613*4882a593Smuzhiyun ({ \
614*4882a593Smuzhiyun 	unsigned long __flags; \
615*4882a593Smuzhiyun 	unsigned int __ret; \
616*4882a593Smuzhiyun 	spin_lock_irqsave(lock, __flags); \
617*4882a593Smuzhiyun 	__ret = kfifo_out(fifo, buf, n); \
618*4882a593Smuzhiyun 	spin_unlock_irqrestore(lock, __flags); \
619*4882a593Smuzhiyun 	__ret; \
620*4882a593Smuzhiyun }) \
621*4882a593Smuzhiyun )
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun /**
624*4882a593Smuzhiyun  * kfifo_out_spinlocked_noirqsave - get data from the fifo using a spinlock
625*4882a593Smuzhiyun  * for locking, don't disable interrupts
626*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
627*4882a593Smuzhiyun  * @buf: pointer to the storage buffer
628*4882a593Smuzhiyun  * @n: max. number of elements to get
629*4882a593Smuzhiyun  * @lock: pointer to the spinlock to use for locking
630*4882a593Smuzhiyun  *
631*4882a593Smuzhiyun  * This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock()
632*4882a593Smuzhiyun  * for locking and doesn't disable interrupts.
633*4882a593Smuzhiyun  */
634*4882a593Smuzhiyun #define kfifo_out_spinlocked_noirqsave(fifo, buf, n, lock) \
635*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
636*4882a593Smuzhiyun ({ \
637*4882a593Smuzhiyun 	unsigned int __ret; \
638*4882a593Smuzhiyun 	spin_lock(lock); \
639*4882a593Smuzhiyun 	__ret = kfifo_out(fifo, buf, n); \
640*4882a593Smuzhiyun 	spin_unlock(lock); \
641*4882a593Smuzhiyun 	__ret; \
642*4882a593Smuzhiyun }) \
643*4882a593Smuzhiyun )
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun /* alias for kfifo_out_spinlocked, will be removed in a future release */
646*4882a593Smuzhiyun #define kfifo_out_locked(fifo, buf, n, lock) \
647*4882a593Smuzhiyun 		kfifo_out_spinlocked(fifo, buf, n, lock)
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun /**
650*4882a593Smuzhiyun  * kfifo_from_user - puts some data from user space into the fifo
651*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
652*4882a593Smuzhiyun  * @from: pointer to the data to be added
653*4882a593Smuzhiyun  * @len: the length of the data to be added
654*4882a593Smuzhiyun  * @copied: pointer to output variable to store the number of copied bytes
655*4882a593Smuzhiyun  *
656*4882a593Smuzhiyun  * This macro copies at most @len bytes from the @from into the
657*4882a593Smuzhiyun  * fifo, depending of the available space and returns -EFAULT/0.
658*4882a593Smuzhiyun  *
659*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
660*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
661*4882a593Smuzhiyun  */
662*4882a593Smuzhiyun #define	kfifo_from_user(fifo, from, len, copied) \
663*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
664*4882a593Smuzhiyun ({ \
665*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
666*4882a593Smuzhiyun 	const void __user *__from = (from); \
667*4882a593Smuzhiyun 	unsigned int __len = (len); \
668*4882a593Smuzhiyun 	unsigned int *__copied = (copied); \
669*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
670*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
671*4882a593Smuzhiyun 	(__recsize) ? \
672*4882a593Smuzhiyun 	__kfifo_from_user_r(__kfifo, __from, __len,  __copied, __recsize) : \
673*4882a593Smuzhiyun 	__kfifo_from_user(__kfifo, __from, __len, __copied); \
674*4882a593Smuzhiyun }) \
675*4882a593Smuzhiyun )
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun /**
678*4882a593Smuzhiyun  * kfifo_to_user - copies data from the fifo into user space
679*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
680*4882a593Smuzhiyun  * @to: where the data must be copied
681*4882a593Smuzhiyun  * @len: the size of the destination buffer
682*4882a593Smuzhiyun  * @copied: pointer to output variable to store the number of copied bytes
683*4882a593Smuzhiyun  *
684*4882a593Smuzhiyun  * This macro copies at most @len bytes from the fifo into the
685*4882a593Smuzhiyun  * @to buffer and returns -EFAULT/0.
686*4882a593Smuzhiyun  *
687*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
688*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
689*4882a593Smuzhiyun  */
690*4882a593Smuzhiyun #define	kfifo_to_user(fifo, to, len, copied) \
691*4882a593Smuzhiyun __kfifo_int_must_check_helper( \
692*4882a593Smuzhiyun ({ \
693*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
694*4882a593Smuzhiyun 	void __user *__to = (to); \
695*4882a593Smuzhiyun 	unsigned int __len = (len); \
696*4882a593Smuzhiyun 	unsigned int *__copied = (copied); \
697*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
698*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
699*4882a593Smuzhiyun 	(__recsize) ? \
700*4882a593Smuzhiyun 	__kfifo_to_user_r(__kfifo, __to, __len, __copied, __recsize) : \
701*4882a593Smuzhiyun 	__kfifo_to_user(__kfifo, __to, __len, __copied); \
702*4882a593Smuzhiyun }) \
703*4882a593Smuzhiyun )
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun /**
706*4882a593Smuzhiyun  * kfifo_dma_in_prepare - setup a scatterlist for DMA input
707*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
708*4882a593Smuzhiyun  * @sgl: pointer to the scatterlist array
709*4882a593Smuzhiyun  * @nents: number of entries in the scatterlist array
710*4882a593Smuzhiyun  * @len: number of elements to transfer
711*4882a593Smuzhiyun  *
712*4882a593Smuzhiyun  * This macro fills a scatterlist for DMA input.
713*4882a593Smuzhiyun  * It returns the number entries in the scatterlist array.
714*4882a593Smuzhiyun  *
715*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
716*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macros.
717*4882a593Smuzhiyun  */
718*4882a593Smuzhiyun #define	kfifo_dma_in_prepare(fifo, sgl, nents, len) \
719*4882a593Smuzhiyun ({ \
720*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
721*4882a593Smuzhiyun 	struct scatterlist *__sgl = (sgl); \
722*4882a593Smuzhiyun 	int __nents = (nents); \
723*4882a593Smuzhiyun 	unsigned int __len = (len); \
724*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
725*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
726*4882a593Smuzhiyun 	(__recsize) ? \
727*4882a593Smuzhiyun 	__kfifo_dma_in_prepare_r(__kfifo, __sgl, __nents, __len, __recsize) : \
728*4882a593Smuzhiyun 	__kfifo_dma_in_prepare(__kfifo, __sgl, __nents, __len); \
729*4882a593Smuzhiyun })
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun /**
732*4882a593Smuzhiyun  * kfifo_dma_in_finish - finish a DMA IN operation
733*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
734*4882a593Smuzhiyun  * @len: number of bytes to received
735*4882a593Smuzhiyun  *
736*4882a593Smuzhiyun  * This macro finish a DMA IN operation. The in counter will be updated by
737*4882a593Smuzhiyun  * the len parameter. No error checking will be done.
738*4882a593Smuzhiyun  *
739*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
740*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macros.
741*4882a593Smuzhiyun  */
742*4882a593Smuzhiyun #define kfifo_dma_in_finish(fifo, len) \
743*4882a593Smuzhiyun (void)({ \
744*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
745*4882a593Smuzhiyun 	unsigned int __len = (len); \
746*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
747*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
748*4882a593Smuzhiyun 	if (__recsize) \
749*4882a593Smuzhiyun 		__kfifo_dma_in_finish_r(__kfifo, __len, __recsize); \
750*4882a593Smuzhiyun 	else \
751*4882a593Smuzhiyun 		__kfifo->in += __len / sizeof(*__tmp->type); \
752*4882a593Smuzhiyun })
753*4882a593Smuzhiyun 
754*4882a593Smuzhiyun /**
755*4882a593Smuzhiyun  * kfifo_dma_out_prepare - setup a scatterlist for DMA output
756*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
757*4882a593Smuzhiyun  * @sgl: pointer to the scatterlist array
758*4882a593Smuzhiyun  * @nents: number of entries in the scatterlist array
759*4882a593Smuzhiyun  * @len: number of elements to transfer
760*4882a593Smuzhiyun  *
761*4882a593Smuzhiyun  * This macro fills a scatterlist for DMA output which at most @len bytes
762*4882a593Smuzhiyun  * to transfer.
763*4882a593Smuzhiyun  * It returns the number entries in the scatterlist array.
764*4882a593Smuzhiyun  * A zero means there is no space available and the scatterlist is not filled.
765*4882a593Smuzhiyun  *
766*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
767*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macros.
768*4882a593Smuzhiyun  */
769*4882a593Smuzhiyun #define	kfifo_dma_out_prepare(fifo, sgl, nents, len) \
770*4882a593Smuzhiyun ({ \
771*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo);  \
772*4882a593Smuzhiyun 	struct scatterlist *__sgl = (sgl); \
773*4882a593Smuzhiyun 	int __nents = (nents); \
774*4882a593Smuzhiyun 	unsigned int __len = (len); \
775*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
776*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
777*4882a593Smuzhiyun 	(__recsize) ? \
778*4882a593Smuzhiyun 	__kfifo_dma_out_prepare_r(__kfifo, __sgl, __nents, __len, __recsize) : \
779*4882a593Smuzhiyun 	__kfifo_dma_out_prepare(__kfifo, __sgl, __nents, __len); \
780*4882a593Smuzhiyun })
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun /**
783*4882a593Smuzhiyun  * kfifo_dma_out_finish - finish a DMA OUT operation
784*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
785*4882a593Smuzhiyun  * @len: number of bytes transferred
786*4882a593Smuzhiyun  *
787*4882a593Smuzhiyun  * This macro finish a DMA OUT operation. The out counter will be updated by
788*4882a593Smuzhiyun  * the len parameter. No error checking will be done.
789*4882a593Smuzhiyun  *
790*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
791*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macros.
792*4882a593Smuzhiyun  */
793*4882a593Smuzhiyun #define kfifo_dma_out_finish(fifo, len) \
794*4882a593Smuzhiyun (void)({ \
795*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
796*4882a593Smuzhiyun 	unsigned int __len = (len); \
797*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
798*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
799*4882a593Smuzhiyun 	if (__recsize) \
800*4882a593Smuzhiyun 		__kfifo_dma_out_finish_r(__kfifo, __recsize); \
801*4882a593Smuzhiyun 	else \
802*4882a593Smuzhiyun 		__kfifo->out += __len / sizeof(*__tmp->type); \
803*4882a593Smuzhiyun })
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun /**
806*4882a593Smuzhiyun  * kfifo_out_peek - gets some data from the fifo
807*4882a593Smuzhiyun  * @fifo: address of the fifo to be used
808*4882a593Smuzhiyun  * @buf: pointer to the storage buffer
809*4882a593Smuzhiyun  * @n: max. number of elements to get
810*4882a593Smuzhiyun  *
811*4882a593Smuzhiyun  * This macro get the data from the fifo and return the numbers of elements
812*4882a593Smuzhiyun  * copied. The data is not removed from the fifo.
813*4882a593Smuzhiyun  *
814*4882a593Smuzhiyun  * Note that with only one concurrent reader and one concurrent
815*4882a593Smuzhiyun  * writer, you don't need extra locking to use these macro.
816*4882a593Smuzhiyun  */
817*4882a593Smuzhiyun #define	kfifo_out_peek(fifo, buf, n) \
818*4882a593Smuzhiyun __kfifo_uint_must_check_helper( \
819*4882a593Smuzhiyun ({ \
820*4882a593Smuzhiyun 	typeof((fifo) + 1) __tmp = (fifo); \
821*4882a593Smuzhiyun 	typeof(__tmp->ptr) __buf = (buf); \
822*4882a593Smuzhiyun 	unsigned long __n = (n); \
823*4882a593Smuzhiyun 	const size_t __recsize = sizeof(*__tmp->rectype); \
824*4882a593Smuzhiyun 	struct __kfifo *__kfifo = &__tmp->kfifo; \
825*4882a593Smuzhiyun 	(__recsize) ? \
826*4882a593Smuzhiyun 	__kfifo_out_peek_r(__kfifo, __buf, __n, __recsize) : \
827*4882a593Smuzhiyun 	__kfifo_out_peek(__kfifo, __buf, __n); \
828*4882a593Smuzhiyun }) \
829*4882a593Smuzhiyun )
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun extern int __kfifo_alloc(struct __kfifo *fifo, unsigned int size,
832*4882a593Smuzhiyun 	size_t esize, gfp_t gfp_mask);
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun extern void __kfifo_free(struct __kfifo *fifo);
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun extern int __kfifo_init(struct __kfifo *fifo, void *buffer,
837*4882a593Smuzhiyun 	unsigned int size, size_t esize);
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun extern unsigned int __kfifo_in(struct __kfifo *fifo,
840*4882a593Smuzhiyun 	const void *buf, unsigned int len);
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun extern unsigned int __kfifo_out(struct __kfifo *fifo,
843*4882a593Smuzhiyun 	void *buf, unsigned int len);
844*4882a593Smuzhiyun 
845*4882a593Smuzhiyun extern int __kfifo_from_user(struct __kfifo *fifo,
846*4882a593Smuzhiyun 	const void __user *from, unsigned long len, unsigned int *copied);
847*4882a593Smuzhiyun 
848*4882a593Smuzhiyun extern int __kfifo_to_user(struct __kfifo *fifo,
849*4882a593Smuzhiyun 	void __user *to, unsigned long len, unsigned int *copied);
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun extern unsigned int __kfifo_dma_in_prepare(struct __kfifo *fifo,
852*4882a593Smuzhiyun 	struct scatterlist *sgl, int nents, unsigned int len);
853*4882a593Smuzhiyun 
854*4882a593Smuzhiyun extern unsigned int __kfifo_dma_out_prepare(struct __kfifo *fifo,
855*4882a593Smuzhiyun 	struct scatterlist *sgl, int nents, unsigned int len);
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun extern unsigned int __kfifo_out_peek(struct __kfifo *fifo,
858*4882a593Smuzhiyun 	void *buf, unsigned int len);
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun extern unsigned int __kfifo_in_r(struct __kfifo *fifo,
861*4882a593Smuzhiyun 	const void *buf, unsigned int len, size_t recsize);
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun extern unsigned int __kfifo_out_r(struct __kfifo *fifo,
864*4882a593Smuzhiyun 	void *buf, unsigned int len, size_t recsize);
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun extern int __kfifo_from_user_r(struct __kfifo *fifo,
867*4882a593Smuzhiyun 	const void __user *from, unsigned long len, unsigned int *copied,
868*4882a593Smuzhiyun 	size_t recsize);
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun extern int __kfifo_to_user_r(struct __kfifo *fifo, void __user *to,
871*4882a593Smuzhiyun 	unsigned long len, unsigned int *copied, size_t recsize);
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun extern unsigned int __kfifo_dma_in_prepare_r(struct __kfifo *fifo,
874*4882a593Smuzhiyun 	struct scatterlist *sgl, int nents, unsigned int len, size_t recsize);
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun extern void __kfifo_dma_in_finish_r(struct __kfifo *fifo,
877*4882a593Smuzhiyun 	unsigned int len, size_t recsize);
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun extern unsigned int __kfifo_dma_out_prepare_r(struct __kfifo *fifo,
880*4882a593Smuzhiyun 	struct scatterlist *sgl, int nents, unsigned int len, size_t recsize);
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun extern void __kfifo_dma_out_finish_r(struct __kfifo *fifo, size_t recsize);
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun extern unsigned int __kfifo_len_r(struct __kfifo *fifo, size_t recsize);
885*4882a593Smuzhiyun 
886*4882a593Smuzhiyun extern void __kfifo_skip_r(struct __kfifo *fifo, size_t recsize);
887*4882a593Smuzhiyun 
888*4882a593Smuzhiyun extern unsigned int __kfifo_out_peek_r(struct __kfifo *fifo,
889*4882a593Smuzhiyun 	void *buf, unsigned int len, size_t recsize);
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun extern unsigned int __kfifo_max_r(unsigned int len, size_t recsize);
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun #endif
894