Lines Matching full:vsp1

3  * vsp1_drm.c  --  R-Car VSP1 DRM/KMS Interface
16 #include <media/vsp1.h>
18 #include "vsp1.h"
63 static int vsp1_du_insert_uif(struct vsp1_device *vsp1, in vsp1_du_insert_uif() argument
99 dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on UIF sink\n", in vsp1_du_insert_uif()
115 static int vsp1_du_pipeline_setup_rpf(struct vsp1_device *vsp1, in vsp1_du_pipeline_setup_rpf() argument
130 crop = &vsp1->drm->inputs[rpf->entity.index].crop; in vsp1_du_pipeline_setup_rpf()
145 dev_dbg(vsp1->dev, in vsp1_du_pipeline_setup_rpf()
161 dev_dbg(vsp1->dev, in vsp1_du_pipeline_setup_rpf()
177 dev_dbg(vsp1->dev, in vsp1_du_pipeline_setup_rpf()
190 ret = vsp1_du_insert_uif(vsp1, pipe, uif, &rpf->entity, RWPF_PAD_SOURCE, in vsp1_du_pipeline_setup_rpf()
203 dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on %s pad %u\n", in vsp1_du_pipeline_setup_rpf()
209 sel.r = vsp1->drm->inputs[rpf->entity.index].compose; in vsp1_du_pipeline_setup_rpf()
216 dev_dbg(vsp1->dev, "%s: set selection (%u,%u)/%ux%u on %s pad %u\n", in vsp1_du_pipeline_setup_rpf()
224 static int vsp1_du_pipeline_setup_inputs(struct vsp1_device *vsp1,
228 static int vsp1_du_pipeline_setup_brx(struct vsp1_device *vsp1, in vsp1_du_pipeline_setup_brx() argument
245 brx = &vsp1->bru->entity; in vsp1_du_pipeline_setup_brx()
248 else if (vsp1_feature(vsp1, VSP1_HAS_BRU) && !vsp1->bru->entity.pipe) in vsp1_du_pipeline_setup_brx()
249 brx = &vsp1->bru->entity; in vsp1_du_pipeline_setup_brx()
251 brx = &vsp1->brs->entity; in vsp1_du_pipeline_setup_brx()
259 dev_dbg(vsp1->dev, "%s: pipe %u: releasing %s\n", in vsp1_du_pipeline_setup_brx()
292 dev_dbg(vsp1->dev, "%s: pipe %u: waiting for %s\n", in vsp1_du_pipeline_setup_brx()
298 vsp1_du_pipeline_setup_inputs(vsp1, &owner_pipe->pipe); in vsp1_du_pipeline_setup_brx()
305 dev_warn(vsp1->dev, in vsp1_du_pipeline_setup_brx()
321 dev_dbg(vsp1->dev, "%s: pipe %u: acquired %s\n", in vsp1_du_pipeline_setup_brx()
348 dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on %s pad %u\n", in vsp1_du_pipeline_setup_brx()
354 dev_dbg(vsp1->dev, "%s: format mismatch\n", __func__); in vsp1_du_pipeline_setup_brx()
361 static unsigned int rpf_zpos(struct vsp1_device *vsp1, struct vsp1_rwpf *rpf) in rpf_zpos() argument
363 return vsp1->drm->inputs[rpf->entity.index].zpos; in rpf_zpos()
367 static int vsp1_du_pipeline_setup_inputs(struct vsp1_device *vsp1, in vsp1_du_pipeline_setup_inputs() argument
381 for (i = 0; i < vsp1->info->rpf_count; ++i) { in vsp1_du_pipeline_setup_inputs()
382 struct vsp1_rwpf *rpf = vsp1->rpf[i]; in vsp1_du_pipeline_setup_inputs()
390 if (rpf_zpos(vsp1, inputs[j-1]) <= rpf_zpos(vsp1, rpf)) in vsp1_du_pipeline_setup_inputs()
403 ret = vsp1_du_pipeline_setup_brx(vsp1, pipe); in vsp1_du_pipeline_setup_inputs()
405 dev_err(vsp1->dev, "%s: failed to setup %s source\n", __func__, in vsp1_du_pipeline_setup_inputs()
431 dev_dbg(vsp1->dev, "%s: connecting RPF.%u to %s:%u\n", in vsp1_du_pipeline_setup_inputs()
438 ret = vsp1_du_pipeline_setup_rpf(vsp1, pipe, rpf, uif, i); in vsp1_du_pipeline_setup_inputs()
440 dev_err(vsp1->dev, in vsp1_du_pipeline_setup_inputs()
451 ret = vsp1_du_insert_uif(vsp1, pipe, uif, in vsp1_du_pipeline_setup_inputs()
455 dev_err(vsp1->dev, "%s: failed to setup UIF after %s\n", in vsp1_du_pipeline_setup_inputs()
480 static int vsp1_du_pipeline_setup_output(struct vsp1_device *vsp1, in vsp1_du_pipeline_setup_output() argument
499 dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on WPF%u sink\n", in vsp1_du_pipeline_setup_output()
509 dev_dbg(vsp1->dev, "%s: got format %ux%u (%x) on WPF%u source\n", in vsp1_du_pipeline_setup_output()
519 dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on LIF%u sink\n", in vsp1_du_pipeline_setup_output()
530 dev_dbg(vsp1->dev, "%s: format mismatch on LIF%u\n", __func__, in vsp1_du_pipeline_setup_output()
577 static int vsp1_du_pipeline_set_rwpf_format(struct vsp1_device *vsp1, in vsp1_du_pipeline_set_rwpf_format() argument
584 fmtinfo = vsp1_get_format_info(vsp1, pixelformat); in vsp1_du_pipeline_set_rwpf_format()
586 dev_dbg(vsp1->dev, "Unsupported pixel format %08x\n", in vsp1_du_pipeline_set_rwpf_format()
613 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_du_init() local
615 if (!vsp1) in vsp1_du_init()
646 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_du_setup_lif() local
653 if (pipe_index >= vsp1->info->lif_count) in vsp1_du_setup_lif()
656 drm_pipe = &vsp1->drm->pipe[pipe_index]; in vsp1_du_setup_lif()
662 mutex_lock(&vsp1->drm->lock); in vsp1_du_setup_lif()
672 dev_err(vsp1->dev, "DRM pipeline stop timeout\n"); in vsp1_du_setup_lif()
695 dev_dbg(vsp1->dev, "%s: pipe %u: releasing %s\n", in vsp1_du_setup_lif()
703 mutex_unlock(&vsp1->drm->lock); in vsp1_du_setup_lif()
706 vsp1_device_put(vsp1); in vsp1_du_setup_lif()
708 dev_dbg(vsp1->dev, "%s: pipeline disabled\n", __func__); in vsp1_du_setup_lif()
717 dev_dbg(vsp1->dev, "%s: configuring LIF%u with format %ux%u%s\n", in vsp1_du_setup_lif()
721 mutex_lock(&vsp1->drm->lock); in vsp1_du_setup_lif()
724 ret = vsp1_du_pipeline_setup_inputs(vsp1, pipe); in vsp1_du_setup_lif()
728 ret = vsp1_du_pipeline_setup_output(vsp1, pipe); in vsp1_du_setup_lif()
732 /* Enable the VSP1. */ in vsp1_du_setup_lif()
733 ret = vsp1_device_get(vsp1); in vsp1_du_setup_lif()
745 vsp1_write(vsp1, VI6_DISP_IRQ_STA(pipe_index), 0); in vsp1_du_setup_lif()
746 vsp1_write(vsp1, VI6_DISP_IRQ_ENB(pipe_index), 0); in vsp1_du_setup_lif()
752 mutex_unlock(&vsp1->drm->lock); in vsp1_du_setup_lif()
762 dev_dbg(vsp1->dev, "%s: pipeline enabled\n", __func__); in vsp1_du_setup_lif()
812 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_du_atomic_update() local
813 struct vsp1_drm_pipeline *drm_pipe = &vsp1->drm->pipe[pipe_index]; in vsp1_du_atomic_update()
817 if (rpf_index >= vsp1->info->rpf_count) in vsp1_du_atomic_update()
820 rpf = vsp1->rpf[rpf_index]; in vsp1_du_atomic_update()
823 dev_dbg(vsp1->dev, "%s: RPF%u: disable requested\n", __func__, in vsp1_du_atomic_update()
836 dev_dbg(vsp1->dev, in vsp1_du_atomic_update()
848 ret = vsp1_du_pipeline_set_rwpf_format(vsp1, rpf, cfg->pixelformat, in vsp1_du_atomic_update()
861 vsp1->drm->inputs[rpf_index].crop = cfg->src; in vsp1_du_atomic_update()
862 vsp1->drm->inputs[rpf_index].compose = cfg->dst; in vsp1_du_atomic_update()
863 vsp1->drm->inputs[rpf_index].zpos = cfg->zpos; in vsp1_du_atomic_update()
880 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_du_atomic_flush() local
881 struct vsp1_drm_pipeline *drm_pipe = &vsp1->drm->pipe[pipe_index]; in vsp1_du_atomic_flush()
887 mutex_lock(&vsp1->drm->lock); in vsp1_du_atomic_flush()
892 ret = vsp1_du_pipeline_set_rwpf_format(vsp1, pipe->output, in vsp1_du_atomic_flush()
904 vsp1_du_pipeline_setup_inputs(vsp1, pipe); in vsp1_du_atomic_flush()
908 mutex_unlock(&vsp1->drm->lock); in vsp1_du_atomic_flush()
914 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_du_map_sg() local
921 return dma_map_sgtable(vsp1->bus_master, sgt, DMA_TO_DEVICE, in vsp1_du_map_sg()
928 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_du_unmap_sg() local
930 dma_unmap_sgtable(vsp1->bus_master, sgt, DMA_TO_DEVICE, in vsp1_du_unmap_sg()
939 int vsp1_drm_init(struct vsp1_device *vsp1) in vsp1_drm_init() argument
943 vsp1->drm = devm_kzalloc(vsp1->dev, sizeof(*vsp1->drm), GFP_KERNEL); in vsp1_drm_init()
944 if (!vsp1->drm) in vsp1_drm_init()
947 mutex_init(&vsp1->drm->lock); in vsp1_drm_init()
950 for (i = 0; i < vsp1->info->lif_count; ++i) { in vsp1_drm_init()
951 struct vsp1_drm_pipeline *drm_pipe = &vsp1->drm->pipe[i]; in vsp1_drm_init()
964 pipe->output = vsp1->wpf[i]; in vsp1_drm_init()
965 pipe->lif = &vsp1->lif[i]->entity; in vsp1_drm_init()
979 if (i < vsp1->info->uif_count) in vsp1_drm_init()
980 drm_pipe->uif = &vsp1->uif[i]->entity; in vsp1_drm_init()
984 for (i = 0; i < vsp1->info->rpf_count; ++i) { in vsp1_drm_init()
985 struct vsp1_rwpf *input = vsp1->rpf[i]; in vsp1_drm_init()
993 void vsp1_drm_cleanup(struct vsp1_device *vsp1) in vsp1_drm_cleanup() argument
995 mutex_destroy(&vsp1->drm->lock); in vsp1_drm_cleanup()