// SPDX-License-Identifier: GPL-2.0 /* * Support for Intel Camera Imaging ISP subsystem. * Copyright (c) 2015, Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. */ #include "ia_css_circbuf.h" #include <assert_support.h> /********************************************************************** * * Forward declarations. * **********************************************************************/ /* * @brief Read the oldest element from the circular buffer. * Read the oldest element WITHOUT checking whether the * circular buffer is empty or not. The oldest element is * also removed out from the circular buffer. * * @param cb The pointer to the circular buffer. * * @return the oldest element. */ static inline ia_css_circbuf_elem_t ia_css_circbuf_read(ia_css_circbuf_t *cb); /* * @brief Shift a chunk of elements in the circular buffer. * A chunk of elements (i.e. the ones from the "start" position * to the "chunk_src" position) are shifted in the circular buffer, * along the direction of new elements coming. * * @param cb The pointer to the circular buffer. * @param chunk_src The position at which the first element in the chunk is. * @param chunk_dest The position to which the first element in the chunk would be shift. */ static inline void ia_css_circbuf_shift_chunk(ia_css_circbuf_t *cb, u32 chunk_src, uint32_t chunk_dest); /* * @brief Get the "val" field in the element. * * @param elem The pointer to the element. * * @return the "val" field. */ static inline uint32_t ia_css_circbuf_elem_get_val(ia_css_circbuf_elem_t *elem); /********************************************************************** * * Non-inline functions. * **********************************************************************/ /* * @brief Create the circular buffer. * Refer to "ia_css_circbuf.h" for details. */ void ia_css_circbuf_create(ia_css_circbuf_t *cb, ia_css_circbuf_elem_t *elems, ia_css_circbuf_desc_t *desc) { … } /* * @brief Destroy the circular buffer. * Refer to "ia_css_circbuf.h" for details. */ void ia_css_circbuf_destroy(ia_css_circbuf_t *cb) { … } /* * @brief Pop a value out of the circular buffer. * Refer to "ia_css_circbuf.h" for details. */ uint32_t ia_css_circbuf_pop(ia_css_circbuf_t *cb) { … } /* * @brief Extract a value out of the circular buffer. * Refer to "ia_css_circbuf.h" for details. */ uint32_t ia_css_circbuf_extract(ia_css_circbuf_t *cb, int offset) { … } /* * @brief Peek an element from the circular buffer. * Refer to "ia_css_circbuf.h" for details. */ uint32_t ia_css_circbuf_peek(ia_css_circbuf_t *cb, int offset) { … } /* * @brief Get the value of an element from the circular buffer. * Refer to "ia_css_circbuf.h" for details. */ uint32_t ia_css_circbuf_peek_from_start(ia_css_circbuf_t *cb, int offset) { … } /* @brief increase size of a circular buffer. * Use 'CAUTION' before using this function. This was added to * support / fix issue with increasing size for tagger only * Please refer to "ia_css_circbuf.h" for details. */ bool ia_css_circbuf_increase_size( ia_css_circbuf_t *cb, unsigned int sz_delta, ia_css_circbuf_elem_t *elems) { … } /**************************************************************** * * Inline functions. * ****************************************************************/ /* * @brief Get the "val" field in the element. * Refer to "Forward declarations" for details. */ static inline uint32_t ia_css_circbuf_elem_get_val(ia_css_circbuf_elem_t *elem) { … } /* * @brief Read the oldest element from the circular buffer. * Refer to "Forward declarations" for details. */ static inline ia_css_circbuf_elem_t ia_css_circbuf_read(ia_css_circbuf_t *cb) { … } /* * @brief Shift a chunk of elements in the circular buffer. * Refer to "Forward declarations" for details. */ static inline void ia_css_circbuf_shift_chunk(ia_css_circbuf_t *cb, u32 chunk_src, uint32_t chunk_dest) { … }