| /* 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. |
| */ |
| |
| #ifndef _IA_CSS_CIRCBUF_DESC_H_ |
| #define _IA_CSS_CIRCBUF_DESC_H_ |
| |
| #include <type_support.h> |
| #include <math_support.h> |
| #include <platform_support.h> |
| #include <sp.h> |
| #include "ia_css_circbuf_comm.h" |
| /**************************************************************** |
| * |
| * Inline functions. |
| * |
| ****************************************************************/ |
| /** |
| * @brief Test if the circular buffer is empty. |
| * |
| * @param cb_desc The pointer to the circular buffer descriptor. |
| * |
| * @return |
| * - true when it is empty. |
| * - false when it is not empty. |
| */ |
| static inline bool ia_css_circbuf_desc_is_empty( |
| ia_css_circbuf_desc_t *cb_desc) |
| { |
| OP___assert(cb_desc); |
| return (cb_desc->end == cb_desc->start); |
| } |
| |
| /** |
| * @brief Test if the circular buffer descriptor is full. |
| * |
| * @param cb_desc The pointer to the circular buffer |
| * descriptor. |
| * |
| * @return |
| * - true when it is full. |
| * - false when it is not full. |
| */ |
| static inline bool ia_css_circbuf_desc_is_full( |
| ia_css_circbuf_desc_t *cb_desc) |
| { |
| OP___assert(cb_desc); |
| return (OP_std_modadd(cb_desc->end, 1, cb_desc->size) == cb_desc->start); |
| } |
| |
| /** |
| * @brief Initialize the circular buffer descriptor |
| * |
| * @param cb_desc The pointer circular buffer descriptor |
| * @param size The size of the circular buffer |
| */ |
| static inline void ia_css_circbuf_desc_init( |
| ia_css_circbuf_desc_t *cb_desc, |
| int8_t size) |
| { |
| OP___assert(cb_desc); |
| cb_desc->size = size; |
| } |
| |
| /** |
| * @brief Get a position in the circular buffer descriptor. |
| * |
| * @param cb The pointer to the circular buffer descriptor. |
| * @param base The base position. |
| * @param offset The offset. |
| * |
| * @return the position in the circular buffer descriptor. |
| */ |
| static inline uint8_t ia_css_circbuf_desc_get_pos_at_offset( |
| ia_css_circbuf_desc_t *cb_desc, |
| u32 base, |
| int offset) |
| { |
| u8 dest; |
| |
| OP___assert(cb_desc); |
| OP___assert(cb_desc->size > 0); |
| |
| /* step 1: adjust the offset */ |
| while (offset < 0) { |
| offset += cb_desc->size; |
| } |
| |
| /* step 2: shift and round by the upper limit */ |
| dest = OP_std_modadd(base, offset, cb_desc->size); |
| |
| return dest; |
| } |
| |
| /** |
| * @brief Get the offset between two positions in the circular buffer |
| * descriptor. |
| * Get the offset from the source position to the terminal position, |
| * along the direction in which the new elements come in. |
| * |
| * @param cb_desc The pointer to the circular buffer descriptor. |
| * @param src_pos The source position. |
| * @param dest_pos The terminal position. |
| * |
| * @return the offset. |
| */ |
| static inline int ia_css_circbuf_desc_get_offset( |
| ia_css_circbuf_desc_t *cb_desc, |
| u32 src_pos, |
| uint32_t dest_pos) |
| { |
| int offset; |
| |
| OP___assert(cb_desc); |
| |
| offset = (int)(dest_pos - src_pos); |
| offset += (offset < 0) ? cb_desc->size : 0; |
| |
| return offset; |
| } |
| |
| /** |
| * @brief Get the number of available elements. |
| * |
| * @param cb_desc The pointer to the circular buffer. |
| * |
| * @return The number of available elements. |
| */ |
| static inline uint32_t ia_css_circbuf_desc_get_num_elems( |
| ia_css_circbuf_desc_t *cb_desc) |
| { |
| int num; |
| |
| OP___assert(cb_desc); |
| |
| num = ia_css_circbuf_desc_get_offset(cb_desc, |
| cb_desc->start, |
| cb_desc->end); |
| |
| return (uint32_t)num; |
| } |
| |
| /** |
| * @brief Get the number of free elements. |
| * |
| * @param cb_desc The pointer to the circular buffer descriptor. |
| * |
| * @return: The number of free elements. |
| */ |
| static inline uint32_t ia_css_circbuf_desc_get_free_elems( |
| ia_css_circbuf_desc_t *cb_desc) |
| { |
| u32 num; |
| |
| OP___assert(cb_desc); |
| |
| num = ia_css_circbuf_desc_get_offset(cb_desc, |
| cb_desc->start, |
| cb_desc->end); |
| |
| return (cb_desc->size - num); |
| } |
| #endif /*_IA_CSS_CIRCBUF_DESC_H_ */ |