coda-common.c 66.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Coda multi-standard codec IP
 *
 * Copyright (C) 2012 Vista Silicon S.L.
 *    Javier Martin, <javier.martin@vista-silicon.com>
 *    Xavier Duret
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

#include <linux/clk.h>
15
#include <linux/debugfs.h>
16 17
#include <linux/delay.h>
#include <linux/firmware.h>
18
#include <linux/gcd.h>
P
Philipp Zabel 已提交
19
#include <linux/genalloc.h>
20 21 22
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
23
#include <linux/kfifo.h>
24 25 26
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
27
#include <linux/pm_runtime.h>
28 29 30
#include <linux/slab.h>
#include <linux/videodev2.h>
#include <linux/of.h>
31
#include <linux/platform_data/media/coda.h>
32
#include <linux/reset.h>
33 34 35

#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
36
#include <media/v4l2-event.h>
37 38
#include <media/v4l2-ioctl.h>
#include <media/v4l2-mem2mem.h>
39
#include <media/videobuf2-v4l2.h>
40
#include <media/videobuf2-dma-contig.h>
41
#include <media/videobuf2-vmalloc.h>
42

43
#include "coda.h"
44
#include "imx-vdoa.h"
45 46 47

#define CODA_NAME		"coda"

48
#define CODADX6_MAX_INSTANCES	4
49
#define CODA_MAX_FORMATS	4
50 51 52 53 54 55 56 57 58 59 60 61

#define CODA_ISRAM_SIZE	(2048 * 2)

#define MIN_W 176
#define MIN_H 144

#define S_ALIGN		1 /* multiple of 2 */
#define W_ALIGN		1 /* multiple of 2 */
#define H_ALIGN		1 /* multiple of 2 */

#define fh_to_ctx(__fh)	container_of(__fh, struct coda_ctx, fh)

62
int coda_debug;
63
module_param(coda_debug, int, 0644);
64
MODULE_PARM_DESC(coda_debug, "Debug level (0-2)");
65

66 67 68
static int disable_tiling;
module_param(disable_tiling, int, 0644);
MODULE_PARM_DESC(disable_tiling, "Disable tiled frame buffers");
69

70 71 72 73
static int disable_vdoa;
module_param(disable_vdoa, int, 0644);
MODULE_PARM_DESC(disable_vdoa, "Disable Video Data Order Adapter tiled to raster-scan conversion");

74 75 76 77
static int enable_bwb = 0;
module_param(enable_bwb, int, 0644);
MODULE_PARM_DESC(enable_bwb, "Enable BWB unit, may crash on certain streams");

78
void coda_write(struct coda_dev *dev, u32 data, u32 reg)
79
{
80
	v4l2_dbg(2, coda_debug, &dev->v4l2_dev,
81 82 83 84
		 "%s: data=0x%x, reg=0x%x\n", __func__, data, reg);
	writel(data, dev->regs_base + reg);
}

85
unsigned int coda_read(struct coda_dev *dev, u32 reg)
86 87
{
	u32 data;
P
Philipp Zabel 已提交
88

89
	data = readl(dev->regs_base + reg);
90
	v4l2_dbg(2, coda_debug, &dev->v4l2_dev,
91 92 93 94
		 "%s: data=0x%x, reg=0x%x\n", __func__, data, reg);
	return data;
}

95
void coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data,
96
		     struct vb2_v4l2_buffer *buf, unsigned int reg_y)
97
{
98
	u32 base_y = vb2_dma_contig_plane_dma_addr(&buf->vb2_buf, 0);
99 100 101
	u32 base_cb, base_cr;

	switch (q_data->fourcc) {
102 103
	case V4L2_PIX_FMT_YUYV:
		/* Fallthrough: IN -H264-> CODA -NV12 MB-> VDOA -YUYV-> OUT */
104
	case V4L2_PIX_FMT_NV12:
105
	case V4L2_PIX_FMT_YUV420:
106 107 108 109
	default:
		base_cb = base_y + q_data->bytesperline * q_data->height;
		base_cr = base_cb + q_data->bytesperline * q_data->height / 4;
		break;
110 111 112 113 114
	case V4L2_PIX_FMT_YVU420:
		/* Switch Cb and Cr for YVU420 format */
		base_cr = base_y + q_data->bytesperline * q_data->height;
		base_cb = base_cr + q_data->bytesperline * q_data->height / 4;
		break;
115 116 117
	case V4L2_PIX_FMT_YUV422P:
		base_cb = base_y + q_data->bytesperline * q_data->height;
		base_cr = base_cb + q_data->bytesperline * q_data->height / 2;
118 119 120 121 122 123 124
	}

	coda_write(ctx->dev, base_y, reg_y);
	coda_write(ctx->dev, base_cb, reg_y + 4);
	coda_write(ctx->dev, base_cr, reg_y + 8);
}

125 126 127 128 129 130 131 132 133 134
#define CODA_CODEC(mode, src_fourcc, dst_fourcc, max_w, max_h) \
	{ mode, src_fourcc, dst_fourcc, max_w, max_h }

/*
 * Arrays of codecs supported by each given version of Coda:
 *  i.MX27 -> codadx6
 *  i.MX5x -> coda7
 *  i.MX6  -> coda960
 * Use V4L2_PIX_FMT_YUV420 as placeholder for all supported YUV 4:2:0 variants
 */
135
static const struct coda_codec codadx6_codecs[] = {
136 137 138 139
	CODA_CODEC(CODADX6_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,  720, 576),
	CODA_CODEC(CODADX6_MODE_ENCODE_MP4,  V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4, 720, 576),
};

140
static const struct coda_codec coda7_codecs[] = {
141 142
	CODA_CODEC(CODA7_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,   1280, 720),
	CODA_CODEC(CODA7_MODE_ENCODE_MP4,  V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4,  1280, 720),
143
	CODA_CODEC(CODA7_MODE_ENCODE_MJPG, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_JPEG,   8192, 8192),
144
	CODA_CODEC(CODA7_MODE_DECODE_H264, V4L2_PIX_FMT_H264,   V4L2_PIX_FMT_YUV420, 1920, 1088),
145
	CODA_CODEC(CODA7_MODE_DECODE_MP2,  V4L2_PIX_FMT_MPEG2,  V4L2_PIX_FMT_YUV420, 1920, 1088),
146
	CODA_CODEC(CODA7_MODE_DECODE_MP4,  V4L2_PIX_FMT_MPEG4,  V4L2_PIX_FMT_YUV420, 1920, 1088),
147
	CODA_CODEC(CODA7_MODE_DECODE_MJPG, V4L2_PIX_FMT_JPEG,   V4L2_PIX_FMT_YUV420, 8192, 8192),
148 149
};

150
static const struct coda_codec coda9_codecs[] = {
151 152 153
	CODA_CODEC(CODA9_MODE_ENCODE_H264, V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_H264,   1920, 1088),
	CODA_CODEC(CODA9_MODE_ENCODE_MP4,  V4L2_PIX_FMT_YUV420, V4L2_PIX_FMT_MPEG4,  1920, 1088),
	CODA_CODEC(CODA9_MODE_DECODE_H264, V4L2_PIX_FMT_H264,   V4L2_PIX_FMT_YUV420, 1920, 1088),
154
	CODA_CODEC(CODA9_MODE_DECODE_MP2,  V4L2_PIX_FMT_MPEG2,  V4L2_PIX_FMT_YUV420, 1920, 1088),
155
	CODA_CODEC(CODA9_MODE_DECODE_MP4,  V4L2_PIX_FMT_MPEG4,  V4L2_PIX_FMT_YUV420, 1920, 1088),
156 157
};

158 159 160 161
struct coda_video_device {
	const char *name;
	enum coda_inst_type type;
	const struct coda_context_ops *ops;
162
	bool direct;
163 164 165 166 167 168 169 170 171
	u32 src_formats[CODA_MAX_FORMATS];
	u32 dst_formats[CODA_MAX_FORMATS];
};

static const struct coda_video_device coda_bit_encoder = {
	.name = "coda-encoder",
	.type = CODA_INST_ENCODER,
	.ops = &coda_bit_encode_ops,
	.src_formats = {
172
		V4L2_PIX_FMT_NV12,
173 174 175 176 177 178 179 180 181
		V4L2_PIX_FMT_YUV420,
		V4L2_PIX_FMT_YVU420,
	},
	.dst_formats = {
		V4L2_PIX_FMT_H264,
		V4L2_PIX_FMT_MPEG4,
	},
};

182 183 184 185 186
static const struct coda_video_device coda_bit_jpeg_encoder = {
	.name = "coda-jpeg-encoder",
	.type = CODA_INST_ENCODER,
	.ops = &coda_bit_encode_ops,
	.src_formats = {
187
		V4L2_PIX_FMT_NV12,
188 189 190 191 192 193 194 195 196
		V4L2_PIX_FMT_YUV420,
		V4L2_PIX_FMT_YVU420,
		V4L2_PIX_FMT_YUV422P,
	},
	.dst_formats = {
		V4L2_PIX_FMT_JPEG,
	},
};

197 198 199 200 201 202
static const struct coda_video_device coda_bit_decoder = {
	.name = "coda-decoder",
	.type = CODA_INST_DECODER,
	.ops = &coda_bit_decode_ops,
	.src_formats = {
		V4L2_PIX_FMT_H264,
203
		V4L2_PIX_FMT_MPEG2,
204 205 206
		V4L2_PIX_FMT_MPEG4,
	},
	.dst_formats = {
207
		V4L2_PIX_FMT_NV12,
208 209
		V4L2_PIX_FMT_YUV420,
		V4L2_PIX_FMT_YVU420,
210 211 212 213 214
		/*
		 * If V4L2_PIX_FMT_YUYV should be default,
		 * set_default_params() must be adjusted.
		 */
		V4L2_PIX_FMT_YUYV,
215 216 217
	},
};

218 219 220 221 222 223 224 225
static const struct coda_video_device coda_bit_jpeg_decoder = {
	.name = "coda-jpeg-decoder",
	.type = CODA_INST_DECODER,
	.ops = &coda_bit_decode_ops,
	.src_formats = {
		V4L2_PIX_FMT_JPEG,
	},
	.dst_formats = {
226
		V4L2_PIX_FMT_NV12,
227 228 229 230 231 232
		V4L2_PIX_FMT_YUV420,
		V4L2_PIX_FMT_YVU420,
		V4L2_PIX_FMT_YUV422P,
	},
};

233 234 235 236 237
static const struct coda_video_device *codadx6_video_devices[] = {
	&coda_bit_encoder,
};

static const struct coda_video_device *coda7_video_devices[] = {
238 239
	&coda_bit_jpeg_encoder,
	&coda_bit_jpeg_decoder,
240 241 242 243 244 245 246 247 248
	&coda_bit_encoder,
	&coda_bit_decoder,
};

static const struct coda_video_device *coda9_video_devices[] = {
	&coda_bit_encoder,
	&coda_bit_decoder,
};

249 250 251 252 253
/*
 * Normalize all supported YUV 4:2:0 formats to the value used in the codec
 * tables.
 */
static u32 coda_format_normalize_yuv(u32 fourcc)
254 255
{
	switch (fourcc) {
256
	case V4L2_PIX_FMT_NV12:
257 258
	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YVU420:
259
	case V4L2_PIX_FMT_YUV422P:
260
	case V4L2_PIX_FMT_YUYV:
261
		return V4L2_PIX_FMT_YUV420;
262
	default:
263
		return fourcc;
264
	}
265 266
}

267 268
static const struct coda_codec *coda_find_codec(struct coda_dev *dev,
						int src_fourcc, int dst_fourcc)
269
{
270
	const struct coda_codec *codecs = dev->devtype->codecs;
271 272 273 274 275 276 277
	int num_codecs = dev->devtype->num_codecs;
	int k;

	src_fourcc = coda_format_normalize_yuv(src_fourcc);
	dst_fourcc = coda_format_normalize_yuv(dst_fourcc);
	if (src_fourcc == dst_fourcc)
		return NULL;
278

279 280 281
	for (k = 0; k < num_codecs; k++) {
		if (codecs[k].src_fourcc == src_fourcc &&
		    codecs[k].dst_fourcc == dst_fourcc)
282 283 284
			break;
	}

285
	if (k == num_codecs)
286 287
		return NULL;

288
	return &codecs[k];
289 290
}

291
static void coda_get_max_dimensions(struct coda_dev *dev,
292
				    const struct coda_codec *codec,
293 294
				    int *max_w, int *max_h)
{
295
	const struct coda_codec *codecs = dev->devtype->codecs;
296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
	int num_codecs = dev->devtype->num_codecs;
	unsigned int w, h;
	int k;

	if (codec) {
		w = codec->max_w;
		h = codec->max_h;
	} else {
		for (k = 0, w = 0, h = 0; k < num_codecs; k++) {
			w = max(w, codecs[k].max_w);
			h = max(h, codecs[k].max_h);
		}
	}

	if (max_w)
		*max_w = w;
	if (max_h)
		*max_h = h;
}

316 317
static const struct coda_video_device *to_coda_video_device(struct video_device
							    *vdev)
318 319 320 321 322 323 324 325 326 327
{
	struct coda_dev *dev = video_get_drvdata(vdev);
	unsigned int i = vdev - dev->vfd;

	if (i >= dev->devtype->num_vdevs)
		return NULL;

	return dev->devtype->vdevs[i];
}

328
const char *coda_product_name(int product)
329 330 331 332 333 334 335 336
{
	static char buf[9];

	switch (product) {
	case CODA_DX6:
		return "CodaDx6";
	case CODA_7541:
		return "CODA7541";
337 338
	case CODA_960:
		return "CODA960";
339 340 341 342 343 344
	default:
		snprintf(buf, sizeof(buf), "(0x%04x)", product);
		return buf;
	}
}

345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
static struct vdoa_data *coda_get_vdoa_data(void)
{
	struct device_node *vdoa_node;
	struct platform_device *vdoa_pdev;
	struct vdoa_data *vdoa_data = NULL;

	vdoa_node = of_find_compatible_node(NULL, NULL, "fsl,imx6q-vdoa");
	if (!vdoa_node)
		return NULL;

	vdoa_pdev = of_find_device_by_node(vdoa_node);
	if (!vdoa_pdev)
		goto out;

	vdoa_data = platform_get_drvdata(vdoa_pdev);
	if (!vdoa_data)
		vdoa_data = ERR_PTR(-EPROBE_DEFER);

out:
	if (vdoa_node)
		of_node_put(vdoa_node);

	return vdoa_data;
}

370 371 372
/*
 * V4L2 ioctl() operations.
 */
373 374
static int coda_querycap(struct file *file, void *priv,
			 struct v4l2_capability *cap)
375
{
376 377
	struct coda_ctx *ctx = fh_to_ctx(priv);

378
	strlcpy(cap->driver, CODA_NAME, sizeof(cap->driver));
379 380
	strlcpy(cap->card, coda_product_name(ctx->dev->devtype->product),
		sizeof(cap->card));
381
	strlcpy(cap->bus_info, "platform:" CODA_NAME, sizeof(cap->bus_info));
382
	cap->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
383 384 385 386 387
	cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;

	return 0;
}

388 389
static int coda_enum_fmt(struct file *file, void *priv,
			 struct v4l2_fmtdesc *f)
390
{
391 392 393 394 395 396 397 398
	struct video_device *vdev = video_devdata(file);
	const struct coda_video_device *cvd = to_coda_video_device(vdev);
	const u32 *formats;

	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
		formats = cvd->src_formats;
	else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
		formats = cvd->dst_formats;
399
	else
400
		return -EINVAL;
401

402 403 404 405
	if (f->index >= CODA_MAX_FORMATS || formats[f->index] == 0)
		return -EINVAL;

	f->pixelformat = formats[f->index];
406

407
	return 0;
408 409
}

410 411
static int coda_g_fmt(struct file *file, void *priv,
		      struct v4l2_format *f)
412 413 414 415 416
{
	struct coda_q_data *q_data;
	struct coda_ctx *ctx = fh_to_ctx(priv);

	q_data = get_q_data(ctx, f->type);
417 418
	if (!q_data)
		return -EINVAL;
419 420

	f->fmt.pix.field	= V4L2_FIELD_NONE;
421
	f->fmt.pix.pixelformat	= q_data->fourcc;
422 423
	f->fmt.pix.width	= q_data->width;
	f->fmt.pix.height	= q_data->height;
424
	f->fmt.pix.bytesperline = q_data->bytesperline;
425 426

	f->fmt.pix.sizeimage	= q_data->sizeimage;
427 428 429 430
	if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG)
		f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
	else
		f->fmt.pix.colorspace = ctx->colorspace;
431 432 433 434

	return 0;
}

435 436 437 438 439 440 441 442 443 444 445 446 447 448
static int coda_try_pixelformat(struct coda_ctx *ctx, struct v4l2_format *f)
{
	struct coda_q_data *q_data;
	const u32 *formats;
	int i;

	if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
		formats = ctx->cvd->src_formats;
	else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
		formats = ctx->cvd->dst_formats;
	else
		return -EINVAL;

	for (i = 0; i < CODA_MAX_FORMATS; i++) {
449 450 451 452 453
		/* Skip YUYV if the vdoa is not available */
		if (!ctx->vdoa && f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE &&
		    formats[i] == V4L2_PIX_FMT_YUYV)
			continue;

454 455 456 457 458 459 460 461 462
		if (formats[i] == f->fmt.pix.pixelformat) {
			f->fmt.pix.pixelformat = formats[i];
			return 0;
		}
	}

	/* Fall back to currently set pixelformat */
	q_data = get_q_data(ctx, f->type);
	f->fmt.pix.pixelformat = q_data->fourcc;
463 464 465 466

	return 0;
}

467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493
static int coda_try_fmt_vdoa(struct coda_ctx *ctx, struct v4l2_format *f,
			     bool *use_vdoa)
{
	int err;

	if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
		return -EINVAL;

	if (!use_vdoa)
		return -EINVAL;

	if (!ctx->vdoa) {
		*use_vdoa = false;
		return 0;
	}

	err = vdoa_context_configure(NULL, f->fmt.pix.width, f->fmt.pix.height,
				     f->fmt.pix.pixelformat);
	if (err) {
		*use_vdoa = false;
		return 0;
	}

	*use_vdoa = true;
	return 0;
}

494 495 496 497 498 499 500 501 502 503 504 505
static unsigned int coda_estimate_sizeimage(struct coda_ctx *ctx, u32 sizeimage,
					    u32 width, u32 height)
{
	/*
	 * This is a rough estimate for sensible compressed buffer
	 * sizes (between 1 and 16 bits per pixel). This could be
	 * improved by better format specific worst case estimates.
	 */
	return round_up(clamp(sizeimage, width * height / 8,
					 width * height * 2), PAGE_SIZE);
}

506
static int coda_try_fmt(struct coda_ctx *ctx, const struct coda_codec *codec,
507
			struct v4l2_format *f)
508
{
509
	struct coda_dev *dev = ctx->dev;
510
	unsigned int max_w, max_h;
511 512 513 514 515 516 517 518 519 520 521 522
	enum v4l2_field field;

	field = f->fmt.pix.field;
	if (field == V4L2_FIELD_ANY)
		field = V4L2_FIELD_NONE;
	else if (V4L2_FIELD_NONE != field)
		return -EINVAL;

	/* V4L2 specification suggests the driver corrects the format struct
	 * if any of the dimensions is unsupported */
	f->fmt.pix.field = field;

523 524 525 526 527 528
	coda_get_max_dimensions(dev, codec, &max_w, &max_h);
	v4l_bound_align_image(&f->fmt.pix.width, MIN_W, max_w, W_ALIGN,
			      &f->fmt.pix.height, MIN_H, max_h, H_ALIGN,
			      S_ALIGN);

	switch (f->fmt.pix.pixelformat) {
529
	case V4L2_PIX_FMT_NV12:
530 531
	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YVU420:
532 533 534 535
		/*
		 * Frame stride must be at least multiple of 8,
		 * but multiple of 16 for h.264 or JPEG 4:2:x
		 */
536
		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
537
		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
538
					f->fmt.pix.height * 3 / 2;
539
		break;
540 541 542 543 544
	case V4L2_PIX_FMT_YUYV:
		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
					f->fmt.pix.height;
		break;
545 546 547 548 549
	case V4L2_PIX_FMT_YUV422P:
		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
					f->fmt.pix.height * 2;
		break;
550 551 552
	case V4L2_PIX_FMT_JPEG:
		f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
		/* fallthrough */
553 554
	case V4L2_PIX_FMT_H264:
	case V4L2_PIX_FMT_MPEG4:
555
	case V4L2_PIX_FMT_MPEG2:
556
		f->fmt.pix.bytesperline = 0;
557 558 559 560
		f->fmt.pix.sizeimage = coda_estimate_sizeimage(ctx,
							f->fmt.pix.sizeimage,
							f->fmt.pix.width,
							f->fmt.pix.height);
561 562 563
		break;
	default:
		BUG();
564 565 566 567 568
	}

	return 0;
}

569 570
static int coda_try_fmt_vid_cap(struct file *file, void *priv,
				struct v4l2_format *f)
571 572
{
	struct coda_ctx *ctx = fh_to_ctx(priv);
573 574
	const struct coda_q_data *q_data_src;
	const struct coda_codec *codec;
575 576
	struct vb2_queue *src_vq;
	int ret;
577
	bool use_vdoa;
578

579 580 581 582 583 584
	ret = coda_try_pixelformat(ctx, f);
	if (ret < 0)
		return ret;

	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);

585
	/*
586 587
	 * If the source format is already fixed, only allow the same output
	 * resolution
588
	 */
589
	src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
590
	if (vb2_is_streaming(src_vq)) {
591 592
		f->fmt.pix.width = q_data_src->width;
		f->fmt.pix.height = q_data_src->height;
593
	}
594 595 596

	f->fmt.pix.colorspace = ctx->colorspace;

597 598 599 600 601 602
	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
	codec = coda_find_codec(ctx->dev, q_data_src->fourcc,
				f->fmt.pix.pixelformat);
	if (!codec)
		return -EINVAL;

603
	ret = coda_try_fmt(ctx, codec, f);
604 605 606 607 608
	if (ret < 0)
		return ret;

	/* The h.264 decoder only returns complete 16x16 macroblocks */
	if (codec && codec->src_fourcc == V4L2_PIX_FMT_H264) {
609
		f->fmt.pix.width = f->fmt.pix.width;
610
		f->fmt.pix.height = round_up(f->fmt.pix.height, 16);
611
		f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16);
612 613
		f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
				       f->fmt.pix.height * 3 / 2;
614 615 616 617

		ret = coda_try_fmt_vdoa(ctx, f, &use_vdoa);
		if (ret < 0)
			return ret;
618 619 620 621 622 623 624 625 626

		if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV) {
			if (!use_vdoa)
				return -EINVAL;

			f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 16) * 2;
			f->fmt.pix.sizeimage = f->fmt.pix.bytesperline *
				f->fmt.pix.height;
		}
627 628 629
	}

	return 0;
630 631
}

632 633
static int coda_try_fmt_vid_out(struct file *file, void *priv,
				struct v4l2_format *f)
634 635
{
	struct coda_ctx *ctx = fh_to_ctx(priv);
636 637 638 639
	struct coda_dev *dev = ctx->dev;
	const struct coda_q_data *q_data_dst;
	const struct coda_codec *codec;
	int ret;
640

641 642 643
	ret = coda_try_pixelformat(ctx, f);
	if (ret < 0)
		return ret;
644

645 646 647 648 649
	switch (f->fmt.pix.colorspace) {
	case V4L2_COLORSPACE_REC709:
	case V4L2_COLORSPACE_JPEG:
		break;
	default:
650 651 652 653
		if (f->fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG)
			f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
		else
			f->fmt.pix.colorspace = V4L2_COLORSPACE_REC709;
654
	}
655

656 657
	q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
	codec = coda_find_codec(dev, f->fmt.pix.pixelformat, q_data_dst->fourcc);
658

659
	return coda_try_fmt(ctx, codec, f);
660 661
}

662 663
static int coda_s_fmt(struct coda_ctx *ctx, struct v4l2_format *f,
		      struct v4l2_rect *r)
664 665 666 667
{
	struct coda_q_data *q_data;
	struct vb2_queue *vq;

668
	vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
669 670 671 672 673 674 675 676 677 678 679 680
	if (!vq)
		return -EINVAL;

	q_data = get_q_data(ctx, f->type);
	if (!q_data)
		return -EINVAL;

	if (vb2_is_busy(vq)) {
		v4l2_err(&ctx->dev->v4l2_dev, "%s queue busy\n", __func__);
		return -EBUSY;
	}

681
	q_data->fourcc = f->fmt.pix.pixelformat;
682 683
	q_data->width = f->fmt.pix.width;
	q_data->height = f->fmt.pix.height;
684
	q_data->bytesperline = f->fmt.pix.bytesperline;
685
	q_data->sizeimage = f->fmt.pix.sizeimage;
686 687 688 689 690 691 692 693
	if (r) {
		q_data->rect = *r;
	} else {
		q_data->rect.left = 0;
		q_data->rect.top = 0;
		q_data->rect.width = f->fmt.pix.width;
		q_data->rect.height = f->fmt.pix.height;
	}
694

695
	switch (f->fmt.pix.pixelformat) {
696 697 698
	case V4L2_PIX_FMT_YUYV:
		ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
		break;
699
	case V4L2_PIX_FMT_NV12:
700 701 702
		ctx->tiled_map_type = GDI_TILED_FRAME_MB_RASTER_MAP;
		if (!disable_tiling)
			break;
703 704 705 706 707 708 709 710 711
		/* else fall through */
	case V4L2_PIX_FMT_YUV420:
	case V4L2_PIX_FMT_YVU420:
		ctx->tiled_map_type = GDI_LINEAR_FRAME_MAP;
		break;
	default:
		break;
	}

712 713 714 715 716 717 718 719 720
	if (ctx->tiled_map_type == GDI_TILED_FRAME_MB_RASTER_MAP &&
	    !coda_try_fmt_vdoa(ctx, f, &ctx->use_vdoa) &&
	    ctx->use_vdoa)
		vdoa_context_configure(ctx->vdoa, f->fmt.pix.width,
				       f->fmt.pix.height,
				       f->fmt.pix.pixelformat);
	else
		ctx->use_vdoa = false;

721
	v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
722 723 724 725
		"Setting format for type %d, wxh: %dx%d, fmt: %4.4s %c\n",
		f->type, q_data->width, q_data->height,
		(char *)&q_data->fourcc,
		(ctx->tiled_map_type == GDI_LINEAR_FRAME_MAP) ? 'L' : 'T');
726 727 728 729

	return 0;
}

730 731
static int coda_s_fmt_vid_cap(struct file *file, void *priv,
			      struct v4l2_format *f)
732
{
733
	struct coda_ctx *ctx = fh_to_ctx(priv);
734 735
	struct coda_q_data *q_data_src;
	struct v4l2_rect r;
736 737
	int ret;

738
	ret = coda_try_fmt_vid_cap(file, priv, f);
739 740 741
	if (ret)
		return ret;

742 743 744 745 746 747 748
	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
	r.left = 0;
	r.top = 0;
	r.width = q_data_src->width;
	r.height = q_data_src->height;

	return coda_s_fmt(ctx, f, &r);
749 750
}

751 752
static int coda_s_fmt_vid_out(struct file *file, void *priv,
			      struct v4l2_format *f)
753 754
{
	struct coda_ctx *ctx = fh_to_ctx(priv);
755
	struct coda_q_data *q_data_src;
756
	struct v4l2_format f_cap;
757
	struct v4l2_rect r;
758 759
	int ret;

760
	ret = coda_try_fmt_vid_out(file, priv, f);
761 762 763
	if (ret)
		return ret;

764
	ret = coda_s_fmt(ctx, f, NULL);
765
	if (ret)
766 767 768
		return ret;

	ctx->colorspace = f->fmt.pix.colorspace;
769

770
	memset(&f_cap, 0, sizeof(f_cap));
771 772 773 774 775 776 777 778 779
	f_cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	coda_g_fmt(file, priv, &f_cap);
	f_cap.fmt.pix.width = f->fmt.pix.width;
	f_cap.fmt.pix.height = f->fmt.pix.height;

	ret = coda_try_fmt_vid_cap(file, priv, &f_cap);
	if (ret)
		return ret;

780 781 782 783 784 785 786
	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
	r.left = 0;
	r.top = 0;
	r.width = q_data_src->width;
	r.height = q_data_src->height;

	return coda_s_fmt(ctx, &f_cap, &r);
787 788
}

789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
static int coda_reqbufs(struct file *file, void *priv,
			struct v4l2_requestbuffers *rb)
{
	struct coda_ctx *ctx = fh_to_ctx(priv);
	int ret;

	ret = v4l2_m2m_reqbufs(file, ctx->fh.m2m_ctx, rb);
	if (ret)
		return ret;

	/*
	 * Allow to allocate instance specific per-context buffers, such as
	 * bitstream ringbuffer, slice buffer, work buffer, etc. if needed.
	 */
	if (rb->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && ctx->ops->reqbufs)
		return ctx->ops->reqbufs(ctx, rb);

	return 0;
}

809 810
static int coda_qbuf(struct file *file, void *priv,
		     struct v4l2_buffer *buf)
811 812 813
{
	struct coda_ctx *ctx = fh_to_ctx(priv);

814
	return v4l2_m2m_qbuf(file, ctx->fh.m2m_ctx, buf);
815 816
}

817
static bool coda_buf_is_end_of_stream(struct coda_ctx *ctx,
818
				      struct vb2_v4l2_buffer *buf)
819 820 821
{
	struct vb2_queue *src_vq;

822
	src_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
823 824

	return ((ctx->bit_stream_param & CODA_BIT_STREAM_END_FLAG) &&
825
		(buf->sequence == (ctx->qsequence - 1)));
826 827
}

828
void coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf,
829
		       enum vb2_buffer_state state)
830
{
831 832 833
	const struct v4l2_event eos_event = {
		.type = V4L2_EVENT_EOS
	};
834

835
	if (coda_buf_is_end_of_stream(ctx, buf)) {
836
		buf->flags |= V4L2_BUF_FLAG_LAST;
837 838 839 840

		v4l2_event_queue_fh(&ctx->fh, &eos_event);
	}

841
	v4l2_m2m_buf_done(buf, state);
842 843
}

844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887
static int coda_g_selection(struct file *file, void *fh,
			    struct v4l2_selection *s)
{
	struct coda_ctx *ctx = fh_to_ctx(fh);
	struct coda_q_data *q_data;
	struct v4l2_rect r, *rsel;

	q_data = get_q_data(ctx, s->type);
	if (!q_data)
		return -EINVAL;

	r.left = 0;
	r.top = 0;
	r.width = q_data->width;
	r.height = q_data->height;
	rsel = &q_data->rect;

	switch (s->target) {
	case V4L2_SEL_TGT_CROP_DEFAULT:
	case V4L2_SEL_TGT_CROP_BOUNDS:
		rsel = &r;
		/* fallthrough */
	case V4L2_SEL_TGT_CROP:
		if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
			return -EINVAL;
		break;
	case V4L2_SEL_TGT_COMPOSE_BOUNDS:
	case V4L2_SEL_TGT_COMPOSE_PADDED:
		rsel = &r;
		/* fallthrough */
	case V4L2_SEL_TGT_COMPOSE:
	case V4L2_SEL_TGT_COMPOSE_DEFAULT:
		if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
			return -EINVAL;
		break;
	default:
		return -EINVAL;
	}

	s->r = *rsel;

	return 0;
}

888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928
static int coda_try_encoder_cmd(struct file *file, void *fh,
				struct v4l2_encoder_cmd *ec)
{
	if (ec->cmd != V4L2_ENC_CMD_STOP)
		return -EINVAL;

	if (ec->flags & V4L2_ENC_CMD_STOP_AT_GOP_END)
		return -EINVAL;

	return 0;
}

static int coda_encoder_cmd(struct file *file, void *fh,
			    struct v4l2_encoder_cmd *ec)
{
	struct coda_ctx *ctx = fh_to_ctx(fh);
	struct vb2_queue *dst_vq;
	int ret;

	ret = coda_try_encoder_cmd(file, fh, ec);
	if (ret < 0)
		return ret;

	/* Ignore encoder stop command silently in decoder context */
	if (ctx->inst_type != CODA_INST_ENCODER)
		return 0;

	/* Set the stream-end flag on this context */
	ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG;

	/* If there is no buffer in flight, wake up */
	if (ctx->qsequence == ctx->osequence) {
		dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
					 V4L2_BUF_TYPE_VIDEO_CAPTURE);
		dst_vq->last_buffer_dequeued = true;
		wake_up(&dst_vq->done_wq);
	}

	return 0;
}

929 930
static int coda_try_decoder_cmd(struct file *file, void *fh,
				struct v4l2_decoder_cmd *dc)
931 932 933 934
{
	if (dc->cmd != V4L2_DEC_CMD_STOP)
		return -EINVAL;

935
	if (dc->flags & V4L2_DEC_CMD_STOP_TO_BLACK)
936 937
		return -EINVAL;

938
	if (!(dc->flags & V4L2_DEC_CMD_STOP_IMMEDIATELY) && (dc->stop.pts != 0))
939 940
		return -EINVAL;

941 942 943 944 945 946 947 948 949 950 951 952 953 954
	return 0;
}

static int coda_decoder_cmd(struct file *file, void *fh,
			    struct v4l2_decoder_cmd *dc)
{
	struct coda_ctx *ctx = fh_to_ctx(fh);
	int ret;

	ret = coda_try_decoder_cmd(file, fh, dc);
	if (ret < 0)
		return ret;

	/* Ignore decoder stop command silently in encoder context */
955
	if (ctx->inst_type != CODA_INST_DECODER)
956
		return 0;
957

958 959
	/* Set the stream-end flag on this context */
	coda_bit_stream_end_flag(ctx);
960
	ctx->hold = false;
961
	v4l2_m2m_try_schedule(ctx->fh.m2m_ctx);
962

963 964 965
	return 0;
}

966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
static int coda_g_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
{
	struct coda_ctx *ctx = fh_to_ctx(fh);
	struct v4l2_fract *tpf;

	if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
		return -EINVAL;

	a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
	tpf = &a->parm.output.timeperframe;
	tpf->denominator = ctx->params.framerate & CODA_FRATE_RES_MASK;
	tpf->numerator = 1 + (ctx->params.framerate >>
			      CODA_FRATE_DIV_OFFSET);

	return 0;
}

/*
 * Approximate timeperframe v4l2_fract with values that can be written
 * into the 16-bit CODA_FRATE_DIV and CODA_FRATE_RES fields.
 */
static void coda_approximate_timeperframe(struct v4l2_fract *timeperframe)
{
	struct v4l2_fract s = *timeperframe;
	struct v4l2_fract f0;
	struct v4l2_fract f1 = { 1, 0 };
	struct v4l2_fract f2 = { 0, 1 };
	unsigned int i, div, s_denominator;

	/* Lower bound is 1/65535 */
	if (s.numerator == 0 || s.denominator / s.numerator > 65535) {
		timeperframe->numerator = 1;
		timeperframe->denominator = 65535;
		return;
	}

	/* Upper bound is 65536/1, map everything above to infinity */
	if (s.denominator == 0 || s.numerator / s.denominator > 65536) {
		timeperframe->numerator = 1;
		timeperframe->denominator = 0;
		return;
	}

	/* Reduce fraction to lowest terms */
	div = gcd(s.numerator, s.denominator);
	if (div > 1) {
		s.numerator /= div;
		s.denominator /= div;
	}

	if (s.numerator <= 65536 && s.denominator < 65536) {
		*timeperframe = s;
		return;
	}

	/* Find successive convergents from continued fraction expansion */
	while (f2.numerator <= 65536 && f2.denominator < 65536) {
		f0 = f1;
		f1 = f2;

		/* Stop when f2 exactly equals timeperframe */
		if (s.numerator == 0)
			break;

		i = s.denominator / s.numerator;

		f2.numerator = f0.numerator + i * f1.numerator;
		f2.denominator = f0.denominator + i * f2.denominator;

		s_denominator = s.numerator;
		s.numerator = s.denominator % s.numerator;
		s.denominator = s_denominator;
	}

	*timeperframe = f1;
}

static uint32_t coda_timeperframe_to_frate(struct v4l2_fract *timeperframe)
{
	return ((timeperframe->numerator - 1) << CODA_FRATE_DIV_OFFSET) |
		timeperframe->denominator;
}

static int coda_s_parm(struct file *file, void *fh, struct v4l2_streamparm *a)
{
	struct coda_ctx *ctx = fh_to_ctx(fh);
	struct v4l2_fract *tpf;

	if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
		return -EINVAL;

	tpf = &a->parm.output.timeperframe;
	coda_approximate_timeperframe(tpf);
	ctx->params.framerate = coda_timeperframe_to_frate(tpf);

	return 0;
}

1064 1065
static int coda_subscribe_event(struct v4l2_fh *fh,
				const struct v4l2_event_subscription *sub)
1066 1067 1068 1069 1070 1071 1072
{
	switch (sub->type) {
	case V4L2_EVENT_EOS:
		return v4l2_event_subscribe(fh, sub, 0, NULL);
	default:
		return v4l2_ctrl_subscribe_event(fh, sub);
	}
1073 1074 1075
}

static const struct v4l2_ioctl_ops coda_ioctl_ops = {
1076
	.vidioc_querycap	= coda_querycap,
1077

1078
	.vidioc_enum_fmt_vid_cap = coda_enum_fmt,
1079 1080 1081
	.vidioc_g_fmt_vid_cap	= coda_g_fmt,
	.vidioc_try_fmt_vid_cap	= coda_try_fmt_vid_cap,
	.vidioc_s_fmt_vid_cap	= coda_s_fmt_vid_cap,
1082

1083
	.vidioc_enum_fmt_vid_out = coda_enum_fmt,
1084 1085 1086
	.vidioc_g_fmt_vid_out	= coda_g_fmt,
	.vidioc_try_fmt_vid_out	= coda_try_fmt_vid_out,
	.vidioc_s_fmt_vid_out	= coda_s_fmt_vid_out,
1087

1088
	.vidioc_reqbufs		= coda_reqbufs,
1089
	.vidioc_querybuf	= v4l2_m2m_ioctl_querybuf,
1090

1091
	.vidioc_qbuf		= coda_qbuf,
1092
	.vidioc_expbuf		= v4l2_m2m_ioctl_expbuf,
1093
	.vidioc_dqbuf		= v4l2_m2m_ioctl_dqbuf,
1094
	.vidioc_create_bufs	= v4l2_m2m_ioctl_create_bufs,
1095
	.vidioc_prepare_buf	= v4l2_m2m_ioctl_prepare_buf,
1096

1097 1098
	.vidioc_streamon	= v4l2_m2m_ioctl_streamon,
	.vidioc_streamoff	= v4l2_m2m_ioctl_streamoff,
1099

1100 1101
	.vidioc_g_selection	= coda_g_selection,

1102 1103
	.vidioc_try_encoder_cmd	= coda_try_encoder_cmd,
	.vidioc_encoder_cmd	= coda_encoder_cmd,
1104
	.vidioc_try_decoder_cmd	= coda_try_decoder_cmd,
1105
	.vidioc_decoder_cmd	= coda_decoder_cmd,
1106

1107 1108 1109
	.vidioc_g_parm		= coda_g_parm,
	.vidioc_s_parm		= coda_s_parm,

1110
	.vidioc_subscribe_event = coda_subscribe_event,
1111
	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1112 1113 1114 1115 1116
};

/*
 * Mem-to-mem operations.
 */
1117 1118 1119 1120 1121

static void coda_device_run(void *m2m_priv)
{
	struct coda_ctx *ctx = m2m_priv;
	struct coda_dev *dev = ctx->dev;
1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132

	queue_work(dev->workqueue, &ctx->pic_run_work);
}

static void coda_pic_run_work(struct work_struct *work)
{
	struct coda_ctx *ctx = container_of(work, struct coda_ctx, pic_run_work);
	struct coda_dev *dev = ctx->dev;
	int ret;

	mutex_lock(&ctx->buffer_mutex);
1133 1134
	mutex_lock(&dev->coda_mutex);

P
Philipp Zabel 已提交
1135 1136 1137 1138 1139 1140
	ret = ctx->ops->prepare_run(ctx);
	if (ret < 0 && ctx->inst_type == CODA_INST_DECODER) {
		mutex_unlock(&dev->coda_mutex);
		mutex_unlock(&ctx->buffer_mutex);
		/* job_finish scheduled by prepare_decode */
		return;
1141 1142
	}

P
Philipp Zabel 已提交
1143 1144
	if (!wait_for_completion_timeout(&ctx->completion,
					 msecs_to_jiffies(1000))) {
1145
		dev_err(&dev->plat_dev->dev, "CODA PIC_RUN timeout\n");
1146 1147

		ctx->hold = true;
1148 1149

		coda_hw_reset(ctx);
1150
	} else if (!ctx->aborting) {
P
Philipp Zabel 已提交
1151
		ctx->ops->finish_run(ctx);
1152 1153
	}

1154 1155
	if ((ctx->aborting || (!ctx->streamon_cap && !ctx->streamon_out)) &&
	    ctx->ops->seq_end_work)
1156 1157 1158 1159 1160
		queue_work(dev->workqueue, &ctx->seq_end_work);

	mutex_unlock(&dev->coda_mutex);
	mutex_unlock(&ctx->buffer_mutex);

1161
	v4l2_m2m_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx);
1162 1163 1164 1165 1166
}

static int coda_job_ready(void *m2m_priv)
{
	struct coda_ctx *ctx = m2m_priv;
1167
	int src_bufs = v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx);
1168 1169 1170

	/*
	 * For both 'P' and 'key' frame cases 1 picture
1171 1172
	 * and 1 frame are needed. In the decoder case,
	 * the compressed frame can be in the bitstream.
1173
	 */
1174
	if (!src_bufs && ctx->inst_type != CODA_INST_DECODER) {
1175 1176 1177 1178 1179
		v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
			 "not ready: not enough video buffers.\n");
		return 0;
	}

1180
	if (!v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx)) {
1181 1182 1183 1184 1185
		v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
			 "not ready: not enough video capture buffers.\n");
		return 0;
	}

1186
	if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit) {
1187 1188 1189
		bool stream_end = ctx->bit_stream_param &
				  CODA_BIT_STREAM_END_FLAG;
		int num_metas = ctx->num_metas;
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
		unsigned int count;

		count = hweight32(ctx->frm_dis_flg);
		if (ctx->use_vdoa && count >= (ctx->num_internal_frames - 1)) {
			v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
				 "%d: not ready: all internal buffers in use: %d/%d (0x%x)",
				 ctx->idx, count, ctx->num_internal_frames,
				 ctx->frm_dis_flg);
			return 0;
		}
1200

1201
		if (ctx->hold && !src_bufs) {
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215
			v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
				 "%d: not ready: on hold for more buffers.\n",
				 ctx->idx);
			return 0;
		}

		if (!stream_end && (num_metas + src_bufs) < 2) {
			v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
				 "%d: not ready: need 2 buffers available (%d, %d)\n",
				 ctx->idx, num_metas, src_bufs);
			return 0;
		}


1216 1217
		if (!src_bufs && !stream_end &&
		    (coda_get_bitstream_payload(ctx) < 512)) {
1218 1219 1220 1221 1222
			v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
				 "%d: not ready: not enough bitstream data (%d).\n",
				 ctx->idx, coda_get_bitstream_payload(ctx));
			return 0;
		}
1223 1224
	}

1225 1226 1227 1228 1229 1230
	if (ctx->aborting) {
		v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
			 "not ready: aborting\n");
		return 0;
	}

1231 1232
	v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
			"job ready\n");
1233

1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250
	return 1;
}

static void coda_job_abort(void *priv)
{
	struct coda_ctx *ctx = priv;

	ctx->aborting = 1;

	v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
		 "Aborting task\n");
}

static void coda_lock(void *m2m_priv)
{
	struct coda_ctx *ctx = m2m_priv;
	struct coda_dev *pcdev = ctx->dev;
P
Philipp Zabel 已提交
1251

1252 1253 1254 1255 1256 1257 1258
	mutex_lock(&pcdev->dev_mutex);
}

static void coda_unlock(void *m2m_priv)
{
	struct coda_ctx *ctx = m2m_priv;
	struct coda_dev *pcdev = ctx->dev;
P
Philipp Zabel 已提交
1259

1260 1261 1262
	mutex_unlock(&pcdev->dev_mutex);
}

1263
static const struct v4l2_m2m_ops coda_m2m_ops = {
1264 1265 1266 1267 1268 1269 1270 1271 1272
	.device_run	= coda_device_run,
	.job_ready	= coda_job_ready,
	.job_abort	= coda_job_abort,
	.lock		= coda_lock,
	.unlock		= coda_unlock,
};

static void set_default_params(struct coda_ctx *ctx)
{
1273
	unsigned int max_w, max_h, usize, csize;
1274

1275 1276
	ctx->codec = coda_find_codec(ctx->dev, ctx->cvd->src_formats[0],
				     ctx->cvd->dst_formats[0]);
1277 1278
	max_w = min(ctx->codec->max_w, 1920U);
	max_h = min(ctx->codec->max_h, 1088U);
1279 1280
	usize = max_w * max_h * 3 / 2;
	csize = coda_estimate_sizeimage(ctx, usize, max_w, max_h);
1281

1282
	ctx->params.codec_mode = ctx->codec->mode;
1283 1284 1285 1286
	ctx->colorspace = V4L2_COLORSPACE_REC709;
	ctx->params.framerate = 30;

	/* Default formats for output and input queues */
1287 1288
	ctx->q_data[V4L2_M2M_SRC].fourcc = ctx->cvd->src_formats[0];
	ctx->q_data[V4L2_M2M_DST].fourcc = ctx->cvd->dst_formats[0];
1289 1290 1291 1292
	ctx->q_data[V4L2_M2M_SRC].width = max_w;
	ctx->q_data[V4L2_M2M_SRC].height = max_h;
	ctx->q_data[V4L2_M2M_DST].width = max_w;
	ctx->q_data[V4L2_M2M_DST].height = max_h;
1293 1294
	if (ctx->codec->src_fourcc == V4L2_PIX_FMT_YUV420) {
		ctx->q_data[V4L2_M2M_SRC].bytesperline = max_w;
1295
		ctx->q_data[V4L2_M2M_SRC].sizeimage = usize;
1296
		ctx->q_data[V4L2_M2M_DST].bytesperline = 0;
1297
		ctx->q_data[V4L2_M2M_DST].sizeimage = csize;
1298 1299
	} else {
		ctx->q_data[V4L2_M2M_SRC].bytesperline = 0;
1300
		ctx->q_data[V4L2_M2M_SRC].sizeimage = csize;
1301
		ctx->q_data[V4L2_M2M_DST].bytesperline = max_w;
1302
		ctx->q_data[V4L2_M2M_DST].sizeimage = usize;
1303
	}
1304 1305 1306 1307
	ctx->q_data[V4L2_M2M_SRC].rect.width = max_w;
	ctx->q_data[V4L2_M2M_SRC].rect.height = max_h;
	ctx->q_data[V4L2_M2M_DST].rect.width = max_w;
	ctx->q_data[V4L2_M2M_DST].rect.height = max_h;
1308

1309 1310 1311 1312 1313
	/*
	 * Since the RBC2AXI logic only supports a single chroma plane,
	 * macroblock tiling only works for to NV12 pixel format.
	 */
	ctx->tiled_map_type = GDI_LINEAR_FRAME_MAP;
1314 1315 1316 1317 1318
}

/*
 * Queue operations
 */
1319
static int coda_queue_setup(struct vb2_queue *vq,
1320
				unsigned int *nbuffers, unsigned int *nplanes,
1321
				unsigned int sizes[], struct device *alloc_devs[])
1322 1323
{
	struct coda_ctx *ctx = vb2_get_drv_priv(vq);
1324
	struct coda_q_data *q_data;
1325 1326
	unsigned int size;

1327 1328
	q_data = get_q_data(ctx, vq->type);
	size = q_data->sizeimage;
1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358

	*nplanes = 1;
	sizes[0] = size;

	v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
		 "get %d buffer(s) of size %d each.\n", *nbuffers, size);

	return 0;
}

static int coda_buf_prepare(struct vb2_buffer *vb)
{
	struct coda_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
	struct coda_q_data *q_data;

	q_data = get_q_data(ctx, vb->vb2_queue->type);

	if (vb2_plane_size(vb, 0) < q_data->sizeimage) {
		v4l2_warn(&ctx->dev->v4l2_dev,
			  "%s data will not fit into plane (%lu < %lu)\n",
			  __func__, vb2_plane_size(vb, 0),
			  (long)q_data->sizeimage);
		return -EINVAL;
	}

	return 0;
}

static void coda_buf_queue(struct vb2_buffer *vb)
{
1359
	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1360
	struct coda_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
1361
	struct vb2_queue *vq = vb->vb2_queue;
1362 1363 1364 1365 1366 1367 1368 1369
	struct coda_q_data *q_data;

	q_data = get_q_data(ctx, vb->vb2_queue->type);

	/*
	 * In the decoder case, immediately try to copy the buffer into the
	 * bitstream ringbuffer and mark it as ready to be dequeued.
	 */
1370
	if (ctx->bitstream.size && vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
1371
		/*
1372
		 * For backwards compatibility, queuing an empty buffer marks
1373 1374
		 * the stream end
		 */
1375 1376
		if (vb2_get_plane_payload(vb, 0) == 0)
			coda_bit_stream_end_flag(ctx);
1377
		mutex_lock(&ctx->bitstream_mutex);
1378
		v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1379
		if (vb2_is_streaming(vb->vb2_queue))
1380
			/* This set buf->sequence = ctx->qsequence++ */
1381
			coda_fill_bitstream(ctx, true);
1382 1383
		mutex_unlock(&ctx->bitstream_mutex);
	} else {
1384 1385 1386
		if (ctx->inst_type == CODA_INST_ENCODER &&
		    vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
			vbuf->sequence = ctx->qsequence++;
1387
		v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
1388
	}
1389 1390
}

1391 1392
int coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf,
		       size_t size, const char *name, struct dentry *parent)
1393 1394 1395
{
	buf->vaddr = dma_alloc_coherent(&dev->plat_dev->dev, size, &buf->paddr,
					GFP_KERNEL);
1396 1397 1398 1399
	if (!buf->vaddr) {
		v4l2_err(&dev->v4l2_dev,
			 "Failed to allocate %s buffer of size %u\n",
			 name, size);
1400
		return -ENOMEM;
1401
	}
1402 1403 1404

	buf->size = size;

1405 1406 1407
	if (name && parent) {
		buf->blob.data = buf->vaddr;
		buf->blob.size = size;
P
Philipp Zabel 已提交
1408 1409
		buf->dentry = debugfs_create_blob(name, 0644, parent,
						  &buf->blob);
1410 1411 1412 1413 1414
		if (!buf->dentry)
			dev_warn(&dev->plat_dev->dev,
				 "failed to create debugfs entry %s\n", name);
	}

1415 1416 1417
	return 0;
}

1418 1419
void coda_free_aux_buf(struct coda_dev *dev,
		       struct coda_aux_buf *buf)
1420 1421 1422 1423 1424 1425
{
	if (buf->vaddr) {
		dma_free_coherent(&dev->plat_dev->dev, buf->size,
				  buf->vaddr, buf->paddr);
		buf->vaddr = NULL;
		buf->size = 0;
1426 1427
		debugfs_remove(buf->dentry);
		buf->dentry = NULL;
1428 1429 1430
	}
}

1431
static int coda_start_streaming(struct vb2_queue *q, unsigned int count)
1432
{
1433 1434 1435
	struct coda_ctx *ctx = vb2_get_drv_priv(q);
	struct v4l2_device *v4l2_dev = &ctx->dev->v4l2_dev;
	struct coda_q_data *q_data_src, *q_data_dst;
1436
	struct vb2_v4l2_buffer *buf;
1437
	int ret = 0;
1438

1439 1440 1441
	if (count < 1)
		return -EINVAL;

1442 1443
	q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
1444
		if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit) {
1445
			/* copy the buffers that were queued before streamon */
1446
			mutex_lock(&ctx->bitstream_mutex);
1447
			coda_fill_bitstream(ctx, false);
1448
			mutex_unlock(&ctx->bitstream_mutex);
1449

1450 1451 1452 1453
			if (coda_get_bitstream_payload(ctx) < 512) {
				ret = -EINVAL;
				goto err;
			}
1454
		}
1455

1456
		ctx->streamon_out = 1;
1457 1458
	} else {
		ctx->streamon_cap = 1;
1459
	}
1460

1461
	/* Don't start the coda unless both queues are on */
1462
	if (!(ctx->streamon_out && ctx->streamon_cap))
1463
		return 0;
1464

1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476
	q_data_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
	if ((q_data_src->width != q_data_dst->width &&
	     round_up(q_data_src->width, 16) != q_data_dst->width) ||
	    (q_data_src->height != q_data_dst->height &&
	     round_up(q_data_src->height, 16) != q_data_dst->height)) {
		v4l2_err(v4l2_dev, "can't convert %dx%d to %dx%d\n",
			 q_data_src->width, q_data_src->height,
			 q_data_dst->width, q_data_dst->height);
		ret = -EINVAL;
		goto err;
	}

1477
	/* Allow BIT decoder device_run with no new buffers queued */
1478
	if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit)
1479
		v4l2_m2m_set_src_buffered(ctx->fh.m2m_ctx, true);
1480

1481 1482 1483 1484 1485
	ctx->gopcounter = ctx->params.gop_size - 1;

	ctx->codec = coda_find_codec(ctx->dev, q_data_src->fourcc,
				     q_data_dst->fourcc);
	if (!ctx->codec) {
1486
		v4l2_err(v4l2_dev, "couldn't tell instance type.\n");
1487 1488
		ret = -EINVAL;
		goto err;
1489 1490
	}

1491 1492 1493 1494
	if (q_data_dst->fourcc == V4L2_PIX_FMT_JPEG)
		ctx->params.gop_size = 1;
	ctx->gopcounter = ctx->params.gop_size - 1;

P
Philipp Zabel 已提交
1495
	ret = ctx->ops->start_streaming(ctx);
1496
	if (ctx->inst_type == CODA_INST_DECODER) {
1497
		if (ret == -EAGAIN)
1498
			return 0;
1499
		else if (ret < 0)
1500
			goto err;
1501 1502
	}

1503
	return ret;
1504 1505 1506 1507

err:
	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
		while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx)))
1508
			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
1509 1510
	} else {
		while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx)))
1511
			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
1512 1513
	}
	return ret;
1514 1515
}

1516
static void coda_stop_streaming(struct vb2_queue *q)
1517 1518
{
	struct coda_ctx *ctx = vb2_get_drv_priv(q);
1519
	struct coda_dev *dev = ctx->dev;
1520
	struct vb2_v4l2_buffer *buf;
1521
	unsigned long flags;
1522 1523 1524
	bool stop;

	stop = ctx->streamon_out && ctx->streamon_cap;
1525 1526

	if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
1527
		v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
1528
			 "%s: output\n", __func__);
1529
		ctx->streamon_out = 0;
1530

1531
		coda_bit_stream_end_flag(ctx);
1532

1533
		ctx->qsequence = 0;
1534 1535 1536

		while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx)))
			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR);
1537
	} else {
1538
		v4l2_dbg(1, coda_debug, &dev->v4l2_dev,
1539
			 "%s: capture\n", __func__);
1540
		ctx->streamon_cap = 0;
1541

1542
		ctx->osequence = 0;
1543
		ctx->sequence_offset = 0;
1544 1545 1546

		while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx)))
			v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR);
1547 1548
	}

1549
	if (stop) {
1550
		struct coda_buffer_meta *meta;
1551

1552 1553 1554 1555
		if (ctx->ops->seq_end_work) {
			queue_work(dev->workqueue, &ctx->seq_end_work);
			flush_work(&ctx->seq_end_work);
		}
1556
		spin_lock_irqsave(&ctx->buffer_meta_lock, flags);
1557 1558 1559 1560 1561
		while (!list_empty(&ctx->buffer_meta_list)) {
			meta = list_first_entry(&ctx->buffer_meta_list,
						struct coda_buffer_meta, list);
			list_del(&meta->list);
			kfree(meta);
1562
		}
1563 1564
		ctx->num_metas = 0;
		spin_unlock_irqrestore(&ctx->buffer_meta_lock, flags);
1565 1566 1567
		kfifo_init(&ctx->bitstream_fifo,
			ctx->bitstream.vaddr, ctx->bitstream.size);
		ctx->runcounter = 0;
1568
		ctx->aborting = 0;
1569
	}
1570 1571 1572

	if (!ctx->streamon_out && !ctx->streamon_cap)
		ctx->bit_stream_param &= ~CODA_BIT_STREAM_END_FLAG;
1573 1574
}

1575
static const struct vb2_ops coda_qops = {
1576 1577 1578 1579 1580
	.queue_setup		= coda_queue_setup,
	.buf_prepare		= coda_buf_prepare,
	.buf_queue		= coda_buf_queue,
	.start_streaming	= coda_start_streaming,
	.stop_streaming		= coda_stop_streaming,
1581 1582
	.wait_prepare		= vb2_ops_wait_prepare,
	.wait_finish		= vb2_ops_wait_finish,
1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593
};

static int coda_s_ctrl(struct v4l2_ctrl *ctrl)
{
	struct coda_ctx *ctx =
			container_of(ctrl->handler, struct coda_ctx, ctrls);

	v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
		 "s_ctrl: id = %d, val = %d\n", ctrl->id, ctrl->val);

	switch (ctrl->id) {
1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605
	case V4L2_CID_HFLIP:
		if (ctrl->val)
			ctx->params.rot_mode |= CODA_MIR_HOR;
		else
			ctx->params.rot_mode &= ~CODA_MIR_HOR;
		break;
	case V4L2_CID_VFLIP:
		if (ctrl->val)
			ctx->params.rot_mode |= CODA_MIR_VER;
		else
			ctx->params.rot_mode &= ~CODA_MIR_VER;
		break;
1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617
	case V4L2_CID_MPEG_VIDEO_BITRATE:
		ctx->params.bitrate = ctrl->val / 1000;
		break;
	case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
		ctx->params.gop_size = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
		ctx->params.h264_intra_qp = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
		ctx->params.h264_inter_qp = ctrl->val;
		break;
1618 1619 1620 1621 1622 1623
	case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
		ctx->params.h264_min_qp = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
		ctx->params.h264_max_qp = ctrl->val;
		break;
1624 1625 1626 1627 1628 1629 1630 1631 1632 1633
	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA:
		ctx->params.h264_deblk_alpha = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA:
		ctx->params.h264_deblk_beta = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
		ctx->params.h264_deblk_enabled = (ctrl->val ==
				V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED);
		break;
1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645
	case V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP:
		ctx->params.mpeg4_intra_qp = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP:
		ctx->params.mpeg4_inter_qp = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE:
		ctx->params.slice_mode = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB:
		ctx->params.slice_max_mb = ctrl->val;
		break;
1646 1647 1648
	case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES:
		ctx->params.slice_max_bits = ctrl->val * 8;
		break;
1649 1650
	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
		break;
1651 1652 1653
	case V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB:
		ctx->params.intra_refresh = ctrl->val;
		break;
1654 1655 1656 1657 1658 1659
	case V4L2_CID_JPEG_COMPRESSION_QUALITY:
		coda_set_jpeg_compression_quality(ctx, ctrl->val);
		break;
	case V4L2_CID_JPEG_RESTART_INTERVAL:
		ctx->params.jpeg_restart_interval = ctrl->val;
		break;
1660 1661 1662 1663 1664 1665
	case V4L2_CID_MPEG_VIDEO_VBV_DELAY:
		ctx->params.vbv_delay = ctrl->val;
		break;
	case V4L2_CID_MPEG_VIDEO_VBV_SIZE:
		ctx->params.vbv_size = min(ctrl->val * 8192, 0x7fffffff);
		break;
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675
	default:
		v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev,
			"Invalid control, id=%d, val=%d\n",
			ctrl->id, ctrl->val);
		return -EINVAL;
	}

	return 0;
}

1676
static const struct v4l2_ctrl_ops coda_ctrl_ops = {
1677 1678 1679
	.s_ctrl = coda_s_ctrl,
};

1680
static void coda_encode_ctrls(struct coda_ctx *ctx)
1681 1682
{
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
1683
		V4L2_CID_MPEG_VIDEO_BITRATE, 0, 32767000, 1000, 0);
1684 1685 1686
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_GOP_SIZE, 1, 60, 1, 16);
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
1687
		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, 0, 51, 1, 25);
1688
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
1689
		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, 0, 51, 1, 25);
1690 1691 1692 1693 1694 1695
	if (ctx->dev->devtype->product != CODA_960) {
		v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
			V4L2_CID_MPEG_VIDEO_H264_MIN_QP, 0, 51, 1, 12);
	}
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_H264_MAX_QP, 0, 51, 1, 51);
1696 1697 1698 1699 1700 1701 1702 1703
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA, 0, 15, 1, 0);
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA, 0, 15, 1, 0);
	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
		V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED, 0x0,
		V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED);
1704 1705 1706 1707 1708 1709
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_MPEG4_I_FRAME_QP, 1, 31, 1, 2);
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_MPEG4_P_FRAME_QP, 1, 31, 1, 2);
	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
1710 1711
		V4L2_MPEG_VIDEO_MULTI_SICE_MODE_MAX_BYTES, 0x0,
		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE);
1712 1713
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, 1, 0x3fffffff, 1, 1);
1714
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
P
Philipp Zabel 已提交
1715 1716
		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, 1, 0x3fffffff, 1,
		500);
1717 1718 1719 1720 1721
	v4l2_ctrl_new_std_menu(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_HEADER_MODE,
		V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
		(1 << V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE),
		V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME);
1722
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
P
Philipp Zabel 已提交
1723 1724
		V4L2_CID_MPEG_VIDEO_CYCLIC_INTRA_REFRESH_MB, 0,
		1920 * 1088 / 256, 1, 0);
1725 1726 1727 1728 1729 1730 1731 1732
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_VBV_DELAY, 0, 0x7fff, 1, 0);
	/*
	 * The maximum VBV size value is 0x7fffffff bits,
	 * one bit less than 262144 KiB
	 */
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_MPEG_VIDEO_VBV_SIZE, 0, 262144, 1, 0);
1733 1734
}

1735 1736 1737 1738 1739 1740 1741 1742
static void coda_jpeg_encode_ctrls(struct coda_ctx *ctx)
{
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_JPEG_COMPRESSION_QUALITY, 5, 100, 1, 50);
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_JPEG_RESTART_INTERVAL, 0, 100, 1, 0);
}

1743 1744 1745 1746 1747 1748 1749 1750
static int coda_ctrls_setup(struct coda_ctx *ctx)
{
	v4l2_ctrl_handler_init(&ctx->ctrls, 2);

	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_HFLIP, 0, 1, 1, 0);
	v4l2_ctrl_new_std(&ctx->ctrls, &coda_ctrl_ops,
		V4L2_CID_VFLIP, 0, 1, 1, 0);
1751 1752 1753 1754 1755 1756
	if (ctx->inst_type == CODA_INST_ENCODER) {
		if (ctx->cvd->dst_formats[0] == V4L2_PIX_FMT_JPEG)
			coda_jpeg_encode_ctrls(ctx);
		else
			coda_encode_ctrls(ctx);
	}
1757 1758

	if (ctx->ctrls.error) {
P
Philipp Zabel 已提交
1759 1760
		v4l2_err(&ctx->dev->v4l2_dev,
			"control initialization error (%d)",
1761 1762 1763 1764 1765 1766 1767
			ctx->ctrls.error);
		return -EINVAL;
	}

	return v4l2_ctrl_handler_setup(&ctx->ctrls);
}

1768 1769 1770 1771 1772 1773 1774
static int coda_queue_init(struct coda_ctx *ctx, struct vb2_queue *vq)
{
	vq->drv_priv = ctx;
	vq->ops = &coda_qops;
	vq->buf_struct_size = sizeof(struct v4l2_m2m_buffer);
	vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
	vq->lock = &ctx->dev->dev_mutex;
1775 1776 1777 1778 1779 1780 1781
	/* One way to indicate end-of-stream for coda is to set the
	 * bytesused == 0. However by default videobuf2 handles bytesused
	 * equal to 0 as a special case and changes its value to the size
	 * of the buffer. Set the allow_zero_bytesused flag, so
	 * that videobuf2 will keep the value of bytesused intact.
	 */
	vq->allow_zero_bytesused = 1;
1782
	vq->dev = &ctx->dev->plat_dev->dev;
1783 1784 1785 1786

	return vb2_queue_init(vq);
}

1787 1788
int coda_encoder_queue_init(void *priv, struct vb2_queue *src_vq,
			    struct vb2_queue *dst_vq)
1789 1790 1791 1792
{
	int ret;

	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
1793
	src_vq->io_modes = VB2_DMABUF | VB2_MMAP;
1794 1795
	src_vq->mem_ops = &vb2_dma_contig_memops;

1796
	ret = coda_queue_init(priv, src_vq);
1797 1798 1799 1800
	if (ret)
		return ret;

	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1801
	dst_vq->io_modes = VB2_DMABUF | VB2_MMAP;
1802 1803
	dst_vq->mem_ops = &vb2_dma_contig_memops;

1804 1805 1806
	return coda_queue_init(priv, dst_vq);
}

1807 1808
int coda_decoder_queue_init(void *priv, struct vb2_queue *src_vq,
			    struct vb2_queue *dst_vq)
1809 1810 1811 1812
{
	int ret;

	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
1813 1814
	src_vq->io_modes = VB2_DMABUF | VB2_MMAP | VB2_USERPTR;
	src_vq->mem_ops = &vb2_vmalloc_memops;
1815 1816 1817 1818 1819 1820 1821 1822 1823 1824

	ret = coda_queue_init(priv, src_vq);
	if (ret)
		return ret;

	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	dst_vq->io_modes = VB2_DMABUF | VB2_MMAP;
	dst_vq->mem_ops = &vb2_dma_contig_memops;

	return coda_queue_init(priv, dst_vq);
1825 1826
}

1827 1828
static int coda_next_free_instance(struct coda_dev *dev)
{
1829 1830 1831 1832 1833 1834 1835
	int idx = ffz(dev->instance_mask);

	if ((idx < 0) ||
	    (dev->devtype->product == CODA_DX6 && idx > CODADX6_MAX_INSTANCES))
		return -EBUSY;

	return idx;
1836 1837
}

1838 1839 1840 1841 1842
/*
 * File operations
 */

static int coda_open(struct file *file)
1843
{
1844 1845
	struct video_device *vdev = video_devdata(file);
	struct coda_dev *dev = video_get_drvdata(vdev);
1846
	struct coda_ctx *ctx = NULL;
1847
	char *name;
1848
	int ret;
1849
	int idx;
1850

P
Philipp Zabel 已提交
1851
	ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
1852 1853 1854
	if (!ctx)
		return -ENOMEM;

F
Fabio Estevam 已提交
1855
	idx = coda_next_free_instance(dev);
1856 1857
	if (idx < 0) {
		ret = idx;
F
Fabio Estevam 已提交
1858 1859 1860 1861
		goto err_coda_max;
	}
	set_bit(idx, &dev->instance_mask);

1862
	name = kasprintf(GFP_KERNEL, "context%d", idx);
1863 1864 1865 1866 1867
	if (!name) {
		ret = -ENOMEM;
		goto err_coda_name_init;
	}

1868 1869 1870
	ctx->debugfs_entry = debugfs_create_dir(name, dev->debugfs_root);
	kfree(name);

1871 1872 1873
	ctx->cvd = to_coda_video_device(vdev);
	ctx->inst_type = ctx->cvd->type;
	ctx->ops = ctx->cvd->ops;
1874
	ctx->use_bit = !ctx->cvd->direct;
1875 1876
	init_completion(&ctx->completion);
	INIT_WORK(&ctx->pic_run_work, coda_pic_run_work);
1877 1878
	if (ctx->ops->seq_end_work)
		INIT_WORK(&ctx->seq_end_work, ctx->ops->seq_end_work);
1879 1880 1881 1882
	v4l2_fh_init(&ctx->fh, video_devdata(file));
	file->private_data = &ctx->fh;
	v4l2_fh_add(&ctx->fh);
	ctx->dev = dev;
1883
	ctx->idx = idx;
1884
	switch (dev->devtype->product) {
1885
	case CODA_960:
1886 1887
		if (enable_bwb)
			ctx->frame_mem_ctrl = CODA9_FRAME_ENABLE_BWB;
1888 1889
		/* fallthrough */
	case CODA_7541:
1890 1891 1892 1893 1894
		ctx->reg_idx = 0;
		break;
	default:
		ctx->reg_idx = idx;
	}
1895 1896 1897 1898 1899 1900 1901
	if (ctx->dev->vdoa && !disable_vdoa) {
		ctx->vdoa = vdoa_context_create(dev->vdoa);
		if (!ctx->vdoa)
			v4l2_warn(&dev->v4l2_dev,
				  "Failed to create vdoa context: not using vdoa");
	}
	ctx->use_vdoa = false;
F
Fabio Estevam 已提交
1902

1903 1904 1905 1906 1907 1908 1909
	/* Power up and upload firmware if necessary */
	ret = pm_runtime_get_sync(&dev->plat_dev->dev);
	if (ret < 0) {
		v4l2_err(&dev->v4l2_dev, "failed to power up: %d\n", ret);
		goto err_pm_get;
	}

1910 1911 1912 1913 1914 1915 1916 1917
	ret = clk_prepare_enable(dev->clk_per);
	if (ret)
		goto err_clk_per;

	ret = clk_prepare_enable(dev->clk_ahb);
	if (ret)
		goto err_clk_ahb;

1918
	set_default_params(ctx);
P
Philipp Zabel 已提交
1919 1920
	ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, ctx,
					    ctx->ops->queue_init);
1921 1922
	if (IS_ERR(ctx->fh.m2m_ctx)) {
		ret = PTR_ERR(ctx->fh.m2m_ctx);
1923 1924 1925

		v4l2_err(&dev->v4l2_dev, "%s return error (%d)\n",
			 __func__, ret);
F
Fabio Estevam 已提交
1926
		goto err_ctx_init;
1927
	}
1928

1929 1930 1931
	ret = coda_ctrls_setup(ctx);
	if (ret) {
		v4l2_err(&dev->v4l2_dev, "failed to setup coda controls\n");
F
Fabio Estevam 已提交
1932
		goto err_ctrls_setup;
1933 1934 1935 1936
	}

	ctx->fh.ctrl_handler = &ctx->ctrls;

1937
	mutex_init(&ctx->bitstream_mutex);
1938
	mutex_init(&ctx->buffer_mutex);
1939
	INIT_LIST_HEAD(&ctx->buffer_meta_list);
1940
	spin_lock_init(&ctx->buffer_meta_lock);
1941

1942
	coda_lock(ctx);
1943
	list_add(&ctx->list, &dev->instances);
1944 1945 1946 1947 1948 1949 1950
	coda_unlock(ctx);

	v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Created instance %d (%p)\n",
		 ctx->idx, ctx);

	return 0;

F
Fabio Estevam 已提交
1951
err_ctrls_setup:
1952
	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
F
Fabio Estevam 已提交
1953 1954
err_ctx_init:
	clk_disable_unprepare(dev->clk_ahb);
1955
err_clk_ahb:
F
Fabio Estevam 已提交
1956
	clk_disable_unprepare(dev->clk_per);
1957
err_clk_per:
1958 1959
	pm_runtime_put_sync(&dev->plat_dev->dev);
err_pm_get:
1960 1961
	v4l2_fh_del(&ctx->fh);
	v4l2_fh_exit(&ctx->fh);
F
Fabio Estevam 已提交
1962
	clear_bit(ctx->idx, &dev->instance_mask);
1963
err_coda_name_init:
F
Fabio Estevam 已提交
1964
err_coda_max:
1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976
	kfree(ctx);
	return ret;
}

static int coda_release(struct file *file)
{
	struct coda_dev *dev = video_drvdata(file);
	struct coda_ctx *ctx = fh_to_ctx(file->private_data);

	v4l2_dbg(1, coda_debug, &dev->v4l2_dev, "Releasing instance %p\n",
		 ctx);

1977
	if (ctx->inst_type == CODA_INST_DECODER && ctx->use_bit)
1978 1979
		coda_bit_stream_end_flag(ctx);

1980
	/* If this instance is running, call .job_abort and wait for it to end */
1981
	v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
1982

1983 1984 1985
	if (ctx->vdoa)
		vdoa_context_destroy(ctx->vdoa);

1986
	/* In case the instance was not running, we still need to call SEQ_END */
1987
	if (ctx->ops->seq_end_work) {
1988 1989
		queue_work(dev->workqueue, &ctx->seq_end_work);
		flush_work(&ctx->seq_end_work);
1990 1991
	}

1992
	coda_lock(ctx);
1993
	list_del(&ctx->list);
1994 1995
	coda_unlock(ctx);

1996 1997 1998
	if (ctx->dev->devtype->product == CODA_DX6)
		coda_free_aux_buf(dev, &ctx->workbuf);

1999 2000
	v4l2_ctrl_handler_free(&ctx->ctrls);
	clk_disable_unprepare(dev->clk_ahb);
F
Fabio Estevam 已提交
2001
	clk_disable_unprepare(dev->clk_per);
2002
	pm_runtime_put_sync(&dev->plat_dev->dev);
2003 2004
	v4l2_fh_del(&ctx->fh);
	v4l2_fh_exit(&ctx->fh);
2005
	clear_bit(ctx->idx, &dev->instance_mask);
2006 2007
	if (ctx->ops->release)
		ctx->ops->release(ctx);
2008
	debugfs_remove_recursive(ctx->debugfs_entry);
2009 2010 2011 2012 2013
	kfree(ctx);

	return 0;
}

2014
static const struct v4l2_file_operations coda_fops = {
2015
	.owner		= THIS_MODULE,
2016
	.open		= coda_open,
2017
	.release	= coda_release,
2018
	.poll		= v4l2_m2m_fop_poll,
2019
	.unlocked_ioctl	= video_ioctl2,
2020
	.mmap		= v4l2_m2m_fop_mmap,
2021 2022
};

2023
static int coda_hw_init(struct coda_dev *dev)
2024 2025 2026
{
	u32 data;
	u16 *p;
2027 2028 2029 2030
	int i, ret;

	ret = clk_prepare_enable(dev->clk_per);
	if (ret)
2031
		goto err_clk_per;
2032

2033 2034 2035
	ret = clk_prepare_enable(dev->clk_ahb);
	if (ret)
		goto err_clk_ahb;
2036

2037 2038 2039
	if (dev->rstc)
		reset_control_reset(dev->rstc);

2040 2041
	/*
	 * Copy the first CODA_ISRAM_SIZE in the internal SRAM.
2042 2043
	 * The 16-bit chars in the code buffer are in memory access
	 * order, re-sort them to CODA order for register download.
2044 2045
	 * Data in this SRAM survives a reboot.
	 */
2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059
	p = (u16 *)dev->codebuf.vaddr;
	if (dev->devtype->product == CODA_DX6) {
		for (i = 0; i < (CODA_ISRAM_SIZE / 2); i++)  {
			data = CODA_DOWN_ADDRESS_SET(i) |
				CODA_DOWN_DATA_SET(p[i ^ 1]);
			coda_write(dev, data, CODA_REG_BIT_CODE_DOWN);
		}
	} else {
		for (i = 0; i < (CODA_ISRAM_SIZE / 2); i++) {
			data = CODA_DOWN_ADDRESS_SET(i) |
				CODA_DOWN_DATA_SET(p[round_down(i, 4) +
							3 - (i % 4)]);
			coda_write(dev, data, CODA_REG_BIT_CODE_DOWN);
		}
2060 2061
	}

2062 2063 2064 2065
	/* Clear registers */
	for (i = 0; i < 64; i++)
		coda_write(dev, 0, CODA_REG_BIT_CODE_BUF_ADDR + i * 4);

2066
	/* Tell the BIT where to find everything it needs */
2067 2068
	if (dev->devtype->product == CODA_960 ||
	    dev->devtype->product == CODA_7541) {
2069 2070
		coda_write(dev, dev->tempbuf.paddr,
				CODA_REG_BIT_TEMP_BUF_ADDR);
2071
		coda_write(dev, 0, CODA_REG_BIT_BIT_STREAM_PARAM);
2072 2073 2074 2075
	} else {
		coda_write(dev, dev->workbuf.paddr,
			      CODA_REG_BIT_WORK_BUF_ADDR);
	}
2076 2077 2078 2079 2080 2081 2082
	coda_write(dev, dev->codebuf.paddr,
		      CODA_REG_BIT_CODE_BUF_ADDR);
	coda_write(dev, 0, CODA_REG_BIT_CODE_RUN);

	/* Set default values */
	switch (dev->devtype->product) {
	case CODA_DX6:
P
Philipp Zabel 已提交
2083 2084
		coda_write(dev, CODADX6_STREAM_BUF_PIC_FLUSH,
			   CODA_REG_BIT_STREAM_CTRL);
2085 2086
		break;
	default:
P
Philipp Zabel 已提交
2087 2088
		coda_write(dev, CODA7_STREAM_BUF_PIC_FLUSH,
			   CODA_REG_BIT_STREAM_CTRL);
2089
	}
2090 2091 2092 2093
	if (dev->devtype->product == CODA_960)
		coda_write(dev, 1 << 12, CODA_REG_BIT_FRAME_MEM_CTRL);
	else
		coda_write(dev, 0, CODA_REG_BIT_FRAME_MEM_CTRL);
2094 2095 2096 2097

	if (dev->devtype->product != CODA_DX6)
		coda_write(dev, 0, CODA7_REG_BIT_AXI_SRAM_USE);

2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109
	coda_write(dev, CODA_INT_INTERRUPT_ENABLE,
		      CODA_REG_BIT_INT_ENABLE);

	/* Reset VPU and start processor */
	data = coda_read(dev, CODA_REG_BIT_CODE_RESET);
	data |= CODA_REG_RESET_ENABLE;
	coda_write(dev, data, CODA_REG_BIT_CODE_RESET);
	udelay(10);
	data &= ~CODA_REG_RESET_ENABLE;
	coda_write(dev, data, CODA_REG_BIT_CODE_RESET);
	coda_write(dev, CODA_REG_RUN_ENABLE, CODA_REG_BIT_CODE_RUN);

2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120
	clk_disable_unprepare(dev->clk_ahb);
	clk_disable_unprepare(dev->clk_per);

	return 0;

err_clk_ahb:
	clk_disable_unprepare(dev->clk_per);
err_clk_per:
	return ret;
}

2121
static int coda_register_device(struct coda_dev *dev, int i)
2122
{
2123 2124
	struct video_device *vfd = &dev->vfd[i];

2125
	if (i >= dev->devtype->num_vdevs)
2126 2127
		return -EINVAL;

2128
	strlcpy(vfd->name, dev->devtype->vdevs[i]->name, sizeof(vfd->name));
2129 2130
	vfd->fops	= &coda_fops;
	vfd->ioctl_ops	= &coda_ioctl_ops;
2131 2132 2133 2134 2135 2136
	vfd->release	= video_device_release_empty,
	vfd->lock	= &dev->dev_mutex;
	vfd->v4l2_dev	= &dev->v4l2_dev;
	vfd->vfl_dir	= VFL_DIR_M2M;
	video_set_drvdata(vfd, dev);

2137 2138 2139 2140 2141
	/* Not applicable, use the selection API instead */
	v4l2_disable_ioctl(vfd, VIDIOC_CROPCAP);
	v4l2_disable_ioctl(vfd, VIDIOC_G_CROP);
	v4l2_disable_ioctl(vfd, VIDIOC_S_CROP);

2142 2143 2144
	return video_register_device(vfd, VFL_TYPE_GRABBER, 0);
}

2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176
static void coda_copy_firmware(struct coda_dev *dev, const u8 * const buf,
			       size_t size)
{
	u32 *src = (u32 *)buf;

	/* Check if the firmware has a 16-byte Freescale header, skip it */
	if (buf[0] == 'M' && buf[1] == 'X')
		src += 4;
	/*
	 * Check whether the firmware is in native order or pre-reordered for
	 * memory access. The first instruction opcode always is 0xe40e.
	 */
	if (__le16_to_cpup((__le16 *)src) == 0xe40e) {
		u32 *dst = dev->codebuf.vaddr;
		int i;

		/* Firmware in native order, reorder while copying */
		if (dev->devtype->product == CODA_DX6) {
			for (i = 0; i < (size - 16) / 4; i++)
				dst[i] = (src[i] << 16) | (src[i] >> 16);
		} else {
			for (i = 0; i < (size - 16) / 4; i += 2) {
				dst[i] = (src[i + 1] << 16) | (src[i + 1] >> 16);
				dst[i + 1] = (src[i] << 16) | (src[i] >> 16);
			}
		}
	} else {
		/* Copy the already reordered firmware image */
		memcpy(dev->codebuf.vaddr, src, size);
	}
}

2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190
static void coda_fw_callback(const struct firmware *fw, void *context);

static int coda_firmware_request(struct coda_dev *dev)
{
	char *fw = dev->devtype->firmware[dev->firmware];

	dev_dbg(&dev->plat_dev->dev, "requesting firmware '%s' for %s\n", fw,
		coda_product_name(dev->devtype->product));

	return request_firmware_nowait(THIS_MODULE, true, fw,
				       &dev->plat_dev->dev, GFP_KERNEL, dev,
				       coda_fw_callback);
}

2191 2192 2193 2194
static void coda_fw_callback(const struct firmware *fw, void *context)
{
	struct coda_dev *dev = context;
	struct platform_device *pdev = dev->plat_dev;
2195
	int i, ret;
2196

2197
	if (!fw && dev->firmware == 1) {
2198
		v4l2_err(&dev->v4l2_dev, "firmware request failed\n");
2199
		goto put_pm;
2200
	}
2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214
	if (!fw) {
		dev->firmware = 1;
		coda_firmware_request(dev);
		return;
	}
	if (dev->firmware == 1) {
		/*
		 * Since we can't suppress warnings for failed asynchronous
		 * firmware requests, report that the fallback firmware was
		 * found.
		 */
		dev_info(&pdev->dev, "Using fallback firmware %s\n",
			 dev->devtype->firmware[dev->firmware]);
	}
2215 2216

	/* allocate auxiliary per-device code buffer for the BIT processor */
2217 2218
	ret = coda_alloc_aux_buf(dev, &dev->codebuf, fw->size, "codebuf",
				 dev->debugfs_root);
2219
	if (ret < 0)
2220
		goto put_pm;
2221

2222
	coda_copy_firmware(dev, fw->data, fw->size);
2223 2224
	release_firmware(fw);

2225 2226 2227 2228
	ret = coda_hw_init(dev);
	if (ret < 0) {
		v4l2_err(&dev->v4l2_dev, "HW initialization failed\n");
		goto put_pm;
2229 2230
	}

2231 2232 2233 2234
	ret = coda_check_firmware(dev);
	if (ret < 0)
		goto put_pm;

2235 2236 2237
	dev->m2m_dev = v4l2_m2m_init(&coda_m2m_ops);
	if (IS_ERR(dev->m2m_dev)) {
		v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n");
2238
		goto put_pm;
2239 2240
	}

2241 2242 2243 2244 2245 2246 2247 2248
	for (i = 0; i < dev->devtype->num_vdevs; i++) {
		ret = coda_register_device(dev, i);
		if (ret) {
			v4l2_err(&dev->v4l2_dev,
				 "Failed to register %s video device: %d\n",
				 dev->devtype->vdevs[i]->name, ret);
			goto rel_vfd;
		}
2249 2250 2251
	}

	v4l2_info(&dev->v4l2_dev, "codec registered as /dev/video[%d-%d]\n",
2252
		  dev->vfd[0].num, dev->vfd[i - 1].num);
2253

2254
	pm_runtime_put_sync(&pdev->dev);
2255 2256
	return;

2257 2258 2259
rel_vfd:
	while (--i >= 0)
		video_unregister_device(&dev->vfd[i]);
2260
	v4l2_m2m_release(dev->m2m_dev);
2261 2262
put_pm:
	pm_runtime_put_sync(&pdev->dev);
2263 2264 2265 2266
}

enum coda_platform {
	CODA_IMX27,
2267
	CODA_IMX53,
2268 2269
	CODA_IMX6Q,
	CODA_IMX6DL,
2270 2271
};

2272
static const struct coda_devtype coda_devdata[] = {
2273
	[CODA_IMX27] = {
2274 2275
		.firmware     = {
			"vpu_fw_imx27_TO2.bin",
2276
			"vpu/vpu_fw_imx27_TO2.bin",
2277 2278
			"v4l-codadx6-imx27.bin"
		},
2279 2280 2281
		.product      = CODA_DX6,
		.codecs       = codadx6_codecs,
		.num_codecs   = ARRAY_SIZE(codadx6_codecs),
2282 2283
		.vdevs        = codadx6_video_devices,
		.num_vdevs    = ARRAY_SIZE(codadx6_video_devices),
2284
		.workbuf_size = 288 * 1024 + FMO_SLICE_SAVE_BUF_SIZE * 8 * 1024,
2285
		.iram_size    = 0xb000,
2286
	},
2287
	[CODA_IMX53] = {
2288 2289
		.firmware     = {
			"vpu_fw_imx53.bin",
2290
			"vpu/vpu_fw_imx53.bin",
2291 2292
			"v4l-coda7541-imx53.bin"
		},
2293 2294 2295
		.product      = CODA_7541,
		.codecs       = coda7_codecs,
		.num_codecs   = ARRAY_SIZE(coda7_codecs),
2296 2297
		.vdevs        = coda7_video_devices,
		.num_vdevs    = ARRAY_SIZE(coda7_video_devices),
2298
		.workbuf_size = 128 * 1024,
2299
		.tempbuf_size = 304 * 1024,
2300
		.iram_size    = 0x14000,
2301
	},
2302
	[CODA_IMX6Q] = {
2303 2304
		.firmware     = {
			"vpu_fw_imx6q.bin",
2305
			"vpu/vpu_fw_imx6q.bin",
2306 2307
			"v4l-coda960-imx6q.bin"
		},
2308 2309 2310
		.product      = CODA_960,
		.codecs       = coda9_codecs,
		.num_codecs   = ARRAY_SIZE(coda9_codecs),
2311 2312
		.vdevs        = coda9_video_devices,
		.num_vdevs    = ARRAY_SIZE(coda9_video_devices),
2313
		.workbuf_size = 80 * 1024,
2314
		.tempbuf_size = 204 * 1024,
2315
		.iram_size    = 0x21000,
2316 2317
	},
	[CODA_IMX6DL] = {
2318 2319
		.firmware     = {
			"vpu_fw_imx6d.bin",
2320
			"vpu/vpu_fw_imx6d.bin",
2321 2322
			"v4l-coda960-imx6dl.bin"
		},
2323 2324 2325
		.product      = CODA_960,
		.codecs       = coda9_codecs,
		.num_codecs   = ARRAY_SIZE(coda9_codecs),
2326 2327
		.vdevs        = coda9_video_devices,
		.num_vdevs    = ARRAY_SIZE(coda9_video_devices),
2328
		.workbuf_size = 80 * 1024,
2329
		.tempbuf_size = 204 * 1024,
2330
		.iram_size    = 0x20000,
2331
	},
2332 2333 2334 2335 2336 2337 2338 2339 2340 2341
};

static struct platform_device_id coda_platform_ids[] = {
	{ .name = "coda-imx27", .driver_data = CODA_IMX27 },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(platform, coda_platform_ids);

#ifdef CONFIG_OF
static const struct of_device_id coda_dt_ids[] = {
2342
	{ .compatible = "fsl,imx27-vpu", .data = &coda_devdata[CODA_IMX27] },
2343
	{ .compatible = "fsl,imx53-vpu", .data = &coda_devdata[CODA_IMX53] },
2344 2345
	{ .compatible = "fsl,imx6q-vpu", .data = &coda_devdata[CODA_IMX6Q] },
	{ .compatible = "fsl,imx6dl-vpu", .data = &coda_devdata[CODA_IMX6DL] },
2346 2347 2348 2349 2350
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, coda_dt_ids);
#endif

2351
static int coda_probe(struct platform_device *pdev)
2352 2353 2354 2355
{
	const struct of_device_id *of_id =
			of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev);
	const struct platform_device_id *pdev_id;
P
Philipp Zabel 已提交
2356 2357 2358
	struct coda_platform_data *pdata = pdev->dev.platform_data;
	struct device_node *np = pdev->dev.of_node;
	struct gen_pool *pool;
2359 2360 2361 2362
	struct coda_dev *dev;
	struct resource *res;
	int ret, irq;

P
Philipp Zabel 已提交
2363
	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
2364
	if (!dev)
2365 2366
		return -ENOMEM;

2367 2368
	pdev_id = of_id ? of_id->data : platform_get_device_id(pdev);

2369
	if (of_id)
2370
		dev->devtype = of_id->data;
2371
	else if (pdev_id)
2372
		dev->devtype = &coda_devdata[pdev_id->driver_data];
2373 2374
	else
		return -EINVAL;
2375 2376

	spin_lock_init(&dev->irqlock);
2377
	INIT_LIST_HEAD(&dev->instances);
2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393

	dev->plat_dev = pdev;
	dev->clk_per = devm_clk_get(&pdev->dev, "per");
	if (IS_ERR(dev->clk_per)) {
		dev_err(&pdev->dev, "Could not get per clock\n");
		return PTR_ERR(dev->clk_per);
	}

	dev->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
	if (IS_ERR(dev->clk_ahb)) {
		dev_err(&pdev->dev, "Could not get ahb clock\n");
		return PTR_ERR(dev->clk_ahb);
	}

	/* Get  memory for physical registers */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2394 2395 2396
	dev->regs_base = devm_ioremap_resource(&pdev->dev, res);
	if (IS_ERR(dev->regs_base))
		return PTR_ERR(dev->regs_base);
2397 2398

	/* IRQ */
2399 2400 2401
	irq = platform_get_irq_byname(pdev, "bit");
	if (irq < 0)
		irq = platform_get_irq(pdev, 0);
2402 2403
	if (irq < 0) {
		dev_err(&pdev->dev, "failed to get irq resource\n");
2404
		return irq;
2405 2406
	}

2407 2408 2409 2410 2411
	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL, coda_irq_handler,
			IRQF_ONESHOT, dev_name(&pdev->dev), dev);
	if (ret < 0) {
		dev_err(&pdev->dev, "failed to request irq: %d\n", ret);
		return ret;
2412 2413
	}

2414
	dev->rstc = devm_reset_control_get_optional(&pdev->dev, NULL);
2415 2416
	if (IS_ERR(dev->rstc)) {
		ret = PTR_ERR(dev->rstc);
2417
		if (ret == -ENOENT || ret == -ENOTSUPP) {
2418 2419
			dev->rstc = NULL;
		} else {
P
Philipp Zabel 已提交
2420 2421
			dev_err(&pdev->dev, "failed get reset control: %d\n",
				ret);
2422 2423 2424 2425
			return ret;
		}
	}

P
Philipp Zabel 已提交
2426
	/* Get IRAM pool from device tree or platform data */
2427
	pool = of_gen_pool_get(np, "iram", 0);
P
Philipp Zabel 已提交
2428
	if (!pool && pdata)
2429
		pool = gen_pool_get(pdata->iram_dev, NULL);
P
Philipp Zabel 已提交
2430 2431 2432 2433 2434 2435
	if (!pool) {
		dev_err(&pdev->dev, "iram pool not available\n");
		return -ENOMEM;
	}
	dev->iram_pool = pool;

2436 2437 2438 2439 2440
	/* Get vdoa_data if supported by the platform */
	dev->vdoa = coda_get_vdoa_data();
	if (PTR_ERR(dev->vdoa) == -EPROBE_DEFER)
		return -EPROBE_DEFER;

2441 2442 2443 2444 2445
	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
	if (ret)
		return ret;

	mutex_init(&dev->dev_mutex);
2446
	mutex_init(&dev->coda_mutex);
2447

2448 2449 2450 2451
	dev->debugfs_root = debugfs_create_dir("coda", NULL);
	if (!dev->debugfs_root)
		dev_warn(&pdev->dev, "failed to create debugfs root\n");

2452
	/* allocate auxiliary per-device buffers for the BIT processor */
2453
	if (dev->devtype->product == CODA_DX6) {
2454
		ret = coda_alloc_aux_buf(dev, &dev->workbuf,
2455
					 dev->devtype->workbuf_size, "workbuf",
2456
					 dev->debugfs_root);
2457
		if (ret < 0)
2458
			goto err_v4l2_register;
2459
	}
2460 2461

	if (dev->devtype->tempbuf_size) {
2462
		ret = coda_alloc_aux_buf(dev, &dev->tempbuf,
2463
					 dev->devtype->tempbuf_size, "tempbuf",
2464
					 dev->debugfs_root);
2465
		if (ret < 0)
2466
			goto err_v4l2_register;
2467 2468
	}

2469
	dev->iram.size = dev->devtype->iram_size;
2470 2471 2472
	dev->iram.vaddr = gen_pool_dma_alloc(dev->iram_pool, dev->iram.size,
					     &dev->iram.paddr);
	if (!dev->iram.vaddr) {
2473 2474
		dev_warn(&pdev->dev, "unable to alloc iram\n");
	} else {
2475
		memset(dev->iram.vaddr, 0, dev->iram.size);
2476 2477 2478 2479 2480
		dev->iram.blob.data = dev->iram.vaddr;
		dev->iram.blob.size = dev->iram.size;
		dev->iram.dentry = debugfs_create_blob("iram", 0644,
						       dev->debugfs_root,
						       &dev->iram.blob);
2481 2482
	}

2483 2484 2485
	dev->workqueue = alloc_workqueue("coda", WQ_UNBOUND | WQ_MEM_RECLAIM, 1);
	if (!dev->workqueue) {
		dev_err(&pdev->dev, "unable to alloc workqueue\n");
2486 2487
		ret = -ENOMEM;
		goto err_v4l2_register;
2488 2489
	}

2490 2491
	platform_set_drvdata(pdev, dev);

2492 2493
	/*
	 * Start activated so we can directly call coda_hw_init in
2494
	 * coda_fw_callback regardless of whether CONFIG_PM is
2495 2496 2497 2498
	 * enabled or whether the device is associated with a PM domain.
	 */
	pm_runtime_get_noresume(&pdev->dev);
	pm_runtime_set_active(&pdev->dev);
2499 2500
	pm_runtime_enable(&pdev->dev);

2501 2502 2503 2504
	ret = coda_firmware_request(dev);
	if (ret)
		goto err_alloc_workqueue;
	return 0;
2505

2506 2507
err_alloc_workqueue:
	destroy_workqueue(dev->workqueue);
2508 2509 2510
err_v4l2_register:
	v4l2_device_unregister(&dev->v4l2_dev);
	return ret;
2511 2512 2513 2514 2515
}

static int coda_remove(struct platform_device *pdev)
{
	struct coda_dev *dev = platform_get_drvdata(pdev);
2516
	int i;
2517

2518 2519 2520 2521
	for (i = 0; i < ARRAY_SIZE(dev->vfd); i++) {
		if (video_get_drvdata(&dev->vfd[i]))
			video_unregister_device(&dev->vfd[i]);
	}
2522 2523
	if (dev->m2m_dev)
		v4l2_m2m_release(dev->m2m_dev);
2524
	pm_runtime_disable(&pdev->dev);
2525
	v4l2_device_unregister(&dev->v4l2_dev);
2526
	destroy_workqueue(dev->workqueue);
2527 2528 2529
	if (dev->iram.vaddr)
		gen_pool_free(dev->iram_pool, (unsigned long)dev->iram.vaddr,
			      dev->iram.size);
2530 2531 2532
	coda_free_aux_buf(dev, &dev->codebuf);
	coda_free_aux_buf(dev, &dev->tempbuf);
	coda_free_aux_buf(dev, &dev->workbuf);
2533
	debugfs_remove_recursive(dev->debugfs_root);
2534 2535 2536
	return 0;
}

2537
#ifdef CONFIG_PM
2538 2539 2540 2541 2542
static int coda_runtime_resume(struct device *dev)
{
	struct coda_dev *cdev = dev_get_drvdata(dev);
	int ret = 0;

2543
	if (dev->pm_domain && cdev->codebuf.vaddr) {
2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556
		ret = coda_hw_init(cdev);
		if (ret)
			v4l2_err(&cdev->v4l2_dev, "HW initialization failed\n");
	}

	return ret;
}
#endif

static const struct dev_pm_ops coda_pm_ops = {
	SET_RUNTIME_PM_OPS(NULL, coda_runtime_resume, NULL)
};

2557 2558
static struct platform_driver coda_driver = {
	.probe	= coda_probe,
2559
	.remove	= coda_remove,
2560 2561 2562
	.driver	= {
		.name	= CODA_NAME,
		.of_match_table = of_match_ptr(coda_dt_ids),
2563
		.pm	= &coda_pm_ops,
2564 2565 2566 2567 2568 2569 2570 2571 2572
	},
	.id_table = coda_platform_ids,
};

module_platform_driver(coda_driver);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Javier Martin <javier.martin@vista-silicon.com>");
MODULE_DESCRIPTION("Coda multi-standard codec V4L2 driver");