3362 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Coda multi-standard codec IP4 *5 * Copyright (C) 2012 Vista Silicon S.L.6 * Javier Martin, <javier.martin@vista-silicon.com>7 * Xavier Duret8 */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.h>23#include <linux/of_platform.h>24#include <linux/platform_device.h>25#include <linux/pm_runtime.h>26#include <linux/slab.h>27#include <linux/videodev2.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 446#define CODA_MAX_FORMATS 547 48#define CODA_ISRAM_SIZE (2048 * 2)49 50#define MIN_W 4851#define MIN_H 1652 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 -> codadx6128 * i.MX51 -> codahx4129 * i.MX53 -> coda7130 * i.MX6 -> coda960131 * Use V4L2_PIX_FMT_YUV420 as placeholder for all supported YUV 4:2:0 variants132 */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 codec298 * 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_device364 *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 same458 * 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 else527 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 buffer580 * sizes (between 1 and 16 bits per pixel). This could be581 * 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 struct601 * 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:x616 */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 output673 * resolution. When decoding JPEG images, we also have to make sure to674 * 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 else751 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], vb2_get_num_buffers(vq));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 else843 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 capture945 * queue is still busy. This is not an error, but the user will have to946 * make sure themselves that the capture format is set correctly before947 * 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 as973 * 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_EOS1012 };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 sure1137 * that decoder finish_run will see the last flag and report it1138 * 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 the1147 * queue, wake up the capture queue and signal end of stream1148 * 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 else1252 wakeup = true;1253 else1254 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 written1373 * 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 else1466 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 picture1574 * 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 operations1710 */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 but1771 * 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 the1876 * 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 marks1881 * the stream end1882 */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 and1889 * level_idc from the SPS header. This allows to decide1890 * whether to enable reordering during sequence1891 * 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 queued1911 * 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 chroma2011 * 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 buffer2018 * does not contain a valid JPEG image. The error will2019 * be caught during device run and will be signalled2020 * 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 else2188 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 else2196 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 else2202 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 KiB2413 */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 else2446 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 else2505 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 the2538 * bytesused == 0. However by default videobuf2 handles bytesused2539 * equal to 0 as a special case and changes its value to the size2540 * of the buffer. Set the allow_zero_bytesused flag, so2541 * 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 that2546 * would need to be reflected in job_ready(). Currently we expect all2547 * queues to have at least one buffer queued.2548 */2549 vq->min_queued_buffers = 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 operations2598 */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 with2653 * certain streams. The issue was tracked as ENGR00293425 by2654 * 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 access2803 * 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 else2855 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 for2942 * 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 asynchronous2999 * firmware requests, report that the fallback firmware was3000 * 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_ordered_workqueue("coda", WQ_MEM_RECLAIM);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 in3282 * coda_fw_callback regardless of whether CONFIG_PM is3283 * 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 void 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}3326 3327#ifdef CONFIG_PM3328static int coda_runtime_resume(struct device *dev)3329{3330 struct coda_dev *cdev = dev_get_drvdata(dev);3331 int ret = 0;3332 3333 if (dev->pm_domain && cdev->codebuf.vaddr) {3334 ret = coda_hw_init(cdev);3335 if (ret)3336 v4l2_err(&cdev->v4l2_dev, "HW initialization failed\n");3337 }3338 3339 return ret;3340}3341#endif3342 3343static const struct dev_pm_ops coda_pm_ops = {3344 SET_RUNTIME_PM_OPS(NULL, coda_runtime_resume, NULL)3345};3346 3347static struct platform_driver coda_driver = {3348 .probe = coda_probe,3349 .remove_new = coda_remove,3350 .driver = {3351 .name = CODA_NAME,3352 .of_match_table = coda_dt_ids,3353 .pm = &coda_pm_ops,3354 },3355};3356 3357module_platform_driver(coda_driver);3358 3359MODULE_LICENSE("GPL");3360MODULE_AUTHOR("Javier Martin <javier.martin@vista-silicon.com>");3361MODULE_DESCRIPTION("Coda multi-standard codec V4L2 driver");3362