1ee4a77a3SMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0+ */ 2ee4a77a3SMauro Carvalho Chehab /* 3ee4a77a3SMauro Carvalho Chehab * vsp1_pipe.h -- R-Car VSP1 Pipeline 4ee4a77a3SMauro Carvalho Chehab * 5ee4a77a3SMauro Carvalho Chehab * Copyright (C) 2013-2015 Renesas Electronics Corporation 6ee4a77a3SMauro Carvalho Chehab * 7ee4a77a3SMauro Carvalho Chehab * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com) 8ee4a77a3SMauro Carvalho Chehab */ 9ee4a77a3SMauro Carvalho Chehab #ifndef __VSP1_PIPE_H__ 10ee4a77a3SMauro Carvalho Chehab #define __VSP1_PIPE_H__ 11ee4a77a3SMauro Carvalho Chehab 12ee4a77a3SMauro Carvalho Chehab #include <linux/kref.h> 13ee4a77a3SMauro Carvalho Chehab #include <linux/list.h> 14ee4a77a3SMauro Carvalho Chehab #include <linux/spinlock.h> 15ee4a77a3SMauro Carvalho Chehab #include <linux/wait.h> 16ee4a77a3SMauro Carvalho Chehab 17ee4a77a3SMauro Carvalho Chehab #include <media/media-entity.h> 18ee4a77a3SMauro Carvalho Chehab 19ee4a77a3SMauro Carvalho Chehab struct vsp1_dl_list; 20ee4a77a3SMauro Carvalho Chehab struct vsp1_rwpf; 21ee4a77a3SMauro Carvalho Chehab 22ee4a77a3SMauro Carvalho Chehab /* 23ee4a77a3SMauro Carvalho Chehab * struct vsp1_format_info - VSP1 video format description 24ee4a77a3SMauro Carvalho Chehab * @fourcc: V4L2 pixel format FCC identifier 25ee4a77a3SMauro Carvalho Chehab * @mbus: media bus format code 26ee4a77a3SMauro Carvalho Chehab * @hwfmt: VSP1 hardware format 27ee4a77a3SMauro Carvalho Chehab * @swap: swap register control 28ee4a77a3SMauro Carvalho Chehab * @planes: number of planes 29ee4a77a3SMauro Carvalho Chehab * @bpp: bits per pixel 30ee4a77a3SMauro Carvalho Chehab * @swap_yc: the Y and C components are swapped (Y comes before C) 31ee4a77a3SMauro Carvalho Chehab * @swap_uv: the U and V components are swapped (V comes before U) 32ee4a77a3SMauro Carvalho Chehab * @hsub: horizontal subsampling factor 33ee4a77a3SMauro Carvalho Chehab * @vsub: vertical subsampling factor 34ee4a77a3SMauro Carvalho Chehab * @alpha: has an alpha channel 35ee4a77a3SMauro Carvalho Chehab */ 36ee4a77a3SMauro Carvalho Chehab struct vsp1_format_info { 37ee4a77a3SMauro Carvalho Chehab u32 fourcc; 38ee4a77a3SMauro Carvalho Chehab unsigned int mbus; 39ee4a77a3SMauro Carvalho Chehab unsigned int hwfmt; 40ee4a77a3SMauro Carvalho Chehab unsigned int swap; 41ee4a77a3SMauro Carvalho Chehab unsigned int planes; 42ee4a77a3SMauro Carvalho Chehab unsigned int bpp[3]; 43ee4a77a3SMauro Carvalho Chehab bool swap_yc; 44ee4a77a3SMauro Carvalho Chehab bool swap_uv; 45ee4a77a3SMauro Carvalho Chehab unsigned int hsub; 46ee4a77a3SMauro Carvalho Chehab unsigned int vsub; 47ee4a77a3SMauro Carvalho Chehab bool alpha; 48ee4a77a3SMauro Carvalho Chehab }; 49ee4a77a3SMauro Carvalho Chehab 50ee4a77a3SMauro Carvalho Chehab enum vsp1_pipeline_state { 51ee4a77a3SMauro Carvalho Chehab VSP1_PIPELINE_STOPPED, 52ee4a77a3SMauro Carvalho Chehab VSP1_PIPELINE_RUNNING, 53ee4a77a3SMauro Carvalho Chehab VSP1_PIPELINE_STOPPING, 54ee4a77a3SMauro Carvalho Chehab }; 55ee4a77a3SMauro Carvalho Chehab 56ee4a77a3SMauro Carvalho Chehab /* 57ee4a77a3SMauro Carvalho Chehab * struct vsp1_partition_window - Partition window coordinates 58ee4a77a3SMauro Carvalho Chehab * @left: horizontal coordinate of the partition start in pixels relative to the 59ee4a77a3SMauro Carvalho Chehab * left edge of the image 60ee4a77a3SMauro Carvalho Chehab * @width: partition width in pixels 61ee4a77a3SMauro Carvalho Chehab */ 62ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window { 63ee4a77a3SMauro Carvalho Chehab unsigned int left; 64ee4a77a3SMauro Carvalho Chehab unsigned int width; 65ee4a77a3SMauro Carvalho Chehab }; 66ee4a77a3SMauro Carvalho Chehab 67ee4a77a3SMauro Carvalho Chehab /* 68ee4a77a3SMauro Carvalho Chehab * struct vsp1_partition - A description of a slice for the partition algorithm 69ee4a77a3SMauro Carvalho Chehab * @rpf: The RPF partition window configuration 70ee4a77a3SMauro Carvalho Chehab * @uds_sink: The UDS input partition window configuration 71ee4a77a3SMauro Carvalho Chehab * @uds_source: The UDS output partition window configuration 72ee4a77a3SMauro Carvalho Chehab * @sru: The SRU partition window configuration 73ee4a77a3SMauro Carvalho Chehab * @wpf: The WPF partition window configuration 74ee4a77a3SMauro Carvalho Chehab */ 75ee4a77a3SMauro Carvalho Chehab struct vsp1_partition { 76*74e622f3SLaurent Pinchart struct vsp1_partition_window rpf[VSP1_MAX_RPF]; 77ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window uds_sink; 78ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window uds_source; 79ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window sru; 80ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window wpf; 81ee4a77a3SMauro Carvalho Chehab }; 82ee4a77a3SMauro Carvalho Chehab 83ee4a77a3SMauro Carvalho Chehab /* 84ee4a77a3SMauro Carvalho Chehab * struct vsp1_pipeline - A VSP1 hardware pipeline 85ee4a77a3SMauro Carvalho Chehab * @pipe: the media pipeline 86ee4a77a3SMauro Carvalho Chehab * @irqlock: protects the pipeline state 87ee4a77a3SMauro Carvalho Chehab * @state: current state 88ee4a77a3SMauro Carvalho Chehab * @wq: wait queue to wait for state change completion 89ee4a77a3SMauro Carvalho Chehab * @frame_end: frame end interrupt handler 90ee4a77a3SMauro Carvalho Chehab * @lock: protects the pipeline use count and stream count 91ee4a77a3SMauro Carvalho Chehab * @kref: pipeline reference count 92ee4a77a3SMauro Carvalho Chehab * @stream_count: number of streaming video nodes 93ee4a77a3SMauro Carvalho Chehab * @buffers_ready: bitmask of RPFs and WPFs with at least one buffer available 94ee4a77a3SMauro Carvalho Chehab * @sequence: frame sequence number 95ee4a77a3SMauro Carvalho Chehab * @num_inputs: number of RPFs 96ee4a77a3SMauro Carvalho Chehab * @inputs: array of RPFs in the pipeline (indexed by RPF index) 97ee4a77a3SMauro Carvalho Chehab * @output: WPF at the output of the pipeline 98ee4a77a3SMauro Carvalho Chehab * @brx: BRx entity, if present 99ee4a77a3SMauro Carvalho Chehab * @hgo: HGO entity, if present 100ee4a77a3SMauro Carvalho Chehab * @hgt: HGT entity, if present 101ee4a77a3SMauro Carvalho Chehab * @lif: LIF entity, if present 102ee4a77a3SMauro Carvalho Chehab * @uds: UDS entity, if present 103ee4a77a3SMauro Carvalho Chehab * @uds_input: entity at the input of the UDS, if the UDS is present 104ee4a77a3SMauro Carvalho Chehab * @entities: list of entities in the pipeline 105ee4a77a3SMauro Carvalho Chehab * @stream_config: cached stream configuration for video pipelines 106ee4a77a3SMauro Carvalho Chehab * @configured: when false the @stream_config shall be written to the hardware 107ee4a77a3SMauro Carvalho Chehab * @interlaced: True when the pipeline is configured in interlaced mode 108ee4a77a3SMauro Carvalho Chehab * @partitions: The number of partitions used to process one frame 109ee4a77a3SMauro Carvalho Chehab * @partition: The current partition for configuration to process 110ee4a77a3SMauro Carvalho Chehab * @part_table: The pre-calculated partitions used by the pipeline 111ee4a77a3SMauro Carvalho Chehab */ 112ee4a77a3SMauro Carvalho Chehab struct vsp1_pipeline { 113ee4a77a3SMauro Carvalho Chehab struct media_pipeline pipe; 114ee4a77a3SMauro Carvalho Chehab 115ee4a77a3SMauro Carvalho Chehab spinlock_t irqlock; 116ee4a77a3SMauro Carvalho Chehab enum vsp1_pipeline_state state; 117ee4a77a3SMauro Carvalho Chehab wait_queue_head_t wq; 118ee4a77a3SMauro Carvalho Chehab 119ee4a77a3SMauro Carvalho Chehab void (*frame_end)(struct vsp1_pipeline *pipe, unsigned int completion); 120ee4a77a3SMauro Carvalho Chehab 121ee4a77a3SMauro Carvalho Chehab struct mutex lock; 122ee4a77a3SMauro Carvalho Chehab struct kref kref; 123ee4a77a3SMauro Carvalho Chehab unsigned int stream_count; 124ee4a77a3SMauro Carvalho Chehab unsigned int buffers_ready; 125ee4a77a3SMauro Carvalho Chehab unsigned int sequence; 126ee4a77a3SMauro Carvalho Chehab 127ee4a77a3SMauro Carvalho Chehab unsigned int num_inputs; 128ee4a77a3SMauro Carvalho Chehab struct vsp1_rwpf *inputs[VSP1_MAX_RPF]; 129ee4a77a3SMauro Carvalho Chehab struct vsp1_rwpf *output; 130ee4a77a3SMauro Carvalho Chehab struct vsp1_entity *brx; 131ee4a77a3SMauro Carvalho Chehab struct vsp1_entity *hgo; 132ee4a77a3SMauro Carvalho Chehab struct vsp1_entity *hgt; 133ee4a77a3SMauro Carvalho Chehab struct vsp1_entity *lif; 134ee4a77a3SMauro Carvalho Chehab struct vsp1_entity *uds; 135ee4a77a3SMauro Carvalho Chehab struct vsp1_entity *uds_input; 136ee4a77a3SMauro Carvalho Chehab 137ee4a77a3SMauro Carvalho Chehab /* 138ee4a77a3SMauro Carvalho Chehab * The order of this list must be identical to the order of the entities 139ee4a77a3SMauro Carvalho Chehab * in the pipeline, as it is assumed by the partition algorithm that we 140ee4a77a3SMauro Carvalho Chehab * can walk this list in sequence. 141ee4a77a3SMauro Carvalho Chehab */ 142ee4a77a3SMauro Carvalho Chehab struct list_head entities; 143ee4a77a3SMauro Carvalho Chehab 144ee4a77a3SMauro Carvalho Chehab struct vsp1_dl_body *stream_config; 145ee4a77a3SMauro Carvalho Chehab bool configured; 146ee4a77a3SMauro Carvalho Chehab bool interlaced; 147ee4a77a3SMauro Carvalho Chehab 148ee4a77a3SMauro Carvalho Chehab unsigned int partitions; 149ee4a77a3SMauro Carvalho Chehab struct vsp1_partition *partition; 150ee4a77a3SMauro Carvalho Chehab struct vsp1_partition *part_table; 1511dc30075STomi Valkeinen 1521dc30075STomi Valkeinen u32 underrun_count; 153ee4a77a3SMauro Carvalho Chehab }; 154ee4a77a3SMauro Carvalho Chehab 155ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_reset(struct vsp1_pipeline *pipe); 156ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_init(struct vsp1_pipeline *pipe); 157ee4a77a3SMauro Carvalho Chehab 158ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_run(struct vsp1_pipeline *pipe); 159ee4a77a3SMauro Carvalho Chehab bool vsp1_pipeline_stopped(struct vsp1_pipeline *pipe); 160ee4a77a3SMauro Carvalho Chehab int vsp1_pipeline_stop(struct vsp1_pipeline *pipe); 161ee4a77a3SMauro Carvalho Chehab bool vsp1_pipeline_ready(struct vsp1_pipeline *pipe); 162ee4a77a3SMauro Carvalho Chehab 163ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe); 164ee4a77a3SMauro Carvalho Chehab 165ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_propagate_alpha(struct vsp1_pipeline *pipe, 166ee4a77a3SMauro Carvalho Chehab struct vsp1_dl_body *dlb, 167ee4a77a3SMauro Carvalho Chehab unsigned int alpha); 168ee4a77a3SMauro Carvalho Chehab 169ee4a77a3SMauro Carvalho Chehab void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe, 170ee4a77a3SMauro Carvalho Chehab struct vsp1_partition *partition, 171ee4a77a3SMauro Carvalho Chehab unsigned int index, 172ee4a77a3SMauro Carvalho Chehab struct vsp1_partition_window *window); 173ee4a77a3SMauro Carvalho Chehab 174ee4a77a3SMauro Carvalho Chehab const struct vsp1_format_info *vsp1_get_format_info(struct vsp1_device *vsp1, 175ee4a77a3SMauro Carvalho Chehab u32 fourcc); 176ee4a77a3SMauro Carvalho Chehab 177ee4a77a3SMauro Carvalho Chehab #endif /* __VSP1_PIPE_H__ */ 178