From nobody Fri Sep 25 06:47:18 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 AB92D4CDA37 for ; Tue, 15 Sep 2026 22:00:25 +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=1789509632; cv=none; b=PMwBcPgooayF78RMuhEo5cJEjU/DWkgYx2mc/jefJ7dm2V4O1nN5F7SFbzfZnMTkbnI3qMXNiSdTfXoiqODHWC5pzdTfy3d2tRxCddbU6k3CW4GKTpgIlTvbJdARbtpv+dWX6wGGawasdOXKkGO4YAcQksMRLXJxMKqbT2Im2Ac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789509632; c=relaxed/simple; bh=W4KJ4/cRaUhT4aJPGYQieyDy2CUuHLjA+S4NcGfr9rs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O+1eF/AV4t7zW1QHy2MC8rpydFe7TNeSTsQ6Nzqd+37b5EU17YqcKsVDyobkvR3ss/7kJ/c3sItRAvFSODUIZdRRVT5JctWMBpeKHiJqpWVPncZi8B9dFmAcCW1k5BAumYSfu9245/bAY4cNUktiMLhB7n7v1Wmi5b9crTPB0WU= 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=JsOLdaCJ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=AacoGLv7; 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="JsOLdaCJ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="AacoGLv7" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68FLZJu9080544 for ; Tue, 15 Sep 2026 22:00: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= XtVMWvUgXxinKbJf6CgTIuBPkLjW6igzz8lufb5j0eA=; b=JsOLdaCJawHWoth9 rXp4rVyWVsW+0tWEyeRNr+wWV0PryHx/0O46w3CadQRwtcQJ5S8GdmAlP1ggGzqe WjimjKzmUhX5idJZPIAMiSh7zbkvUTUBLRRR2O7YRBk3XpYbD448EiSugnI3akFy uL8hXqbLcaYedeZXooYt4re1S6n6MNU2A9M7q/3H7xrum49FKj2NENW65eVBWfp0 oxKDub8FhtNVJBP7CtHctR6zxsjFkDO1Y5YE0BAuaIaf3Nr9i36Rd/EMY/SkMXUl p42BD1jmdWtqitRIghMzOWNirYHtqkZXidjg8Y3yKJku8tv1LfXTtuFPcaMwO4fl ZBk0xA== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gqageh320-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 22:00:12 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-39b8eb84685so1458774a91.0 for ; Tue, 15 Sep 2026 15:00:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789509611; x=1790114411; 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=XtVMWvUgXxinKbJf6CgTIuBPkLjW6igzz8lufb5j0eA=; b=AacoGLv7hYGJ7l3H3wvF4XMUmiDB5Ld+PXP21VA8g8ErGb9uYxHeYdj7uwEOQCEro2 vnRwnt/Ay981yaA8NVXfdpV2qBxukSL1dBVls3WmkgkluyrSOWJjps4vkLLnpweUvLE2 bCWf5EJG/5Qrk01EvfhETw2KrPR85bHzBaglj8uHQe/rWP3Bdrk4C4v6isGsjCvPEI8w 5hxWCuwveoE8DkF5cCciH2Y22a8cEJInX0d9tihl5dJ1+qeWKO0wUbIR5yN6ITqf4a0a llpw5dyZNYwsxPNMhBdtLoxgz/y5JdqsMreDjMqss0raZgzwB5hMRgXw+1hDc+uEGOWq xd/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789509611; x=1790114411; 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=XtVMWvUgXxinKbJf6CgTIuBPkLjW6igzz8lufb5j0eA=; b=EzsHndEJeswzgxcZFTFvc3d2VCkWaX/GWw5/9kCIwhSuE6kf9GUEqKkB5cX++ZMpBu ZMrmkZKnmSAw1pbOAxyZ8G5UgpX07Q5QMiNRFQdbgsarQZwSMhtNxAwLMwuwwkwiFwLD vsxmCFfT34tJY54WM/p+9xVkm1AAB4EvCo8VKJoh+PbFPoxC78m+Nehyfdy77jw2W7xE 9pZmQ219F1dORqMlrmyl7ozkDVSo3clOpL3vAEWojyIvtfFcycv9ls5FWD5UpjYyej5v Uil5+Azcze4WnzHSeE7v7tIPy8YU2rvcn5K0sZhcyJ8Tm/zlyzgn0CcIi/bWof9NV8wJ PMDQ== X-Forwarded-Encrypted: i=1; AKwUvByjqul2f7DJ00bFp1Yqc67Y6tUt+6UuY74VnGgqWuProl4WKJdWBs+FbaMIlSAlwh4cYsA8mdIyGWPfnBA=@vger.kernel.org X-Gm-Message-State: AFuF++mECSasgWn++rPDhL8i9/u7S2o7c9wtP0Y985GY/jcRNrM96XYs MX2kg69vw2usTw10rHOfRphJ1B+9WNf7a8gUmrF/V4GEVbSfS5N9FZ9IZvBCY1PlvNvz2loN6IL v5HmZU23skE3euu8DSj6irAZEdQhP0uxlB9OlmAD9GdaOlegkruwp6kR+CFkFapGNyW8= X-Gm-Gg: AYBFou2tQu0kvCh/Y8R7U/vknaW8FWRJvM9TZD4FpJOaA/vpVePMxPgs/bv3sZ0OOmZ TOq8BPNwF7iXWNfuUTS8Rarhio1zMQ8kr0bjeHFIHoQt+CYROpOHffaqrj1v+hSmKS59bpVnNK1 mR0XK9YE2Q0dzn9VzkscnPKeKkPWgrFYea7ETIxjJlZ5FrFEqJYYeVbb7kvvVPyjdESU5217yYj H1P4On+ppknXxXRydRg97MLSFcotehHtJ62N/oAALn5Gc67PAy7FXEvHrcmBfyfPDZJJmEDdUiG MoX8S4v8MNvAGkDRB/ZeNUX8dfhXri0w05jEUYd6698gewCTLI/inezUZpYnyoOErX0YnwxDBid rX832vAAvltSQdkJD+WkMPGs5XAY3FMWUCRFZ3othA9ekICbQ5mNYqpwI4YPw X-Received: by 2002:a17:90b:2d45:b0:39e:207:9db0 with SMTP id 98e67ed59e1d1-39e1e50f7bamr334157a91.4.1789509610672; Tue, 15 Sep 2026 15:00:10 -0700 (PDT) X-Received: by 2002:a17:90b:2d45:b0:39e:207:9db0 with SMTP id 98e67ed59e1d1-39e1e50f7bamr334099a91.4.1789509610061; Tue, 15 Sep 2026 15:00:10 -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-33bf5aa1e38sm1878345eec.16.2026.09.15.15.00.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 15:00:08 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 15 Sep 2026 15:00:03 -0700 Subject: [PATCH v6 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: <20260915-enc_roi_enable-v6-1-29dd4c8bccff@oss.qualcomm.com> References: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@oss.qualcomm.com> In-Reply-To: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@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=1789509606; l=7252; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=W4KJ4/cRaUhT4aJPGYQieyDy2CUuHLjA+S4NcGfr9rs=; b=cT23WPwPBFBwl1zrstEkdc05Si+qxjT4R8ehCGTjnqZWQLyNIFJSkcMWpqw4hZ3mdINj3m+fw qaP3Gw/n2qZAeBvk8X/r4EwJkxFNoV3rM0pzGC2XjxG0bhdB+JAUHVH X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX2zWN6Kn/cpw6 VQZRmL5VDAmcEZ3OMlVSN+IVDF3zCtOYIxVhQlzI7+RqDggKhyrauv5XMtDSg30CWQHqFLbXy+D aZnTZ/O5NIHzG6zRvCVj1ABZKRAGm5c= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX0PkFmX5waFSY jpgA81/pPt2BGpSDDMWCckeE8lRTc+Kz9Z7kpSvg8+hLlD5/Qjsm1WLBYnpaIQjKZg6gjy/VLXA v9J2iAs3ERLb6+v3o8Q407kW60QRDgym+HSDK5BfLFAmX1enBD53B60vt6bh04UxUBOG50oxPq4 cJHymPXBgzWWcqlZHJVwxy4UavSJhHmwOOGbU9V6ka1ElPRfetzuyyBJdolVDg4CpHW1nujzkMe KRoEDRlTg2ayiHCwRcKEcH5n5/UyOvetUZ9yxCsg2gqlQ4bQVjX2ZHb4gAPgz2QA7epWdkA2sG5 YJffroW/y+Juw19a7U8jJiCibCu+adueOQ/GZOw1uv/q74YZgAmw7zwaPrmmhz06DJY8om9T1H5 zYIzcRj+T5QpiPtg0Z3xazNJDI279vGuf9iWY1bo35W2o6vMF2UrEruVGyT+tUOvlQ/SiZHOkBT /DGBL33xzj6qtZvOLoQ== X-Proofpoint-GUID: o9D6AGevhTkR2c43T8XarQzRoJWLHbQO X-Proofpoint-ORIG-GUID: o9D6AGevhTkR2c43T8XarQzRoJWLHbQO X-Authority-Analysis: v=2.4 cv=PcZqFShd c=1 sm=1 tr=0 ts=6aa9bfec cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=zatfZSFVlCmks967f3wA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9: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-15_05,2026-09-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 phishscore=0 suspectscore=0 malwarescore=0 impostorscore=0 clxscore=1015 lowpriorityscore=0 priorityscore=1501 adultscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150321 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 + Documentation/userspace-api/media/v4l/vidioc-g-ext-ctrls.rst | 4 ++++ Documentation/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 | 11 +++++++= ++++ include/media/v4l2-ctrls.h | 2 ++ include/uapi/linux/videodev2.h | 2 ++ 7 files changed, 27 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 9caca56478d1a97ccde582a2086e7039411b52ed..b78992e32e21c79b1c70ec673b8= 1759c9ca84206 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]; @@ -2037,6 +2045,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 327976b14d50b73a631e4d2ed95d9f4d146c45ab..9a68a3555e349f1e55aa01af5c1= 0f08201d62bae 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:18 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 16DD23A2E12 for ; Tue, 15 Sep 2026 22:00:18 +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=1789509621; cv=none; b=hCVjYA4SmdxSXBYLUXtVvwWqQgd4tgs/WX+n/B5LCoZInMKGV0Ze69xETesEQZ572p06Mxc/SjrWUXEBr2piABtvJ5Exkibx4/rdqq4ZHgrI+qI6HtiOykzdSynrks23l2nyYwJknfTM1SFOm/iG95RSXdDU+tmx06TN8jXp6jg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789509621; c=relaxed/simple; bh=2dSlcXsKlwUohkHpJICDFfgDxNit43kgpQmLWkSA25o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XH/4PRf9tj7bIUSsg1He15MBh9q8XcozgMjUurXbjG/osyyMfkpynYmblkV00Qs0O75FdX6RAXyqk0Nt4zgbDIk8zy9ni0wE2yDehzZuBH6+xl8JtHkRgm3vKEP0+2K4u8sQBAnypH4H0tvOtM3S2HxDGwz7q2l7YNpQvwyjKbU= 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=MPRkJo59; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=g6pqZiiD; 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="MPRkJo59"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="g6pqZiiD" 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 68FLYkFT840552 for ; Tue, 15 Sep 2026 22:00: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= clp1l0jUnTtnW1IHAxiMGyyOMyW4PQV3W2y33REgbLc=; b=MPRkJo592Nmw/+tG qgHeB074+oBy6RBIwZ3JRkrQIj32gjiP6WP2I5T0syZJm3JSi+7pbys3t70Tq4ql 2v93K4vIf08ACBr2kzXg+4nHpjjg7Z+bET1J4hLLGz4r8MR7REmt6XJiijeGLFSz 6ZuM+f4EUj2PAGUUwZtLb9mgA7uopGFWba2gwWLIL7s8W6OG/1kiwTvF5BTm1e8S DF1AmmpeZ8gU4IQHKMpFE/f832d2Tf/v+EkAZ5tBSB00VFAwilnxd9FtoggzUAB1 q3bXWxA76p48dqldpoNdIy7bnKRbNNTlfyxp2NVikyXz6xHuXcXtvtL73Q96ZekX TbZbHw== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gqdyw82xw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 22:00:14 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-38ddc70b9d5so1326397a91.3 for ; Tue, 15 Sep 2026 15:00:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789509613; x=1790114413; 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=clp1l0jUnTtnW1IHAxiMGyyOMyW4PQV3W2y33REgbLc=; b=g6pqZiiD/Pk4e9LL9sLG2cj0UcaHSHkaxY+4YWfzXpuxD1jBG9Mh+oa8znygLy33vY tjYnJzlkSPx/OfFXMeeYUCkU1K0rBPyw1GdmUeUlGDrf3DfhlbNl8KaxcumWO56/cH/q zcBwnZNoPsWnQS1T4pJ9wxLah91bWqjO5LFwPtyVMPKDuW7sql2iJdXjfx1aAMxxxTC6 06hNeoMPvrGu1fyM1xdSrt66vLkqFkNacbOx/RuNrjtcfLBrbZi6Fh/IDJdaNQlKGAMx UyiyFsumQyjCVBIMMBqVkHiyWKBQsn+vYKKwpgZtULE0ESri1WtdMf8PvNMxZ3nPN661 Kvsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789509613; x=1790114413; 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=clp1l0jUnTtnW1IHAxiMGyyOMyW4PQV3W2y33REgbLc=; b=BKmz98b5ClyiF4o9hiB2kW7eChenUyur5VvNFwS8RAgFYeAF7BFu4TEiar+bqZe5/G h0FS7UsyBw5tQVIVOLBKkBVUTpwDMZmfkvyfEFhWMcogd3o3Q3fMYB0sxUhCYd/DZBE6 LCaye6I8pyIuiFRasFmXj5zExUz9iKITgotnRm2826ctczT4Zp/a/6FTz+xZwynSbhU3 a7DMxe5xz5ZerY88fbrOQNddV+djO9r7vdPwsFkeMd+mMIypgdOTIa/gw7mHpvctxfHA nuVepXnNZYyGCj14uvEUxIqh3+TevrLk8mU4tGjntHv+AaV90L+VUbakTl9Q7gqIZEQV a7jg== X-Forwarded-Encrypted: i=1; AKwUvBwW78dplWrAzTpJECbyO7sW8iQWvDh8cXPEwWrNcDEofL7yKZy9G1bu6ULMUCM788sB114WtvDtpJ18HRE=@vger.kernel.org X-Gm-Message-State: AFuF++lzGm4MePLd2akVd/GdaBOgQby5mIxvobWlgWebL4UcDmaJ0YLK 0u1gOfNh8zpy7b/bM8mGde2vG0rfQC7jKg+OMKHEWcTHuPzzhDLAYopi7eM/kfUw27V+/HFO6Z+ LiXZPXhrD8e3pq9tTB0h5My3Nm9Rg4pGsxsUOPpywOg9hkPUAq8ZLhqCfgPl8zyhPcDw= X-Gm-Gg: AYBFou3qbtEWAWddI8FXPO5CJ81mxoQSky2RqvxDYVQ1Z6QsQSZA15TZTiT7k+UGwes p9NwLrpfB6+oezEl+r7nKcxQPRZNM+oNMPWJpW1TOhYHhFJb8AZ5fweHN0LwrhUcua3azQpytJE bni4VZkGVfrrJcQlWqs8Rc/QSNBm2dGDbP55RDARTGQitkGziHVfHEEfutG1tTVZiZo7La39K2g nywQCV7EeCV+9f//UwpCRvkkAZDH+9JQBJn8kfVC63vYOFCnpfFwIx4emhg2LgU42/LtiiOviAT iIuO89qmQYvpGhO9Ye0HVLVqccvHKMY2EDey9DAIQDU1C915sYWH/eHwGtbwel45PzfZERxOE4k BsLNT2Y3G0CkqxvnsCACwMJT0iDm89e82+asQd4mK1vrt+h1+rmXz+XPbTaBG X-Received: by 2002:a17:90b:5386:b0:39d:febe:7452 with SMTP id 98e67ed59e1d1-39e1e64b9bcmr311533a91.4.1789509613341; Tue, 15 Sep 2026 15:00:13 -0700 (PDT) X-Received: by 2002:a17:90b:5386:b0:39d:febe:7452 with SMTP id 98e67ed59e1d1-39e1e64b9bcmr311488a91.4.1789509612776; Tue, 15 Sep 2026 15:00: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-33bf5aa1e38sm1878345eec.16.2026.09.15.15.00.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 15:00:11 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 15 Sep 2026 15:00:04 -0700 Subject: [PATCH v6 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: <20260915-enc_roi_enable-v6-2-29dd4c8bccff@oss.qualcomm.com> References: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@oss.qualcomm.com> In-Reply-To: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@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=1789509606; l=5812; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=2dSlcXsKlwUohkHpJICDFfgDxNit43kgpQmLWkSA25o=; b=QdQWSd121d55WR9ZYI7dQkRzxXSINssmo0nuRx5w+g1TqnIKqo0CMzD1sABLsjs68ExlT7rE/ L6rWutxt5lCDUtkLcxGsyGfC4oyhQww3TkaHI65l2l2wQrmopLjD66m X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-GUID: EsAoI6zDG8ysiCougUBceOwXJq66hbKb X-Authority-Analysis: v=2.4 cv=aJ1lOr9m c=1 sm=1 tr=0 ts=6aa9bfee cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==: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=mQ_c8vxmzFEMiUWkPHU9:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX1QZ+xfiK0r1e Gv7UZcXRToLmWObVS8NEdve8ASILmgjy3Mi9yzgGJ3PsTdJByeP/o1qlHQ2SxWLDh4ZhdCHuH5+ eRWlOjQBNNueYUxMQaokd3m/ooVaGUh0YQCb1tL0vUefDH5ticwk2jKEYQvCe+ejgQtE9kUZ6nf 3ZkqXataa2bP6kjW0OJ0TH1yF2eq3CqtOD6yvqHpe/5rSZ3jXd71Dsd7mWJq6SnF9g18Jso+QVO ievyKWFDAA+uYazKBmuzzzSYK4JR4gBjWbTFOSqlbFOLbliLvImkHm5GLZG516NZpygHYE4f8hR vYe+ec+aicu6AzM7sayNxKhkWK8V2SBYgxgFbB5BK1WSCkwlN7LB+vJDOz83/1ilOBTkxzMPPPx uXq1QO5dduJJMVm25ijVejUVhLSOvD1ErLfboBz9kJH/mMCNQAlrWXB/BocIiEgplJcVMefouUZ PpfVMTRMb9XOiC/6MVQ== X-Proofpoint-ORIG-GUID: EsAoI6zDG8ysiCougUBceOwXJq66hbKb X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX9Gk0082ljN7a jsEvM9pvADk1Vd2s95/nCb0J6zrC6MQNZzwChYpcOB59mmh4TBffim1gX0cgpVLO+KPvwExLHNQ FIiYBQqFdZDLIi2adwKg981i2y3R6BY= 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-15_05,2026-09-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150321 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 b78992e32e21c79b1c70ec673b81759c9ca84206..e7376b52bd75dd5800d58941aee= 21534ce0b502e 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:18 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 E0E123A1A5D for ; Tue, 15 Sep 2026 22:00:18 +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=1789509620; cv=none; b=cjbdeEs8G/9OBU/jN+MjpZqTwyhpTn4Jkpw8SwVKD9VKGwqHwI9Vr83yfLTWichIMVGvZ+ByAP2wY/CiAZGzKAR9v0YYZscoEQqmcHksVKXxvT5kUTBD96m0KuX4uac+9i2wRg/hror7Nu9EMBzT2YxrOukH7zK0WBDNRYBotz8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789509620; c=relaxed/simple; bh=qhDIKatvc8QjYzDdfJRdI//vvXfzsp3LwrBw+VlkXP8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Iab9VuCjJIBbEdgt0hhhLy48H6c0VeYXcz5KlBMtgUAdpSocILmczDSewfD6uMMlPrEUbnLpXO9nsHZ0UaAPm7O5kZVnej3ACUINh/IgL+rU1aVlvjXqHUAyJWCbImfeMB/TZgmWZhV9B3nmq52rOzwj76id6PQpyyNFXrkiMO0= 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=fBeKxWs6; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=BsZevRMR; 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="fBeKxWs6"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="BsZevRMR" 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 68FLYY4I840343 for ; Tue, 15 Sep 2026 22:00:17 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=fBeKxWs6/rtARWVm L1cI9PCfvVgLI530QOukbrAY1TakVWfczb1dBwkvtHIgoRC/xscp0Vjx1bbdkBWx t1MFKBJAyjMWF7TgmY7ANAmAMHyWwqZuBzDNTp/pQZmiYbGFA+x/u0Sad7ZhEuXA DhTEyCMNQxiNLi/LdHQDhNIU2y75Z4pRX45AmSHxkVxZ6W1k+uM9KrVRaU7+nuhr EzvHWPLi5Juir2RrhmGdMJ97gWQDkIce97pcDeptKu81NdHNrLnUSNeoKnU7uOfr 8eNMfLdU8aB5+liqL9qhXLk76fitaqvLCQj6h7FjDzWhuQ5k/frYPHH5B76F7W7Q dCkjGw== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gqdyw82y6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 22:00:17 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-38dc0eee75dso1795146a91.0 for ; Tue, 15 Sep 2026 15:00:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789509617; x=1790114417; 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=BsZevRMR0rgbT3CbLJxQJ7iAb4jAZOumxSx3a4FMGiuWVUtQMI/aoRnC16o07TJBYR GNQec1tklqVdOQUG5wbE1Akjf8Xchd3BbdDDnjSkt2P81Fh4i9jD/8pfvWw3wpZThXoP 3gUUGsGsiCzEMmkaaIc5OTDcQIeKvlqJ0v/zqmSpFEcSFIxqaMryHs/agpIefvep5BYm XQthcJyBWvi/D9q2L5Fx8KT2MEn3GlujSkwmtxNMNqdgcxjkz/Ym4cnU5XJCQaAJJwNR Wtu26+8ZjlBoBiFI4ZPLgdOmltTNSH6C3SRyfIOG8eVKAUG/FFYRY9t/BeBY0PM3sYq1 KZwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789509617; x=1790114417; 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=0Z03aMfnTZLNSedmBVfSbuOiBfkGkEMaFkBUXe+QT3CdacqJRR++V49fHBji2vsAWY o6Wg1hVf7h7I2oaMOeQo5cEz3B1pfwWxnQTor5uG/Gsr//jDOFL+NyyHBQTAD+Nm0kZC NLMMF0oOHl9TV96V4RqeuzMxwxVekhWbiZiPYhOM/WuCef7D40pWy+0hl96O3Dv8DylL zrPZ6yDAxWZvqKCby8T/26zBRI0PEpmcalyvR5LnMYxCd0/UIZB8hRGA5GFE/QO2AJk6 k7XjuOyJZV6eLdp53SUsoRWDymnpeB3bj929ez47nYYrTvJr8jqRRJZgVbRVXL55KODP JpqA== X-Forwarded-Encrypted: i=1; AKwUvBx/jiotU8bT1efggjXngprkvGHO9ALWAcsWuLWlSjiPgUiRJ7W6HsUffDN1MqAxPfOLJJPc4edlt6DNlMM=@vger.kernel.org X-Gm-Message-State: AFuF++n5kZS6rpzyZ02cYq9Gxmu57FrBpyZWAOdYPJWHsgVeJZjWwnyc u8CQZp6uS9QWvAYHk4XkvpjgxfZKwPb+kcL7Cr7Dp1bcZN/XUzF5PqrQ2/+3FMlbaXdOEP+RhDP CbEgXRtoKX8S18l+g3jt5txQAaN2sgay/4iQIPpdgZS8Ojy/FqF7/6FvILNiiq7I8leI= X-Gm-Gg: AYBFou3sRZl7tYS5NcTFpJnmQUEJBaBias/4WI8Rsc5PwOPmZ08gBD9T6YG8Rk2oGGR T7GcabHmRVUNcKzlHgLT7PB9r7wEqQQ+0KmQ5WL1zkG1QjDOINt1YmOfbKpXX/y+F1bjjciUJLu 3HuPnGEE7Y3512m/6R/L1zGK4p9fjcduR6gAPNeK1DmjUer/1uLEeMSZxazca1mCTXRjlrsFUj5 tjPrqwNnx/GKtOETv9CQWZzXUdvPniXRAjRnysNRumS5+q4s1PffjjSmGUdosZLNWq5APiIKuKK hqHVdLX8roPmPH15MOccLS0u+kHz82S74M4SUXqUtOzJe8DEa/CFM8GvkrWg27P1Mekb4aCtTDH 5C1fXHnSo4jyI4gjF4ZgS8IZ878i6xPsyvVCCF+6LxwdO5tPYcvzPsarqQ9MP X-Received: by 2002:a17:90b:4a44:b0:398:bada:832b with SMTP id 98e67ed59e1d1-39e1e5ddce1mr286469a91.6.1789509616538; Tue, 15 Sep 2026 15:00:16 -0700 (PDT) X-Received: by 2002:a17:90b:4a44:b0:398:bada:832b with SMTP id 98e67ed59e1d1-39e1e5ddce1mr286434a91.6.1789509615930; Tue, 15 Sep 2026 15:00:15 -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-33bf5aa1e38sm1878345eec.16.2026.09.15.15.00.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 15:00:14 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 15 Sep 2026 15:00:05 -0700 Subject: [PATCH v6 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: <20260915-enc_roi_enable-v6-3-29dd4c8bccff@oss.qualcomm.com> References: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@oss.qualcomm.com> In-Reply-To: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@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=1789509606; l=7477; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=qhDIKatvc8QjYzDdfJRdI//vvXfzsp3LwrBw+VlkXP8=; b=BGbBJtU8NXVacPO4GwXP7sWZZUAv7sljPt8VlPgl91F6wdd+V0O9zrqDbUxpJQYKg9Uc2MDVa VRYAYAsdFvsD0hFHRZQyWE+CvB11XsuMu5Mt7L9RAHR/AF2hBHE5ISy X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-GUID: XrWlLgc_eVgoezBF6S24z_9E17E673Cy X-Authority-Analysis: v=2.4 cv=aJ1lOr9m c=1 sm=1 tr=0 ts=6aa9bff1 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==: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=uxVkaJQCnwIzyWVbueAA:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfXxFOndwfXwcQ+ KPwiOzopQn9kc/QLWvuX7LEVoH2maOYkpKBxfWzbzViNr3LWzpkx8A7i4Pe3i//0QpyLTR5f9Kg 7zeuezXiDfIl6yIBFer43zshGJJd5fwn3tbhVcphbfr3ggWAoyT6pc57qn2BN+yTvfj2z1ksOCU futvxLFaVoV6bz7VsjBZHhB9EMbmgT8gQu6wFHcqQ+n1RSS6C6JOERXZAQzc+/9/JDsIbzwJRat OHvyujnu0hAMeOq6QJQWqD/ThfhhNTEJ58YKFAAxsXH8gBqOFRUWyMiRgI1VqjO8IPGOF17gn1d aS0xB1WEj8qS7cOKBdMv+ymxARltk5Hb1OQu8SoDAQpWyaY3rntogkTXqIP6WbgUBc/aQNlrmvL z6r70V7znBj2tfTFT86BLyV4ruNZqkkSQQogBk5FqVdTqT06Hg/7J+f/sIXfWwQnTVHKPlveCX9 FqTvWRXouNWpExmMhlg== X-Proofpoint-ORIG-GUID: XrWlLgc_eVgoezBF6S24z_9E17E673Cy X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX4zKas7bJhGKN ZQzcMv9Sp39TEDQjp9ktXqxjsj3K62fJA/AuTJ5pbXECA+ny+GjhJkuyUpIUzYiyvNve9UiV9Am 0VRwAHqZYlf+cMLIuDyQmo/aZPtLEZY= 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-15_05,2026-09-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 phishscore=0 suspectscore=0 bulkscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150321 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:18 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 CB72547F3DA for ; Tue, 15 Sep 2026 22:00:19 +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=1789509622; cv=none; b=GTu70rclIR+v4A8kuAOij8ELHWXD8zIeBVndu3yg92u529zMMAuvkJMj6umtaQjCJrUXvnOakbShlFgq9TpGHnQs3Lo6BrLBfHE1GfqMQ1B858q4DrAC8zJ6Z1tb4CsUtdxnawAGXbXD1ryrrwaD7qJs2QU+RWxtLE5qc88lPsc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789509622; c=relaxed/simple; bh=F1xOH8Cv2QTO/PdtpfpJ4A2wP9Yac1w7ltfZ9UagIk8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Gd6PF8aqXJmaBm/rh0MxCZvPeHEvDbeF405MMQ+gD0arUl21VogU6agAJFoW4ZkcML2k9LrUnibz8u//XjekGi+DTqla03SZkImCTrK5AXpHzfkDyqlYksa1JR6nNob+iBQm+1Ghj3TACge/WHYgy8dMmWrtZ7gRtxGnlrvZbGQ= 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=lRRMZ7od; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Qu6eOj33; 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="lRRMZ7od"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Qu6eOj33" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68FLYlL33680491 for ; Tue, 15 Sep 2026 22:00:19 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=lRRMZ7od5oLKtya2 NLG38F7DY22APVJgf0eDbxCKE/RGdW/kh/ffWMbyEuByRRD6fd2xndqM2/F1daFG +8T32MTgpehErUFxdLPLZHcM/1dYHFXrtDvNpVwzDAodEF92GuQs2t/WEmaDKmu3 COm2kMfiV3en2EIbL8qBIPA9/R+wSZFIW0uCRVlWW3fYtMtuTNzM9UP0klvbfFtM DeuMkxkt6kXBVp6pma2mW4NfWrW11nmNdgU3ZMt5Gnz1yE9SR1kMXrcO+eGj0JGc FEUMTzWqjugNLOhlwkyEZkTJKTv3BwlLC6lOhuOL92kL11BOwff1lO0TjZEP2k5S 1s6phg== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gqe1r82wu-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 22:00:19 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-3989b317c31so1344405a91.0 for ; Tue, 15 Sep 2026 15:00:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789509618; x=1790114418; 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=Qu6eOj33/i5znM4+h8QNbMPdz7zb25+qJHSGbK5dIMc8Td7S4FzB0/RMw2mvglK8j/ 8ipXh3IVIHXVrIl3E40JWwIcXT6gxiDLlzRZv/pydVnr/qsXbwz4Xv1HPvx84eaME7Jr nY1+mafNlNx8E4BHG/5Qqyndfr+cLS72JH7WSUYYNmpZZ7NRWub5AV0CradCKyLGPlhN tVSEbznN0uiwrZ8RCKrwf6q6pwM9m2bwt+DO80bA0QG5Pwv1cq6wcGOGk1jzz1sIZ5qc e+3WCt2i7R3jBNUc2RI5NNm0xOLx7+Lu1Tt2wfMCufhRRWFcKwQo//eK+UuulsWK8yFo CISQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789509618; x=1790114418; 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=dO4KJO+yeFvbXd5OUHnQ3U4fA3bq+ONdHPnCNBNu5aeA/n3O7FfYIU37T3nJn8JcF+ K74oGzc9Tw+POvIEY4DdBbaCfugtueuaQXW06kU7FuqrqlHYRXQfFk3b/9Z41M4trGeh juDNWuNFIT1r+9EJFKB4xg6HL2lJujmpbwNUMqvgk6z/rh73UtxPaortbtTeO7qWTTx+ zshJQ9Fk2pRByGPlzh7hMhK9w4EnWBYi1Lj+36hkHipuPIkVvNMn+YyMYjU5qqiKEGuh IXjRua3XdtQdJ28z++CUf8FwQ8TD0MIzrjGhhq8DSaoehunUD54XxU+CBC3LxzQnoquy i4Dw== X-Forwarded-Encrypted: i=1; AKwUvByAu0ORO6l6k87OjM/ILr4RIs83CZ9ZjSCqrhhQdB7LU6txVpRjhbkUAUhZ1c3Xzb50uTaeqvHQQJTyybA=@vger.kernel.org X-Gm-Message-State: AFuF++mgTk4PSxVfde3jYtg8xBfMrayZ6r5NFomKQOFlbToXd0taEOGf Sq2zV86p55TdnBHzE2mk7V9Y0NuhLg+VUn/yD4FwXa+jvZ5My1XaaUYnU4Ej0LLpwRaU4pEugBH v+wwZ3lDoAs+sMEjr7PD5cvSCybHtLxNta3Jx0oWJmarw93to+cwPbstGjTDhJ0pk7wQ= X-Gm-Gg: AYBFou1yAOBGpQxLrl29jUVI1rqaH9S0urq1HovRUmLKHowVLMBpckimg2tsAQtqMc9 Aeh4e7NaJHt8NRaQifQOX5tvHGk6dUc7omwgTyFA3v3B20dwQu7s5vZyhBo500I/G5hec5U0Ww2 yaEDjfa2lhB4Bvd8x7aG3GZGy5D6pOGCuowaecv6+5bfLYghPzrDsJzPGNFdazBY5CtfzwX4dhP MhQVA5fX7rVaZUvoeMVtb8QjG0rq6tbVb/Of1u0eeb3czWww/d3g3Kj37Zm27ntenjl2Ko0iHOH Qo1ESdZniE8WytHA8S/O71YkoqcqvUVusdHSFA3WPQRKJhxqyvuIXiqIb8BWr76UxVdKf/Hnnsv eaUjUAPnE/NuPuaGQ4xYzQY4P9k9gCCAAZQ2GWqmPN54j2w== X-Received: by 2002:a17:90b:4c49:b0:39d:fcbe:fdd7 with SMTP id 98e67ed59e1d1-39e1e23cff7mr349886a91.1.1789509618142; Tue, 15 Sep 2026 15:00:18 -0700 (PDT) X-Received: by 2002:a17:90b:4c49:b0:39d:fcbe:fdd7 with SMTP id 98e67ed59e1d1-39e1e23cff7mr349853a91.1.1789509617470; Tue, 15 Sep 2026 15:00:17 -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-33bf5aa1e38sm1878345eec.16.2026.09.15.15.00.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 15:00:16 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 15 Sep 2026 15:00:06 -0700 Subject: [PATCH v6 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: <20260915-enc_roi_enable-v6-4-29dd4c8bccff@oss.qualcomm.com> References: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@oss.qualcomm.com> In-Reply-To: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@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=1789509606; l=13161; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=F1xOH8Cv2QTO/PdtpfpJ4A2wP9Yac1w7ltfZ9UagIk8=; b=+5B6apUlzFHyBhYT8Qvvm7pavFkts3ry4HS3sPf5XjNuDLmY3NoPt3S1YQUUUP8xTqmL+OvEj jpTkA/cObXdBHUCk7PRayijQh0Ga27+2NAySGz9nADAN2snFWkMYXQP X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfXx2ZHceZfoPEK tX5oOZtwXdYR5yNgeCF7PVZhkn2zcCL/LT5SLWQ43p8Diguyr8fbykrLspNOgRm6zEc9YAI0ZmQ r70JRPCM6Yv/FkTtKjVlp4daP8I7TCM= X-Proofpoint-GUID: NGpXPg7i-CeTVNF3pfEg45mUk-CGbpGT X-Proofpoint-ORIG-GUID: NGpXPg7i-CeTVNF3pfEg45mUk-CGbpGT X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX0KgO4lWR9d2i CPvSecxid4DmsPCxg7XhxQDyedCg7WSyrUst3LS018TewmcUb2KSqquPMx26Aa4R77Ej8CpBXU6 Okha8ia/uaTId/1rHv6oraDoQStQI4fN/xX4aLLrBrjRU43I9/XrKdM3eVLQcI+lU5zHmDgpCWh dx/Qa9kZS9B0xfT8VTIJLw8jbnz6AZ7WqoxAwqG5CxiR2zzDgzdZrJPBvDcpanmkiAejhd/oTkA +r/SAExIk0zPQRo226oWowO8Hy3rBCenl6tyWUJ8FY/u9WrhQHDwm5NX6LFdbrzIovF9k14xYra 3mfGCkG8foS7X+fVN03+NjlJb+1laodOjRQmDPlB/B8Y+4InlO1UoYNaHgNcFmZ2W2A4kN90h+M R9/6SJszf0nMHeHcp/xMLPgL9xaZVgpq/c1MvaeYzS/43ikbYdZ58ml+CICyzg3YHEDcCwdUBr1 zun56qGU+MjdU+/nE0A== X-Authority-Analysis: v=2.4 cv=ZIhCCn7b c=1 sm=1 tr=0 ts=6aa9bff3 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=gkYz9yhuOFcMo22kqTsA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9: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-15_05,2026-09-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 clxscore=1015 spamscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150321 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:18 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 000EA3EFFBA for ; Tue, 15 Sep 2026 22:00:20 +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=1789509623; cv=none; b=KWiUcBGTegJJnmB0vZHr7gMknGyFdRWqqCVPG6JgiD05bBX4SDOwlzueKqO+wGdYgLsZ7Tzf9h+KR+7T6EepsmN024dJQL2Np6qAQKJ8dqaeNEEMaArhQbc1/DRwQ8VfSnEzi0oASI+HEWSqBg1cBIjy3YzZ1CvVeMKbGGTMy5c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789509623; c=relaxed/simple; bh=5Y3wceAUSis4LyEEBP3vcPhXNhSkH4aQtluUG+lkk8A=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=l6sAh+SjnLvCYppQQYMSGix5MTsO1hJB9ct8h4h91D9ES8jyAn8DgRYRSoA5yw947s6vDogtoEXLVJq3JKJYsaU+u8zjrEE9rI/MXJQ/I4UDbaTDSPXwpJusNf3Xea2snWd6g45rPMl5GBbVSi19GJedsFm1+79kLGb6jUQO2vg= 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=JslOEOog; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=PhZtVxBb; 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="JslOEOog"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="PhZtVxBb" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68FLYp3o3680606 for ; Tue, 15 Sep 2026 22:00:20 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=JslOEOogjob/69Lb xzqA2IWHMrSArn3ApsLpYc8VG1weqUtt/ptexWXAv4BErxg69Os7emxrvsziX9dW RWXhsMMS1n835m5fbfWqK6ZKyi9HEyoJBVJ45DJDQwplh4VVjIikcb21o7h6pVir tWAs0slQLmHwFdD9eOHjtyDj9wpHqmpDXE8dYQ8sFFhDNfYMg4w40qiioFiZJG51 rw9x0JyfCv85P2PpjHWP4QmrEJHcQ42SaZW1Q5jnAH+ll84Ow4u3j7slaUry/LOy B3liJlf3LRmtmBn5XZkFWD0D0+p3rkfmWUjw4UtGf7Pb8mtcFdEcAScllEUMXYmC YeEzEA== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gqe1r82x0-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 15 Sep 2026 22:00:20 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-39924189378so1703598a91.1 for ; Tue, 15 Sep 2026 15:00:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1789509620; x=1790114420; 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=PhZtVxBbgDvfFr0g4Hvt/A3G+H3FNu0pAGQmA43V6H4ybcFGk4HaFA11Dh07WpiSdA DV/zJFw5vZ1i7+LeO2nnscvfppPBVNDfkOqKNhDqwgAWr2P5W893qiRxPWxylucCprZc QBv3PcqFvfBW6XEbRqTjvKKxABmTUOQGvtJt+30WT2PekX9HU4JqQEGdM5UOw9cWmpj7 J2CdsE3lyycKKbIkYW1n9+A9qcayr37+NuA5oj50rXwxecRMkRMqfDjoK+HiV89worlv m8GLIYZU9P5Q5PeKjpxQVExiWnTT7oRlKmcTvO2sccMCW11WE5R3XkvmrHbVM5wfY/DO jICQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789509620; x=1790114420; 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=t7w9hYxwyXOzgqC16zCP9ROlpd0JE1z1hXUggLPbB55wRarFFAYj7yO3SYK7bFxq7L m4Hz1vAiiIjWDQRNvdsywv8NnFumR7iZ9L2N5D+5B3P0uicxEgZDEhT2A4ZWUM+6O1K/ sBYVZcXZb1O1Uwo9BFvsuOQN/vmQvhDTsEcBIVmGExCW1THSAQpW/c8SSYLb3M7QsoZN ZG9kE1u0DmCZb5ZiDTZxXsVvNbuogCRln9nNsqnMlUsRjHFDu5lEse3NM50lKZn63mct pgif9uxhAmF45nXCfYl3255qHwU4krSQbqLeNOjTyWDTiRUcfOB4LvW0I98G7wB6aVqi McDQ== X-Forwarded-Encrypted: i=1; AKwUvBy23DL+Beo66cofOkE0XgFgbiuLjmbbWgmTzxNjCJ66NQwuCBuVjSPe9BeCRYbZIyfCtP7kopsdj84ARgQ=@vger.kernel.org X-Gm-Message-State: AFuF++k5R+2HBlF60AxKYNz5KyiezFqCeJKQxKaphZIHjGVE94owOQ6r HptiHa6ojSIzQAzulCQ8nNEaUJ37rkdoT0yFmkIhiHTi40gGxU5tWAmKcUJXlF3k3OYWJbRt46S ZhCQsepL/fl2pze/7rmnWR5rvH8SVbmpMltQwbZ05Jl3DvFUD423VlBxZoCX88FAbboc= X-Gm-Gg: AYBFou1cDUvF1Sc/ky6vzlO00cW7SDXujs9woiSxSST6pTp3gepTebcLpWLKnh5nxsi HUFlu7n6WWt75ZZZceqdGAwXg3wtYvskwzEqgbqgYAuFgTYfVaEPmLdCyrE714Lus7JxLShBZol jXVlbpxTgQeMy1fTniaEUoUjFv9be2bCTeUBqAYt1ovklXeZ/1tyap6rwZkOH53NL9ZyyUiwAsr /cJqs1DzNE+PBngd0IO597zL9Z2GPi+mrWv4q/rNJAX2P270ld1g5jOfm4KugZhwUCaMOncsKap w41Bs2bBqe/20kiMvVUcXlUF5kTzDAQot+NWc6EWzmBDhluP9WtuhHMe3aD65dV+ZKHn0WeGizM ghSaelLn0Vw34DqHLrTWRwemookUjdpM9nij1Ibz9JNotZkY/4kQnyoeLcoiC X-Received: by 2002:a17:90b:4a92:b0:39d:f130:8f12 with SMTP id 98e67ed59e1d1-39e1e284702mr356294a91.2.1789509619023; Tue, 15 Sep 2026 15:00:19 -0700 (PDT) X-Received: by 2002:a17:90b:4a92:b0:39d:f130:8f12 with SMTP id 98e67ed59e1d1-39e1e284702mr356263a91.2.1789509618455; Tue, 15 Sep 2026 15:00:18 -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-33bf5aa1e38sm1878345eec.16.2026.09.15.15.00.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 15 Sep 2026 15:00:17 -0700 (PDT) From: Deepa Guthyappa Madivalara Date: Tue, 15 Sep 2026 15:00:07 -0700 Subject: [PATCH v6 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: <20260915-enc_roi_enable-v6-5-29dd4c8bccff@oss.qualcomm.com> References: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@oss.qualcomm.com> In-Reply-To: <20260915-enc_roi_enable-v6-0-29dd4c8bccff@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=1789509606; l=13722; i=deepa.madivalara@oss.qualcomm.com; s=20250814; h=from:subject:message-id; bh=5Y3wceAUSis4LyEEBP3vcPhXNhSkH4aQtluUG+lkk8A=; b=VMwd7NCYPuGZj/VU7pQRZVW4wso0+wJxbdHC9xD7lQYNZOfwQK4N737zgzGs/cstHSxYlUpGx JsL3OzNZtVCBkYOSoCPYp069+1RINu/VNikN7JE4LnCRxX7/mCFK3hD X-Developer-Key: i=deepa.madivalara@oss.qualcomm.com; a=ed25519; pk=MOEXgyokievn+bgpHdS6Ixh/KQYyS90z2mqIbQ822FQ= X-Proofpoint-Spam-Info: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX7IkQFMtVOn0D BJCZVjZTFAKDkINiLO689ECVzeOsI5rAz3CRUx+0c8SkPnK3A0VcPowj4qpXzFKmu166eIQdXZX TUoYTrOkYJajd3e99R+GdJo05PJTF2U= X-Proofpoint-GUID: 4H2ArGOrBQ8NAVuhMa6ZiifMhohz5JdM X-Proofpoint-ORIG-GUID: 4H2ArGOrBQ8NAVuhMa6ZiifMhohz5JdM X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTE1MDMyMSBTYWx0ZWRfX8M0sam5pD8le iKflKTfEFGp/GXnLaOXupbIyWBI5tHOWKmxR7X6JZtXNLHpUrLDssh5FKXisA5rEipsJQGF7KyO kU2UFdtts4akP1hOgTtr2l83dtoj8SQC08VZWFXhwMO7HtQBLHt5amvf3LxFukdFUf+0qBfQ/d2 46qviatCwfrWIt03BCopTerh0EGj0OdnlVZZHCW8Dt6hTuFpo8DNFfd/eFzvaZsaFUuTe6N7FWp S1juR6I8yZYBHkqhYAkBqyG7rS0XDJDEFo/wagEbWx4H/PRPr3r9Xhp8Wn+yLEYFSh79KFmMJ2y Df+G0KMI/b2gPRqYhJmNlpYczWkyNEXCa7gdEo9/O5cHHwGytDAKpieRrGsjFUENQfScbJHIy0L FXMepsOViOBevWOlXYLOIZJNzDYYZ1r6OwwDwFtiXxfU0iShKMnRiJ+fXD6e7LYfLnmfNa+OhAu lI+1MxHhSxdy2dwuxIQ== X-Authority-Analysis: v=2.4 cv=ZIhCCn7b c=1 sm=1 tr=0 ts=6aa9bff4 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=ouPCqIW2jiPt+lZRy3xVPw==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=vSfK5Sz1eu9jql6VJIMA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9: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-15_05,2026-09-15_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 clxscore=1015 spamscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609150321 - 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