root/drivers/staging/media/atomisp/pci/base/circbuf/interface/ia_css_circbuf_comm.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Support for Intel Camera Imaging ISP subsystem.
 * Copyright (c) 2015, Intel Corporation.
 */

#ifndef _IA_CSS_CIRCBUF_COMM_H
#define _IA_CSS_CIRCBUF_COMM_H

#include <linux/build_bug.h>

#include <type_support.h>  /* uint8_t, uint32_t */

#define IA_CSS_CIRCBUF_PADDING 1 /* The circular buffer is implemented in lock-less manner, wherein
                                   * the head and tail can advance independently without any locks.
                                   * But to achieve this, an extra buffer element is required to detect
                                   * queue full & empty conditions, wherein the tail trails the head for
                                   * full and is equal to head for empty condition. This causes 1 buffer
                                   * not being available for use.
                                   */

/****************************************************************
 *
 * Portable Data structures
 *
 ****************************************************************/
/**
 * @brief Data structure for the circular descriptor.
 */
typedef struct ia_css_circbuf_desc_s ia_css_circbuf_desc_t;
struct ia_css_circbuf_desc_s {
        u8 size;        /* the maximum number of elements*/
        u8 step;   /* number of bytes per element */
        u8 start;       /* index of the oldest element */
        u8 end; /* index at which to write the new element */
};

#define SIZE_OF_IA_CSS_CIRCBUF_DESC_S_STRUCT                            \
        (4 * sizeof(uint8_t))

static_assert(sizeof(struct ia_css_circbuf_desc_s) == SIZE_OF_IA_CSS_CIRCBUF_DESC_S_STRUCT);

/**
 * @brief Data structure for the circular buffer element.
 */
typedef struct ia_css_circbuf_elem_s ia_css_circbuf_elem_t;
struct ia_css_circbuf_elem_s {
        u32 val;        /* the value stored in the element */
};

#define SIZE_OF_IA_CSS_CIRCBUF_ELEM_S_STRUCT                            \
        (sizeof(uint32_t))

static_assert(sizeof(struct ia_css_circbuf_elem_s) == SIZE_OF_IA_CSS_CIRCBUF_ELEM_S_STRUCT);

#endif /*_IA_CSS_CIRCBUF_COMM_H*/