1f5fbb83fSMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0 */
29d4fa1a1SMauro Carvalho Chehab /*
39d4fa1a1SMauro Carvalho Chehab  * Support for Intel Camera Imaging ISP subsystem.
49d4fa1a1SMauro Carvalho Chehab  * Copyright (c) 2015, Intel Corporation.
59d4fa1a1SMauro Carvalho Chehab  *
69d4fa1a1SMauro Carvalho Chehab  * This program is free software; you can redistribute it and/or modify it
79d4fa1a1SMauro Carvalho Chehab  * under the terms and conditions of the GNU General Public License,
89d4fa1a1SMauro Carvalho Chehab  * version 2, as published by the Free Software Foundation.
99d4fa1a1SMauro Carvalho Chehab  *
109d4fa1a1SMauro Carvalho Chehab  * This program is distributed in the hope it will be useful, but WITHOUT
119d4fa1a1SMauro Carvalho Chehab  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
129d4fa1a1SMauro Carvalho Chehab  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
139d4fa1a1SMauro Carvalho Chehab  * more details.
149d4fa1a1SMauro Carvalho Chehab  */
159d4fa1a1SMauro Carvalho Chehab 
169d4fa1a1SMauro Carvalho Chehab #ifndef _IA_CSS_CIRCBUF_COMM_H
179d4fa1a1SMauro Carvalho Chehab #define _IA_CSS_CIRCBUF_COMM_H
189d4fa1a1SMauro Carvalho Chehab 
199d4fa1a1SMauro Carvalho Chehab #include <type_support.h>  /* uint8_t, uint32_t */
209d4fa1a1SMauro Carvalho Chehab 
219d4fa1a1SMauro Carvalho Chehab #define IA_CSS_CIRCBUF_PADDING 1 /* The circular buffer is implemented in lock-less manner, wherein
229d4fa1a1SMauro Carvalho Chehab 				   * the head and tail can advance independently without any locks.
239d4fa1a1SMauro Carvalho Chehab 				   * But to achieve this, an extra buffer element is required to detect
249d4fa1a1SMauro Carvalho Chehab 				   * queue full & empty conditions, wherein the tail trails the head for
259d4fa1a1SMauro Carvalho Chehab 				   * full and is equal to head for empty condition. This causes 1 buffer
269d4fa1a1SMauro Carvalho Chehab 				   * not being available for use.
279d4fa1a1SMauro Carvalho Chehab 				   */
289d4fa1a1SMauro Carvalho Chehab 
299d4fa1a1SMauro Carvalho Chehab /****************************************************************
309d4fa1a1SMauro Carvalho Chehab  *
319d4fa1a1SMauro Carvalho Chehab  * Portable Data structures
329d4fa1a1SMauro Carvalho Chehab  *
339d4fa1a1SMauro Carvalho Chehab  ****************************************************************/
349d4fa1a1SMauro Carvalho Chehab /**
359d4fa1a1SMauro Carvalho Chehab  * @brief Data structure for the circular descriptor.
369d4fa1a1SMauro Carvalho Chehab  */
379d4fa1a1SMauro Carvalho Chehab typedef struct ia_css_circbuf_desc_s ia_css_circbuf_desc_t;
389d4fa1a1SMauro Carvalho Chehab struct ia_css_circbuf_desc_s {
399d4fa1a1SMauro Carvalho Chehab 	u8 size;	/* the maximum number of elements*/
409d4fa1a1SMauro Carvalho Chehab 	u8 step;   /* number of bytes per element */
419d4fa1a1SMauro Carvalho Chehab 	u8 start;	/* index of the oldest element */
429d4fa1a1SMauro Carvalho Chehab 	u8 end;	/* index at which to write the new element */
439d4fa1a1SMauro Carvalho Chehab };
449d4fa1a1SMauro Carvalho Chehab 
459d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_IA_CSS_CIRCBUF_DESC_S_STRUCT				\
469d4fa1a1SMauro Carvalho Chehab 	(4 * sizeof(uint8_t))
479d4fa1a1SMauro Carvalho Chehab 
489d4fa1a1SMauro Carvalho Chehab /**
499d4fa1a1SMauro Carvalho Chehab  * @brief Data structure for the circular buffer element.
509d4fa1a1SMauro Carvalho Chehab  */
519d4fa1a1SMauro Carvalho Chehab typedef struct ia_css_circbuf_elem_s ia_css_circbuf_elem_t;
529d4fa1a1SMauro Carvalho Chehab struct ia_css_circbuf_elem_s {
539d4fa1a1SMauro Carvalho Chehab 	u32 val;	/* the value stored in the element */
549d4fa1a1SMauro Carvalho Chehab };
559d4fa1a1SMauro Carvalho Chehab 
569d4fa1a1SMauro Carvalho Chehab #define SIZE_OF_IA_CSS_CIRCBUF_ELEM_S_STRUCT				\
579d4fa1a1SMauro Carvalho Chehab 	(sizeof(uint32_t))
589d4fa1a1SMauro Carvalho Chehab 
599d4fa1a1SMauro Carvalho Chehab #endif /*_IA_CSS_CIRCBUF_COMM_H*/
60