blob: a8447d409c312cff8f71055f16b723764ee6ffb2 [file] [log] [blame]
/*
* 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 <storage_class.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.
*/
STORAGE_CLASS_INLINE bool ia_css_circbuf_desc_is_empty(
ia_css_circbuf_desc_t *cb_desc)
{
OP___assert(cb_desc != NULL);
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.
*/
STORAGE_CLASS_INLINE bool ia_css_circbuf_desc_is_full(
ia_css_circbuf_desc_t *cb_desc)
{
OP___assert(cb_desc != NULL);
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
*/
STORAGE_CLASS_INLINE void ia_css_circbuf_desc_init(
ia_css_circbuf_desc_t *cb_desc,
int8_t size)
{
OP___assert(cb_desc != NULL);
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.
*/
STORAGE_CLASS_INLINE uint8_t ia_css_circbuf_desc_get_pos_at_offset(
ia_css_circbuf_desc_t *cb_desc,
uint32_t base,
int offset)
{
uint8_t dest;
OP___assert(cb_desc != NULL);
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.
*/
STORAGE_CLASS_INLINE int ia_css_circbuf_desc_get_offset(
ia_css_circbuf_desc_t *cb_desc,
uint32_t src_pos,
uint32_t dest_pos)
{
int offset;
OP___assert(cb_desc != NULL);
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.
*/
STORAGE_CLASS_INLINE uint32_t ia_css_circbuf_desc_get_num_elems(
ia_css_circbuf_desc_t *cb_desc)
{
int num;
OP___assert(cb_desc != NULL);
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.
*/
STORAGE_CLASS_INLINE uint32_t ia_css_circbuf_desc_get_free_elems(
ia_css_circbuf_desc_t *cb_desc)
{
uint32_t num;
OP___assert(cb_desc != NULL);
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_ */