hc
2024-05-10 23fa18eaa71266feff7ba8d83022d9e1cc83c65a
kernel/drivers/media/platform/qcom/venus/venc.c
....@@ -1,16 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
34 * Copyright (C) 2017 Linaro Ltd.
4
- *
5
- * This program is free software; you can redistribute it and/or modify
6
- * it under the terms of the GNU General Public License version 2 and
7
- * only version 2 as published by the Free Software Foundation.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
145 */
156 #include <linux/clk.h>
167 #include <linux/module.h>
....@@ -29,6 +20,7 @@
2920 #include "core.h"
3021 #include "helpers.h"
3122 #include "venc.h"
23
+#include "pm_helpers.h"
3224
3325 #define NUM_B_FRAMES_MAX 4
3426
....@@ -121,80 +113,6 @@
121113 static int venc_v4l2_to_hfi(int id, int value)
122114 {
123115 switch (id) {
124
- case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
125
- switch (value) {
126
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0:
127
- default:
128
- return HFI_MPEG4_LEVEL_0;
129
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B:
130
- return HFI_MPEG4_LEVEL_0b;
131
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_1:
132
- return HFI_MPEG4_LEVEL_1;
133
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_2:
134
- return HFI_MPEG4_LEVEL_2;
135
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_3:
136
- return HFI_MPEG4_LEVEL_3;
137
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_4:
138
- return HFI_MPEG4_LEVEL_4;
139
- case V4L2_MPEG_VIDEO_MPEG4_LEVEL_5:
140
- return HFI_MPEG4_LEVEL_5;
141
- }
142
- case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
143
- switch (value) {
144
- case V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE:
145
- default:
146
- return HFI_MPEG4_PROFILE_SIMPLE;
147
- case V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE:
148
- return HFI_MPEG4_PROFILE_ADVANCEDSIMPLE;
149
- }
150
- case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
151
- switch (value) {
152
- case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
153
- return HFI_H264_PROFILE_BASELINE;
154
- case V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE:
155
- return HFI_H264_PROFILE_CONSTRAINED_BASE;
156
- case V4L2_MPEG_VIDEO_H264_PROFILE_MAIN:
157
- return HFI_H264_PROFILE_MAIN;
158
- case V4L2_MPEG_VIDEO_H264_PROFILE_HIGH:
159
- default:
160
- return HFI_H264_PROFILE_HIGH;
161
- }
162
- case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
163
- switch (value) {
164
- case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
165
- return HFI_H264_LEVEL_1;
166
- case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
167
- return HFI_H264_LEVEL_1b;
168
- case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
169
- return HFI_H264_LEVEL_11;
170
- case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
171
- return HFI_H264_LEVEL_12;
172
- case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
173
- return HFI_H264_LEVEL_13;
174
- case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
175
- return HFI_H264_LEVEL_2;
176
- case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
177
- return HFI_H264_LEVEL_21;
178
- case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
179
- return HFI_H264_LEVEL_22;
180
- case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
181
- return HFI_H264_LEVEL_3;
182
- case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
183
- return HFI_H264_LEVEL_31;
184
- case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
185
- return HFI_H264_LEVEL_32;
186
- case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
187
- return HFI_H264_LEVEL_4;
188
- case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
189
- return HFI_H264_LEVEL_41;
190
- case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
191
- return HFI_H264_LEVEL_42;
192
- case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
193
- default:
194
- return HFI_H264_LEVEL_5;
195
- case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
196
- return HFI_H264_LEVEL_51;
197
- }
198116 case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
199117 switch (value) {
200118 case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC:
....@@ -202,18 +120,6 @@
202120 return HFI_H264_ENTROPY_CAVLC;
203121 case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC:
204122 return HFI_H264_ENTROPY_CABAC;
205
- }
206
- case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
207
- switch (value) {
208
- case 0:
209
- default:
210
- return HFI_VPX_PROFILE_VERSION_0;
211
- case 1:
212
- return HFI_VPX_PROFILE_VERSION_1;
213
- case 2:
214
- return HFI_VPX_PROFILE_VERSION_2;
215
- case 3:
216
- return HFI_VPX_PROFILE_VERSION_3;
217123 }
218124 case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
219125 switch (value) {
....@@ -225,46 +131,6 @@
225131 case V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED_AT_SLICE_BOUNDARY:
226132 return HFI_H264_DB_MODE_SKIP_SLICE_BOUNDARY;
227133 }
228
- case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
229
- switch (value) {
230
- case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN:
231
- default:
232
- return HFI_HEVC_PROFILE_MAIN;
233
- case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE:
234
- return HFI_HEVC_PROFILE_MAIN_STILL_PIC;
235
- case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10:
236
- return HFI_HEVC_PROFILE_MAIN10;
237
- }
238
- case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
239
- switch (value) {
240
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
241
- default:
242
- return HFI_HEVC_LEVEL_1;
243
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
244
- return HFI_HEVC_LEVEL_2;
245
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
246
- return HFI_HEVC_LEVEL_21;
247
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
248
- return HFI_HEVC_LEVEL_3;
249
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
250
- return HFI_HEVC_LEVEL_31;
251
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
252
- return HFI_HEVC_LEVEL_4;
253
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
254
- return HFI_HEVC_LEVEL_41;
255
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
256
- return HFI_HEVC_LEVEL_5;
257
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
258
- return HFI_HEVC_LEVEL_51;
259
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2:
260
- return HFI_HEVC_LEVEL_52;
261
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_6:
262
- return HFI_HEVC_LEVEL_6;
263
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_6_1:
264
- return HFI_HEVC_LEVEL_61;
265
- case V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2:
266
- return HFI_HEVC_LEVEL_62;
267
- }
268134 }
269135
270136 return 0;
....@@ -273,9 +139,9 @@
273139 static int
274140 venc_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
275141 {
276
- strlcpy(cap->driver, "qcom-venus", sizeof(cap->driver));
277
- strlcpy(cap->card, "Qualcomm Venus video encoder", sizeof(cap->card));
278
- strlcpy(cap->bus_info, "platform:qcom-venus", sizeof(cap->bus_info));
142
+ strscpy(cap->driver, "qcom-venus", sizeof(cap->driver));
143
+ strscpy(cap->card, "Qualcomm Venus video encoder", sizeof(cap->card));
144
+ strscpy(cap->bus_info, "platform:qcom-venus", sizeof(cap->bus_info));
279145
280146 return 0;
281147 }
....@@ -303,6 +169,7 @@
303169 struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
304170 struct v4l2_plane_pix_format *pfmt = pixmp->plane_fmt;
305171 const struct venus_format *fmt;
172
+ u32 sizeimage;
306173
307174 memset(pfmt[0].reserved, 0, sizeof(pfmt[0].reserved));
308175 memset(pixmp->reserved, 0, sizeof(pixmp->reserved));
....@@ -336,9 +203,10 @@
336203 pixmp->num_planes = fmt->num_planes;
337204 pixmp->flags = 0;
338205
339
- pfmt[0].sizeimage = venus_helper_get_framesz(pixmp->pixelformat,
340
- pixmp->width,
341
- pixmp->height);
206
+ sizeimage = venus_helper_get_framesz(pixmp->pixelformat,
207
+ pixmp->width,
208
+ pixmp->height);
209
+ pfmt[0].sizeimage = max(ALIGN(pfmt[0].sizeimage, SZ_4K), sizeimage);
342210
343211 if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
344212 pfmt[0].bytesperline = ALIGN(pixmp->width, 128);
....@@ -365,6 +233,14 @@
365233 const struct venus_format *fmt;
366234 struct v4l2_format format;
367235 u32 pixfmt_out = 0, pixfmt_cap = 0;
236
+ struct vb2_queue *q;
237
+
238
+ q = v4l2_m2m_get_vq(inst->m2m_ctx, f->type);
239
+ if (!q)
240
+ return -EINVAL;
241
+
242
+ if (vb2_is_busy(q))
243
+ return -EBUSY;
368244
369245 orig_pixmp = *pixmp;
370246
....@@ -410,8 +286,10 @@
410286
411287 if (f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
412288 inst->fmt_out = fmt;
413
- else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
289
+ else if (f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
414290 inst->fmt_cap = fmt;
291
+ inst->output_buf_size = pixmp->plane_fmt[0].sizeimage;
292
+ }
415293
416294 return 0;
417295 }
....@@ -582,6 +460,7 @@
582460 {
583461 struct venus_inst *inst = to_inst(file);
584462 const struct venus_format *fmt;
463
+ unsigned int framerate_factor = 1;
585464
586465 fival->type = V4L2_FRMIVAL_TYPE_STEPWISE;
587466
....@@ -606,20 +485,25 @@
606485 fival->height < frame_height_min(inst))
607486 return -EINVAL;
608487
488
+ if (IS_V1(inst->core)) {
489
+ /* framerate is reported in 1/65535 fps unit */
490
+ framerate_factor = (1 << 16);
491
+ }
492
+
609493 fival->stepwise.min.numerator = 1;
610
- fival->stepwise.min.denominator = frate_max(inst);
494
+ fival->stepwise.min.denominator = frate_max(inst) / framerate_factor;
611495 fival->stepwise.max.numerator = 1;
612
- fival->stepwise.max.denominator = frate_min(inst);
496
+ fival->stepwise.max.denominator = frate_min(inst) / framerate_factor;
613497 fival->stepwise.step.numerator = 1;
614
- fival->stepwise.step.denominator = frate_max(inst);
498
+ fival->stepwise.step.denominator = frate_max(inst) / framerate_factor;
615499
616500 return 0;
617501 }
618502
619503 static const struct v4l2_ioctl_ops venc_ioctl_ops = {
620504 .vidioc_querycap = venc_querycap,
621
- .vidioc_enum_fmt_vid_cap_mplane = venc_enum_fmt,
622
- .vidioc_enum_fmt_vid_out_mplane = venc_enum_fmt,
505
+ .vidioc_enum_fmt_vid_cap = venc_enum_fmt,
506
+ .vidioc_enum_fmt_vid_out = venc_enum_fmt,
623507 .vidioc_s_fmt_vid_cap_mplane = venc_s_fmt,
624508 .vidioc_s_fmt_vid_out_mplane = venc_s_fmt,
625509 .vidioc_g_fmt_vid_cap_mplane = venc_g_fmt,
....@@ -649,18 +533,16 @@
649533 {
650534 struct venc_controls *ctr = &inst->controls.enc;
651535 struct hfi_intra_period intra_period;
652
- struct hfi_profile_level pl;
653536 struct hfi_framerate frate;
654537 struct hfi_bitrate brate;
655538 struct hfi_idr_period idrp;
656
- u32 ptype, rate_control, bitrate, profile = 0, level = 0;
539
+ struct hfi_quantization quant;
540
+ struct hfi_quantization_range quant_range;
541
+ u32 ptype, rate_control, bitrate;
542
+ u32 profile, level;
657543 int ret;
658544
659545 ret = venus_helper_set_work_mode(inst, VIDC_WORK_MODE_2);
660
- if (ret)
661
- return ret;
662
-
663
- ret = venus_helper_set_core_usage(inst, VIDC_CORE_ID_2);
664546 if (ret)
665547 return ret;
666548
....@@ -736,15 +618,31 @@
736618 if (ret)
737619 return ret;
738620
739
- if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
740
- rate_control = HFI_RATE_CONTROL_VBR_CFR;
741
- else
742
- rate_control = HFI_RATE_CONTROL_CBR_CFR;
621
+ if (!ctr->rc_enable)
622
+ rate_control = HFI_RATE_CONTROL_OFF;
623
+ else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
624
+ rate_control = ctr->frame_skip_mode ? HFI_RATE_CONTROL_VBR_VFR :
625
+ HFI_RATE_CONTROL_VBR_CFR;
626
+ else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
627
+ rate_control = ctr->frame_skip_mode ? HFI_RATE_CONTROL_CBR_VFR :
628
+ HFI_RATE_CONTROL_CBR_CFR;
629
+ else if (ctr->bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ)
630
+ rate_control = HFI_RATE_CONTROL_CQ;
743631
744632 ptype = HFI_PROPERTY_PARAM_VENC_RATE_CONTROL;
745633 ret = hfi_session_set_property(inst, ptype, &rate_control);
746634 if (ret)
747635 return ret;
636
+
637
+ if (rate_control == HFI_RATE_CONTROL_CQ && ctr->const_quality) {
638
+ struct hfi_heic_frame_quality quality = {};
639
+
640
+ ptype = HFI_PROPERTY_CONFIG_HEIC_FRAME_QUALITY;
641
+ quality.frame_quality = ctr->const_quality;
642
+ ret = hfi_session_set_property(inst, ptype, &quality);
643
+ if (ret)
644
+ return ret;
645
+ }
748646
749647 if (!ctr->bitrate)
750648 bitrate = 64000;
....@@ -772,35 +670,52 @@
772670 if (ret)
773671 return ret;
774672
775
- if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264) {
776
- profile = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_H264_PROFILE,
777
- ctr->profile.h264);
778
- level = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_H264_LEVEL,
779
- ctr->level.h264);
780
- } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_VP8) {
781
- profile = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_VP8_PROFILE,
782
- ctr->profile.vpx);
673
+ ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP;
674
+ quant.qp_i = ctr->h264_i_qp;
675
+ quant.qp_p = ctr->h264_p_qp;
676
+ quant.qp_b = ctr->h264_b_qp;
677
+ quant.layer_id = 0;
678
+ ret = hfi_session_set_property(inst, ptype, &quant);
679
+ if (ret)
680
+ return ret;
681
+
682
+ ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE;
683
+ quant_range.min_qp = ctr->h264_min_qp;
684
+ quant_range.max_qp = ctr->h264_max_qp;
685
+ quant_range.layer_id = 0;
686
+ ret = hfi_session_set_property(inst, ptype, &quant_range);
687
+ if (ret)
688
+ return ret;
689
+
690
+ switch (inst->hfi_codec) {
691
+ case HFI_VIDEO_CODEC_H264:
692
+ profile = ctr->profile.h264;
693
+ level = ctr->level.h264;
694
+ break;
695
+ case HFI_VIDEO_CODEC_MPEG4:
696
+ profile = ctr->profile.mpeg4;
697
+ level = ctr->level.mpeg4;
698
+ break;
699
+ case HFI_VIDEO_CODEC_VP8:
700
+ profile = ctr->profile.vp8;
783701 level = 0;
784
- } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_MPEG4) {
785
- profile = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
786
- ctr->profile.mpeg4);
787
- level = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
788
- ctr->level.mpeg4);
789
- } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H263) {
702
+ break;
703
+ case HFI_VIDEO_CODEC_VP9:
704
+ profile = ctr->profile.vp9;
705
+ level = ctr->level.vp9;
706
+ break;
707
+ case HFI_VIDEO_CODEC_HEVC:
708
+ profile = ctr->profile.hevc;
709
+ level = ctr->level.hevc;
710
+ break;
711
+ case HFI_VIDEO_CODEC_MPEG2:
712
+ default:
790713 profile = 0;
791714 level = 0;
792
- } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) {
793
- profile = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
794
- ctr->profile.hevc);
795
- level = venc_v4l2_to_hfi(V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
796
- ctr->level.hevc);
715
+ break;
797716 }
798717
799
- ptype = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT;
800
- pl.profile = profile;
801
- pl.level = level;
802
-
803
- ret = hfi_session_set_property(inst, ptype, &pl);
718
+ ret = venus_helper_set_profile_level(inst, profile, level);
804719 if (ret)
805720 return ret;
806721
....@@ -827,6 +742,10 @@
827742 goto deinit;
828743
829744 ret = venus_helper_set_color_format(inst, inst->fmt_out->pixfmt);
745
+ if (ret)
746
+ goto deinit;
747
+
748
+ ret = venus_helper_init_codec_freq_data(inst);
830749 if (ret)
831750 goto deinit;
832751
....@@ -910,6 +829,7 @@
910829 sizes[0] = venus_helper_get_framesz(inst->fmt_cap->pixfmt,
911830 inst->width,
912831 inst->height);
832
+ sizes[0] = max(sizes[0], inst->output_buf_size);
913833 inst->output_buf_size = sizes[0];
914834 break;
915835 default:
....@@ -974,6 +894,10 @@
974894 if (ret)
975895 goto bufs_done;
976896
897
+ ret = venus_pm_acquire_core(inst);
898
+ if (ret)
899
+ goto deinit_sess;
900
+
977901 ret = venc_set_properties(inst);
978902 if (ret)
979903 goto deinit_sess;
....@@ -998,7 +922,7 @@
998922 deinit_sess:
999923 hfi_session_deinit(inst);
1000924 bufs_done:
1001
- venus_helper_buffers_done(inst, VB2_BUF_STATE_QUEUED);
925
+ venus_helper_buffers_done(inst, q->type, VB2_BUF_STATE_QUEUED);
1002926 if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
1003927 inst->streamon_out = 0;
1004928 else
....@@ -1076,7 +1000,7 @@
10761000 int ret;
10771001
10781002 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1079
- src_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1003
+ src_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
10801004 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
10811005 src_vq->ops = &venc_vb2_ops;
10821006 src_vq->mem_ops = &vb2_dma_sg_memops;
....@@ -1092,7 +1016,7 @@
10921016 return ret;
10931017
10941018 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1095
- dst_vq->io_modes = VB2_MMAP | VB2_DMABUF;
1019
+ dst_vq->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
10961020 dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
10971021 dst_vq->ops = &venc_vb2_ops;
10981022 dst_vq->mem_ops = &vb2_dma_sg_memops;
....@@ -1101,13 +1025,7 @@
11011025 dst_vq->allow_zero_bytesused = 1;
11021026 dst_vq->min_buffers_needed = 1;
11031027 dst_vq->dev = inst->core->dev;
1104
- ret = vb2_queue_init(dst_vq);
1105
- if (ret) {
1106
- vb2_queue_release(src_vq);
1107
- return ret;
1108
- }
1109
-
1110
- return 0;
1028
+ return vb2_queue_init(dst_vq);
11111029 }
11121030
11131031 static void venc_inst_init(struct venus_inst *inst)
....@@ -1142,12 +1060,14 @@
11421060
11431061 inst->core = core;
11441062 inst->session_type = VIDC_SESSION_TYPE_ENC;
1063
+ inst->clk_data.core_id = VIDC_CORE_ID_DEFAULT;
1064
+ inst->core_acquired = false;
11451065
11461066 venus_helper_init_instance(inst);
11471067
11481068 ret = pm_runtime_get_sync(core->dev_enc);
11491069 if (ret < 0)
1150
- goto err_free_inst;
1070
+ goto err_put_sync;
11511071
11521072 ret = venc_ctrl_init(inst);
11531073 if (ret)
....@@ -1192,7 +1112,6 @@
11921112 venc_ctrl_deinit(inst);
11931113 err_put_sync:
11941114 pm_runtime_put_sync(core->dev_enc);
1195
-err_free_inst:
11961115 kfree(inst);
11971116 return ret;
11981117 }
....@@ -1238,25 +1157,19 @@
12381157 if (!core)
12391158 return -EPROBE_DEFER;
12401159
1241
- if (IS_V3(core) || IS_V4(core)) {
1242
- core->core1_clk = devm_clk_get(dev, "core");
1243
- if (IS_ERR(core->core1_clk))
1244
- return PTR_ERR(core->core1_clk);
1245
- }
1246
-
1247
- if (IS_V4(core)) {
1248
- core->core1_bus_clk = devm_clk_get(dev, "bus");
1249
- if (IS_ERR(core->core1_bus_clk))
1250
- return PTR_ERR(core->core1_bus_clk);
1251
- }
1252
-
12531160 platform_set_drvdata(pdev, core);
1161
+
1162
+ if (core->pm_ops->venc_get) {
1163
+ ret = core->pm_ops->venc_get(dev);
1164
+ if (ret)
1165
+ return ret;
1166
+ }
12541167
12551168 vdev = video_device_alloc();
12561169 if (!vdev)
12571170 return -ENOMEM;
12581171
1259
- strlcpy(vdev->name, "qcom-venus-encoder", sizeof(vdev->name));
1172
+ strscpy(vdev->name, "qcom-venus-encoder", sizeof(vdev->name));
12601173 vdev->release = video_device_release;
12611174 vdev->fops = &venc_fops;
12621175 vdev->ioctl_ops = &venc_ioctl_ops;
....@@ -1264,7 +1177,7 @@
12641177 vdev->v4l2_dev = &core->v4l2_dev;
12651178 vdev->device_caps = V4L2_CAP_VIDEO_M2M_MPLANE | V4L2_CAP_STREAMING;
12661179
1267
- ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
1180
+ ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
12681181 if (ret)
12691182 goto err_vdev_release;
12701183
....@@ -1288,57 +1201,33 @@
12881201 video_unregister_device(core->vdev_enc);
12891202 pm_runtime_disable(core->dev_enc);
12901203
1204
+ if (core->pm_ops->venc_put)
1205
+ core->pm_ops->venc_put(core->dev_enc);
1206
+
12911207 return 0;
12921208 }
12931209
12941210 static __maybe_unused int venc_runtime_suspend(struct device *dev)
12951211 {
12961212 struct venus_core *core = dev_get_drvdata(dev);
1297
- int ret;
1213
+ const struct venus_pm_ops *pm_ops = core->pm_ops;
1214
+ int ret = 0;
12981215
1299
- if (IS_V1(core))
1300
- return 0;
1216
+ if (pm_ops->venc_power)
1217
+ ret = pm_ops->venc_power(dev, POWER_OFF);
13011218
1302
- ret = venus_helper_power_enable(core, VIDC_SESSION_TYPE_ENC, true);
1303
- if (ret)
1304
- return ret;
1305
-
1306
- if (IS_V4(core))
1307
- clk_disable_unprepare(core->core1_bus_clk);
1308
-
1309
- clk_disable_unprepare(core->core1_clk);
1310
-
1311
- return venus_helper_power_enable(core, VIDC_SESSION_TYPE_ENC, false);
1219
+ return ret;
13121220 }
13131221
13141222 static __maybe_unused int venc_runtime_resume(struct device *dev)
13151223 {
13161224 struct venus_core *core = dev_get_drvdata(dev);
1317
- int ret;
1225
+ const struct venus_pm_ops *pm_ops = core->pm_ops;
1226
+ int ret = 0;
13181227
1319
- if (IS_V1(core))
1320
- return 0;
1228
+ if (pm_ops->venc_power)
1229
+ ret = pm_ops->venc_power(dev, POWER_ON);
13211230
1322
- ret = venus_helper_power_enable(core, VIDC_SESSION_TYPE_ENC, true);
1323
- if (ret)
1324
- return ret;
1325
-
1326
- ret = clk_prepare_enable(core->core1_clk);
1327
- if (ret)
1328
- goto err_power_disable;
1329
-
1330
- if (IS_V4(core))
1331
- ret = clk_prepare_enable(core->core1_bus_clk);
1332
-
1333
- if (ret)
1334
- goto err_unprepare_core1;
1335
-
1336
- return venus_helper_power_enable(core, VIDC_SESSION_TYPE_ENC, false);
1337
-
1338
-err_unprepare_core1:
1339
- clk_disable_unprepare(core->core1_clk);
1340
-err_power_disable:
1341
- venus_helper_power_enable(core, VIDC_SESSION_TYPE_ENC, false);
13421231 return ret;
13431232 }
13441233