// SPDX-License-Identifier: GPL-2.0+ /* * vsp1_drm.c -- R-Car VSP1 DRM/KMS Interface * * Copyright (C) 2015 Renesas Electronics Corporation * * Contact: Laurent Pinchart ([email protected]) */ #include <linux/device.h> #include <linux/dma-mapping.h> #include <linux/slab.h> #include <media/media-entity.h> #include <media/v4l2-subdev.h> #include <media/vsp1.h> #include "vsp1.h" #include "vsp1_brx.h" #include "vsp1_dl.h" #include "vsp1_drm.h" #include "vsp1_lif.h" #include "vsp1_pipe.h" #include "vsp1_rwpf.h" #include "vsp1_uif.h" #define BRX_NAME(e) … /* ----------------------------------------------------------------------------- * Interrupt Handling */ static void vsp1_du_pipeline_frame_end(struct vsp1_pipeline *pipe, unsigned int completion) { … } /* ----------------------------------------------------------------------------- * Pipeline Configuration */ /* * Insert the UIF in the pipeline between the prev and next entities. If no UIF * is available connect the two entities directly. */ static int vsp1_du_insert_uif(struct vsp1_device *vsp1, struct vsp1_pipeline *pipe, struct vsp1_entity *uif, struct vsp1_entity *prev, unsigned int prev_pad, struct vsp1_entity *next, unsigned int next_pad) { … } /* Setup one RPF and the connected BRx sink pad. */ static int vsp1_du_pipeline_setup_rpf(struct vsp1_device *vsp1, struct vsp1_pipeline *pipe, struct vsp1_rwpf *rpf, struct vsp1_entity *uif, unsigned int brx_input) { … } /* Setup the BRx source pad. */ static int vsp1_du_pipeline_setup_inputs(struct vsp1_device *vsp1, struct vsp1_pipeline *pipe); static void vsp1_du_pipeline_configure(struct vsp1_pipeline *pipe); static int vsp1_du_pipeline_setup_brx(struct vsp1_device *vsp1, struct vsp1_pipeline *pipe) { … } static unsigned int rpf_zpos(struct vsp1_device *vsp1, struct vsp1_rwpf *rpf) { … } /* Setup the input side of the pipeline (RPFs and BRx). */ static int vsp1_du_pipeline_setup_inputs(struct vsp1_device *vsp1, struct vsp1_pipeline *pipe) { … } /* Setup the output side of the pipeline (WPF and LIF). */ static int vsp1_du_pipeline_setup_output(struct vsp1_device *vsp1, struct vsp1_pipeline *pipe) { … } /* Configure all entities in the pipeline. */ static void vsp1_du_pipeline_configure(struct vsp1_pipeline *pipe) { … } static int vsp1_du_pipeline_set_rwpf_format(struct vsp1_device *vsp1, struct vsp1_rwpf *rwpf, u32 pixelformat, unsigned int pitch) { … } /* ----------------------------------------------------------------------------- * DU Driver API */ int vsp1_du_init(struct device *dev) { … } EXPORT_SYMBOL_GPL(…); /** * vsp1_du_setup_lif - Setup the output part of the VSP pipeline * @dev: the VSP device * @pipe_index: the DRM pipeline index * @cfg: the LIF configuration * * Configure the output part of VSP DRM pipeline for the given frame @cfg.width * and @cfg.height. This sets up formats on the BRx source pad, the WPF sink and * source pads, and the LIF sink pad. * * The @pipe_index argument selects which DRM pipeline to setup. The number of * available pipelines depend on the VSP instance. * * As the media bus code on the blend unit source pad is conditioned by the * configuration of its sink 0 pad, we also set up the formats on all blend unit * sinks, even if the configuration will be overwritten later by * vsp1_du_setup_rpf(). This ensures that the blend unit configuration is set to * a well defined state. * * Return 0 on success or a negative error code on failure. */ int vsp1_du_setup_lif(struct device *dev, unsigned int pipe_index, const struct vsp1_du_lif_config *cfg) { … } EXPORT_SYMBOL_GPL(…); /** * vsp1_du_atomic_begin - Prepare for an atomic update * @dev: the VSP device * @pipe_index: the DRM pipeline index */ void vsp1_du_atomic_begin(struct device *dev, unsigned int pipe_index) { … } EXPORT_SYMBOL_GPL(…); /** * vsp1_du_atomic_update - Setup one RPF input of the VSP pipeline * @dev: the VSP device * @pipe_index: the DRM pipeline index * @rpf_index: index of the RPF to setup (0-based) * @cfg: the RPF configuration * * Configure the VSP to perform image composition through RPF @rpf_index as * described by the @cfg configuration. The image to compose is referenced by * @cfg.mem and composed using the @cfg.src crop rectangle and the @cfg.dst * composition rectangle. The Z-order is configurable with higher @zpos values * displayed on top. * * If the @cfg configuration is NULL, the RPF will be disabled. Calling the * function on a disabled RPF is allowed. * * Image format as stored in memory is expressed as a V4L2 @cfg.pixelformat * value. The memory pitch is configurable to allow for padding at end of lines, * or simply for images that extend beyond the crop rectangle boundaries. The * @cfg.pitch value is expressed in bytes and applies to all planes for * multiplanar formats. * * The source memory buffer is referenced by the DMA address of its planes in * the @cfg.mem array. Up to two planes are supported. The second plane DMA * address is ignored for formats using a single plane. * * This function isn't reentrant, the caller needs to serialize calls. * * Return 0 on success or a negative error code on failure. */ int vsp1_du_atomic_update(struct device *dev, unsigned int pipe_index, unsigned int rpf_index, const struct vsp1_du_atomic_config *cfg) { … } EXPORT_SYMBOL_GPL(…); /** * vsp1_du_atomic_flush - Commit an atomic update * @dev: the VSP device * @pipe_index: the DRM pipeline index * @cfg: atomic pipe configuration */ void vsp1_du_atomic_flush(struct device *dev, unsigned int pipe_index, const struct vsp1_du_atomic_pipe_config *cfg) { … } EXPORT_SYMBOL_GPL(…); int vsp1_du_map_sg(struct device *dev, struct sg_table *sgt) { … } EXPORT_SYMBOL_GPL(…); void vsp1_du_unmap_sg(struct device *dev, struct sg_table *sgt) { … } EXPORT_SYMBOL_GPL(…); /* ----------------------------------------------------------------------------- * Initialization */ int vsp1_drm_init(struct vsp1_device *vsp1) { … } void vsp1_drm_cleanup(struct vsp1_device *vsp1) { … }