From nobody Sun Dec 14 08:04:34 2025 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 574C42F4A06; Wed, 13 Aug 2025 09:39:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755077980; cv=none; b=RBAoYpVxFhFWX9ikorCJlpBrizx0b9qYTwg8ymV918rLNTG0OgP/bgOlWTBY0tG0uUPTgx9XX+m5V8+tKfpqOBKQ5GC+B6H9z4rvZUqt1EqKB0uckGLSgcW8omuwhA7DzYFKfhMsh0r5qH/XIU6OwjCPcb81nuIMv4btw04nDi0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755077980; c=relaxed/simple; bh=yIuZqDTbjnsUN5RdcGtl2t7y8BUXc7iJUY/Vak2JMiE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References: In-Reply-To:To:CC; b=R4ignwDv/bt6BW69DLMre12s5Lle+pH6UfvSB4tic1XguKEbvSDCzi+1adQf7gq8guoQjM7mPEZrVOhEeDDXi10gF8xTUlt8+gTshE81uXz4nT97jgswkF3d/GSMeqNhTK93K/zU1daNy49P/2DiqI3Ak+Wcoo3E0GcEKkWYiTc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=OUDbsPFj; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="OUDbsPFj" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 57D6mHe1029839; Wed, 13 Aug 2025 09:39:32 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= AZuGuZ5e5Om1wxrySKEYXg020czKJSPngDqgcgIFIgM=; b=OUDbsPFjc40OWfRQ S52AnsSr03aCZ0KJ4lyi0R0Yrcf9wDfPn/zmKv70pfPKouVOOOhkB2osQ2wRcAHV L7l+xSGOorhsEVCk5fMScP9+Q3pzc/Q8aUTkPoI8JOE4IAWNE//zqU1fZEJJADvw 5lzsL1rbgED80o2ZAxhZsKvCQnkcfESCmsjDQ3XvLaNMpnkYkaaU6vsBdxTSN74g H/Tc0VtfzxlOGtpg0QkxMu/9tn9Do9yeTNPV4+GLt68BZgG87ux9LRf13mj3e3fJ e6yysm7OrAmq5F/V7q4U6B57UBZ/I6CSvXYEYCbqSs17huZb3/77y6iwgaMVj2vs Lwi9JQ== Received: from nalasppmta01.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 48dy3gb9a6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 13 Aug 2025 09:39:32 +0000 (GMT) Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA01.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 57D9dVCI001277 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 13 Aug 2025 09:39:31 GMT Received: from hu-dikshita-hyd.qualcomm.com (10.80.80.8) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.10; Wed, 13 Aug 2025 02:39:27 -0700 From: Dikshita Agarwal Date: Wed, 13 Aug 2025 15:08:08 +0530 Subject: [PATCH v2 18/24] media: iris: Add support for G/S_PARM for encoder video device Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-ID: <20250813-iris-video-encoder-v2-18-c725ff673078@quicinc.com> References: <20250813-iris-video-encoder-v2-0-c725ff673078@quicinc.com> In-Reply-To: <20250813-iris-video-encoder-v2-0-c725ff673078@quicinc.com> To: Vikash Garodia , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Hans Verkuil , Stefan Schmidt , "Vedang Nagar" CC: , , , Renjiang Han , Wangao Wang , Dikshita Agarwal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1755077896; l=13841; i=quic_dikshita@quicinc.com; s=20240917; h=from:subject:message-id; bh=yIuZqDTbjnsUN5RdcGtl2t7y8BUXc7iJUY/Vak2JMiE=; b=sH+KDhyYGYc/AZ2Ky2gc2KXVRGWTRPDX5d3sppJo3CkwdbItIax2kN3KZPou+pP7aYXXya0sA WRX26OOE/YEBdCik7W7+m4l1nWhYSfUw7cKoqxIIHTD6pXFjEfdlFpH X-Developer-Key: i=quic_dikshita@quicinc.com; a=ed25519; pk=EEvKY6Ar1OI5SWf44FJ1Ebo1KuQEVbbf5UNPO+UHVhM= X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Authority-Analysis: v=2.4 cv=X4lSKHTe c=1 sm=1 tr=0 ts=689c5d54 cx=c_pps a=ouPCqIW2jiPt+lZRy3xVPw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=GEpy-HfZoHoA:10 a=IkcTkHD0fZMA:10 a=2OwXVqhp2XgA:10 a=COk6AnOGAAAA:8 a=PWobvjESsZjX4MKKfcUA:9 a=QEXdDO2ut3YA:10 a=TjNXssC_j7lpFel5tvFf:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUwODA5MDAzMSBTYWx0ZWRfX23b+0vJzsMUv NygurocB4Kn/QqIUcsw1fzCs0bamh43mrN/ij/bHKduCpBvvMyBt3b8snhuywseM96H50tNP6QW KHC5JiBFgnzLsjxKQ+4cVeOIdu76K4d4YzyKc4KSis/noAtLz81hTpI7xFklkqWqcNb/nzeE7Sd /OyInz39eyDBO429ZNlXdP/tJui2dTH077Z8Q1U0JiehXV52kz7a7yRX03XvgCe06vuNBX7iL38 vmlUon2H8JCNUWYMffFGOMhjoKyNXhx9A48RxTi8TOx3MP6tCLQOCGj1Tq9wHGGy3eyWM1UF0Ox oKMbGWpjSCaw6Gnvn6vCluMBrdkSMI4pd1E+lXDOTUpWcQnjnTuu58SdeFvdkCw7Q4ZewjzlhUs ajjAD1sS X-Proofpoint-GUID: HLiUjZ1kb-B1xYv9j7cMPgVWuFIto5NL X-Proofpoint-ORIG-GUID: HLiUjZ1kb-B1xYv9j7cMPgVWuFIto5NL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1099,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-08-12_08,2025-08-11_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 adultscore=0 spamscore=0 bulkscore=0 suspectscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2507300000 definitions=main-2508090031 Add supports for the G/S_PARM V4L2 ioctls for encoder video device with necessary hooks. This allows userspace to query the current streaming parameters such as frame intervals and set desired streaming parameters primarily the frame rate. Tested-by: Vikash Garodia # X1E80100 Signed-off-by: Dikshita Agarwal --- drivers/media/platform/qcom/iris/iris_instance.h | 5 ++ .../platform/qcom/iris/iris_platform_common.h | 2 + .../media/platform/qcom/iris/iris_platform_gen2.c | 4 +- .../platform/qcom/iris/iris_platform_qcs8300.h | 2 + .../platform/qcom/iris/iris_platform_sm8250.c | 2 + drivers/media/platform/qcom/iris/iris_utils.c | 36 ++++++++ drivers/media/platform/qcom/iris/iris_utils.h | 2 + drivers/media/platform/qcom/iris/iris_vb2.c | 17 ---- drivers/media/platform/qcom/iris/iris_venc.c | 95 ++++++++++++++++++= ++++ drivers/media/platform/qcom/iris/iris_venc.h | 2 + drivers/media/platform/qcom/iris/iris_vidc.c | 30 +++++++ 11 files changed, 179 insertions(+), 18 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/med= ia/platform/qcom/iris/iris_instance.h index 55cf9702111829ef24189986ba5245c7684bfe11..b75549718df3c87cd85aecfc74c= 873c60cd4bde5 100644 --- a/drivers/media/platform/qcom/iris/iris_instance.h +++ b/drivers/media/platform/qcom/iris/iris_instance.h @@ -61,6 +61,9 @@ struct iris_fmt { * @metadata_idx: index for metadata buffer * @codec: codec type * @last_buffer_dequeued: a flag to indicate that last buffer is sent by d= river + * @frame_rate: frame rate of current instance + * @operating_rate: operating rate of current instance + */ =20 struct iris_inst { @@ -96,6 +99,8 @@ struct iris_inst { u32 metadata_idx; u32 codec; bool last_buffer_dequeued; + u32 frame_rate; + u32 operating_rate; }; =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 792f46e2e34fd564a1ed61523f72826fc8f74582..d0b84c93aef409b51a767ba11f9= 1c6ce2533f27f 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -79,6 +79,8 @@ struct platform_inst_caps { u32 mb_cycles_fw; u32 mb_cycles_fw_vpp; u32 num_comv; + u32 max_frame_rate; + u32 max_operating_rate; }; =20 enum platform_inst_fw_cap_type { diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/driver= s/media/platform/qcom/iris/iris_platform_gen2.c index 1e2fadfe17672029b46e07ce00a8e31e0711fd58..e047fb75a99a6372dac4ad029ba= ea16034cac633 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c @@ -209,6 +209,8 @@ static struct platform_inst_caps platform_inst_cap_sm85= 50 =3D { .mb_cycles_fw =3D 489583, .mb_cycles_fw_vpp =3D 66234, .num_comv =3D 0, + .max_frame_rate =3D MAXIMUM_FPS << 16, + .max_operating_rate =3D MAXIMUM_FPS << 16, }; =20 static void iris_set_sm8550_preset_registers(struct iris_core *core) @@ -502,7 +504,7 @@ struct iris_platform_data qcs8300_data =3D { .num_vpp_pipe =3D 2, .max_session_count =3D 16, .max_core_mbpf =3D ((4096 * 2176) / 256) * 4, - .max_core_mbps =3D ((7680 * 4320) / 256) * 60, //TODO confirm!! + .max_core_mbps =3D (((3840 * 2176) / 256) * 120), .input_config_params_default =3D sm8550_vdec_input_config_params_default, .input_config_params_default_size =3D diff --git a/drivers/media/platform/qcom/iris/iris_platform_qcs8300.h b/dri= vers/media/platform/qcom/iris/iris_platform_qcs8300.h index a8d66ed388a34e6bb45d4a089d981bb7d135fb50..22e485b0b2ae8f110d2f3b817e2= 02d1aa7d227fd 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_qcs8300.h +++ b/drivers/media/platform/qcom/iris/iris_platform_qcs8300.h @@ -197,4 +197,6 @@ static struct platform_inst_caps platform_inst_cap_qcs8= 300 =3D { .mb_cycles_fw =3D 326389, .mb_cycles_fw_vpp =3D 44156, .num_comv =3D 0, + .max_frame_rate =3D MAXIMUM_FPS << 16, + .max_operating_rate =3D MAXIMUM_FPS << 16, }; diff --git a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c b/driv= ers/media/platform/qcom/iris/iris_platform_sm8250.c index 2a3cbe1f2d4b27d3cce9e9cdad1525801d71a041..5d59a5a3172a510b3a38f7c9c29= dffd919fafce7 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_sm8250.c +++ b/drivers/media/platform/qcom/iris/iris_platform_sm8250.c @@ -40,6 +40,8 @@ static struct platform_inst_caps platform_inst_cap_sm8250= =3D { .max_mbpf =3D 138240, .mb_cycles_vsp =3D 25, .mb_cycles_vpp =3D 200, + .max_frame_rate =3D MAXIMUM_FPS << 16, + .max_operating_rate =3D MAXIMUM_FPS << 16, }; =20 static void iris_set_sm8250_preset_registers(struct iris_core *core) diff --git a/drivers/media/platform/qcom/iris/iris_utils.c b/drivers/media/= platform/qcom/iris/iris_utils.c index 83c70d6a2d9092615dcf1b7d0fc85110f0df1aa0..f0af926879d5d90c56222aa8d48= 998a34be1c636 100644 --- a/drivers/media/platform/qcom/iris/iris_utils.c +++ b/drivers/media/platform/qcom/iris/iris_utils.c @@ -88,3 +88,39 @@ struct iris_inst *iris_get_instance(struct iris_core *co= re, u32 session_id) mutex_unlock(&core->lock); return NULL; } + +int iris_check_core_mbpf(struct iris_inst *inst) +{ + struct iris_core *core =3D inst->core; + struct iris_inst *instance; + u32 total_mbpf =3D 0; + + mutex_lock(&core->lock); + list_for_each_entry(instance, &core->instances, list) + total_mbpf +=3D iris_get_mbpf(instance); + mutex_unlock(&core->lock); + + if (total_mbpf > core->iris_platform_data->max_core_mbpf) + return -ENOMEM; + + return 0; +} + +int iris_check_core_mbps(struct iris_inst *inst) +{ + struct iris_core *core =3D inst->core; + struct iris_inst *instance; + u32 total_mbps =3D 0, fps =3D 0; + + mutex_lock(&core->lock); + list_for_each_entry(instance, &core->instances, list) { + fps =3D max(instance->frame_rate >> 16, instance->operating_rate >> 16); + total_mbps +=3D iris_get_mbpf(instance) * fps; + } + mutex_unlock(&core->lock); + + if (total_mbps > core->iris_platform_data->max_core_mbps) + return -ENOMEM; + + return 0; +} diff --git a/drivers/media/platform/qcom/iris/iris_utils.h b/drivers/media/= platform/qcom/iris/iris_utils.h index 49869cf7a376880a026f44ff3883a6b13c6fcfbb..75740181122f5bdf93d64d3f43b= 3a26a9fe97919 100644 --- a/drivers/media/platform/qcom/iris/iris_utils.h +++ b/drivers/media/platform/qcom/iris/iris_utils.h @@ -49,5 +49,7 @@ struct iris_inst *iris_get_instance(struct iris_core *cor= e, u32 session_id); void iris_helper_buffers_done(struct iris_inst *inst, unsigned int type, enum vb2_buffer_state state); int iris_wait_for_session_response(struct iris_inst *inst, bool is_flush); +int iris_check_core_mbpf(struct iris_inst *inst); +int iris_check_core_mbps(struct iris_inst *inst); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_vb2.c b/drivers/media/pl= atform/qcom/iris/iris_vb2.c index e62ed7a57df2debf0a930ad8307e6d945f589922..e32f7e1f007228a3b2b51cd76cd= 193d852f16080 100644 --- a/drivers/media/platform/qcom/iris/iris_vb2.c +++ b/drivers/media/platform/qcom/iris/iris_vb2.c @@ -12,23 +12,6 @@ #include "iris_vdec.h" #include "iris_power.h" =20 -static int iris_check_core_mbpf(struct iris_inst *inst) -{ - struct iris_core *core =3D inst->core; - struct iris_inst *instance; - u32 total_mbpf =3D 0; - - mutex_lock(&core->lock); - list_for_each_entry(instance, &core->instances, list) - total_mbpf +=3D iris_get_mbpf(instance); - mutex_unlock(&core->lock); - - if (total_mbpf > core->iris_platform_data->max_core_mbpf) - return -ENOMEM; - - return 0; -} - static int iris_check_inst_mbpf(struct iris_inst *inst) { struct platform_inst_caps *caps; diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/p= latform/qcom/iris/iris_venc.c index 930f5afe9489d01be193f1dbe429d33f5401b468..11666f40a4d1c34e1b6eca0b5e4= 0e0f09eeb2b67 100644 --- a/drivers/media/platform/qcom/iris/iris_venc.c +++ b/drivers/media/platform/qcom/iris/iris_venc.c @@ -58,6 +58,9 @@ int iris_venc_inst_init(struct iris_inst *inst) inst->crop.width =3D f->fmt.pix_mp.width; inst->crop.height =3D f->fmt.pix_mp.height; =20 + inst->operating_rate =3D DEFAULT_FPS << 16; + inst->frame_rate =3D DEFAULT_FPS << 16; + return 0; } =20 @@ -325,3 +328,95 @@ int iris_venc_s_selection(struct iris_inst *inst, stru= ct v4l2_selection *s) =20 return 0; } + +int iris_venc_s_param(struct iris_inst *inst, struct v4l2_streamparm *s_pa= rm) +{ + struct platform_inst_caps *caps =3D inst->core->iris_platform_data->inst_= caps; + struct vb2_queue *src_q =3D v4l2_m2m_get_src_vq(inst->m2m_ctx); + struct vb2_queue *dst_q =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); + struct v4l2_fract *timeperframe =3D NULL; + u32 default_rate =3D DEFAULT_FPS; + bool is_frame_rate =3D false; + u32 q16_rate, max_rate; + u64 us_per_frame, fps; + int ret =3D 0; + + if (s_parm->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { + timeperframe =3D &s_parm->parm.output.timeperframe; + max_rate =3D caps->max_operating_rate >> 16; + s_parm->parm.output.capability =3D V4L2_CAP_TIMEPERFRAME; + } else { + timeperframe =3D &s_parm->parm.capture.timeperframe; + is_frame_rate =3D true; + max_rate =3D caps->max_frame_rate >> 16; + s_parm->parm.capture.capability =3D V4L2_CAP_TIMEPERFRAME; + } + + if (!timeperframe->denominator || !timeperframe->numerator) { + if (!timeperframe->numerator) + timeperframe->numerator =3D 1; + if (!timeperframe->denominator) + timeperframe->denominator =3D default_rate; + } + + us_per_frame =3D timeperframe->numerator * (u64)USEC_PER_SEC; + do_div(us_per_frame, timeperframe->denominator); + + if (!us_per_frame) + return -EINVAL; + + fps =3D (u64)USEC_PER_SEC; + do_div(fps, us_per_frame); + ret =3D fps > max_rate; + if (ret) { + ret =3D -ENOMEM; + goto reset_rate; + } + + q16_rate =3D (u32)fps << 16; + if (is_frame_rate) + inst->frame_rate =3D q16_rate; + else + inst->operating_rate =3D q16_rate; + + if ((s_parm->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE && vb2_is_stre= aming(src_q)) || + (s_parm->type =3D=3D V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && vb2_is_str= eaming(dst_q))) { + ret =3D iris_check_core_mbpf(inst); + if (ret) + goto reset_rate; + ret =3D iris_check_core_mbps(inst); + if (ret) + goto reset_rate; + } + + return 0; + +reset_rate: + if (ret) { + if (is_frame_rate) + inst->frame_rate =3D default_rate << 16; + else + inst->operating_rate =3D default_rate << 16; + } + + return ret; +} + +int iris_venc_g_param(struct iris_inst *inst, struct v4l2_streamparm *s_pa= rm) +{ + struct v4l2_fract *timeperframe =3D NULL; + + if (s_parm->type =3D=3D V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) { + timeperframe =3D &s_parm->parm.output.timeperframe; + timeperframe->numerator =3D 1; + timeperframe->denominator =3D inst->operating_rate >> 16; + s_parm->parm.output.capability =3D V4L2_CAP_TIMEPERFRAME; + } else { + timeperframe =3D &s_parm->parm.capture.timeperframe; + timeperframe->numerator =3D 1; + timeperframe->denominator =3D inst->frame_rate >> 16; + s_parm->parm.capture.capability =3D V4L2_CAP_TIMEPERFRAME; + } + + return 0; +} diff --git a/drivers/media/platform/qcom/iris/iris_venc.h b/drivers/media/p= latform/qcom/iris/iris_venc.h index 72c6e25d87113baa6d2219ae478b7d7df1aed7bf..0d566b7fc89b96b8fbc62a35b2b= a795ca0bcf460 100644 --- a/drivers/media/platform/qcom/iris/iris_venc.h +++ b/drivers/media/platform/qcom/iris/iris_venc.h @@ -16,5 +16,7 @@ int iris_venc_s_fmt(struct iris_inst *inst, struct v4l2_f= ormat *f); int iris_venc_validate_format(struct iris_inst *inst, u32 pixelformat); int iris_venc_subscribe_event(struct iris_inst *inst, const struct v4l2_ev= ent_subscription *sub); int iris_venc_s_selection(struct iris_inst *inst, struct v4l2_selection *s= ); +int iris_venc_g_param(struct iris_inst *inst, struct v4l2_streamparm *s_pa= rm); +int iris_venc_s_param(struct iris_inst *inst, struct v4l2_streamparm *s_pa= rm); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/p= latform/qcom/iris/iris_vidc.c index 2074682a35fd1c4c9f5d29fdaee3392d98bf8923..4c11cdac19f97d08a9e6242eea7= 4649aad0242cf 100644 --- a/drivers/media/platform/qcom/iris/iris_vidc.c +++ b/drivers/media/platform/qcom/iris/iris_vidc.c @@ -532,6 +532,34 @@ static int iris_subscribe_event(struct v4l2_fh *fh, co= nst struct v4l2_event_subs return -EINVAL; } =20 +static int iris_s_parm(struct file *filp, void *fh, struct v4l2_streamparm= *a) +{ + struct iris_inst *inst =3D container_of(fh, struct iris_inst, fh); + + if (a->type !=3D V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && + a->type !=3D V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) + return -EINVAL; + + if (inst->domain =3D=3D ENCODER) + return iris_venc_s_param(inst, a); + else + return -EINVAL; +} + +static int iris_g_parm(struct file *filp, void *fh, struct v4l2_streamparm= *a) +{ + struct iris_inst *inst =3D container_of(fh, struct iris_inst, fh); + + if (a->type !=3D V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && + a->type !=3D V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) + return -EINVAL; + + if (inst->domain =3D=3D ENCODER) + return iris_venc_g_param(inst, a); + else + return -EINVAL; +} + static int iris_dec_cmd(struct file *filp, void *fh, struct v4l2_decoder_cmd *dec) { @@ -628,6 +656,8 @@ static const struct v4l2_ioctl_ops iris_v4l2_ioctl_ops_= enc =3D { .vidioc_unsubscribe_event =3D v4l2_event_unsubscribe, .vidioc_g_selection =3D iris_g_selection, .vidioc_s_selection =3D iris_s_selection, + .vidioc_s_parm =3D iris_s_parm, + .vidioc_g_parm =3D iris_g_parm, }; =20 void iris_init_ops(struct iris_core *core) --=20 2.34.1