18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * cx18 buffer queues 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Derived from ivtv-queue.h 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> 88c2ecf20Sopenharmony_ci * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net> 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#define CX18_DMA_UNMAPPED ((u32) -1) 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci/* cx18_buffer utility functions */ 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_cistatic inline void cx18_buf_sync_for_cpu(struct cx18_stream *s, 168c2ecf20Sopenharmony_ci struct cx18_buffer *buf) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci pci_dma_sync_single_for_cpu(s->cx->pci_dev, buf->dma_handle, 198c2ecf20Sopenharmony_ci s->buf_size, s->dma); 208c2ecf20Sopenharmony_ci} 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic inline void cx18_buf_sync_for_device(struct cx18_stream *s, 238c2ecf20Sopenharmony_ci struct cx18_buffer *buf) 248c2ecf20Sopenharmony_ci{ 258c2ecf20Sopenharmony_ci pci_dma_sync_single_for_device(s->cx->pci_dev, buf->dma_handle, 268c2ecf20Sopenharmony_ci s->buf_size, s->dma); 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_civoid _cx18_mdl_sync_for_device(struct cx18_stream *s, struct cx18_mdl *mdl); 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic inline void cx18_mdl_sync_for_device(struct cx18_stream *s, 328c2ecf20Sopenharmony_ci struct cx18_mdl *mdl) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci if (list_is_singular(&mdl->buf_list)) 358c2ecf20Sopenharmony_ci cx18_buf_sync_for_device(s, list_first_entry(&mdl->buf_list, 368c2ecf20Sopenharmony_ci struct cx18_buffer, 378c2ecf20Sopenharmony_ci list)); 388c2ecf20Sopenharmony_ci else 398c2ecf20Sopenharmony_ci _cx18_mdl_sync_for_device(s, mdl); 408c2ecf20Sopenharmony_ci} 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_civoid cx18_buf_swap(struct cx18_buffer *buf); 438c2ecf20Sopenharmony_civoid _cx18_mdl_swap(struct cx18_mdl *mdl); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistatic inline void cx18_mdl_swap(struct cx18_mdl *mdl) 468c2ecf20Sopenharmony_ci{ 478c2ecf20Sopenharmony_ci if (list_is_singular(&mdl->buf_list)) 488c2ecf20Sopenharmony_ci cx18_buf_swap(list_first_entry(&mdl->buf_list, 498c2ecf20Sopenharmony_ci struct cx18_buffer, list)); 508c2ecf20Sopenharmony_ci else 518c2ecf20Sopenharmony_ci _cx18_mdl_swap(mdl); 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci/* cx18_queue utility functions */ 558c2ecf20Sopenharmony_cistruct cx18_queue *_cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl, 568c2ecf20Sopenharmony_ci struct cx18_queue *q, int to_front); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistatic inline 598c2ecf20Sopenharmony_cistruct cx18_queue *cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl, 608c2ecf20Sopenharmony_ci struct cx18_queue *q) 618c2ecf20Sopenharmony_ci{ 628c2ecf20Sopenharmony_ci return _cx18_enqueue(s, mdl, q, 0); /* FIFO */ 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cistatic inline 668c2ecf20Sopenharmony_cistruct cx18_queue *cx18_push(struct cx18_stream *s, struct cx18_mdl *mdl, 678c2ecf20Sopenharmony_ci struct cx18_queue *q) 688c2ecf20Sopenharmony_ci{ 698c2ecf20Sopenharmony_ci return _cx18_enqueue(s, mdl, q, 1); /* LIFO */ 708c2ecf20Sopenharmony_ci} 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_civoid cx18_queue_init(struct cx18_queue *q); 738c2ecf20Sopenharmony_cistruct cx18_mdl *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q); 748c2ecf20Sopenharmony_cistruct cx18_mdl *cx18_queue_get_mdl(struct cx18_stream *s, u32 id, 758c2ecf20Sopenharmony_ci u32 bytesused); 768c2ecf20Sopenharmony_civoid cx18_flush_queues(struct cx18_stream *s); 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci/* queue MDL reconfiguration helpers */ 798c2ecf20Sopenharmony_civoid cx18_unload_queues(struct cx18_stream *s); 808c2ecf20Sopenharmony_civoid cx18_load_queues(struct cx18_stream *s); 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci/* cx18_stream utility functions */ 838c2ecf20Sopenharmony_ciint cx18_stream_alloc(struct cx18_stream *s); 848c2ecf20Sopenharmony_civoid cx18_stream_free(struct cx18_stream *s); 85