cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

coda-common.c (92744B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Coda multi-standard codec IP
      4 *
      5 * Copyright (C) 2012 Vista Silicon S.L.
      6 *    Javier Martin, <javier.martin@vista-silicon.com>
      7 *    Xavier Duret
      8 */
      9
     10#include <linux/clk.h>
     11#include <linux/debugfs.h>
     12#include <linux/delay.h>
     13#include <linux/firmware.h>
     14#include <linux/gcd.h>
     15#include <linux/genalloc.h>
     16#include <linux/idr.h>
     17#include <linux/interrupt.h>
     18#include <linux/io.h>
     19#include <linux/irq.h>
     20#include <linux/kfifo.h>
     21#include <linux/module.h>
     22#include <linux/of_device.h>
     23#include <linux/platform_device.h>
     24#include <linux/pm_runtime.h>
     25#include <linux/slab.h>
     26#include <linux/videodev2.h>
     27#include <linux/of.h>
     28#include <linux/ratelimit.h>
     29#include <linux/reset.h>
     30
     31#include <media/v4l2-ctrls.h>
     32#include <media/v4l2-device.h>
     33#include <media/v4l2-event.h>
     34#include <media/v4l2-ioctl.h>
     35#include <media/v4l2-mem2mem.h>
     36#include <media/videobuf2-v4l2.h>
     37#include <media/videobuf2-dma-contig.h>
     38#include <media/videobuf2-vmalloc.h>
     39
     40#include "coda.h"
     41#include "imx-vdoa.h"
     42
     43#define CODA_NAME		"coda"
     44
     45#define CODADX6_MAX_INSTANCES	4
     46#define CODA_MAX_FORMATS	5
     47
     48#define CODA_ISRAM_SIZE	(2048 * 2)
     49
     50#define MIN_W 48
     51#define MIN_H 16
     52
     53#define S_ALIGN		1 /* multiple of 2 */
     54#define W_ALIGN		1 /* multiple of 2 */
     55#define H_ALIGN		1 /* multiple of 2 */
     56
     57#define fh_to_ctx(__fh)	container_of(__fh, struct coda_ctx, fh)
     58
     59int coda_debug;
     60module_param(coda_debug, int, 0644);
     61MODULE_PARM_DESC(coda_debug, "Debug level (0-2)");
     62
     63static int disable_tiling;
     64module_param(disable_tiling, int, 0644);
     65MODULE_PARM_DESC(disable_tiling, "Disable tiled frame buffers");
     66
     67static int disable_vdoa;
     68module_param(disable_vdoa, int, 0644);
     69MODULE_PARM_DESC(disable_vdoa, "Disable Video Data Order Adapter tiled to raster-scan conversion");
     70
     71static int enable_bwb = 0;
     72module_param(enable_bwb, int, 0644);
     73MODULE_PARM_DESC(enable_bwb, "Enable BWB unit for decoding, may crash on certain streams");
     74
     75void coda_write(struct coda_dev *dev, u32 data, u32 reg)
     76{
     77	v4l2_dbg(3, coda_debug, &dev->v4l2_dev,
     78		 "%s: data=0x%x, reg=0x%x\n", __func__, data, reg);
     79	writel(data, dev->regs_base + reg);
     80}
     81
     82unsigned int coda_read(struct coda_dev *dev, u32 reg)
     83{
     84	u32 data;
     85
     86	data = readl(dev->regs_base + reg);
     87	v4l2_dbg(3, coda_debug, &dev->v4l2_dev,
     88		 "%s: data=0x%x, reg=0x%x\n", __func__, data, reg);
     89	return data;
     90}
     91
     92void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
     93		     struct vb2_v4l2_buffer *buf, unsigned int reg_y)
     94{
     95	u32 base_y = vb2_dma_contig_plane_dma_addr(&buf->vb2_buf, 0);
     96	u32 base_cb, base_cr;
     97
     98	switch (q_data->fourcc) {
     99	case V4L2_PIX_FMT_YUYV:
    100		/* Fallthrough: IN -H264-> CODA -NV12 MB-> VDOA -YUYV-> OUT */
    101	case V4L2_PIX_FMT_NV12:
    102	case V4L2_PIX_FMT_YUV420:
    103	default:
    104		base_cb = base_y + q_data->bytesperline * q_data->height;
    105		base_cr = base_cb + q_data->bytesperline * q_data->height / 4;
    106		break;
    107	case V4L2_PIX_FMT_YVU420:
    108		/* Switch Cb and Cr for YVU420 format */
    109		base_cr = base_y + q_data->bytesperline * q_data->height;
    110		base_cb = base_cr + q_data->bytesperline * q_data->height / 4;
    111		break;
    112	case V4L2_PIX_FMT_YUV422P:
    113		base_cb = base_y + q_data->bytesperline * q_data->height;
    114		base_cr = base_cb + q_data->bytesperline * q_data->height / 2;
    115	}
    116
    117	coda_write(ctx->dev, base_y, reg_y);
    118	coda_write(ctx->dev, base_cb, reg_y + 4);
    119	coda_write(ctx->dev, base_cr, reg_y + 8);
    120}
    121
    122#define CODA_CODEC(mode, src_fourcc, dst_fourcc, max_w, max_h) \
    123	{ mode, src_fourcc, dst_fourcc, max_w, max_h }
    124
    125/*
    126 * Arrays of codecs supported by each given version of Coda:
    127 *  i.MX27 -> codadx6
    128 *  i.MX51 -> codahx4
    129 *  i.MX53 -> coda7
    130 *  i.MX6  -> coda960
    131 * Use V4L2_PIX_FMT_YUV420 as placeholder for all supported YUV 4:2:0 variants
    132 */
    133static const struct coda_codec codadx6_codecs[] = {
    134	CODA_CODEC(CODADX6_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,  720, 576),
    135	CODA_CODEC(CODADX6_MODE_ENCODE_MP4,  V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4, 720, 576),
    136};
    137
    138static const struct coda_codec codahx4_codecs[] = {
    139	CODA_CODEC(CODA7_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,   720, 576),
    140	CODA_CODEC(CODA7_MODE_DECODE_H264, V4L2_PIX_FMT_H264,   V4L2_PIX_FMT_YUV420, 1920, 1088),
    141	CODA_CODEC(CODA7_MODE_DECODE_MP2,  V4L2_PIX_FMT_MPEG2,  V4L2_PIX_FMT_YUV420, 1920, 1088),
    142	CODA_CODEC(CODA7_MODE_DECODE_MP4,  V4L2_PIX_FMT_MPEG4,  V4L2_PIX_FMT_YUV420, 1280, 720),
    143};
    144
    145static const struct coda_codec coda7_codecs[] = {
    146	CODA_CODEC(CODA7_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,   1280, 720),
    147	CODA_CODEC(CODA7_MODE_ENCODE_MP4,  V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4,  1280, 720),
    148	CODA_CODEC(CODA7_MODE_ENCODE_MJPG, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_JPEG,   8192, 8192),
    149	CODA_CODEC(CODA7_MODE_DECODE_H264, V4L2_PIX_FMT_H264,   V4L2_PIX_FMT_YUV420, 1920, 1088),
    150	CODA_CODEC(CODA7_MODE_DECODE_MP2,  V4L2_PIX_FMT_MPEG2,  V4L2_PIX_FMT_YUV420, 1920, 1088),
    151	CODA_CODEC(CODA7_MODE_DECODE_MP4,  V4L2_PIX_FMT_MPEG4,  V4L2_PIX_FMT_YUV420, 1920, 1088),
    152	CODA_CODEC(CODA7_MODE_DECODE_MJPG, V4L2_PIX_FMT_JPEG,   V4L2_PIX_FMT_YUV420, 8192, 8192),
    153};
    154
    155static const struct coda_codec coda9_codecs[] = {
    156	CODA_CODEC(CODA9_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,   1920, 1088),
    157	CODA_CODEC(CODA9_MODE_ENCODE_MP4,  V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4,  1920, 1088),
    158	CODA_CODEC(CODA9_MODE_ENCODE_MJPG, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_JPEG,   8192, 8192),
    159	CODA_CODEC(CODA9_MODE_DECODE_H264, V4L2_PIX_FMT_H264,   V4L2_PIX_FMT_YUV420, 1920, 1088),
    160	CODA_CODEC(CODA9_MODE_DECODE_MP2,  V4L2_PIX_FMT_MPEG2,  V4L2_PIX_FMT_YUV420, 1920, 1088),
    161	CODA_CODEC(CODA9_MODE_DECODE_MP4,  V4L2_PIX_FMT_MPEG4,  V4L2_PIX_FMT_YUV420, 1920, 1088),
    162	CODA_CODEC(CODA9_MODE_DECODE_MJPG, V4L2_PIX_FMT_JPEG,	V4L2_PIX_FMT_YUV420, 8192, 8192),
    163};
    164
    165struct coda_video_device {
    166	const char *name;
    167	enum coda_inst_type type;
    168	const struct coda_context_ops *ops;
    169	bool direct;
    170	u32 src_formats[CODA_MAX_FORMATS];
    171	u32 dst_formats[CODA_MAX_FORMATS];
    172};
    173
    174static const struct coda_video_device coda_bit_encoder = {
    175	.name = "coda-video-encoder",
    176	.type = CODA_INST_ENCODER,
    177	.ops = &coda_bit_encode_ops,
    178	.src_formats = {
    179		V4L2_PIX_FMT_NV12,
    180		V4L2_PIX_FMT_YUV420,
    181		V4L2_PIX_FMT_YVU420,
    182	},
    183	.dst_formats = {
    184		V4L2_PIX_FMT_H264,
    185		V4L2_PIX_FMT_MPEG4,
    186	},
    187};
    188
    189static const struct coda_video_device coda_bit_jpeg_encoder = {
    190	.name = "coda-jpeg-encoder",
    191	.type = CODA_INST_ENCODER,
    192	.ops = &coda_bit_encode_ops,
    193	.src_formats = {
    194		V4L2_PIX_FMT_NV12,
    195		V4L2_PIX_FMT_YUV420,
    196		V4L2_PIX_FMT_YVU420,
    197		V4L2_PIX_FMT_YUV422P,
    198	},
    199	.dst_formats = {
    200		V4L2_PIX_FMT_JPEG,
    201	},
    202};
    203
    204static const struct coda_video_device coda_bit_decoder = {
    205	.name = "coda-video-decoder",
    206	.type = CODA_INST_DECODER,
    207	.ops = &coda_bit_decode_ops,
    208	.src_formats = {
    209		V4L2_PIX_FMT_H264,
    210		V4L2_PIX_FMT_MPEG2,
    211		V4L2_PIX_FMT_MPEG4,
    212	},
    213	.dst_formats = {
    214		V4L2_PIX_FMT_NV12,
    215		V4L2_PIX_FMT_YUV420,
    216		V4L2_PIX_FMT_YVU420,
    217		/*
    218		 * If V4L2_PIX_FMT_YUYV should be default,
    219		 * set_default_params() must be adjusted.
    220		 */
    221		V4L2_PIX_FMT_YUYV,
    222	},
    223};
    224
    225static const struct coda_video_device coda_bit_jpeg_decoder = {
    226	.name = "coda-jpeg-decoder",
    227	.type = CODA_INST_DECODER,
    228	.ops = &coda_bit_decode_ops,
    229	.src_formats = {
    230		V4L2_PIX_FMT_JPEG,
    231	},
    232	.dst_formats = {
    233		V4L2_PIX_FMT_NV12,
    234		V4L2_PIX_FMT_YUV420,
    235		V4L2_PIX_FMT_YVU420,
    236		V4L2_PIX_FMT_YUV422P,
    237	},
    238};
    239
    240static const struct coda_video_device coda9_jpeg_encoder = {
    241	.name = "coda-jpeg-encoder",
    242	.type = CODA_INST_ENCODER,
    243	.ops = &coda9_jpeg_encode_ops,
    244	.direct = true,
    245	.src_formats = {
    246		V4L2_PIX_FMT_NV12,
    247		V4L2_PIX_FMT_YUV420,
    248		V4L2_PIX_FMT_YVU420,
    249		V4L2_PIX_FMT_YUV422P,
    250		V4L2_PIX_FMT_GREY,
    251	},
    252	.dst_formats = {
    253		V4L2_PIX_FMT_JPEG,
    254	},
    255};
    256
    257static const struct coda_video_device coda9_jpeg_decoder = {
    258	.name = "coda-jpeg-decoder",
    259	.type = CODA_INST_DECODER,
    260	.ops = &coda9_jpeg_decode_ops,
    261	.direct = true,
    262	.src_formats = {
    263		V4L2_PIX_FMT_JPEG,
    264	},
    265	.dst_formats = {
    266		V4L2_PIX_FMT_NV12,
    267		V4L2_PIX_FMT_YUV420,
    268		V4L2_PIX_FMT_YVU420,
    269		V4L2_PIX_FMT_YUV422P,
    270	},
    271};
    272
    273static const struct coda_video_device *codadx6_video_devices[] = {
    274	&coda_bit_encoder,
    275};
    276
    277static const struct coda_video_device *codahx4_video_devices[] = {
    278	&coda_bit_encoder,
    279	&coda_bit_decoder,
    280};
    281
    282static const struct coda_video_device *coda7_video_devices[] = {
    283	&coda_bit_jpeg_encoder,
    284	&coda_bit_jpeg_decoder,
    285	&coda_bit_encoder,
    286	&coda_bit_decoder,
    287};
    288
    289static const struct coda_video_device *coda9_video_devices[] = {
    290	&coda9_jpeg_encoder,
    291	&coda9_jpeg_decoder,
    292	&coda_bit_encoder,
    293	&coda_bit_decoder,
    294};
    295
    296/*
    297 * Normalize all supported YUV 4:2:0 formats to the value used in the codec
    298 * tables.
    299 */
    300static u32 coda_format_normalize_yuv(u32 fourcc)
    301{
    302	switch (fourcc) {
    303	case V4L2_PIX_FMT_NV12:
    304	case V4L2_PIX_FMT_YUV420:
    305	case V4L2_PIX_FMT_YVU420:
    306	case V4L2_PIX_FMT_YUV422P:
    307	case V4L2_PIX_FMT_YUYV:
    308		return V4L2_PIX_FMT_YUV420;
    309	default:
    310		return fourcc;
    311	}
    312}
    313
    314static const struct coda_codec *coda_find_codec(struct coda_dev *dev,
    315						int src_fourcc, int dst_fourcc)
    316{
    317	const struct coda_codec *codecs = dev->devtype->codecs;
    318	int num_codecs = dev->devtype->num_codecs;
    319	int k;
    320
    321	src_fourcc = coda_format_normalize_yuv(src_fourcc);
    322	dst_fourcc = coda_format_normalize_yuv(dst_fourcc);
    323	if (src_fourcc == dst_fourcc)
    324		return NULL;
    325
    326	for (k = 0; k < num_codecs; k++) {
    327		if (codecs[k].src_fourcc == src_fourcc &&
    328		    codecs[k].dst_fourcc == dst_fourcc)
    329			break;
    330	}
    331
    332	if (k == num_codecs)
    333		return NULL;
    334
    335	return &codecs[k];
    336}
    337
    338static void coda_get_max_dimensions(struct coda_dev *dev,
    339				    const struct coda_codec *codec,
    340				    int *max_w, int *max_h)
    341{
    342	const struct coda_codec *codecs = dev->devtype->codecs;
    343	int num_codecs = dev->devtype->num_codecs;
    344	unsigned int w, h;
    345	int k;
    346
    347	if (codec) {
    348		w = codec->max_w;
    349		h = codec->max_h;
    350	} else {
    351		for (k = 0, w = 0, h = 0; k < num_codecs; k++) {
    352			w = max(w, codecs[k].max_w);
    353			h = max(h, codecs[k].max_h);
    354		}
    355	}
    356
    357	if (max_w)
    358		*max_w = w;
    359	if (max_h)
    360		*max_h = h;
    361}
    362
    363static const struct coda_video_device *to_coda_video_device(struct video_device
    364							    *vdev)
    365{
    366	struct coda_dev *dev = video_get_drvdata(vdev);
    367	unsigned int i = vdev - dev->vfd;
    368
    369	if (i >= dev->devtype->num_vdevs)
    370		return NULL;
    371
    372	return dev->devtype->vdevs[i];
    373}
    374
    375const char *coda_product_name(int product)
    376{
    377	static char buf[9];
    378
    379	switch (product) {
    380	case CODA_DX6:
    381		return "CodaDx6";
    382	case CODA_HX4:
    383		return "CodaHx4";
    384	case CODA_7541:
    385		return "CODA7541";
    386	case CODA_960:
    387		return "CODA960";
    388	default:
    389		snprintf(buf, sizeof(buf), "(0x%04x)", product);
    390		return buf;
    391	}
    392}
    393
    394static struct vdoa_data *coda_get_vdoa_data(void)
    395{
    396	struct device_node *vdoa_node;
    397	struct platform_device *vdoa_pdev;
    398	struct vdoa_data *vdoa_data = NULL;
    399
    400	vdoa_node = of_find_compatible_node(NULL, NULL, "fsl,imx6q-vdoa");
    401	if (!vdoa_node)
    402		return NULL;
    403
    404	vdoa_pdev = of_find_device_by_node(vdoa_node);
    405	if (!vdoa_pdev)
    406		goto out;
    407
    408	vdoa_data = platform_get_drvdata(vdoa_pdev);
    409	if (!vdoa_data)
    410		vdoa_data = ERR_PTR(-EPROBE_DEFER);
    411
    412	put_device(&vdoa_pdev->dev);
    413out:
    414	of_node_put(vdoa_node);
    415
    416	return vdoa_data;
    417}
    418
    419/*
    420 * V4L2 ioctl() operations.
    421 */
    422static int coda_querycap(struct file *file, void *priv,
    423			 struct v4l2_capability *cap)
    424{
    425	struct coda_ctx *ctx = fh_to_ctx(priv);
    426
    427	strscpy(cap->driver, CODA_NAME, sizeof(cap->driver));
    428	strscpy(cap->card, coda_product_name(ctx->dev->devtype->product),
    429		sizeof(cap->card));
    430	strscpy(cap->bus_info, "platform:" CODA_NAME, sizeof(cap->bus_info));
    431	return 0;
    432}
    433
    434static const u32 coda_formats_420[CODA_MAX_FORMATS] = {
    435		V4L2_PIX_FMT_NV12,
    436		V4L2_PIX_FMT_YUV420,
    437		V4L2_PIX_FMT_YVU420,
    438};
    439
    440static int coda_enum_fmt(struct file *file, void *priv,
    441			 struct v4l2_fmtdesc *f)
    442{
    443	struct video_device *vdev = video_devdata(file);
    444	const struct coda_video_device *cvd = to_coda_video_device(vdev);
    445	struct coda_ctx *ctx = fh_to_ctx(priv);
    446	const u32 *formats;
    447
    448	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
    449		formats = cvd->src_formats;
    450	else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
    451		struct coda_q_data *q_data_src;
    452		struct vb2_queue *src_vq;
    453
    454		formats = cvd->dst_formats;
    455
    456		/*
    457		 * If the source format is already fixed, only allow the same
    458		 * chroma subsampling.
    459		 */
    460		q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
    461		src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
    462					 V4L2_BUF_TYPE_VIDEO_OUTPUT);
    463		if (q_data_src->fourcc == V4L2_PIX_FMT_JPEG &&
    464		    vb2_is_streaming(src_vq)) {
    465			if (ctx->params.jpeg_chroma_subsampling ==
    466			    V4L2_JPEG_CHROMA_SUBSAMPLING_420) {
    467				formats = coda_formats_420;
    468			} else if (ctx->params.jpeg_chroma_subsampling ==
    469				   V4L2_JPEG_CHROMA_SUBSAMPLING_422) {
    470				f->pixelformat = V4L2_PIX_FMT_YUV422P;
    471				return f->index ? -EINVAL : 0;
    472			}
    473		}
    474	} else {
    475		return -EINVAL;
    476	}
    477
    478	if (f->index >= CODA_MAX_FORMATS || formats[f->index] == 0)
    479		return -EINVAL;
    480
    481	/* Skip YUYV if the vdoa is not available */
    482	if (!ctx->vdoa && f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
    483	    formats[f->index] == V4L2_PIX_FMT_YUYV)
    484		return -EINVAL;
    485
    486	f->pixelformat = formats[f->index];
    487
    488	return 0;
    489}
    490
    491static int coda_g_fmt(struct file *file, void *priv,
    492		      struct v4l2_format *f)
    493{
    494	struct coda_q_data *q_data;
    495	struct coda_ctx *ctx = fh_to_ctx(priv);
    496
    497	q_data = get_q_data(ctx, f->type);
    498	if (!q_data)
    499		return -EINVAL;
    500
    501	f->fmt.pix.field	= V4L2_FIELD_NONE;
    502	f->fmt.pix.pixelformat	= q_data->fourcc;
    503	f->fmt.pix.width	= q_data->width;
    504	f->fmt.pix.height	= q_data->height;
    505	f->fmt.pix.bytesperline = q_data->bytesperline;
    506
    507	f->fmt.pix.sizeimage	= q_data->sizeimage;
    508	f->fmt.pix.colorspace	= ctx->colorspace;
    509	f->fmt.pix.xfer_func	= ctx->xfer_func;
    510	f->fmt.pix.ycbcr_enc	= ctx->ycbcr_enc;
    511	f->fmt.pix.quantization	= ctx->quantization;
    512
    513	return 0;
    514}
    515
    516static int coda_try_pixelformat(struct coda_ctx *ctx, struct v4l2_format *f)
    517{
    518	struct coda_q_data *q_data;
    519	const u32 *formats;
    520	int i;
    521
    522	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
    523		formats = ctx->cvd->src_formats;
    524	else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
    525		formats = ctx->cvd->dst_formats;
    526	else
    527		return -EINVAL;
    528
    529	for (i = 0; i < CODA_MAX_FORMATS; i++) {
    530		/* Skip YUYV if the vdoa is not available */
    531		if (!ctx->vdoa && f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
    532		    formats[i] == V4L2_PIX_FMT_YUYV)
    533			continue;
    534
    535		if (formats[i] == f->fmt.pix.pixelformat) {
    536			f->fmt.pix.pixelformat = formats[i];
    537			return 0;
    538		}
    539	}
    540
    541	/* Fall back to currently set pixelformat */
    542	q_data = get_q_data(ctx, f->type);
    543	f->fmt.pix.pixelformat = q_data->fourcc;
    544
    545	return 0;
    546}
    547
    548static int coda_try_fmt_vdoa(struct coda_ctx *ctx, struct v4l2_format *f,
    549			     bool *use_vdoa)
    550{
    551	int err;
    552
    553	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
    554		return -EINVAL;
    555
    556	if (!use_vdoa)
    557		return -EINVAL;
    558
    559	if (!ctx->vdoa) {
    560		*use_vdoa = false;
    561		return 0;
    562	}
    563
    564	err = vdoa_context_configure(NULL, round_up(f->fmt.pix.width, 16),
    565				     f->fmt.pix.height, f->fmt.pix.pixelformat);
    566	if (err) {
    567		*use_vdoa = false;
    568		return 0;
    569	}
    570
    571	*use_vdoa = true;
    572	return 0;
    573}
    574
    575static unsigned int coda_estimate_sizeimage(struct coda_ctx *ctx, u32 sizeimage,
    576					    u32 width, u32 height)
    577{
    578	/*
    579	 * This is a rough estimate for sensible compressed buffer
    580	 * sizes (between 1 and 16 bits per pixel). This could be
    581	 * improved by better format specific worst case estimates.
    582	 */
    583	return round_up(clamp(sizeimage, width * height / 8,
    584					 width * height * 2), PAGE_SIZE);
    585}
    586
    587static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec,
    588			struct v4l2_format *f)
    589{
    590	struct coda_dev *dev = ctx->dev;
    591	unsigned int max_w, max_h;
    592	enum v4l2_field field;
    593
    594	field = f->fmt.pix.field;
    595	if (field == V4L2_FIELD_ANY)
    596		field = V4L2_FIELD_NONE;
    597	else if (V4L2_FIELD_NONE != field)
    598		return -EINVAL;
    599
    600	/* V4L2 specification suggests the driver corrects the format struct
    601	 * if any of the dimensions is unsupported */
    602	f->fmt.pix.field = field;
    603
    604	coda_get_max_dimensions(dev, codec, &max_w, &max_h);
    605	v4l_bound_align_image(&f->fmt.pix.width, MIN_W, max_w, W_ALIGN,
    606			      &f->fmt.pix.height, MIN_H, max_h, H_ALIGN,
    607			      S_ALIGN);
    608
    609	switch (f->fmt.pix.pixelformat) {
    610	case V4L2_PIX_FMT_NV12:
    611	case V4L2_PIX_FMT_YUV420:
    612	case V4L2_PIX_FMT_YVU420:
    613		/*
    614		 * Frame stride must be at least multiple of 8,
    615		 * but multiple of 16 for h.264 or JPEG 4:2:x
    616		 */
    617		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
    618		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
    619					f->fmt.pix.height * 3 / 2;
    620		break;
    621	case V4L2_PIX_FMT_YUYV:
    622		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
    623		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
    624					f->fmt.pix.height;
    625		break;
    626	case V4L2_PIX_FMT_YUV422P:
    627		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
    628		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
    629					f->fmt.pix.height * 2;
    630		break;
    631	case V4L2_PIX_FMT_GREY:
    632		/* keep 16 pixel alignment of 8-bit pixel data */
    633		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
    634		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline * f->fmt.pix.height;
    635		break;
    636	case V4L2_PIX_FMT_JPEG:
    637	case V4L2_PIX_FMT_H264:
    638	case V4L2_PIX_FMT_MPEG4:
    639	case V4L2_PIX_FMT_MPEG2:
    640		f->fmt.pix.bytesperline = 0;
    641		f->fmt.pix.sizeimage = coda_estimate_sizeimage(ctx,
    642							f->fmt.pix.sizeimage,
    643							f->fmt.pix.width,
    644							f->fmt.pix.height);
    645		break;
    646	default:
    647		BUG();
    648	}
    649
    650	return 0;
    651}
    652
    653static int coda_try_fmt_vid_cap(struct file *file, void *priv,
    654				struct v4l2_format *f)
    655{
    656	struct coda_ctx *ctx = fh_to_ctx(priv);
    657	const struct coda_q_data *q_data_src;
    658	const struct coda_codec *codec;
    659	struct vb2_queue *src_vq;
    660	int hscale = 0;
    661	int vscale = 0;
    662	int ret;
    663	bool use_vdoa;
    664
    665	ret = coda_try_pixelformat(ctx, f);
    666	if (ret < 0)
    667		return ret;
    668
    669	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
    670
    671	/*
    672	 * If the source format is already fixed, only allow the same output
    673	 * resolution. When decoding JPEG images, we also have to make sure to
    674	 * use the same chroma subsampling.
    675	 */
    676	src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
    677	if (vb2_is_streaming(src_vq)) {
    678		if (q_data_src->fourcc == V4L2_PIX_FMT_JPEG &&
    679		    ctx->dev->devtype->product == CODA_960) {
    680			hscale = coda_jpeg_scale(q_data_src->width, f->fmt.pix.width);
    681			vscale = coda_jpeg_scale(q_data_src->height, f->fmt.pix.height);
    682		}
    683		f->fmt.pix.width = q_data_src->width >> hscale;
    684		f->fmt.pix.height = q_data_src->height >> vscale;
    685
    686		if (q_data_src->fourcc == V4L2_PIX_FMT_JPEG) {
    687			if (ctx->params.jpeg_chroma_subsampling ==
    688			    V4L2_JPEG_CHROMA_SUBSAMPLING_420 &&
    689			    f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P)
    690				f->fmt.pix.pixelformat = V4L2_PIX_FMT_NV12;
    691			else if (ctx->params.jpeg_chroma_subsampling ==
    692				 V4L2_JPEG_CHROMA_SUBSAMPLING_422)
    693				f->fmt.pix.pixelformat = V4L2_PIX_FMT_YUV422P;
    694		}
    695	}
    696
    697	f->fmt.pix.colorspace = ctx->colorspace;
    698	f->fmt.pix.xfer_func = ctx->xfer_func;
    699	f->fmt.pix.ycbcr_enc = ctx->ycbcr_enc;
    700	f->fmt.pix.quantization = ctx->quantization;
    701
    702	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
    703	codec = coda_find_codec(ctx->dev, q_data_src->fourcc,
    704				f->fmt.pix.pixelformat);
    705	if (!codec)
    706		return -EINVAL;
    707
    708	ret = coda_try_fmt(ctx, codec, f);
    709	if (ret < 0)
    710		return ret;
    711
    712	/* The decoders always write complete macroblocks or MCUs */
    713	if (ctx->inst_type == CODA_INST_DECODER) {
    714		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16 >> hscale);
    715		f->fmt.pix.height = round_up(f->fmt.pix.height, 16 >> vscale);
    716		if (codec->src_fourcc == V4L2_PIX_FMT_JPEG &&
    717		    f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUV422P) {
    718			f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
    719					       f->fmt.pix.height * 2;
    720		} else {
    721			f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
    722					       f->fmt.pix.height * 3 / 2;
    723		}
    724
    725		ret = coda_try_fmt_vdoa(ctx, f, &use_vdoa);
    726		if (ret < 0)
    727			return ret;
    728
    729		if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) {
    730			if (!use_vdoa)
    731				return -EINVAL;
    732
    733			f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
    734			f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
    735				f->fmt.pix.height;
    736		}
    737	}
    738
    739	return 0;
    740}
    741
    742static void coda_set_default_colorspace(struct v4l2_pix_format *fmt)
    743{
    744	enum v4l2_colorspace colorspace;
    745
    746	if (fmt->pixelformat == V4L2_PIX_FMT_JPEG)
    747		colorspace = V4L2_COLORSPACE_JPEG;
    748	else if (fmt->width <= 720 && fmt->height <= 576)
    749		colorspace = V4L2_COLORSPACE_SMPTE170M;
    750	else
    751		colorspace = V4L2_COLORSPACE_REC709;
    752
    753	fmt->colorspace = colorspace;
    754	fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT;
    755	fmt->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
    756	fmt->quantization = V4L2_QUANTIZATION_DEFAULT;
    757}
    758
    759static int coda_try_fmt_vid_out(struct file *file, void *priv,
    760				struct v4l2_format *f)
    761{
    762	struct coda_ctx *ctx = fh_to_ctx(priv);
    763	struct coda_dev *dev = ctx->dev;
    764	const struct coda_q_data *q_data_dst;
    765	const struct coda_codec *codec;
    766	int ret;
    767
    768	ret = coda_try_pixelformat(ctx, f);
    769	if (ret < 0)
    770		return ret;
    771
    772	if (f->fmt.pix.colorspace == V4L2_COLORSPACE_DEFAULT)
    773		coda_set_default_colorspace(&f->fmt.pix);
    774
    775	q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
    776	codec = coda_find_codec(dev, f->fmt.pix.pixelformat, q_data_dst->fourcc);
    777
    778	return coda_try_fmt(ctx, codec, f);
    779}
    780
    781static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f,
    782		      struct v4l2_rect *r)
    783{
    784	struct coda_q_data *q_data;
    785	struct vb2_queue *vq;
    786
    787	vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
    788	if (!vq)
    789		return -EINVAL;
    790
    791	q_data = get_q_data(ctx, f->type);
    792	if (!q_data)
    793		return -EINVAL;
    794
    795	if (vb2_is_busy(vq)) {
    796		v4l2_err(&ctx->dev->v4l2_dev, "%s: %s queue busy: %d\n",
    797			 __func__, v4l2_type_names[f->type], vq->num_buffers);
    798		return -EBUSY;
    799	}
    800
    801	q_data->fourcc = f->fmt.pix.pixelformat;
    802	q_data->width = f->fmt.pix.width;
    803	q_data->height = f->fmt.pix.height;
    804	q_data->bytesperline = f->fmt.pix.bytesperline;
    805	q_data->sizeimage = f->fmt.pix.sizeimage;
    806	if (r) {
    807		q_data->rect = *r;
    808	} else {
    809		q_data->rect.left = 0;
    810		q_data->rect.top = 0;
    811		q_data->rect.width = f->fmt.pix.width;
    812		q_data->rect.height = f->fmt.pix.height;
    813	}
    814
    815	switch (f->fmt.pix.pixelformat) {
    816	case V4L2_PIX_FMT_YUYV:
    817		ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
    818		break;
    819	case V4L2_PIX_FMT_NV12:
    820		if (!disable_tiling && ctx->use_bit &&
    821		    ctx->dev->devtype->product == CODA_960) {
    822			ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
    823			break;
    824		}
    825		fallthrough;
    826	case V4L2_PIX_FMT_YUV420:
    827	case V4L2_PIX_FMT_YVU420:
    828	case V4L2_PIX_FMT_YUV422P:
    829		ctx->tiled_map_type = GDI_LINEAR_FRAME_MAP;
    830		break;
    831	default:
    832		break;
    833	}
    834
    835	if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP &&
    836	    !coda_try_fmt_vdoa(ctx, f, &ctx->use_vdoa) &&
    837	    ctx->use_vdoa)
    838		vdoa_context_configure(ctx->vdoa,
    839				       round_up(f->fmt.pix.width, 16),
    840				       f->fmt.pix.height,
    841				       f->fmt.pix.pixelformat);
    842	else
    843		ctx->use_vdoa = false;
    844
    845	coda_dbg(1, ctx, "Setting %s format, wxh: %dx%d, fmt: %4.4s %c\n",
    846		 v4l2_type_names[f->type], q_data->width, q_data->height,
    847		 (char *)&q_data->fourcc,
    848		 (ctx->tiled_map_type == GDI_LINEAR_FRAME_MAP) ? 'L' : 'T');
    849
    850	return 0;
    851}
    852
    853static int coda_s_fmt_vid_cap(struct file *file, void *priv,
    854			      struct v4l2_format *f)
    855{
    856	struct coda_ctx *ctx = fh_to_ctx(priv);
    857	struct coda_q_data *q_data_src;
    858	const struct coda_codec *codec;
    859	struct v4l2_rect r;
    860	int hscale = 0;
    861	int vscale = 0;
    862	int ret;
    863
    864	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
    865
    866	if (q_data_src->fourcc == V4L2_PIX_FMT_JPEG &&
    867	    ctx->dev->devtype->product == CODA_960) {
    868		hscale = coda_jpeg_scale(q_data_src->width, f->fmt.pix.width);
    869		vscale = coda_jpeg_scale(q_data_src->height, f->fmt.pix.height);
    870	}
    871
    872	ret = coda_try_fmt_vid_cap(file, priv, f);
    873	if (ret)
    874		return ret;
    875
    876	r.left = 0;
    877	r.top = 0;
    878	r.width = q_data_src->width >> hscale;
    879	r.height = q_data_src->height >> vscale;
    880
    881	ret = coda_s_fmt(ctx, f, &r);
    882	if (ret)
    883		return ret;
    884
    885	if (ctx->inst_type != CODA_INST_ENCODER)
    886		return 0;
    887
    888	/* Setting the coded format determines the selected codec */
    889	codec = coda_find_codec(ctx->dev, q_data_src->fourcc,
    890				f->fmt.pix.pixelformat);
    891	if (!codec) {
    892		v4l2_err(&ctx->dev->v4l2_dev, "failed to determine codec\n");
    893		return -EINVAL;
    894	}
    895	ctx->codec = codec;
    896
    897	ctx->colorspace = f->fmt.pix.colorspace;
    898	ctx->xfer_func = f->fmt.pix.xfer_func;
    899	ctx->ycbcr_enc = f->fmt.pix.ycbcr_enc;
    900	ctx->quantization = f->fmt.pix.quantization;
    901
    902	return 0;
    903}
    904
    905static int coda_s_fmt_vid_out(struct file *file, void *priv,
    906			      struct v4l2_format *f)
    907{
    908	struct coda_ctx *ctx = fh_to_ctx(priv);
    909	const struct coda_codec *codec;
    910	struct v4l2_format f_cap;
    911	struct vb2_queue *dst_vq;
    912	int ret;
    913
    914	ret = coda_try_fmt_vid_out(file, priv, f);
    915	if (ret)
    916		return ret;
    917
    918	ret = coda_s_fmt(ctx, f, NULL);
    919	if (ret)
    920		return ret;
    921
    922	ctx->colorspace = f->fmt.pix.colorspace;
    923	ctx->xfer_func = f->fmt.pix.xfer_func;
    924	ctx->ycbcr_enc = f->fmt.pix.ycbcr_enc;
    925	ctx->quantization = f->fmt.pix.quantization;
    926
    927	if (ctx->inst_type != CODA_INST_DECODER)
    928		return 0;
    929
    930	/* Setting the coded format determines the selected codec */
    931	codec = coda_find_codec(ctx->dev, f->fmt.pix.pixelformat,
    932				V4L2_PIX_FMT_YUV420);
    933	if (!codec) {
    934		v4l2_err(&ctx->dev->v4l2_dev, "failed to determine codec\n");
    935		return -EINVAL;
    936	}
    937	ctx->codec = codec;
    938
    939	dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
    940	if (!dst_vq)
    941		return -EINVAL;
    942
    943	/*
    944	 * Setting the capture queue format is not possible while the capture
    945	 * queue is still busy. This is not an error, but the user will have to
    946	 * make sure themselves that the capture format is set correctly before
    947	 * starting the output queue again.
    948	 */
    949	if (vb2_is_busy(dst_vq))
    950		return 0;
    951
    952	memset(&f_cap, 0, sizeof(f_cap));
    953	f_cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    954	coda_g_fmt(file, priv, &f_cap);
    955	f_cap.fmt.pix.width = f->fmt.pix.width;
    956	f_cap.fmt.pix.height = f->fmt.pix.height;
    957
    958	return coda_s_fmt_vid_cap(file, priv, &f_cap);
    959}
    960
    961static int coda_reqbufs(struct file *file, void *priv,
    962			struct v4l2_requestbuffers *rb)
    963{
    964	struct coda_ctx *ctx = fh_to_ctx(priv);
    965	int ret;
    966
    967	ret = v4l2_m2m_reqbufs(file, ctx->fh.m2m_ctx, rb);
    968	if (ret)
    969		return ret;
    970
    971	/*
    972	 * Allow to allocate instance specific per-context buffers, such as
    973	 * bitstream ringbuffer, slice buffer, work buffer, etc. if needed.
    974	 */
    975	if (rb->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && ctx->ops->reqbufs)
    976		return ctx->ops->reqbufs(ctx, rb);
    977
    978	return 0;
    979}
    980
    981static int coda_qbuf(struct file *file, void *priv,
    982		     struct v4l2_buffer *buf)
    983{
    984	struct coda_ctx *ctx = fh_to_ctx(priv);
    985
    986	if (ctx->inst_type == CODA_INST_DECODER &&
    987	    buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
    988		buf->flags &= ~V4L2_BUF_FLAG_LAST;
    989
    990	return v4l2_m2m_qbuf(file, ctx->fh.m2m_ctx, buf);
    991}
    992
    993static int coda_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
    994{
    995	struct coda_ctx *ctx = fh_to_ctx(priv);
    996	int ret;
    997
    998	ret = v4l2_m2m_dqbuf(file, ctx->fh.m2m_ctx, buf);
    999
   1000	if (ctx->inst_type == CODA_INST_DECODER &&
   1001	    buf->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
   1002		buf->flags &= ~V4L2_BUF_FLAG_LAST;
   1003
   1004	return ret;
   1005}
   1006
   1007void coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf,
   1008		       enum vb2_buffer_state state)
   1009{
   1010	const struct v4l2_event eos_event = {
   1011		.type = V4L2_EVENT_EOS
   1012	};
   1013
   1014	if (buf->flags & V4L2_BUF_FLAG_LAST)
   1015		v4l2_event_queue_fh(&ctx->fh, &eos_event);
   1016
   1017	v4l2_m2m_buf_done(buf, state);
   1018}
   1019
   1020static int coda_g_selection(struct file *file, void *fh,
   1021			    struct v4l2_selection *s)
   1022{
   1023	struct coda_ctx *ctx = fh_to_ctx(fh);
   1024	struct coda_q_data *q_data;
   1025	struct v4l2_rect r, *rsel;
   1026
   1027	q_data = get_q_data(ctx, s->type);
   1028	if (!q_data)
   1029		return -EINVAL;
   1030
   1031	r.left = 0;
   1032	r.top = 0;
   1033	r.width = q_data->width;
   1034	r.height = q_data->height;
   1035	rsel = &q_data->rect;
   1036
   1037	switch (s->target) {
   1038	case V4L2_SEL_TGT_CROP_DEFAULT:
   1039	case V4L2_SEL_TGT_CROP_BOUNDS:
   1040		rsel = &r;
   1041		fallthrough;
   1042	case V4L2_SEL_TGT_CROP:
   1043		if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT ||
   1044		    ctx->inst_type == CODA_INST_DECODER)
   1045			return -EINVAL;
   1046		break;
   1047	case V4L2_SEL_TGT_COMPOSE_BOUNDS:
   1048	case V4L2_SEL_TGT_COMPOSE_PADDED:
   1049		rsel = &r;
   1050		fallthrough;
   1051	case V4L2_SEL_TGT_COMPOSE:
   1052	case V4L2_SEL_TGT_COMPOSE_DEFAULT:
   1053		if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
   1054		    ctx->inst_type == CODA_INST_ENCODER)
   1055			return -EINVAL;
   1056		break;
   1057	default:
   1058		return -EINVAL;
   1059	}
   1060
   1061	s->r = *rsel;
   1062
   1063	return 0;
   1064}
   1065
   1066static int coda_s_selection(struct file *file, void *fh,
   1067			    struct v4l2_selection *s)
   1068{
   1069	struct coda_ctx *ctx = fh_to_ctx(fh);
   1070	struct coda_q_data *q_data;
   1071
   1072	switch (s->target) {
   1073	case V4L2_SEL_TGT_CROP:
   1074		if (ctx->inst_type == CODA_INST_ENCODER &&
   1075		    s->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
   1076			q_data = get_q_data(ctx, s->type);
   1077			if (!q_data)
   1078				return -EINVAL;
   1079
   1080			s->r.left = 0;
   1081			s->r.top = 0;
   1082			s->r.width = clamp(s->r.width, 2U, q_data->width);
   1083			s->r.height = clamp(s->r.height, 2U, q_data->height);
   1084
   1085			if (s->flags & V4L2_SEL_FLAG_LE) {
   1086				s->r.width = round_up(s->r.width, 2);
   1087				s->r.height = round_up(s->r.height, 2);
   1088			} else {
   1089				s->r.width = round_down(s->r.width, 2);
   1090				s->r.height = round_down(s->r.height, 2);
   1091			}
   1092
   1093			q_data->rect = s->r;
   1094
   1095			coda_dbg(1, ctx, "Setting crop rectangle: %dx%d\n",
   1096				 s->r.width, s->r.height);
   1097
   1098			return 0;
   1099		}
   1100		fallthrough;
   1101	case V4L2_SEL_TGT_NATIVE_SIZE:
   1102	case V4L2_SEL_TGT_COMPOSE:
   1103		return coda_g_selection(file, fh, s);
   1104	default:
   1105		/* v4l2-compliance expects this to fail for read-only targets */
   1106		return -EINVAL;
   1107	}
   1108}
   1109
   1110static void coda_wake_up_capture_queue(struct coda_ctx *ctx)
   1111{
   1112	struct vb2_queue *dst_vq;
   1113
   1114	coda_dbg(1, ctx, "waking up capture queue\n");
   1115
   1116	dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1117	dst_vq->last_buffer_dequeued = true;
   1118	wake_up(&dst_vq->done_wq);
   1119}
   1120
   1121static int coda_encoder_cmd(struct file *file, void *fh,
   1122			    struct v4l2_encoder_cmd *ec)
   1123{
   1124	struct coda_ctx *ctx = fh_to_ctx(fh);
   1125	struct vb2_v4l2_buffer *buf;
   1126	int ret;
   1127
   1128	ret = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, ec);
   1129	if (ret < 0)
   1130		return ret;
   1131
   1132	mutex_lock(&ctx->wakeup_mutex);
   1133	buf = v4l2_m2m_last_src_buf(ctx->fh.m2m_ctx);
   1134	if (buf) {
   1135		/*
   1136		 * If the last output buffer is still on the queue, make sure
   1137		 * that decoder finish_run will see the last flag and report it
   1138		 * to userspace.
   1139		 */
   1140		buf->flags |= V4L2_BUF_FLAG_LAST;
   1141	} else {
   1142		/* Set the stream-end flag on this context */
   1143		ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;
   1144
   1145		/*
   1146		 * If the last output buffer has already been taken from the
   1147		 * queue, wake up the capture queue and signal end of stream
   1148		 * via the -EPIPE mechanism.
   1149		 */
   1150		coda_wake_up_capture_queue(ctx);
   1151	}
   1152	mutex_unlock(&ctx->wakeup_mutex);
   1153
   1154	return 0;
   1155}
   1156
   1157static bool coda_mark_last_meta(struct coda_ctx *ctx)
   1158{
   1159	struct coda_buffer_meta *meta;
   1160
   1161	coda_dbg(1, ctx, "marking last meta\n");
   1162
   1163	spin_lock(&ctx->buffer_meta_lock);
   1164	if (list_empty(&ctx->buffer_meta_list)) {
   1165		spin_unlock(&ctx->buffer_meta_lock);
   1166		return false;
   1167	}
   1168
   1169	meta = list_last_entry(&ctx->buffer_meta_list, struct coda_buffer_meta,
   1170			       list);
   1171	meta->last = true;
   1172
   1173	spin_unlock(&ctx->buffer_meta_lock);
   1174	return true;
   1175}
   1176
   1177static bool coda_mark_last_dst_buf(struct coda_ctx *ctx)
   1178{
   1179	struct vb2_v4l2_buffer *buf;
   1180	struct vb2_buffer *dst_vb;
   1181	struct vb2_queue *dst_vq;
   1182	unsigned long flags;
   1183
   1184	coda_dbg(1, ctx, "marking last capture buffer\n");
   1185
   1186	dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1187	spin_lock_irqsave(&dst_vq->done_lock, flags);
   1188	if (list_empty(&dst_vq->done_list)) {
   1189		spin_unlock_irqrestore(&dst_vq->done_lock, flags);
   1190		return false;
   1191	}
   1192
   1193	dst_vb = list_last_entry(&dst_vq->done_list, struct vb2_buffer,
   1194				 done_entry);
   1195	buf = to_vb2_v4l2_buffer(dst_vb);
   1196	buf->flags |= V4L2_BUF_FLAG_LAST;
   1197
   1198	spin_unlock_irqrestore(&dst_vq->done_lock, flags);
   1199	return true;
   1200}
   1201
   1202static int coda_decoder_cmd(struct file *file, void *fh,
   1203			    struct v4l2_decoder_cmd *dc)
   1204{
   1205	struct coda_ctx *ctx = fh_to_ctx(fh);
   1206	struct coda_dev *dev = ctx->dev;
   1207	struct vb2_v4l2_buffer *buf;
   1208	struct vb2_queue *dst_vq;
   1209	bool stream_end;
   1210	bool wakeup;
   1211	int ret;
   1212
   1213	ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, dc);
   1214	if (ret < 0)
   1215		return ret;
   1216
   1217	switch (dc->cmd) {
   1218	case V4L2_DEC_CMD_START:
   1219		mutex_lock(&dev->coda_mutex);
   1220		mutex_lock(&ctx->bitstream_mutex);
   1221		coda_bitstream_flush(ctx);
   1222		dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
   1223					 V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1224		vb2_clear_last_buffer_dequeued(dst_vq);
   1225		ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG;
   1226		coda_fill_bitstream(ctx, NULL);
   1227		mutex_unlock(&ctx->bitstream_mutex);
   1228		mutex_unlock(&dev->coda_mutex);
   1229		break;
   1230	case V4L2_DEC_CMD_STOP:
   1231		stream_end = false;
   1232		wakeup = false;
   1233
   1234		mutex_lock(&ctx->wakeup_mutex);
   1235
   1236		buf = v4l2_m2m_last_src_buf(ctx->fh.m2m_ctx);
   1237		if (buf) {
   1238			coda_dbg(1, ctx, "marking last pending buffer\n");
   1239
   1240			/* Mark last buffer */
   1241			buf->flags |= V4L2_BUF_FLAG_LAST;
   1242
   1243			if (v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx) == 0) {
   1244				coda_dbg(1, ctx, "all remaining buffers queued\n");
   1245				stream_end = true;
   1246			}
   1247		} else {
   1248			if (ctx->use_bit)
   1249				if (coda_mark_last_meta(ctx))
   1250					stream_end = true;
   1251				else
   1252					wakeup = true;
   1253			else
   1254				if (!coda_mark_last_dst_buf(ctx))
   1255					wakeup = true;
   1256		}
   1257
   1258		if (stream_end) {
   1259			coda_dbg(1, ctx, "all remaining buffers queued\n");
   1260
   1261			/* Set the stream-end flag on this context */
   1262			coda_bit_stream_end_flag(ctx);
   1263			ctx->hold = false;
   1264			v4l2_m2m_try_schedule(ctx->fh.m2m_ctx);
   1265		}
   1266
   1267		if (wakeup) {
   1268			/* If there is no buffer in flight, wake up */
   1269			coda_wake_up_capture_queue(ctx);
   1270		}
   1271
   1272		mutex_unlock(&ctx->wakeup_mutex);
   1273		break;
   1274	default:
   1275		return -EINVAL;
   1276	}
   1277
   1278	return 0;
   1279}
   1280
   1281static int coda_enum_framesizes(struct file *file, void *fh,
   1282				struct v4l2_frmsizeenum *fsize)
   1283{
   1284	struct coda_ctx *ctx = fh_to_ctx(fh);
   1285	struct coda_q_data *q_data_dst;
   1286	const struct coda_codec *codec;
   1287
   1288	if (fsize->index)
   1289		return -EINVAL;
   1290
   1291	if (coda_format_normalize_yuv(fsize->pixel_format) ==
   1292	    V4L2_PIX_FMT_YUV420) {
   1293		q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1294		codec = coda_find_codec(ctx->dev, fsize->pixel_format,
   1295					q_data_dst->fourcc);
   1296	} else {
   1297		codec = coda_find_codec(ctx->dev, V4L2_PIX_FMT_YUV420,
   1298					fsize->pixel_format);
   1299	}
   1300	if (!codec)
   1301		return -EINVAL;
   1302
   1303	fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
   1304	fsize->stepwise.min_width = MIN_W;
   1305	fsize->stepwise.max_width = codec->max_w;
   1306	fsize->stepwise.step_width = 1;
   1307	fsize->stepwise.min_height = MIN_H;
   1308	fsize->stepwise.max_height = codec->max_h;
   1309	fsize->stepwise.step_height = 1;
   1310
   1311	return 0;
   1312}
   1313
   1314static int coda_enum_frameintervals(struct file *file, void *fh,
   1315				    struct v4l2_frmivalenum *f)
   1316{
   1317	struct coda_ctx *ctx = fh_to_ctx(fh);
   1318	struct coda_q_data *q_data;
   1319	const struct coda_codec *codec;
   1320
   1321	if (f->index)
   1322		return -EINVAL;
   1323
   1324	/* Disallow YUYV if the vdoa is not available */
   1325	if (!ctx->vdoa && f->pixel_format == V4L2_PIX_FMT_YUYV)
   1326		return -EINVAL;
   1327
   1328	if (coda_format_normalize_yuv(f->pixel_format) == V4L2_PIX_FMT_YUV420) {
   1329		q_data = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   1330		codec = coda_find_codec(ctx->dev, f->pixel_format,
   1331					q_data->fourcc);
   1332	} else {
   1333		codec = coda_find_codec(ctx->dev, V4L2_PIX_FMT_YUV420,
   1334					f->pixel_format);
   1335	}
   1336	if (!codec)
   1337		return -EINVAL;
   1338
   1339	if (f->width < MIN_W || f->width > codec->max_w ||
   1340	    f->height < MIN_H || f->height > codec->max_h)
   1341		return -EINVAL;
   1342
   1343	f->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
   1344	f->stepwise.min.numerator = 1;
   1345	f->stepwise.min.denominator = 65535;
   1346	f->stepwise.max.numerator = 65536;
   1347	f->stepwise.max.denominator = 1;
   1348	f->stepwise.step.numerator = 1;
   1349	f->stepwise.step.denominator = 1;
   1350
   1351	return 0;
   1352}
   1353
   1354static int coda_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
   1355{
   1356	struct coda_ctx *ctx = fh_to_ctx(fh);
   1357	struct v4l2_fract *tpf;
   1358
   1359	if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
   1360		return -EINVAL;
   1361
   1362	a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
   1363	tpf = &a->parm.output.timeperframe;
   1364	tpf->denominator = ctx->params.framerate & CODA_FRATE_RES_MASK;
   1365	tpf->numerator = 1 + (ctx->params.framerate >>
   1366			      CODA_FRATE_DIV_OFFSET);
   1367
   1368	return 0;
   1369}
   1370
   1371/*
   1372 * Approximate timeperframe v4l2_fract with values that can be written
   1373 * into the 16-bit CODA_FRATE_DIV and CODA_FRATE_RES fields.
   1374 */
   1375static void coda_approximate_timeperframe(struct v4l2_fract *timeperframe)
   1376{
   1377	struct v4l2_fract s = *timeperframe;
   1378	struct v4l2_fract f0;
   1379	struct v4l2_fract f1 = { 1, 0 };
   1380	struct v4l2_fract f2 = { 0, 1 };
   1381	unsigned int i, div, s_denominator;
   1382
   1383	/* Lower bound is 1/65535 */
   1384	if (s.numerator == 0 || s.denominator / s.numerator > 65535) {
   1385		timeperframe->numerator = 1;
   1386		timeperframe->denominator = 65535;
   1387		return;
   1388	}
   1389
   1390	/* Upper bound is 65536/1 */
   1391	if (s.denominator == 0 || s.numerator / s.denominator > 65536) {
   1392		timeperframe->numerator = 65536;
   1393		timeperframe->denominator = 1;
   1394		return;
   1395	}
   1396
   1397	/* Reduce fraction to lowest terms */
   1398	div = gcd(s.numerator, s.denominator);
   1399	if (div > 1) {
   1400		s.numerator /= div;
   1401		s.denominator /= div;
   1402	}
   1403
   1404	if (s.numerator <= 65536 && s.denominator < 65536) {
   1405		*timeperframe = s;
   1406		return;
   1407	}
   1408
   1409	/* Find successive convergents from continued fraction expansion */
   1410	while (f2.numerator <= 65536 && f2.denominator < 65536) {
   1411		f0 = f1;
   1412		f1 = f2;
   1413
   1414		/* Stop when f2 exactly equals timeperframe */
   1415		if (s.numerator == 0)
   1416			break;
   1417
   1418		i = s.denominator / s.numerator;
   1419
   1420		f2.numerator = f0.numerator + i * f1.numerator;
   1421		f2.denominator = f0.denominator + i * f2.denominator;
   1422
   1423		s_denominator = s.numerator;
   1424		s.numerator = s.denominator % s.numerator;
   1425		s.denominator = s_denominator;
   1426	}
   1427
   1428	*timeperframe = f1;
   1429}
   1430
   1431static uint32_t coda_timeperframe_to_frate(struct v4l2_fract *timeperframe)
   1432{
   1433	return ((timeperframe->numerator - 1) << CODA_FRATE_DIV_OFFSET) |
   1434		timeperframe->denominator;
   1435}
   1436
   1437static int coda_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
   1438{
   1439	struct coda_ctx *ctx = fh_to_ctx(fh);
   1440	struct v4l2_fract *tpf;
   1441
   1442	if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
   1443		return -EINVAL;
   1444
   1445	a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
   1446	tpf = &a->parm.output.timeperframe;
   1447	coda_approximate_timeperframe(tpf);
   1448	ctx->params.framerate = coda_timeperframe_to_frate(tpf);
   1449	ctx->params.framerate_changed = true;
   1450
   1451	return 0;
   1452}
   1453
   1454static int coda_subscribe_event(struct v4l2_fh *fh,
   1455				const struct v4l2_event_subscription *sub)
   1456{
   1457	struct coda_ctx *ctx = fh_to_ctx(fh);
   1458
   1459	switch (sub->type) {
   1460	case V4L2_EVENT_EOS:
   1461		return v4l2_event_subscribe(fh, sub, 0, NULL);
   1462	case V4L2_EVENT_SOURCE_CHANGE:
   1463		if (ctx->inst_type == CODA_INST_DECODER)
   1464			return v4l2_event_subscribe(fh, sub, 0, NULL);
   1465		else
   1466			return -EINVAL;
   1467	default:
   1468		return v4l2_ctrl_subscribe_event(fh, sub);
   1469	}
   1470}
   1471
   1472static const struct v4l2_ioctl_ops coda_ioctl_ops = {
   1473	.vidioc_querycap	= coda_querycap,
   1474
   1475	.vidioc_enum_fmt_vid_cap = coda_enum_fmt,
   1476	.vidioc_g_fmt_vid_cap	= coda_g_fmt,
   1477	.vidioc_try_fmt_vid_cap	= coda_try_fmt_vid_cap,
   1478	.vidioc_s_fmt_vid_cap	= coda_s_fmt_vid_cap,
   1479
   1480	.vidioc_enum_fmt_vid_out = coda_enum_fmt,
   1481	.vidioc_g_fmt_vid_out	= coda_g_fmt,
   1482	.vidioc_try_fmt_vid_out	= coda_try_fmt_vid_out,
   1483	.vidioc_s_fmt_vid_out	= coda_s_fmt_vid_out,
   1484
   1485	.vidioc_reqbufs		= coda_reqbufs,
   1486	.vidioc_querybuf	= v4l2_m2m_ioctl_querybuf,
   1487
   1488	.vidioc_qbuf		= coda_qbuf,
   1489	.vidioc_expbuf		= v4l2_m2m_ioctl_expbuf,
   1490	.vidioc_dqbuf		= coda_dqbuf,
   1491	.vidioc_create_bufs	= v4l2_m2m_ioctl_create_bufs,
   1492	.vidioc_prepare_buf	= v4l2_m2m_ioctl_prepare_buf,
   1493
   1494	.vidioc_streamon	= v4l2_m2m_ioctl_streamon,
   1495	.vidioc_streamoff	= v4l2_m2m_ioctl_streamoff,
   1496
   1497	.vidioc_g_selection	= coda_g_selection,
   1498	.vidioc_s_selection	= coda_s_selection,
   1499
   1500	.vidioc_try_encoder_cmd	= v4l2_m2m_ioctl_try_encoder_cmd,
   1501	.vidioc_encoder_cmd	= coda_encoder_cmd,
   1502	.vidioc_try_decoder_cmd	= v4l2_m2m_ioctl_try_decoder_cmd,
   1503	.vidioc_decoder_cmd	= coda_decoder_cmd,
   1504
   1505	.vidioc_g_parm		= coda_g_parm,
   1506	.vidioc_s_parm		= coda_s_parm,
   1507
   1508	.vidioc_enum_framesizes	= coda_enum_framesizes,
   1509	.vidioc_enum_frameintervals = coda_enum_frameintervals,
   1510
   1511	.vidioc_subscribe_event = coda_subscribe_event,
   1512	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
   1513};
   1514
   1515/*
   1516 * Mem-to-mem operations.
   1517 */
   1518
   1519static void coda_device_run(void *m2m_priv)
   1520{
   1521	struct coda_ctx *ctx = m2m_priv;
   1522	struct coda_dev *dev = ctx->dev;
   1523
   1524	queue_work(dev->workqueue, &ctx->pic_run_work);
   1525}
   1526
   1527static void coda_pic_run_work(struct work_struct *work)
   1528{
   1529	struct coda_ctx *ctx = container_of(work, struct coda_ctx, pic_run_work);
   1530	struct coda_dev *dev = ctx->dev;
   1531	int ret;
   1532
   1533	mutex_lock(&ctx->buffer_mutex);
   1534	mutex_lock(&dev->coda_mutex);
   1535
   1536	ret = ctx->ops->prepare_run(ctx);
   1537	if (ret < 0 && ctx->inst_type == CODA_INST_DECODER)
   1538		goto out;
   1539
   1540	if (!wait_for_completion_timeout(&ctx->completion,
   1541					 msecs_to_jiffies(1000))) {
   1542		if (ctx->use_bit) {
   1543			dev_err(dev->dev, "CODA PIC_RUN timeout\n");
   1544
   1545			ctx->hold = true;
   1546
   1547			coda_hw_reset(ctx);
   1548		}
   1549
   1550		if (ctx->ops->run_timeout)
   1551			ctx->ops->run_timeout(ctx);
   1552	} else {
   1553		ctx->ops->finish_run(ctx);
   1554	}
   1555
   1556	if ((ctx->aborting || (!ctx->streamon_cap && !ctx->streamon_out)) &&
   1557	    ctx->ops->seq_end_work)
   1558		queue_work(dev->workqueue, &ctx->seq_end_work);
   1559
   1560out:
   1561	mutex_unlock(&dev->coda_mutex);
   1562	mutex_unlock(&ctx->buffer_mutex);
   1563
   1564	v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx);
   1565}
   1566
   1567static int coda_job_ready(void *m2m_priv)
   1568{
   1569	struct coda_ctx *ctx = m2m_priv;
   1570	int src_bufs = v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx);
   1571
   1572	/*
   1573	 * For both 'P' and 'key' frame cases 1 picture
   1574	 * and 1 frame are needed. In the decoder case,
   1575	 * the compressed frame can be in the bitstream.
   1576	 */
   1577	if (!src_bufs && ctx->inst_type != CODA_INST_DECODER) {
   1578		coda_dbg(1, ctx, "not ready: not enough vid-out buffers.\n");
   1579		return 0;
   1580	}
   1581
   1582	if (!v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx)) {
   1583		coda_dbg(1, ctx, "not ready: not enough vid-cap buffers.\n");
   1584		return 0;
   1585	}
   1586
   1587	if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit) {
   1588		bool stream_end = ctx->bit_stream_param &
   1589				  CODA_BIT_STREAM_END_FLAG;
   1590		int num_metas = ctx->num_metas;
   1591		struct coda_buffer_meta *meta;
   1592		unsigned int count;
   1593
   1594		count = hweight32(ctx->frm_dis_flg);
   1595		if (ctx->use_vdoa && count >= (ctx->num_internal_frames - 1)) {
   1596			coda_dbg(1, ctx,
   1597				 "not ready: all internal buffers in use: %d/%d (0x%x)",
   1598				 count, ctx->num_internal_frames,
   1599				 ctx->frm_dis_flg);
   1600			return 0;
   1601		}
   1602
   1603		if (ctx->hold && !src_bufs) {
   1604			coda_dbg(1, ctx,
   1605				 "not ready: on hold for more buffers.\n");
   1606			return 0;
   1607		}
   1608
   1609		if (!stream_end && (num_metas + src_bufs) < 2) {
   1610			coda_dbg(1, ctx,
   1611				 "not ready: need 2 buffers available (queue:%d + bitstream:%d)\n",
   1612				 num_metas, src_bufs);
   1613			return 0;
   1614		}
   1615
   1616		meta = list_first_entry(&ctx->buffer_meta_list,
   1617					struct coda_buffer_meta, list);
   1618		if (!coda_bitstream_can_fetch_past(ctx, meta->end) &&
   1619		    !stream_end) {
   1620			coda_dbg(1, ctx,
   1621				 "not ready: not enough bitstream data to read past %u (%u)\n",
   1622				 meta->end, ctx->bitstream_fifo.kfifo.in);
   1623			return 0;
   1624		}
   1625	}
   1626
   1627	if (ctx->aborting) {
   1628		coda_dbg(1, ctx, "not ready: aborting\n");
   1629		return 0;
   1630	}
   1631
   1632	coda_dbg(2, ctx, "job ready\n");
   1633
   1634	return 1;
   1635}
   1636
   1637static void coda_job_abort(void *priv)
   1638{
   1639	struct coda_ctx *ctx = priv;
   1640
   1641	ctx->aborting = 1;
   1642
   1643	coda_dbg(1, ctx, "job abort\n");
   1644}
   1645
   1646static const struct v4l2_m2m_ops coda_m2m_ops = {
   1647	.device_run	= coda_device_run,
   1648	.job_ready	= coda_job_ready,
   1649	.job_abort	= coda_job_abort,
   1650};
   1651
   1652static void set_default_params(struct coda_ctx *ctx)
   1653{
   1654	unsigned int max_w, max_h, usize, csize;
   1655
   1656	ctx->codec = coda_find_codec(ctx->dev, ctx->cvd->src_formats[0],
   1657				     ctx->cvd->dst_formats[0]);
   1658	max_w = min(ctx->codec->max_w, 1920U);
   1659	max_h = min(ctx->codec->max_h, 1088U);
   1660	usize = max_w * max_h * 3 / 2;
   1661	csize = coda_estimate_sizeimage(ctx, usize, max_w, max_h);
   1662
   1663	ctx->params.codec_mode = ctx->codec->mode;
   1664	if (ctx->cvd->src_formats[0] == V4L2_PIX_FMT_JPEG ||
   1665	    ctx->cvd->dst_formats[0] == V4L2_PIX_FMT_JPEG) {
   1666		ctx->colorspace = V4L2_COLORSPACE_SRGB;
   1667		ctx->xfer_func = V4L2_XFER_FUNC_SRGB;
   1668		ctx->ycbcr_enc = V4L2_YCBCR_ENC_601;
   1669		ctx->quantization = V4L2_QUANTIZATION_FULL_RANGE;
   1670	} else {
   1671		ctx->colorspace = V4L2_COLORSPACE_REC709;
   1672		ctx->xfer_func = V4L2_XFER_FUNC_DEFAULT;
   1673		ctx->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
   1674		ctx->quantization = V4L2_QUANTIZATION_DEFAULT;
   1675	}
   1676	ctx->params.framerate = 30;
   1677
   1678	/* Default formats for output and input queues */
   1679	ctx->q_data[V4L2_M2M_SRC].fourcc = ctx->cvd->src_formats[0];
   1680	ctx->q_data[V4L2_M2M_DST].fourcc = ctx->cvd->dst_formats[0];
   1681	ctx->q_data[V4L2_M2M_SRC].width = max_w;
   1682	ctx->q_data[V4L2_M2M_SRC].height = max_h;
   1683	ctx->q_data[V4L2_M2M_DST].width = max_w;
   1684	ctx->q_data[V4L2_M2M_DST].height = max_h;
   1685	if (ctx->codec->src_fourcc == V4L2_PIX_FMT_YUV420) {
   1686		ctx->q_data[V4L2_M2M_SRC].bytesperline = max_w;
   1687		ctx->q_data[V4L2_M2M_SRC].sizeimage = usize;
   1688		ctx->q_data[V4L2_M2M_DST].bytesperline = 0;
   1689		ctx->q_data[V4L2_M2M_DST].sizeimage = csize;
   1690	} else {
   1691		ctx->q_data[V4L2_M2M_SRC].bytesperline = 0;
   1692		ctx->q_data[V4L2_M2M_SRC].sizeimage = csize;
   1693		ctx->q_data[V4L2_M2M_DST].bytesperline = max_w;
   1694		ctx->q_data[V4L2_M2M_DST].sizeimage = usize;
   1695	}
   1696	ctx->q_data[V4L2_M2M_SRC].rect.width = max_w;
   1697	ctx->q_data[V4L2_M2M_SRC].rect.height = max_h;
   1698	ctx->q_data[V4L2_M2M_DST].rect.width = max_w;
   1699	ctx->q_data[V4L2_M2M_DST].rect.height = max_h;
   1700
   1701	/*
   1702	 * Since the RBC2AXI logic only supports a single chroma plane,
   1703	 * macroblock tiling only works for to NV12 pixel format.
   1704	 */
   1705	ctx->tiled_map_type = GDI_LINEAR_FRAME_MAP;
   1706}
   1707
   1708/*
   1709 * Queue operations
   1710 */
   1711static int coda_queue_setup(struct vb2_queue *vq,
   1712				unsigned int *nbuffers, unsigned int *nplanes,
   1713				unsigned int sizes[], struct device *alloc_devs[])
   1714{
   1715	struct coda_ctx *ctx = vb2_get_drv_priv(vq);
   1716	struct coda_q_data *q_data;
   1717	unsigned int size;
   1718
   1719	q_data = get_q_data(ctx, vq->type);
   1720	size = q_data->sizeimage;
   1721
   1722	if (*nplanes)
   1723		return sizes[0] < size ? -EINVAL : 0;
   1724
   1725	*nplanes = 1;
   1726	sizes[0] = size;
   1727
   1728	coda_dbg(1, ctx, "get %d buffer(s) of size %d each.\n", *nbuffers,
   1729		 size);
   1730
   1731	return 0;
   1732}
   1733
   1734static int coda_buf_prepare(struct vb2_buffer *vb)
   1735{
   1736	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
   1737	struct coda_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
   1738	struct coda_q_data *q_data;
   1739
   1740	q_data = get_q_data(ctx, vb->vb2_queue->type);
   1741	if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
   1742		if (vbuf->field == V4L2_FIELD_ANY)
   1743			vbuf->field = V4L2_FIELD_NONE;
   1744		if (vbuf->field != V4L2_FIELD_NONE) {
   1745			v4l2_warn(&ctx->dev->v4l2_dev,
   1746				  "%s field isn't supported\n", __func__);
   1747			return -EINVAL;
   1748		}
   1749	}
   1750
   1751	if (vb2_plane_size(vb, 0) < q_data->sizeimage) {
   1752		v4l2_warn(&ctx->dev->v4l2_dev,
   1753			  "%s data will not fit into plane (%lu < %lu)\n",
   1754			  __func__, vb2_plane_size(vb, 0),
   1755			  (long)q_data->sizeimage);
   1756		return -EINVAL;
   1757	}
   1758
   1759	return 0;
   1760}
   1761
   1762static void coda_update_menu_ctrl(struct v4l2_ctrl *ctrl, int value)
   1763{
   1764	if (!ctrl)
   1765		return;
   1766
   1767	v4l2_ctrl_lock(ctrl);
   1768
   1769	/*
   1770	 * Extend the control range if the parsed stream contains a known but
   1771	 * unsupported value or level.
   1772	 */
   1773	if (value > ctrl->maximum) {
   1774		__v4l2_ctrl_modify_range(ctrl, ctrl->minimum, value,
   1775			ctrl->menu_skip_mask & ~(1 << value),
   1776			ctrl->default_value);
   1777	} else if (value < ctrl->minimum) {
   1778		__v4l2_ctrl_modify_range(ctrl, value, ctrl->maximum,
   1779			ctrl->menu_skip_mask & ~(1 << value),
   1780			ctrl->default_value);
   1781	}
   1782
   1783	__v4l2_ctrl_s_ctrl(ctrl, value);
   1784
   1785	v4l2_ctrl_unlock(ctrl);
   1786}
   1787
   1788void coda_update_profile_level_ctrls(struct coda_ctx *ctx, u8 profile_idc,
   1789				     u8 level_idc)
   1790{
   1791	const char * const *profile_names;
   1792	const char * const *level_names;
   1793	struct v4l2_ctrl *profile_ctrl;
   1794	struct v4l2_ctrl *level_ctrl;
   1795	const char *codec_name;
   1796	u32 profile_cid;
   1797	u32 level_cid;
   1798	int profile;
   1799	int level;
   1800
   1801	switch (ctx->codec->src_fourcc) {
   1802	case V4L2_PIX_FMT_H264:
   1803		codec_name = "H264";
   1804		profile_cid = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
   1805		level_cid = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
   1806		profile_ctrl = ctx->h264_profile_ctrl;
   1807		level_ctrl = ctx->h264_level_ctrl;
   1808		profile = coda_h264_profile(profile_idc);
   1809		level = coda_h264_level(level_idc);
   1810		break;
   1811	case V4L2_PIX_FMT_MPEG2:
   1812		codec_name = "MPEG-2";
   1813		profile_cid = V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE;
   1814		level_cid = V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL;
   1815		profile_ctrl = ctx->mpeg2_profile_ctrl;
   1816		level_ctrl = ctx->mpeg2_level_ctrl;
   1817		profile = coda_mpeg2_profile(profile_idc);
   1818		level = coda_mpeg2_level(level_idc);
   1819		break;
   1820	case V4L2_PIX_FMT_MPEG4:
   1821		codec_name = "MPEG-4";
   1822		profile_cid = V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE;
   1823		level_cid = V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL;
   1824		profile_ctrl = ctx->mpeg4_profile_ctrl;
   1825		level_ctrl = ctx->mpeg4_level_ctrl;
   1826		profile = coda_mpeg4_profile(profile_idc);
   1827		level = coda_mpeg4_level(level_idc);
   1828		break;
   1829	default:
   1830		return;
   1831	}
   1832
   1833	profile_names = v4l2_ctrl_get_menu(profile_cid);
   1834	level_names = v4l2_ctrl_get_menu(level_cid);
   1835
   1836	if (profile < 0) {
   1837		v4l2_warn(&ctx->dev->v4l2_dev, "Invalid %s profile: %u\n",
   1838			  codec_name, profile_idc);
   1839	} else {
   1840		coda_dbg(1, ctx, "Parsed %s profile: %s\n", codec_name,
   1841			 profile_names[profile]);
   1842		coda_update_menu_ctrl(profile_ctrl, profile);
   1843	}
   1844
   1845	if (level < 0) {
   1846		v4l2_warn(&ctx->dev->v4l2_dev, "Invalid %s level: %u\n",
   1847			  codec_name, level_idc);
   1848	} else {
   1849		coda_dbg(1, ctx, "Parsed %s level: %s\n", codec_name,
   1850			 level_names[level]);
   1851		coda_update_menu_ctrl(level_ctrl, level);
   1852	}
   1853}
   1854
   1855static void coda_queue_source_change_event(struct coda_ctx *ctx)
   1856{
   1857	static const struct v4l2_event source_change_event = {
   1858		.type = V4L2_EVENT_SOURCE_CHANGE,
   1859		.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
   1860	};
   1861
   1862	v4l2_event_queue_fh(&ctx->fh, &source_change_event);
   1863}
   1864
   1865static void coda_buf_queue(struct vb2_buffer *vb)
   1866{
   1867	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
   1868	struct coda_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
   1869	struct vb2_queue *vq = vb->vb2_queue;
   1870	struct coda_q_data *q_data;
   1871
   1872	q_data = get_q_data(ctx, vb->vb2_queue->type);
   1873
   1874	/*
   1875	 * In the decoder case, immediately try to copy the buffer into the
   1876	 * bitstream ringbuffer and mark it as ready to be dequeued.
   1877	 */
   1878	if (ctx->bitstream.size && vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
   1879		/*
   1880		 * For backwards compatibility, queuing an empty buffer marks
   1881		 * the stream end
   1882		 */
   1883		if (vb2_get_plane_payload(vb, 0) == 0)
   1884			coda_bit_stream_end_flag(ctx);
   1885
   1886		if (q_data->fourcc == V4L2_PIX_FMT_H264) {
   1887			/*
   1888			 * Unless already done, try to obtain profile_idc and
   1889			 * level_idc from the SPS header. This allows to decide
   1890			 * whether to enable reordering during sequence
   1891			 * initialization.
   1892			 */
   1893			if (!ctx->params.h264_profile_idc) {
   1894				coda_sps_parse_profile(ctx, vb);
   1895				coda_update_profile_level_ctrls(ctx,
   1896						ctx->params.h264_profile_idc,
   1897						ctx->params.h264_level_idc);
   1898			}
   1899		}
   1900
   1901		mutex_lock(&ctx->bitstream_mutex);
   1902		v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
   1903		if (vb2_is_streaming(vb->vb2_queue))
   1904			/* This set buf->sequence = ctx->qsequence++ */
   1905			coda_fill_bitstream(ctx, NULL);
   1906		mutex_unlock(&ctx->bitstream_mutex);
   1907
   1908		if (!ctx->initialized) {
   1909			/*
   1910			 * Run sequence initialization in case the queued
   1911			 * buffer contained headers.
   1912			 */
   1913			if (vb2_is_streaming(vb->vb2_queue) &&
   1914			    ctx->ops->seq_init_work) {
   1915				queue_work(ctx->dev->workqueue,
   1916					   &ctx->seq_init_work);
   1917				flush_work(&ctx->seq_init_work);
   1918			}
   1919
   1920			if (ctx->initialized)
   1921				coda_queue_source_change_event(ctx);
   1922		}
   1923	} else {
   1924		if ((ctx->inst_type == CODA_INST_ENCODER || !ctx->use_bit) &&
   1925		    vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
   1926			vbuf->sequence = ctx->qsequence++;
   1927		v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
   1928	}
   1929}
   1930
   1931int coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf,
   1932		       size_t size, const char *name, struct dentry *parent)
   1933{
   1934	buf->vaddr = dma_alloc_coherent(dev->dev, size, &buf->paddr,
   1935					GFP_KERNEL);
   1936	if (!buf->vaddr) {
   1937		v4l2_err(&dev->v4l2_dev,
   1938			 "Failed to allocate %s buffer of size %zu\n",
   1939			 name, size);
   1940		return -ENOMEM;
   1941	}
   1942
   1943	buf->size = size;
   1944
   1945	if (name && parent) {
   1946		buf->blob.data = buf->vaddr;
   1947		buf->blob.size = size;
   1948		buf->dentry = debugfs_create_blob(name, 0444, parent,
   1949						  &buf->blob);
   1950	}
   1951
   1952	return 0;
   1953}
   1954
   1955void coda_free_aux_buf(struct coda_dev *dev,
   1956		       struct coda_aux_buf *buf)
   1957{
   1958	if (buf->vaddr) {
   1959		dma_free_coherent(dev->dev, buf->size, buf->vaddr, buf->paddr);
   1960		buf->vaddr = NULL;
   1961		buf->size = 0;
   1962		debugfs_remove(buf->dentry);
   1963		buf->dentry = NULL;
   1964	}
   1965}
   1966
   1967static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
   1968{
   1969	struct coda_ctx *ctx = vb2_get_drv_priv(q);
   1970	struct v4l2_device *v4l2_dev = &ctx->dev->v4l2_dev;
   1971	struct coda_q_data *q_data_src, *q_data_dst;
   1972	struct v4l2_m2m_buffer *m2m_buf, *tmp;
   1973	struct vb2_v4l2_buffer *buf;
   1974	struct list_head list;
   1975	int ret = 0;
   1976
   1977	if (count < 1)
   1978		return -EINVAL;
   1979
   1980	coda_dbg(1, ctx, "start streaming %s\n", v4l2_type_names[q->type]);
   1981
   1982	INIT_LIST_HEAD(&list);
   1983
   1984	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
   1985	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
   1986		if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit) {
   1987			/* copy the buffers that were queued before streamon */
   1988			mutex_lock(&ctx->bitstream_mutex);
   1989			coda_fill_bitstream(ctx, &list);
   1990			mutex_unlock(&ctx->bitstream_mutex);
   1991
   1992			if (ctx->dev->devtype->product != CODA_960 &&
   1993			    coda_get_bitstream_payload(ctx) < 512) {
   1994				v4l2_err(v4l2_dev, "start payload < 512\n");
   1995				ret = -EINVAL;
   1996				goto err;
   1997			}
   1998
   1999			if (!ctx->initialized) {
   2000				/* Run sequence initialization */
   2001				if (ctx->ops->seq_init_work) {
   2002					queue_work(ctx->dev->workqueue,
   2003						   &ctx->seq_init_work);
   2004					flush_work(&ctx->seq_init_work);
   2005				}
   2006			}
   2007		}
   2008
   2009		/*
   2010		 * Check the first input JPEG buffer to determine chroma
   2011		 * subsampling.
   2012		 */
   2013		if (q_data_src->fourcc == V4L2_PIX_FMT_JPEG) {
   2014			buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
   2015			coda_jpeg_decode_header(ctx, &buf->vb2_buf);
   2016			/*
   2017			 * We have to start streaming even if the first buffer
   2018			 * does not contain a valid JPEG image. The error will
   2019			 * be caught during device run and will be signalled
   2020			 * via the capture buffer error flag.
   2021			 */
   2022
   2023			q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   2024			q_data_dst->width = round_up(q_data_src->width, 16);
   2025			q_data_dst->height = round_up(q_data_src->height, 16);
   2026			q_data_dst->bytesperline = q_data_dst->width;
   2027			if (ctx->params.jpeg_chroma_subsampling ==
   2028			    V4L2_JPEG_CHROMA_SUBSAMPLING_420) {
   2029				q_data_dst->sizeimage =
   2030						q_data_dst->bytesperline *
   2031						q_data_dst->height * 3 / 2;
   2032				if (q_data_dst->fourcc != V4L2_PIX_FMT_YUV420)
   2033					q_data_dst->fourcc = V4L2_PIX_FMT_NV12;
   2034			} else {
   2035				q_data_dst->sizeimage =
   2036						q_data_dst->bytesperline *
   2037						q_data_dst->height * 2;
   2038				q_data_dst->fourcc = V4L2_PIX_FMT_YUV422P;
   2039			}
   2040			q_data_dst->rect.left = 0;
   2041			q_data_dst->rect.top = 0;
   2042			q_data_dst->rect.width = q_data_src->width;
   2043			q_data_dst->rect.height = q_data_src->height;
   2044		}
   2045		ctx->streamon_out = 1;
   2046	} else {
   2047		ctx->streamon_cap = 1;
   2048	}
   2049
   2050	/* Don't start the coda unless both queues are on */
   2051	if (!(ctx->streamon_out && ctx->streamon_cap))
   2052		goto out;
   2053
   2054	q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
   2055	if ((q_data_src->rect.width != q_data_dst->width &&
   2056	     round_up(q_data_src->rect.width, 16) != q_data_dst->width) ||
   2057	    (q_data_src->rect.height != q_data_dst->height &&
   2058	     round_up(q_data_src->rect.height, 16) != q_data_dst->height)) {
   2059		v4l2_err(v4l2_dev, "can't convert %dx%d to %dx%d\n",
   2060			 q_data_src->rect.width, q_data_src->rect.height,
   2061			 q_data_dst->width, q_data_dst->height);
   2062		ret = -EINVAL;
   2063		goto err;
   2064	}
   2065
   2066	/* Allow BIT decoder device_run with no new buffers queued */
   2067	if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit)
   2068		v4l2_m2m_set_src_buffered(ctx->fh.m2m_ctx, true);
   2069
   2070	ctx->gopcounter = ctx->params.gop_size - 1;
   2071
   2072	if (q_data_dst->fourcc == V4L2_PIX_FMT_JPEG)
   2073		ctx->params.gop_size = 1;
   2074	ctx->gopcounter = ctx->params.gop_size - 1;
   2075	/* Only decoders have this control */
   2076	if (ctx->mb_err_cnt_ctrl)
   2077		v4l2_ctrl_s_ctrl(ctx->mb_err_cnt_ctrl, 0);
   2078
   2079	ret = ctx->ops->start_streaming(ctx);
   2080	if (ctx->inst_type == CODA_INST_DECODER) {
   2081		if (ret == -EAGAIN)
   2082			goto out;
   2083	}
   2084	if (ret < 0)
   2085		goto err;
   2086
   2087out:
   2088	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
   2089		list_for_each_entry_safe(m2m_buf, tmp, &list, list) {
   2090			list_del(&m2m_buf->list);
   2091			v4l2_m2m_buf_done(&m2m_buf->vb, VB2_BUF_STATE_DONE);
   2092		}
   2093	}
   2094	return 0;
   2095
   2096err:
   2097	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
   2098		list_for_each_entry_safe(m2m_buf, tmp, &list, list) {
   2099			list_del(&m2m_buf->list);
   2100			v4l2_m2m_buf_done(&m2m_buf->vb, VB2_BUF_STATE_QUEUED);
   2101		}
   2102		while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx)))
   2103			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
   2104	} else {
   2105		while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx)))
   2106			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
   2107	}
   2108	return ret;
   2109}
   2110
   2111static void coda_stop_streaming(struct vb2_queue *q)
   2112{
   2113	struct coda_ctx *ctx = vb2_get_drv_priv(q);
   2114	struct coda_dev *dev = ctx->dev;
   2115	struct vb2_v4l2_buffer *buf;
   2116	bool stop;
   2117
   2118	stop = ctx->streamon_out && ctx->streamon_cap;
   2119
   2120	coda_dbg(1, ctx, "stop streaming %s\n", v4l2_type_names[q->type]);
   2121
   2122	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
   2123		ctx->streamon_out = 0;
   2124
   2125		coda_bit_stream_end_flag(ctx);
   2126
   2127		ctx->qsequence = 0;
   2128
   2129		while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx)))
   2130			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR);
   2131	} else {
   2132		ctx->streamon_cap = 0;
   2133
   2134		ctx->osequence = 0;
   2135		ctx->sequence_offset = 0;
   2136
   2137		while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx)))
   2138			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR);
   2139	}
   2140
   2141	if (stop) {
   2142		struct coda_buffer_meta *meta;
   2143
   2144		if (ctx->ops->seq_end_work) {
   2145			queue_work(dev->workqueue, &ctx->seq_end_work);
   2146			flush_work(&ctx->seq_end_work);
   2147		}
   2148		spin_lock(&ctx->buffer_meta_lock);
   2149		while (!list_empty(&ctx->buffer_meta_list)) {
   2150			meta = list_first_entry(&ctx->buffer_meta_list,
   2151						struct coda_buffer_meta, list);
   2152			list_del(&meta->list);
   2153			kfree(meta);
   2154		}
   2155		ctx->num_metas = 0;
   2156		spin_unlock(&ctx->buffer_meta_lock);
   2157		kfifo_init(&ctx->bitstream_fifo,
   2158			ctx->bitstream.vaddr, ctx->bitstream.size);
   2159		ctx->runcounter = 0;
   2160		ctx->aborting = 0;
   2161		ctx->hold = false;
   2162	}
   2163
   2164	if (!ctx->streamon_out && !ctx->streamon_cap)
   2165		ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG;
   2166}
   2167
   2168static const struct vb2_ops coda_qops = {
   2169	.queue_setup		= coda_queue_setup,
   2170	.buf_prepare		= coda_buf_prepare,
   2171	.buf_queue		= coda_buf_queue,
   2172	.start_streaming	= coda_start_streaming,
   2173	.stop_streaming		= coda_stop_streaming,
   2174	.wait_prepare		= vb2_ops_wait_prepare,
   2175	.wait_finish		= vb2_ops_wait_finish,
   2176};
   2177
   2178static int coda_s_ctrl(struct v4l2_ctrl *ctrl)
   2179{
   2180	const char * const *val_names = v4l2_ctrl_get_menu(ctrl->id);
   2181	struct coda_ctx *ctx =
   2182			container_of(ctrl->handler, struct coda_ctx, ctrls);
   2183
   2184	if (val_names)
   2185		coda_dbg(2, ctx, "s_ctrl: id = 0x%x, name = \"%s\", val = %d (\"%s\")\n",
   2186			 ctrl->id, ctrl->name, ctrl->val, val_names[ctrl->val]);
   2187	else
   2188		coda_dbg(2, ctx, "s_ctrl: id = 0x%x, name = \"%s\", val = %d\n",
   2189			 ctrl->id, ctrl->name, ctrl->val);
   2190
   2191	switch (ctrl->id) {
   2192	case V4L2_CID_HFLIP:
   2193		if (ctrl->val)
   2194			ctx->params.rot_mode |= CODA_MIR_HOR;
   2195		else
   2196			ctx->params.rot_mode &= ~CODA_MIR_HOR;
   2197		break;
   2198	case V4L2_CID_VFLIP:
   2199		if (ctrl->val)
   2200			ctx->params.rot_mode |= CODA_MIR_VER;
   2201		else
   2202			ctx->params.rot_mode &= ~CODA_MIR_VER;
   2203		break;
   2204	case V4L2_CID_MPEG_VIDEO_BITRATE:
   2205		ctx->params.bitrate = ctrl->val / 1000;
   2206		ctx->params.bitrate_changed = true;
   2207		break;
   2208	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
   2209		ctx->params.gop_size = ctrl->val;
   2210		break;
   2211	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
   2212		ctx->params.h264_intra_qp = ctrl->val;
   2213		ctx->params.h264_intra_qp_changed = true;
   2214		break;
   2215	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
   2216		ctx->params.h264_inter_qp = ctrl->val;
   2217		break;
   2218	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
   2219		ctx->params.h264_min_qp = ctrl->val;
   2220		break;
   2221	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
   2222		ctx->params.h264_max_qp = ctrl->val;
   2223		break;
   2224	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:
   2225		ctx->params.h264_slice_alpha_c0_offset_div2 = ctrl->val;
   2226		break;
   2227	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:
   2228		ctx->params.h264_slice_beta_offset_div2 = ctrl->val;
   2229		break;
   2230	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
   2231		ctx->params.h264_disable_deblocking_filter_idc = ctrl->val;
   2232		break;
   2233	case V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION:
   2234		ctx->params.h264_constrained_intra_pred_flag = ctrl->val;
   2235		break;
   2236	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
   2237		ctx->params.frame_rc_enable = ctrl->val;
   2238		break;
   2239	case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
   2240		ctx->params.mb_rc_enable = ctrl->val;
   2241		break;
   2242	case V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET:
   2243		ctx->params.h264_chroma_qp_index_offset = ctrl->val;
   2244		break;
   2245	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
   2246		/* TODO: switch between baseline and constrained baseline */
   2247		if (ctx->inst_type == CODA_INST_ENCODER)
   2248			ctx->params.h264_profile_idc = 66;
   2249		break;
   2250	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
   2251		/* nothing to do, this is set by the encoder */
   2252		break;
   2253	case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP:
   2254		ctx->params.mpeg4_intra_qp = ctrl->val;
   2255		break;
   2256	case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP:
   2257		ctx->params.mpeg4_inter_qp = ctrl->val;
   2258		break;
   2259	case V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE:
   2260	case V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL:
   2261	case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
   2262	case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
   2263		/* nothing to do, these are fixed */
   2264		break;
   2265	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
   2266		ctx->params.slice_mode = ctrl->val;
   2267		ctx->params.slice_mode_changed = true;
   2268		break;
   2269	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:
   2270		ctx->params.slice_max_mb = ctrl->val;
   2271		ctx->params.slice_mode_changed = true;
   2272		break;
   2273	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:
   2274		ctx->params.slice_max_bits = ctrl->val * 8;
   2275		ctx->params.slice_mode_changed = true;
   2276		break;
   2277	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
   2278		break;
   2279	case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB:
   2280		ctx->params.intra_refresh = ctrl->val;
   2281		ctx->params.intra_refresh_changed = true;
   2282		break;
   2283	case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
   2284		ctx->params.force_ipicture = true;
   2285		break;
   2286	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
   2287		coda_set_jpeg_compression_quality(ctx, ctrl->val);
   2288		break;
   2289	case V4L2_CID_JPEG_RESTART_INTERVAL:
   2290		ctx->params.jpeg_restart_interval = ctrl->val;
   2291		break;
   2292	case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
   2293		ctx->params.vbv_delay = ctrl->val;
   2294		break;
   2295	case V4L2_CID_MPEG_VIDEO_VBV_SIZE:
   2296		ctx->params.vbv_size = min(ctrl->val * 8192, 0x7fffffff);
   2297		break;
   2298	default:
   2299		coda_dbg(1, ctx, "Invalid control, id=%d, val=%d\n",
   2300			 ctrl->id, ctrl->val);
   2301		return -EINVAL;
   2302	}
   2303
   2304	return 0;
   2305}
   2306
   2307static const struct v4l2_ctrl_ops coda_ctrl_ops = {
   2308	.s_ctrl = coda_s_ctrl,
   2309};
   2310
   2311static void coda_encode_ctrls(struct coda_ctx *ctx)
   2312{
   2313	int max_gop_size = (ctx->dev->devtype->product == CODA_DX6) ? 60 : 99;
   2314
   2315	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2316		V4L2_CID_MPEG_VIDEO_BITRATE, 0, 32767000, 1000, 0);
   2317	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2318		V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, max_gop_size, 1, 16);
   2319	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2320		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, 0, 51, 1, 25);
   2321	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2322		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, 0, 51, 1, 25);
   2323	if (ctx->dev->devtype->product != CODA_960) {
   2324		v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2325			V4L2_CID_MPEG_VIDEO_H264_MIN_QP, 0, 51, 1, 12);
   2326	}
   2327	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2328		V4L2_CID_MPEG_VIDEO_H264_MAX_QP, 0, 51, 1, 51);
   2329	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2330		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA, -6, 6, 1, 0);
   2331	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2332		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA, -6, 6, 1, 0);
   2333	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2334		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
   2335		V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY,
   2336		0x0, V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED);
   2337	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2338		V4L2_CID_MPEG_VIDEO_H264_CONSTRAINED_INTRA_PREDICTION, 0, 1, 1,
   2339		0);
   2340	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2341		V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, 0, 1, 1, 1);
   2342	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2343		V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE, 0, 1, 1, 1);
   2344	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2345		V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, -12, 12, 1, 0);
   2346	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2347		V4L2_CID_MPEG_VIDEO_H264_PROFILE,
   2348		V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE, 0x0,
   2349		V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE);
   2350	if (ctx->dev->devtype->product == CODA_HX4 ||
   2351	    ctx->dev->devtype->product == CODA_7541) {
   2352		v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2353			V4L2_CID_MPEG_VIDEO_H264_LEVEL,
   2354			V4L2_MPEG_VIDEO_H264_LEVEL_3_1,
   2355			~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
   2356			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
   2357			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_1)),
   2358			V4L2_MPEG_VIDEO_H264_LEVEL_3_1);
   2359	}
   2360	if (ctx->dev->devtype->product == CODA_960) {
   2361		v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2362			V4L2_CID_MPEG_VIDEO_H264_LEVEL,
   2363			V4L2_MPEG_VIDEO_H264_LEVEL_4_2,
   2364			~((1 << V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
   2365			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
   2366			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
   2367			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
   2368			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
   2369			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
   2370			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
   2371			  (1 << V4L2_MPEG_VIDEO_H264_LEVEL_4_2)),
   2372			V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
   2373	}
   2374	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2375		V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP, 1, 31, 1, 2);
   2376	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2377		V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP, 1, 31, 1, 2);
   2378	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2379		V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
   2380		V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE, 0x0,
   2381		V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE);
   2382	if (ctx->dev->devtype->product == CODA_HX4 ||
   2383	    ctx->dev->devtype->product == CODA_7541 ||
   2384	    ctx->dev->devtype->product == CODA_960) {
   2385		v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2386			V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
   2387			V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,
   2388			~(1 << V4L2_MPEG_VIDEO_MPEG4_LEVEL_5),
   2389			V4L2_MPEG_VIDEO_MPEG4_LEVEL_5);
   2390	}
   2391	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2392		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
   2393		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES, 0x0,
   2394		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE);
   2395	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2396		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, 1, 0x3fffffff, 1, 1);
   2397	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2398		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, 1, 0x3fffffff, 1,
   2399		500);
   2400	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
   2401		V4L2_CID_MPEG_VIDEO_HEADER_MODE,
   2402		V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
   2403		(1 << V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE),
   2404		V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME);
   2405	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2406		V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0,
   2407		1920 * 1088 / 256, 1, 0);
   2408	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2409		V4L2_CID_MPEG_VIDEO_VBV_DELAY, 0, 0x7fff, 1, 0);
   2410	/*
   2411	 * The maximum VBV size value is 0x7fffffff bits,
   2412	 * one bit less than 262144 KiB
   2413	 */
   2414	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2415		V4L2_CID_MPEG_VIDEO_VBV_SIZE, 0, 262144, 1, 0);
   2416}
   2417
   2418static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx)
   2419{
   2420	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2421		V4L2_CID_JPEG_COMPRESSION_QUALITY, 5, 100, 1, 50);
   2422	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2423		V4L2_CID_JPEG_RESTART_INTERVAL, 0, 100, 1, 0);
   2424}
   2425
   2426static void coda_decode_ctrls(struct coda_ctx *ctx)
   2427{
   2428	u8 max;
   2429
   2430	ctx->h264_profile_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
   2431		&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_PROFILE,
   2432		V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
   2433		~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
   2434		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
   2435		  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
   2436		V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
   2437	if (ctx->h264_profile_ctrl)
   2438		ctx->h264_profile_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2439
   2440	if (ctx->dev->devtype->product == CODA_HX4 ||
   2441	    ctx->dev->devtype->product == CODA_7541)
   2442		max = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
   2443	else if (ctx->dev->devtype->product == CODA_960)
   2444		max = V4L2_MPEG_VIDEO_H264_LEVEL_4_1;
   2445	else
   2446		return;
   2447	ctx->h264_level_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
   2448		&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_H264_LEVEL, max, 0, max);
   2449	if (ctx->h264_level_ctrl)
   2450		ctx->h264_level_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2451
   2452	ctx->mpeg2_profile_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
   2453		&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
   2454		V4L2_MPEG_VIDEO_MPEG2_PROFILE_HIGH, 0,
   2455		V4L2_MPEG_VIDEO_MPEG2_PROFILE_HIGH);
   2456	if (ctx->mpeg2_profile_ctrl)
   2457		ctx->mpeg2_profile_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2458
   2459	ctx->mpeg2_level_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
   2460		&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
   2461		V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH, 0,
   2462		V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH);
   2463	if (ctx->mpeg2_level_ctrl)
   2464		ctx->mpeg2_level_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2465
   2466	ctx->mpeg4_profile_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
   2467		&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
   2468		V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY, 0,
   2469		V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY);
   2470	if (ctx->mpeg4_profile_ctrl)
   2471		ctx->mpeg4_profile_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2472
   2473	ctx->mpeg4_level_ctrl = v4l2_ctrl_new_std_menu(&ctx->ctrls,
   2474		&coda_ctrl_ops, V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
   2475		V4L2_MPEG_VIDEO_MPEG4_LEVEL_5, 0,
   2476		V4L2_MPEG_VIDEO_MPEG4_LEVEL_5);
   2477	if (ctx->mpeg4_level_ctrl)
   2478		ctx->mpeg4_level_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2479}
   2480
   2481static const struct v4l2_ctrl_config coda_mb_err_cnt_ctrl_config = {
   2482	.id	= V4L2_CID_CODA_MB_ERR_CNT,
   2483	.name	= "Macroblocks Error Count",
   2484	.type	= V4L2_CTRL_TYPE_INTEGER,
   2485	.min	= 0,
   2486	.max	= 0x7fffffff,
   2487	.step	= 1,
   2488};
   2489
   2490static int coda_ctrls_setup(struct coda_ctx *ctx)
   2491{
   2492	v4l2_ctrl_handler_init(&ctx->ctrls, 2);
   2493
   2494	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2495		V4L2_CID_HFLIP, 0, 1, 1, 0);
   2496	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2497		V4L2_CID_VFLIP, 0, 1, 1, 0);
   2498	if (ctx->inst_type == CODA_INST_ENCODER) {
   2499		v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2500				  V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
   2501				  1, 1, 1, 1);
   2502		if (ctx->cvd->dst_formats[0] == V4L2_PIX_FMT_JPEG)
   2503			coda_jpeg_encode_ctrls(ctx);
   2504		else
   2505			coda_encode_ctrls(ctx);
   2506	} else {
   2507		v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
   2508				  V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
   2509				  1, 1, 1, 1);
   2510		if (ctx->cvd->src_formats[0] == V4L2_PIX_FMT_H264)
   2511			coda_decode_ctrls(ctx);
   2512
   2513		ctx->mb_err_cnt_ctrl = v4l2_ctrl_new_custom(&ctx->ctrls,
   2514						&coda_mb_err_cnt_ctrl_config,
   2515						NULL);
   2516		if (ctx->mb_err_cnt_ctrl)
   2517			ctx->mb_err_cnt_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
   2518	}
   2519
   2520	if (ctx->ctrls.error) {
   2521		v4l2_err(&ctx->dev->v4l2_dev,
   2522			"control initialization error (%d)",
   2523			ctx->ctrls.error);
   2524		return -EINVAL;
   2525	}
   2526
   2527	return v4l2_ctrl_handler_setup(&ctx->ctrls);
   2528}
   2529
   2530static int coda_queue_init(struct coda_ctx *ctx, struct vb2_queue *vq)
   2531{
   2532	vq->drv_priv = ctx;
   2533	vq->ops = &coda_qops;
   2534	vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
   2535	vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
   2536	vq->lock = &ctx->dev->dev_mutex;
   2537	/* One way to indicate end-of-stream for coda is to set the
   2538	 * bytesused == 0. However by default videobuf2 handles bytesused
   2539	 * equal to 0 as a special case and changes its value to the size
   2540	 * of the buffer. Set the allow_zero_bytesused flag, so
   2541	 * that videobuf2 will keep the value of bytesused intact.
   2542	 */
   2543	vq->allow_zero_bytesused = 1;
   2544	/*
   2545	 * We might be fine with no buffers on some of the queues, but that
   2546	 * would need to be reflected in job_ready(). Currently we expect all
   2547	 * queues to have at least one buffer queued.
   2548	 */
   2549	vq->min_buffers_needed = 1;
   2550	vq->dev = ctx->dev->dev;
   2551
   2552	return vb2_queue_init(vq);
   2553}
   2554
   2555int coda_encoder_queue_init(void *priv, struct vb2_queue *src_vq,
   2556			    struct vb2_queue *dst_vq)
   2557{
   2558	int ret;
   2559
   2560	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
   2561	src_vq->io_modes = VB2_DMABUF | VB2_MMAP;
   2562	src_vq->mem_ops = &vb2_dma_contig_memops;
   2563
   2564	ret = coda_queue_init(priv, src_vq);
   2565	if (ret)
   2566		return ret;
   2567
   2568	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   2569	dst_vq->io_modes = VB2_DMABUF | VB2_MMAP;
   2570	dst_vq->mem_ops = &vb2_dma_contig_memops;
   2571
   2572	return coda_queue_init(priv, dst_vq);
   2573}
   2574
   2575int coda_decoder_queue_init(void *priv, struct vb2_queue *src_vq,
   2576			    struct vb2_queue *dst_vq)
   2577{
   2578	int ret;
   2579
   2580	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
   2581	src_vq->io_modes = VB2_DMABUF | VB2_MMAP | VB2_USERPTR;
   2582	src_vq->mem_ops = &vb2_vmalloc_memops;
   2583
   2584	ret = coda_queue_init(priv, src_vq);
   2585	if (ret)
   2586		return ret;
   2587
   2588	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
   2589	dst_vq->io_modes = VB2_DMABUF | VB2_MMAP;
   2590	dst_vq->dma_attrs = DMA_ATTR_NO_KERNEL_MAPPING;
   2591	dst_vq->mem_ops = &vb2_dma_contig_memops;
   2592
   2593	return coda_queue_init(priv, dst_vq);
   2594}
   2595
   2596/*
   2597 * File operations
   2598 */
   2599
   2600static int coda_open(struct file *file)
   2601{
   2602	struct video_device *vdev = video_devdata(file);
   2603	struct coda_dev *dev = video_get_drvdata(vdev);
   2604	struct coda_ctx *ctx;
   2605	unsigned int max = ~0;
   2606	char *name;
   2607	int ret;
   2608	int idx;
   2609
   2610	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
   2611	if (!ctx)
   2612		return -ENOMEM;
   2613
   2614	if (dev->devtype->product == CODA_DX6)
   2615		max = CODADX6_MAX_INSTANCES - 1;
   2616	idx = ida_alloc_max(&dev->ida, max, GFP_KERNEL);
   2617	if (idx < 0) {
   2618		ret = idx;
   2619		goto err_coda_max;
   2620	}
   2621
   2622	name = kasprintf(GFP_KERNEL, "context%d", idx);
   2623	if (!name) {
   2624		ret = -ENOMEM;
   2625		goto err_coda_name_init;
   2626	}
   2627
   2628	ctx->debugfs_entry = debugfs_create_dir(name, dev->debugfs_root);
   2629	kfree(name);
   2630
   2631	ctx->cvd = to_coda_video_device(vdev);
   2632	ctx->inst_type = ctx->cvd->type;
   2633	ctx->ops = ctx->cvd->ops;
   2634	ctx->use_bit = !ctx->cvd->direct;
   2635	init_completion(&ctx->completion);
   2636	INIT_WORK(&ctx->pic_run_work, coda_pic_run_work);
   2637	if (ctx->ops->seq_init_work)
   2638		INIT_WORK(&ctx->seq_init_work, ctx->ops->seq_init_work);
   2639	if (ctx->ops->seq_end_work)
   2640		INIT_WORK(&ctx->seq_end_work, ctx->ops->seq_end_work);
   2641	v4l2_fh_init(&ctx->fh, video_devdata(file));
   2642	file->private_data = &ctx->fh;
   2643	v4l2_fh_add(&ctx->fh);
   2644	ctx->dev = dev;
   2645	ctx->idx = idx;
   2646
   2647	coda_dbg(1, ctx, "open instance (%p)\n", ctx);
   2648
   2649	switch (dev->devtype->product) {
   2650	case CODA_960:
   2651		/*
   2652		 * Enabling the BWB when decoding can hang the firmware with
   2653		 * certain streams. The issue was tracked as ENGR00293425 by
   2654		 * Freescale. As a workaround, disable BWB for all decoders.
   2655		 * The enable_bwb module parameter allows to override this.
   2656		 */
   2657		if (enable_bwb || ctx->inst_type == CODA_INST_ENCODER)
   2658			ctx->frame_mem_ctrl = CODA9_FRAME_ENABLE_BWB;
   2659		fallthrough;
   2660	case CODA_HX4:
   2661	case CODA_7541:
   2662		ctx->reg_idx = 0;
   2663		break;
   2664	default:
   2665		ctx->reg_idx = idx;
   2666	}
   2667	if (ctx->dev->vdoa && !disable_vdoa) {
   2668		ctx->vdoa = vdoa_context_create(dev->vdoa);
   2669		if (!ctx->vdoa)
   2670			v4l2_warn(&dev->v4l2_dev,
   2671				  "Failed to create vdoa context: not using vdoa");
   2672	}
   2673	ctx->use_vdoa = false;
   2674
   2675	/* Power up and upload firmware if necessary */
   2676	ret = pm_runtime_resume_and_get(dev->dev);
   2677	if (ret < 0) {
   2678		v4l2_err(&dev->v4l2_dev, "failed to power up: %d\n", ret);
   2679		goto err_pm_get;
   2680	}
   2681
   2682	ret = clk_prepare_enable(dev->clk_per);
   2683	if (ret)
   2684		goto err_clk_enable;
   2685
   2686	ret = clk_prepare_enable(dev->clk_ahb);
   2687	if (ret)
   2688		goto err_clk_ahb;
   2689
   2690	set_default_params(ctx);
   2691	ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx,
   2692					    ctx->ops->queue_init);
   2693	if (IS_ERR(ctx->fh.m2m_ctx)) {
   2694		ret = PTR_ERR(ctx->fh.m2m_ctx);
   2695
   2696		v4l2_err(&dev->v4l2_dev, "%s return error (%d)\n",
   2697			 __func__, ret);
   2698		goto err_ctx_init;
   2699	}
   2700
   2701	ret = coda_ctrls_setup(ctx);
   2702	if (ret) {
   2703		v4l2_err(&dev->v4l2_dev, "failed to setup coda controls\n");
   2704		goto err_ctrls_setup;
   2705	}
   2706
   2707	ctx->fh.ctrl_handler = &ctx->ctrls;
   2708
   2709	mutex_init(&ctx->bitstream_mutex);
   2710	mutex_init(&ctx->buffer_mutex);
   2711	mutex_init(&ctx->wakeup_mutex);
   2712	INIT_LIST_HEAD(&ctx->buffer_meta_list);
   2713	spin_lock_init(&ctx->buffer_meta_lock);
   2714
   2715	return 0;
   2716
   2717err_ctrls_setup:
   2718	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
   2719err_ctx_init:
   2720	clk_disable_unprepare(dev->clk_ahb);
   2721err_clk_ahb:
   2722	clk_disable_unprepare(dev->clk_per);
   2723err_clk_enable:
   2724	pm_runtime_put_sync(dev->dev);
   2725err_pm_get:
   2726	v4l2_fh_del(&ctx->fh);
   2727	v4l2_fh_exit(&ctx->fh);
   2728err_coda_name_init:
   2729	ida_free(&dev->ida, ctx->idx);
   2730err_coda_max:
   2731	kfree(ctx);
   2732	return ret;
   2733}
   2734
   2735static int coda_release(struct file *file)
   2736{
   2737	struct coda_dev *dev = video_drvdata(file);
   2738	struct coda_ctx *ctx = fh_to_ctx(file->private_data);
   2739
   2740	coda_dbg(1, ctx, "release instance (%p)\n", ctx);
   2741
   2742	if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit)
   2743		coda_bit_stream_end_flag(ctx);
   2744
   2745	/* If this instance is running, call .job_abort and wait for it to end */
   2746	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
   2747
   2748	if (ctx->vdoa)
   2749		vdoa_context_destroy(ctx->vdoa);
   2750
   2751	/* In case the instance was not running, we still need to call SEQ_END */
   2752	if (ctx->ops->seq_end_work) {
   2753		queue_work(dev->workqueue, &ctx->seq_end_work);
   2754		flush_work(&ctx->seq_end_work);
   2755	}
   2756
   2757	if (ctx->dev->devtype->product == CODA_DX6)
   2758		coda_free_aux_buf(dev, &ctx->workbuf);
   2759
   2760	v4l2_ctrl_handler_free(&ctx->ctrls);
   2761	clk_disable_unprepare(dev->clk_ahb);
   2762	clk_disable_unprepare(dev->clk_per);
   2763	pm_runtime_put_sync(dev->dev);
   2764	v4l2_fh_del(&ctx->fh);
   2765	v4l2_fh_exit(&ctx->fh);
   2766	ida_free(&dev->ida, ctx->idx);
   2767	if (ctx->ops->release)
   2768		ctx->ops->release(ctx);
   2769	debugfs_remove_recursive(ctx->debugfs_entry);
   2770	kfree(ctx);
   2771
   2772	return 0;
   2773}
   2774
   2775static const struct v4l2_file_operations coda_fops = {
   2776	.owner		= THIS_MODULE,
   2777	.open		= coda_open,
   2778	.release	= coda_release,
   2779	.poll		= v4l2_m2m_fop_poll,
   2780	.unlocked_ioctl	= video_ioctl2,
   2781	.mmap		= v4l2_m2m_fop_mmap,
   2782};
   2783
   2784static int coda_hw_init(struct coda_dev *dev)
   2785{
   2786	u32 data;
   2787	u16 *p;
   2788	int i, ret;
   2789
   2790	ret = clk_prepare_enable(dev->clk_per);
   2791	if (ret)
   2792		goto err_clk_per;
   2793
   2794	ret = clk_prepare_enable(dev->clk_ahb);
   2795	if (ret)
   2796		goto err_clk_ahb;
   2797
   2798	reset_control_reset(dev->rstc);
   2799
   2800	/*
   2801	 * Copy the first CODA_ISRAM_SIZE in the internal SRAM.
   2802	 * The 16-bit chars in the code buffer are in memory access
   2803	 * order, re-sort them to CODA order for register download.
   2804	 * Data in this SRAM survives a reboot.
   2805	 */
   2806	p = (u16 *)dev->codebuf.vaddr;
   2807	if (dev->devtype->product == CODA_DX6) {
   2808		for (i = 0; i < (CODA_ISRAM_SIZE / 2); i++)  {
   2809			data = CODA_DOWN_ADDRESS_SET(i) |
   2810				CODA_DOWN_DATA_SET(p[i ^ 1]);
   2811			coda_write(dev, data, CODA_REG_BIT_CODE_DOWN);
   2812		}
   2813	} else {
   2814		for (i = 0; i < (CODA_ISRAM_SIZE / 2); i++) {
   2815			data = CODA_DOWN_ADDRESS_SET(i) |
   2816				CODA_DOWN_DATA_SET(p[round_down(i, 4) +
   2817							3 - (i % 4)]);
   2818			coda_write(dev, data, CODA_REG_BIT_CODE_DOWN);
   2819		}
   2820	}
   2821
   2822	/* Clear registers */
   2823	for (i = 0; i < 64; i++)
   2824		coda_write(dev, 0, CODA_REG_BIT_CODE_BUF_ADDR + i * 4);
   2825
   2826	/* Tell the BIT where to find everything it needs */
   2827	if (dev->devtype->product == CODA_960 ||
   2828	    dev->devtype->product == CODA_7541 ||
   2829	    dev->devtype->product == CODA_HX4) {
   2830		coda_write(dev, dev->tempbuf.paddr,
   2831				CODA_REG_BIT_TEMP_BUF_ADDR);
   2832		coda_write(dev, 0, CODA_REG_BIT_BIT_STREAM_PARAM);
   2833	} else {
   2834		coda_write(dev, dev->workbuf.paddr,
   2835			      CODA_REG_BIT_WORK_BUF_ADDR);
   2836	}
   2837	coda_write(dev, dev->codebuf.paddr,
   2838		      CODA_REG_BIT_CODE_BUF_ADDR);
   2839	coda_write(dev, 0, CODA_REG_BIT_CODE_RUN);
   2840
   2841	/* Set default values */
   2842	switch (dev->devtype->product) {
   2843	case CODA_DX6:
   2844		coda_write(dev, CODADX6_STREAM_BUF_PIC_FLUSH,
   2845			   CODA_REG_BIT_STREAM_CTRL);
   2846		break;
   2847	default:
   2848		coda_write(dev, CODA7_STREAM_BUF_PIC_FLUSH,
   2849			   CODA_REG_BIT_STREAM_CTRL);
   2850	}
   2851	if (dev->devtype->product == CODA_960)
   2852		coda_write(dev, CODA9_FRAME_ENABLE_BWB,
   2853				CODA_REG_BIT_FRAME_MEM_CTRL);
   2854	else
   2855		coda_write(dev, 0, CODA_REG_BIT_FRAME_MEM_CTRL);
   2856
   2857	if (dev->devtype->product != CODA_DX6)
   2858		coda_write(dev, 0, CODA7_REG_BIT_AXI_SRAM_USE);
   2859
   2860	coda_write(dev, CODA_INT_INTERRUPT_ENABLE,
   2861		      CODA_REG_BIT_INT_ENABLE);
   2862
   2863	/* Reset VPU and start processor */
   2864	data = coda_read(dev, CODA_REG_BIT_CODE_RESET);
   2865	data |= CODA_REG_RESET_ENABLE;
   2866	coda_write(dev, data, CODA_REG_BIT_CODE_RESET);
   2867	udelay(10);
   2868	data &= ~CODA_REG_RESET_ENABLE;
   2869	coda_write(dev, data, CODA_REG_BIT_CODE_RESET);
   2870	coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN);
   2871
   2872	clk_disable_unprepare(dev->clk_ahb);
   2873	clk_disable_unprepare(dev->clk_per);
   2874
   2875	return 0;
   2876
   2877err_clk_ahb:
   2878	clk_disable_unprepare(dev->clk_per);
   2879err_clk_per:
   2880	return ret;
   2881}
   2882
   2883static int coda_register_device(struct coda_dev *dev, int i)
   2884{
   2885	struct video_device *vfd = &dev->vfd[i];
   2886	const char *name;
   2887	int ret;
   2888
   2889	if (i >= dev->devtype->num_vdevs)
   2890		return -EINVAL;
   2891	name = dev->devtype->vdevs[i]->name;
   2892
   2893	strscpy(vfd->name, dev->devtype->vdevs[i]->name, sizeof(vfd->name));
   2894	vfd->fops	= &coda_fops;
   2895	vfd->ioctl_ops	= &coda_ioctl_ops;
   2896	vfd->release	= video_device_release_empty;
   2897	vfd->lock	= &dev->dev_mutex;
   2898	vfd->v4l2_dev	= &dev->v4l2_dev;
   2899	vfd->vfl_dir	= VFL_DIR_M2M;
   2900	vfd->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
   2901	video_set_drvdata(vfd, dev);
   2902
   2903	/* Not applicable, use the selection API instead */
   2904	v4l2_disable_ioctl(vfd, VIDIOC_CROPCAP);
   2905	v4l2_disable_ioctl(vfd, VIDIOC_G_CROP);
   2906	v4l2_disable_ioctl(vfd, VIDIOC_S_CROP);
   2907
   2908	if (dev->devtype->vdevs[i]->type == CODA_INST_ENCODER) {
   2909		v4l2_disable_ioctl(vfd, VIDIOC_DECODER_CMD);
   2910		v4l2_disable_ioctl(vfd, VIDIOC_TRY_DECODER_CMD);
   2911		if (dev->devtype->vdevs[i]->dst_formats[0] == V4L2_PIX_FMT_JPEG) {
   2912			v4l2_disable_ioctl(vfd, VIDIOC_ENUM_FRAMEINTERVALS);
   2913			v4l2_disable_ioctl(vfd, VIDIOC_G_PARM);
   2914			v4l2_disable_ioctl(vfd, VIDIOC_S_PARM);
   2915		}
   2916	} else {
   2917		v4l2_disable_ioctl(vfd, VIDIOC_ENCODER_CMD);
   2918		v4l2_disable_ioctl(vfd, VIDIOC_TRY_ENCODER_CMD);
   2919		v4l2_disable_ioctl(vfd, VIDIOC_ENUM_FRAMESIZES);
   2920		v4l2_disable_ioctl(vfd, VIDIOC_ENUM_FRAMEINTERVALS);
   2921		v4l2_disable_ioctl(vfd, VIDIOC_G_PARM);
   2922		v4l2_disable_ioctl(vfd, VIDIOC_S_PARM);
   2923	}
   2924
   2925	ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0);
   2926	if (!ret)
   2927		v4l2_info(&dev->v4l2_dev, "%s registered as %s\n",
   2928			  name, video_device_node_name(vfd));
   2929	return ret;
   2930}
   2931
   2932static void coda_copy_firmware(struct coda_dev *dev, const u8 * const buf,
   2933			       size_t size)
   2934{
   2935	u32 *src = (u32 *)buf;
   2936
   2937	/* Check if the firmware has a 16-byte Freescale header, skip it */
   2938	if (buf[0] == 'M' && buf[1] == 'X')
   2939		src += 4;
   2940	/*
   2941	 * Check whether the firmware is in native order or pre-reordered for
   2942	 * memory access. The first instruction opcode always is 0xe40e.
   2943	 */
   2944	if (__le16_to_cpup((__le16 *)src) == 0xe40e) {
   2945		u32 *dst = dev->codebuf.vaddr;
   2946		int i;
   2947
   2948		/* Firmware in native order, reorder while copying */
   2949		if (dev->devtype->product == CODA_DX6) {
   2950			for (i = 0; i < (size - 16) / 4; i++)
   2951				dst[i] = (src[i] << 16) | (src[i] >> 16);
   2952		} else {
   2953			for (i = 0; i < (size - 16) / 4; i += 2) {
   2954				dst[i] = (src[i + 1] << 16) | (src[i + 1] >> 16);
   2955				dst[i + 1] = (src[i] << 16) | (src[i] >> 16);
   2956			}
   2957		}
   2958	} else {
   2959		/* Copy the already reordered firmware image */
   2960		memcpy(dev->codebuf.vaddr, src, size);
   2961	}
   2962}
   2963
   2964static void coda_fw_callback(const struct firmware *fw, void *context);
   2965
   2966static int coda_firmware_request(struct coda_dev *dev)
   2967{
   2968	char *fw;
   2969
   2970	if (dev->firmware >= ARRAY_SIZE(dev->devtype->firmware))
   2971		return -EINVAL;
   2972
   2973	fw = dev->devtype->firmware[dev->firmware];
   2974
   2975	dev_dbg(dev->dev, "requesting firmware '%s' for %s\n", fw,
   2976		coda_product_name(dev->devtype->product));
   2977
   2978	return request_firmware_nowait(THIS_MODULE, true, fw, dev->dev,
   2979				       GFP_KERNEL, dev, coda_fw_callback);
   2980}
   2981
   2982static void coda_fw_callback(const struct firmware *fw, void *context)
   2983{
   2984	struct coda_dev *dev = context;
   2985	int i, ret;
   2986
   2987	if (!fw) {
   2988		dev->firmware++;
   2989		ret = coda_firmware_request(dev);
   2990		if (ret < 0) {
   2991			v4l2_err(&dev->v4l2_dev, "firmware request failed\n");
   2992			goto put_pm;
   2993		}
   2994		return;
   2995	}
   2996	if (dev->firmware > 0) {
   2997		/*
   2998		 * Since we can't suppress warnings for failed asynchronous
   2999		 * firmware requests, report that the fallback firmware was
   3000		 * found.
   3001		 */
   3002		dev_info(dev->dev, "Using fallback firmware %s\n",
   3003			 dev->devtype->firmware[dev->firmware]);
   3004	}
   3005
   3006	/* allocate auxiliary per-device code buffer for the BIT processor */
   3007	ret = coda_alloc_aux_buf(dev, &dev->codebuf, fw->size, "codebuf",
   3008				 dev->debugfs_root);
   3009	if (ret < 0)
   3010		goto put_pm;
   3011
   3012	coda_copy_firmware(dev, fw->data, fw->size);
   3013	release_firmware(fw);
   3014
   3015	ret = coda_hw_init(dev);
   3016	if (ret < 0) {
   3017		v4l2_err(&dev->v4l2_dev, "HW initialization failed\n");
   3018		goto put_pm;
   3019	}
   3020
   3021	ret = coda_check_firmware(dev);
   3022	if (ret < 0)
   3023		goto put_pm;
   3024
   3025	dev->m2m_dev = v4l2_m2m_init(&coda_m2m_ops);
   3026	if (IS_ERR(dev->m2m_dev)) {
   3027		v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n");
   3028		goto put_pm;
   3029	}
   3030
   3031	for (i = 0; i < dev->devtype->num_vdevs; i++) {
   3032		ret = coda_register_device(dev, i);
   3033		if (ret) {
   3034			v4l2_err(&dev->v4l2_dev,
   3035				 "Failed to register %s video device: %d\n",
   3036				 dev->devtype->vdevs[i]->name, ret);
   3037			goto rel_vfd;
   3038		}
   3039	}
   3040
   3041	pm_runtime_put_sync(dev->dev);
   3042	return;
   3043
   3044rel_vfd:
   3045	while (--i >= 0)
   3046		video_unregister_device(&dev->vfd[i]);
   3047	v4l2_m2m_release(dev->m2m_dev);
   3048put_pm:
   3049	pm_runtime_put_sync(dev->dev);
   3050}
   3051
   3052enum coda_platform {
   3053	CODA_IMX27,
   3054	CODA_IMX51,
   3055	CODA_IMX53,
   3056	CODA_IMX6Q,
   3057	CODA_IMX6DL,
   3058};
   3059
   3060static const struct coda_devtype coda_devdata[] = {
   3061	[CODA_IMX27] = {
   3062		.firmware     = {
   3063			"vpu_fw_imx27_TO2.bin",
   3064			"vpu/vpu_fw_imx27_TO2.bin",
   3065			"v4l-codadx6-imx27.bin"
   3066		},
   3067		.product      = CODA_DX6,
   3068		.codecs       = codadx6_codecs,
   3069		.num_codecs   = ARRAY_SIZE(codadx6_codecs),
   3070		.vdevs        = codadx6_video_devices,
   3071		.num_vdevs    = ARRAY_SIZE(codadx6_video_devices),
   3072		.workbuf_size = 288 * 1024 + FMO_SLICE_SAVE_BUF_SIZE * 8 * 1024,
   3073		.iram_size    = 0xb000,
   3074	},
   3075	[CODA_IMX51] = {
   3076		.firmware     = {
   3077			"vpu_fw_imx51.bin",
   3078			"vpu/vpu_fw_imx51.bin",
   3079			"v4l-codahx4-imx51.bin"
   3080		},
   3081		.product      = CODA_HX4,
   3082		.codecs       = codahx4_codecs,
   3083		.num_codecs   = ARRAY_SIZE(codahx4_codecs),
   3084		.vdevs        = codahx4_video_devices,
   3085		.num_vdevs    = ARRAY_SIZE(codahx4_video_devices),
   3086		.workbuf_size = 128 * 1024,
   3087		.tempbuf_size = 304 * 1024,
   3088		.iram_size    = 0x14000,
   3089	},
   3090	[CODA_IMX53] = {
   3091		.firmware     = {
   3092			"vpu_fw_imx53.bin",
   3093			"vpu/vpu_fw_imx53.bin",
   3094			"v4l-coda7541-imx53.bin"
   3095		},
   3096		.product      = CODA_7541,
   3097		.codecs       = coda7_codecs,
   3098		.num_codecs   = ARRAY_SIZE(coda7_codecs),
   3099		.vdevs        = coda7_video_devices,
   3100		.num_vdevs    = ARRAY_SIZE(coda7_video_devices),
   3101		.workbuf_size = 128 * 1024,
   3102		.tempbuf_size = 304 * 1024,
   3103		.iram_size    = 0x14000,
   3104	},
   3105	[CODA_IMX6Q] = {
   3106		.firmware     = {
   3107			"vpu_fw_imx6q.bin",
   3108			"vpu/vpu_fw_imx6q.bin",
   3109			"v4l-coda960-imx6q.bin"
   3110		},
   3111		.product      = CODA_960,
   3112		.codecs       = coda9_codecs,
   3113		.num_codecs   = ARRAY_SIZE(coda9_codecs),
   3114		.vdevs        = coda9_video_devices,
   3115		.num_vdevs    = ARRAY_SIZE(coda9_video_devices),
   3116		.workbuf_size = 80 * 1024,
   3117		.tempbuf_size = 204 * 1024,
   3118		.iram_size    = 0x21000,
   3119	},
   3120	[CODA_IMX6DL] = {
   3121		.firmware     = {
   3122			"vpu_fw_imx6d.bin",
   3123			"vpu/vpu_fw_imx6d.bin",
   3124			"v4l-coda960-imx6dl.bin"
   3125		},
   3126		.product      = CODA_960,
   3127		.codecs       = coda9_codecs,
   3128		.num_codecs   = ARRAY_SIZE(coda9_codecs),
   3129		.vdevs        = coda9_video_devices,
   3130		.num_vdevs    = ARRAY_SIZE(coda9_video_devices),
   3131		.workbuf_size = 80 * 1024,
   3132		.tempbuf_size = 204 * 1024,
   3133		.iram_size    = 0x1f000, /* leave 4k for suspend code */
   3134	},
   3135};
   3136
   3137static const struct of_device_id coda_dt_ids[] = {
   3138	{ .compatible = "fsl,imx27-vpu", .data = &coda_devdata[CODA_IMX27] },
   3139	{ .compatible = "fsl,imx51-vpu", .data = &coda_devdata[CODA_IMX51] },
   3140	{ .compatible = "fsl,imx53-vpu", .data = &coda_devdata[CODA_IMX53] },
   3141	{ .compatible = "fsl,imx6q-vpu", .data = &coda_devdata[CODA_IMX6Q] },
   3142	{ .compatible = "fsl,imx6dl-vpu", .data = &coda_devdata[CODA_IMX6DL] },
   3143	{ /* sentinel */ }
   3144};
   3145MODULE_DEVICE_TABLE(of, coda_dt_ids);
   3146
   3147static int coda_probe(struct platform_device *pdev)
   3148{
   3149	struct device_node *np = pdev->dev.of_node;
   3150	struct gen_pool *pool;
   3151	struct coda_dev *dev;
   3152	int ret, irq;
   3153
   3154	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
   3155	if (!dev)
   3156		return -ENOMEM;
   3157
   3158	dev->devtype = of_device_get_match_data(&pdev->dev);
   3159
   3160	dev->dev = &pdev->dev;
   3161	dev->clk_per = devm_clk_get(&pdev->dev, "per");
   3162	if (IS_ERR(dev->clk_per)) {
   3163		dev_err(&pdev->dev, "Could not get per clock\n");
   3164		return PTR_ERR(dev->clk_per);
   3165	}
   3166
   3167	dev->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
   3168	if (IS_ERR(dev->clk_ahb)) {
   3169		dev_err(&pdev->dev, "Could not get ahb clock\n");
   3170		return PTR_ERR(dev->clk_ahb);
   3171	}
   3172
   3173	/* Get  memory for physical registers */
   3174	dev->regs_base = devm_platform_ioremap_resource(pdev, 0);
   3175	if (IS_ERR(dev->regs_base))
   3176		return PTR_ERR(dev->regs_base);
   3177
   3178	/* IRQ */
   3179	irq = platform_get_irq_byname(pdev, "bit");
   3180	if (irq < 0)
   3181		irq = platform_get_irq(pdev, 0);
   3182	if (irq < 0)
   3183		return irq;
   3184
   3185	ret = devm_request_irq(&pdev->dev, irq, coda_irq_handler, 0,
   3186			       CODA_NAME "-video", dev);
   3187	if (ret < 0) {
   3188		dev_err(&pdev->dev, "failed to request irq: %d\n", ret);
   3189		return ret;
   3190	}
   3191
   3192	/* JPEG IRQ */
   3193	if (dev->devtype->product == CODA_960) {
   3194		irq = platform_get_irq_byname(pdev, "jpeg");
   3195		if (irq < 0)
   3196			return irq;
   3197
   3198		ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
   3199						coda9_jpeg_irq_handler,
   3200						IRQF_ONESHOT, CODA_NAME "-jpeg",
   3201						dev);
   3202		if (ret < 0) {
   3203			dev_err(&pdev->dev, "failed to request jpeg irq\n");
   3204			return ret;
   3205		}
   3206	}
   3207
   3208	dev->rstc = devm_reset_control_get_optional_exclusive(&pdev->dev,
   3209							      NULL);
   3210	if (IS_ERR(dev->rstc)) {
   3211		ret = PTR_ERR(dev->rstc);
   3212		dev_err(&pdev->dev, "failed get reset control: %d\n", ret);
   3213		return ret;
   3214	}
   3215
   3216	/* Get IRAM pool from device tree */
   3217	pool = of_gen_pool_get(np, "iram", 0);
   3218	if (!pool) {
   3219		dev_err(&pdev->dev, "iram pool not available\n");
   3220		return -ENOMEM;
   3221	}
   3222	dev->iram_pool = pool;
   3223
   3224	/* Get vdoa_data if supported by the platform */
   3225	dev->vdoa = coda_get_vdoa_data();
   3226	if (PTR_ERR(dev->vdoa) == -EPROBE_DEFER)
   3227		return -EPROBE_DEFER;
   3228
   3229	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
   3230	if (ret)
   3231		return ret;
   3232
   3233	ratelimit_default_init(&dev->mb_err_rs);
   3234	mutex_init(&dev->dev_mutex);
   3235	mutex_init(&dev->coda_mutex);
   3236	ida_init(&dev->ida);
   3237
   3238	dev->debugfs_root = debugfs_create_dir("coda", NULL);
   3239
   3240	/* allocate auxiliary per-device buffers for the BIT processor */
   3241	if (dev->devtype->product == CODA_DX6) {
   3242		ret = coda_alloc_aux_buf(dev, &dev->workbuf,
   3243					 dev->devtype->workbuf_size, "workbuf",
   3244					 dev->debugfs_root);
   3245		if (ret < 0)
   3246			goto err_v4l2_register;
   3247	}
   3248
   3249	if (dev->devtype->tempbuf_size) {
   3250		ret = coda_alloc_aux_buf(dev, &dev->tempbuf,
   3251					 dev->devtype->tempbuf_size, "tempbuf",
   3252					 dev->debugfs_root);
   3253		if (ret < 0)
   3254			goto err_v4l2_register;
   3255	}
   3256
   3257	dev->iram.size = dev->devtype->iram_size;
   3258	dev->iram.vaddr = gen_pool_dma_alloc(dev->iram_pool, dev->iram.size,
   3259					     &dev->iram.paddr);
   3260	if (!dev->iram.vaddr) {
   3261		dev_warn(&pdev->dev, "unable to alloc iram\n");
   3262	} else {
   3263		memset(dev->iram.vaddr, 0, dev->iram.size);
   3264		dev->iram.blob.data = dev->iram.vaddr;
   3265		dev->iram.blob.size = dev->iram.size;
   3266		dev->iram.dentry = debugfs_create_blob("iram", 0444,
   3267						       dev->debugfs_root,
   3268						       &dev->iram.blob);
   3269	}
   3270
   3271	dev->workqueue = alloc_workqueue("coda", WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
   3272	if (!dev->workqueue) {
   3273		dev_err(&pdev->dev, "unable to alloc workqueue\n");
   3274		ret = -ENOMEM;
   3275		goto err_v4l2_register;
   3276	}
   3277
   3278	platform_set_drvdata(pdev, dev);
   3279
   3280	/*
   3281	 * Start activated so we can directly call coda_hw_init in
   3282	 * coda_fw_callback regardless of whether CONFIG_PM is
   3283	 * enabled or whether the device is associated with a PM domain.
   3284	 */
   3285	pm_runtime_get_noresume(&pdev->dev);
   3286	pm_runtime_set_active(&pdev->dev);
   3287	pm_runtime_enable(&pdev->dev);
   3288
   3289	ret = coda_firmware_request(dev);
   3290	if (ret)
   3291		goto err_alloc_workqueue;
   3292	return 0;
   3293
   3294err_alloc_workqueue:
   3295	pm_runtime_disable(&pdev->dev);
   3296	pm_runtime_put_noidle(&pdev->dev);
   3297	destroy_workqueue(dev->workqueue);
   3298err_v4l2_register:
   3299	v4l2_device_unregister(&dev->v4l2_dev);
   3300	return ret;
   3301}
   3302
   3303static int coda_remove(struct platform_device *pdev)
   3304{
   3305	struct coda_dev *dev = platform_get_drvdata(pdev);
   3306	int i;
   3307
   3308	for (i = 0; i < ARRAY_SIZE(dev->vfd); i++) {
   3309		if (video_get_drvdata(&dev->vfd[i]))
   3310			video_unregister_device(&dev->vfd[i]);
   3311	}
   3312	if (dev->m2m_dev)
   3313		v4l2_m2m_release(dev->m2m_dev);
   3314	pm_runtime_disable(&pdev->dev);
   3315	v4l2_device_unregister(&dev->v4l2_dev);
   3316	destroy_workqueue(dev->workqueue);
   3317	if (dev->iram.vaddr)
   3318		gen_pool_free(dev->iram_pool, (unsigned long)dev->iram.vaddr,
   3319			      dev->iram.size);
   3320	coda_free_aux_buf(dev, &dev->codebuf);
   3321	coda_free_aux_buf(dev, &dev->tempbuf);
   3322	coda_free_aux_buf(dev, &dev->workbuf);
   3323	debugfs_remove_recursive(dev->debugfs_root);
   3324	ida_destroy(&dev->ida);
   3325	return 0;
   3326}
   3327
   3328#ifdef CONFIG_PM
   3329static int coda_runtime_resume(struct device *dev)
   3330{
   3331	struct coda_dev *cdev = dev_get_drvdata(dev);
   3332	int ret = 0;
   3333
   3334	if (dev->pm_domain && cdev->codebuf.vaddr) {
   3335		ret = coda_hw_init(cdev);
   3336		if (ret)
   3337			v4l2_err(&cdev->v4l2_dev, "HW initialization failed\n");
   3338	}
   3339
   3340	return ret;
   3341}
   3342#endif
   3343
   3344static const struct dev_pm_ops coda_pm_ops = {
   3345	SET_RUNTIME_PM_OPS(NULL, coda_runtime_resume, NULL)
   3346};
   3347
   3348static struct platform_driver coda_driver = {
   3349	.probe	= coda_probe,
   3350	.remove	= coda_remove,
   3351	.driver	= {
   3352		.name	= CODA_NAME,
   3353		.of_match_table = coda_dt_ids,
   3354		.pm	= &coda_pm_ops,
   3355	},
   3356};
   3357
   3358module_platform_driver(coda_driver);
   3359
   3360MODULE_LICENSE("GPL");
   3361MODULE_AUTHOR("Javier Martin <javier.martin@vista-silicon.com>");
   3362MODULE_DESCRIPTION("Coda multi-standard codec V4L2 driver");