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