/*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that 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.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Description:
*/
#ifndef __AML_VCODEC_VFQ_H_
#define __AML_VCODEC_VFQ_H_

#include <linux/types.h>
#include <asm/barrier.h>

struct vfq_s {
	int rp;
	int wp;
	int size;
	int pre_rp;
	int pre_wp;
	struct vframe_s **pool;
};

static inline void vfq_lookup_start(struct vfq_s *q)
{
	q->pre_rp = q->rp;
	q->pre_wp = q->wp;
}
static inline void vfq_lookup_end(struct vfq_s *q)
{
	q->rp = q->pre_rp;
	q->wp = q->pre_wp;
}

static inline void vfq_init(struct vfq_s *q, u32 size, struct vframe_s **pool)
{
	q->rp = q->wp = 0;
	q->size = size;
	q->pool = pool;
}

static inline bool vfq_empty(struct vfq_s *q)
{
	return q->rp == q->wp;
}

static inline void vfq_push(struct vfq_s *q, struct vframe_s *vf)
{
	int wp = q->wp;

	/*ToDo*/
	smp_mb();

	q->pool[wp] = vf;

	/*ToDo*/
	smp_wmb();

	q->wp = (wp == (q->size - 1)) ? 0 : (wp + 1);
}

static inline struct vframe_s *vfq_pop(struct vfq_s *q)
{
	struct vframe_s *vf;
	int rp;

	if (vfq_empty(q))
		return NULL;

	rp = q->rp;

	/*ToDo*/
	smp_rmb();

	vf = q->pool[rp];

	/*ToDo*/
	smp_mb();

	q->rp = (rp == (q->size - 1)) ? 0 : (rp + 1);

	return vf;
}

static inline struct vframe_s *vfq_peek(struct vfq_s *q)
{
	return (vfq_empty(q)) ? NULL : q->pool[q->rp];
}

static inline int vfq_level(struct vfq_s *q)
{
	int level = q->wp - q->rp;

	if (level < 0)
		level += q->size;

	return level;
}

#endif /* __AML_VCODEC_VFQ_H_ */

