/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 *  cx18 buffer queues
 *
 *  Derived from ivtv-queue.h
 *
 *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
 *  Copyright (C) 2008  Andy Walls <awalls@md.metrocast.net>
 */

#define CX18_DMA_UNMAPPED	((u32) -1)

/* cx18_buffer utility functions */

static inline void cx18_buf_sync_for_cpu(struct cx18_stream *s,
	struct cx18_buffer *buf)
{
	dma_sync_single_for_cpu(&s->cx->pci_dev->dev, buf->dma_handle,
				s->buf_size, s->dma);
}

static inline void cx18_buf_sync_for_device(struct cx18_stream *s,
	struct cx18_buffer *buf)
{
	dma_sync_single_for_device(&s->cx->pci_dev->dev, buf->dma_handle,
				   s->buf_size, s->dma);
}

void _cx18_mdl_sync_for_device(struct cx18_stream *s, struct cx18_mdl *mdl);

static inline void cx18_mdl_sync_for_device(struct cx18_stream *s,
					    struct cx18_mdl *mdl)
{
	if (list_is_singular(&mdl->buf_list))
		cx18_buf_sync_for_device(s, list_first_entry(&mdl->buf_list,
							     struct cx18_buffer,
							     list));
	else
		_cx18_mdl_sync_for_device(s, mdl);
}

void cx18_buf_swap(struct cx18_buffer *buf);
void _cx18_mdl_swap(struct cx18_mdl *mdl);

static inline void cx18_mdl_swap(struct cx18_mdl *mdl)
{
	if (list_is_singular(&mdl->buf_list))
		cx18_buf_swap(list_first_entry(&mdl->buf_list,
					       struct cx18_buffer, list));
	else
		_cx18_mdl_swap(mdl);
}

/* cx18_queue utility functions */
struct cx18_queue *_cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl,
				 struct cx18_queue *q, int to_front);

static inline
struct cx18_queue *cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl,
				struct cx18_queue *q)
{
	return _cx18_enqueue(s, mdl, q, 0); /* FIFO */
}

static inline
struct cx18_queue *cx18_push(struct cx18_stream *s, struct cx18_mdl *mdl,
			     struct cx18_queue *q)
{
	return _cx18_enqueue(s, mdl, q, 1); /* LIFO */
}

void cx18_queue_init(struct cx18_queue *q);
struct cx18_mdl *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q);
struct cx18_mdl *cx18_queue_get_mdl(struct cx18_stream *s, u32 id,
	u32 bytesused);
void cx18_flush_queues(struct cx18_stream *s);

/* queue MDL reconfiguration helpers */
void cx18_unload_queues(struct cx18_stream *s);
void cx18_load_queues(struct cx18_stream *s);

/* cx18_stream utility functions */
int cx18_stream_alloc(struct cx18_stream *s);
void cx18_stream_free(struct cx18_stream *s);
