Lines Matching refs:dma

12 #include <linux/dma/xilinx_dma.h>
23 #include <media/videobuf2-dma-contig.h>
25 #include "xilinx-dma.h"
57 static int xvip_dma_verify_format(struct xvip_dma *dma)
65 subdev = xvip_dma_remote_subdev(&dma->pad, &fmt.pad);
73 if (dma->fmtinfo->code != fmt.format.code ||
74 dma->format.height != fmt.format.height ||
75 dma->format.width != fmt.format.width ||
76 dma->format.colorspace != fmt.format.colorspace)
99 struct xvip_dma *dma = pipe->output;
105 entity = &dma->video.entity;
184 struct xvip_dma *dma;
189 dma = to_xvip_dma(media_entity_to_video_device(pad->entity));
191 if (dma->pad.flags & MEDIA_PAD_FL_SINK) {
192 pipe->output = dma;
234 * @dma: DMA engine at one end of the pipeline
242 struct xvip_dma *dma)
250 ret = xvip_pipeline_validate(pipe, dma);
273 * @dma: DMA channel that uses the buffer
278 struct xvip_dma *dma;
286 struct xvip_dma *dma = buf->dma;
288 spin_lock(&dma->queued_lock);
290 spin_unlock(&dma->queued_lock);
293 buf->buf.sequence = dma->sequence++;
295 vb2_set_plane_payload(&buf->buf.vb2_buf, 0, dma->format.sizeimage);
304 struct xvip_dma *dma = vb2_get_drv_priv(vq);
308 return sizes[0] < dma->format.sizeimage ? -EINVAL : 0;
311 sizes[0] = dma->format.sizeimage;
319 struct xvip_dma *dma = vb2_get_drv_priv(vb->vb2_queue);
322 buf->dma = dma;
330 struct xvip_dma *dma = vb2_get_drv_priv(vb->vb2_queue);
336 if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
338 dma->xt.dir = DMA_DEV_TO_MEM;
339 dma->xt.src_sgl = false;
340 dma->xt.dst_sgl = true;
341 dma->xt.dst_start = addr;
344 dma->xt.dir = DMA_MEM_TO_DEV;
345 dma->xt.src_sgl = true;
346 dma->xt.dst_sgl = false;
347 dma->xt.src_start = addr;
350 dma->xt.frame_size = 1;
351 dma->sgl[0].size = dma->format.width * dma->fmtinfo->bpp;
352 dma->sgl[0].icg = dma->format.bytesperline - dma->sgl[0].size;
353 dma->xt.numf = dma->format.height;
355 desc = dmaengine_prep_interleaved_dma(dma->dma, &dma->xt, flags);
357 dev_err(dma->xdev->dev, "Failed to prepare DMA transfer\n");
364 spin_lock_irq(&dma->queued_lock);
365 list_add_tail(&buf->queue, &dma->queued_bufs);
366 spin_unlock_irq(&dma->queued_lock);
370 if (vb2_is_streaming(&dma->queue))
371 dma_async_issue_pending(dma->dma);
376 struct xvip_dma *dma = vb2_get_drv_priv(vq);
381 dma->sequence = 0;
390 pipe = to_xvip_pipeline(&dma->video) ? : &dma->pipe;
392 ret = video_device_pipeline_start(&dma->video, &pipe->pipe);
399 ret = xvip_dma_verify_format(dma);
403 ret = xvip_pipeline_prepare(pipe, dma);
410 dma_async_issue_pending(dma->dma);
418 video_device_pipeline_stop(&dma->video);
422 spin_lock_irq(&dma->queued_lock);
423 list_for_each_entry_safe(buf, nbuf, &dma->queued_bufs, queue) {
427 spin_unlock_irq(&dma->queued_lock);
434 struct xvip_dma *dma = vb2_get_drv_priv(vq);
435 struct xvip_pipeline *pipe = to_xvip_pipeline(&dma->video);
442 dmaengine_terminate_all(dma->dma);
446 video_device_pipeline_stop(&dma->video);
449 spin_lock_irq(&dma->queued_lock);
450 list_for_each_entry_safe(buf, nbuf, &dma->queued_bufs, queue) {
454 spin_unlock_irq(&dma->queued_lock);
475 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
477 cap->capabilities = dma->xdev->v4l2_caps | V4L2_CAP_STREAMING |
481 strscpy(cap->card, dma->video.name, sizeof(cap->card));
483 dma->xdev->dev->of_node, dma->port);
497 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
502 f->pixelformat = dma->format.pixelformat;
511 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
513 format->fmt.pix = dma->format;
519 __xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix,
543 align = lcm(dma->align, info->bpp);
557 max_bpl = rounddown(XVIP_DMA_MAX_WIDTH, dma->align);
558 bpl = rounddown(pix->bytesperline, dma->align);
571 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
573 __xvip_dma_try_format(dma, &format->fmt.pix, NULL);
581 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
584 __xvip_dma_try_format(dma, &format->fmt.pix, &info);
586 if (vb2_is_busy(&dma->queue))
589 dma->format = format->fmt.pix;
590 dma->fmtinfo = info;
631 int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma,
637 dma->xdev = xdev;
638 dma->port = port;
639 mutex_init(&dma->lock);
640 mutex_init(&dma->pipe.lock);
641 INIT_LIST_HEAD(&dma->queued_bufs);
642 spin_lock_init(&dma->queued_lock);
644 dma->fmtinfo = xvip_get_format_by_fourcc(V4L2_PIX_FMT_YUYV);
645 dma->format.pixelformat = dma->fmtinfo->fourcc;
646 dma->format.colorspace = V4L2_COLORSPACE_SRGB;
647 dma->format.field = V4L2_FIELD_NONE;
648 dma->format.width = XVIP_DMA_DEF_WIDTH;
649 dma->format.height = XVIP_DMA_DEF_HEIGHT;
650 dma->format.bytesperline = dma->format.width * dma->fmtinfo->bpp;
651 dma->format.sizeimage = dma->format.bytesperline * dma->format.height;
654 dma->pad.flags = type == V4L2_BUF_TYPE_VIDEO_CAPTURE
657 ret = media_entity_pads_init(&dma->video.entity, 1, &dma->pad);
662 dma->video.fops = &xvip_dma_fops;
663 dma->video.v4l2_dev = &xdev->v4l2_dev;
664 dma->video.queue = &dma->queue;
665 snprintf(dma->video.name, sizeof(dma->video.name), "%pOFn %s %u",
669 dma->video.vfl_type = VFL_TYPE_VIDEO;
670 dma->video.vfl_dir = type == V4L2_BUF_TYPE_VIDEO_CAPTURE
672 dma->video.release = video_device_release_empty;
673 dma->video.ioctl_ops = &xvip_dma_ioctl_ops;
674 dma->video.lock = &dma->lock;
675 dma->video.device_caps = V4L2_CAP_STREAMING;
677 dma->video.device_caps |= V4L2_CAP_VIDEO_CAPTURE;
679 dma->video.device_caps |= V4L2_CAP_VIDEO_OUTPUT;
681 video_set_drvdata(&dma->video, dma);
691 dma->queue.type = type;
692 dma->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
693 dma->queue.lock = &dma->lock;
694 dma->queue.drv_priv = dma;
695 dma->queue.buf_struct_size = sizeof(struct xvip_dma_buffer);
696 dma->queue.ops = &xvip_dma_queue_qops;
697 dma->queue.mem_ops = &vb2_dma_contig_memops;
698 dma->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
700 dma->queue.dev = dma->xdev->dev;
701 ret = vb2_queue_init(&dma->queue);
703 dev_err(dma->xdev->dev, "failed to initialize VB2 queue\n");
709 dma->dma = dma_request_chan(dma->xdev->dev, name);
710 if (IS_ERR(dma->dma)) {
711 ret = PTR_ERR(dma->dma);
713 dev_err(dma->xdev->dev, "no VDMA channel found\n");
717 dma->align = 1 << dma->dma->device->copy_align;
719 ret = video_register_device(&dma->video, VFL_TYPE_VIDEO, -1);
721 dev_err(dma->xdev->dev, "failed to register video device\n");
728 xvip_dma_cleanup(dma);
732 void xvip_dma_cleanup(struct xvip_dma *dma)
734 if (video_is_registered(&dma->video))
735 video_unregister_device(&dma->video);
737 if (!IS_ERR_OR_NULL(dma->dma))
738 dma_release_channel(dma->dma);
740 media_entity_cleanup(&dma->video.entity);
742 mutex_destroy(&dma->lock);
743 mutex_destroy(&dma->pipe.lock);