1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Cedrus VPU driver 4 * 5 * Copyright (C) 2016 Florent Revest <florent.revest@free-electrons.com> 6 * Copyright (C) 2018 Paul Kocialkowski <paul.kocialkowski@bootlin.com> 7 * Copyright (C) 2018 Bootlin 8 * 9 * Based on the vim2m driver, that is: 10 * 11 * Copyright (c) 2009-2010 Samsung Electronics Co., Ltd. 12 * Pawel Osciak, <pawel@osciak.com> 13 * Marek Szyprowski, <m.szyprowski@samsung.com> 14 */ 15 16 #include <media/v4l2-device.h> 17 #include <media/v4l2-ioctl.h> 18 #include <media/v4l2-event.h> 19 #include <media/v4l2-mem2mem.h> 20 21 #include "cedrus.h" 22 #include "cedrus_dec.h" 23 #include "cedrus_hw.h" 24 25 void cedrus_device_run(void *priv) 26 { 27 struct cedrus_ctx *ctx = priv; 28 struct cedrus_dev *dev = ctx->dev; 29 struct cedrus_run run = {}; 30 struct media_request *src_req; 31 32 run.src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); 33 run.dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); 34 35 /* Apply request(s) controls if needed. */ 36 src_req = run.src->vb2_buf.req_obj.req; 37 38 if (src_req) 39 v4l2_ctrl_request_setup(src_req, &ctx->hdl); 40 41 switch (ctx->src_fmt.pixelformat) { 42 case V4L2_PIX_FMT_MPEG2_SLICE: 43 run.mpeg2.slice_params = cedrus_find_control_data(ctx, 44 V4L2_CID_MPEG_VIDEO_MPEG2_SLICE_PARAMS); 45 run.mpeg2.quantization = cedrus_find_control_data(ctx, 46 V4L2_CID_MPEG_VIDEO_MPEG2_QUANTIZATION); 47 break; 48 49 case V4L2_PIX_FMT_H264_SLICE: 50 run.h264.decode_params = cedrus_find_control_data(ctx, 51 V4L2_CID_STATELESS_H264_DECODE_PARAMS); 52 run.h264.pps = cedrus_find_control_data(ctx, 53 V4L2_CID_STATELESS_H264_PPS); 54 run.h264.scaling_matrix = cedrus_find_control_data(ctx, 55 V4L2_CID_STATELESS_H264_SCALING_MATRIX); 56 run.h264.slice_params = cedrus_find_control_data(ctx, 57 V4L2_CID_STATELESS_H264_SLICE_PARAMS); 58 run.h264.sps = cedrus_find_control_data(ctx, 59 V4L2_CID_STATELESS_H264_SPS); 60 run.h264.pred_weights = cedrus_find_control_data(ctx, 61 V4L2_CID_STATELESS_H264_PRED_WEIGHTS); 62 break; 63 64 case V4L2_PIX_FMT_HEVC_SLICE: 65 run.h265.sps = cedrus_find_control_data(ctx, 66 V4L2_CID_MPEG_VIDEO_HEVC_SPS); 67 run.h265.pps = cedrus_find_control_data(ctx, 68 V4L2_CID_MPEG_VIDEO_HEVC_PPS); 69 run.h265.slice_params = cedrus_find_control_data(ctx, 70 V4L2_CID_MPEG_VIDEO_HEVC_SLICE_PARAMS); 71 break; 72 73 case V4L2_PIX_FMT_VP8_FRAME: 74 run.vp8.frame_params = cedrus_find_control_data(ctx, 75 V4L2_CID_MPEG_VIDEO_VP8_FRAME_HEADER); 76 break; 77 78 default: 79 break; 80 } 81 82 v4l2_m2m_buf_copy_metadata(run.src, run.dst, true); 83 84 cedrus_dst_format_set(dev, &ctx->dst_fmt); 85 86 dev->dec_ops[ctx->current_codec]->setup(ctx, &run); 87 88 /* Complete request(s) controls if needed. */ 89 90 if (src_req) 91 v4l2_ctrl_request_complete(src_req, &ctx->hdl); 92 93 dev->dec_ops[ctx->current_codec]->trigger(ctx); 94 } 95