From nobody Fri Sep 25 06:47:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 D3F2929992A for ; Fri, 25 Sep 2026 00:28:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296092; cv=none; b=bdjnaijMG7B7d83jkAKEkhvw2xZyw3H9JRjSUUjYMo1jBuOjJiR4S4BhlNM7CuYwiJ0iOmvzamJjyGg3T3hd3QPa7gl9JCMY0nce/+IbnaZXHYnIBY++DgpgEwdJIiI8lIE8CRgceR+V1rQF3a/Gwpozltzxy1bkh2PwmynrzUI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296092; c=relaxed/simple; bh=RRe/M59HXbxjRixy4XO5DhqWDHVyqbLcU5jbmJbr8wQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BBe1kUlTU8h+e7EpDfNow0jGahJTObHJsvVy7MEhMfI9vfuNvwrKQu0Tw8L4pIW1pgpX+3WnolHjiMuXN2uueBk3thXm+wfUf5+nZNYx090JpvDZWf1TZ3+JczQwJ4BBxBAkkZCgsPYF4elLYjSO/VggCrRnAh6GwNX6KnWdoNw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=X6NrLMWq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ZrBKwTg6; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="X6NrLMWq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ZrBKwTg6" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68OMPZt04088231 for ; Fri, 25 Sep 2026 00:28:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= HrTPcHVskWcs1qSOuD3ZacM1lBHxmSmBRImIrBhbwUo=; b=X6NrLMWqgqgsi08c wQONkTjaG2GUhavR8kVXe+kmGEPp9Uj4uHmC1rTQM7l+iMaYPREwPd5L6HoyPLgz wdQeiNs2VL+OaZ7m40AVG1ZhnsWrjHoyhEr9lAVRHu5QCkiL++C5tUPW17EuuONT 69giR865tLOfBD+v8HsHLgxkGrHW7m9y8HQk+ROIV1FYQB1zbCzjRyWwhfOBa1z4 89t1KTrr6PPMvm+GX7PfJOJrQ4NefuvSCiLD6MECKCBbeQfK1OaGR2Z4FxhaO7Zb k+UqaV4LgXHCpzmMvFkPyWvlfNzCCZdQkF9J2monkFatLxtR6xfOFY5yP60jlZNP g6mONw== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gw1s936qg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 25 Sep 2026 00:28:09 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-33c0b54834bso31046eec.1 for ; Thu, 24 Sep 2026 17:28:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790296088; x=1790900888; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HrTPcHVskWcs1qSOuD3ZacM1lBHxmSmBRImIrBhbwUo=; b=ZrBKwTg6xLErmePSm+SWOolgh70sQV5KWbTC/cVRx4QjaV7xLcwC1zOooRt09dkXJX cTEWXeAp1R/xGlGkk/iYsE2W98wY2gRUGBq0OwxmEc4wkhjLF2J67vD8a173B2LqVkyu l0riK/U11w+x2ZIXpSeGNRL/gH8M/U5i12KQ3FFBUmt9kw77Os1JytrMJICjbODJiTHN VQn1rr4O0r8wkAWtHE6l8XJIAMRYMOIYfRo4nKLakGJcZd7jtRQfLqNNYPxGnhbx87OE av6Gf+4FVD6gNx1zgsHlDvxVM/zBQ4eNRKiiSOxNslbHq3ipkUhyTYRgYliwQlqDafbW LRHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790296088; x=1790900888; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HrTPcHVskWcs1qSOuD3ZacM1lBHxmSmBRImIrBhbwUo=; b=egoX9SulS//Xl96QmwbqBsIcU1anQOQHvAH/gl1+jn1iVfodB2Dl5rOu7wsmh3YAsW 3fs2Y+zp9+6KCaffCUe/kjBWOOTXyDTz5k/xhUeCiXdq7ICZFxMJAaIVPGy+a4QogM6X KX31kYpS6s+3wtN3/JWLcn8eD1LAMe7aLTB7IuwYWm5TN2KHZaiO7II8DMRx2eixmGaO aXG/6Zp/cWPAFrxcWveJWv1g8Oenh/0D45R3rxnygFK9nqjvWBmLbvlD0KRi4PL712ao WvHPEnYHGSOcAnutM361gB6s8Vm93cw2qIDW1IJ6cLZdiTGN/zEe+hyTOz7AkKw2YELq UanQ== X-Forwarded-Encrypted: i=1; AKwUvBwQq65EJTwBdLgnl6r/eOEinIohOjx908pP7MvJ5s1iCjACcWXjvfaWy1joF+fbV5gowN6cayEmHL9/PDY=@vger.kernel.org X-Gm-Message-State: AFuF++kjNOr1pgRSv3U4cDl+kywm4/TugSP9r/hUhualmyFOubvWmnCf +ugKkJCi51CIbggtn7HWTebajTEZfj9E91bt5/D88DUolJP0IanLx9YV3UK09bb6b/PcQgPp4DT OiCHrgljRIxQ+SvtpnldrGjZeZEykIj849kMET1mhyVDNK2OJy/WE6CnxxmuNU7zedL8= X-Gm-Gg: AYBFou0TNHQZAgB2PzU3sPDul8QihPdS2zhZuCvIgdx5fqGbrHu1zeya60/KoOT6l6e 9ACgbtxl9ZOJszwF4vxrNE4zd+tgW/aO3oW2xE6zVT02J5CLF/11lsMHzFj1s8PojzvizEIDDEs q7VJ8jSe196rXCVhIwJ8ys6gpRLXcTVe3n3mai/T5jukLQU/6EXbbufvt6RTFbSBhVIuakT+W5c Fc9AoWMNYbx+XY1TFLLnKEhV6QJFUYLkti+AprCKRSlmzQCDCZUoP7fNmUa7wulgerqtatx9jtN 83YXWkFOCZG8YcR28xfO/EMGG2zoUhC/cW+mMfkFeys8MkOSyhrQttb6IVJWYTq9YAKJOBRs9I5 /sl2e3FupBx8hkTynkWtu31B4WCRw4Ux3jVc5gyUhg5M40itCxBBo9yKO2WuM X-Received: by 2002:a05:7300:7f28:b0:33c:68b:c4d2 with SMTP id 5a478bee46e88-3400657428emr4523853eec.2.1790296088008; Thu, 24 Sep 2026 17:28:08 -0700 (PDT) X-Received: by 2002:a05:7300:7f28:b0:33c:68b:c4d2 with SMTP id 5a478bee46e88-3400657428emr4523822eec.2.1790296087266; Thu, 24 Sep 2026 17:28:07 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3414485a9cdsm1873736eec.16.2026.09.24.17.28.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2026 17:28:06 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Thu, 24 Sep 2026 17:28:02 -0700 Subject: [PATCH v7 1/5] media: v4l2-core: add new control type V4L2_CTRL_TYPE_S8 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: <20260924-enc_roi_enable-v7-1-6fa7413af23c@oss.qualcomm.com> References: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> In-Reply-To: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1790296085; l=7891; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=RRe/M59HXbxjRixy4XO5DhqWDHVyqbLcU5jbmJbr8wQ=; b=xftFkAbkXUbp95J1PXO8pyTZKOuJbPA2eWbJk86331oIp7R3t3NVXiXT5X0IdxLUWY//D7toc 3c43yLZkWWwBJu0sdXUzst8HfRLIDLIU0us8LYKaaxN2IIfuNIQgJQX X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX/FnGVyaSuJQ4 e+/Yn2N9VPkAlCNzQ4qCMiar3VQpkET0PBf0/KUyPDY/Pi8ETRLA9DqEDrXIlVQOqK4WrJqLC1p hCNYMDZM0tFfBEy/i92ao7fveufpkU33zLj0YTP0j+mrLoSvFFdsm2+sP4p0xQ5qo6KTGzInB2K ku3VTsp6Bz7Zr+YiPCvs/lWFLFNViaBdTTsmNDzuUH4T7cVgKTn1wwR6iBUwl4aUyYXmJm50Fn4 u/PKZbyggOnKGR41H/c+vlRWYAQKh2t6Lcmv+10XQ50YudfdqbINES4nlh87ZgR7V0SX42ShRMp tLme22jaji02WxCjUn54UHjcy0vdalXzaVdPjJ0F+OWBtuH4BN4Rv6gBEyxdVhn9/hzAiPzVdz3 NJnDyhdvVkFyklcl9yceV5sl6peVyW0jBw5c/dZGNrOwlF6PdqHdMqnZQSVvH7mfoKbz7gA1GWK TUhUwkKNbILWL5mMldg== X-Authority-Analysis: v=2.4 cv=VPxIDNPX c=1 sm=1 tr=0 ts=6ab5c019 cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=ZvH2QzoBumBvrUatZloA:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX1J7lhqGqyu+I ztBK3mjXMxPEmlOs94dtWwHqalnjPv33d/1Yo/3KGdDq45SMW4RwOY7v3UPTuIXtKNq5dV1tNV0 75IgfTNH8fqMi4mx6AHAEmrjWI6uVuc= X-Proofpoint-ORIG-GUID: 9XKHSvApR6VL7p1WGTGoU4CnijF7tW3M X-Proofpoint-GUID: 9XKHSvApR6VL7p1WGTGoU4CnijF7tW3M X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_06,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 adultscore=0 clxscore=1015 bulkscore=0 suspectscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609250001 Introduce V4L2_CTRL_TYPE_S8 (enum value 0x0103) as a new control type for signed 8-bit values. Add necessary support in v4l2_ext_control, v4l2_ctrl_ptr and handling in v4l2-ctrls-core, v4l2-ctrls-api. Signed-off-by: Deepa Guthyappa Madivalara --- .../userspace-api/media/v4l/videodev2.h.rst.exceptions | 1 + .../userspace-api/media/v4l/vidioc-g-ext-ctrls.rst | 4 ++++ .../userspace-api/media/v4l/vidioc-queryctrl.rst | 6 ++++++ drivers/media/v4l2-core/v4l2-ctrls-api.c | 1 + drivers/media/v4l2-core/v4l2-ctrls-core.c | 16 ++++++++++++= ++++ include/media/v4l2-ctrls.h | 2 ++ include/uapi/linux/videodev2.h | 2 ++ 7 files changed, 32 insertions(+) diff --git a/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptio= ns b/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions index 6182b4e2d2ee002c0d3562e1cc3bc2fd9c4286d6..b036ed3ec2f0744175cad1cbc4e= 73fe828e0c955 100644 --- a/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions +++ b/Documentation/userspace-api/media/v4l/videodev2.h.rst.exceptions @@ -141,6 +141,7 @@ replace symbol V4L2_CTRL_TYPE_STRING :c:type:`V4L.v4l2_= ctrl_type` replace symbol V4L2_CTRL_TYPE_U16 :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_U32 :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_U8 :c:type:`V4L.v4l2_ctrl_type` +replace symbol V4L2_CTRL_TYPE_S8 :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_MPEG2_SEQUENCE :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_MPEG2_PICTURE :c:type:`V4L.v4l2_ctrl_type` replace symbol V4L2_CTRL_TYPE_MPEG2_QUANTISATION :c:type:`V4L.v4l2_ctrl_ty= pe` diff --git a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst b= /Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst index d78328152b7552f8f0d30a9e2f7c104bfd4b70d3..fe5f8992389c32d8f35f432229e= f2f734002644e 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst @@ -188,6 +188,10 @@ still cause this situation. - ``p_u32`` - A pointer to a matrix control of unsigned 32-bit values. Valid if this control is of type ``V4L2_CTRL_TYPE_U32``. + * - __s8 * + - ``p_s8`` + - A pointer to a matrix control of signed 8-bit values. Valid if + this control is of type ``V4L2_CTRL_TYPE_S8``. * - __s32 * - ``p_s32`` - A pointer to a matrix control of signed 32-bit values. Valid if diff --git a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst b/D= ocumentation/userspace-api/media/v4l/vidioc-queryctrl.rst index 82c8b52e771ce9301491b3f752e501a8fe7e2434..57e1652ae72e0324742142446ac= f32a16b94941c 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-queryctrl.rst @@ -425,6 +425,12 @@ See also the examples in :ref:`control`. - any - An unsigned 32-bit valued control ranging from minimum to maximum inclusive. The step value indicates the increment between values. + * - ``V4L2_CTRL_TYPE_S8`` + - any + - any + - any + - A signed 8-bit valued control ranging from minimum to maximum + inclusive. The step value indicates the increment between values. * - ``V4L2_CTRL_TYPE_MPEG2_QUANTISATION`` - n/a - n/a diff --git a/drivers/media/v4l2-core/v4l2-ctrls-api.c b/drivers/media/v4l2-= core/v4l2-ctrls-api.c index 93d8d4012d0f4fef004e417d0aee2ae44b1b30bd..7d41cfd7378baaa929d4da0266c= 45f731bb54285 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-api.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-api.c @@ -980,6 +980,7 @@ int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl, case V4L2_CTRL_TYPE_U8: case V4L2_CTRL_TYPE_U16: case V4L2_CTRL_TYPE_U32: + case V4L2_CTRL_TYPE_S8: if (ctrl->is_array) return -EINVAL; ret =3D check_range(ctrl->type, min, max, step, def); diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2= -core/v4l2-ctrls-core.c index 661a3a25da5220d2e824f71e68871181533e6cd8..c5df0e0a54f81c73975f427957b= 7c99fd421d5ad 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c @@ -297,6 +297,9 @@ static void __v4l2_ctrl_type_op_init(const struct v4l2_= ctrl *ctrl, u32 from_idx, memset(ptr.p_u32 + from_idx, 0, elems * sizeof(u32)); } break; + case V4L2_CTRL_TYPE_S8: + memset(ptr.p_s8 + from_idx, (u8)value, elems); + break; default: for (i =3D from_idx; i < tot_elems; i++) { switch (which) { @@ -377,6 +380,9 @@ void v4l2_ctrl_type_op_log(const struct v4l2_ctrl *ctrl) case V4L2_CTRL_TYPE_U32: pr_cont("%u", (unsigned)*ptr.p_u32); break; + case V4L2_CTRL_TYPE_S8: + pr_cont("%d", *ptr.p_s8); + break; case V4L2_CTRL_TYPE_AREA: pr_cont("%ux%u", ptr.p_area->width, ptr.p_area->height); break; @@ -1442,6 +1448,8 @@ static int std_validate_elem(const struct v4l2_ctrl *= ctrl, u32 idx, return ROUND_TO_RANGE(ptr.p_u16[idx], u16, ctrl); case V4L2_CTRL_TYPE_U32: return ROUND_TO_RANGE(ptr.p_u32[idx], u32, ctrl); + case V4L2_CTRL_TYPE_S8: + return ROUND_TO_RANGE(ptr.p_s8[idx], u8, ctrl); =20 case V4L2_CTRL_TYPE_BOOLEAN: ptr.p_s32[idx] =3D !!ptr.p_s32[idx]; @@ -1501,6 +1509,10 @@ int v4l2_ctrl_type_op_validate(const struct v4l2_ctr= l *ctrl, if (ctrl->maximum =3D=3D 0xffffffff && ctrl->minimum =3D=3D 0 && ctrl->s= tep =3D=3D 1) return 0; break; + case V4L2_CTRL_TYPE_S8: + if (ctrl->maximum =3D=3D S8_MAX && ctrl->minimum =3D=3D S8_MIN && ctrl->= step =3D=3D 1) + return 0; + break; =20 case V4L2_CTRL_TYPE_BUTTON: case V4L2_CTRL_TYPE_CTRL_CLASS: @@ -1732,6 +1744,7 @@ int check_range(enum v4l2_ctrl_type type, case V4L2_CTRL_TYPE_U32: case V4L2_CTRL_TYPE_INTEGER: case V4L2_CTRL_TYPE_INTEGER64: + case V4L2_CTRL_TYPE_S8: if (step =3D=3D 0 || min > max || def < min || def > max) return -ERANGE; return 0; @@ -2037,6 +2050,9 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ct= rl_handler *hdl, case V4L2_CTRL_TYPE_U32: elem_size =3D sizeof(u32); break; + case V4L2_CTRL_TYPE_S8: + elem_size =3D sizeof(s8); + break; case V4L2_CTRL_TYPE_MPEG2_SEQUENCE: elem_size =3D sizeof(struct v4l2_ctrl_mpeg2_sequence); break; diff --git a/include/media/v4l2-ctrls.h b/include/media/v4l2-ctrls.h index cec9217d97ac698cd447574f5d079dd913a9ef6f..6a181a6c6b43beae87310cacb04= 4a0cc7ad2c063 100644 --- a/include/media/v4l2-ctrls.h +++ b/include/media/v4l2-ctrls.h @@ -27,6 +27,7 @@ struct video_device; =20 /** * union v4l2_ctrl_ptr - A pointer to a control value. + * @p_s8: Pointer to a 8-bit signed value. * @p_s32: Pointer to a 32-bit signed value. * @p_s64: Pointer to a 64-bit signed value. * @p_u8: Pointer to a 8-bit unsigned value. @@ -61,6 +62,7 @@ struct video_device; * @p_const: Pointer to a constant compound value. */ union v4l2_ctrl_ptr { + s8 *p_s8; s32 *p_s32; s64 *p_s64; u8 *p_u8; diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index 5373dba640fae3d19247ab1c74ba336e05dc0fe0..ac588d0093df9cc35c11d0b9d41= d052d5e800925 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -1884,6 +1884,7 @@ struct v4l2_ext_control { __s64 value64; char __user *string; __u8 __user *p_u8; + __s8 __user *p_s8; __u16 __user *p_u16; __u32 __user *p_u32; __s32 __user *p_s32; @@ -1961,6 +1962,7 @@ enum v4l2_ctrl_type { V4L2_CTRL_TYPE_U8 =3D 0x0100, V4L2_CTRL_TYPE_U16 =3D 0x0101, V4L2_CTRL_TYPE_U32 =3D 0x0102, + V4L2_CTRL_TYPE_S8 =3D 0x0103, V4L2_CTRL_TYPE_AREA =3D 0x0106, V4L2_CTRL_TYPE_RECT =3D 0x0107, =20 --=20 2.34.1 From nobody Fri Sep 25 06:47:41 2026 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 5FCF72931CB for ; Fri, 25 Sep 2026 00:28:10 +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=1790296091; cv=none; b=QhKPhrdDDHEFCelb126MUsmPfT2tf1SQZ6nTWaz5W5sF1e41uwRIR66nC5OitW/1ETMVIrgww5j0FJazRpmnF7J7747xnrbPHnTHeqR6jXoYk1l5gKLAjeh9myY/74taXGKku/lIyIlR8YGr56mN/uSX72DNS/MwkLSb4YocK3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296091; c=relaxed/simple; bh=zsWqRKtlrZSWGWqLaRyE0mDAEmZ07PgIoNKYlaI+SjI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YkwvIjcYcFwQ0BjYpQ+iVLJ9UBdM55qQplE36MeFA3M69RGkOZaELotvglt6r2UeLa4e3u9LObOBvKu8WH88bpZ0JB/XsMqMLZSKLqMsdHYWJVuoScSgEfT3uK7s2+91/Ltm5J/F0UCwLTbXayEIfSDmUOabV6yn6nPsmw2xKkY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=GwgME2YP; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=GISgvpev; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="GwgME2YP"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="GISgvpev" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68OMP2gG3627842 for ; Fri, 25 Sep 2026 00:28:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= CxnyWlwLC18eg+ibLHUUYwSrMx1l90B1bOPKgOZtRY0=; b=GwgME2YPg3gIp+fy LHlHdTyTlgqtcH5R43YFGqx7HlT10bUrbqthf7WbOii4t4KpASZt/JfNYg6dEAQY RQHxt0TAk9jD96Mb473ZGuozbmvCVZjv99KxrIRXscB0jKxOKWnYvLOiYuUIJiPN ZdwJCwgDKExcTt6dbZnS9EA1x1+KejsrlqZRIntnLCZNW8LlXxkP+C+Qp+X/LfMj 1HzpEmlAH8ICpcMkbrAb9vxJS52Q3UbR1SL7hxd8NrfREjsMk38Og8NcshGQ2Ti1 msYHP3ezT/cK4amj7zgPCuGlOtiuHFtpwX/COaJGrMabMQMgFPdTH5HtbxMvklwT jXDeVA== Received: from mail-dy1-f200.google.com (mail-dy1-f200.google.com [74.125.82.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gw898sdcg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 25 Sep 2026 00:28:09 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-33e4e0f0302so14317eec.1 for ; Thu, 24 Sep 2026 17:28:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790296089; x=1790900889; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=CxnyWlwLC18eg+ibLHUUYwSrMx1l90B1bOPKgOZtRY0=; b=GISgvpev93mLnOSplySK6QxGlrs/7RVLSxK7PkIHwsuRbjiZNdiPayMPzVQOMdCwMk BQSOS/b7pPRKC4d5O4mGYNh7QxRZ4dxzYmwGoOrvKUr5c8opXyCqSq7UlnRr9n66WE3l 0/uasld7cknBHZ7wJKoEgRJqd9T+5gpGIrkhUDSfI1t+rRfvapRzb3BOt0YJsLSiOOiP OK6cP0rSjeMMCOXX9URhyDBDzEd2KqXhwtSC46E/VKwl/IDU3Rd5iKDXhT3JRUiswzSm 9Aagw/Rnb/Hb6+bmQVXI9/ZvcQxuaG6Q2B38Xf0mC23x/f4dwhpqMiMxcY3YAgCbshO+ YntA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790296089; x=1790900889; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=CxnyWlwLC18eg+ibLHUUYwSrMx1l90B1bOPKgOZtRY0=; b=mW7DNh8n+z/Z0KQwRmV9WSLRIJ5EdAKhb38/plFtU9f9SpvhD14LRhmcyaRtPfwIdM GIdabdgGDHaTXmEC1FVseUP5fkCOrlMpSDcD/+mB0StWFb/3XyKmf1WIND7Ur6KjcDyA QTCC9Wd+zpbZIinVE4w9Dlsfh+QDInv+1l7dfOzISjs3YM8MN2qJd8TRLPDhWTlY4zBE 9q0E9bC/QnoLfjDf5CMYwRv7Vi1Bn9juh51RaQOJx2jwmW9cghvvoE12RaKLsNB2azsE odcwiVKIPYTZSUotOfffa4RYxH9EqwKlJBGPzcdmnXpYg2epcpPvPHjmE47zMo9zqjjP hdoQ== X-Forwarded-Encrypted: i=1; AKwUvBzXAGP7w2sI1e0NwWAofObzCZpTyBsVUuKbWSk9sO318p6ZpvVgyifkRGlaE/XNmVWing2xkZq8I+Z/k1g=@vger.kernel.org X-Gm-Message-State: AFuF++lz51McIk7OlWAvpY/URLGCgHjFNrTbfpzTOBG/GQohEMRN7zTZ EB/GxlChqJKhRDL4zxQIR+Wv3lKki9My99gByzHv9CDmT8c7UYoyd3PqzkeT13akmsSPMtxv+eG ZmB7hCHksAbwTxiRjKElbstA18WfIlNg9AR3nrO/FK2Sa1KD/bgNvydGA4pqY3hS+/Mk= X-Gm-Gg: AYBFou1rUUWNZVNE7Nu+0DVrOOuJ+R+Qj2VG4jLir7l5liYWJeimkNkf17LldyyUN+f Ryy33Lbn58lw52bo3E0LHWufv69i/mHWs+REcqcgi4wh0M1U6CwdQNSTMsK3Am1oUiGYYgNtjPp RwKA5JPKmAH6xDgEitwIHzhcuSu9tZxv1mpy7zApHXt4CrpuQjzDrLOrT2yvG3G8nXeDOo3YypR qSB4sWsDkrpzmVuW5j5h529tAEwdn3/Ir5KNLxR7f2ZS/B5dExB3MjHe1JrG81Va00FUEKu6iXF ffXw2/LeMaxTElzHxUbD2gU7/aZWkP/E+hRJZ2dN74rdPIlYQZD1IbzlX2F51CtJ+sNTh1tnO9R Taw9cr3zUbwc9pMFoEHC3v+kfh97ymBFwTjTMzOYdE8vjMl4J77HX3k+kHY6G X-Received: by 2002:a05:7300:6c12:b0:340:f698:fd56 with SMTP id 5a478bee46e88-3414a792afdmr1655013eec.2.1790296088736; Thu, 24 Sep 2026 17:28:08 -0700 (PDT) X-Received: by 2002:a05:7300:6c12:b0:340:f698:fd56 with SMTP id 5a478bee46e88-3414a792afdmr1654969eec.2.1790296088035; Thu, 24 Sep 2026 17:28:08 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3414485a9cdsm1873736eec.16.2026.09.24.17.28.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2026 17:28:07 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Thu, 24 Sep 2026 17:28:03 -0700 Subject: [PATCH v7 2/5] media: uapi: Introduce new control for video encoder ROI 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: <20260924-enc_roi_enable-v7-2-6fa7413af23c@oss.qualcomm.com> References: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> In-Reply-To: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1790296085; l=5812; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=zsWqRKtlrZSWGWqLaRyE0mDAEmZ07PgIoNKYlaI+SjI=; b=T19hABZoOOOVC9RMfWOwjm8t7O5zOziPM7uC1FwzeXh3KXJnF2yW07mnILxd5IcmX8HrCRb3R MhwXXEVu1JZAB3VgttWOAqqx6KO9GZV+pNqrM6Z/j/p9VHrX0dezcsA X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX/WG/R8h9Silh X3vEtOgAPU+qUmVWgacA4NrKQq45uGUQSGlYhoZmbXv8644X1CEi2d9ytwk8Gq6Z6FW8AVUeQhX KTMiqki5TmmYDe+APoZTN9zbN7BbQJQTDm7iBQ93daTZ41qsHeQEjvOEkuSqVHuxXeKAbcyr8nq pKs9zzduUctdzkq1nVeF6Exc8kO1bBMNmHGD+xd9uROPUOtBXZRf8E+Gln1sg51XGn7aEWZGMvU TnjJ2KeL99V+/Xh3PTwcdn5EVjjGFbWH341XPZNAP8fC0wU/AfIRPl28JxMUFxM/s+GxXM6rp3F OaBlPEnmg421BGyHyDS7AD1Hw3lzOf4EezpM3Wom2KWBcQvWnTzzLTsth9jeZucjAZ9X5ZX5I4+ KmzI08ovjVV2cDyddpZ+CTgRqbw4KjtlFTA51RI6e7OzpCocZAkx3EA0/fyU/NIQSD0Gr0nKdZP 4fla+xUSNXxRyywY7Yw== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX+YdUjfVuKK4y 6mprfses3h3y37CD1cVM8JOI8NQI4A/RW8ErPTIaiFMUAPoFKjJYfGccoEyRzEbj9dyd6Qi239M 7SlDF4jQ/VR4XLs8xob3d1gz47MgBbU= X-Proofpoint-GUID: OoEQh3a8Wh4iRAxyTIv3YT_orS1JDr4E X-Proofpoint-ORIG-GUID: OoEQh3a8Wh4iRAxyTIv3YT_orS1JDr4E X-Authority-Analysis: v=2.4 cv=EJWTQFZC c=1 sm=1 tr=0 ts=6ab5c019 cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=Ap6q5WERqFDIfUOaLDQA:9 a=QEXdDO2ut3YA:10 a=6Ab_bkdmUrQuMsNx7PHu:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_06,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 clxscore=1015 spamscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 bulkscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609250001 Add array control, V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP for video encoder Region of Interest to allow applications to specify different quality levels for specific regions in video frames. Define V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE to retrieve supported MB size based on codec from the hardware encoder and set the corresponding ROI MB delta_qp map that adjusts quantization relative to the frame QP's base value. This enables use cases like prioritizing quality for faces in video conferencing or important objects in surveillance footage while reducing bitrate for less critical areas. Signed-off-by: Deepa Guthyappa Madivalara --- .../userspace-api/media/v4l/ext-ctrls-codec.rst | 26 ++++++++++++++++++= ++++ drivers/media/v4l2-core/v4l2-ctrls-core.c | 3 +++ drivers/media/v4l2-core/v4l2-ctrls-defs.c | 10 +++++++++ include/uapi/linux/v4l2-controls.h | 2 ++ 4 files changed, 41 insertions(+) diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Do= cumentation/userspace-api/media/v4l/ext-ctrls-codec.rst index ab865a1a6ba929f1725ce2ab0fd3aeee4a69329a..a02ec20ec18f0e684973964d2de= 1759ad179b819 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst @@ -1674,6 +1674,32 @@ enum v4l2_mpeg_video_h264_hierarchical_coding_type - Codecs need to always use the specified range, rather then a HW custom= range. Applicable to encoders =20 +``V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP (__s8 array)`` + This control is a dynamically sized 1-dimensional array, + V4L2_CTRL_FLAG_DYNAMIC_ARRAY flag must be set when using it. + This array control is used to set ROI MB map delta_Qp for the whole fr= ame. + The frame is divided into a grid of MB Size by MB Size pixels (MB Size= is + obtained from querying ``V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE``). Each block + is configured with delta_Qp in raster order. The valid range for delta= _Qp + is encoder dependent. + Applicable to encoders. + +``V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE`` (integer) + A read-only control that reports the MB Size used for the ROI delta_QP= map. + The supported MB Size depends on the encoder codec. + Only square MBs are supported. The value returned represents the + width and height of each block in pixels. The ROI delta_QP map provided + through the ROI control must use the MB Size reported by this control. + The number of entries in the ROI delta_QP array is determined by the + frame resolution and the reported MB Size. If frame_width or frame_hei= ght + is not MB Size aligned, they must be ceiled using ceil(frame_width/MB = Size) + ceil(frame_height/MB Size) for calculating the array size. + For example, for a QCIF frame if reported MB Size is 16, + the delta_QP array must contain 99 entries, ceil(176/16) * ceil(144/16= ) =3D 99. + For frame resolutions that are not aligned to the MB size, for example + 1920x1080, if the reported MB size is 32, the delta_qp array + must contain ceil(1920/32) * ceil(1080/32) =3D 2040 entries. + .. raw:: latex =20 \normalsize diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2= -core/v4l2-ctrls-core.c index c5df0e0a54f81c73975f427957b7c99fd421d5ad..2318a548f16ebc1ec582f829c79= 45a8998b96708 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-core.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c @@ -1410,6 +1410,9 @@ static int std_validate_compound(const struct v4l2_ct= rl *ctrl, u32 idx, return -EINVAL; break; =20 + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: + break; + default: return -EINVAL; } diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2= -core/v4l2-ctrls-defs.c index e062f2088490470c42d6c579ff7675be454a29b0..8f895060799ea13443143edd398= dfb97f4ba0085 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c +++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c @@ -974,6 +974,8 @@ const char *v4l2_ctrl_get_name(u32 id) case V4L2_CID_MPEG_VIDEO_AVERAGE_QP: return "Average QP Value"; case V4L2_CID_FWHT_I_FRAME_QP: return "FWHT I-Frame QP Value"; case V4L2_CID_FWHT_P_FRAME_QP: return "FWHT P-Frame QP Value"; + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: return "Encoder ROI MB Delta Q= P"; + case V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE: return "Encoder ROI MB Size"; =20 /* VPX controls */ case V4L2_CID_MPEG_VIDEO_VPX_NUM_PARTITIONS: return "VPX Number of Parti= tions"; @@ -1622,6 +1624,14 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum = v4l2_ctrl_type *type, case V4L2_CID_COLORIMETRY_HDR10_MASTERING_DISPLAY: *type =3D V4L2_CTRL_TYPE_HDR10_MASTERING_DISPLAY; break; + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: + *type =3D V4L2_CTRL_TYPE_S8; + *flags |=3D V4L2_CTRL_FLAG_DYNAMIC_ARRAY; + break; + case V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE: + *type =3D V4L2_CTRL_TYPE_U8; + *flags |=3D V4L2_CTRL_FLAG_READ_ONLY; + break; default: *type =3D V4L2_CTRL_TYPE_INTEGER; break; diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-c= ontrols.h index d17e41d51d2ec1ccb9e8ceb3ccc89ebc4381a4cd..be484156ed35a19229be23ad24f= d224cb5a8a0cc 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -941,6 +941,8 @@ enum v4l2_mpeg_video_av1_level { }; =20 #define V4L2_CID_MPEG_VIDEO_AVERAGE_QP (V4L2_CID_CODEC_BASE + 657) +#define V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP (V4L2_CID_CODEC_BASE + 658) +#define V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE (V4L2_CID_CODEC_BASE + 659) =20 /* MPEG-class control IDs specific to the CX2341x driver as defined by V4= L2 */ #define V4L2_CID_CODEC_CX2341X_BASE (V4L2_CTRL_CLASS_CODEC | 0x1000) --=20 2.34.1 From nobody Fri Sep 25 06:47:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 4B0FB2F8E8E for ; Fri, 25 Sep 2026 00:28:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296094; cv=none; b=C0ZX8QMJAgks82/oZpXOwyNtnM59/nx3rfOVarY4rT4a0F5KT2uByNbTPks4QhCDMk5szVLWtdJsjX60nh6qBNxNIfzD+xKAb8SbSuOXM5eRRzlhCPR8koDCdDe308oE8zqYmxqFI5tx5ExRqt1nO/E3Zzcik5T/yQc6/icL4fg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296094; c=relaxed/simple; bh=qhDIKatvc8QjYzDdfJRdI//vvXfzsp3LwrBw+VlkXP8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H7Oa0gzXZMCCJy5SSREIcTIri5sDtZJhIRr9P/cgM9SEj1O3KVLUh1qq48KZAv8xd5ZYhfVgjYyQW/7pBB481IB+nZ8Gp3cIFMCUs4iyHYgxIWjx49dqw+N0YAbPjBYN5OKHC3O1E3EPj2a9BgUxc8MWmewNqqN2vPWrLrVK3J4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=A6wQj/OV; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=B2/xh570; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="A6wQj/OV"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="B2/xh570" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68OMOvou3466308 for ; Fri, 25 Sep 2026 00:28:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= AmkpKbva0YRJZzRy25xoes8lWSIWCREJBbQ88dr+fyg=; b=A6wQj/OVziz/LSZB DxBCGvnHrW9NIYeCKgMM7xtTIOttkIz/Wfst35SmSOzTSjTt+YXV111Wv9qDMz7N E4YSk29c/ZGMlMZKuvJYkqAxTKKcGvsxpKt0JHo9vlEuKjs4sWPOW8Onxbp4jbmC PkcZGbuhq2OKU6Z8oruKOKM/znynj+J7SoRHAvirZay9prb2toI/ckHky93xMB4n 0+SXITFlurSkYWsMfxLPhurt73vHxKjqWpy4a/By/SVrzp+D7r2+4Wjbgh08uUGm Qk8yAg3CeUAdARnn5q/uBJsIZH9r7Iz3EnYvaJuLSfm6jO356fTy2UCzsFlaNwS/ juFh0Q== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gw4652jwh-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 25 Sep 2026 00:28:10 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-33bf1d17dfeso16059eec.2 for ; Thu, 24 Sep 2026 17:28:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790296090; x=1790900890; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=AmkpKbva0YRJZzRy25xoes8lWSIWCREJBbQ88dr+fyg=; b=B2/xh570EhO9CA3tFGGJP80xFY2ciCb7eoXdzNglrLzbaS8koOP3HhSoDOCIAA6/ct fN2v+YEn/LDZg3HiN/leNTDOWMIViRD+zxJuqOO7NwtnKJLSs3v6TUyLUq3S8gLKF6T8 oKpfGsasKkx66mizzUpMBdlBBV9poWlX/Ut1PT3fc5O3HmEDaloBWiZaB/qLcy+I+14Y 0HxdkiaBho3nUAArIaeES5FSLmW2TAxmjIt3JeS2zbPF6sulVOIMN9cPmaePrBpkApIm RnTnvlcPwkJI5nIHXTMg+bg9fZ0YccG7PUv18Wo0D8orQxXjQG+dRLtuIfIWmFRrhaPZ 2bkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790296090; x=1790900890; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=AmkpKbva0YRJZzRy25xoes8lWSIWCREJBbQ88dr+fyg=; b=tvQWtG484E+rHd7wdnx3rLSy0UQ8t2EdWi72jA/9i7D8d3z3CV+lwB71/XOhaot8/W DdG81C5EpGvnBzJ5/TSQKb4APpdLS1fbkA+Rjt7xPddh5pB1gThkmFKGzxvAA+Iqt3iK 0XqyZd+YhWrVucqgPbawlpUPX5Bbn9qAT8M2JC0eAGKN+jnDzn0JS9SjZezswZ1GdY2K h+8LUNZBJSrCdmtdkhNbgSZNWK4spejf/gjWTPim5/qtfZyeipkXCfa+6/7+F+o1d8Ie pTU15doEaJ5mPM8rQn9hIUILht10Reh3xUJ4LcUI8P8ShPZcltFs0Ke91tRUNlMazAxt 3Vug== X-Forwarded-Encrypted: i=1; AKwUvBxBG50OQ8d5dkF2E+ItyH1wKiCGFWz+Z70e1xtvFnAn/PHNQaqGTa03T+NimYbp9dmfuJ+J+Y/84WuxYok=@vger.kernel.org X-Gm-Message-State: AFuF++mvnUAGyVUb2Pwmh4N69OCrCSq3RmW1WwnQP93ns206hvJKhwVs kFex/nIfjNPTfTfr3AHMj3gzya5OtaRpPkI/9J812aSrPlaxm0gJZFWSkh867A3JFHDd8Sie2EN nFJk1eDngK5toXSlkDB07Jf4sfLvrByyCfxPc+15QW447/KeTIPk7P44R+PeNGimEfqM= X-Gm-Gg: AYBFou0ggAHQLIOo0dVldLCLYfUSjrTLrcKYUb5m+3VFp2Pe0Ffc0w+g8kOPh8UvauI yalMBWvPjE9RIJBgGwjoZG9NeTkP+zjFs7vOs6XKh6Puy/fNhX7xJz6tkkuE4Zg7FMWLlzQKL9R EFqR0lOZ8Mny26IWYXgB3FEE2c+toDyqrphyuN5OFmAbRpHMCxigG+CkBsCKTbhNT20m5NmfOBY L8vwlcXBMOVL9smSO+hwHb34ASJ03n2WuRCk1OhqUJbh0XPfJpjJzMwrU47pzFFaj0rxvRZ67uO sBktN1wmmH2JUdunxI+xiq5rU064BBi+KXEUnE1ixRjGtTWySi/kX1E9uC5mh76h7q0KuA5CGTn 1P7BfHqwXVju7EsqSOa8HLEGpbAiWDxll4vUmnyMk8FEKJYZbVFGCrklwgJrb X-Received: by 2002:a05:7300:c8c9:b0:33b:e1f2:fa0d with SMTP id 5a478bee46e88-3414a4a3283mr1294768eec.2.1790296089671; Thu, 24 Sep 2026 17:28:09 -0700 (PDT) X-Received: by 2002:a05:7300:c8c9:b0:33b:e1f2:fa0d with SMTP id 5a478bee46e88-3414a4a3283mr1294742eec.2.1790296088913; Thu, 24 Sep 2026 17:28:08 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3414485a9cdsm1873736eec.16.2026.09.24.17.28.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2026 17:28:08 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Thu, 24 Sep 2026 17:28:04 -0700 Subject: [PATCH v7 3/5] media: iris: Add ROI delta QP control support for HFI Gen2 encoders 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: <20260924-enc_roi_enable-v7-3-6fa7413af23c@oss.qualcomm.com> References: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> In-Reply-To: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1790296085; l=7477; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=qhDIKatvc8QjYzDdfJRdI//vvXfzsp3LwrBw+VlkXP8=; b=fZklzdJAq+WgyQOwPW63YkW7uA6aK0n9SN+YQ0Hpnqsvrw15QBDgKS6/WTItVZLlblhA+Ow73 7i9MieTcHhBAFamrAMqOE/UUJf9wqWwOmfyn3cXKxAJYoQZLTWmigTa X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Authority-Analysis: v=2.4 cv=Wrq+otfv c=1 sm=1 tr=0 ts=6ab5c01a cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=uxVkaJQCnwIzyWVbueAA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-ORIG-GUID: q21Rgu6cgeW8OgDFUU7h8msE1-e2uc6X X-Proofpoint-GUID: q21Rgu6cgeW8OgDFUU7h8msE1-e2uc6X X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfXxsquVlDUYHUk NJbk7neY6EmKM1DynyWvHFg5MoGT+yWqwRhmTUoT2iy9ILvhSjLVV7PiVcYIpm+mX+dMl/RQlzB CBKJBDdlOBcZLcq6a/Qa5tFr9iTiQKU0EINh9TDCr5JHHlBMsSbpgx6yi+B7ldNCxlnZRy+XKWf rMCwYnYXnUUHlNksOnAfLsVwCoCNtKdEV6w+DkZFaiEcxYDted3U4IEsIIBe448ltfQ8rB0CrUW hP3f3c+662ppvviREYHi9sRhcfIwu3sXpOx/Ysl46RZiKLZHHxAGCUSQ0VCMwNoaGyC18ZLLnuf vegFTVV0V+6b+zEIkykEKcpeikMRjF79NbUtfaRjT/8hrLVyjattIM1AvlUhiz2dcd5bybnIh6I s3YEtWopsnv9Hx9ZS87n89Gtya+VpGkDoeDnyllc4kFNYZQ08fMr2xUZ4be4r0gWYtdqTNMNFGn 9HGELd7bnSriF71IldA== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX8ONt1M+tfSUL t2NOmtFbsYh/fZDVPWF9yK6WBPu2XWvKur7vt55BeMJk4vINPWqdpz62Ug7hjC1HoX+nyKi8DdV ZV/cbk5TFt1Bax2t2oAcMiy5XVKxTBo= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_06,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 bulkscore=0 suspectscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609250001 Add ROI support to the Iris encoder driver for HFI Gen2 based targets. - Add control infrastructure, ROI_PARAMS and MB_SIZE capability IDs to platform_inst_fw_cap_type. Extend struct platform_inst_fw_cap with p_array and elems fields to hold a pointer to the per-frame delta QP array and its element count, set during s_ctrl. - Register V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP as a dynamic S8 array control (max dims =3D 139264 entries, supporting resolution of 8192x4352 at 16x16 MB granularity). Register V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE as a read-only U8 control; g_volatile_ctrl returns 32 for HEVC and 16 for H.264. - Define HFI_PROP_ROI_INFO and hook ROI_PARAMS to iris_set_roi_params(). Signed-off-by: Deepa Guthyappa Madivalara --- drivers/media/platform/qcom/iris/iris_ctrls.c | 70 ++++++++++++++++++= +++- drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 13 ++++ .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 + .../platform/qcom/iris/iris_platform_common.h | 5 ++ 4 files changed, 88 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index bf17d310eac081ffd3a4ad4842c2255ad798d4d8..9f84d28d00ab25555f1d2259f7e= f0ed0786a0271 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -156,6 +156,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(= u32 id) return LAYER5_BITRATE_HEVC; case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME: return REQUEST_SYNC_FRAME; + case V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP: + return ROI_PARAMS; + case V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE: + return MB_SIZE; default: return INST_FW_CAP_MAX; } @@ -301,6 +305,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_= type cap_id) return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR; case REQUEST_SYNC_FRAME: return V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME; + case ROI_PARAMS: + return V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP; + case MB_SIZE: + return V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE; default: return 0; } @@ -327,6 +335,14 @@ static int iris_op_s_ctrl(struct v4l2_ctrl *ctrl) =20 inst->fw_caps[cap_id].value =3D ctrl->val; =20 + if (inst->fw_caps[cap_id].flags & CAP_FLAG_CUSTOM) { + if (cap_id =3D=3D ROI_PARAMS) { + inst->fw_caps[cap_id].p_array =3D + (const void *)ctrl->p_new.p; + inst->fw_caps[cap_id].elems =3D ctrl->new_elems; + } + } + if (vb2_is_streaming(q)) { if (cap[cap_id].set) cap[cap_id].set(inst, cap_id); @@ -335,8 +351,53 @@ static int iris_op_s_ctrl(struct v4l2_ctrl *ctrl) return 0; } =20 +static int iris_get_roi_mb_size(struct iris_inst *inst) +{ + return inst->codec =3D=3D V4L2_PIX_FMT_HEVC ? 32 : 16; +} + +static int iris_op_g_ctrl(struct v4l2_ctrl *ctrl) +{ + struct iris_inst *inst =3D container_of(ctrl->handler, struct iris_inst, = ctrl_handler); + enum platform_inst_fw_cap_type cap_id; + + cap_id =3D iris_get_cap_id(ctrl->id); + if (!iris_valid_cap_id(cap_id)) + return -EINVAL; + + if (cap_id =3D=3D MB_SIZE) + ctrl->val =3D iris_get_roi_mb_size(inst); + + return 0; +} + static const struct v4l2_ctrl_ops iris_ctrl_ops =3D { .s_ctrl =3D iris_op_s_ctrl, + .g_volatile_ctrl =3D iris_op_g_ctrl, +}; + +static const struct v4l2_ctrl_config roi_mbqp_cfg =3D { + .ops =3D &iris_ctrl_ops, + .id =3D V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP, + .name =3D "Enc Mb ROI Delta QP", + .type =3D V4L2_CTRL_TYPE_S8, + .dims =3D {139264}, /* Max MBPF =3D 8192 * 4352 / 256 */ + .min =3D -31, + .max =3D 30, + .def =3D 0, + .step =3D 1, + .flags =3D V4L2_CTRL_FLAG_DYNAMIC_ARRAY, +}; + +static const struct v4l2_ctrl_config roi_mbqp_size =3D { + .ops =3D &iris_ctrl_ops, + .id =3D V4L2_CID_MPEG_VIDEO_ROI_MB_SIZE, + .name =3D "ROI Mb size", + .type =3D V4L2_CTRL_TYPE_U8, + .min =3D 16, + .max =3D 32, + .def =3D 16, + .step =3D 1, }; =20 int iris_ctrls_init(struct iris_inst *inst) @@ -361,7 +422,7 @@ int iris_ctrls_init(struct iris_inst *inst) return ret; =20 for (idx =3D 1; idx < INST_FW_CAP_MAX; idx++) { - struct v4l2_ctrl *ctrl; + struct v4l2_ctrl *ctrl =3D NULL; =20 v4l2_id =3D iris_get_v4l2_id(cap[idx].cap_id); if (!v4l2_id) @@ -379,6 +440,13 @@ int iris_ctrls_init(struct iris_inst *inst) cap[idx].max, ~(cap[idx].step_or_mask), cap[idx].value); + } else if (cap[idx].flags & CAP_FLAG_CUSTOM) { + if (cap[idx].cap_id =3D=3D ROI_PARAMS) + ctrl =3D v4l2_ctrl_new_custom(&inst->ctrl_handler, + &roi_mbqp_cfg, NULL); + if (cap[idx].cap_id =3D=3D MB_SIZE) + ctrl =3D v4l2_ctrl_new_custom(&inst->ctrl_handler, + &roi_mbqp_size, NULL); } else { ctrl =3D v4l2_ctrl_new_std(&inst->ctrl_handler, &iris_ctrl_ops, diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/med= ia/platform/qcom/iris/iris_hfi_gen2.c index 3b8fbefb8b93576962abd3850215f7b7fb364930..d628bc6748438b19dac01cd11cb= 9f8da0b8500af 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c @@ -1782,6 +1782,19 @@ static const struct platform_inst_fw_cap inst_fw_cap= _sm8550_enc[] =3D { .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, .set =3D iris_set_req_sync_frame, }, + { + .cap_id =3D ROI_PARAMS, + .step_or_mask =3D 1, + .p_array =3D NULL, + .hfi_id =3D HFI_PROP_ROI_INFO, + .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_CUSTOM | + CAP_FLAG_DYNAMIC_ALLOWED, + }, + { + .cap_id =3D MB_SIZE, + .step_or_mask =3D 1, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_CUSTOM, + }, }; =20 static const u32 sm8550_vdec_input_config_params_default[] =3D { diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_defines.h index f43aea10090d8f1d6ae5c20547e5f6321b2ca203..08fc1036013de29e51747a6425a= e7bb805ca3e0f 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h @@ -133,6 +133,7 @@ enum hfi_flip { #define HFI_PROP_DEC_START_FROM_RAP_FRAME 0x03000169 #define HFI_PROP_NO_OUTPUT 0x0300016a #define HFI_PROP_BUFFER_MARK 0x0300016c +#define HFI_PROP_ROI_INFO 0x03000173 #define HFI_PROP_WORST_COMPRESSION_RATIO 0x03000174 #define HFI_PROP_WORST_COMPLEXITY_FACTOR 0x03000175 #define HFI_PROP_RAW_RESOLUTION 0x03000178 diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 9748095091461ba13443c63955a42906fa4f050c..9910eb5514b3ae0a6b5349adb07= 1d0a56375102c 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -186,6 +186,8 @@ enum platform_inst_fw_cap_type { LAYER5_BITRATE_HEVC, REQUEST_SYNC_FRAME, TIME_DELTA_BASED_RC, + ROI_PARAMS, + MB_SIZE, INST_FW_CAP_MAX, }; =20 @@ -197,6 +199,7 @@ enum platform_inst_fw_cap_flags { CAP_FLAG_CLIENT_SET =3D BIT(4), CAP_FLAG_BITMASK =3D BIT(5), CAP_FLAG_VOLATILE =3D BIT(6), + CAP_FLAG_CUSTOM =3D BIT(7), }; =20 struct platform_inst_fw_cap { @@ -206,6 +209,8 @@ struct platform_inst_fw_cap { s64 step_or_mask; s64 value; u32 hfi_id; + const void *p_array; + u32 elems; enum platform_inst_fw_cap_flags flags; int (*set)(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id); --=20 2.34.1 From nobody Fri Sep 25 06:47:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 63F1030D40E for ; Fri, 25 Sep 2026 00:28:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296095; cv=none; b=F1X+Kx63jM5nnpWO0IcdntJYELLRNMqXKdSad/WpvCyW1AqCZy5FVC9wBSRJdwiYhiO1AifJj6TjHHM4fzr0d15HCw3trDYmfD8VPCCHkiMwOJm5KcDoxOduEsH647gM5Ny06oIsF/7xDsX46H3ocdGVACLJQD0kj+n9j0ec1y0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296095; c=relaxed/simple; bh=F1xOH8Cv2QTO/PdtpfpJ4A2wP9Yac1w7ltfZ9UagIk8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M1acJ1symXvlUhqtaVtigubvSF7vM+N86xPZWB7DFdXA6L/y5Fp8/Tan0PCKieElAJf0+A2j5Fh4M7SbhTohyE3snSRBL3yZ2u0zWmp7AtUFsaQxKs4qc5JZ1dJcF85j+thKKmrRqIic9mUSSFLqtQD0L1auZrdvB4ZXulvT62w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=h+HAWHsI; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=dxCKGY6V; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="h+HAWHsI"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="dxCKGY6V" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68OMPPG34088175 for ; Fri, 25 Sep 2026 00:28:12 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= yWiDRPUxvuc+Oi4qfhXW5cAHNiKdMjmxsxbPvaFsH0c=; b=h+HAWHsIMGgK7Qj4 ExmKf2L3OWaQxQNKfuRVQpARTzUWQb+JIR7f0jve63wOXuUtwcp+UeuqLj6LueM5 EVAN4DqfCTFaWbP28Ii6Yolsig+oEZFnvB+fpl1swqnLFn/xVWbjZ+46qeYkY5DJ MmNr2K20pFFxyw8iPik8Gu3e6zUtibLO/NkL9XpUbVRlEEKyiTKtkKtGtYXnnTBj 6MaUfpv8Zm+m1XuJcGMpuZsxn921Q7AXB2dvsOy1ClossqPAXacJ/4aTOWCO9jy9 b9Mpz92iJWzlj/7jaOSgY/NoDv/rxDc8Eb+8SYDH9JewTG+DEIiNuRe4NGRISkad t9yKwA== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gw1s936qm-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 25 Sep 2026 00:28:11 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-33c0b54834bso31051eec.1 for ; Thu, 24 Sep 2026 17:28:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790296091; x=1790900891; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=yWiDRPUxvuc+Oi4qfhXW5cAHNiKdMjmxsxbPvaFsH0c=; b=dxCKGY6V/DSmnb4rGOXiYY9oRWvNurKvAXQ2ShwDJcZ+AJqHkzXfeK96iRiJSibXbI VUPiN7pucgARe/ovEqfyQ3Jv3Y+k0N0BEKWJrnhtjQi9azTk7N6tGa4H1WPxN+tmtb82 L1pN6hs6fcgT7BMhm2qAH7uplfnUkchTvJ51GN4CXGv6Y7iDlBmYqDiryb8S7bbgbpX5 IT8oYAZvUke6qAVRv0NzKhxRnDEEfBKAaUCn/4yk9SKvTSP8qOTSsy0D+L971fvMbL1m hM8AKjcTczhQNE8NV8pSE/leD3xHyMB2MYvOBDvlo9I3oYjCE3kDklXfSJja61qCceMF dN3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790296091; x=1790900891; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=yWiDRPUxvuc+Oi4qfhXW5cAHNiKdMjmxsxbPvaFsH0c=; b=JANqAs/sxBclbW3VSSFmLofmgqlDy0TUt6ZR90gBUYguwukNTCn0kCSlFaoQdu6Ycm v0R/3goNJhc6rJKJYfuSrCdBQ1Iwspa+WY0fUc/CdkF+fil/oZfkna0cS31sID9rACbZ TxOX8qbNYS83PClXW6jS7uAuKyULRFCFt57ev6JpTNXxBoLknvMY09DFxQ27cwt1Wmvl /5WbLkdNu7+uo7ahUsIQNjbionqmiOlvSzXEKMszerq9DYTFxZewMoc6+97AHBfsc62t B1yRVSorNK29A+02e+ymqgHZnnBY3K1aeu0zG8uJLoQWErepmrFUChCssmGOqzsvoNlx wIFg== X-Forwarded-Encrypted: i=1; AKwUvBxuyl8h/fVqjtHuYEBWWKDDiZ96GurcdnYcS5cbqifgrYzmq8eOhmWfuB69BIEP1umVJvUvG306zaLCKh0=@vger.kernel.org X-Gm-Message-State: AFuF++nRvhCqChToLwHqoysqg9xBSnb7xQzwds+QjbIZGsSyHWrWvVO8 Sb2DJWwC8gYGD1jl2H8vo3STc4ZR6leUk3OzkwgqHubb8YYQcyccPexh25E1irTLAI8Q6nf401v rIJI4Dtnz4we5PK7Qcz6z2zLzoXbgmFhaCpT4OyAfYl3AXDKCbsA6IyN+j9vptIy/+kg= X-Gm-Gg: AYBFou3cnWsXpd9zeDieY25XSbRecgseq2TrOH2dcVGRpDfSUwJAxr+nIYMT4kOh7KD 7aKQVZgVJnfn99uz3k5agVIH7SpuJlNb8ETw8A7LNYL9Lx6h3YIL7JZ3OBUH3Ecyzvw9TFcfHmt isc5jh/vWfzZhp2TcaibyhgQpnRsgy5zGxF7J7SHA42p3EebTyXfW1xRuqDxegzek8+x4WhN85w bkw5nZbtoD8/Ct4HJo6Jwt0ZpIIi2OYVkd0Wj5pusJ0XrQaqaMcaafdaNFotK0QAhe+ybAnnvkb OPeQAEedtC8nspqYPKHQ0ZbncyqA/wpC8oVhRINIsllN+lbKjxY8RFWTWT9w+kQfFOj9d60c3IT O4MtzFW9sF4FiNGj7qakwZLLRK2dbwYFeTr5HrAfgHpFfe06pTfgOctaSpznW X-Received: by 2002:a05:7300:d507:b0:33f:3750:4e22 with SMTP id 5a478bee46e88-3400181e307mr7020363eec.0.1790296090596; Thu, 24 Sep 2026 17:28:10 -0700 (PDT) X-Received: by 2002:a05:7300:d507:b0:33f:3750:4e22 with SMTP id 5a478bee46e88-3400181e307mr7020312eec.0.1790296089816; Thu, 24 Sep 2026 17:28:09 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3414485a9cdsm1873736eec.16.2026.09.24.17.28.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2026 17:28:09 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Thu, 24 Sep 2026 17:28:05 -0700 Subject: [PATCH v7 4/5] media: iris: Add HFI metadata buffer delivery support for Gen2 encoders 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: <20260924-enc_roi_enable-v7-4-6fa7413af23c@oss.qualcomm.com> References: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> In-Reply-To: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1790296085; l=13161; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=F1xOH8Cv2QTO/PdtpfpJ4A2wP9Yac1w7ltfZ9UagIk8=; b=0AZclOLHgJb52PM33CYduThs+EuIW2111mHA/vuTv5MnSpMbVMMsRXMwvCWoul3P5aftPIWLA lWGus99OHMCAkVifGe268V6nqDTdkilBXixYpQagdu36gEIyR3ho3nu X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX29OuB90aGOqf JqBn/uu6spJqM8VlrJau1MVg5Zdf4ukm1YBSKNDDb7FkVtacERZSaWmntQVl4Joyr01lBbacDAq IsMuPfSMysDqQP1fGNl2gATsXCqLNKY4mippiIRIeq3EMXXtFJvuBR6MX265DnGfPfZypoeGudL r66/5Z0sHwQ/A6HD/3OlEmwhZs0tFMyt0Xqt+gyyuOvWMcbUNQ/571qIOCpmgtF8MvOsuwL3cLN FRgj07Jfj5RvWU6krov9FKw1g23jwQTKAcIMBMCSqWPts3xxDmWHZckLuk85UAseQ74VTHLWqIw cyhQUwazpAQ2oyeam3yFFvRK6i4fMJUt9MC7rrcbE/kOBoSd5yQPSN3HMuFzlOb5idE4hmN/Lsz 3x+AxsCn41HMo6Y4h40/8fS4/QY3kb1JIMX01jK1PSN7vPAUmqJ7lv/61rqAW5tc9/aL6MEDDCQ u/RYMUtI22LqgV47M6g== X-Authority-Analysis: v=2.4 cv=VPxIDNPX c=1 sm=1 tr=0 ts=6ab5c01c cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=gkYz9yhuOFcMo22kqTsA:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfXzC5UoFREGgjN 4uWI0Wn6kkOhFi02X3yL1J2jwJYXS8jDaIQ2f+uO2XWPEqQ6zwmDrtZLQCANvWejTy1isa4LFrx vzPPwBTvVIDm1WVasNDjHSfnOvHJb0w= X-Proofpoint-ORIG-GUID: Y8DoHem9nsSMshoBexEdR1V5D1FYXhHc X-Proofpoint-GUID: Y8DoHem9nsSMshoBexEdR1V5D1FYXhHc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_06,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 adultscore=0 clxscore=1015 bulkscore=0 suspectscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609250001 Add the infrastructure to deliver metadata buffers to the HFI firmware on HFI Gen2 based encoders, used to carry per-frame ROI delta QP data. Metadata buffer structures (iris_buffer.h): - Add metabuf_header and metapayload_header structs describing the metadata buffer layout as expected by the firmware. HFI defines (iris_hfi_gen2_defines.h): - Add HFI_CMD_DELIVERY_MODE (0x0100000A). - Add HFI_MODE_METADATA (0x00000004) to hfi_property_mode_type. HFI command side (iris_hfi_gen2_command.c): - In iris_hfi_gen2_session_queue_buffer(), after queuing a RAW (input) buffer, check for an available BUF_ROIMB_DELTAQP metadata buffer and, if found, append a second HFI_CMD_BUFFER packet for the metadata buffer in the same command, tagged with the same buffer index. - Add iris_hfi_gen2_subscribe_metadata_delivery(): sends HFI_CMD_DELIVERY_MODE with HFI_MODE_METADATA and HFI_PROP_ROI_INFO to instruct the firmware to expect metadata on the input port. HFI response side (iris_hfi_gen2_response.c): - Add iris_hfi_gen2_handle_output_metadata_buffer(): locate the metadata buffer by device address and transition it from QUEUED to DEQUEUED so it can be reused. Signed-off-by: Deepa Guthyappa Madivalara --- drivers/media/platform/qcom/iris/iris_buffer.h | 18 ++++++++++ drivers/media/platform/qcom/iris/iris_ctrls.c | 16 +++++++++ drivers/media/platform/qcom/iris/iris_ctrls.h | 1 + drivers/media/platform/qcom/iris/iris_hfi_common.h | 1 + .../platform/qcom/iris/iris_hfi_gen2_command.c | 39 ++++++++++++++++++= ++++ .../platform/qcom/iris/iris_hfi_gen2_defines.h | 2 ++ .../platform/qcom/iris/iris_hfi_gen2_packet.c | 6 ++-- .../platform/qcom/iris/iris_hfi_gen2_packet.h | 3 ++ .../platform/qcom/iris/iris_hfi_gen2_response.c | 27 +++++++++++++++ drivers/media/platform/qcom/iris/iris_venc.c | 4 +++ 10 files changed, 114 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_buffer.h b/drivers/media= /platform/qcom/iris/iris_buffer.h index ab8e5d953101a786ade20540ee3c3ed226160cbe..ee2d24bb69c57220b0a735d9b4a= ae4434a33daf6 100644 --- a/drivers/media/platform/qcom/iris/iris_buffer.h +++ b/drivers/media/platform/qcom/iris/iris_buffer.h @@ -107,6 +107,24 @@ struct iris_buffers { u32 size; }; =20 +/* Metadata buffer header */ +struct metabuf_header { + u32 count; + u32 size; + u32 version; + u32 reserved[5]; +}; + +/* Metadata buffer payload header */ +struct metapayload_header { + u32 type; + u32 size; + u32 version; + u32 offset; + u32 flags; + u32 reserved[3]; +}; + int iris_get_buffer_size(struct iris_inst *inst, enum iris_buffer_type buf= fer_type); void iris_get_internal_buffers(struct iris_inst *inst, u32 plane); int iris_create_internal_buffers(struct iris_inst *inst, u32 plane); diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index 9f84d28d00ab25555f1d2259f7ef0ed0786a0271..1ce8eccdedbdeb840833bd92edb= 3f59dd6962d7f 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -1608,3 +1608,19 @@ int iris_set_properties(struct iris_inst *inst, u32 = plane) =20 return 0; } + +int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane) +{ + const struct iris_hfi_session_ops *hfi_ops =3D inst->hfi_session_ops; + int ret =3D 0; + + /*subscribe to metadata delivery only if ROI is enabled */ + if (!inst->fw_caps[ROI_PARAMS].p_array) + return ret; + + ret =3D hfi_ops->session_subscribe_metadata_delivery(inst, plane); + if (ret) + return ret; + + return ret; +} diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index 5180d53d3c904cad460b2760913b475d0ff1bb55..9957b69366f50310338a0c1470d= 9744592655c33 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -50,5 +50,6 @@ int iris_set_layer_bitrate(struct iris_inst *inst, enum p= latform_inst_fw_cap_typ int iris_set_req_sync_frame(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); int iris_set_time_delta_based_rc(struct iris_inst *inst, enum platform_ins= t_fw_cap_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); +int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/m= edia/platform/qcom/iris/iris_hfi_common.h index a27447eb2519962cb958b0e330a6d018310c3450..5692375cdd357f9b00760053fff= f5af4bd9cce9c 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h @@ -131,6 +131,7 @@ struct iris_hfi_session_ops { int (*session_drain)(struct iris_inst *inst, u32 plane); int (*session_resume_drain)(struct iris_inst *inst, u32 plane); int (*session_close)(struct iris_inst *inst); + int (*session_subscribe_metadata_delivery)(struct iris_inst *inst, u32 pl= ane); }; =20 struct hfi_subscription_params { diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_command.c index 388a36ff2b07b7bcd8db21d4345bc900356b4ec3..cf88dbe11e8e9faef826e661d8e= 9909fd7f16b94 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c @@ -1307,6 +1307,24 @@ static void iris_hfi_gen2_get_buffer(u32 domain, str= uct iris_buffer *buffer, buf->timestamp =3D buffer->timestamp; } =20 +static struct iris_buffer *iris_queue_metadata_buffers(struct iris_inst *i= nst, + enum iris_buffer_type buffer_type, u32 index) +{ + struct iris_buffers *buffers =3D &inst->buffers[buffer_type]; + struct iris_buffer *buffer =3D NULL; + + if (list_empty(&buffers->list)) + return NULL; + + buffer =3D list_first_entry(&buffers->list, typeof(*buffer), list); + if ((buffer->attr & BUF_ATTR_QUEUED) || (buffer->attr & BUF_ATTR_DEQUEUED= )) + return NULL; + + buffer->index =3D index; + + return buffer; +} + static int iris_hfi_gen2_session_queue_buffer(struct iris_inst *inst, stru= ct iris_buffer *buffer) { struct iris_inst_hfi_gen2 *inst_hfi_gen2 =3D to_iris_inst_hfi_gen2(inst); @@ -1359,6 +1377,26 @@ static int iris_hfi_gen2_session_release_buffer(stru= ct iris_inst *inst, struct i inst_hfi_gen2->packet->size); } =20 +static int iris_hfi_gen2_subscribe_metadata_delivery(struct iris_inst *ins= t, u32 plane) +{ + struct iris_inst_hfi_gen2 *inst_hfi_gen2 =3D to_iris_inst_hfi_gen2(inst); + u32 port =3D iris_hfi_gen2_get_port(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLA= NE); + u32 payload[2] =3D {HFI_MODE_METADATA, HFI_PROP_ROI_INFO}; + + iris_hfi_gen2_packet_session_command(inst, + HFI_CMD_DELIVERY_MODE, + (HFI_HOST_FLAGS_RESPONSE_REQUIRED | + HFI_HOST_FLAGS_INTR_REQUIRED), + port, + inst->session_id, + HFI_PAYLOAD_U32_ARRAY, + &payload, + sizeof(u32) * 2); + + return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet, + inst_hfi_gen2->packet->size); +} + static const struct iris_hfi_session_ops iris_hfi_gen2_session_ops =3D { .session_open =3D iris_hfi_gen2_session_open, .session_set_config_params =3D iris_hfi_gen2_session_set_config_params, @@ -1372,6 +1410,7 @@ static const struct iris_hfi_session_ops iris_hfi_gen= 2_session_ops =3D { .session_drain =3D iris_hfi_gen2_session_drain, .session_resume_drain =3D iris_hfi_gen2_session_resume_drain, .session_close =3D iris_hfi_gen2_session_close, + .session_subscribe_metadata_delivery =3D iris_hfi_gen2_subscribe_metadata= _delivery, }; =20 static struct iris_inst *iris_hfi_gen2_get_instance(void) diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_defines.h index 08fc1036013de29e51747a6425ae7bb805ca3e0f..d0661f5fe6a6f39295dad8950ed= b2f1a85893216 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h @@ -20,6 +20,7 @@ #define HFI_CMD_DRAIN 0x01000007 #define HFI_CMD_RESUME 0x01000008 #define HFI_CMD_BUFFER 0x01000009 +#define HFI_CMD_DELIVERY_MODE 0x0100000A #define HFI_CMD_SUBSCRIBE_MODE 0x0100000B #define HFI_CMD_SETTINGS_CHANGE 0x0100000C #define HFI_CMD_PAUSE 0x01000011 @@ -175,6 +176,7 @@ enum hfi_flip { enum hfi_property_mode_type { HFI_MODE_PORT_SETTINGS_CHANGE =3D 0x00000001, HFI_MODE_PROPERTY =3D 0x00000002, + HFI_MODE_METADATA =3D 0x00000004, }; =20 enum hfi_color_format { diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c b/driv= ers/media/platform/qcom/iris/iris_hfi_gen2_packet.c index 0d05dd2afc07d830cc8502ab5f28001312991ba8..aeb0426a05694f219f82145cd84= a28287ed3075e 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.c @@ -100,9 +100,9 @@ static void iris_hfi_gen2_create_header(struct iris_hfi= _header *hdr, hdr->num_packets =3D 0; } =20 -static void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 p= kt_type, - u32 pkt_flags, u32 payload_type, u32 port, - u32 packet_id, void *payload, u32 payload_size) +void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 pkt_type, + u32 pkt_flags, u32 payload_type, u32 port, + u32 packet_id, void *payload, u32 payload_size) { struct iris_hfi_packet *pkt =3D (struct iris_hfi_packet *)((u8 *)hdr + hd= r->size); u32 pkt_size =3D sizeof(*pkt) + payload_size; diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h b/driv= ers/media/platform/qcom/iris/iris_hfi_gen2_packet.h index 25b9582349ca1a0ce6efc0b146a3abb798485c45..613eb500609f745daebdcbdf9a2= 5b85cb9465a79 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_packet.h @@ -121,5 +121,8 @@ void iris_hfi_gen2_packet_session_property(struct iris_= inst *inst, void iris_hfi_gen2_packet_sys_interframe_powercollapse(struct iris_core *c= ore, struct iris_hfi_header *hdr); void iris_hfi_gen2_packet_sys_pc_prep(struct iris_core *core, struct iris_= hfi_header *hdr); +void iris_hfi_gen2_create_packet(struct iris_hfi_header *hdr, u32 pkt_type, + u32 pkt_flags, u32 payload_type, u32 port, + u32 packet_id, void *payload, u32 payload_size); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/dr= ivers/media/platform/qcom/iris/iris_hfi_gen2_response.c index 8c2644c7f6e85983d7ad7584fc0cb570e4813ae4..84b629b957442c024dccc18b354= ac9a7e541abaa 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c @@ -77,6 +77,7 @@ static bool iris_hfi_gen2_is_valid_hfi_buffer_type(u32 bu= ffer_type) case HFI_BUFFER_PERSIST: case HFI_BUFFER_VPSS: case HFI_BUFFER_PARTIAL_DATA: + case HFI_BUFFER_METADATA: return true; default: return false; @@ -452,6 +453,30 @@ static int iris_hfi_gen2_handle_release_internal_buffe= r(struct iris_inst *inst, return 0; } =20 +static int iris_hfi_gen2_handle_output_metadata_buffer(struct iris_inst *i= nst, + struct iris_hfi_buffer *buffer) +{ + u32 buf_type =3D iris_hfi_gen2_buf_type_to_driver(inst, HFI_BUFFER_METADA= TA); + struct iris_buffers *buffers =3D &inst->buffers[buf_type]; + struct iris_buffer *buf, *iter; + bool found =3D false; + + list_for_each_entry(iter, &buffers->list, list) { + if (iter->device_addr =3D=3D buffer->base_address) { + found =3D true; + buf =3D iter; + break; + } + } + if (!found) + return -EINVAL; + + buf->attr &=3D ~BUF_ATTR_QUEUED; + buf->attr |=3D BUF_ATTR_DEQUEUED; + + return 0; +} + static int iris_hfi_gen2_handle_session_stop(struct iris_inst *inst, struct iris_hfi_packet *pkt) { @@ -499,6 +524,8 @@ static int iris_hfi_gen2_handle_session_buffer(struct i= ris_inst *inst, return iris_hfi_gen2_handle_input_buffer(inst, buffer); else if (buffer->type =3D=3D HFI_BUFFER_BITSTREAM) return iris_hfi_gen2_handle_output_buffer(inst, buffer); + else if (buffer->type =3D=3D HFI_BUFFER_METADATA) + return iris_hfi_gen2_handle_output_metadata_buffer(inst, buffer); else return iris_hfi_gen2_handle_release_internal_buffer(inst, buffer); } diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/p= latform/qcom/iris/iris_venc.c index a945992f63aa8a0c40b8d6bc473d0bc90270e6cd..21ba9639d17b2c64e8fa33b4aac= bd1946fc4dae2 100644 --- a/drivers/media/platform/qcom/iris/iris_venc.c +++ b/drivers/media/platform/qcom/iris/iris_venc.c @@ -498,6 +498,10 @@ int iris_venc_streamon_output(struct iris_inst *inst) if (ret) goto error; =20 + ret =3D iris_set_metadata_delivery(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLA= NE); + if (ret) + goto error; + ret =3D iris_alloc_and_queue_persist_bufs(inst, BUF_ARP); if (ret) return ret; --=20 2.34.1 From nobody Fri Sep 25 06:47:41 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 2B86F322C73 for ; Fri, 25 Sep 2026 00:28:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296098; cv=none; b=lyIcpfF0UUv8UtV/rCDlJDD+6zFRi8VzV4Eyyt297trVCxGANDFgz4wz7+VUxCovM3qeS+pMnjGxZvSWGnLcTKdFHOqJi+4b0W2l43Biq/Uy8LhxsZ6bk6S4Icm3vYek+kxuyhie46WB4XbujliwCeTYby45bvkhtgE43WmBEy4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790296098; c=relaxed/simple; bh=5Y3wceAUSis4LyEEBP3vcPhXNhSkH4aQtluUG+lkk8A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pFH7cQIjRucwL34DELeaeMRCjVC/dBYvAwiiK64X4zcxQ6Xq0MGh4VTQ+4PZaT+GYqxtR/HCpCv4VoG6vEB3x7728GhME0WpylQ0J/xHToByY582l+S9jYn6VlaaiJ77mYUxU58Z9rwMWKLL1IF5fKmrFlW+kGZtwWP9j25mmBw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=lZiL+eUH; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Nzu7Vv+v; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="lZiL+eUH"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Nzu7Vv+v" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68OMOw4f3933496 for ; Fri, 25 Sep 2026 00:28:14 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= zmWHRpNSCYIUBFB4IKMz89RjhQYOyuZ9OhQTzTXuRZk=; b=lZiL+eUHJyeHRQ26 lKdZWFturUdhwchAAPdIqxZTNcId71UeP1sHLrDW0cT/p5Lkmy6mFOrSTdkUUqtY wXBzfUNbL6m9DUuLlelOd0KuEeI1/JdoAzOYysTR4QDF2uNsohh+waVMbIdib9Vr W/HKv4r/LeBmKCmUGxJZ04tvtHEB4qCGOluOFAhVpzdoxHcBR5rARBUrFl3dDmfJ yIQYhZkObMKppmodWYBkZPkUZwpuPMrCVW3u1BbtosC7hssxPttiFDGnfRJZ58Et HkvqsrQ+fHBWIryON1ctBOGBPiZ3COQDv1vnoLTqHBMmNwjvYpojnUs3Bgx0Mp9G Rjg16A== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gw1tjk6rf-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 25 Sep 2026 00:28:13 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-30f1bc68d47so26848eec.0 for ; Thu, 24 Sep 2026 17:28:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790296093; x=1790900893; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=zmWHRpNSCYIUBFB4IKMz89RjhQYOyuZ9OhQTzTXuRZk=; b=Nzu7Vv+vXzVKYqv+y5o+9zm9HPMX0hLyqzfx8nLYcVg6atUAO19tei/AW3GL+9Oq3g zZpxhUSftP76VFhJ0PkJlEZWNbHtJ7MlBPIpy9gP1XNRg1vKeXohInx1ra43/erh1EvZ egcy5wyuXPJ2eASRNBXSI4aZkjuLKnJk6xWME+ZNHDE8Nly83Ok1joq6hSl0bvWvDm5c Z/lkoEplRxgvAr5ucXGd1N3BJwIFJv4e2DgM1xGCpNK9zDEViwIx1q6Q9DiSfARzgs9c 1v48CNIHFpRn6bwbDbkF1pMGe031BfMP33uDVdWNsq+j1P+kyTrWZXPghHyPuub/B60v ls4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790296093; x=1790900893; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=zmWHRpNSCYIUBFB4IKMz89RjhQYOyuZ9OhQTzTXuRZk=; b=Lp47W9c7TKIu/rgDHLFJd1mHP4K5tlar8Z4fHm2eKfRAD8csQqYHHZiQtiSn+9+lRD c21vklJJuxwUuDR2GDTi6pKoxx4ziI/8CUjbsROmWvwJu+pFBXSLgFlj4lMgOWRKEANy ABHkeOCxjCEOgtlCR6MOfV7qbUEcFpHVqPDRBrauynNLQOs9wSU0fbjoA3tDxmUclWaB 4HidTOB1UjNjUdxYKNts8eUZsy6xN2oXkPx5YHoOqf8XOpfs9HKJwBCAqiiI6RSWNqLN h8rULWg2rlOnyNZWgPCl3U+fSOvX7ja6b18YS3LcOCz7uhWpSbB6VxTYhPK1wJrRrcnp iWtw== X-Forwarded-Encrypted: i=1; AKwUvByqETlnWDD/F+orAO3vTpmlZX07ipvj2LVuVbzW80/nqDfBg37JO46uf+OiDjsz0g+E2yyd43kqU/USlGg=@vger.kernel.org X-Gm-Message-State: AFuF++kiS87V1BQoOFeo4TLQ5Ke4kI/aVIYcrVZUCHad84fSEkChKGNU dvzdj5vrioWVnsFrECsKjDwVk2z5a6QlcEKhEHQUZcv1c67ePcA+nQLiO2B3vcDV9bgpti93VQr ftprRfEiEyknXhyTcO+S3BLnc7O20zRtDRqS21C/eURzoriWwz8I25m5TkqCQzcgPQbA= X-Gm-Gg: AYBFou2DQMFysdFvPUkOMS8wmxI+EEWMIdu+r7WxJRgqrw+T+N/HA9lJogktid9kJ6z ArqBNCqX6CparH2wOGeWjsIjA61USvW6bURB7n5LqvFSi/5YHaXHuD7sIXV8S99dbxsMOxBvCjA 4+MQv1smA5+dTi6BJu1aCybOa990cZCK8Lt1MqdLpYpDEhTDOmd8+wSMzl0xz9LpW1vCWp6fn7b 4LA3PuOCNhHk81kWWBArwYQPHKn4cNazNrMf9B/INnK5O1hdPo4qsOHB4zB0GAVs7YvvpAgX590 pY0R3vQK1BdvjA9QWZPEPq/XJinbFbRoqEZX+32BJkBM2/v//oVtzA9MHpjiua7N3RG6EAhniim yLlKd9d3WxAyuAMUpu57S507QybV0n021u9n0iO37LubeEEAzP86kuehmS2f4 X-Received: by 2002:a05:7300:6c12:b0:340:f698:fd56 with SMTP id 5a478bee46e88-3414a792afdmr1655178eec.2.1790296092679; Thu, 24 Sep 2026 17:28:12 -0700 (PDT) X-Received: by 2002:a05:7300:6c12:b0:340:f698:fd56 with SMTP id 5a478bee46e88-3414a792afdmr1655146eec.2.1790296092111; Thu, 24 Sep 2026 17:28:12 -0700 (PDT) Received: from gu-dmadival-lv.qualcomm.com (Global_NAT1.qualcomm.com. [129.46.96.20]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3414485a9cdsm1873736eec.16.2026.09.24.17.28.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Sep 2026 17:28:10 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Thu, 24 Sep 2026 17:28:06 -0700 Subject: [PATCH v7 5/5] media: iris: Add BUF_ROIMB_DELTAQP metadata buffer for ROI delta QP 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: <20260924-enc_roi_enable-v7-5-6fa7413af23c@oss.qualcomm.com> References: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> In-Reply-To: <20260924-enc_roi_enable-v7-0-6fa7413af23c@oss.qualcomm.com> To: Mauro Carvalho Chehab , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, Deepa Guthyappa Madivalara , kernel test robot X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1790296085; l=13722; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=5Y3wceAUSis4LyEEBP3vcPhXNhSkH4aQtluUG+lkk8A=; b=CtJx8DDKbjSg2q1HPkmXDrg8ruzxQMPhc6LOcSXXDDTHGaIYUqzztu3xjDQCSkSq2/fzuUG7W lCjEe5KhvwSAvjt54wD/KDhcSRZ99fhzOgBeHBqQrG2p/wBKToLzUPR X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-ORIG-GUID: LgUYYRGkHfo4gMHAY6zEe8tn9a6LtzLS X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX6TBBG1tQUPnY KtnhrJ6fCWLvBnVVcaI5hcy+5xDrWm4Y7qUGTm/vcn5j3h1V3X8Q3cTqvZzJX0hbd7AOniV/iYv iuiVmn8BJPvx5DNC3d+RHcF3W/EwXz7GMAOSIVpKimyVOx/PidXNnVhqWXJyy2kLSgGOLhIe5RO GHbsmKp9SAsRkCTAE2YccD1yDvvdUPWZ1sMmMl27b7NsQieIOp5eWYIMZAq//l7ejRLkGFRsGst 8krE2/wvyEochIoAQEZZaSbtrvOtNlsmLkVbSWEse7PBGlX5wvyZyw6H4+OgAhRB62ovrQGvJ0h eVfm/eCDxIAJpQrWpRmtKjZ7f7B0g5lNCQDvR3VGinGpNWTfT6pHWznqzmtMy5nTzn2QYmn2K+r /JxIQPqMjVb1HWq51ftYpMGhouAbtL9mnqePNgHV59rc1kjxQaMMDSULSbsX01okRs2kFG+v14t cUivVnPJLs8+Y/Do3WQ== X-Authority-Analysis: v=2.4 cv=cK11IVeN c=1 sm=1 tr=0 ts=6ab5c01d cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=vSfK5Sz1eu9jql6VJIMA:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-GUID: LgUYYRGkHfo4gMHAY6zEe8tn9a6LtzLS X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI1MDAwMSBTYWx0ZWRfX/PYmop8+3FP0 L0yZXitwyCgAv8sVuub6USWSB33maOjbkUfVKhP3ehRMoSymb645RWzxi39bfge6AHezqdy1jWC wCs7iL2QJGoTEuxAfrKeRxgrkt05jt8= X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_06,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 lowpriorityscore=0 bulkscore=0 priorityscore=1501 impostorscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609250001 - Introduce BUF_ROIMB_DELTAQP as a new internal buffer type to carry per-macroblock ROI delta QP data to the firmware. This buffer is allocated on demand when the application sets ROI parameters via V4L2_CID_MPEG_VIDEO_ROI_MB_DELTA_QP, and is queued alongside each raw input buffer as an HFI_BUFFER_METADATA packet on HFI_PORT_RAW. - The metadata buffer layout follows the firmware-defined metabuf_header and metapayload_header structures. The s8 per-MB delta QP values supplied by userspace are widened to s16 as required by the firmware. Signed-off-by: Deepa Guthyappa Madivalara --- drivers/media/platform/qcom/iris/iris_buffer.c | 114 +++++++++++++++++= ++++ drivers/media/platform/qcom/iris/iris_buffer.h | 4 + drivers/media/platform/qcom/iris/iris_ctrls.c | 37 +++++++ drivers/media/platform/qcom/iris/iris_ctrls.h | 1 + drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 1 + .../platform/qcom/iris/iris_hfi_gen2_command.c | 24 +++++ .../platform/qcom/iris/iris_hfi_gen2_response.c | 2 + drivers/media/platform/qcom/iris/iris_vidc.c | 2 + 8 files changed, 185 insertions(+) diff --git a/drivers/media/platform/qcom/iris/iris_buffer.c b/drivers/media= /platform/qcom/iris/iris_buffer.c index eb8de60c1177f5e1ab83b90a3c8c80e0b4d1f02e..a7f1d74360d6a490959b27936fa= 5bbc61a7d9358 100644 --- a/drivers/media/platform/qcom/iris/iris_buffer.c +++ b/drivers/media/platform/qcom/iris/iris_buffer.c @@ -5,11 +5,13 @@ =20 #include #include +#include =20 #include "iris_buffer.h" #include "iris_instance.h" #include "iris_power.h" #include "iris_vpu_buffer.h" +#include "iris_hfi_gen2_defines.h" =20 #define PIXELS_4K 4096 #define MAX_WIDTH 4096 @@ -705,6 +707,20 @@ int iris_destroy_dequeued_internal_buffers(struct iris= _inst *inst, u32 plane) return iris_destroy_internal_buffers(inst, plane, false); } =20 +int iris_destroy_roi_metadata_buffers(struct iris_inst *inst) +{ + struct iris_buffer *buf, *next; + struct iris_buffers *buffers; + + if (inst->domain =3D=3D ENCODER) { + buffers =3D &inst->buffers[BUF_ROIMB_DELTAQP]; + list_for_each_entry_safe(buf, next, &buffers->list, list) + iris_destroy_internal_buffer(inst, buf); + } + + return 0; +} + static int iris_release_internal_buffers(struct iris_inst *inst, enum iris_buffer_type buffer_type) { @@ -928,3 +944,101 @@ int iris_vb2_buffer_done(struct iris_inst *inst, stru= ct iris_buffer *buf) =20 return 0; } + +static int iris_fill_roi_data(struct iris_inst *inst, struct iris_buffer *= buffer) +{ + s8 *p_array =3D (s8 *)inst->fw_caps[ROI_PARAMS].p_array; + u32 payload_offset, lcu_width, lcu_height, row_size; + u32 array_size =3D inst->fw_caps[ROI_PARAMS].elems; + struct metabuf_header *mbuf_hdr =3D buffer->kvaddr; + struct metapayload_header *mbuf_payload_hdr; + struct v4l2_format *f =3D inst->fmt_src; + s16 *p_16, *p_temp; + + memset(mbuf_hdr, 0, sizeof(struct metabuf_header)); + mbuf_hdr->count =3D 1; + mbuf_hdr->size =3D sizeof(struct metabuf_header) + + sizeof(struct metapayload_header); + mbuf_hdr->version =3D BIT(16); + mbuf_hdr++; + mbuf_payload_hdr =3D (struct metapayload_header *)(mbuf_hdr); + payload_offset =3D sizeof(struct metabuf_header) + + sizeof(struct metapayload_header); + + memset(mbuf_payload_hdr, 0, sizeof(struct metapayload_header)); + mbuf_payload_hdr->type =3D HFI_PROP_ROI_INFO; + mbuf_payload_hdr->size =3D array_size * sizeof(s16); + mbuf_payload_hdr->version =3D 1 << 16; + mbuf_payload_hdr->offset =3D ALIGN(payload_offset, (u32)256); + mbuf_payload_hdr->flags =3D 0; + + if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) { + lcu_width =3D (f->fmt.pix_mp.width + 31) >> 5; + lcu_height =3D (f->fmt.pix_mp.height + 31) >> 5; + } else { + lcu_width =3D (f->fmt.pix_mp.width + 15) >> 4; + lcu_height =3D (f->fmt.pix_mp.height + 15) >> 4; + } + /* Firmware expects each row to align to 8 LCU */ + row_size =3D (((lcu_width + 7) >> 3) << 3); + + /* Firmware expects 2bytes of delta_Qp, int16_t */ + p_16 =3D buffer->kvaddr + mbuf_payload_hdr->offset; + for (int j =3D 0; j < lcu_height; j++) { + p_temp =3D p_16 + j * row_size; + for (int i =3D 0; i < lcu_width; i++) + *p_temp++ =3D (1 << 11) | (((u8)p_array[j * lcu_width + i] + & 0x3F) << 4); + } + + return 0; +} + +int iris_hfi_gen2_session_alloc_roi_metadata_buffer(struct iris_inst *inst) +{ + struct iris_buffers *buffers =3D &inst->buffers[BUF_ROIMB_DELTAQP]; + struct iris_core *core =3D inst->core; + struct iris_buffer *buffer, *first_buffer, *next; + bool found =3D false; + int ret =3D 0; + + if (!buffers->size) + return 0; + + list_for_each_entry_safe(buffer, next, &buffers->list, list) { + if (buffer->attr & BUF_ATTR_DEQUEUED) { + buffer->attr &=3D ~BUF_ATTR_DEQUEUED; + list_move(&buffer->list, &buffers->list); + found =3D true; + break; + } + } + if (!found) { + buffer =3D kzalloc_obj(*buffer); + if (!buffer) + return -ENOMEM; + + INIT_LIST_HEAD(&buffer->list); + buffer->type =3D BUF_ROIMB_DELTAQP; + buffer->index++; + buffer->buffer_size =3D buffers->size; + buffer->dma_attrs =3D DMA_ATTR_WRITE_COMBINE; + + buffer->kvaddr =3D dma_alloc_attrs(core->dev, buffer->buffer_size, + &buffer->device_addr, GFP_KERNEL, + buffer->dma_attrs); + + if (!buffer->kvaddr) { + kfree(buffer); + return -ENOMEM; + } + list_add(&buffer->list, &buffers->list); + } + + first_buffer =3D list_first_entry(&buffers->list, struct iris_buffer, lis= t); + ret =3D iris_fill_roi_data(inst, first_buffer); + if (ret) + return ret; + + return ret; +} diff --git a/drivers/media/platform/qcom/iris/iris_buffer.h b/drivers/media= /platform/qcom/iris/iris_buffer.h index ee2d24bb69c57220b0a735d9b4aae4434a33daf6..df9d018493f3ec37fd5e6b0ba04= 9dba0b5ae76e9 100644 --- a/drivers/media/platform/qcom/iris/iris_buffer.h +++ b/drivers/media/platform/qcom/iris/iris_buffer.h @@ -28,6 +28,7 @@ struct iris_inst; * @BUF_SCRATCH_2: buffer to store encoding context data for HW * @BUF_VPSS: buffer to store VPSS context data for HW * @BUF_PARTIAL: buffer for AV1 IBC data + * @BUF_ROIMB_DELTAQP: metadata buffer for ROI MB DeltaQp * @BUF_TYPE_MAX: max buffer types */ enum iris_buffer_type { @@ -44,6 +45,7 @@ enum iris_buffer_type { BUF_SCRATCH_2, BUF_VPSS, BUF_PARTIAL, + BUF_ROIMB_DELTAQP, BUF_TYPE_MAX, }; =20 @@ -139,5 +141,7 @@ int iris_queue_buffer(struct iris_inst *inst, struct ir= is_buffer *buf); int iris_queue_deferred_buffers(struct iris_inst *inst, enum iris_buffer_t= ype buf_type); int iris_vb2_buffer_done(struct iris_inst *inst, struct iris_buffer *buf); void iris_vb2_queue_error(struct iris_inst *inst); +int iris_hfi_gen2_session_alloc_roi_metadata_buffer(struct iris_inst *inst= ); +int iris_destroy_roi_metadata_buffers(struct iris_inst *inst); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index 1ce8eccdedbdeb840833bd92edb3f59dd6962d7f..2ab20cacbc2b79ac4cf28eda88b= 15cae332c4160 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -1624,3 +1624,40 @@ int iris_set_metadata_delivery(struct iris_inst *ins= t, u32 plane) =20 return ret; } + +int iris_set_roi_params(struct iris_inst *inst, u32 plane) +{ + struct iris_buffers *buffers =3D &inst->buffers[BUF_ROIMB_DELTAQP]; + u32 height =3D inst->fmt_src->fmt.pix_mp.height; + u32 width =3D inst->fmt_src->fmt.pix_mp.width; + u32 metadata_header_bytes =3D 256; + u32 lcu_height =3D 0; + u32 lcu_width =3D 0; + u32 lcu_size =3D 16; + u32 n_shift =3D 0; + u32 size =3D 0; + int ret =3D 0; + + if (!inst->fw_caps[ROI_PARAMS].p_array) + return -EINVAL; + + if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) + lcu_size =3D 32; + + while (lcu_size && !(lcu_size & 0x1)) { + n_shift++; + lcu_size =3D lcu_size >> 1; + } + + lcu_size =3D inst->codec =3D=3D V4L2_PIX_FMT_HEVC ? 32 : 16; + lcu_width =3D (width + (lcu_size - 1)) >> n_shift; + lcu_height =3D (height + (lcu_size - 1)) >> n_shift; + size =3D (((lcu_width + 7) >> 3) << 3) * lcu_height * 2; + size +=3D metadata_header_bytes; + buffers->size =3D ALIGN(size, 4096); + ret =3D iris_hfi_gen2_session_alloc_roi_metadata_buffer(inst); + if (ret) + return ret; + + return 0; +} diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index 9957b69366f50310338a0c1470d9744592655c33..7587dfec052a320863889eb1520= 3416b9c527a40 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -51,5 +51,6 @@ int iris_set_req_sync_frame(struct iris_inst *inst, enum = platform_inst_fw_cap_ty int iris_set_time_delta_based_rc(struct iris_inst *inst, enum platform_ins= t_fw_cap_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); int iris_set_metadata_delivery(struct iris_inst *inst, u32 plane); +int iris_set_roi_params(struct iris_inst *inst, u32 plane); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c b/drivers/med= ia/platform/qcom/iris/iris_hfi_gen2.c index d628bc6748438b19dac01cd11cb9f8da0b8500af..4d40d6733e5877a302ce63fb0b4= a61b8f284e6dc 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2.c @@ -1789,6 +1789,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_= sm8550_enc[] =3D { .hfi_id =3D HFI_PROP_ROI_INFO, .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_CUSTOM | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_roi_params, }, { .cap_id =3D MB_SIZE, diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen2_command.c index cf88dbe11e8e9faef826e661d8e9909fd7f16b94..a1b0c4982f0d789a807f22a1dff= df61decd20d28 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c @@ -134,6 +134,7 @@ static u32 iris_hfi_gen2_get_port_from_buf_type(struct = iris_inst *inst, switch (buffer_type) { case BUF_INPUT: case BUF_VPSS: + case BUF_ROIMB_DELTAQP: return HFI_PORT_RAW; case BUF_OUTPUT: case BUF_BIN: @@ -1267,6 +1268,8 @@ static u32 iris_hfi_gen2_buf_type_from_driver(u32 dom= ain, enum iris_buffer_type return HFI_BUFFER_VPSS; case BUF_PARTIAL: return HFI_BUFFER_PARTIAL_DATA; + case BUF_ROIMB_DELTAQP: + return HFI_BUFFER_METADATA; default: return 0; } @@ -1328,6 +1331,7 @@ static struct iris_buffer *iris_queue_metadata_buffer= s(struct iris_inst *inst, static int iris_hfi_gen2_session_queue_buffer(struct iris_inst *inst, stru= ct iris_buffer *buffer) { struct iris_inst_hfi_gen2 *inst_hfi_gen2 =3D to_iris_inst_hfi_gen2(inst); + struct iris_hfi_buffer hfi_meta_buffer; struct iris_hfi_buffer hfi_buffer; u32 port; int ret; @@ -1349,6 +1353,26 @@ static int iris_hfi_gen2_session_queue_buffer(struct= iris_inst *inst, struct iri &hfi_buffer, sizeof(hfi_buffer)); =20 + /* check if any metadata buffer is available not queued, queue it */ + if (port =3D=3D HFI_PORT_RAW) { + buffer =3D iris_queue_metadata_buffers(inst, BUF_ROIMB_DELTAQP, buffer->= index); + if (buffer) { + iris_hfi_gen2_get_buffer(inst->domain, buffer, &hfi_meta_buffer); + port =3D iris_hfi_gen2_get_port_from_buf_type(inst, buffer->type); + iris_hfi_gen2_create_packet(inst_hfi_gen2->packet, + HFI_CMD_BUFFER, + HFI_HOST_FLAGS_INTR_REQUIRED, + HFI_PAYLOAD_STRUCTURE, + port, + inst->core->packet_id++, + &hfi_meta_buffer, + sizeof(hfi_meta_buffer)); + + buffer->attr |=3D BUF_ATTR_QUEUED; + buffer->attr &=3D ~BUF_ATTR_DEQUEUED; + } + } + return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet, inst_hfi_gen2->packet->size); } diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/dr= ivers/media/platform/qcom/iris/iris_hfi_gen2_response.c index 84b629b957442c024dccc18b354ac9a7e541abaa..f63e0a7723e8583da818c2b004e= 367c1dd3d94f7 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c @@ -58,6 +58,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_i= nst *inst, return BUF_PARTIAL; case HFI_BUFFER_VPSS: return BUF_VPSS; + case HFI_BUFFER_METADATA: + return BUF_ROIMB_DELTAQP; default: return 0; } diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/p= latform/qcom/iris/iris_vidc.c index fcbc60016beec693f2ce27927a09a2d51494bc38..fae3d113a9dc990f06167ee0b7f= b8fab24a0552c 100644 --- a/drivers/media/platform/qcom/iris/iris_vidc.c +++ b/drivers/media/platform/qcom/iris/iris_vidc.c @@ -180,6 +180,7 @@ int iris_open(struct file *filp) INIT_LIST_HEAD(&inst->buffers[BUF_SCRATCH_2].list); INIT_LIST_HEAD(&inst->buffers[BUF_VPSS].list); INIT_LIST_HEAD(&inst->buffers[BUF_PARTIAL].list); + INIT_LIST_HEAD(&inst->buffers[BUF_ROIMB_DELTAQP].list); init_completion(&inst->completion); init_completion(&inst->flush_completion); =20 @@ -299,6 +300,7 @@ int iris_close(struct file *filp) iris_destroy_all_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLAN= E); iris_check_num_queued_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_OUTPUT_M= PLANE); iris_check_num_queued_internal_buffers(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_= MPLANE); + iris_destroy_roi_metadata_buffers(inst); iris_remove_session(inst); mutex_unlock(&inst->lock); mutex_destroy(&inst->ctx_q_lock); --=20 2.34.1