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