hva-v4l2.c (38098B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) STMicroelectronics SA 2015 4 * Authors: Yannick Fertre <yannick.fertre@st.com> 5 * Hugues Fruchet <hugues.fruchet@st.com> 6 */ 7 8#include <linux/module.h> 9#include <linux/mod_devicetable.h> 10#include <linux/platform_device.h> 11#include <linux/slab.h> 12#include <media/v4l2-event.h> 13#include <media/v4l2-ioctl.h> 14#include <media/videobuf2-dma-contig.h> 15 16#include "hva.h" 17#include "hva-hw.h" 18 19#define MIN_FRAMES 1 20#define MIN_STREAMS 1 21 22#define HVA_MIN_WIDTH 32 23#define HVA_MAX_WIDTH 1920 24#define HVA_MIN_HEIGHT 32 25#define HVA_MAX_HEIGHT 1920 26 27/* HVA requires a 16x16 pixels alignment for frames */ 28#define HVA_WIDTH_ALIGNMENT 16 29#define HVA_HEIGHT_ALIGNMENT 16 30 31#define HVA_DEFAULT_WIDTH HVA_MIN_WIDTH 32#define HVA_DEFAULT_HEIGHT HVA_MIN_HEIGHT 33#define HVA_DEFAULT_FRAME_NUM 1 34#define HVA_DEFAULT_FRAME_DEN 30 35 36#define to_type_str(type) (type == V4L2_BUF_TYPE_VIDEO_OUTPUT ? \ 37 "frame" : "stream") 38 39#define fh_to_ctx(f) (container_of(f, struct hva_ctx, fh)) 40 41/* registry of available encoders */ 42static const struct hva_enc *hva_encoders[] = { 43 &nv12h264enc, 44 &nv21h264enc, 45}; 46 47static inline int frame_size(u32 w, u32 h, u32 fmt) 48{ 49 switch (fmt) { 50 case V4L2_PIX_FMT_NV12: 51 case V4L2_PIX_FMT_NV21: 52 return (w * h * 3) / 2; 53 default: 54 return 0; 55 } 56} 57 58static inline int frame_stride(u32 w, u32 fmt) 59{ 60 switch (fmt) { 61 case V4L2_PIX_FMT_NV12: 62 case V4L2_PIX_FMT_NV21: 63 return w; 64 default: 65 return 0; 66 } 67} 68 69static inline int frame_alignment(u32 fmt) 70{ 71 switch (fmt) { 72 case V4L2_PIX_FMT_NV12: 73 case V4L2_PIX_FMT_NV21: 74 /* multiple of 2 */ 75 return 2; 76 default: 77 return 1; 78 } 79} 80 81static inline int estimated_stream_size(u32 w, u32 h) 82{ 83 /* 84 * HVA only encodes in YUV420 format, whatever the frame format. 85 * A compression ratio of 2 is assumed: thus, the maximum size 86 * of a stream is estimated to ((width x height x 3 / 2) / 2) 87 */ 88 return (w * h * 3) / 4; 89} 90 91static void set_default_params(struct hva_ctx *ctx) 92{ 93 struct hva_frameinfo *frameinfo = &ctx->frameinfo; 94 struct hva_streaminfo *streaminfo = &ctx->streaminfo; 95 96 frameinfo->pixelformat = V4L2_PIX_FMT_NV12; 97 frameinfo->width = HVA_DEFAULT_WIDTH; 98 frameinfo->height = HVA_DEFAULT_HEIGHT; 99 frameinfo->aligned_width = ALIGN(frameinfo->width, 100 HVA_WIDTH_ALIGNMENT); 101 frameinfo->aligned_height = ALIGN(frameinfo->height, 102 HVA_HEIGHT_ALIGNMENT); 103 frameinfo->size = frame_size(frameinfo->aligned_width, 104 frameinfo->aligned_height, 105 frameinfo->pixelformat); 106 107 streaminfo->streamformat = V4L2_PIX_FMT_H264; 108 streaminfo->width = HVA_DEFAULT_WIDTH; 109 streaminfo->height = HVA_DEFAULT_HEIGHT; 110 111 ctx->colorspace = V4L2_COLORSPACE_REC709; 112 ctx->xfer_func = V4L2_XFER_FUNC_DEFAULT; 113 ctx->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; 114 ctx->quantization = V4L2_QUANTIZATION_DEFAULT; 115 116 ctx->max_stream_size = estimated_stream_size(streaminfo->width, 117 streaminfo->height); 118} 119 120static const struct hva_enc *hva_find_encoder(struct hva_ctx *ctx, 121 u32 pixelformat, 122 u32 streamformat) 123{ 124 struct hva_dev *hva = ctx_to_hdev(ctx); 125 const struct hva_enc *enc; 126 unsigned int i; 127 128 for (i = 0; i < hva->nb_of_encoders; i++) { 129 enc = hva->encoders[i]; 130 if ((enc->pixelformat == pixelformat) && 131 (enc->streamformat == streamformat)) 132 return enc; 133 } 134 135 return NULL; 136} 137 138static void register_format(u32 format, u32 formats[], u32 *nb_of_formats) 139{ 140 u32 i; 141 bool found = false; 142 143 for (i = 0; i < *nb_of_formats; i++) { 144 if (format == formats[i]) { 145 found = true; 146 break; 147 } 148 } 149 150 if (!found) 151 formats[(*nb_of_formats)++] = format; 152} 153 154static void register_formats(struct hva_dev *hva) 155{ 156 unsigned int i; 157 158 for (i = 0; i < hva->nb_of_encoders; i++) { 159 register_format(hva->encoders[i]->pixelformat, 160 hva->pixelformats, 161 &hva->nb_of_pixelformats); 162 163 register_format(hva->encoders[i]->streamformat, 164 hva->streamformats, 165 &hva->nb_of_streamformats); 166 } 167} 168 169static void register_encoders(struct hva_dev *hva) 170{ 171 struct device *dev = hva_to_dev(hva); 172 unsigned int i; 173 174 for (i = 0; i < ARRAY_SIZE(hva_encoders); i++) { 175 if (hva->nb_of_encoders >= HVA_MAX_ENCODERS) { 176 dev_dbg(dev, 177 "%s failed to register %s encoder (%d maximum reached)\n", 178 HVA_PREFIX, hva_encoders[i]->name, 179 HVA_MAX_ENCODERS); 180 return; 181 } 182 183 hva->encoders[hva->nb_of_encoders++] = hva_encoders[i]; 184 dev_info(dev, "%s %s encoder registered\n", HVA_PREFIX, 185 hva_encoders[i]->name); 186 } 187} 188 189static int hva_open_encoder(struct hva_ctx *ctx, u32 streamformat, 190 u32 pixelformat, struct hva_enc **penc) 191{ 192 struct hva_dev *hva = ctx_to_hdev(ctx); 193 struct device *dev = ctx_to_dev(ctx); 194 struct hva_enc *enc; 195 int ret; 196 197 /* find an encoder which can deal with these formats */ 198 enc = (struct hva_enc *)hva_find_encoder(ctx, pixelformat, 199 streamformat); 200 if (!enc) { 201 dev_err(dev, "%s no encoder found matching %4.4s => %4.4s\n", 202 ctx->name, (char *)&pixelformat, (char *)&streamformat); 203 return -EINVAL; 204 } 205 206 dev_dbg(dev, "%s one encoder matching %4.4s => %4.4s\n", 207 ctx->name, (char *)&pixelformat, (char *)&streamformat); 208 209 /* update instance name */ 210 snprintf(ctx->name, sizeof(ctx->name), "[%3d:%4.4s]", 211 hva->instance_id, (char *)&streamformat); 212 213 /* open encoder instance */ 214 ret = enc->open(ctx); 215 if (ret) { 216 dev_err(dev, "%s failed to open encoder instance (%d)\n", 217 ctx->name, ret); 218 return ret; 219 } 220 221 dev_dbg(dev, "%s %s encoder opened\n", ctx->name, enc->name); 222 223 *penc = enc; 224 225 return ret; 226} 227 228static void hva_dbg_summary(struct hva_ctx *ctx) 229{ 230 struct device *dev = ctx_to_dev(ctx); 231 struct hva_streaminfo *stream = &ctx->streaminfo; 232 struct hva_frameinfo *frame = &ctx->frameinfo; 233 234 if (!(ctx->flags & HVA_FLAG_STREAMINFO)) 235 return; 236 237 dev_dbg(dev, "%s %4.4s %dx%d > %4.4s %dx%d %s %s: %d frames encoded, %d system errors, %d encoding errors, %d frame errors\n", 238 ctx->name, 239 (char *)&frame->pixelformat, 240 frame->aligned_width, frame->aligned_height, 241 (char *)&stream->streamformat, 242 stream->width, stream->height, 243 stream->profile, stream->level, 244 ctx->encoded_frames, 245 ctx->sys_errors, 246 ctx->encode_errors, 247 ctx->frame_errors); 248} 249 250/* 251 * V4L2 ioctl operations 252 */ 253 254static int hva_querycap(struct file *file, void *priv, 255 struct v4l2_capability *cap) 256{ 257 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 258 struct hva_dev *hva = ctx_to_hdev(ctx); 259 260 strscpy(cap->driver, HVA_NAME, sizeof(cap->driver)); 261 strscpy(cap->card, hva->vdev->name, sizeof(cap->card)); 262 snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", 263 hva->pdev->name); 264 265 return 0; 266} 267 268static int hva_enum_fmt_stream(struct file *file, void *priv, 269 struct v4l2_fmtdesc *f) 270{ 271 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 272 struct hva_dev *hva = ctx_to_hdev(ctx); 273 274 if (unlikely(f->index >= hva->nb_of_streamformats)) 275 return -EINVAL; 276 277 f->pixelformat = hva->streamformats[f->index]; 278 279 return 0; 280} 281 282static int hva_enum_fmt_frame(struct file *file, void *priv, 283 struct v4l2_fmtdesc *f) 284{ 285 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 286 struct hva_dev *hva = ctx_to_hdev(ctx); 287 288 if (unlikely(f->index >= hva->nb_of_pixelformats)) 289 return -EINVAL; 290 291 f->pixelformat = hva->pixelformats[f->index]; 292 293 return 0; 294} 295 296static int hva_g_fmt_stream(struct file *file, void *fh, struct v4l2_format *f) 297{ 298 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 299 struct hva_streaminfo *streaminfo = &ctx->streaminfo; 300 301 f->fmt.pix.width = streaminfo->width; 302 f->fmt.pix.height = streaminfo->height; 303 f->fmt.pix.field = V4L2_FIELD_NONE; 304 f->fmt.pix.colorspace = ctx->colorspace; 305 f->fmt.pix.xfer_func = ctx->xfer_func; 306 f->fmt.pix.ycbcr_enc = ctx->ycbcr_enc; 307 f->fmt.pix.quantization = ctx->quantization; 308 f->fmt.pix.pixelformat = streaminfo->streamformat; 309 f->fmt.pix.bytesperline = 0; 310 f->fmt.pix.sizeimage = ctx->max_stream_size; 311 312 return 0; 313} 314 315static int hva_g_fmt_frame(struct file *file, void *fh, struct v4l2_format *f) 316{ 317 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 318 struct hva_frameinfo *frameinfo = &ctx->frameinfo; 319 320 f->fmt.pix.width = frameinfo->width; 321 f->fmt.pix.height = frameinfo->height; 322 f->fmt.pix.field = V4L2_FIELD_NONE; 323 f->fmt.pix.colorspace = ctx->colorspace; 324 f->fmt.pix.xfer_func = ctx->xfer_func; 325 f->fmt.pix.ycbcr_enc = ctx->ycbcr_enc; 326 f->fmt.pix.quantization = ctx->quantization; 327 f->fmt.pix.pixelformat = frameinfo->pixelformat; 328 f->fmt.pix.bytesperline = frame_stride(frameinfo->aligned_width, 329 frameinfo->pixelformat); 330 f->fmt.pix.sizeimage = frameinfo->size; 331 332 return 0; 333} 334 335static int hva_try_fmt_stream(struct file *file, void *priv, 336 struct v4l2_format *f) 337{ 338 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 339 struct device *dev = ctx_to_dev(ctx); 340 struct v4l2_pix_format *pix = &f->fmt.pix; 341 u32 streamformat = pix->pixelformat; 342 const struct hva_enc *enc; 343 u32 width, height; 344 u32 stream_size; 345 346 enc = hva_find_encoder(ctx, ctx->frameinfo.pixelformat, streamformat); 347 if (!enc) { 348 dev_dbg(dev, 349 "%s V4L2 TRY_FMT (CAPTURE): unsupported format %.4s\n", 350 ctx->name, (char *)&pix->pixelformat); 351 return -EINVAL; 352 } 353 354 width = pix->width; 355 height = pix->height; 356 if (ctx->flags & HVA_FLAG_FRAMEINFO) { 357 /* 358 * if the frame resolution is already fixed, only allow the 359 * same stream resolution 360 */ 361 pix->width = ctx->frameinfo.width; 362 pix->height = ctx->frameinfo.height; 363 if ((pix->width != width) || (pix->height != height)) 364 dev_dbg(dev, 365 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit frame resolution\n", 366 ctx->name, width, height, 367 pix->width, pix->height); 368 } else { 369 /* adjust width & height */ 370 v4l_bound_align_image(&pix->width, 371 HVA_MIN_WIDTH, enc->max_width, 372 0, 373 &pix->height, 374 HVA_MIN_HEIGHT, enc->max_height, 375 0, 376 0); 377 378 if ((pix->width != width) || (pix->height != height)) 379 dev_dbg(dev, 380 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n", 381 ctx->name, width, height, 382 pix->width, pix->height); 383 } 384 385 stream_size = estimated_stream_size(pix->width, pix->height); 386 if (pix->sizeimage < stream_size) 387 pix->sizeimage = stream_size; 388 389 pix->bytesperline = 0; 390 pix->colorspace = ctx->colorspace; 391 pix->xfer_func = ctx->xfer_func; 392 pix->ycbcr_enc = ctx->ycbcr_enc; 393 pix->quantization = ctx->quantization; 394 pix->field = V4L2_FIELD_NONE; 395 396 return 0; 397} 398 399static int hva_try_fmt_frame(struct file *file, void *priv, 400 struct v4l2_format *f) 401{ 402 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 403 struct device *dev = ctx_to_dev(ctx); 404 struct v4l2_pix_format *pix = &f->fmt.pix; 405 u32 pixelformat = pix->pixelformat; 406 const struct hva_enc *enc; 407 u32 width, height; 408 409 enc = hva_find_encoder(ctx, pixelformat, ctx->streaminfo.streamformat); 410 if (!enc) { 411 dev_dbg(dev, 412 "%s V4L2 TRY_FMT (OUTPUT): unsupported format %.4s\n", 413 ctx->name, (char *)&pixelformat); 414 return -EINVAL; 415 } 416 417 /* adjust width & height */ 418 width = pix->width; 419 height = pix->height; 420 v4l_bound_align_image(&pix->width, 421 HVA_MIN_WIDTH, HVA_MAX_WIDTH, 422 frame_alignment(pixelformat) - 1, 423 &pix->height, 424 HVA_MIN_HEIGHT, HVA_MAX_HEIGHT, 425 frame_alignment(pixelformat) - 1, 426 0); 427 428 if ((pix->width != width) || (pix->height != height)) 429 dev_dbg(dev, 430 "%s V4L2 TRY_FMT (OUTPUT): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n", 431 ctx->name, width, height, pix->width, pix->height); 432 433 width = ALIGN(pix->width, HVA_WIDTH_ALIGNMENT); 434 height = ALIGN(pix->height, HVA_HEIGHT_ALIGNMENT); 435 436 if (!pix->colorspace) { 437 pix->colorspace = V4L2_COLORSPACE_REC709; 438 pix->xfer_func = V4L2_XFER_FUNC_DEFAULT; 439 pix->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; 440 pix->quantization = V4L2_QUANTIZATION_DEFAULT; 441 } 442 443 pix->bytesperline = frame_stride(width, pixelformat); 444 pix->sizeimage = frame_size(width, height, pixelformat); 445 pix->field = V4L2_FIELD_NONE; 446 447 return 0; 448} 449 450static int hva_s_fmt_stream(struct file *file, void *fh, struct v4l2_format *f) 451{ 452 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 453 struct device *dev = ctx_to_dev(ctx); 454 struct vb2_queue *vq; 455 int ret; 456 457 ret = hva_try_fmt_stream(file, fh, f); 458 if (ret) { 459 dev_dbg(dev, "%s V4L2 S_FMT (CAPTURE): unsupported format %.4s\n", 460 ctx->name, (char *)&f->fmt.pix.pixelformat); 461 return ret; 462 } 463 464 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); 465 if (vb2_is_streaming(vq)) { 466 dev_dbg(dev, "%s V4L2 S_FMT (CAPTURE): queue busy\n", 467 ctx->name); 468 return -EBUSY; 469 } 470 471 ctx->max_stream_size = f->fmt.pix.sizeimage; 472 ctx->streaminfo.width = f->fmt.pix.width; 473 ctx->streaminfo.height = f->fmt.pix.height; 474 ctx->streaminfo.streamformat = f->fmt.pix.pixelformat; 475 ctx->flags |= HVA_FLAG_STREAMINFO; 476 477 return 0; 478} 479 480static int hva_s_fmt_frame(struct file *file, void *fh, struct v4l2_format *f) 481{ 482 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 483 struct device *dev = ctx_to_dev(ctx); 484 struct v4l2_pix_format *pix = &f->fmt.pix; 485 struct vb2_queue *vq; 486 int ret; 487 488 ret = hva_try_fmt_frame(file, fh, f); 489 if (ret) { 490 dev_dbg(dev, "%s V4L2 S_FMT (OUTPUT): unsupported format %.4s\n", 491 ctx->name, (char *)&pix->pixelformat); 492 return ret; 493 } 494 495 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); 496 if (vb2_is_streaming(vq)) { 497 dev_dbg(dev, "%s V4L2 S_FMT (OUTPUT): queue busy\n", ctx->name); 498 return -EBUSY; 499 } 500 501 ctx->colorspace = pix->colorspace; 502 ctx->xfer_func = pix->xfer_func; 503 ctx->ycbcr_enc = pix->ycbcr_enc; 504 ctx->quantization = pix->quantization; 505 506 ctx->frameinfo.aligned_width = ALIGN(pix->width, HVA_WIDTH_ALIGNMENT); 507 ctx->frameinfo.aligned_height = ALIGN(pix->height, 508 HVA_HEIGHT_ALIGNMENT); 509 ctx->frameinfo.size = pix->sizeimage; 510 ctx->frameinfo.pixelformat = pix->pixelformat; 511 ctx->frameinfo.width = pix->width; 512 ctx->frameinfo.height = pix->height; 513 ctx->flags |= HVA_FLAG_FRAMEINFO; 514 515 return 0; 516} 517 518static int hva_g_parm(struct file *file, void *fh, struct v4l2_streamparm *sp) 519{ 520 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 521 struct v4l2_fract *time_per_frame = &ctx->ctrls.time_per_frame; 522 523 if (sp->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) 524 return -EINVAL; 525 526 sp->parm.output.capability = V4L2_CAP_TIMEPERFRAME; 527 sp->parm.output.timeperframe.numerator = time_per_frame->numerator; 528 sp->parm.output.timeperframe.denominator = 529 time_per_frame->denominator; 530 531 return 0; 532} 533 534static int hva_s_parm(struct file *file, void *fh, struct v4l2_streamparm *sp) 535{ 536 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 537 struct v4l2_fract *time_per_frame = &ctx->ctrls.time_per_frame; 538 539 if (sp->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) 540 return -EINVAL; 541 542 if (!sp->parm.output.timeperframe.numerator || 543 !sp->parm.output.timeperframe.denominator) 544 return hva_g_parm(file, fh, sp); 545 546 sp->parm.output.capability = V4L2_CAP_TIMEPERFRAME; 547 time_per_frame->numerator = sp->parm.output.timeperframe.numerator; 548 time_per_frame->denominator = 549 sp->parm.output.timeperframe.denominator; 550 551 return 0; 552} 553 554static int hva_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) 555{ 556 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 557 struct device *dev = ctx_to_dev(ctx); 558 559 if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { 560 /* 561 * depending on the targeted compressed video format, the 562 * capture buffer might contain headers (e.g. H.264 SPS/PPS) 563 * filled in by the driver client; the size of these data is 564 * copied from the bytesused field of the V4L2 buffer in the 565 * payload field of the hva stream buffer 566 */ 567 struct vb2_queue *vq; 568 struct hva_stream *stream; 569 struct vb2_buffer *vb2_buf; 570 571 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, buf->type); 572 573 if (buf->index >= vq->num_buffers) { 574 dev_dbg(dev, "%s buffer index %d out of range (%d)\n", 575 ctx->name, buf->index, vq->num_buffers); 576 return -EINVAL; 577 } 578 579 vb2_buf = vb2_get_buffer(vq, buf->index); 580 stream = to_hva_stream(to_vb2_v4l2_buffer(vb2_buf)); 581 stream->bytesused = buf->bytesused; 582 } 583 584 return v4l2_m2m_qbuf(file, ctx->fh.m2m_ctx, buf); 585} 586 587/* V4L2 ioctl ops */ 588static const struct v4l2_ioctl_ops hva_ioctl_ops = { 589 .vidioc_querycap = hva_querycap, 590 .vidioc_enum_fmt_vid_cap = hva_enum_fmt_stream, 591 .vidioc_enum_fmt_vid_out = hva_enum_fmt_frame, 592 .vidioc_g_fmt_vid_cap = hva_g_fmt_stream, 593 .vidioc_g_fmt_vid_out = hva_g_fmt_frame, 594 .vidioc_try_fmt_vid_cap = hva_try_fmt_stream, 595 .vidioc_try_fmt_vid_out = hva_try_fmt_frame, 596 .vidioc_s_fmt_vid_cap = hva_s_fmt_stream, 597 .vidioc_s_fmt_vid_out = hva_s_fmt_frame, 598 .vidioc_g_parm = hva_g_parm, 599 .vidioc_s_parm = hva_s_parm, 600 .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs, 601 .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs, 602 .vidioc_querybuf = v4l2_m2m_ioctl_querybuf, 603 .vidioc_expbuf = v4l2_m2m_ioctl_expbuf, 604 .vidioc_qbuf = hva_qbuf, 605 .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf, 606 .vidioc_streamon = v4l2_m2m_ioctl_streamon, 607 .vidioc_streamoff = v4l2_m2m_ioctl_streamoff, 608 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event, 609 .vidioc_unsubscribe_event = v4l2_event_unsubscribe, 610}; 611 612/* 613 * V4L2 control operations 614 */ 615 616static int hva_s_ctrl(struct v4l2_ctrl *ctrl) 617{ 618 struct hva_ctx *ctx = container_of(ctrl->handler, struct hva_ctx, 619 ctrl_handler); 620 struct device *dev = ctx_to_dev(ctx); 621 622 dev_dbg(dev, "%s S_CTRL: id = %d, val = %d\n", ctx->name, 623 ctrl->id, ctrl->val); 624 625 switch (ctrl->id) { 626 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: 627 ctx->ctrls.bitrate_mode = ctrl->val; 628 break; 629 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: 630 ctx->ctrls.gop_size = ctrl->val; 631 break; 632 case V4L2_CID_MPEG_VIDEO_BITRATE: 633 ctx->ctrls.bitrate = ctrl->val; 634 break; 635 case V4L2_CID_MPEG_VIDEO_ASPECT: 636 ctx->ctrls.aspect = ctrl->val; 637 break; 638 case V4L2_CID_MPEG_VIDEO_H264_PROFILE: 639 ctx->ctrls.profile = ctrl->val; 640 snprintf(ctx->streaminfo.profile, 641 sizeof(ctx->streaminfo.profile), 642 "%s profile", 643 v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]); 644 break; 645 case V4L2_CID_MPEG_VIDEO_H264_LEVEL: 646 ctx->ctrls.level = ctrl->val; 647 snprintf(ctx->streaminfo.level, 648 sizeof(ctx->streaminfo.level), 649 "level %s", 650 v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]); 651 break; 652 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE: 653 ctx->ctrls.entropy_mode = ctrl->val; 654 break; 655 case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE: 656 ctx->ctrls.cpb_size = ctrl->val; 657 break; 658 case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM: 659 ctx->ctrls.dct8x8 = ctrl->val; 660 break; 661 case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: 662 ctx->ctrls.qpmin = ctrl->val; 663 break; 664 case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: 665 ctx->ctrls.qpmax = ctrl->val; 666 break; 667 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE: 668 ctx->ctrls.vui_sar = ctrl->val; 669 break; 670 case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC: 671 ctx->ctrls.vui_sar_idc = ctrl->val; 672 break; 673 case V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING: 674 ctx->ctrls.sei_fp = ctrl->val; 675 break; 676 case V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE: 677 ctx->ctrls.sei_fp_type = ctrl->val; 678 break; 679 default: 680 dev_dbg(dev, "%s S_CTRL: invalid control (id = %d)\n", 681 ctx->name, ctrl->id); 682 return -EINVAL; 683 } 684 685 return 0; 686} 687 688/* V4L2 control ops */ 689static const struct v4l2_ctrl_ops hva_ctrl_ops = { 690 .s_ctrl = hva_s_ctrl, 691}; 692 693static int hva_ctrls_setup(struct hva_ctx *ctx) 694{ 695 struct device *dev = ctx_to_dev(ctx); 696 u64 mask; 697 enum v4l2_mpeg_video_h264_sei_fp_arrangement_type sei_fp_type = 698 V4L2_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE_TOP_BOTTOM; 699 700 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 15); 701 702 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 703 V4L2_CID_MPEG_VIDEO_BITRATE_MODE, 704 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 705 0, 706 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR); 707 708 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 709 V4L2_CID_MPEG_VIDEO_GOP_SIZE, 710 1, 60, 1, 16); 711 712 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 713 V4L2_CID_MPEG_VIDEO_BITRATE, 714 1000, 60000000, 1000, 20000000); 715 716 mask = ~(1 << V4L2_MPEG_VIDEO_ASPECT_1x1); 717 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 718 V4L2_CID_MPEG_VIDEO_ASPECT, 719 V4L2_MPEG_VIDEO_ASPECT_1x1, 720 mask, 721 V4L2_MPEG_VIDEO_ASPECT_1x1); 722 723 mask = ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) | 724 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) | 725 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) | 726 (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH)); 727 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 728 V4L2_CID_MPEG_VIDEO_H264_PROFILE, 729 V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH, 730 mask, 731 V4L2_MPEG_VIDEO_H264_PROFILE_HIGH); 732 733 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 734 V4L2_CID_MPEG_VIDEO_H264_LEVEL, 735 V4L2_MPEG_VIDEO_H264_LEVEL_4_2, 736 0, 737 V4L2_MPEG_VIDEO_H264_LEVEL_4_0); 738 739 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 740 V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE, 741 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC, 742 0, 743 V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC); 744 745 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 746 V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE, 747 1, 10000, 1, 3000); 748 749 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 750 V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM, 751 0, 1, 1, 0); 752 753 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 754 V4L2_CID_MPEG_VIDEO_H264_MIN_QP, 755 0, 51, 1, 5); 756 757 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 758 V4L2_CID_MPEG_VIDEO_H264_MAX_QP, 759 0, 51, 1, 51); 760 761 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 762 V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE, 763 0, 1, 1, 1); 764 765 mask = ~(1 << V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1); 766 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 767 V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC, 768 V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1, 769 mask, 770 V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1); 771 772 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, 773 V4L2_CID_MPEG_VIDEO_H264_SEI_FRAME_PACKING, 774 0, 1, 1, 0); 775 776 mask = ~(1 << sei_fp_type); 777 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, 778 V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE, 779 sei_fp_type, 780 mask, 781 sei_fp_type); 782 783 if (ctx->ctrl_handler.error) { 784 int err = ctx->ctrl_handler.error; 785 786 dev_dbg(dev, "%s controls setup failed (%d)\n", 787 ctx->name, err); 788 v4l2_ctrl_handler_free(&ctx->ctrl_handler); 789 return err; 790 } 791 792 v4l2_ctrl_handler_setup(&ctx->ctrl_handler); 793 794 /* set default time per frame */ 795 ctx->ctrls.time_per_frame.numerator = HVA_DEFAULT_FRAME_NUM; 796 ctx->ctrls.time_per_frame.denominator = HVA_DEFAULT_FRAME_DEN; 797 798 return 0; 799} 800 801/* 802 * mem-to-mem operations 803 */ 804 805static void hva_run_work(struct work_struct *work) 806{ 807 struct hva_ctx *ctx = container_of(work, struct hva_ctx, run_work); 808 struct vb2_v4l2_buffer *src_buf, *dst_buf; 809 const struct hva_enc *enc = ctx->enc; 810 struct hva_frame *frame; 811 struct hva_stream *stream; 812 int ret; 813 814 /* protect instance against reentrancy */ 815 mutex_lock(&ctx->lock); 816 817#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 818 hva_dbg_perf_begin(ctx); 819#endif 820 821 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); 822 dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); 823 824 frame = to_hva_frame(src_buf); 825 stream = to_hva_stream(dst_buf); 826 frame->vbuf.sequence = ctx->frame_num++; 827 828 ret = enc->encode(ctx, frame, stream); 829 830 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, stream->bytesused); 831 if (ret) { 832 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR); 833 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR); 834 } else { 835 /* propagate frame timestamp */ 836 dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp; 837 dst_buf->field = V4L2_FIELD_NONE; 838 dst_buf->sequence = ctx->stream_num - 1; 839 840 ctx->encoded_frames++; 841 842#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 843 hva_dbg_perf_end(ctx, stream); 844#endif 845 846 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE); 847 v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE); 848 } 849 850 mutex_unlock(&ctx->lock); 851 852 v4l2_m2m_job_finish(ctx->hva_dev->m2m_dev, ctx->fh.m2m_ctx); 853} 854 855static void hva_device_run(void *priv) 856{ 857 struct hva_ctx *ctx = priv; 858 struct hva_dev *hva = ctx_to_hdev(ctx); 859 860 queue_work(hva->work_queue, &ctx->run_work); 861} 862 863static void hva_job_abort(void *priv) 864{ 865 struct hva_ctx *ctx = priv; 866 struct device *dev = ctx_to_dev(ctx); 867 868 dev_dbg(dev, "%s aborting job\n", ctx->name); 869 870 ctx->aborting = true; 871} 872 873static int hva_job_ready(void *priv) 874{ 875 struct hva_ctx *ctx = priv; 876 struct device *dev = ctx_to_dev(ctx); 877 878 if (!v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx)) { 879 dev_dbg(dev, "%s job not ready: no frame buffers\n", 880 ctx->name); 881 return 0; 882 } 883 884 if (!v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx)) { 885 dev_dbg(dev, "%s job not ready: no stream buffers\n", 886 ctx->name); 887 return 0; 888 } 889 890 if (ctx->aborting) { 891 dev_dbg(dev, "%s job not ready: aborting\n", ctx->name); 892 return 0; 893 } 894 895 return 1; 896} 897 898/* mem-to-mem ops */ 899static const struct v4l2_m2m_ops hva_m2m_ops = { 900 .device_run = hva_device_run, 901 .job_abort = hva_job_abort, 902 .job_ready = hva_job_ready, 903}; 904 905/* 906 * VB2 queue operations 907 */ 908 909static int hva_queue_setup(struct vb2_queue *vq, 910 unsigned int *num_buffers, unsigned int *num_planes, 911 unsigned int sizes[], struct device *alloc_devs[]) 912{ 913 struct hva_ctx *ctx = vb2_get_drv_priv(vq); 914 struct device *dev = ctx_to_dev(ctx); 915 unsigned int size; 916 917 dev_dbg(dev, "%s %s queue setup: num_buffers %d\n", ctx->name, 918 to_type_str(vq->type), *num_buffers); 919 920 size = vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT ? 921 ctx->frameinfo.size : ctx->max_stream_size; 922 923 if (*num_planes) 924 return sizes[0] < size ? -EINVAL : 0; 925 926 /* only one plane supported */ 927 *num_planes = 1; 928 sizes[0] = size; 929 930 return 0; 931} 932 933static int hva_buf_prepare(struct vb2_buffer *vb) 934{ 935 struct hva_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); 936 struct device *dev = ctx_to_dev(ctx); 937 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 938 939 if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { 940 struct hva_frame *frame = to_hva_frame(vbuf); 941 942 if (vbuf->field == V4L2_FIELD_ANY) 943 vbuf->field = V4L2_FIELD_NONE; 944 if (vbuf->field != V4L2_FIELD_NONE) { 945 dev_dbg(dev, 946 "%s frame[%d] prepare: %d field not supported\n", 947 ctx->name, vb->index, vbuf->field); 948 return -EINVAL; 949 } 950 951 if (!frame->prepared) { 952 /* get memory addresses */ 953 frame->vaddr = vb2_plane_vaddr(&vbuf->vb2_buf, 0); 954 frame->paddr = vb2_dma_contig_plane_dma_addr( 955 &vbuf->vb2_buf, 0); 956 frame->info = ctx->frameinfo; 957 frame->prepared = true; 958 959 dev_dbg(dev, 960 "%s frame[%d] prepared; virt=%p, phy=%pad\n", 961 ctx->name, vb->index, 962 frame->vaddr, &frame->paddr); 963 } 964 } else { 965 struct hva_stream *stream = to_hva_stream(vbuf); 966 967 if (!stream->prepared) { 968 /* get memory addresses */ 969 stream->vaddr = vb2_plane_vaddr(&vbuf->vb2_buf, 0); 970 stream->paddr = vb2_dma_contig_plane_dma_addr( 971 &vbuf->vb2_buf, 0); 972 stream->size = vb2_plane_size(&vbuf->vb2_buf, 0); 973 stream->prepared = true; 974 975 dev_dbg(dev, 976 "%s stream[%d] prepared; virt=%p, phy=%pad\n", 977 ctx->name, vb->index, 978 stream->vaddr, &stream->paddr); 979 } 980 } 981 982 return 0; 983} 984 985static void hva_buf_queue(struct vb2_buffer *vb) 986{ 987 struct hva_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); 988 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb); 989 990 if (ctx->fh.m2m_ctx) 991 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); 992} 993 994static int hva_start_streaming(struct vb2_queue *vq, unsigned int count) 995{ 996 struct hva_ctx *ctx = vb2_get_drv_priv(vq); 997 struct hva_dev *hva = ctx_to_hdev(ctx); 998 struct device *dev = ctx_to_dev(ctx); 999 struct vb2_v4l2_buffer *vbuf; 1000 int ret; 1001 unsigned int i; 1002 bool found = false; 1003 1004 dev_dbg(dev, "%s %s start streaming\n", ctx->name, 1005 to_type_str(vq->type)); 1006 1007 /* open encoder when both start_streaming have been called */ 1008 if (V4L2_TYPE_IS_OUTPUT(vq->type)) { 1009 if (!vb2_start_streaming_called(&ctx->fh.m2m_ctx->cap_q_ctx.q)) 1010 return 0; 1011 } else { 1012 if (!vb2_start_streaming_called(&ctx->fh.m2m_ctx->out_q_ctx.q)) 1013 return 0; 1014 } 1015 1016 /* store the instance context in the instances array */ 1017 for (i = 0; i < HVA_MAX_INSTANCES; i++) { 1018 if (!hva->instances[i]) { 1019 hva->instances[i] = ctx; 1020 /* save the context identifier in the context */ 1021 ctx->id = i; 1022 found = true; 1023 break; 1024 } 1025 } 1026 1027 if (!found) { 1028 dev_err(dev, "%s maximum instances reached\n", ctx->name); 1029 ret = -ENOMEM; 1030 goto err; 1031 } 1032 1033 hva->nb_of_instances++; 1034 1035 if (!ctx->enc) { 1036 ret = hva_open_encoder(ctx, 1037 ctx->streaminfo.streamformat, 1038 ctx->frameinfo.pixelformat, 1039 &ctx->enc); 1040 if (ret < 0) 1041 goto err_ctx; 1042 } 1043 1044 return 0; 1045 1046err_ctx: 1047 hva->instances[ctx->id] = NULL; 1048 hva->nb_of_instances--; 1049err: 1050 if (vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { 1051 /* return of all pending buffers to vb2 (in queued state) */ 1052 while ((vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx))) 1053 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_QUEUED); 1054 } else { 1055 /* return of all pending buffers to vb2 (in queued state) */ 1056 while ((vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx))) 1057 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_QUEUED); 1058 } 1059 1060 ctx->sys_errors++; 1061 1062 return ret; 1063} 1064 1065static void hva_stop_streaming(struct vb2_queue *vq) 1066{ 1067 struct hva_ctx *ctx = vb2_get_drv_priv(vq); 1068 struct hva_dev *hva = ctx_to_hdev(ctx); 1069 struct device *dev = ctx_to_dev(ctx); 1070 const struct hva_enc *enc = ctx->enc; 1071 struct vb2_v4l2_buffer *vbuf; 1072 1073 dev_dbg(dev, "%s %s stop streaming\n", ctx->name, 1074 to_type_str(vq->type)); 1075 1076 if (vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { 1077 /* return of all pending buffers to vb2 (in error state) */ 1078 ctx->frame_num = 0; 1079 while ((vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx))) 1080 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); 1081 } else { 1082 /* return of all pending buffers to vb2 (in error state) */ 1083 ctx->stream_num = 0; 1084 while ((vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx))) 1085 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR); 1086 } 1087 1088 if ((V4L2_TYPE_IS_OUTPUT(vq->type) && 1089 vb2_is_streaming(&ctx->fh.m2m_ctx->cap_q_ctx.q)) || 1090 (V4L2_TYPE_IS_CAPTURE(vq->type) && 1091 vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q))) { 1092 dev_dbg(dev, "%s %s out=%d cap=%d\n", 1093 ctx->name, to_type_str(vq->type), 1094 vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q), 1095 vb2_is_streaming(&ctx->fh.m2m_ctx->cap_q_ctx.q)); 1096 return; 1097 } 1098 1099 /* close encoder when both stop_streaming have been called */ 1100 if (enc) { 1101 dev_dbg(dev, "%s %s encoder closed\n", ctx->name, enc->name); 1102 enc->close(ctx); 1103 ctx->enc = NULL; 1104 1105 /* clear instance context in instances array */ 1106 hva->instances[ctx->id] = NULL; 1107 hva->nb_of_instances--; 1108 } 1109 1110 ctx->aborting = false; 1111} 1112 1113/* VB2 queue ops */ 1114static const struct vb2_ops hva_qops = { 1115 .queue_setup = hva_queue_setup, 1116 .buf_prepare = hva_buf_prepare, 1117 .buf_queue = hva_buf_queue, 1118 .start_streaming = hva_start_streaming, 1119 .stop_streaming = hva_stop_streaming, 1120 .wait_prepare = vb2_ops_wait_prepare, 1121 .wait_finish = vb2_ops_wait_finish, 1122}; 1123 1124/* 1125 * V4L2 file operations 1126 */ 1127 1128static int queue_init(struct hva_ctx *ctx, struct vb2_queue *vq) 1129{ 1130 vq->io_modes = VB2_MMAP | VB2_DMABUF; 1131 vq->drv_priv = ctx; 1132 vq->ops = &hva_qops; 1133 vq->mem_ops = &vb2_dma_contig_memops; 1134 vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; 1135 vq->lock = &ctx->hva_dev->lock; 1136 1137 return vb2_queue_init(vq); 1138} 1139 1140static int hva_queue_init(void *priv, struct vb2_queue *src_vq, 1141 struct vb2_queue *dst_vq) 1142{ 1143 struct hva_ctx *ctx = priv; 1144 int ret; 1145 1146 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; 1147 src_vq->buf_struct_size = sizeof(struct hva_frame); 1148 src_vq->min_buffers_needed = MIN_FRAMES; 1149 src_vq->dev = ctx->hva_dev->dev; 1150 1151 ret = queue_init(ctx, src_vq); 1152 if (ret) 1153 return ret; 1154 1155 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 1156 dst_vq->buf_struct_size = sizeof(struct hva_stream); 1157 dst_vq->min_buffers_needed = MIN_STREAMS; 1158 dst_vq->dev = ctx->hva_dev->dev; 1159 1160 return queue_init(ctx, dst_vq); 1161} 1162 1163static int hva_open(struct file *file) 1164{ 1165 struct hva_dev *hva = video_drvdata(file); 1166 struct device *dev = hva_to_dev(hva); 1167 struct hva_ctx *ctx; 1168 int ret; 1169 1170 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); 1171 if (!ctx) { 1172 ret = -ENOMEM; 1173 goto out; 1174 } 1175 ctx->hva_dev = hva; 1176 1177 INIT_WORK(&ctx->run_work, hva_run_work); 1178 v4l2_fh_init(&ctx->fh, video_devdata(file)); 1179 file->private_data = &ctx->fh; 1180 v4l2_fh_add(&ctx->fh); 1181 1182 ret = hva_ctrls_setup(ctx); 1183 if (ret) { 1184 dev_err(dev, "%s [x:x] failed to setup controls\n", 1185 HVA_PREFIX); 1186 ctx->sys_errors++; 1187 goto err_fh; 1188 } 1189 ctx->fh.ctrl_handler = &ctx->ctrl_handler; 1190 1191 mutex_init(&ctx->lock); 1192 1193 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(hva->m2m_dev, ctx, 1194 &hva_queue_init); 1195 if (IS_ERR(ctx->fh.m2m_ctx)) { 1196 ret = PTR_ERR(ctx->fh.m2m_ctx); 1197 dev_err(dev, "%s failed to initialize m2m context (%d)\n", 1198 HVA_PREFIX, ret); 1199 ctx->sys_errors++; 1200 goto err_ctrls; 1201 } 1202 1203 /* set the instance name */ 1204 mutex_lock(&hva->lock); 1205 hva->instance_id++; 1206 snprintf(ctx->name, sizeof(ctx->name), "[%3d:----]", 1207 hva->instance_id); 1208 mutex_unlock(&hva->lock); 1209 1210 /* default parameters for frame and stream */ 1211 set_default_params(ctx); 1212 1213#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 1214 hva_dbg_ctx_create(ctx); 1215#endif 1216 1217 dev_info(dev, "%s encoder instance created\n", ctx->name); 1218 1219 return 0; 1220 1221err_ctrls: 1222 v4l2_ctrl_handler_free(&ctx->ctrl_handler); 1223err_fh: 1224 v4l2_fh_del(&ctx->fh); 1225 v4l2_fh_exit(&ctx->fh); 1226 kfree(ctx); 1227out: 1228 return ret; 1229} 1230 1231static int hva_release(struct file *file) 1232{ 1233 struct hva_ctx *ctx = fh_to_ctx(file->private_data); 1234 struct hva_dev *hva = ctx_to_hdev(ctx); 1235 struct device *dev = ctx_to_dev(ctx); 1236 const struct hva_enc *enc = ctx->enc; 1237 1238 if (enc) { 1239 dev_dbg(dev, "%s %s encoder closed\n", ctx->name, enc->name); 1240 enc->close(ctx); 1241 ctx->enc = NULL; 1242 1243 /* clear instance context in instances array */ 1244 hva->instances[ctx->id] = NULL; 1245 hva->nb_of_instances--; 1246 } 1247 1248 /* trace a summary of instance before closing (debug purpose) */ 1249 hva_dbg_summary(ctx); 1250 1251 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); 1252 1253 v4l2_ctrl_handler_free(&ctx->ctrl_handler); 1254 1255 v4l2_fh_del(&ctx->fh); 1256 v4l2_fh_exit(&ctx->fh); 1257 1258#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 1259 hva_dbg_ctx_remove(ctx); 1260#endif 1261 1262 dev_info(dev, "%s encoder instance released\n", ctx->name); 1263 1264 kfree(ctx); 1265 1266 return 0; 1267} 1268 1269/* V4L2 file ops */ 1270static const struct v4l2_file_operations hva_fops = { 1271 .owner = THIS_MODULE, 1272 .open = hva_open, 1273 .release = hva_release, 1274 .unlocked_ioctl = video_ioctl2, 1275 .mmap = v4l2_m2m_fop_mmap, 1276 .poll = v4l2_m2m_fop_poll, 1277}; 1278 1279/* 1280 * Platform device operations 1281 */ 1282 1283static int hva_register_device(struct hva_dev *hva) 1284{ 1285 int ret; 1286 struct video_device *vdev; 1287 struct device *dev; 1288 1289 if (!hva) 1290 return -ENODEV; 1291 dev = hva_to_dev(hva); 1292 1293 hva->m2m_dev = v4l2_m2m_init(&hva_m2m_ops); 1294 if (IS_ERR(hva->m2m_dev)) { 1295 dev_err(dev, "%s failed to initialize v4l2-m2m device\n", 1296 HVA_PREFIX); 1297 ret = PTR_ERR(hva->m2m_dev); 1298 goto err; 1299 } 1300 1301 vdev = video_device_alloc(); 1302 if (!vdev) { 1303 dev_err(dev, "%s failed to allocate video device\n", 1304 HVA_PREFIX); 1305 ret = -ENOMEM; 1306 goto err_m2m_release; 1307 } 1308 1309 vdev->fops = &hva_fops; 1310 vdev->ioctl_ops = &hva_ioctl_ops; 1311 vdev->release = video_device_release; 1312 vdev->lock = &hva->lock; 1313 vdev->vfl_dir = VFL_DIR_M2M; 1314 vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M; 1315 vdev->v4l2_dev = &hva->v4l2_dev; 1316 snprintf(vdev->name, sizeof(vdev->name), "%s%lx", HVA_NAME, 1317 hva->ip_version); 1318 1319 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); 1320 if (ret) { 1321 dev_err(dev, "%s failed to register video device\n", 1322 HVA_PREFIX); 1323 goto err_vdev_release; 1324 } 1325 1326 hva->vdev = vdev; 1327 video_set_drvdata(vdev, hva); 1328 return 0; 1329 1330err_vdev_release: 1331 video_device_release(vdev); 1332err_m2m_release: 1333 v4l2_m2m_release(hva->m2m_dev); 1334err: 1335 return ret; 1336} 1337 1338static void hva_unregister_device(struct hva_dev *hva) 1339{ 1340 if (!hva) 1341 return; 1342 1343 if (hva->m2m_dev) 1344 v4l2_m2m_release(hva->m2m_dev); 1345 1346 video_unregister_device(hva->vdev); 1347} 1348 1349static int hva_probe(struct platform_device *pdev) 1350{ 1351 struct hva_dev *hva; 1352 struct device *dev = &pdev->dev; 1353 int ret; 1354 1355 hva = devm_kzalloc(dev, sizeof(*hva), GFP_KERNEL); 1356 if (!hva) { 1357 ret = -ENOMEM; 1358 goto err; 1359 } 1360 1361 ret = dma_coerce_mask_and_coherent(dev, DMA_BIT_MASK(32)); 1362 if (ret) 1363 return ret; 1364 1365 hva->dev = dev; 1366 hva->pdev = pdev; 1367 platform_set_drvdata(pdev, hva); 1368 1369 mutex_init(&hva->lock); 1370 1371 /* probe hardware */ 1372 ret = hva_hw_probe(pdev, hva); 1373 if (ret) 1374 goto err; 1375 1376 /* register all available encoders */ 1377 register_encoders(hva); 1378 1379 /* register all supported formats */ 1380 register_formats(hva); 1381 1382 /* register on V4L2 */ 1383 ret = v4l2_device_register(dev, &hva->v4l2_dev); 1384 if (ret) { 1385 dev_err(dev, "%s %s failed to register V4L2 device\n", 1386 HVA_PREFIX, HVA_NAME); 1387 goto err_hw; 1388 } 1389 1390#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 1391 hva_debugfs_create(hva); 1392#endif 1393 1394 hva->work_queue = create_workqueue(HVA_NAME); 1395 if (!hva->work_queue) { 1396 dev_err(dev, "%s %s failed to allocate work queue\n", 1397 HVA_PREFIX, HVA_NAME); 1398 ret = -ENOMEM; 1399 goto err_v4l2; 1400 } 1401 1402 /* register device */ 1403 ret = hva_register_device(hva); 1404 if (ret) 1405 goto err_work_queue; 1406 1407 dev_info(dev, "%s %s registered as /dev/video%d\n", HVA_PREFIX, 1408 HVA_NAME, hva->vdev->num); 1409 1410 return 0; 1411 1412err_work_queue: 1413 destroy_workqueue(hva->work_queue); 1414err_v4l2: 1415#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 1416 hva_debugfs_remove(hva); 1417#endif 1418 v4l2_device_unregister(&hva->v4l2_dev); 1419err_hw: 1420 hva_hw_remove(hva); 1421err: 1422 return ret; 1423} 1424 1425static int hva_remove(struct platform_device *pdev) 1426{ 1427 struct hva_dev *hva = platform_get_drvdata(pdev); 1428 struct device *dev = hva_to_dev(hva); 1429 1430 hva_unregister_device(hva); 1431 1432 destroy_workqueue(hva->work_queue); 1433 1434 hva_hw_remove(hva); 1435 1436#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 1437 hva_debugfs_remove(hva); 1438#endif 1439 1440 v4l2_device_unregister(&hva->v4l2_dev); 1441 1442 dev_info(dev, "%s %s removed\n", HVA_PREFIX, pdev->name); 1443 1444 return 0; 1445} 1446 1447/* PM ops */ 1448static const struct dev_pm_ops hva_pm_ops = { 1449 .runtime_suspend = hva_hw_runtime_suspend, 1450 .runtime_resume = hva_hw_runtime_resume, 1451}; 1452 1453static const struct of_device_id hva_match_types[] = { 1454 { 1455 .compatible = "st,st-hva", 1456 }, 1457 { /* end node */ } 1458}; 1459 1460MODULE_DEVICE_TABLE(of, hva_match_types); 1461 1462static struct platform_driver hva_driver = { 1463 .probe = hva_probe, 1464 .remove = hva_remove, 1465 .driver = { 1466 .name = HVA_NAME, 1467 .of_match_table = hva_match_types, 1468 .pm = &hva_pm_ops, 1469 }, 1470}; 1471 1472module_platform_driver(hva_driver); 1473 1474MODULE_LICENSE("GPL"); 1475MODULE_AUTHOR("Yannick Fertre <yannick.fertre@st.com>"); 1476MODULE_DESCRIPTION("STMicroelectronics HVA video encoder V4L2 driver");