forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.3 KiB
84 lines
2.3 KiB
/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|
/* |
|
* cx18 buffer queues |
|
* |
|
* Derived from ivtv-queue.h |
|
* |
|
* Copyright (C) 2007 Hans Verkuil <[email protected]> |
|
* Copyright (C) 2008 Andy Walls <[email protected]> |
|
*/ |
|
|
|
#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) |
|
{ |
|
pci_dma_sync_single_for_cpu(s->cx->pci_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) |
|
{ |
|
pci_dma_sync_single_for_device(s->cx->pci_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);
|
|
|