Lines Matching refs:dma
12 #include <linux/dma/xilinx_dma.h>
23 #include <media/videobuf2-dma-contig.h>
25 #include "xilinx-dma.h"
58 static int xvip_dma_verify_format(struct xvip_dma *dma)
64 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;
196 struct xvip_dma *dma;
201 dma = to_xvip_dma(media_entity_to_video_device(entity));
203 if (dma->pad.flags & MEDIA_PAD_FL_SINK) {
204 pipe->output = dma;
250 * @dma: DMA engine at one end of the pipeline
258 struct xvip_dma *dma)
266 ret = xvip_pipeline_validate(pipe, dma);
289 * @dma: DMA channel that uses the buffer
294 struct xvip_dma *dma;
302 struct xvip_dma *dma = buf->dma;
304 spin_lock(&dma->queued_lock);
306 spin_unlock(&dma->queued_lock);
309 buf->buf.sequence = dma->sequence++;
311 vb2_set_plane_payload(&buf->buf.vb2_buf, 0, dma->format.sizeimage);
320 struct xvip_dma *dma = vb2_get_drv_priv(vq);
324 return sizes[0] < dma->format.sizeimage ? -EINVAL : 0;
327 sizes[0] = dma->format.sizeimage;
335 struct xvip_dma *dma = vb2_get_drv_priv(vb->vb2_queue);
338 buf->dma = dma;
346 struct xvip_dma *dma = vb2_get_drv_priv(vb->vb2_queue);
352 if (dma->queue.type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
354 dma->xt.dir = DMA_DEV_TO_MEM;
355 dma->xt.src_sgl = false;
356 dma->xt.dst_sgl = true;
357 dma->xt.dst_start = addr;
360 dma->xt.dir = DMA_MEM_TO_DEV;
361 dma->xt.src_sgl = true;
362 dma->xt.dst_sgl = false;
363 dma->xt.src_start = addr;
366 dma->xt.frame_size = 1;
367 dma->sgl[0].size = dma->format.width * dma->fmtinfo->bpp;
368 dma->sgl[0].icg = dma->format.bytesperline - dma->sgl[0].size;
369 dma->xt.numf = dma->format.height;
371 desc = dmaengine_prep_interleaved_dma(dma->dma, &dma->xt, flags);
373 dev_err(dma->xdev->dev, "Failed to prepare DMA transfer\n");
380 spin_lock_irq(&dma->queued_lock);
381 list_add_tail(&buf->queue, &dma->queued_bufs);
382 spin_unlock_irq(&dma->queued_lock);
386 if (vb2_is_streaming(&dma->queue))
387 dma_async_issue_pending(dma->dma);
392 struct xvip_dma *dma = vb2_get_drv_priv(vq);
397 dma->sequence = 0;
406 pipe = dma->video.entity.pipe
407 ? to_xvip_pipeline(&dma->video.entity) : &dma->pipe;
409 ret = media_pipeline_start(&dma->video.entity, &pipe->pipe);
416 ret = xvip_dma_verify_format(dma);
420 ret = xvip_pipeline_prepare(pipe, dma);
427 dma_async_issue_pending(dma->dma);
435 media_pipeline_stop(&dma->video.entity);
439 spin_lock_irq(&dma->queued_lock);
440 list_for_each_entry_safe(buf, nbuf, &dma->queued_bufs, queue) {
444 spin_unlock_irq(&dma->queued_lock);
451 struct xvip_dma *dma = vb2_get_drv_priv(vq);
452 struct xvip_pipeline *pipe = to_xvip_pipeline(&dma->video.entity);
459 dmaengine_terminate_all(dma->dma);
463 media_pipeline_stop(&dma->video.entity);
466 spin_lock_irq(&dma->queued_lock);
467 list_for_each_entry_safe(buf, nbuf, &dma->queued_bufs, queue) {
471 spin_unlock_irq(&dma->queued_lock);
492 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
494 cap->capabilities = dma->xdev->v4l2_caps | V4L2_CAP_STREAMING |
498 strscpy(cap->card, dma->video.name, sizeof(cap->card));
500 dma->xdev->dev->of_node, dma->port);
514 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
519 f->pixelformat = dma->format.pixelformat;
528 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
530 format->fmt.pix = dma->format;
536 __xvip_dma_try_format(struct xvip_dma *dma, struct v4l2_pix_format *pix,
562 align = lcm(dma->align, info->bpp);
576 max_bpl = rounddown(XVIP_DMA_MAX_WIDTH, dma->align);
577 bpl = rounddown(pix->bytesperline, dma->align);
590 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
592 __xvip_dma_try_format(dma, &format->fmt.pix, NULL);
600 struct xvip_dma *dma = to_xvip_dma(vfh->vdev);
603 __xvip_dma_try_format(dma, &format->fmt.pix, &info);
605 if (vb2_is_busy(&dma->queue))
608 dma->format = format->fmt.pix;
609 dma->fmtinfo = info;
650 int xvip_dma_init(struct xvip_composite_device *xdev, struct xvip_dma *dma,
656 dma->xdev = xdev;
657 dma->port = port;
658 mutex_init(&dma->lock);
659 mutex_init(&dma->pipe.lock);
660 INIT_LIST_HEAD(&dma->queued_bufs);
661 spin_lock_init(&dma->queued_lock);
663 dma->fmtinfo = xvip_get_format_by_fourcc(XVIP_DMA_DEF_FORMAT);
664 dma->format.pixelformat = dma->fmtinfo->fourcc;
665 dma->format.colorspace = V4L2_COLORSPACE_SRGB;
666 dma->format.field = V4L2_FIELD_NONE;
667 dma->format.width = XVIP_DMA_DEF_WIDTH;
668 dma->format.height = XVIP_DMA_DEF_HEIGHT;
669 dma->format.bytesperline = dma->format.width * dma->fmtinfo->bpp;
670 dma->format.sizeimage = dma->format.bytesperline * dma->format.height;
673 dma->pad.flags = type == V4L2_BUF_TYPE_VIDEO_CAPTURE
676 ret = media_entity_pads_init(&dma->video.entity, 1, &dma->pad);
681 dma->video.fops = &xvip_dma_fops;
682 dma->video.v4l2_dev = &xdev->v4l2_dev;
683 dma->video.queue = &dma->queue;
684 snprintf(dma->video.name, sizeof(dma->video.name), "%pOFn %s %u",
688 dma->video.vfl_type = VFL_TYPE_VIDEO;
689 dma->video.vfl_dir = type == V4L2_BUF_TYPE_VIDEO_CAPTURE
691 dma->video.release = video_device_release_empty;
692 dma->video.ioctl_ops = &xvip_dma_ioctl_ops;
693 dma->video.lock = &dma->lock;
694 dma->video.device_caps = V4L2_CAP_STREAMING;
696 dma->video.device_caps |= V4L2_CAP_VIDEO_CAPTURE;
698 dma->video.device_caps |= V4L2_CAP_VIDEO_OUTPUT;
700 video_set_drvdata(&dma->video, dma);
710 dma->queue.type = type;
711 dma->queue.io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
712 dma->queue.lock = &dma->lock;
713 dma->queue.drv_priv = dma;
714 dma->queue.buf_struct_size = sizeof(struct xvip_dma_buffer);
715 dma->queue.ops = &xvip_dma_queue_qops;
716 dma->queue.mem_ops = &vb2_dma_contig_memops;
717 dma->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
719 dma->queue.dev = dma->xdev->dev;
720 ret = vb2_queue_init(&dma->queue);
722 dev_err(dma->xdev->dev, "failed to initialize VB2 queue\n");
728 dma->dma = dma_request_chan(dma->xdev->dev, name);
729 if (IS_ERR(dma->dma)) {
730 ret = PTR_ERR(dma->dma);
732 dev_err(dma->xdev->dev, "no VDMA channel found\n");
736 dma->align = 1 << dma->dma->device->copy_align;
738 ret = video_register_device(&dma->video, VFL_TYPE_VIDEO, -1);
740 dev_err(dma->xdev->dev, "failed to register video device\n");
747 xvip_dma_cleanup(dma);
751 void xvip_dma_cleanup(struct xvip_dma *dma)
753 if (video_is_registered(&dma->video))
754 video_unregister_device(&dma->video);
756 if (!IS_ERR_OR_NULL(dma->dma))
757 dma_release_channel(dma->dma);
759 media_entity_cleanup(&dma->video.entity);
761 mutex_destroy(&dma->lock);
762 mutex_destroy(&dma->pipe.lock);