/* * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2019 Western Digital Corporation or its affiliates. * * Authors: * Atish Patra * */ #ifndef __SBI_FIFO_H__ #define __SBI_FIFO_H__ #include #include struct sbi_fifo { void *queue; spinlock_t qlock; u16 entry_size; u16 num_entries; u16 avail; u16 tail; }; #define SBI_FIFO_INITIALIZER(__queue_mem, __entries, __entry_size) \ { .queue = __queue_mem, \ .qlock = SPIN_LOCK_INITIALIZER, \ .num_entries = __entries, \ .entry_size = __entry_size, \ .avail = 0, \ .tail = 0, \ } #define SBI_FIFO_DEFINE(__name, __queue_mem, __entries, __entry_size) \ struct sbi_fifo __name = SBI_FIFO_INITIALIZER(__queue_mem, __entries, __entry_size) enum sbi_fifo_inplace_update_types { SBI_FIFO_SKIP, SBI_FIFO_UPDATED, SBI_FIFO_UNCHANGED, }; int sbi_fifo_dequeue(struct sbi_fifo *fifo, void *data); int sbi_fifo_enqueue(struct sbi_fifo *fifo, void *data, bool force); void sbi_fifo_init(struct sbi_fifo *fifo, void *queue_mem, u16 entries, u16 entry_size); int sbi_fifo_is_empty(struct sbi_fifo *fifo); int sbi_fifo_is_full(struct sbi_fifo *fifo); int sbi_fifo_inplace_update(struct sbi_fifo *fifo, void *in, int (*fptr)(void *in, void *data)); u16 sbi_fifo_avail(struct sbi_fifo *fifo); #endif