1  // SPDX-License-Identifier: GPL-2.0
2  // Copyright (C) 2018 Intel Corporation
3  
4  #include <linux/module.h>
5  #include <linux/pm_runtime.h>
6  
7  #include <media/v4l2-event.h>
8  #include <media/v4l2-ioctl.h>
9  
10  #include "ipu3.h"
11  #include "ipu3-dmamap.h"
12  
13  /******************** v4l2_subdev_ops ********************/
14  
15  #define IPU3_RUNNING_MODE_VIDEO		0
16  #define IPU3_RUNNING_MODE_STILL		1
17  
imgu_subdev_open(struct v4l2_subdev * sd,struct v4l2_subdev_fh * fh)18  static int imgu_subdev_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
19  {
20  	struct imgu_v4l2_subdev *imgu_sd = container_of(sd,
21  							struct imgu_v4l2_subdev,
22  							subdev);
23  	struct imgu_device *imgu = v4l2_get_subdevdata(sd);
24  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[imgu_sd->pipe];
25  	struct v4l2_rect try_crop = {
26  		.top = 0,
27  		.left = 0,
28  	};
29  	unsigned int i;
30  
31  	try_crop.width =
32  		imgu_pipe->nodes[IMGU_NODE_IN].vdev_fmt.fmt.pix_mp.width;
33  	try_crop.height =
34  		imgu_pipe->nodes[IMGU_NODE_IN].vdev_fmt.fmt.pix_mp.height;
35  
36  	/* Initialize try_fmt */
37  	for (i = 0; i < IMGU_NODE_NUM; i++) {
38  		struct v4l2_mbus_framefmt *try_fmt =
39  			v4l2_subdev_state_get_format(fh->state, i);
40  
41  		try_fmt->width = try_crop.width;
42  		try_fmt->height = try_crop.height;
43  		try_fmt->code = imgu_pipe->nodes[i].pad_fmt.code;
44  		try_fmt->field = V4L2_FIELD_NONE;
45  	}
46  
47  	*v4l2_subdev_state_get_crop(fh->state, IMGU_NODE_IN) = try_crop;
48  	*v4l2_subdev_state_get_compose(fh->state, IMGU_NODE_IN) = try_crop;
49  
50  	return 0;
51  }
52  
imgu_subdev_s_stream(struct v4l2_subdev * sd,int enable)53  static int imgu_subdev_s_stream(struct v4l2_subdev *sd, int enable)
54  {
55  	int i;
56  	unsigned int node;
57  	int r = 0;
58  	struct imgu_device *imgu = v4l2_get_subdevdata(sd);
59  	struct imgu_v4l2_subdev *imgu_sd = container_of(sd,
60  							struct imgu_v4l2_subdev,
61  							subdev);
62  	unsigned int pipe = imgu_sd->pipe;
63  	struct device *dev = &imgu->pci_dev->dev;
64  	struct v4l2_pix_format_mplane *fmts[IPU3_CSS_QUEUES] = { NULL };
65  	struct v4l2_rect *rects[IPU3_CSS_RECTS] = { NULL };
66  	struct imgu_css_pipe *css_pipe = &imgu->css.pipes[pipe];
67  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
68  
69  	dev_dbg(dev, "%s %d for pipe %u", __func__, enable, pipe);
70  	/* grab ctrl after streamon and return after off */
71  	v4l2_ctrl_grab(imgu_sd->ctrl, enable);
72  
73  	if (!enable) {
74  		imgu_sd->active = false;
75  		return 0;
76  	}
77  
78  	for (i = 0; i < IMGU_NODE_NUM; i++)
79  		imgu_pipe->queue_enabled[i] = imgu_pipe->nodes[i].enabled;
80  
81  	/* This is handled specially */
82  	imgu_pipe->queue_enabled[IPU3_CSS_QUEUE_PARAMS] = false;
83  
84  	/* Initialize CSS formats */
85  	for (i = 0; i < IPU3_CSS_QUEUES; i++) {
86  		node = imgu_map_node(imgu, i);
87  		/* No need to reconfig meta nodes */
88  		if (node == IMGU_NODE_STAT_3A || node == IMGU_NODE_PARAMS)
89  			continue;
90  		fmts[i] = imgu_pipe->queue_enabled[node] ?
91  			&imgu_pipe->nodes[node].vdev_fmt.fmt.pix_mp : NULL;
92  	}
93  
94  	/* Enable VF output only when VF queue requested by user */
95  	css_pipe->vf_output_en = false;
96  	if (imgu_pipe->nodes[IMGU_NODE_VF].enabled)
97  		css_pipe->vf_output_en = true;
98  
99  	if (atomic_read(&imgu_sd->running_mode) == IPU3_RUNNING_MODE_VIDEO)
100  		css_pipe->pipe_id = IPU3_CSS_PIPE_ID_VIDEO;
101  	else
102  		css_pipe->pipe_id = IPU3_CSS_PIPE_ID_CAPTURE;
103  
104  	dev_dbg(dev, "IPU3 pipe %u pipe_id %u", pipe, css_pipe->pipe_id);
105  
106  	rects[IPU3_CSS_RECT_EFFECTIVE] = &imgu_sd->rect.eff;
107  	rects[IPU3_CSS_RECT_BDS] = &imgu_sd->rect.bds;
108  	rects[IPU3_CSS_RECT_GDC] = &imgu_sd->rect.gdc;
109  
110  	r = imgu_css_fmt_set(&imgu->css, fmts, rects, pipe);
111  	if (r) {
112  		dev_err(dev, "failed to set initial formats pipe %u with (%d)",
113  			pipe, r);
114  		return r;
115  	}
116  
117  	imgu_sd->active = true;
118  
119  	return 0;
120  }
121  
imgu_subdev_get_fmt(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)122  static int imgu_subdev_get_fmt(struct v4l2_subdev *sd,
123  			       struct v4l2_subdev_state *sd_state,
124  			       struct v4l2_subdev_format *fmt)
125  {
126  	struct imgu_device *imgu = v4l2_get_subdevdata(sd);
127  	struct v4l2_mbus_framefmt *mf;
128  	struct imgu_media_pipe *imgu_pipe;
129  	u32 pad = fmt->pad;
130  	struct imgu_v4l2_subdev *imgu_sd = container_of(sd,
131  							struct imgu_v4l2_subdev,
132  							subdev);
133  	unsigned int pipe = imgu_sd->pipe;
134  
135  	imgu_pipe = &imgu->imgu_pipe[pipe];
136  	if (fmt->which == V4L2_SUBDEV_FORMAT_ACTIVE) {
137  		fmt->format = imgu_pipe->nodes[pad].pad_fmt;
138  	} else {
139  		mf = v4l2_subdev_state_get_format(sd_state, pad);
140  		fmt->format = *mf;
141  	}
142  
143  	return 0;
144  }
145  
imgu_subdev_set_fmt(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_format * fmt)146  static int imgu_subdev_set_fmt(struct v4l2_subdev *sd,
147  			       struct v4l2_subdev_state *sd_state,
148  			       struct v4l2_subdev_format *fmt)
149  {
150  	struct imgu_media_pipe *imgu_pipe;
151  	struct imgu_device *imgu = v4l2_get_subdevdata(sd);
152  	struct imgu_v4l2_subdev *imgu_sd = container_of(sd,
153  							struct imgu_v4l2_subdev,
154  							subdev);
155  	struct v4l2_mbus_framefmt *mf;
156  	u32 pad = fmt->pad;
157  	unsigned int pipe = imgu_sd->pipe;
158  
159  	dev_dbg(&imgu->pci_dev->dev, "set subdev %u pad %u fmt to [%ux%u]",
160  		pipe, pad, fmt->format.width, fmt->format.height);
161  
162  	imgu_pipe = &imgu->imgu_pipe[pipe];
163  	if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
164  		mf = v4l2_subdev_state_get_format(sd_state, pad);
165  	else
166  		mf = &imgu_pipe->nodes[pad].pad_fmt;
167  
168  	fmt->format.code = mf->code;
169  	/* Clamp the w and h based on the hardware capabilities */
170  	if (imgu_sd->subdev_pads[pad].flags & MEDIA_PAD_FL_SOURCE) {
171  		fmt->format.width = clamp(fmt->format.width,
172  					  IPU3_OUTPUT_MIN_WIDTH,
173  					  IPU3_OUTPUT_MAX_WIDTH);
174  		fmt->format.height = clamp(fmt->format.height,
175  					   IPU3_OUTPUT_MIN_HEIGHT,
176  					   IPU3_OUTPUT_MAX_HEIGHT);
177  	} else {
178  		fmt->format.width = clamp(fmt->format.width,
179  					  IPU3_INPUT_MIN_WIDTH,
180  					  IPU3_INPUT_MAX_WIDTH);
181  		fmt->format.height = clamp(fmt->format.height,
182  					   IPU3_INPUT_MIN_HEIGHT,
183  					   IPU3_INPUT_MAX_HEIGHT);
184  	}
185  
186  	*mf = fmt->format;
187  
188  	return 0;
189  }
190  
191  static struct v4l2_rect *
imgu_subdev_get_crop(struct imgu_v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,unsigned int pad,enum v4l2_subdev_format_whence which)192  imgu_subdev_get_crop(struct imgu_v4l2_subdev *sd,
193  		     struct v4l2_subdev_state *sd_state, unsigned int pad,
194  		     enum v4l2_subdev_format_whence which)
195  {
196  	if (which == V4L2_SUBDEV_FORMAT_TRY)
197  		return v4l2_subdev_state_get_crop(sd_state, pad);
198  	else
199  		return &sd->rect.eff;
200  }
201  
202  static struct v4l2_rect *
imgu_subdev_get_compose(struct imgu_v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,unsigned int pad,enum v4l2_subdev_format_whence which)203  imgu_subdev_get_compose(struct imgu_v4l2_subdev *sd,
204  			struct v4l2_subdev_state *sd_state, unsigned int pad,
205  			enum v4l2_subdev_format_whence which)
206  {
207  	if (which == V4L2_SUBDEV_FORMAT_TRY)
208  		return v4l2_subdev_state_get_compose(sd_state, pad);
209  	else
210  		return &sd->rect.bds;
211  }
212  
imgu_subdev_get_selection(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_selection * sel)213  static int imgu_subdev_get_selection(struct v4l2_subdev *sd,
214  				     struct v4l2_subdev_state *sd_state,
215  				     struct v4l2_subdev_selection *sel)
216  {
217  	struct imgu_v4l2_subdev *imgu_sd =
218  		container_of(sd, struct imgu_v4l2_subdev, subdev);
219  
220  	if (sel->pad != IMGU_NODE_IN)
221  		return -EINVAL;
222  
223  	switch (sel->target) {
224  	case V4L2_SEL_TGT_CROP:
225  		sel->r = *imgu_subdev_get_crop(imgu_sd, sd_state, sel->pad,
226  					       sel->which);
227  		return 0;
228  	case V4L2_SEL_TGT_COMPOSE:
229  		sel->r = *imgu_subdev_get_compose(imgu_sd, sd_state, sel->pad,
230  						  sel->which);
231  		return 0;
232  	default:
233  		return -EINVAL;
234  	}
235  }
236  
imgu_subdev_set_selection(struct v4l2_subdev * sd,struct v4l2_subdev_state * sd_state,struct v4l2_subdev_selection * sel)237  static int imgu_subdev_set_selection(struct v4l2_subdev *sd,
238  				     struct v4l2_subdev_state *sd_state,
239  				     struct v4l2_subdev_selection *sel)
240  {
241  	struct imgu_device *imgu = v4l2_get_subdevdata(sd);
242  	struct imgu_v4l2_subdev *imgu_sd =
243  		container_of(sd, struct imgu_v4l2_subdev, subdev);
244  	struct v4l2_rect *rect;
245  
246  	dev_dbg(&imgu->pci_dev->dev,
247  		 "set subdev %u sel which %u target 0x%4x rect [%ux%u]",
248  		 imgu_sd->pipe, sel->which, sel->target,
249  		 sel->r.width, sel->r.height);
250  
251  	if (sel->pad != IMGU_NODE_IN)
252  		return -EINVAL;
253  
254  	switch (sel->target) {
255  	case V4L2_SEL_TGT_CROP:
256  		rect = imgu_subdev_get_crop(imgu_sd, sd_state, sel->pad,
257  					    sel->which);
258  		break;
259  	case V4L2_SEL_TGT_COMPOSE:
260  		rect = imgu_subdev_get_compose(imgu_sd, sd_state, sel->pad,
261  					       sel->which);
262  		break;
263  	default:
264  		return -EINVAL;
265  	}
266  
267  	*rect = sel->r;
268  	return 0;
269  }
270  
271  /******************** media_entity_operations ********************/
272  
imgu_link_setup(struct media_entity * entity,const struct media_pad * local,const struct media_pad * remote,u32 flags)273  static int imgu_link_setup(struct media_entity *entity,
274  			   const struct media_pad *local,
275  			   const struct media_pad *remote, u32 flags)
276  {
277  	struct imgu_media_pipe *imgu_pipe;
278  	struct v4l2_subdev *sd = container_of(entity, struct v4l2_subdev,
279  					      entity);
280  	struct imgu_device *imgu = v4l2_get_subdevdata(sd);
281  	struct imgu_v4l2_subdev *imgu_sd = container_of(sd,
282  							struct imgu_v4l2_subdev,
283  							subdev);
284  	unsigned int pipe = imgu_sd->pipe;
285  	u32 pad = local->index;
286  
287  	WARN_ON(pad >= IMGU_NODE_NUM);
288  
289  	dev_dbg(&imgu->pci_dev->dev, "pipe %u pad %u is %s", pipe, pad,
290  		 flags & MEDIA_LNK_FL_ENABLED ? "enabled" : "disabled");
291  
292  	imgu_pipe = &imgu->imgu_pipe[pipe];
293  	imgu_pipe->nodes[pad].enabled = flags & MEDIA_LNK_FL_ENABLED;
294  
295  	/* enable input node to enable the pipe */
296  	if (pad != IMGU_NODE_IN)
297  		return 0;
298  
299  	if (flags & MEDIA_LNK_FL_ENABLED)
300  		__set_bit(pipe, imgu->css.enabled_pipes);
301  	else
302  		__clear_bit(pipe, imgu->css.enabled_pipes);
303  
304  	dev_dbg(&imgu->pci_dev->dev, "pipe %u is %s", pipe,
305  		 flags & MEDIA_LNK_FL_ENABLED ? "enabled" : "disabled");
306  
307  	return 0;
308  }
309  
310  /******************** vb2_ops ********************/
311  
imgu_vb2_buf_init(struct vb2_buffer * vb)312  static int imgu_vb2_buf_init(struct vb2_buffer *vb)
313  {
314  	struct sg_table *sg = vb2_dma_sg_plane_desc(vb, 0);
315  	struct imgu_device *imgu = vb2_get_drv_priv(vb->vb2_queue);
316  	struct imgu_buffer *buf = container_of(vb,
317  		struct imgu_buffer, vid_buf.vbb.vb2_buf);
318  	struct imgu_video_device *node =
319  		container_of(vb->vb2_queue, struct imgu_video_device, vbq);
320  	unsigned int queue = imgu_node_to_queue(node->id);
321  
322  	if (queue == IPU3_CSS_QUEUE_PARAMS)
323  		return 0;
324  
325  	return imgu_dmamap_map_sg(imgu, sg->sgl, sg->nents, &buf->map);
326  }
327  
328  /* Called when each buffer is freed */
imgu_vb2_buf_cleanup(struct vb2_buffer * vb)329  static void imgu_vb2_buf_cleanup(struct vb2_buffer *vb)
330  {
331  	struct imgu_device *imgu = vb2_get_drv_priv(vb->vb2_queue);
332  	struct imgu_buffer *buf = container_of(vb,
333  		struct imgu_buffer, vid_buf.vbb.vb2_buf);
334  	struct imgu_video_device *node =
335  		container_of(vb->vb2_queue, struct imgu_video_device, vbq);
336  	unsigned int queue = imgu_node_to_queue(node->id);
337  
338  	if (queue == IPU3_CSS_QUEUE_PARAMS)
339  		return;
340  
341  	imgu_dmamap_unmap(imgu, &buf->map);
342  }
343  
344  /* Transfer buffer ownership to me */
imgu_vb2_buf_queue(struct vb2_buffer * vb)345  static void imgu_vb2_buf_queue(struct vb2_buffer *vb)
346  {
347  	struct imgu_device *imgu = vb2_get_drv_priv(vb->vb2_queue);
348  	struct imgu_video_device *node =
349  		container_of(vb->vb2_queue, struct imgu_video_device, vbq);
350  	unsigned int queue = imgu_node_to_queue(node->id);
351  	struct imgu_buffer *buf = container_of(vb, struct imgu_buffer,
352  					       vid_buf.vbb.vb2_buf);
353  	unsigned long need_bytes;
354  	unsigned long payload = vb2_get_plane_payload(vb, 0);
355  
356  	if (vb->vb2_queue->type == V4L2_BUF_TYPE_META_CAPTURE ||
357  	    vb->vb2_queue->type == V4L2_BUF_TYPE_META_OUTPUT)
358  		need_bytes = node->vdev_fmt.fmt.meta.buffersize;
359  	else
360  		need_bytes = node->vdev_fmt.fmt.pix_mp.plane_fmt[0].sizeimage;
361  
362  	if (queue == IPU3_CSS_QUEUE_PARAMS && payload && payload < need_bytes) {
363  		dev_err(&imgu->pci_dev->dev, "invalid data size for params.");
364  		vb2_buffer_done(vb, VB2_BUF_STATE_ERROR);
365  		return;
366  	}
367  
368  	mutex_lock(&imgu->lock);
369  	if (queue != IPU3_CSS_QUEUE_PARAMS)
370  		imgu_css_buf_init(&buf->css_buf, queue, buf->map.daddr);
371  
372  	list_add_tail(&buf->vid_buf.list, &node->buffers);
373  	mutex_unlock(&imgu->lock);
374  
375  	vb2_set_plane_payload(vb, 0, need_bytes);
376  
377  	mutex_lock(&imgu->streaming_lock);
378  	if (imgu->streaming)
379  		imgu_queue_buffers(imgu, false, node->pipe);
380  	mutex_unlock(&imgu->streaming_lock);
381  
382  	dev_dbg(&imgu->pci_dev->dev, "%s for pipe %u node %u", __func__,
383  		node->pipe, node->id);
384  }
385  
imgu_vb2_queue_setup(struct vb2_queue * vq,unsigned int * num_buffers,unsigned int * num_planes,unsigned int sizes[],struct device * alloc_devs[])386  static int imgu_vb2_queue_setup(struct vb2_queue *vq,
387  				unsigned int *num_buffers,
388  				unsigned int *num_planes,
389  				unsigned int sizes[],
390  				struct device *alloc_devs[])
391  {
392  	struct imgu_device *imgu = vb2_get_drv_priv(vq);
393  	struct imgu_video_device *node =
394  		container_of(vq, struct imgu_video_device, vbq);
395  	const struct v4l2_format *fmt = &node->vdev_fmt;
396  	unsigned int size;
397  
398  	*num_buffers = clamp_val(*num_buffers, 1, VB2_MAX_FRAME);
399  	alloc_devs[0] = &imgu->pci_dev->dev;
400  
401  	if (vq->type == V4L2_BUF_TYPE_META_CAPTURE ||
402  	    vq->type == V4L2_BUF_TYPE_META_OUTPUT)
403  		size = fmt->fmt.meta.buffersize;
404  	else
405  		size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
406  
407  	if (*num_planes) {
408  		if (sizes[0] < size)
409  			return -EINVAL;
410  		size = sizes[0];
411  	}
412  
413  	*num_planes = 1;
414  	sizes[0] = size;
415  
416  	/* Initialize buffer queue */
417  	INIT_LIST_HEAD(&node->buffers);
418  
419  	return 0;
420  }
421  
422  /* Check if all enabled video nodes are streaming, exception ignored */
imgu_all_nodes_streaming(struct imgu_device * imgu,struct imgu_video_device * except)423  static bool imgu_all_nodes_streaming(struct imgu_device *imgu,
424  				     struct imgu_video_device *except)
425  {
426  	unsigned int i, pipe, p;
427  	struct imgu_video_device *node;
428  	struct device *dev = &imgu->pci_dev->dev;
429  
430  	pipe = except->pipe;
431  	if (!test_bit(pipe, imgu->css.enabled_pipes)) {
432  		dev_warn(&imgu->pci_dev->dev,
433  			 "pipe %u link is not ready yet", pipe);
434  		return false;
435  	}
436  
437  	for_each_set_bit(p, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) {
438  		for (i = 0; i < IMGU_NODE_NUM; i++) {
439  			node = &imgu->imgu_pipe[p].nodes[i];
440  			dev_dbg(dev, "%s pipe %u queue %u name %s enabled = %u",
441  				__func__, p, i, node->name, node->enabled);
442  			if (node == except)
443  				continue;
444  			if (node->enabled && !vb2_start_streaming_called(&node->vbq))
445  				return false;
446  		}
447  	}
448  
449  	return true;
450  }
451  
imgu_return_all_buffers(struct imgu_device * imgu,struct imgu_video_device * node,enum vb2_buffer_state state)452  static void imgu_return_all_buffers(struct imgu_device *imgu,
453  				    struct imgu_video_device *node,
454  				    enum vb2_buffer_state state)
455  {
456  	struct imgu_vb2_buffer *b, *b0;
457  
458  	/* Return all buffers */
459  	mutex_lock(&imgu->lock);
460  	list_for_each_entry_safe(b, b0, &node->buffers, list) {
461  		list_del(&b->list);
462  		vb2_buffer_done(&b->vbb.vb2_buf, state);
463  	}
464  	mutex_unlock(&imgu->lock);
465  }
466  
imgu_vb2_start_streaming(struct vb2_queue * vq,unsigned int count)467  static int imgu_vb2_start_streaming(struct vb2_queue *vq, unsigned int count)
468  {
469  	struct imgu_media_pipe *imgu_pipe;
470  	struct imgu_device *imgu = vb2_get_drv_priv(vq);
471  	struct device *dev = &imgu->pci_dev->dev;
472  	struct imgu_video_device *node =
473  		container_of(vq, struct imgu_video_device, vbq);
474  	int r;
475  	unsigned int pipe;
476  
477  	dev_dbg(dev, "%s node name %s pipe %u id %u", __func__,
478  		node->name, node->pipe, node->id);
479  
480  	mutex_lock(&imgu->streaming_lock);
481  	if (imgu->streaming) {
482  		r = -EBUSY;
483  		mutex_unlock(&imgu->streaming_lock);
484  		goto fail_return_bufs;
485  	}
486  	mutex_unlock(&imgu->streaming_lock);
487  
488  	if (!node->enabled) {
489  		dev_err(dev, "IMGU node is not enabled");
490  		r = -EINVAL;
491  		goto fail_return_bufs;
492  	}
493  
494  	pipe = node->pipe;
495  	imgu_pipe = &imgu->imgu_pipe[pipe];
496  	atomic_set(&node->sequence, 0);
497  	r = video_device_pipeline_start(&node->vdev, &imgu_pipe->pipeline);
498  	if (r < 0)
499  		goto fail_return_bufs;
500  
501  	if (!imgu_all_nodes_streaming(imgu, node))
502  		return 0;
503  
504  	for_each_set_bit(pipe, imgu->css.enabled_pipes, IMGU_MAX_PIPE_NUM) {
505  		r = v4l2_subdev_call(&imgu->imgu_pipe[pipe].imgu_sd.subdev,
506  				     video, s_stream, 1);
507  		if (r < 0)
508  			goto fail_stop_pipeline;
509  	}
510  
511  	/* Start streaming of the whole pipeline now */
512  	dev_dbg(dev, "IMGU streaming is ready to start");
513  	mutex_lock(&imgu->streaming_lock);
514  	r = imgu_s_stream(imgu, true);
515  	if (!r)
516  		imgu->streaming = true;
517  	mutex_unlock(&imgu->streaming_lock);
518  
519  	return 0;
520  
521  fail_stop_pipeline:
522  	video_device_pipeline_stop(&node->vdev);
523  fail_return_bufs:
524  	imgu_return_all_buffers(imgu, node, VB2_BUF_STATE_QUEUED);
525  
526  	return r;
527  }
528  
imgu_vb2_stop_streaming(struct vb2_queue * vq)529  static void imgu_vb2_stop_streaming(struct vb2_queue *vq)
530  {
531  	struct imgu_media_pipe *imgu_pipe;
532  	struct imgu_device *imgu = vb2_get_drv_priv(vq);
533  	struct device *dev = &imgu->pci_dev->dev;
534  	struct imgu_video_device *node =
535  		container_of(vq, struct imgu_video_device, vbq);
536  	int r;
537  	unsigned int pipe;
538  	bool stop_streaming = false;
539  
540  	/* Verify that the node had been setup with imgu_v4l2_node_setup() */
541  	WARN_ON(!node->enabled);
542  
543  	pipe = node->pipe;
544  	dev_dbg(dev, "Try to stream off node [%u][%u]", pipe, node->id);
545  
546  	/*
547  	 * When the first node of a streaming setup is stopped, the entire
548  	 * pipeline needs to stop before individual nodes are disabled.
549  	 * Perform the inverse of the initial setup.
550  	 *
551  	 * Part 1 - s_stream on the entire pipeline
552  	 */
553  	mutex_lock(&imgu->streaming_lock);
554  	if (imgu->streaming) {
555  		/* Yes, really stop streaming now */
556  		dev_dbg(dev, "IMGU streaming is ready to stop");
557  		r = imgu_s_stream(imgu, false);
558  		if (!r)
559  			imgu->streaming = false;
560  		stop_streaming = true;
561  	}
562  	mutex_unlock(&imgu->streaming_lock);
563  
564  	/* Part 2 - s_stream on subdevs
565  	 *
566  	 * If we call s_stream multiple times, Linux v6.7's call_s_stream()
567  	 * WARNs and aborts. Thus, disable all pipes at once, and only once.
568  	 */
569  	if (stop_streaming) {
570  		for_each_set_bit(pipe, imgu->css.enabled_pipes,
571  				 IMGU_MAX_PIPE_NUM) {
572  			imgu_pipe = &imgu->imgu_pipe[pipe];
573  
574  			r = v4l2_subdev_call(&imgu_pipe->imgu_sd.subdev,
575  					     video, s_stream, 0);
576  			if (r)
577  				dev_err(&imgu->pci_dev->dev,
578  					"failed to stop subdev streaming\n");
579  		}
580  	}
581  
582  	/* Part 3 - individual node teardown */
583  	video_device_pipeline_stop(&node->vdev);
584  	imgu_return_all_buffers(imgu, node, VB2_BUF_STATE_ERROR);
585  }
586  
587  /******************** v4l2_ioctl_ops ********************/
588  
589  #define VID_CAPTURE	0
590  #define VID_OUTPUT	1
591  #define DEF_VID_CAPTURE	0
592  #define DEF_VID_OUTPUT	1
593  
594  struct imgu_fmt {
595  	u32	fourcc;
596  	u16	type; /* VID_CAPTURE or VID_OUTPUT not both */
597  };
598  
599  /* format descriptions for capture and preview */
600  static const struct imgu_fmt formats[] = {
601  	{ V4L2_PIX_FMT_NV12, VID_CAPTURE },
602  	{ V4L2_PIX_FMT_IPU3_SGRBG10, VID_OUTPUT },
603  	{ V4L2_PIX_FMT_IPU3_SBGGR10, VID_OUTPUT },
604  	{ V4L2_PIX_FMT_IPU3_SGBRG10, VID_OUTPUT },
605  	{ V4L2_PIX_FMT_IPU3_SRGGB10, VID_OUTPUT },
606  };
607  
608  /* Find the first matched format, return default if not found */
find_format(struct v4l2_format * f,u32 type)609  static const struct imgu_fmt *find_format(struct v4l2_format *f, u32 type)
610  {
611  	unsigned int i;
612  
613  	for (i = 0; i < ARRAY_SIZE(formats); i++) {
614  		if (formats[i].fourcc == f->fmt.pix_mp.pixelformat &&
615  		    formats[i].type == type)
616  			return &formats[i];
617  	}
618  
619  	return type == VID_CAPTURE ? &formats[DEF_VID_CAPTURE] :
620  				     &formats[DEF_VID_OUTPUT];
621  }
622  
imgu_vidioc_querycap(struct file * file,void * fh,struct v4l2_capability * cap)623  static int imgu_vidioc_querycap(struct file *file, void *fh,
624  				struct v4l2_capability *cap)
625  {
626  	struct imgu_device *imgu = video_drvdata(file);
627  
628  	strscpy(cap->driver, IMGU_NAME, sizeof(cap->driver));
629  	strscpy(cap->card, IMGU_NAME, sizeof(cap->card));
630  	snprintf(cap->bus_info, sizeof(cap->bus_info), "PCI:%s",
631  		 pci_name(imgu->pci_dev));
632  
633  	return 0;
634  }
635  
enum_fmts(struct v4l2_fmtdesc * f,u32 type)636  static int enum_fmts(struct v4l2_fmtdesc *f, u32 type)
637  {
638  	unsigned int i, j;
639  
640  	if (f->mbus_code != 0 && f->mbus_code != MEDIA_BUS_FMT_FIXED)
641  		return -EINVAL;
642  
643  	for (i = j = 0; i < ARRAY_SIZE(formats); ++i) {
644  		if (formats[i].type == type) {
645  			if (j == f->index)
646  				break;
647  			++j;
648  		}
649  	}
650  
651  	if (i < ARRAY_SIZE(formats)) {
652  		f->pixelformat = formats[i].fourcc;
653  		return 0;
654  	}
655  
656  	return -EINVAL;
657  }
658  
vidioc_enum_fmt_vid_cap(struct file * file,void * priv,struct v4l2_fmtdesc * f)659  static int vidioc_enum_fmt_vid_cap(struct file *file, void *priv,
660  				   struct v4l2_fmtdesc *f)
661  {
662  	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
663  		return -EINVAL;
664  
665  	return enum_fmts(f, VID_CAPTURE);
666  }
667  
vidioc_enum_fmt_vid_out(struct file * file,void * priv,struct v4l2_fmtdesc * f)668  static int vidioc_enum_fmt_vid_out(struct file *file, void *priv,
669  				   struct v4l2_fmtdesc *f)
670  {
671  	if (f->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
672  		return -EINVAL;
673  
674  	return enum_fmts(f, VID_OUTPUT);
675  }
676  
677  /* Propagate forward always the format from the CIO2 subdev */
imgu_vidioc_g_fmt(struct file * file,void * fh,struct v4l2_format * f)678  static int imgu_vidioc_g_fmt(struct file *file, void *fh,
679  			     struct v4l2_format *f)
680  {
681  	struct imgu_video_device *node = file_to_intel_imgu_node(file);
682  
683  	f->fmt = node->vdev_fmt.fmt;
684  
685  	return 0;
686  }
687  
688  /*
689   * Set input/output format. Unless it is just a try, this also resets
690   * selections (ie. effective and BDS resolutions) to defaults.
691   */
imgu_fmt(struct imgu_device * imgu,unsigned int pipe,int node,struct v4l2_format * f,bool try)692  static int imgu_fmt(struct imgu_device *imgu, unsigned int pipe, int node,
693  		    struct v4l2_format *f, bool try)
694  {
695  	struct device *dev = &imgu->pci_dev->dev;
696  	struct v4l2_pix_format_mplane *fmts[IPU3_CSS_QUEUES] = { NULL };
697  	struct v4l2_rect *rects[IPU3_CSS_RECTS] = { NULL };
698  	struct v4l2_mbus_framefmt pad_fmt;
699  	unsigned int i, css_q;
700  	int ret;
701  	struct imgu_css_pipe *css_pipe = &imgu->css.pipes[pipe];
702  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
703  	struct imgu_v4l2_subdev *imgu_sd = &imgu_pipe->imgu_sd;
704  
705  	dev_dbg(dev, "set fmt node [%u][%u](try = %u)", pipe, node, try);
706  
707  	for (i = 0; i < IMGU_NODE_NUM; i++)
708  		dev_dbg(dev, "IMGU pipe %u node %u enabled = %u",
709  			pipe, i, imgu_pipe->nodes[i].enabled);
710  
711  	if (imgu_pipe->nodes[IMGU_NODE_VF].enabled)
712  		css_pipe->vf_output_en = true;
713  
714  	if (atomic_read(&imgu_sd->running_mode) == IPU3_RUNNING_MODE_VIDEO)
715  		css_pipe->pipe_id = IPU3_CSS_PIPE_ID_VIDEO;
716  	else
717  		css_pipe->pipe_id = IPU3_CSS_PIPE_ID_CAPTURE;
718  
719  	dev_dbg(dev, "IPU3 pipe %u pipe_id = %u", pipe, css_pipe->pipe_id);
720  
721  	css_q = imgu_node_to_queue(node);
722  	for (i = 0; i < IPU3_CSS_QUEUES; i++) {
723  		unsigned int inode = imgu_map_node(imgu, i);
724  
725  		/* Skip the meta node */
726  		if (inode == IMGU_NODE_STAT_3A || inode == IMGU_NODE_PARAMS)
727  			continue;
728  
729  		/* CSS expects some format on OUT queue */
730  		if (i != IPU3_CSS_QUEUE_OUT &&
731  		    !imgu_pipe->nodes[inode].enabled && !try) {
732  			fmts[i] = NULL;
733  			continue;
734  		}
735  
736  		if (i == css_q) {
737  			fmts[i] = &f->fmt.pix_mp;
738  			continue;
739  		}
740  
741  		if (try) {
742  			fmts[i] = kmemdup(&imgu_pipe->nodes[inode].vdev_fmt.fmt.pix_mp,
743  					  sizeof(struct v4l2_pix_format_mplane),
744  					  GFP_KERNEL);
745  			if (!fmts[i]) {
746  				ret = -ENOMEM;
747  				goto out;
748  			}
749  		} else {
750  			fmts[i] = &imgu_pipe->nodes[inode].vdev_fmt.fmt.pix_mp;
751  		}
752  
753  	}
754  
755  	if (!try) {
756  		/* eff and bds res got by imgu_s_sel */
757  		struct imgu_v4l2_subdev *imgu_sd = &imgu_pipe->imgu_sd;
758  
759  		rects[IPU3_CSS_RECT_EFFECTIVE] = &imgu_sd->rect.eff;
760  		rects[IPU3_CSS_RECT_BDS] = &imgu_sd->rect.bds;
761  		rects[IPU3_CSS_RECT_GDC] = &imgu_sd->rect.gdc;
762  
763  		/* suppose that pad fmt was set by subdev s_fmt before */
764  		pad_fmt = imgu_pipe->nodes[IMGU_NODE_IN].pad_fmt;
765  		rects[IPU3_CSS_RECT_GDC]->width = pad_fmt.width;
766  		rects[IPU3_CSS_RECT_GDC]->height = pad_fmt.height;
767  	}
768  
769  	if (!fmts[css_q]) {
770  		ret = -EINVAL;
771  		goto out;
772  	}
773  
774  	if (try)
775  		ret = imgu_css_fmt_try(&imgu->css, fmts, rects, pipe);
776  	else
777  		ret = imgu_css_fmt_set(&imgu->css, fmts, rects, pipe);
778  
779  	/* ret is the binary number in the firmware blob */
780  	if (ret < 0)
781  		goto out;
782  
783  	/*
784  	 * imgu doesn't set the node to the value given by user
785  	 * before we return success from this function, so set it here.
786  	 */
787  	if (!try)
788  		imgu_pipe->nodes[node].vdev_fmt.fmt.pix_mp = f->fmt.pix_mp;
789  
790  out:
791  	if (try) {
792  		for (i = 0; i < IPU3_CSS_QUEUES; i++)
793  			if (i != css_q)
794  				kfree(fmts[i]);
795  	}
796  
797  	return ret;
798  }
799  
imgu_try_fmt(struct file * file,void * fh,struct v4l2_format * f)800  static int imgu_try_fmt(struct file *file, void *fh, struct v4l2_format *f)
801  {
802  	struct v4l2_pix_format_mplane *pixm = &f->fmt.pix_mp;
803  	const struct imgu_fmt *fmt;
804  
805  	if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
806  		fmt = find_format(f, VID_CAPTURE);
807  	else if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
808  		fmt = find_format(f, VID_OUTPUT);
809  	else
810  		return -EINVAL;
811  
812  	pixm->pixelformat = fmt->fourcc;
813  
814  	return 0;
815  }
816  
imgu_vidioc_try_fmt(struct file * file,void * fh,struct v4l2_format * f)817  static int imgu_vidioc_try_fmt(struct file *file, void *fh,
818  			       struct v4l2_format *f)
819  {
820  	struct imgu_device *imgu = video_drvdata(file);
821  	struct device *dev = &imgu->pci_dev->dev;
822  	struct imgu_video_device *node = file_to_intel_imgu_node(file);
823  	struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
824  	int r;
825  
826  	dev_dbg(dev, "%s [%ux%u] for node %u\n", __func__,
827  		pix_mp->width, pix_mp->height, node->id);
828  
829  	r = imgu_try_fmt(file, fh, f);
830  	if (r)
831  		return r;
832  
833  	return imgu_fmt(imgu, node->pipe, node->id, f, true);
834  }
835  
imgu_vidioc_s_fmt(struct file * file,void * fh,struct v4l2_format * f)836  static int imgu_vidioc_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
837  {
838  	struct imgu_device *imgu = video_drvdata(file);
839  	struct device *dev = &imgu->pci_dev->dev;
840  	struct imgu_video_device *node = file_to_intel_imgu_node(file);
841  	struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
842  	int r;
843  
844  	dev_dbg(dev, "%s [%ux%u] for node %u\n", __func__,
845  		pix_mp->width, pix_mp->height, node->id);
846  
847  	r = imgu_try_fmt(file, fh, f);
848  	if (r)
849  		return r;
850  
851  	return imgu_fmt(imgu, node->pipe, node->id, f, false);
852  }
853  
854  struct imgu_meta_fmt {
855  	__u32 fourcc;
856  	char *name;
857  };
858  
859  /* From drivers/media/v4l2-core/v4l2-ioctl.c */
860  static const struct imgu_meta_fmt meta_fmts[] = {
861  	{ V4L2_META_FMT_IPU3_PARAMS, "IPU3 processing parameters" },
862  	{ V4L2_META_FMT_IPU3_STAT_3A, "IPU3 3A statistics" },
863  };
864  
imgu_meta_enum_format(struct file * file,void * fh,struct v4l2_fmtdesc * fmt)865  static int imgu_meta_enum_format(struct file *file, void *fh,
866  				 struct v4l2_fmtdesc *fmt)
867  {
868  	struct imgu_video_device *node = file_to_intel_imgu_node(file);
869  	unsigned int i = fmt->type == V4L2_BUF_TYPE_META_OUTPUT ? 0 : 1;
870  
871  	/* Each node is dedicated to only one meta format */
872  	if (fmt->index > 0 || fmt->type != node->vbq.type)
873  		return -EINVAL;
874  
875  	if (fmt->mbus_code != 0 && fmt->mbus_code != MEDIA_BUS_FMT_FIXED)
876  		return -EINVAL;
877  
878  	strscpy(fmt->description, meta_fmts[i].name, sizeof(fmt->description));
879  	fmt->pixelformat = meta_fmts[i].fourcc;
880  
881  	return 0;
882  }
883  
imgu_vidioc_g_meta_fmt(struct file * file,void * fh,struct v4l2_format * f)884  static int imgu_vidioc_g_meta_fmt(struct file *file, void *fh,
885  				  struct v4l2_format *f)
886  {
887  	struct imgu_video_device *node = file_to_intel_imgu_node(file);
888  
889  	if (f->type != node->vbq.type)
890  		return -EINVAL;
891  
892  	f->fmt = node->vdev_fmt.fmt;
893  
894  	return 0;
895  }
896  
897  /******************** function pointers ********************/
898  
899  static const struct v4l2_subdev_internal_ops imgu_subdev_internal_ops = {
900  	.open = imgu_subdev_open,
901  };
902  
903  static const struct v4l2_subdev_core_ops imgu_subdev_core_ops = {
904  	.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
905  	.unsubscribe_event = v4l2_event_subdev_unsubscribe,
906  };
907  
908  static const struct v4l2_subdev_video_ops imgu_subdev_video_ops = {
909  	.s_stream = imgu_subdev_s_stream,
910  };
911  
912  static const struct v4l2_subdev_pad_ops imgu_subdev_pad_ops = {
913  	.link_validate = v4l2_subdev_link_validate_default,
914  	.get_fmt = imgu_subdev_get_fmt,
915  	.set_fmt = imgu_subdev_set_fmt,
916  	.get_selection = imgu_subdev_get_selection,
917  	.set_selection = imgu_subdev_set_selection,
918  };
919  
920  static const struct v4l2_subdev_ops imgu_subdev_ops = {
921  	.core = &imgu_subdev_core_ops,
922  	.video = &imgu_subdev_video_ops,
923  	.pad = &imgu_subdev_pad_ops,
924  };
925  
926  static const struct media_entity_operations imgu_media_ops = {
927  	.link_setup = imgu_link_setup,
928  	.link_validate = v4l2_subdev_link_validate,
929  };
930  
931  /****************** vb2_ops of the Q ********************/
932  
933  static const struct vb2_ops imgu_vb2_ops = {
934  	.buf_init = imgu_vb2_buf_init,
935  	.buf_cleanup = imgu_vb2_buf_cleanup,
936  	.buf_queue = imgu_vb2_buf_queue,
937  	.queue_setup = imgu_vb2_queue_setup,
938  	.start_streaming = imgu_vb2_start_streaming,
939  	.stop_streaming = imgu_vb2_stop_streaming,
940  	.wait_prepare = vb2_ops_wait_prepare,
941  	.wait_finish = vb2_ops_wait_finish,
942  };
943  
944  /****************** v4l2_file_operations *****************/
945  
946  static const struct v4l2_file_operations imgu_v4l2_fops = {
947  	.unlocked_ioctl = video_ioctl2,
948  	.open = v4l2_fh_open,
949  	.release = vb2_fop_release,
950  	.poll = vb2_fop_poll,
951  	.mmap = vb2_fop_mmap,
952  };
953  
954  /******************** v4l2_ioctl_ops ********************/
955  
956  static const struct v4l2_ioctl_ops imgu_v4l2_ioctl_ops = {
957  	.vidioc_querycap = imgu_vidioc_querycap,
958  
959  	.vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
960  	.vidioc_g_fmt_vid_cap_mplane = imgu_vidioc_g_fmt,
961  	.vidioc_s_fmt_vid_cap_mplane = imgu_vidioc_s_fmt,
962  	.vidioc_try_fmt_vid_cap_mplane = imgu_vidioc_try_fmt,
963  
964  	.vidioc_enum_fmt_vid_out = vidioc_enum_fmt_vid_out,
965  	.vidioc_g_fmt_vid_out_mplane = imgu_vidioc_g_fmt,
966  	.vidioc_s_fmt_vid_out_mplane = imgu_vidioc_s_fmt,
967  	.vidioc_try_fmt_vid_out_mplane = imgu_vidioc_try_fmt,
968  
969  	/* buffer queue management */
970  	.vidioc_reqbufs = vb2_ioctl_reqbufs,
971  	.vidioc_create_bufs = vb2_ioctl_create_bufs,
972  	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
973  	.vidioc_querybuf = vb2_ioctl_querybuf,
974  	.vidioc_qbuf = vb2_ioctl_qbuf,
975  	.vidioc_dqbuf = vb2_ioctl_dqbuf,
976  	.vidioc_streamon = vb2_ioctl_streamon,
977  	.vidioc_streamoff = vb2_ioctl_streamoff,
978  	.vidioc_expbuf = vb2_ioctl_expbuf,
979  };
980  
981  static const struct v4l2_ioctl_ops imgu_v4l2_meta_ioctl_ops = {
982  	.vidioc_querycap = imgu_vidioc_querycap,
983  
984  	/* meta capture */
985  	.vidioc_enum_fmt_meta_cap = imgu_meta_enum_format,
986  	.vidioc_g_fmt_meta_cap = imgu_vidioc_g_meta_fmt,
987  	.vidioc_s_fmt_meta_cap = imgu_vidioc_g_meta_fmt,
988  	.vidioc_try_fmt_meta_cap = imgu_vidioc_g_meta_fmt,
989  
990  	/* meta output */
991  	.vidioc_enum_fmt_meta_out = imgu_meta_enum_format,
992  	.vidioc_g_fmt_meta_out = imgu_vidioc_g_meta_fmt,
993  	.vidioc_s_fmt_meta_out = imgu_vidioc_g_meta_fmt,
994  	.vidioc_try_fmt_meta_out = imgu_vidioc_g_meta_fmt,
995  
996  	.vidioc_reqbufs = vb2_ioctl_reqbufs,
997  	.vidioc_create_bufs = vb2_ioctl_create_bufs,
998  	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
999  	.vidioc_querybuf = vb2_ioctl_querybuf,
1000  	.vidioc_qbuf = vb2_ioctl_qbuf,
1001  	.vidioc_dqbuf = vb2_ioctl_dqbuf,
1002  	.vidioc_streamon = vb2_ioctl_streamon,
1003  	.vidioc_streamoff = vb2_ioctl_streamoff,
1004  	.vidioc_expbuf = vb2_ioctl_expbuf,
1005  };
1006  
imgu_sd_s_ctrl(struct v4l2_ctrl * ctrl)1007  static int imgu_sd_s_ctrl(struct v4l2_ctrl *ctrl)
1008  {
1009  	struct imgu_v4l2_subdev *imgu_sd =
1010  		container_of(ctrl->handler, struct imgu_v4l2_subdev, ctrl_handler);
1011  	struct imgu_device *imgu = v4l2_get_subdevdata(&imgu_sd->subdev);
1012  	struct device *dev = &imgu->pci_dev->dev;
1013  
1014  	dev_dbg(dev, "set val %d to ctrl 0x%8x for subdev %u",
1015  		ctrl->val, ctrl->id, imgu_sd->pipe);
1016  
1017  	switch (ctrl->id) {
1018  	case V4L2_CID_INTEL_IPU3_MODE:
1019  		atomic_set(&imgu_sd->running_mode, ctrl->val);
1020  		return 0;
1021  	default:
1022  		return -EINVAL;
1023  	}
1024  }
1025  
1026  static const struct v4l2_ctrl_ops imgu_subdev_ctrl_ops = {
1027  	.s_ctrl = imgu_sd_s_ctrl,
1028  };
1029  
1030  static const char * const imgu_ctrl_mode_strings[] = {
1031  	"Video mode",
1032  	"Still mode",
1033  };
1034  
1035  static const struct v4l2_ctrl_config imgu_subdev_ctrl_mode = {
1036  	.ops = &imgu_subdev_ctrl_ops,
1037  	.id = V4L2_CID_INTEL_IPU3_MODE,
1038  	.name = "IPU3 Pipe Mode",
1039  	.type = V4L2_CTRL_TYPE_MENU,
1040  	.max = ARRAY_SIZE(imgu_ctrl_mode_strings) - 1,
1041  	.def = IPU3_RUNNING_MODE_VIDEO,
1042  	.qmenu = imgu_ctrl_mode_strings,
1043  };
1044  
1045  /******************** Framework registration ********************/
1046  
1047  /* helper function to config node's video properties */
imgu_node_to_v4l2(u32 node,struct video_device * vdev,struct v4l2_format * f)1048  static void imgu_node_to_v4l2(u32 node, struct video_device *vdev,
1049  			      struct v4l2_format *f)
1050  {
1051  	u32 cap;
1052  
1053  	/* Should not happen */
1054  	WARN_ON(node >= IMGU_NODE_NUM);
1055  
1056  	switch (node) {
1057  	case IMGU_NODE_IN:
1058  		cap = V4L2_CAP_VIDEO_OUTPUT_MPLANE;
1059  		f->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1060  		vdev->ioctl_ops = &imgu_v4l2_ioctl_ops;
1061  		break;
1062  	case IMGU_NODE_PARAMS:
1063  		cap = V4L2_CAP_META_OUTPUT;
1064  		f->type = V4L2_BUF_TYPE_META_OUTPUT;
1065  		f->fmt.meta.dataformat = V4L2_META_FMT_IPU3_PARAMS;
1066  		vdev->ioctl_ops = &imgu_v4l2_meta_ioctl_ops;
1067  		imgu_css_meta_fmt_set(&f->fmt.meta);
1068  		break;
1069  	case IMGU_NODE_STAT_3A:
1070  		cap = V4L2_CAP_META_CAPTURE;
1071  		f->type = V4L2_BUF_TYPE_META_CAPTURE;
1072  		f->fmt.meta.dataformat = V4L2_META_FMT_IPU3_STAT_3A;
1073  		vdev->ioctl_ops = &imgu_v4l2_meta_ioctl_ops;
1074  		imgu_css_meta_fmt_set(&f->fmt.meta);
1075  		break;
1076  	default:
1077  		cap = V4L2_CAP_VIDEO_CAPTURE_MPLANE;
1078  		f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1079  		vdev->ioctl_ops = &imgu_v4l2_ioctl_ops;
1080  	}
1081  
1082  	vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_IO_MC | cap;
1083  }
1084  
imgu_v4l2_subdev_register(struct imgu_device * imgu,struct imgu_v4l2_subdev * imgu_sd,unsigned int pipe)1085  static int imgu_v4l2_subdev_register(struct imgu_device *imgu,
1086  				     struct imgu_v4l2_subdev *imgu_sd,
1087  				     unsigned int pipe)
1088  {
1089  	int i, r;
1090  	struct v4l2_ctrl_handler *hdl = &imgu_sd->ctrl_handler;
1091  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
1092  
1093  	/* Initialize subdev media entity */
1094  	imgu_sd->subdev.entity.ops = &imgu_media_ops;
1095  	for (i = 0; i < IMGU_NODE_NUM; i++) {
1096  		imgu_sd->subdev_pads[i].flags = imgu_pipe->nodes[i].output ?
1097  			MEDIA_PAD_FL_SINK : MEDIA_PAD_FL_SOURCE;
1098  	}
1099  	r = media_entity_pads_init(&imgu_sd->subdev.entity, IMGU_NODE_NUM,
1100  				   imgu_sd->subdev_pads);
1101  	if (r) {
1102  		dev_err(&imgu->pci_dev->dev,
1103  			"failed initialize subdev media entity (%d)\n", r);
1104  		return r;
1105  	}
1106  
1107  	/* Initialize subdev */
1108  	v4l2_subdev_init(&imgu_sd->subdev, &imgu_subdev_ops);
1109  	imgu_sd->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_STATISTICS;
1110  	imgu_sd->subdev.internal_ops = &imgu_subdev_internal_ops;
1111  	imgu_sd->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE |
1112  				V4L2_SUBDEV_FL_HAS_EVENTS;
1113  	snprintf(imgu_sd->subdev.name, sizeof(imgu_sd->subdev.name),
1114  		 "%s %u", IMGU_NAME, pipe);
1115  	v4l2_set_subdevdata(&imgu_sd->subdev, imgu);
1116  	atomic_set(&imgu_sd->running_mode, IPU3_RUNNING_MODE_VIDEO);
1117  	v4l2_ctrl_handler_init(hdl, 1);
1118  	imgu_sd->subdev.ctrl_handler = hdl;
1119  	imgu_sd->ctrl = v4l2_ctrl_new_custom(hdl, &imgu_subdev_ctrl_mode, NULL);
1120  	if (hdl->error) {
1121  		r = hdl->error;
1122  		dev_err(&imgu->pci_dev->dev,
1123  			"failed to create subdev v4l2 ctrl with err %d", r);
1124  		goto fail_subdev;
1125  	}
1126  	r = v4l2_device_register_subdev(&imgu->v4l2_dev, &imgu_sd->subdev);
1127  	if (r) {
1128  		dev_err(&imgu->pci_dev->dev,
1129  			"failed initialize subdev (%d)\n", r);
1130  		goto fail_subdev;
1131  	}
1132  
1133  	imgu_sd->pipe = pipe;
1134  	return 0;
1135  
1136  fail_subdev:
1137  	v4l2_ctrl_handler_free(imgu_sd->subdev.ctrl_handler);
1138  	media_entity_cleanup(&imgu_sd->subdev.entity);
1139  
1140  	return r;
1141  }
1142  
imgu_v4l2_node_setup(struct imgu_device * imgu,unsigned int pipe,int node_num)1143  static int imgu_v4l2_node_setup(struct imgu_device *imgu, unsigned int pipe,
1144  				int node_num)
1145  {
1146  	int r;
1147  	u32 flags;
1148  	struct v4l2_mbus_framefmt def_bus_fmt = { 0 };
1149  	struct v4l2_pix_format_mplane def_pix_fmt = { 0 };
1150  	struct device *dev = &imgu->pci_dev->dev;
1151  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
1152  	struct v4l2_subdev *sd = &imgu_pipe->imgu_sd.subdev;
1153  	struct imgu_video_device *node = &imgu_pipe->nodes[node_num];
1154  	struct video_device *vdev = &node->vdev;
1155  	struct vb2_queue *vbq = &node->vbq;
1156  
1157  	/* Initialize formats to default values */
1158  	def_bus_fmt.width = 1920;
1159  	def_bus_fmt.height = 1080;
1160  	def_bus_fmt.code = MEDIA_BUS_FMT_FIXED;
1161  	def_bus_fmt.field = V4L2_FIELD_NONE;
1162  	def_bus_fmt.colorspace = V4L2_COLORSPACE_RAW;
1163  	def_bus_fmt.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
1164  	def_bus_fmt.quantization = V4L2_QUANTIZATION_DEFAULT;
1165  	def_bus_fmt.xfer_func = V4L2_XFER_FUNC_DEFAULT;
1166  
1167  	def_pix_fmt.width = def_bus_fmt.width;
1168  	def_pix_fmt.height = def_bus_fmt.height;
1169  	def_pix_fmt.field = def_bus_fmt.field;
1170  	def_pix_fmt.num_planes = 1;
1171  	def_pix_fmt.plane_fmt[0].bytesperline =
1172  		imgu_bytesperline(def_pix_fmt.width,
1173  				  IMGU_ABI_FRAME_FORMAT_RAW_PACKED);
1174  	def_pix_fmt.plane_fmt[0].sizeimage =
1175  		def_pix_fmt.height * def_pix_fmt.plane_fmt[0].bytesperline;
1176  	def_pix_fmt.flags = 0;
1177  	def_pix_fmt.colorspace = def_bus_fmt.colorspace;
1178  	def_pix_fmt.ycbcr_enc = def_bus_fmt.ycbcr_enc;
1179  	def_pix_fmt.quantization = def_bus_fmt.quantization;
1180  	def_pix_fmt.xfer_func = def_bus_fmt.xfer_func;
1181  
1182  	/* Initialize miscellaneous variables */
1183  	mutex_init(&node->lock);
1184  	INIT_LIST_HEAD(&node->buffers);
1185  
1186  	/* Initialize formats to default values */
1187  	node->pad_fmt = def_bus_fmt;
1188  	node->id = node_num;
1189  	node->pipe = pipe;
1190  	imgu_node_to_v4l2(node_num, vdev, &node->vdev_fmt);
1191  	if (node->vdev_fmt.type ==
1192  	    V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ||
1193  	    node->vdev_fmt.type ==
1194  	    V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
1195  		def_pix_fmt.pixelformat = node->output ?
1196  			V4L2_PIX_FMT_IPU3_SGRBG10 :
1197  			V4L2_PIX_FMT_NV12;
1198  		node->vdev_fmt.fmt.pix_mp = def_pix_fmt;
1199  	}
1200  
1201  	/* Initialize media entities */
1202  	node->vdev_pad.flags = node->output ?
1203  		MEDIA_PAD_FL_SOURCE : MEDIA_PAD_FL_SINK;
1204  	vdev->entity.ops = NULL;
1205  	r = media_entity_pads_init(&vdev->entity, 1, &node->vdev_pad);
1206  	if (r) {
1207  		dev_err(dev, "failed initialize media entity (%d)\n", r);
1208  		mutex_destroy(&node->lock);
1209  		return r;
1210  	}
1211  
1212  	/* Initialize vbq */
1213  	vbq->type = node->vdev_fmt.type;
1214  	vbq->io_modes = VB2_USERPTR | VB2_MMAP | VB2_DMABUF;
1215  	vbq->ops = &imgu_vb2_ops;
1216  	vbq->mem_ops = &vb2_dma_sg_memops;
1217  	if (imgu->buf_struct_size <= 0)
1218  		imgu->buf_struct_size =
1219  			sizeof(struct imgu_vb2_buffer);
1220  	vbq->buf_struct_size = imgu->buf_struct_size;
1221  	vbq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1222  	/* can streamon w/o buffers */
1223  	vbq->min_queued_buffers = 0;
1224  	vbq->drv_priv = imgu;
1225  	vbq->lock = &node->lock;
1226  	r = vb2_queue_init(vbq);
1227  	if (r) {
1228  		dev_err(dev, "failed to initialize video queue (%d)", r);
1229  		media_entity_cleanup(&vdev->entity);
1230  		return r;
1231  	}
1232  
1233  	/* Initialize vdev */
1234  	snprintf(vdev->name, sizeof(vdev->name), "%s %u %s",
1235  		 IMGU_NAME, pipe, node->name);
1236  	vdev->release = video_device_release_empty;
1237  	vdev->fops = &imgu_v4l2_fops;
1238  	vdev->lock = &node->lock;
1239  	vdev->v4l2_dev = &imgu->v4l2_dev;
1240  	vdev->queue = &node->vbq;
1241  	vdev->vfl_dir = node->output ? VFL_DIR_TX : VFL_DIR_RX;
1242  	video_set_drvdata(vdev, imgu);
1243  	r = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
1244  	if (r) {
1245  		dev_err(dev, "failed to register video device (%d)", r);
1246  		media_entity_cleanup(&vdev->entity);
1247  		return r;
1248  	}
1249  
1250  	/* Create link between video node and the subdev pad */
1251  	flags = 0;
1252  	if (node->enabled)
1253  		flags |= MEDIA_LNK_FL_ENABLED;
1254  	if (node->output) {
1255  		r = media_create_pad_link(&vdev->entity, 0, &sd->entity,
1256  					  node_num, flags);
1257  	} else {
1258  		if (node->id == IMGU_NODE_OUT) {
1259  			flags |= MEDIA_LNK_FL_ENABLED | MEDIA_LNK_FL_IMMUTABLE;
1260  			node->enabled = true;
1261  		}
1262  
1263  		r = media_create_pad_link(&sd->entity, node_num, &vdev->entity,
1264  					  0, flags);
1265  	}
1266  	if (r) {
1267  		dev_err(dev, "failed to create pad link (%d)", r);
1268  		video_unregister_device(vdev);
1269  		return r;
1270  	}
1271  
1272  	return 0;
1273  }
1274  
imgu_v4l2_nodes_cleanup_pipe(struct imgu_device * imgu,unsigned int pipe,int node)1275  static void imgu_v4l2_nodes_cleanup_pipe(struct imgu_device *imgu,
1276  					 unsigned int pipe, int node)
1277  {
1278  	int i;
1279  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[pipe];
1280  
1281  	for (i = 0; i < node; i++) {
1282  		video_unregister_device(&imgu_pipe->nodes[i].vdev);
1283  		media_entity_cleanup(&imgu_pipe->nodes[i].vdev.entity);
1284  		mutex_destroy(&imgu_pipe->nodes[i].lock);
1285  	}
1286  }
1287  
imgu_v4l2_nodes_setup_pipe(struct imgu_device * imgu,int pipe)1288  static int imgu_v4l2_nodes_setup_pipe(struct imgu_device *imgu, int pipe)
1289  {
1290  	int i;
1291  
1292  	for (i = 0; i < IMGU_NODE_NUM; i++) {
1293  		int r = imgu_v4l2_node_setup(imgu, pipe, i);
1294  
1295  		if (r) {
1296  			imgu_v4l2_nodes_cleanup_pipe(imgu, pipe, i);
1297  			return r;
1298  		}
1299  	}
1300  	return 0;
1301  }
1302  
imgu_v4l2_subdev_cleanup(struct imgu_device * imgu,unsigned int i)1303  static void imgu_v4l2_subdev_cleanup(struct imgu_device *imgu, unsigned int i)
1304  {
1305  	struct imgu_media_pipe *imgu_pipe = &imgu->imgu_pipe[i];
1306  
1307  	v4l2_device_unregister_subdev(&imgu_pipe->imgu_sd.subdev);
1308  	v4l2_ctrl_handler_free(imgu_pipe->imgu_sd.subdev.ctrl_handler);
1309  	media_entity_cleanup(&imgu_pipe->imgu_sd.subdev.entity);
1310  }
1311  
imgu_v4l2_cleanup_pipes(struct imgu_device * imgu,unsigned int pipe)1312  static void imgu_v4l2_cleanup_pipes(struct imgu_device *imgu, unsigned int pipe)
1313  {
1314  	int i;
1315  
1316  	for (i = 0; i < pipe; i++) {
1317  		imgu_v4l2_nodes_cleanup_pipe(imgu, i, IMGU_NODE_NUM);
1318  		imgu_v4l2_subdev_cleanup(imgu, i);
1319  	}
1320  }
1321  
imgu_v4l2_register_pipes(struct imgu_device * imgu)1322  static int imgu_v4l2_register_pipes(struct imgu_device *imgu)
1323  {
1324  	struct imgu_media_pipe *imgu_pipe;
1325  	int i, r;
1326  
1327  	for (i = 0; i < IMGU_MAX_PIPE_NUM; i++) {
1328  		imgu_pipe = &imgu->imgu_pipe[i];
1329  		r = imgu_v4l2_subdev_register(imgu, &imgu_pipe->imgu_sd, i);
1330  		if (r) {
1331  			dev_err(&imgu->pci_dev->dev,
1332  				"failed to register subdev%u ret (%d)\n", i, r);
1333  			goto pipes_cleanup;
1334  		}
1335  		r = imgu_v4l2_nodes_setup_pipe(imgu, i);
1336  		if (r) {
1337  			imgu_v4l2_subdev_cleanup(imgu, i);
1338  			goto pipes_cleanup;
1339  		}
1340  	}
1341  
1342  	return 0;
1343  
1344  pipes_cleanup:
1345  	imgu_v4l2_cleanup_pipes(imgu, i);
1346  	return r;
1347  }
1348  
imgu_v4l2_register(struct imgu_device * imgu)1349  int imgu_v4l2_register(struct imgu_device *imgu)
1350  {
1351  	int r;
1352  
1353  	/* Initialize miscellaneous variables */
1354  	imgu->streaming = false;
1355  
1356  	/* Set up media device */
1357  	media_device_pci_init(&imgu->media_dev, imgu->pci_dev, IMGU_NAME);
1358  
1359  	/* Set up v4l2 device */
1360  	imgu->v4l2_dev.mdev = &imgu->media_dev;
1361  	imgu->v4l2_dev.ctrl_handler = NULL;
1362  	r = v4l2_device_register(&imgu->pci_dev->dev, &imgu->v4l2_dev);
1363  	if (r) {
1364  		dev_err(&imgu->pci_dev->dev,
1365  			"failed to register V4L2 device (%d)\n", r);
1366  		goto fail_v4l2_dev;
1367  	}
1368  
1369  	r = imgu_v4l2_register_pipes(imgu);
1370  	if (r) {
1371  		dev_err(&imgu->pci_dev->dev,
1372  			"failed to register pipes (%d)\n", r);
1373  		goto fail_v4l2_pipes;
1374  	}
1375  
1376  	r = v4l2_device_register_subdev_nodes(&imgu->v4l2_dev);
1377  	if (r) {
1378  		dev_err(&imgu->pci_dev->dev,
1379  			"failed to register subdevs (%d)\n", r);
1380  		goto fail_subdevs;
1381  	}
1382  
1383  	r = media_device_register(&imgu->media_dev);
1384  	if (r) {
1385  		dev_err(&imgu->pci_dev->dev,
1386  			"failed to register media device (%d)\n", r);
1387  		goto fail_subdevs;
1388  	}
1389  
1390  	return 0;
1391  
1392  fail_subdevs:
1393  	imgu_v4l2_cleanup_pipes(imgu, IMGU_MAX_PIPE_NUM);
1394  fail_v4l2_pipes:
1395  	v4l2_device_unregister(&imgu->v4l2_dev);
1396  fail_v4l2_dev:
1397  	media_device_cleanup(&imgu->media_dev);
1398  
1399  	return r;
1400  }
1401  
imgu_v4l2_unregister(struct imgu_device * imgu)1402  int imgu_v4l2_unregister(struct imgu_device *imgu)
1403  {
1404  	media_device_unregister(&imgu->media_dev);
1405  	imgu_v4l2_cleanup_pipes(imgu, IMGU_MAX_PIPE_NUM);
1406  	v4l2_device_unregister(&imgu->v4l2_dev);
1407  	media_device_cleanup(&imgu->media_dev);
1408  
1409  	return 0;
1410  }
1411  
imgu_v4l2_buffer_done(struct vb2_buffer * vb,enum vb2_buffer_state state)1412  void imgu_v4l2_buffer_done(struct vb2_buffer *vb,
1413  			   enum vb2_buffer_state state)
1414  {
1415  	struct imgu_vb2_buffer *b =
1416  		container_of(vb, struct imgu_vb2_buffer, vbb.vb2_buf);
1417  
1418  	list_del(&b->list);
1419  	vb2_buffer_done(&b->vbb.vb2_buf, state);
1420  }
1421