Lines Matching refs:s
57 struct cx18_queue *_cx18_enqueue(struct cx18_stream *s, struct cx18_mdl *mdl, in _cx18_enqueue() argument
61 if (q != &s->q_full) { in _cx18_enqueue()
70 if (q == &s->q_busy && in _cx18_enqueue()
72 q = &s->q_free; in _cx18_enqueue()
87 struct cx18_mdl *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q) in cx18_dequeue() argument
103 static void _cx18_mdl_update_bufs_for_cpu(struct cx18_stream *s, in _cx18_mdl_update_bufs_for_cpu() argument
107 u32 buf_size = s->buf_size; in _cx18_mdl_update_bufs_for_cpu()
119 cx18_buf_sync_for_cpu(s, buf); in _cx18_mdl_update_bufs_for_cpu()
123 static inline void cx18_mdl_update_bufs_for_cpu(struct cx18_stream *s, in cx18_mdl_update_bufs_for_cpu() argument
133 cx18_buf_sync_for_cpu(s, buf); in cx18_mdl_update_bufs_for_cpu()
135 _cx18_mdl_update_bufs_for_cpu(s, mdl); in cx18_mdl_update_bufs_for_cpu()
139 struct cx18_mdl *cx18_queue_get_mdl(struct cx18_stream *s, u32 id, in cx18_queue_get_mdl() argument
142 struct cx18 *cx = s->cx; in cx18_queue_get_mdl()
154 spin_lock(&s->q_busy.lock); in cx18_queue_get_mdl()
155 list_for_each_entry_safe(mdl, tmp, &s->q_busy.list, list) { in cx18_queue_get_mdl()
165 if (mdl->skipped >= atomic_read(&s->q_busy.depth)-1) { in cx18_queue_get_mdl()
169 "rotation\n", s->name, mdl->id, in cx18_queue_get_mdl()
173 atomic_dec(&s->q_busy.depth); in cx18_queue_get_mdl()
182 atomic_dec(&s->q_busy.depth); in cx18_queue_get_mdl()
186 spin_unlock(&s->q_busy.lock); in cx18_queue_get_mdl()
196 cx18_mdl_update_bufs_for_cpu(s, ret); in cx18_queue_get_mdl()
197 if (s->type != CX18_ENC_STREAM_TYPE_TS) in cx18_queue_get_mdl()
204 cx18_enqueue(s, mdl, &s->q_free); in cx18_queue_get_mdl()
210 static void cx18_queue_flush(struct cx18_stream *s, in cx18_queue_flush() argument
216 if (q_src == q_dst || q_dst == &s->q_full || q_dst == &s->q_busy) in cx18_queue_flush()
236 void cx18_flush_queues(struct cx18_stream *s) in cx18_flush_queues() argument
238 cx18_queue_flush(s, &s->q_busy, &s->q_free); in cx18_flush_queues()
239 cx18_queue_flush(s, &s->q_full, &s->q_free); in cx18_flush_queues()
246 void cx18_unload_queues(struct cx18_stream *s) in cx18_unload_queues() argument
248 struct cx18_queue *q_idle = &s->q_idle; in cx18_unload_queues()
253 cx18_queue_flush(s, &s->q_busy, q_idle); in cx18_unload_queues()
254 cx18_queue_flush(s, &s->q_full, q_idle); in cx18_unload_queues()
255 cx18_queue_flush(s, &s->q_free, q_idle); in cx18_unload_queues()
263 list_move_tail(&buf->list, &s->buf_pool); in cx18_unload_queues()
267 mdl->id = s->mdl_base_idx; /* reset id to a "safe" value */ in cx18_unload_queues()
277 void cx18_load_queues(struct cx18_stream *s) in cx18_load_queues() argument
279 struct cx18 *cx = s->cx; in cx18_load_queues()
291 mdl_id = s->mdl_base_idx; in cx18_load_queues()
292 for (mdl = cx18_dequeue(s, &s->q_idle), i = s->bufs_per_mdl; in cx18_load_queues()
293 mdl != NULL && i == s->bufs_per_mdl; in cx18_load_queues()
294 mdl = cx18_dequeue(s, &s->q_idle)) { in cx18_load_queues()
298 for (i = 0; i < s->bufs_per_mdl; i++) { in cx18_load_queues()
299 if (list_empty(&s->buf_pool)) in cx18_load_queues()
302 buf = list_first_entry(&s->buf_pool, struct cx18_buffer, in cx18_load_queues()
309 cx18_writel(cx, s->buf_size, in cx18_load_queues()
313 if (i == s->bufs_per_mdl) { in cx18_load_queues()
321 partial_buf_size = s->mdl_size % s->buf_size; in cx18_load_queues()
326 cx18_enqueue(s, mdl, &s->q_free); in cx18_load_queues()
329 cx18_push(s, mdl, &s->q_idle); in cx18_load_queues()
335 void _cx18_mdl_sync_for_device(struct cx18_stream *s, struct cx18_mdl *mdl) in _cx18_mdl_sync_for_device() argument
337 int dma = s->dma; in _cx18_mdl_sync_for_device()
338 u32 buf_size = s->buf_size; in _cx18_mdl_sync_for_device()
339 struct pci_dev *pci_dev = s->cx->pci_dev; in _cx18_mdl_sync_for_device()
347 int cx18_stream_alloc(struct cx18_stream *s) in cx18_stream_alloc() argument
349 struct cx18 *cx = s->cx; in cx18_stream_alloc()
352 if (s->buffers == 0) in cx18_stream_alloc()
357 s->name, s->buffers, s->buf_size, in cx18_stream_alloc()
358 s->buffers * s->buf_size / 1024, in cx18_stream_alloc()
359 (s->buffers * s->buf_size * 100 / 1024) % 100); in cx18_stream_alloc()
361 if (((char __iomem *)&cx->scb->cpu_mdl[cx->free_mdl_idx + s->buffers] - in cx18_stream_alloc()
372 s->mdl_base_idx = cx->free_mdl_idx; in cx18_stream_alloc()
375 for (i = 0; i < s->buffers; i++) { in cx18_stream_alloc()
391 buf->buf = kmalloc(s->buf_size, GFP_KERNEL|__GFP_NOWARN); in cx18_stream_alloc()
400 mdl->id = s->mdl_base_idx; /* a somewhat safe value */ in cx18_stream_alloc()
401 cx18_enqueue(s, mdl, &s->q_idle); in cx18_stream_alloc()
404 buf->dma_handle = pci_map_single(s->cx->pci_dev, in cx18_stream_alloc()
405 buf->buf, s->buf_size, s->dma); in cx18_stream_alloc()
406 cx18_buf_sync_for_cpu(s, buf); in cx18_stream_alloc()
407 list_add_tail(&buf->list, &s->buf_pool); in cx18_stream_alloc()
409 if (i == s->buffers) { in cx18_stream_alloc()
410 cx->free_mdl_idx += s->buffers; in cx18_stream_alloc()
413 CX18_ERR("Couldn't allocate buffers for %s stream\n", s->name); in cx18_stream_alloc()
414 cx18_stream_free(s); in cx18_stream_alloc()
418 void cx18_stream_free(struct cx18_stream *s) in cx18_stream_free() argument
422 struct cx18 *cx = s->cx; in cx18_stream_free()
424 CX18_DEBUG_INFO("Deallocating buffers for %s stream\n", s->name); in cx18_stream_free()
427 cx18_unload_queues(s); in cx18_stream_free()
430 while ((mdl = cx18_dequeue(s, &s->q_idle))) in cx18_stream_free()
434 while (!list_empty(&s->buf_pool)) { in cx18_stream_free()
435 buf = list_first_entry(&s->buf_pool, struct cx18_buffer, list); in cx18_stream_free()
438 pci_unmap_single(s->cx->pci_dev, buf->dma_handle, in cx18_stream_free()
439 s->buf_size, s->dma); in cx18_stream_free()