linux/drivers/media/pci/cx18/cx18-queue.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 *  cx18 buffer queues
   4 *
   5 *  Derived from ivtv-queue.h
   6 *
   7 *  Copyright (C) 2007  Hans Verkuil <hverkuil@xs4all.nl>
   8 *  Copyright (C) 2008  Andy Walls <awalls@md.metrocast.net>
   9 */
  10
  11#define CX18_DMA_UNMAPPED       ((u32) -1)
  12
  13/* cx18_buffer utility functions */
  14
  15static inline void cx18_buf_sync_for_cpu(struct cx18_stream *s,
  16        struct cx18_buffer *buf)
  17{
  18        pci_dma_sync_single_for_cpu(s->cx->pci_dev, buf->dma_handle,
  19                                s->buf_size, s->dma);
  20}
  21
  22static inline void cx18_buf_sync_for_device(struct cx18_stream *s,
  23        struct cx18_buffer *buf)
  24{
  25        pci_dma_sync_single_for_device(s->cx->pci_dev, buf->dma_handle,
  26                                s->buf_size, s->dma);
  27}
  28
  29void _cx18_mdl_sync_for_device(struct cx18_stream *s, struct cx18_mdl *mdl);
  30
  31static inline void cx18_mdl_sync_for_device(struct cx18_stream *s,
  32                                            struct cx18_mdl *mdl)
  33{
  34        if (list_is_singular(&mdl->buf_list))
  35                cx18_buf_sync_for_device(s, list_first_entry(&mdl->buf_list,
  36                                                             struct cx18_buffer,
  37                                                             list));
  38        else
  39                _cx18_mdl_sync_for_device(s, mdl);
  40}
  41
  42void cx18_buf_swap(struct cx18_buffer *buf);
  43void _cx18_mdl_swap(struct cx18_mdl *mdl);
  44
  45static inline void cx18_mdl_swap(struct cx18_mdl *mdl)
  46{
  47        if (list_is_singular(&mdl->buf_list))
  48                cx18_buf_swap(list_first_entry(&mdl->buf_list,
  49                                               struct cx18_buffer, list));
  50        else
  51                _cx18_mdl_swap(mdl);
  52}
  53
  54/* cx18_queue utility functions */
  55struct cx18_queue *_cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl,
  56                                 struct cx18_queue *q, int to_front);
  57
  58static inline
  59struct cx18_queue *cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl,
  60                                struct cx18_queue *q)
  61{
  62        return _cx18_enqueue(s, mdl, q, 0); /* FIFO */
  63}
  64
  65static inline
  66struct cx18_queue *cx18_push(struct cx18_stream *s, struct cx18_mdl *mdl,
  67                             struct cx18_queue *q)
  68{
  69        return _cx18_enqueue(s, mdl, q, 1); /* LIFO */
  70}
  71
  72void cx18_queue_init(struct cx18_queue *q);
  73struct cx18_mdl *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q);
  74struct cx18_mdl *cx18_queue_get_mdl(struct cx18_stream *s, u32 id,
  75        u32 bytesused);
  76void cx18_flush_queues(struct cx18_stream *s);
  77
  78/* queue MDL reconfiguration helpers */
  79void cx18_unload_queues(struct cx18_stream *s);
  80void cx18_load_queues(struct cx18_stream *s);
  81
  82/* cx18_stream utility functions */
  83int cx18_stream_alloc(struct cx18_stream *s);
  84void cx18_stream_free(struct cx18_stream *s);
  85