xref: /dpdk/drivers/net/avp/rte_avp_fifo.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
150da8b0dSAllain Legacy /* SPDX-License-Identifier: (BSD-3-Clause OR LGPL-2.1)
250da8b0dSAllain Legacy  * Copyright(c) 2010-2013 Intel Corporation.
350da8b0dSAllain Legacy  * Copyright(c) 2013-2017 Wind River Systems, Inc.
48e680655SAllain Legacy  */
58e680655SAllain Legacy 
68e680655SAllain Legacy #ifndef _RTE_AVP_FIFO_H_
78e680655SAllain Legacy #define _RTE_AVP_FIFO_H_
88e680655SAllain Legacy 
980fcb5caSAdrien Mazarguil #include "rte_avp_common.h"
1080fcb5caSAdrien Mazarguil 
118e680655SAllain Legacy #ifdef __KERNEL__
128e680655SAllain Legacy /* Write memory barrier for kernel compiles */
138e680655SAllain Legacy #define AVP_WMB() smp_wmb()
148e680655SAllain Legacy /* Read memory barrier for kernel compiles */
158e680655SAllain Legacy #define AVP_RMB() smp_rmb()
168e680655SAllain Legacy #else
178e680655SAllain Legacy /* Write memory barrier for userspace compiles */
188e680655SAllain Legacy #define AVP_WMB() rte_wmb()
198e680655SAllain Legacy /* Read memory barrier for userspace compiles */
208e680655SAllain Legacy #define AVP_RMB() rte_rmb()
218e680655SAllain Legacy #endif
228e680655SAllain Legacy 
238e680655SAllain Legacy #ifndef __KERNEL__
2480fcb5caSAdrien Mazarguil #include <rte_debug.h>
2580fcb5caSAdrien Mazarguil 
26*719834a6SMattias Rönnblom #ifdef __cplusplus
27*719834a6SMattias Rönnblom extern "C" {
28*719834a6SMattias Rönnblom #endif
29*719834a6SMattias Rönnblom 
308e680655SAllain Legacy /**
318e680655SAllain Legacy  * Initializes the avp fifo structure
328e680655SAllain Legacy  */
338e680655SAllain Legacy static inline void
348e680655SAllain Legacy avp_fifo_init(struct rte_avp_fifo *fifo, unsigned int size)
358e680655SAllain Legacy {
368e680655SAllain Legacy 	/* Ensure size is power of 2 */
378e680655SAllain Legacy 	if (size & (size - 1))
388e680655SAllain Legacy 		rte_panic("AVP fifo size must be power of 2\n");
398e680655SAllain Legacy 
408e680655SAllain Legacy 	fifo->write = 0;
418e680655SAllain Legacy 	fifo->read = 0;
428e680655SAllain Legacy 	fifo->len = size;
438e680655SAllain Legacy 	fifo->elem_size = sizeof(void *);
448e680655SAllain Legacy }
458e680655SAllain Legacy #endif
468e680655SAllain Legacy 
478e680655SAllain Legacy /**
488e680655SAllain Legacy  * Adds num elements into the fifo. Return the number actually written
498e680655SAllain Legacy  */
508e680655SAllain Legacy static inline unsigned
518e680655SAllain Legacy avp_fifo_put(struct rte_avp_fifo *fifo, void **data, unsigned int num)
528e680655SAllain Legacy {
538e680655SAllain Legacy 	unsigned int i = 0;
548e680655SAllain Legacy 	unsigned int fifo_write = fifo->write;
558e680655SAllain Legacy 	unsigned int fifo_read = fifo->read;
568e680655SAllain Legacy 	unsigned int new_write = fifo_write;
578e680655SAllain Legacy 
588e680655SAllain Legacy 	for (i = 0; i < num; i++) {
598e680655SAllain Legacy 		new_write = (new_write + 1) & (fifo->len - 1);
608e680655SAllain Legacy 
618e680655SAllain Legacy 		if (new_write == fifo_read)
628e680655SAllain Legacy 			break;
638e680655SAllain Legacy 		fifo->buffer[fifo_write] = data[i];
648e680655SAllain Legacy 		fifo_write = new_write;
658e680655SAllain Legacy 	}
668e680655SAllain Legacy 	AVP_WMB();
678e680655SAllain Legacy 	fifo->write = fifo_write;
688e680655SAllain Legacy 	return i;
698e680655SAllain Legacy }
708e680655SAllain Legacy 
718e680655SAllain Legacy /**
728e680655SAllain Legacy  * Get up to num elements from the fifo. Return the number actually read
738e680655SAllain Legacy  */
748e680655SAllain Legacy static inline unsigned int
758e680655SAllain Legacy avp_fifo_get(struct rte_avp_fifo *fifo, void **data, unsigned int num)
768e680655SAllain Legacy {
778e680655SAllain Legacy 	unsigned int i = 0;
788e680655SAllain Legacy 	unsigned int new_read = fifo->read;
798e680655SAllain Legacy 	unsigned int fifo_write = fifo->write;
808e680655SAllain Legacy 
818e680655SAllain Legacy 	if (new_read == fifo_write)
828e680655SAllain Legacy 		return 0; /* empty */
838e680655SAllain Legacy 
848e680655SAllain Legacy 	for (i = 0; i < num; i++) {
858e680655SAllain Legacy 		if (new_read == fifo_write)
868e680655SAllain Legacy 			break;
878e680655SAllain Legacy 
888e680655SAllain Legacy 		data[i] = fifo->buffer[new_read];
898e680655SAllain Legacy 		new_read = (new_read + 1) & (fifo->len - 1);
908e680655SAllain Legacy 	}
918e680655SAllain Legacy 	AVP_RMB();
928e680655SAllain Legacy 	fifo->read = new_read;
938e680655SAllain Legacy 	return i;
948e680655SAllain Legacy }
958e680655SAllain Legacy 
968e680655SAllain Legacy /**
978e680655SAllain Legacy  * Get the num of elements in the fifo
988e680655SAllain Legacy  */
998e680655SAllain Legacy static inline unsigned int
1008e680655SAllain Legacy avp_fifo_count(struct rte_avp_fifo *fifo)
1018e680655SAllain Legacy {
1028e680655SAllain Legacy 	return (fifo->len + fifo->write - fifo->read) & (fifo->len - 1);
1038e680655SAllain Legacy }
1048e680655SAllain Legacy 
1058e680655SAllain Legacy /**
1068e680655SAllain Legacy  * Get the num of available elements in the fifo
1078e680655SAllain Legacy  */
1088e680655SAllain Legacy static inline unsigned int
1098e680655SAllain Legacy avp_fifo_free_count(struct rte_avp_fifo *fifo)
1108e680655SAllain Legacy {
1118e680655SAllain Legacy 	return (fifo->read - fifo->write - 1) & (fifo->len - 1);
1128e680655SAllain Legacy }
1138e680655SAllain Legacy 
11480fcb5caSAdrien Mazarguil #ifdef __cplusplus
11580fcb5caSAdrien Mazarguil }
11680fcb5caSAdrien Mazarguil #endif
11780fcb5caSAdrien Mazarguil 
1188e680655SAllain Legacy #endif /* _RTE_AVP_FIFO_H_ */
119