From nobody Sun Feb 8 16:12:13 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 16217329E76 for ; Fri, 6 Feb 2026 08:12:45 +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=1770365565; cv=none; b=OEw7LKBfvGaVZPR6Gr8kwEkyKxPhVD9M+dDi1Guwncy/wCAP3ra969NIPn05Y4CAy29DDzJkVYzfdiIcY14VlZ3d7CJ27maYjLdjDqc4YGWbOmfSL+4qZaDg9wLLLCiICXPwhug7fvuuiF4hBSDmHzgBCYqAWkSg1xfvjmkPeNg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770365565; c=relaxed/simple; bh=vu0FF/0EWxRRRdI+Ueke/qWAx0AFTRqdB2hGPgQ0ldo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U9WWS5tLdEkB5Slzp9JNQIUP5hu+3TtKzeBscQjpPCNdkMYIQJrbnYm71jAv495upfdYVA+mFNK7+26bQrY77Tj6xMVGWvyn1Iyu6NIdKrb6aFTD4h0x1NVn4IPZ5434wfFp57YYLo5GJdTuHcMSzsZJXaRDuINMtB40yUz4CC4= 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=n9aJ/dmj; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=JnOUXd98; 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="n9aJ/dmj"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="JnOUXd98" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6167Xrjj2482242 for ; Fri, 6 Feb 2026 08:12:44 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= vusokcB14ISYWAIOqjpq0u21/gtzX6Vq7VTeLwjsWM4=; b=n9aJ/dmjl71botB5 dQeuEfKJPpUkbIRh8mIkFuEJT5c70cI6VBqmp8sEPviCuNRP1TqTC5sdlvgHi0SR pLTnDrwYOECjXGCarDQNDT3SGxdcpwtPnhCg2Odh5WUeKqGI6NHQyskGQs8Q3lMA iJPdcR4nBaKHoLqDmLTnzKZyPFfwwSn9IgnIiyBGL2QGgoZMsRaeJOF/ePDmLf7w torVv1/PaasWKJVlV7bXCWoSkEQD7dJTWSMIq7WGY5KjtX5yavD9sj6+xh3PfeYe fX5gllqHPyNR6B2pBhtTMd4WtvI3d8Wyep3iKA7YoaARl/RapKDxy9GLoqcZLtLB dzTqqw== Received: from mail-pf1-f199.google.com (mail-pf1-f199.google.com [209.85.210.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c5c1703wt-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 08:12:44 +0000 (GMT) Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-8243c83d108so789419b3a.0 for ; Fri, 06 Feb 2026 00:12:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770365563; x=1770970363; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=vusokcB14ISYWAIOqjpq0u21/gtzX6Vq7VTeLwjsWM4=; b=JnOUXd987HwMUJT9TvuifG56ItXmEi77To1YHVc8QLPd1+jVnA4J4+oQFYDx5zSLi9 LSrNjJvFypwreJGG2zCKlWI5ETI1o0OEq597Di2k0rC1Qshz9TYaP/WpfTThLxrwedHd 48N0reXQmmDBhtzRfNkNuhQpRVBU3dh6tTHsG3ER80cjT2oibgQyhLxKUt867UvSJPRg xbqtZRpTD60WPli/3v86BGFWOLlo5A8rO+6JRgNrWFM9+IXxAgrXFNW6oKaBLFEMp1Bj XCXQu3e4om3EWu7w5me4mcnAOTn7WIThX3UC8L4WpcsuQLIFeZy9xUDS181TFuGCe+h0 YuIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770365563; x=1770970363; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=vusokcB14ISYWAIOqjpq0u21/gtzX6Vq7VTeLwjsWM4=; b=TP/9lnjYSEGG/RpV68go2Wp+UwbS4/K+OXIxT37636y/eoNQgAqzjWNzrZqsa+ITAX y5kSMj+1lbxiYBycKN/b3S4BI6lDMKwvhyDqdPJi6XpJ3EwXjFit+XU/ZwgEiUbx8AXy F/7bNr96hj3d1pc+wsZUdUPaznA49FSfufwZlYGORq0LHkAd0b3rkLEbSBzxWyAlWYrS 6iHyiF3t2zBJVNN7ayuL8wE7a66XmzdtBd7kWfApx1BsPXgLd93hSW6bqZJs1j1rhr7+ UeZYnKAo5oQEIlMzbuCeh01pF3mxG8mCrk7WfsiROaQoX7iNbqFq60ZZ0nVHlMxgV6YD 1cvQ== X-Forwarded-Encrypted: i=1; AJvYcCVQEUq+U5NuYX/GApMU7d7Uurpr5Zfym6K2G46knrvaPXlcFdDtFLTlY6a175z8zxx9q3v0rCsU9EaPSjo=@vger.kernel.org X-Gm-Message-State: AOJu0YzfAwd0u7qDAWRXppurUbougQp/OZuDJScJsf1oWJeOaztwkc+D zOh/qIdl3anHBXNDAUXq5wlSmgO/I8oHVqMf0MwEsfGoeJYDCScq1uH80zk7i3Uv0qI5wdsb0gg Z+LC6wxIo1eTbMJFC8defw1l0JhXkSpBa3fBw6pHzo9SeYFIhbs/aVoFMJ6Dz/C0KzXo= X-Gm-Gg: AZuq6aK7y1Ac9MnpGnfopYh7rN9cfiOz+ArTsD8IAHkj24pHFeM//QNOCB43F2XLGP7 MgRAlzkdQTmPVYQI84SCn1SL7K1U68gLWEN+rzXxUWdxb/2BeeMOfJ/t9nE9g6KCgodP0/fbhL3 a53DAzIRQBZFN1QLzOzkaHZNp7HJ9Ty2T34F16olfvL3owSDm2gQJBLu7TT54AW6Pe3dQvlv6m/ TeizAd6SQJge2VxUGOhUIVFqv/IcMek+YFzP2jtk8vioepFs9ztBZEyrvE6tovtLJ1jvYApfUUP x1S2WjEnWhE8K7OwqvkyEK2YbPcRLpEgduiUrRjYs/IFD+152ExyaFFU+uReHrOkLEKFj9oDPTf EKTKbcHxYKzzYHBmHeklmjyuJAg6ZFIN/lXAmSrSr7KwROlv22JlwpTT5tLXX4rNj9qDEOxjV8z SAogaGALgX X-Received: by 2002:a05:6a00:198a:b0:81e:d7c3:2f3a with SMTP id d2e1a72fcca58-82441727a5amr1552619b3a.46.1770365563004; Fri, 06 Feb 2026 00:12:43 -0800 (PST) X-Received: by 2002:a05:6a00:198a:b0:81e:d7c3:2f3a with SMTP id d2e1a72fcca58-82441727a5amr1552575b3a.46.1770365562025; Fri, 06 Feb 2026 00:12:42 -0800 (PST) Received: from WANGAOW-LAB01.ap.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82441884b75sm1671866b3a.39.2026.02.06.00.12.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 00:12:41 -0800 (PST) From: Wangao Wang Date: Fri, 06 Feb 2026 16:12:10 +0800 Subject: [PATCH v5 1/6] media: qcom: iris: Add intra refresh support for gen1 encoder 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: <20260206-batch2_iris_encoder_enhancements-v5-1-fb75ed8fa375@oss.qualcomm.com> References: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> In-Reply-To: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: quic_qiweil@quicinc.com, Renjiang Han , Wangao Wang , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1770365554; l=7870; i=wangao.wang@oss.qualcomm.com; s=20251021; h=from:subject:message-id; bh=vu0FF/0EWxRRRdI+Ueke/qWAx0AFTRqdB2hGPgQ0ldo=; b=y2+sghU9p2F3vxiFmhD06MoHv23O4dFN3Gb2SC+M7yjIETT+R0NArSAJw+oUf+pP0ysG7fWQk rmhrs5XZWqlC5YnLJXmnOondv/NHuvEkK0+j3ZjS47oP5Dg1nU+WMmf X-Developer-Key: i=wangao.wang@oss.qualcomm.com; a=ed25519; pk=bUPgYblBUAsoPyGfssbNR7ZXUSGF8v1VF4FJzSO6/aA= X-Proofpoint-GUID: kUCcYSBHaxBl-GQ_n67JAqtdMOAOpwJR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDA1MiBTYWx0ZWRfXzrCxIoJEm2V9 S4A6+d28VKxlBvvRa5kjSTv8Q5ygPzTGG/amC9LJ3IcJZZJGZywCaSh4SpOL3yezBvGSuEVfhEW P7e2SGv6USt3geKDvJ8cRLOdb1q1vDElxXUIZMW0lmDKnyxALQMYDKoKHpeCJnOBjZl3fVQWrV5 34FDP8Z8cp7OsXBgqICfAjO/zFThAdlYqlm3oizGIEt0f81B1IzJePh9tgmnCdJkPR8D4knJuBQ 32DvSw7GYGJc/bYyAtxxCEWqz2CaUsax/ZSnuY7DnIAVzV8sq8CEfc2bfS03hs5V85B8B2cIkV6 6vC/MHMJO94uUwiC43WUWq3ZG4mn34EJx5L0xfAhkp23wVzAvlPETrx67Vq5qw2K36BK9gcYkin zauWD+LMsvQWMbi7p5+J5S/fBCf9Y1E/V/K9xFejDJbYa+15kUvFqJJagaB1ffbUSt9sr6Hj/uJ ibdscFrTzbi5WbhR3dQ== X-Proofpoint-ORIG-GUID: kUCcYSBHaxBl-GQ_n67JAqtdMOAOpwJR X-Authority-Analysis: v=2.4 cv=E7TAZKdl c=1 sm=1 tr=0 ts=6985a27c cx=c_pps a=WW5sKcV1LcKqjgzy2JUPuA==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=EUspDBNiAAAA:8 a=KKAkSRfTAAAA:8 a=vcDqveFK9my7lXZq-ZEA:9 a=QEXdDO2ut3YA:10 a=OpyuDcXvxspvyRM73sMx:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-06_02,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 spamscore=0 clxscore=1015 bulkscore=0 phishscore=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060052 Add support for intra refresh configuration on gen1 encoder by enabling V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD and V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE controls. Reviewed-by: Dikshita Agarwal Tested-by: Neil Armstrong # on SM8650-HDK Signed-off-by: Wangao Wang --- drivers/media/platform/qcom/iris/iris_ctrls.c | 39 ++++++++++++++++++= +++- drivers/media/platform/qcom/iris/iris_ctrls.h | 3 +- .../platform/qcom/iris/iris_hfi_gen1_command.c | 8 +++++ .../platform/qcom/iris/iris_hfi_gen1_defines.h | 13 ++++++++ .../media/platform/qcom/iris/iris_platform_gen1.c | 19 +++++++++++ .../media/platform/qcom/iris/iris_platform_gen2.c | 2 +- 6 files changed, 81 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index 3cec957580f5ebbc8d6a7a613866fd0377fe213a..5441278f80fc5d0f97367c09b2e= bd98a55c7ff1c 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -970,7 +970,44 @@ int iris_set_flip(struct iris_inst *inst, enum platfor= m_inst_fw_cap_type cap_id) &hfi_val, sizeof(u32)); } =20 -int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_t= ype cap_id) +int iris_set_ir_period_gen1(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + struct v4l2_pix_format_mplane *fmt =3D &inst->fmt_dst->fmt.pix_mp; + u32 codec_align =3D inst->codec =3D=3D V4L2_PIX_FMT_HEVC ? 32 : 16; + u32 ir_period =3D inst->fw_caps[cap_id].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + struct hfi_intra_refresh hfi_val; + + if (!ir_period) + return -EINVAL; + + if (inst->fw_caps[IR_TYPE].value =3D=3D + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) { + hfi_val.mode =3D HFI_INTRA_REFRESH_RANDOM; + } else if (inst->fw_caps[IR_TYPE].value =3D=3D + V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC) { + hfi_val.mode =3D HFI_INTRA_REFRESH_CYCLIC; + } else { + return -EINVAL; + } + + /* + * Calculate the number of macroblocks in a frame, + * then determine how many macroblocks need to be + * refreshed within one ir_period. + */ + hfi_val.mbs =3D (fmt->width / codec_align) * (fmt->height / codec_align); + hfi_val.mbs /=3D ir_period; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_STRUCTURE, + &hfi_val, sizeof(hfi_val)); +} + +int iris_set_ir_period_gen2(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id) { const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; struct vb2_queue *q =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index 9518803577bc39f5c1339a49878dd0c3e8f510ad..a0d5338bdc910bd30407132e8b7= 00c333ad74e4c 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -34,7 +34,8 @@ int iris_set_frame_qp(struct iris_inst *inst, enum platfo= rm_inst_fw_cap_type cap int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_ty= pe cap_id); int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_ty= pe cap_id); int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type c= ap_id); -int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_t= ype cap_id); +int iris_set_ir_period_gen1(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); +int iris_set_ir_period_gen2(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_command.c index 11815f6f5bacd4b464f6c76fd32adbd59d4167a7..f30fbb803936cea030c2b548580= 1cbb7addef34d 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c @@ -687,6 +687,14 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_s= ession_set_property_pkt *p packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*plane_actual_info); break; } + case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: { + struct hfi_intra_refresh *in =3D pdata, *intra_refresh =3D prop_data; + + intra_refresh->mode =3D in->mode; + intra_refresh->mbs =3D in->mbs; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*intra_refresh); + break; + } default: return -EINVAL; } diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_defines.h index 42226ccee3d9b9eb5f793c3be127acd8afad2138..04c79ee0463d7f32a2042044fe4= 564718cc01561 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h @@ -139,6 +139,14 @@ #define HFI_PROPERTY_PARAM_VENC_H264_DEBLOCK_CONTROL 0x2005003 #define HFI_PROPERTY_PARAM_VENC_RATE_CONTROL 0x2005004 #define HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2 0x2005009 + +#define HFI_INTRA_REFRESH_NONE 0x1 +#define HFI_INTRA_REFRESH_CYCLIC 0x2 +#define HFI_INTRA_REFRESH_ADAPTIVE 0x3 +#define HFI_INTRA_REFRESH_CYCLIC_ADAPTIVE 0x4 +#define HFI_INTRA_REFRESH_RANDOM 0x5 + +#define HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH 0x200500d #define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES 0x2005020 #define HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE 0x2006001 #define HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER 0x2006008 @@ -447,6 +455,11 @@ struct hfi_framerate { u32 framerate; }; =20 +struct hfi_intra_refresh { + u32 mode; + u32 mbs; +}; + struct hfi_event_data { u32 error; u32 height; diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/driver= s/media/platform/qcom/iris/iris_platform_gen1.c index df8e6bf9430ed2a070e092edae9ef998d092cb5e..a7595c302162b9fe758c6170689= 5a709b3b4e852 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c @@ -246,6 +246,25 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8250_enc[] =3D { .flags =3D CAP_FLAG_OUTPUT_PORT, .set =3D iris_set_qp_range, }, + { + .cap_id =3D IR_TYPE, + .min =3D V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM, + .max =3D V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC, + .step_or_mask =3D BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RAND= OM) | + BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC), + .value =3D V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + }, + { + .cap_id =3D IR_PERIOD, + .min =3D 0, + .max =3D ((4096 * 2304) >> 8), + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH, + .flags =3D CAP_FLAG_OUTPUT_PORT, + .set =3D iris_set_ir_period_gen1, + }, }; =20 static struct platform_inst_caps platform_inst_cap_sm8250 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/driver= s/media/platform/qcom/iris/iris_platform_gen2.c index 5da90d47f9c6eab4a7e6b17841fdc0e599397bf7..0de85c51cf745e9a121da14b1ad= 7bc761505c957 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c @@ -738,7 +738,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm= 8550_enc[] =3D { .value =3D 0, .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, - .set =3D iris_set_ir_period, + .set =3D iris_set_ir_period_gen2, }, }; =20 --=20 2.43.0 From nobody Sun Feb 8 16:12:13 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 493B833B6E4 for ; Fri, 6 Feb 2026 08:12:49 +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=1770365569; cv=none; b=KZdS928N4PyZDOsoRso2imMhqxvtDA77HSXfx7DEReRGsN3XAoon8qk6ixB5cR1q3I2RMXwsR7WCFdV6/ijpGA0+VD5bw7TV3trTxnTvzk2TUr/s5feW+Pnfnux0fwM36Nc4TvHTp6fjGXkUddhrTuKnKiz0moyL8Ugt4Se8uio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770365569; c=relaxed/simple; bh=h9Ihd+t8FgteUUt8it5iiV/83RPW5jgduWOelTyHaL0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VBq1z/XA0yBdaoJt01MpMWy+kM4z+MjEeCmIaumfvhFlaxA9aDlhpm3RgIITi+lCM5Gs4M2A/uFmCRMJK5yPE9KgIrfrtJnbw+ufK0gdIZOAkOQRe0ABHhh8N67qANc/aLT9JSg5MwPLuVlQU4x+HhnPau9jjR81btoJLxuduWY= 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=d5e5FWGl; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gmBLb5hH; 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="d5e5FWGl"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gmBLb5hH" 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 6160xf8F691221 for ; Fri, 6 Feb 2026 08:12:48 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= CkJlWZGo9t5t7NicyWfQkWXYdwTUdx8Ffh86gvs2RYk=; b=d5e5FWGl64QUudfJ rKPH0sbODlNtSn+X76Hx94QnhcqvstBsouzIqFRHASAC72ncAJc9LKWcTS7uuIhh F3HhYFh2FfrKqxVA4sLt9pR4lJgOHOp4ChGSySJ3cGAv3jjEs5cTgR+k98HDnXYM zKeEOPPviXBGO27IHQYvmk9UMfyLPnaPBWFDWu49yPUxzrzI/WJDJQ3Hi181R8gD K3dhs1asQS4iCSDw3f3z72kRbDgkTA4lIzEyyMlAhhKJuFy4wCwf+cVvFb4VygpK osrJ5BWDflTN+2czSGBRTtrzCCtt/VZLP56fmM3YHCenCSiAvT0xDDAQAi/8eJe6 h24FdA== Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c4t0t3rcb-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 08:12:48 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-c65d08b623aso1413242a12.0 for ; Fri, 06 Feb 2026 00:12:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770365567; x=1770970367; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CkJlWZGo9t5t7NicyWfQkWXYdwTUdx8Ffh86gvs2RYk=; b=gmBLb5hHQVWseaAd7SDy/Ix6IrOmuEAsTZZUteqwj3OTYtYCZ1d2T0aTSGQyOM9qS4 z32HcoHbRv1IjBCv6XCEVsqO1sjGpKd7bOQfLMcXLPX8KWqK6tksCpjQLmUeKFYcoIGs UYI9Djiay4BAXv83Ymna+69VAdthFI+JVPDsHiAVq1u3mM9/RRdQidCiY6LIo1ahW+uY Fw/ffIA0d5RuYlqyCFVTdElh5BKMbODaLv305yTZUjTiCmcJoeMH0uRR0LIKzXzI9il9 I21QrBmp7/5rtXxW52ovheMJhxujoJwAmwr38qDbKuWSphDYKWIEybl44Cl1zyc6aAYa jqdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770365567; x=1770970367; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=CkJlWZGo9t5t7NicyWfQkWXYdwTUdx8Ffh86gvs2RYk=; b=kGZhaJxMDuQ9vjK9mPz7czPtH1NiWfkVBZd7nGoizZaQQv+760f5FW0SPbwURUcAYu aAFV0rzCOrBPFAzkTjqU7GtbzMwa2Kocj2N7U20iUHHoQlzl4WAtY7m2q6MH0zGU4LLc 9JEcEtrL9HnQ2WL4EfMybL1kwi5symhkeLWpy9pxMmUiW1HINImadongBvKAn2Mu0cun h3RJpxy0vqCfU2unG2WLpSx+elaGfsYAtlRo2UkwjZRr6IsuLuHx8mBMAbYto39cr6GP o1wztSxIiPaXxqS7bqVsGmoStuDni/G9FnONpfgZ1RIb8zXZoAjvvPIBqETfzm966pUY W3Mw== X-Forwarded-Encrypted: i=1; AJvYcCUGzwGP93/6QpIG9vA+eYowT/vVm3r3CjVDrdUq6VOiS09UfhZi4uRNVQzoCtwglqS39WJTSbI2o94u/Cw=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+HT3HfVgMvVx3oTsJwu1tVF3T8kB5TqucbUx1ESCQrG4AnQtH nUSZAns4nNyUDGuMSmSNB+clKPbUvvyMMUEZc1kl5wPgSXe6elYzcCTnpSqJVAMZAeKp8iMHFpZ c67OCVhloixd4i3fVsgxa9D+YKK1BumM8EE35QGcRZQcoHXgmI+g1ukdnJypoNfYHBy8= X-Gm-Gg: AZuq6aKzFNzrp7Y0IoFDZG8otiVAa1f9G/yAncbpeMWDojogU21OSQVJgp/wFvlC8gd AqIH43e4i9mffHOGJMDxNLjuiIMKSQ11CrcxXZfslDD7JUO6DIRhyXe9qUFQA2Vqi0DiJiEG0nj sagOCWwDK7j5dCF1tA9faybUrGuajfqzMrvrKvAcktYBbiZIxHMwNbMobk0Fb0ehtHltUcD5erv 8pTaA3lLGCWKRXn4xFQgA41DQzyAxv2zPDHFXTBN35tDqM40WQ93swQwM05FFzjdK7ezfaPy3W8 2DOTfIlOKmP5RUGsW8SPClVCKAGr4utvs7oQEO33UajyjbWHsBxJDqh6pIDVw1FdXhV+6ziXCRC AEaoXE+wF9PwygTa2Q0+d1Eai54mGvBRbkvQ0sGlJ2LKze9hK93Y3OSA0e+zf4q6VgmKGatEZy0 Kvt0ooideT X-Received: by 2002:a05:6a00:92a5:b0:824:3e25:3cdb with SMTP id d2e1a72fcca58-82440d83d33mr2240217b3a.18.1770365566941; Fri, 06 Feb 2026 00:12:46 -0800 (PST) X-Received: by 2002:a05:6a00:92a5:b0:824:3e25:3cdb with SMTP id d2e1a72fcca58-82440d83d33mr2240179b3a.18.1770365566251; Fri, 06 Feb 2026 00:12:46 -0800 (PST) Received: from WANGAOW-LAB01.ap.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82441884b75sm1671866b3a.39.2026.02.06.00.12.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 00:12:45 -0800 (PST) From: Wangao Wang Date: Fri, 06 Feb 2026 16:12:11 +0800 Subject: [PATCH v5 2/6] media: qcom: iris: Add Long-Term Reference support for encoder 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: <20260206-batch2_iris_encoder_enhancements-v5-2-fb75ed8fa375@oss.qualcomm.com> References: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> In-Reply-To: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: quic_qiweil@quicinc.com, Renjiang Han , Wangao Wang , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1770365554; l=16389; i=wangao.wang@oss.qualcomm.com; s=20251021; h=from:subject:message-id; bh=h9Ihd+t8FgteUUt8it5iiV/83RPW5jgduWOelTyHaL0=; b=AiUT6K6CtDJT8DR96W/h4K3TU4vaamzKrSFdksffwOr7ShMlc7xl02vwIzjeNd3UlfXYKncC0 50dzb4oS06rAHBSka/Ru4y8Agj3+5NR1MyvuP6WGdJaipcfd9P2L5l/ X-Developer-Key: i=wangao.wang@oss.qualcomm.com; a=ed25519; pk=bUPgYblBUAsoPyGfssbNR7ZXUSGF8v1VF4FJzSO6/aA= X-Authority-Analysis: v=2.4 cv=WZMBqkhX c=1 sm=1 tr=0 ts=6985a280 cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=QunbDvX0_-zBgmAapgUA:9 a=QEXdDO2ut3YA:10 a=bFCP_H2QrGi7Okbo017w:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: u7-ewBVguak2TYCU0yDqsfeuFo9Gup8Q X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDA1MiBTYWx0ZWRfX9UszniVsAONG DwX2GJ8kROMyWCb6Z909Hb5bu+lsg2biM8WpEs27AUs6uI4afGerH23yeK4OHWa/3kCVDbyybGc LxlbJnslpCaZnaJuUC38d/TMTR5Rv8apWAdfw9J9qEtmHD4ZJW2abYzq+xIPEZICnXVaxkYe3zU WI8qH6YGDg+pclOEsqwpMVfHntN7PQMsJv8tOU/ecLbbmoZKrx/Qn0iZxIGN2RpVludtT0JAMaL 8FdpLuYCZ9cQBMRhwr11YgRCtSXA5pIUt5IYJYC01PjNMSZXT8T/3Zx4ZuLQcd4uV7BLW3VGAYg Ch3eMA5cXfVeRgT7gXAx7Z+ajmF0Zxa6Z9JUzcd4tFs2igITRLVtA+rfR+0S4gLVxge7ScdgvOx e5AjH62yPzexblbQP6oQkg/L/EstsUK6vr5EEE1BEvJwtCK8ipUbYEG9JPIAJdrqIleXuMZhobW eGi6EgGF61JBPIiAHtQ== X-Proofpoint-ORIG-GUID: u7-ewBVguak2TYCU0yDqsfeuFo9Gup8Q X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-06_02,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 priorityscore=1501 suspectscore=0 clxscore=1015 bulkscore=0 spamscore=0 lowpriorityscore=0 malwarescore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060052 Add Long-Term Reference(LTR) frame support for both gen1 and gen2 encoders by enabling the following V4L2 controls: V4L2_CID_MPEG_VIDEO_LTR_COUNT V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX Tested-by: Neil Armstrong # on SM8650-HDK Reviewed-by: Dikshita Agarwal Signed-off-by: Wangao Wang --- drivers/media/platform/qcom/iris/iris_ctrls.c | 128 +++++++++++++++++= ++++ drivers/media/platform/qcom/iris/iris_ctrls.h | 5 + .../platform/qcom/iris/iris_hfi_gen1_command.c | 25 ++++ .../platform/qcom/iris/iris_hfi_gen1_defines.h | 24 ++++ .../platform/qcom/iris/iris_hfi_gen2_defines.h | 3 + .../platform/qcom/iris/iris_platform_common.h | 6 + .../media/platform/qcom/iris/iris_platform_gen1.c | 30 +++++ .../media/platform/qcom/iris/iris_platform_gen2.c | 30 +++++ drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 20 +++- 9 files changed, 267 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index 5441278f80fc5d0f97367c09b2ebd98a55c7ff1c..9a9dec022b35e94c800fc13ec35= bdbba520e7168 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -112,6 +112,12 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(= u32 id) return IR_TYPE; case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD: return IR_PERIOD; + case V4L2_CID_MPEG_VIDEO_LTR_COUNT: + return LTR_COUNT; + case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES: + return USE_LTR; + case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: + return MARK_LTR; default: return INST_FW_CAP_MAX; } @@ -213,6 +219,12 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_= type cap_id) return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE; case IR_PERIOD: return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD; + case LTR_COUNT: + return V4L2_CID_MPEG_VIDEO_LTR_COUNT; + case USE_LTR: + return V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES; + case MARK_LTR: + return V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX; default: return 0; } @@ -1033,6 +1045,122 @@ int iris_set_ir_period_gen2(struct iris_inst *inst,= enum platform_inst_fw_cap_ty &ir_period, sizeof(u32)); } =20 +int iris_set_ltr_count_gen1(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + u32 ltr_count =3D inst->fw_caps[cap_id].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + struct hfi_ltr_mode ltr_mode; + + if (!ltr_count) + return -EINVAL; + + ltr_mode.count =3D ltr_count; + ltr_mode.mode =3D HFI_LTR_MODE_MANUAL; + ltr_mode.trust_mode =3D 1; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_STRUCTURE, + <r_mode, sizeof(ltr_mode)); +} + +int iris_set_use_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_typ= e cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + struct vb2_queue *sq =3D v4l2_m2m_get_src_vq(inst->m2m_ctx); + struct vb2_queue *dq =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); + u32 ltr_count =3D inst->fw_caps[LTR_COUNT].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + struct hfi_ltr_use ltr_use; + + if (!vb2_is_streaming(sq) && !vb2_is_streaming(dq)) + return -EINVAL; + + if (!ltr_count) + return -EINVAL; + + ltr_use.ref_ltr =3D inst->fw_caps[cap_id].value; + ltr_use.use_constrnt =3D true; + ltr_use.frames =3D 0; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_STRUCTURE, + <r_use, sizeof(ltr_use)); +} + +int iris_set_mark_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_ty= pe cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + struct vb2_queue *sq =3D v4l2_m2m_get_src_vq(inst->m2m_ctx); + struct vb2_queue *dq =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); + u32 ltr_count =3D inst->fw_caps[LTR_COUNT].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + struct hfi_ltr_mark ltr_mark; + + if (!vb2_is_streaming(sq) && !vb2_is_streaming(dq)) + return -EINVAL; + + if (!ltr_count) + return -EINVAL; + + ltr_mark.mark_frame =3D inst->fw_caps[cap_id].value; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_STRUCTURE, + <r_mark, sizeof(ltr_mark)); +} + +int iris_set_ltr_count_gen2(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + u32 ltr_count =3D inst->fw_caps[cap_id].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + + if (!ltr_count) + return -EINVAL; + + if (inst->hfi_rc_type =3D=3D HFI_RC_CBR_VFR || + inst->hfi_rc_type =3D=3D HFI_RC_CBR_CFR || + inst->hfi_rc_type =3D=3D HFI_RC_OFF) { + inst->fw_caps[LTR_COUNT].value =3D 0; + return -EINVAL; + } + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32, + <r_count, sizeof(u32)); +} + +int iris_set_use_and_mark_ltr(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + struct vb2_queue *sq =3D v4l2_m2m_get_src_vq(inst->m2m_ctx); + struct vb2_queue *dq =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); + u32 ltr_count =3D inst->fw_caps[LTR_COUNT].value; + u32 hfi_val =3D inst->fw_caps[cap_id].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + + if (!vb2_is_streaming(sq) && !vb2_is_streaming(dq)) + return -EINVAL; + + if (!ltr_count || hfi_val =3D=3D INVALID_DEFAULT_MARK_OR_USE_LTR) + return -EINVAL; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32, + &hfi_val, sizeof(u32)); +} + int iris_set_properties(struct iris_inst *inst, u32 plane) { const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index a0d5338bdc910bd30407132e8b700c333ad74e4c..996c83fdc6f492dc252771129fc= 1d62e8b7a7e07 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -36,6 +36,11 @@ int iris_set_rotation(struct iris_inst *inst, enum platf= orm_inst_fw_cap_type cap int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type c= ap_id); int iris_set_ir_period_gen1(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); int iris_set_ir_period_gen2(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); +int iris_set_ltr_count_gen1(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); +int iris_set_ltr_count_gen2(struct iris_inst *inst, enum platform_inst_fw_= cap_type cap_id); +int iris_set_use_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_typ= e cap_id); +int iris_set_mark_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_ty= pe cap_id); +int iris_set_use_and_mark_ltr(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_command.c index f30fbb803936cea030c2b5485801cbb7addef34d..74f9feacfe3562d44a8415de83f= b7a6c058a3d8c 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c @@ -695,6 +695,31 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_s= ession_set_property_pkt *p packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*intra_refresh); break; } + case HFI_PROPERTY_PARAM_VENC_LTRMODE: { + struct hfi_ltr_mode *in =3D pdata, *ltr_mode =3D prop_data; + + ltr_mode->mode =3D in->mode; + ltr_mode->count =3D in->count; + ltr_mode->trust_mode =3D in->trust_mode; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_mode); + break; + } + case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: { + struct hfi_ltr_use *in =3D pdata, *ltr_use =3D prop_data; + + ltr_use->frames =3D in->frames; + ltr_use->ref_ltr =3D in->ref_ltr; + ltr_use->use_constrnt =3D in->use_constrnt; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_use); + break; + } + case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: { + struct hfi_ltr_mark *in =3D pdata, *ltr_mark =3D prop_data; + + ltr_mark->mark_frame =3D in->mark_frame; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_mark); + break; + } default: return -EINVAL; } diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_defines.h index 04c79ee0463d7f32a2042044fe4564718cc01561..34249fc0d047918c2463517b830= 3e30df3666b97 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h @@ -147,8 +147,16 @@ #define HFI_INTRA_REFRESH_RANDOM 0x5 =20 #define HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH 0x200500d + +#define HFI_LTR_MODE_DISABLE 0x0 +#define HFI_LTR_MODE_MANUAL 0x1 +#define HFI_LTR_MODE_PERIODIC 0x2 + +#define HFI_PROPERTY_PARAM_VENC_LTRMODE 0x200501c #define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES 0x2005020 #define HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE 0x2006001 +#define HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME 0x2006009 +#define HFI_PROPERTY_CONFIG_VENC_USELTRFRAME 0x200600a #define HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER 0x2006008 =20 struct hfi_pkt_hdr { @@ -460,6 +468,22 @@ struct hfi_intra_refresh { u32 mbs; }; =20 +struct hfi_ltr_mode { + u32 mode; + u32 count; + u32 trust_mode; +}; + +struct hfi_ltr_use { + u32 ref_ltr; + u32 use_constrnt; + u32 frames; +}; + +struct hfi_ltr_mark { + u32 mark_frame; +}; + struct hfi_event_data { u32 error; u32 height; 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 cecf771c55dd36a13616344ff4583bf1d0544e17..aec19efc41a5ef47bbad2471d3c= 4575704859743 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h @@ -71,6 +71,9 @@ enum hfi_rate_control { #define HFI_PROP_MIN_QP_PACKED 0x0300012f #define HFI_PROP_MAX_QP_PACKED 0x03000130 #define HFI_PROP_IR_RANDOM_PERIOD 0x03000131 +#define HFI_PROP_LTR_COUNT 0x03000134 +#define HFI_PROP_LTR_MARK 0x03000135 +#define HFI_PROP_LTR_USE 0x03000136 #define HFI_PROP_TOTAL_BITRATE 0x0300013b #define HFI_PROP_MAX_GOP_FRAMES 0x03000146 #define HFI_PROP_MAX_B_FRAMES 0x03000147 diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 5a489917580eb10022fdcb52f7321a915e8b239d..544c65dea922ae693adeeba972f= 1418002fe3f92 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -29,6 +29,9 @@ struct iris_inst; #define MAX_QP_HEVC 63 #define DEFAULT_QP 20 #define BITRATE_DEFAULT 20000000 +#define INVALID_DEFAULT_MARK_OR_USE_LTR -1 +#define MAX_LTR_FRAME_COUNT_GEN1 4 +#define MAX_LTR_FRAME_COUNT_GEN2 2 =20 enum stage_type { STAGE_1 =3D 1, @@ -159,6 +162,9 @@ enum platform_inst_fw_cap_type { VFLIP, IR_TYPE, IR_PERIOD, + LTR_COUNT, + USE_LTR, + MARK_LTR, INST_FW_CAP_MAX, }; =20 diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/driver= s/media/platform/qcom/iris/iris_platform_gen1.c index a7595c302162b9fe758c61706895a709b3b4e852..42addeeda47a849dbab2758b11e= 948606479f25b 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c @@ -265,6 +265,36 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8250_enc[] =3D { .flags =3D CAP_FLAG_OUTPUT_PORT, .set =3D iris_set_ir_period_gen1, }, + { + .cap_id =3D LTR_COUNT, + .min =3D 0, + .max =3D MAX_LTR_FRAME_COUNT_GEN1, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROPERTY_PARAM_VENC_LTRMODE, + .flags =3D CAP_FLAG_OUTPUT_PORT, + .set =3D iris_set_ltr_count_gen1, + }, + { + .cap_id =3D USE_LTR, + .min =3D 0, + .max =3D ((1 << MAX_LTR_FRAME_COUNT_GEN1) - 1), + .step_or_mask =3D 0, + .value =3D 0, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_USELTRFRAME, + .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_use_ltr, + }, + { + .cap_id =3D MARK_LTR, + .min =3D 0, + .max =3D (MAX_LTR_FRAME_COUNT_GEN1 - 1), + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME, + .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_mark_ltr, + }, }; =20 static struct platform_inst_caps platform_inst_cap_sm8250 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/driver= s/media/platform/qcom/iris/iris_platform_gen2.c index 0de85c51cf745e9a121da14b1ad7bc761505c957..617879ec0fba39c0f8529d69ccf= 0bc7612445110 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c @@ -740,6 +740,36 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8550_enc[] =3D { CAP_FLAG_DYNAMIC_ALLOWED, .set =3D iris_set_ir_period_gen2, }, + { + .cap_id =3D LTR_COUNT, + .min =3D 0, + .max =3D MAX_LTR_FRAME_COUNT_GEN2, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROP_LTR_COUNT, + .flags =3D CAP_FLAG_OUTPUT_PORT, + .set =3D iris_set_ltr_count_gen2, + }, + { + .cap_id =3D USE_LTR, + .min =3D 0, + .max =3D ((1 << MAX_LTR_FRAME_COUNT_GEN2) - 1), + .step_or_mask =3D 0, + .value =3D 0, + .hfi_id =3D HFI_PROP_LTR_USE, + .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_use_and_mark_ltr, + }, + { + .cap_id =3D MARK_LTR, + .min =3D INVALID_DEFAULT_MARK_OR_USE_LTR, + .max =3D (MAX_LTR_FRAME_COUNT_GEN2 - 1), + .step_or_mask =3D 1, + .value =3D INVALID_DEFAULT_MARK_OR_USE_LTR, + .hfi_id =3D HFI_PROP_LTR_MARK, + .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_use_and_mark_ltr, + }, }; =20 static struct platform_inst_caps platform_inst_cap_sm8550 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/m= edia/platform/qcom/iris/iris_vpu_buffer.c index 9270422c16019ba658ee8813940cb9110ad030a1..891aed5091c7a0fd0bf1f1a3a77= 37d49e6d8cea2 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c @@ -934,6 +934,19 @@ static u32 iris_vpu_enc_bin_size(struct iris_inst *ins= t) num_vpp_pipes, inst->hfi_rc_type); } =20 +static inline u32 hfi_buffer_get_recon_count(struct iris_inst *inst) +{ + u32 num_ref =3D 1; + u32 ltr_count; + + ltr_count =3D inst->fw_caps[LTR_COUNT].value; + + if (ltr_count) + num_ref =3D num_ref + ltr_count; + + return num_ref; +} + static u32 iris_vpu_dec_partial_size(struct iris_inst *inst) { struct v4l2_format *f =3D inst->fmt_src; @@ -968,7 +981,7 @@ static u32 iris_vpu_enc_comv_size(struct iris_inst *ins= t) { u32 height =3D iris_vpu_enc_get_bitstream_height(inst); u32 width =3D iris_vpu_enc_get_bitstream_width(inst); - u32 num_recon =3D 1; + u32 num_recon =3D hfi_buffer_get_recon_count(inst); u32 lcu_size =3D 16; =20 if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) { @@ -1677,10 +1690,9 @@ static u32 iris_vpu_enc_scratch2_size(struct iris_in= st *inst) { u32 frame_height =3D iris_vpu_enc_get_bitstream_height(inst); u32 frame_width =3D iris_vpu_enc_get_bitstream_width(inst); - u32 num_ref =3D 1; + u32 num_ref =3D hfi_buffer_get_recon_count(inst); =20 - return hfi_buffer_scratch2_enc(frame_width, frame_height, num_ref, - false); + return hfi_buffer_scratch2_enc(frame_width, frame_height, num_ref, false); } =20 static u32 iris_vpu_enc_vpss_size(struct iris_inst *inst) --=20 2.43.0 From nobody Sun Feb 8 16:12:13 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 B2304329E76 for ; Fri, 6 Feb 2026 08:12:52 +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=1770365572; cv=none; b=EjKxhhW1irE9P3iBCBt1SulJeCVVpl4dalthV1fzTOHuezgCnKEDWYWEWiLzol5XrMx7EOO+nK5i4xhM6yZZ2YDBHq3RbL1jRxsYAjcjXfnqNq8S8X/k3ymQFc6GMScKDacM7vaEbzbyFw2+FpYrN7giq8VQIn4gUrgWbubnV9g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770365572; c=relaxed/simple; bh=iFs45nynpZOghqFuo9jLK6SG17R7NMwuI2dqh5glhlc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hoFEp9Zv1SOX32jjiYXohl4KLLRUHP/Nm0oIHd221jmHxPUONlbW9AzwGppQ11T49syP0DdjS5dGdegchU0uz4PSRzKKWSt1WDCZFkn/z2XquGngpf6VJYg/jG/jeCDBJ49o6w6lJOZCuyEYrYNDyXEwfv4ZA29k/34FiSbwXOM= 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=ku494ya8; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WwSLFMq8; 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="ku494ya8"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WwSLFMq8" 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 6161035R1631704 for ; Fri, 6 Feb 2026 08:12:52 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= SV7QnoYFt0OYeGaxtyyD1/N76oSB4w/4ECLI7E5XX9s=; b=ku494ya8ZM0fM9wS 8E5NsfpIPtVMPRk6cy3mD/IQHGOH1fJH3znwCYG66yE2lp2LG1uN8WOqpKxEsyD3 yIthS49e0kv4uhjgMD2T8AG1byfnoRbkICIM2JcKMeryxfzfwG2DM7LaAIeEFNd8 d78fGHDfyoPCPTW5d5St2JNVpQvNVDvINOG5be6rF8Cnf3uEfnToL7P7j/59cAuT BI9RGVcM+pP/2ZW+1IxDXjYlxr3b7QgoPtABzna+3VMkR3Unyste33LyzMOvDmDv OCSllo8vCw+VN6lixvLwXdRZPXRhPqNi6MoBgurGBS52NcaTOqT4PXqzz67dGDeI 6jy55Q== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c4tm8upr1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 08:12:51 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-824377115daso841213b3a.0 for ; Fri, 06 Feb 2026 00:12:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770365571; x=1770970371; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=SV7QnoYFt0OYeGaxtyyD1/N76oSB4w/4ECLI7E5XX9s=; b=WwSLFMq8HadsQqBSh0joL1x5CR4KhZNVH81cxTo5BPmBILpAkOXYrAI1Pqrh3bwREB DHRxMY9ihXL8wHQYlZFFsipfI2YbPcb1hjz1k6ljtZMrdiTrZhe3tCIqRciQ/nZbVpR4 HGL/R9/RNlpCKRw7KKQJJWOiHi7jjLRo3gZD0/KiIFwbrWourC0k5cUGzgQSMpgizZmm ccJFp+jSOdbz+qW+tDQMVdVluLuuKWmwSiUPGmiBLEZzuBHYOprjHDIq75Fn5ckYSD2N cWGJdTg2UMijT20EchzxvVhkDWT/bWtsx4z0gnwuKiXl/lKBxGqLoOdS6s2EI34+TxHq Dc5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770365571; x=1770970371; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=SV7QnoYFt0OYeGaxtyyD1/N76oSB4w/4ECLI7E5XX9s=; b=di5ED55V7UoHZX/WvcI6L29gHM9gGPjTZKFcnaQjJjv/luwoJrCe2YsGPc6FRXHFDG wha/jwzTDeYaDEeZpt1H7XciR4018kwuiBTyeb6cDE+Wm3m/It6kuhu5/Q2Ad5PPXpg5 v8VpBBCCfGVfDAYPNjN17akZdRasdzbGMYGfoiiSfR4Z5OQAwIcrDrN5tFqg/+Q8aplt O9KOAz5/h8hYsXQyNjWeVnlOn072eaXjHifJad7MaKglMhp0en9qwlgKf+k3iOIGGQdt tqaqTVkfmrlWe5MSPIpmQL0NfhVht0gWdgiBIZtV3B2jT0iM8/+6u9D9ZPMDbiMBoN4N UuXg== X-Forwarded-Encrypted: i=1; AJvYcCUufkmAFRzRo/vPWB0U4L1Vj3hvQVPs1pKnnzlmrfQ3klfIScVIm+V+XG1Jy+7qQgyMwf2srqIrIyBg1fg=@vger.kernel.org X-Gm-Message-State: AOJu0YzCJVumYnljxWAE9ftR/nt7ZN/buau+6bqyYYDmbIXXzx258kIU mkaLi7LXb4icHPSSuSFB31/eBSK00jR7Ug9eIS5//JCMoqdL6d9FyeQijwrT7QT7Td72PFX9lQL Ex7DmiGXycly919CyS+yU7y2EvRvzpQtenpnXACz6LVB0grkrkXELP8QjaNFfhZvXgLA= X-Gm-Gg: AZuq6aIT+ZgeR/RG062UZVgXVsDcJE+Xb3vNyhrLkkBhh3cHz1mekiLPIOqDph6w6NE G8Carq82cCdpGd0KOvGKatdjSop/mBIHc5ks+oV+jNTp8BZWPJCOnpnRJgt4OUVPFKgWrRM2fFL 9m5fmU9MvcbxaQlVOha30vDo/eXTmIieQxEBAmd1w/QeaTYndhJ65ez9EI63A+wK3HpWkKKKbgU 2SFaVS1moJLRZc84xrZAIWfEibLZKJ4pdQ9anLGR21yOl0g9/8MEkhjUTx0soob1fMelmBZFUuk NvglZLguGcDgA9GaUrJMX8KnapvEdP2VClrT4cAKLhGuUGn4xkaAa8bNj7fBopU8bqqAUU/iTng PLuijTSsVSLk4EWmr2i8dbXn0Bo8hZsdhuQDOx0JpIN3D0iDlnwYl1liyVdZCZ6aHwDHF7Wy8f5 EC3k1lfSyc X-Received: by 2002:a05:6a00:6c81:b0:81f:473e:e8d7 with SMTP id d2e1a72fcca58-8244176cb4fmr1857896b3a.54.1770365570568; Fri, 06 Feb 2026 00:12:50 -0800 (PST) X-Received: by 2002:a05:6a00:6c81:b0:81f:473e:e8d7 with SMTP id d2e1a72fcca58-8244176cb4fmr1857868b3a.54.1770365570075; Fri, 06 Feb 2026 00:12:50 -0800 (PST) Received: from WANGAOW-LAB01.ap.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82441884b75sm1671866b3a.39.2026.02.06.00.12.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 00:12:49 -0800 (PST) From: Wangao Wang Date: Fri, 06 Feb 2026 16:12:12 +0800 Subject: [PATCH v5 3/6] media: qcom: iris: Add B frames support for encoder 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: <20260206-batch2_iris_encoder_enhancements-v5-3-fb75ed8fa375@oss.qualcomm.com> References: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> In-Reply-To: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: quic_qiweil@quicinc.com, Renjiang Han , Wangao Wang , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1770365554; l=8832; i=wangao.wang@oss.qualcomm.com; s=20251021; h=from:subject:message-id; bh=iFs45nynpZOghqFuo9jLK6SG17R7NMwuI2dqh5glhlc=; b=PqQrTJLdvxBWO4jFxBtxbH3uxYyDidXaAUtWIzhINz25bOvtB6jtWlIivH9e92/ap70u2JcI9 2HIhRauAJKVAEL48iZrSodXJcC/cDtuGRzNLQuxTVX62+4m81rt/9yQ X-Developer-Key: i=wangao.wang@oss.qualcomm.com; a=ed25519; pk=bUPgYblBUAsoPyGfssbNR7ZXUSGF8v1VF4FJzSO6/aA= X-Authority-Analysis: v=2.4 cv=Vd76/Vp9 c=1 sm=1 tr=0 ts=6985a283 cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=EUspDBNiAAAA:8 a=KKAkSRfTAAAA:8 a=2_V6wWdUOSEACiTAc7sA:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDA1MiBTYWx0ZWRfXzlHx5jsrUMOi 97BhCO6bogd0HhibF7veKgDYcB1/YT2DI3H6dkEdXwiOYsKYFOYocuk+eekN+/lRoNQSHNUCXQa bKHX/QbIRKLUzV9YrQhOyPgQ9TKSw/DsAOojBmMZgcOYgbXdz7/KsDKavRoii7HbzDhiO0ietAJ TnZGazq82oy4lqxKQAbbEjSe79WtyGwHdF7YWrQMelWlM5RN2Nqhega6DFVxWqBbB1snI5tOTlP Jz8YCeDpUgWrC2YNLxxBI1lG7AXmbrZTfa8yKbsAcRtqr/xx9PcHvFcIByoE9AmDJpq6iXUV4F4 vEY6r936xY4QVJbsMwf6bnDIvH2T5AJHpSD+IKfbTNghCfgfW3m6GLMEsvUwS8DjhPm7SQUgDLU BW0NVQYtc/iuXq8IbdoolwwhRJO4tT6X2XIZaantvSV+hsUyRVWfYno0rKiidKr07/2tb6cMrw5 AT/XyMHkM5i+Gna3ARA== X-Proofpoint-ORIG-GUID: bqKvRFBYYz_dkvkV2JDlXgFqcyeRbTxj X-Proofpoint-GUID: bqKvRFBYYz_dkvkV2JDlXgFqcyeRbTxj X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-06_02,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 impostorscore=0 bulkscore=0 phishscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060052 Add support for B-frame configuration on both gen1 and gen2 encoders by enabling V4L2_CID_MPEG_VIDEO_B_FRAMES control. Reviewed-by: Dikshita Agarwal Tested-by: Neil Armstrong # on SM8650-HDK Signed-off-by: Wangao Wang --- drivers/media/platform/qcom/iris/iris_ctrls.c | 30 ++++++++++++++++++= ++++ drivers/media/platform/qcom/iris/iris_ctrls.h | 1 + .../platform/qcom/iris/iris_hfi_gen1_command.c | 8 ++++++ .../platform/qcom/iris/iris_hfi_gen1_defines.h | 10 ++++++++ .../platform/qcom/iris/iris_platform_common.h | 2 ++ .../media/platform/qcom/iris/iris_platform_gen1.c | 18 +++++++++++++ .../media/platform/qcom/iris/iris_platform_gen2.c | 10 ++++++++ drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 6 ++++- 8 files changed, 84 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index 9a9dec022b35e94c800fc13ec35bdbba520e7168..e049c28db1d8395736ae6970b5e= fbb351ce427dd 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -118,6 +118,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u= 32 id) return USE_LTR; case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX: return MARK_LTR; + case V4L2_CID_MPEG_VIDEO_B_FRAMES: + return B_FRAME; default: return INST_FW_CAP_MAX; } @@ -225,6 +227,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_t= ype cap_id) return V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES; case MARK_LTR: return V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX; + case B_FRAME: + return V4L2_CID_MPEG_VIDEO_B_FRAMES; default: return 0; } @@ -1161,6 +1165,32 @@ int iris_set_use_and_mark_ltr(struct iris_inst *inst= , enum platform_inst_fw_cap_ &hfi_val, sizeof(u32)); } =20 +int iris_set_intra_period(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + u32 gop_size =3D inst->fw_caps[GOP_SIZE].value; + u32 b_frame =3D inst->fw_caps[B_FRAME].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + struct hfi_intra_period intra_period; + + if (!gop_size || b_frame >=3D gop_size) + return -EINVAL; + + /* + * intra_period represents the length of a GOP, which includes both P-fra= mes + * and B-frames. The counts of P-frames and B-frames within a GOP must be + * communicated to the firmware. + */ + intra_period.pframes =3D (gop_size - 1) / (b_frame + 1); + intra_period.bframes =3D b_frame; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_STRUCTURE, + &intra_period, sizeof(intra_period)); +} + int iris_set_properties(struct iris_inst *inst, u32 plane) { const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index 996c83fdc6f492dc252771129fc1d62e8b7a7e07..609258c81517b71523b682ca994= 786cdd020b07f 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -41,6 +41,7 @@ int iris_set_ltr_count_gen2(struct iris_inst *inst, enum = platform_inst_fw_cap_ty int iris_set_use_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_typ= e cap_id); int iris_set_mark_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_ty= pe cap_id); int iris_set_use_and_mark_ltr(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); +int iris_set_intra_period(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_command.c index 74f9feacfe3562d44a8415de83fb7a6c058a3d8c..87871fed09ed753760b6057ad4a= fa87be5f91b69 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c @@ -720,6 +720,14 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_s= ession_set_property_pkt *p packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_mark); break; } + case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: { + struct hfi_intra_period *in =3D pdata, *intra_period =3D prop_data; + + intra_period->pframes =3D in->pframes; + intra_period->bframes =3D in->bframes; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*intra_period); + break; + } default: return -EINVAL; } diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_defines.h index 34249fc0d047918c2463517b8303e30df3666b97..4343661e86065f5623b2c02c7ee= 808a3c47a8c41 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h @@ -155,6 +155,7 @@ #define HFI_PROPERTY_PARAM_VENC_LTRMODE 0x200501c #define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES 0x2005020 #define HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE 0x2006001 +#define HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD 0x2006003 #define HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME 0x2006009 #define HFI_PROPERTY_CONFIG_VENC_USELTRFRAME 0x200600a #define HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER 0x2006008 @@ -484,6 +485,15 @@ struct hfi_ltr_mark { u32 mark_frame; }; =20 +struct hfi_max_num_b_frames { + u32 max_num_b_frames; +}; + +struct hfi_intra_period { + u32 pframes; + u32 bframes; +}; + struct hfi_event_data { u32 error; u32 height; diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 544c65dea922ae693adeeba972f1418002fe3f92..67acd98e467df037d49d2ea1830= 038c0c8fecbaf 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -165,6 +165,8 @@ enum platform_inst_fw_cap_type { LTR_COUNT, USE_LTR, MARK_LTR, + B_FRAME, + INTRA_PERIOD, INST_FW_CAP_MAX, }; =20 diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/driver= s/media/platform/qcom/iris/iris_platform_gen1.c index 42addeeda47a849dbab2758b11e948606479f25b..e9016609127b83b933a18e44250= fd43d25f05959 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c @@ -295,6 +295,24 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8250_enc[] =3D { .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, .set =3D iris_set_mark_ltr, }, + { + .cap_id =3D B_FRAME, + .min =3D 0, + .max =3D 3, + .step_or_mask =3D 1, + .value =3D 0, + .flags =3D CAP_FLAG_OUTPUT_PORT, + }, + { + .cap_id =3D INTRA_PERIOD, + .min =3D 0, + .max =3D 1, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD, + .flags =3D CAP_FLAG_OUTPUT_PORT, + .set =3D iris_set_intra_period, + }, }; =20 static struct platform_inst_caps platform_inst_cap_sm8250 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/driver= s/media/platform/qcom/iris/iris_platform_gen2.c index 617879ec0fba39c0f8529d69ccf0bc7612445110..a7ee63e5cbd8b476d765f29ecb3= a7d5d52fae269 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c @@ -770,6 +770,16 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8550_enc[] =3D { .flags =3D CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, .set =3D iris_set_use_and_mark_ltr, }, + { + .cap_id =3D B_FRAME, + .min =3D 0, + .max =3D 1, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROP_MAX_B_FRAMES, + .flags =3D CAP_FLAG_OUTPUT_PORT, + .set =3D iris_set_u32, + }, }; =20 static struct platform_inst_caps platform_inst_cap_sm8550 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/m= edia/platform/qcom/iris/iris_vpu_buffer.c index 891aed5091c7a0fd0bf1f1a3a7737d49e6d8cea2..0ed82dc2b8af8c789df1b8c10c1= a5afc51ef39d8 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c @@ -936,11 +936,15 @@ static u32 iris_vpu_enc_bin_size(struct iris_inst *in= st) =20 static inline u32 hfi_buffer_get_recon_count(struct iris_inst *inst) { + u32 bframe_count, ltr_count; u32 num_ref =3D 1; - u32 ltr_count; =20 + bframe_count =3D inst->fw_caps[B_FRAME].value; ltr_count =3D inst->fw_caps[LTR_COUNT].value; =20 + if (bframe_count) + num_ref =3D 2; + if (ltr_count) num_ref =3D num_ref + ltr_count; =20 --=20 2.43.0 From nobody Sun Feb 8 16:12:13 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 85D6B346FA0 for ; Fri, 6 Feb 2026 08:12:56 +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=1770365576; cv=none; b=ScCAInstQ32m0UdYPulFwuNd0ijXbW6KMxKtuG8bPkw8bVuN75w4Lu1dzBWBUAAmrwuR3orKscwwR9P9BZ8ZOUL4jVASFijKZpT4cCC+nZ6G4re+udly7SPkM5Is/7F021FW+DOJS+TjQ9EJi1A2WSBvQ0vb037/mNPzAjmpabY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770365576; c=relaxed/simple; bh=fqLCbubwJkO1NK1LuzFXSQq4v/aB+JtViJ+h1oYxVAU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fxrU09BLoe2/rlw8m8WOjCI8vcFU4mk1zZWctsqMAexV2/AknNb3BS6XP/EzoyjCUuDRLglGzt9KUOzE2kVxNYf8SYxLrtPHerVC91Dp/MxkWLaCjMO6zz+QxZXrBS4vZuXLvvJv6kSbrpFr/Oy4lW0gH7TCcEkFyapVHXnhzdI= 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=eI1ipJWT; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=UqZsrRBY; 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="eI1ipJWT"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="UqZsrRBY" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6167XfZm1852733 for ; Fri, 6 Feb 2026 08:12:55 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= kWmo14Qp+CCvuISRsrvsxFQir/qnnSerwtPJphTplns=; b=eI1ipJWTxdesqUK0 afPFqslds9Mcqk0hten8u0AooejrEdSf5zQmt7vD3iwCtJR58vWddqbY96s7G0i5 IMyJvo0sftDpArgIljyaRv48aYHmaHRApiwVEjMHdv8/O67oTq6xn41bxVXEthGt S0RGsV2oZtd/U4IApweW1HsS5YnKRuw1LVHVcOnyvMO/TmIE8/ekbhllFntnJ8ev h3XI4PZ7VxqBzrq0YRZC750tdECQgKfhi1chOL/vxdex9SaJ2V0B/2H9M/2OGNc7 WjWG5UN4LF1J1ruHjdYiqhmDAOcubJ+xfZo+SsMZ1Dy03OEcmklyrWl6y7c4otJ0 NxAEUw== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c5c1483pr-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 08:12:55 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-8243a06b397so682077b3a.0 for ; Fri, 06 Feb 2026 00:12:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770365574; x=1770970374; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=kWmo14Qp+CCvuISRsrvsxFQir/qnnSerwtPJphTplns=; b=UqZsrRBYvHRmCpTnpq852k9JZncY2UWo5xbkaT0JXklo2fEIoLJkFyjhWhkGrOtGae vIceyAk19gjxaoIbVTSfmech1Y3wm4BSmyf/O+oslZpZLA7bZ9hqQKslH2lrPq5+Ixmy 19tZ7yCGuXYNYqa540qyQeT46uyIWiyl5N4tt0fVOiQThGLjgbMhnqs6H+gv4ZdZaVoJ 7CqYHqmjbyW+FxHjsmIdfAj11VHy1r1o9UGCyGRKjJ8lamvWx2Sq57uah+cybK0Y38+V zX5yynnqDgyoks88VjHS9pdaXXmC6UUVh+wOLiCY3tDtVfy3DLSX/REv6Yp9b4jTgGJ7 VpLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770365574; x=1770970374; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=kWmo14Qp+CCvuISRsrvsxFQir/qnnSerwtPJphTplns=; b=ktmQgg1YUm4biVyWGuplkx8xXeHv89xacG4WRNANIrC++rNK27MY26TgQLRrJHdqyA uhnljHxaPSgC+ThmaGubQUNzcKIWh2gdyWYqp12B+etlmHr4nu3F0EoG9AJbqbu2ZSiF LRd/3xB12qiT7tbAt/i27iCRA03Ct8fw59cBw5Xs+AiJBMzKWeR5wBMFoxye1sLo7s60 Vxsmda9eO8KebrkkIEtpHmmxRSvqknZ7INKsZNYgB5s9KGhOvjK8g58luFVUKqRJJRj+ 8M41wpgeWtRoYTbuDMTdiSLZ/5b2Fubh2/FA8E/nJtXRg6+jlnKdqtT1aOhzQ/M+MpgA QRAA== X-Forwarded-Encrypted: i=1; AJvYcCXSYz+arVSkfVOF6Ed7PYXbZFtL0vfWlfg9kXNPD7IStonUIegJSRoaaBhu4zoNAc1EWISSGiG7RhRbhNQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwXCb5EyEVZybktfTSB9ApItzuT8OfDWCbxwF294d4K3vqGVkKc 39c+3DIffjRB5JbyalPayPEpyxnggl1EGtyEJ8q8fXrxuC8nYFFL+9PUpCTr8zXeN8mvudOMz4N ievQtvH3a8f0lKh6i7NVzuXa6WqW75q1VMHa7diXZ4wiM8n/hqtZhUUkZzJ6mf34yVLM= X-Gm-Gg: AZuq6aKtjD+f7fNvEMA8vOHg+HYYVqUe5cgldFHR8aWSsw6ZafqvFK1ve4GDh+iQVJD 0FFzX0Dmnhxz0AZBczRFuHjGPo39Bq4AxXGvugshxO1Eu5fyhevKZcksDnXFc5mabHHO63wVtGk p73z7EP0v8ROYnQX4p0KuCbaLzG5byI0yTkiKEFek10HIRNM8yDGglrLu0lcfKxOVYkkOMMWDGX l5EVRpV/bFAIcghD42m8XDLoqmDURB2y8Tks4+4/akztBA3dKGPwmIgEhosgUbiljAXZd+9OoR1 f7kZ+oiODUBvkY7NyVBd279BALLRyG695Vl1atQHSnvrmynwicnhD4svaSwyaIKpZtAvxtOWG19 WZyC9LeZokuDAXxhGKXtOI4C0BxppkgXZSrTrvYlV0RqlOk23k7EUQDkpn3b6I9sc7aKQm7LAC5 T7eTW7tp/S X-Received: by 2002:a05:6a00:10cf:b0:81f:5198:ba3a with SMTP id d2e1a72fcca58-824416394d3mr1697248b3a.19.1770365574269; Fri, 06 Feb 2026 00:12:54 -0800 (PST) X-Received: by 2002:a05:6a00:10cf:b0:81f:5198:ba3a with SMTP id d2e1a72fcca58-824416394d3mr1697229b3a.19.1770365573685; Fri, 06 Feb 2026 00:12:53 -0800 (PST) Received: from WANGAOW-LAB01.ap.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82441884b75sm1671866b3a.39.2026.02.06.00.12.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 00:12:53 -0800 (PST) From: Wangao Wang Date: Fri, 06 Feb 2026 16:12:13 +0800 Subject: [PATCH v5 4/6] media: qcom: iris: Add hierarchical coding support for encoder 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: <20260206-batch2_iris_encoder_enhancements-v5-4-fb75ed8fa375@oss.qualcomm.com> References: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> In-Reply-To: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: quic_qiweil@quicinc.com, Renjiang Han , Wangao Wang , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1770365554; l=31570; i=wangao.wang@oss.qualcomm.com; s=20251021; h=from:subject:message-id; bh=fqLCbubwJkO1NK1LuzFXSQq4v/aB+JtViJ+h1oYxVAU=; b=lTG5wW1hb6YWWRSsw95973GWU7p06zzokCLzkzE/v9Z6Oe6SdNje/Popvc8f1M57GDDklEunu NJb1TGtyFwpD7TbMHvHWZmRq3QniKvXRFvvAu6+Cdk3JCGGZSFRhhcx X-Developer-Key: i=wangao.wang@oss.qualcomm.com; a=ed25519; pk=bUPgYblBUAsoPyGfssbNR7ZXUSGF8v1VF4FJzSO6/aA= X-Authority-Analysis: v=2.4 cv=P5k3RyAu c=1 sm=1 tr=0 ts=6985a287 cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=EUspDBNiAAAA:8 a=pEw79mLSGxr9eRpYBYUA:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDA1MiBTYWx0ZWRfX10Og2rylIY4B 0UqikyPcLwXDEC3O0v3JblkY/fXcCUmVfwqsUt0mgkcZ5sXPhqi4vntrDATmDOOLML5ZVS23pN3 QrTHxOb6Bq+ui90tGu6DrULpTNQqek3Hdj1GtlTh/FWZ8otAYHEeDXKQNwNLtRF3moaVgI8xmrT /3eP4zsUeycnll2zindr2k7jUh26bHBKUOUdESahhpfCMgzsWddGNGb6Nj/uFavhhGb4QM8pljx 1IZdJGMJyeflOXInEGVyFf9fvfqD+X0Wv6H63a5p4CWMAfM/6WuYRsj/ZjTRQmz1rim1VtKlWVb tE8n7NJvx9jBmp9Oo1aVOpJjHgbzKU35fIISTRftJh3nDmnRZb23uFicr6sPEWVwIRAJFlbeuZz O8FyjOK9arQEYfrZ4vrh09278P1PHjjnE+DW47lpx6AtJlgsF/5zhXJ9H9UgFFfSq5H4CPyFhex 9K7Ji7vKfYj8fLg0BJA== X-Proofpoint-ORIG-GUID: kSMHPtr26Y5LbLINI-XKje9JDPiQM6uE X-Proofpoint-GUID: kSMHPtr26Y5LbLINI-XKje9JDPiQM6uE X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-06_02,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 priorityscore=1501 phishscore=0 suspectscore=0 malwarescore=0 adultscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060052 Add hierarchical coding support for both gen1 and gen2 encoders by enabling the following V4L2 controls: H264: V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE, V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER HEVC(gen2 only): V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE, V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER Signed-off-by: Wangao Wang --- drivers/media/platform/qcom/iris/iris_ctrls.c | 288 +++++++++++++++++= +++- drivers/media/platform/qcom/iris/iris_ctrls.h | 7 +- .../platform/qcom/iris/iris_hfi_gen1_command.c | 21 +- .../platform/qcom/iris/iris_hfi_gen1_defines.h | 2 + .../platform/qcom/iris/iris_hfi_gen2_defines.h | 15 ++ drivers/media/platform/qcom/iris/iris_instance.h | 4 + .../platform/qcom/iris/iris_platform_common.h | 23 ++ .../media/platform/qcom/iris/iris_platform_gen1.c | 94 ++++++- .../media/platform/qcom/iris/iris_platform_gen2.c | 184 ++++++++++++- drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 28 ++ 10 files changed, 658 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/= platform/qcom/iris/iris_ctrls.c index e049c28db1d8395736ae6970b5efbb351ce427dd..2ae0d1aa11f8a529b8916ae0ac9= 6e3298e250355 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.c +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c @@ -120,6 +120,40 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(= u32 id) return MARK_LTR; case V4L2_CID_MPEG_VIDEO_B_FRAMES: return B_FRAME; + case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING: + return LAYER_ENABLE; + case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE: + return LAYER_TYPE_H264; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE: + return LAYER_TYPE_HEVC; + case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER: + return LAYER_COUNT_H264; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER: + return LAYER_COUNT_HEVC; + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR: + return LAYER0_BITRATE_H264; + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR: + return LAYER1_BITRATE_H264; + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR: + return LAYER2_BITRATE_H264; + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR: + return LAYER3_BITRATE_H264; + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR: + return LAYER4_BITRATE_H264; + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR: + return LAYER5_BITRATE_H264; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR: + return LAYER0_BITRATE_HEVC; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR: + return LAYER1_BITRATE_HEVC; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR: + return LAYER2_BITRATE_HEVC; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR: + return LAYER3_BITRATE_HEVC; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR: + return LAYER4_BITRATE_HEVC; + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR: + return LAYER5_BITRATE_HEVC; default: return INST_FW_CAP_MAX; } @@ -229,6 +263,40 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_= type cap_id) return V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX; case B_FRAME: return V4L2_CID_MPEG_VIDEO_B_FRAMES; + case LAYER_ENABLE: + return V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING; + case LAYER_TYPE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE; + case LAYER_TYPE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE; + case LAYER_COUNT_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER; + case LAYER_COUNT_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER; + case LAYER0_BITRATE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR; + case LAYER1_BITRATE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR; + case LAYER2_BITRATE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR; + case LAYER3_BITRATE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR; + case LAYER4_BITRATE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR; + case LAYER5_BITRATE_H264: + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR; + case LAYER0_BITRATE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR; + case LAYER1_BITRATE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR; + case LAYER2_BITRATE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR; + case LAYER3_BITRATE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR; + case LAYER4_BITRATE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR; + case LAYER5_BITRATE_HEVC: + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR; default: return 0; } @@ -575,7 +643,64 @@ int iris_set_header_mode_gen2(struct iris_inst *inst, = enum platform_inst_fw_cap_ &hfi_val, sizeof(u32)); } =20 -int iris_set_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_typ= e cap_id) +int iris_set_bitrate_gen1(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + u32 entropy_mode =3D inst->fw_caps[ENTROPY_MODE].value; + u32 bitrate =3D inst->fw_caps[cap_id].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + struct hfi_bitrate hfi_val; + u32 max_bitrate; + + if (!(inst->fw_caps[cap_id].flags & CAP_FLAG_CLIENT_SET) && cap_id !=3D B= ITRATE) + return -EINVAL; + + if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) { + max_bitrate =3D CABAC_MAX_BITRATE; + } else { + if (entropy_mode =3D=3D V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC) + max_bitrate =3D CABAC_MAX_BITRATE; + else + max_bitrate =3D CAVLC_MAX_BITRATE; + } + + hfi_val.bitrate =3D min(bitrate, max_bitrate); + + switch (cap_id) { + case BITRATE: + case LAYER0_BITRATE_H264: + hfi_val.layer_id =3D 0; + break; + case LAYER1_BITRATE_H264: + hfi_val.layer_id =3D 1; + break; + case LAYER2_BITRATE_H264: + hfi_val.layer_id =3D 2; + break; + case LAYER3_BITRATE_H264: + hfi_val.layer_id =3D 3; + break; + case LAYER4_BITRATE_H264: + hfi_val.layer_id =3D 4; + break; + case LAYER5_BITRATE_H264: + hfi_val.layer_id =3D 5; + break; + default: + return -EINVAL; + } + + if (hfi_val.layer_id > 0 && !inst->fw_caps[LAYER_ENABLE].value) + return -EINVAL; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_STRUCTURE, + &hfi_val, sizeof(hfi_val)); +} + +int iris_set_bitrate_gen2(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id) { const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; u32 entropy_mode =3D inst->fw_caps[ENTROPY_MODE].value; @@ -1191,6 +1316,167 @@ int iris_set_intra_period(struct iris_inst *inst, e= num platform_inst_fw_cap_type &intra_period, sizeof(intra_period)); } =20 +int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_= type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + u32 layer_enable =3D inst->fw_caps[LAYER_ENABLE].value; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + u32 layer_type; + + if (inst->hfi_rc_type =3D=3D HFI_RATE_CONTROL_CQ || + inst->hfi_rc_type =3D=3D HFI_RATE_CONTROL_OFF) + return -EINVAL; + + if (inst->codec =3D=3D V4L2_PIX_FMT_H264) { + if (!layer_enable || !inst->fw_caps[LAYER_COUNT_H264].value) + return -EINVAL; + + if (inst->fw_caps[LAYER_TYPE_H264].value =3D=3D + V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P) { + if (inst->hfi_rc_type =3D=3D HFI_RC_VBR_CFR) + layer_type =3D HFI_HIER_P_HYBRID_LTR; + else + layer_type =3D HFI_HIER_P_SLIDING_WINDOW; + } else if (inst->fw_caps[LAYER_TYPE_H264].value =3D=3D + V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B) { + if (inst->hfi_rc_type =3D=3D HFI_RC_VBR_CFR) + layer_type =3D HFI_HIER_B; + else + return -EINVAL; + } else { + return -EINVAL; + } + } else if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) { + if (!inst->fw_caps[LAYER_COUNT_HEVC].value) + return -EINVAL; + + if (inst->fw_caps[LAYER_TYPE_HEVC].value =3D=3D + V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P) { + layer_type =3D HFI_HIER_P_SLIDING_WINDOW; + } else if (inst->fw_caps[LAYER_TYPE_HEVC].value =3D=3D + V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B) { + if (inst->hfi_rc_type =3D=3D HFI_RC_VBR_CFR) + layer_type =3D HFI_HIER_B; + else + return -EINVAL; + } else { + return -EINVAL; + } + } else { + return -EINVAL; + } + + inst->hfi_layer_type =3D layer_type; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32_ENUM, + &layer_type, sizeof(u32)); +} + +int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + struct vb2_queue *sq =3D v4l2_m2m_get_src_vq(inst->m2m_ctx); + struct vb2_queue *dq =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); + u32 layer_enable =3D inst->fw_caps[LAYER_ENABLE].value; + u32 layer_count =3D inst->fw_caps[cap_id].value; + u32 hfi_id, ret; + + if (!layer_enable || !layer_count) + return -EINVAL; + + inst->hfi_layer_count =3D layer_count; + + if (!vb2_is_streaming(sq) && !vb2_is_streaming(dq)) { + hfi_id =3D HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER; + ret =3D hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32, + &layer_count, sizeof(u32)); + if (ret) + return ret; + } + + hfi_id =3D inst->fw_caps[cap_id].hfi_id; + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32, + &layer_count, sizeof(u32)); +} + +int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + u32 layer_type =3D inst->hfi_layer_type; + u32 layer_count, layer_count_max; + + layer_count =3D (inst->codec =3D=3D V4L2_PIX_FMT_H264) ? + inst->fw_caps[LAYER_COUNT_H264].value : + inst->fw_caps[LAYER_COUNT_HEVC].value; + + if (!layer_count) + return -EINVAL; + + if (layer_type =3D=3D HFI_HIER_B) { + layer_count_max =3D MAX_LAYER_HB; + } else if (layer_type =3D=3D HFI_HIER_P_HYBRID_LTR) { + layer_count_max =3D MAX_AVC_LAYER_HP_HYBRID_LTR; + } else if (layer_type =3D=3D HFI_HIER_P_SLIDING_WINDOW) { + if (inst->codec =3D=3D V4L2_PIX_FMT_H264) { + layer_count_max =3D MAX_AVC_LAYER_HP_SLIDING_WINDOW; + } else { + if (inst->hfi_rc_type =3D=3D HFI_RC_VBR_CFR) + layer_count_max =3D MAX_HEVC_VBR_LAYER_HP_SLIDING_WINDOW; + else + layer_count_max =3D MAX_HEVC_LAYER_HP_SLIDING_WINDOW; + } + } else { + return -EINVAL; + } + + if (layer_count > layer_count_max) + layer_count =3D layer_count_max; + + layer_count +=3D 1; /* base layer */ + inst->hfi_layer_count =3D layer_count; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32, + &layer_count, sizeof(u32)); +} + +int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_c= ap_type cap_id) +{ + const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; + struct vb2_queue *sq =3D v4l2_m2m_get_src_vq(inst->m2m_ctx); + struct vb2_queue *dq =3D v4l2_m2m_get_dst_vq(inst->m2m_ctx); + u32 hfi_id =3D inst->fw_caps[cap_id].hfi_id; + u32 bitrate =3D inst->fw_caps[cap_id].value; + + /* ignore layer bitrate when total bitrate is set */ + if (inst->fw_caps[BITRATE].flags & CAP_FLAG_CLIENT_SET) + return 0; + + if (!(inst->fw_caps[cap_id].flags & CAP_FLAG_CLIENT_SET)) + return -EINVAL; + + if (!vb2_is_streaming(sq) && !vb2_is_streaming(dq)) + return -EINVAL; + + return hfi_ops->session_set_property(inst, hfi_id, + HFI_HOST_FLAGS_NONE, + iris_get_port_info(inst, cap_id), + HFI_PAYLOAD_U32, + &bitrate, sizeof(u32)); +} + int iris_set_properties(struct iris_inst *inst, u32 plane) { const struct iris_hfi_command_ops *hfi_ops =3D inst->core->hfi_ops; diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/= platform/qcom/iris/iris_ctrls.h index 609258c81517b71523b682ca994786cdd020b07f..3c462ec9190be8935176b290588= f224fe4f144a4 100644 --- a/drivers/media/platform/qcom/iris/iris_ctrls.h +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h @@ -22,7 +22,8 @@ int iris_set_level(struct iris_inst *inst, enum platform_= inst_fw_cap_type cap_id int iris_set_profile_level_gen1(struct iris_inst *inst, enum platform_inst= _fw_cap_type cap_id); int iris_set_header_mode_gen1(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); int iris_set_header_mode_gen2(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); -int iris_set_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_typ= e cap_id); +int iris_set_bitrate_gen1(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id); +int iris_set_bitrate_gen2(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id); int iris_set_peak_bitrate(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id); int iris_set_bitrate_mode_gen1(struct iris_inst *inst, enum platform_inst_= fw_cap_type cap_id); int iris_set_bitrate_mode_gen2(struct iris_inst *inst, enum platform_inst_= fw_cap_type cap_id); @@ -42,6 +43,10 @@ int iris_set_use_ltr(struct iris_inst *inst, enum platfo= rm_inst_fw_cap_type cap_ int iris_set_mark_ltr(struct iris_inst *inst, enum platform_inst_fw_cap_ty= pe cap_id); int iris_set_use_and_mark_ltr(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); int iris_set_intra_period(struct iris_inst *inst, enum platform_inst_fw_ca= p_type cap_id); +int iris_set_layer_type(struct iris_inst *inst, enum platform_inst_fw_cap_= type cap_id); +int iris_set_layer_count_gen1(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); +int iris_set_layer_count_gen2(struct iris_inst *inst, enum platform_inst_f= w_cap_type cap_id); +int iris_set_layer_bitrate(struct iris_inst *inst, enum platform_inst_fw_c= ap_type cap_id); int iris_set_properties(struct iris_inst *inst, u32 plane); =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_command.c index 87871fed09ed753760b6057ad4afa87be5f91b69..39fc728646d3808c50481ccdfa1= 5ef0dfab05576 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c @@ -604,11 +604,10 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_= session_set_property_pkt *p break; } case HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE: { - struct hfi_bitrate *brate =3D prop_data; - u32 *in =3D pdata; + struct hfi_bitrate *in =3D pdata, *brate =3D prop_data; =20 - brate->bitrate =3D *in; - brate->layer_id =3D 0; + brate->bitrate =3D in->bitrate; + brate->layer_id =3D in->layer_id; packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*brate); break; } @@ -728,6 +727,20 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_s= ession_set_property_pkt *p packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*intra_period); break; } + case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: { + u32 *in =3D pdata; + + packet->data[1] =3D *in; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(u32); + break; + } + case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: { + u32 *in =3D pdata; + + packet->data[1] =3D *in; + packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(u32); + break; + } default: return -EINVAL; } diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_defines.h index 4343661e86065f5623b2c02c7ee808a3c47a8c41..0e4dee19238464a9671a94eaab8= eeda2d7f7ca9f 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_defines.h @@ -154,11 +154,13 @@ =20 #define HFI_PROPERTY_PARAM_VENC_LTRMODE 0x200501c #define HFI_PROPERTY_PARAM_VENC_MAX_NUM_B_FRAMES 0x2005020 +#define HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER 0x2005026 #define HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE 0x2006001 #define HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD 0x2006003 #define HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME 0x2006009 #define HFI_PROPERTY_CONFIG_VENC_USELTRFRAME 0x200600a #define HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER 0x2006008 +#define HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER 0x200600b =20 struct hfi_pkt_hdr { u32 size; 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 aec19efc41a5ef47bbad2471d3c4575704859743..d09096a9d5f934acf072b05c2cf= 80f3007c3aa7e 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h @@ -74,7 +74,22 @@ enum hfi_rate_control { #define HFI_PROP_LTR_COUNT 0x03000134 #define HFI_PROP_LTR_MARK 0x03000135 #define HFI_PROP_LTR_USE 0x03000136 + +enum hfi_layer_encoding_type { + HFI_HIER_P_SLIDING_WINDOW =3D 0x1, + HFI_HIER_P_HYBRID_LTR =3D 0x2, + HFI_HIER_B =3D 0x3, +}; + +#define HFI_PROP_LAYER_ENCODING_TYPE 0x03000138 +#define HFI_PROP_LAYER_COUNT 0x03000139 #define HFI_PROP_TOTAL_BITRATE 0x0300013b +#define HFI_PROP_BITRATE_LAYER1 0x0300013c +#define HFI_PROP_BITRATE_LAYER2 0x0300013d +#define HFI_PROP_BITRATE_LAYER3 0x0300013e +#define HFI_PROP_BITRATE_LAYER4 0x0300013f +#define HFI_PROP_BITRATE_LAYER5 0x03000140 +#define HFI_PROP_BITRATE_LAYER6 0x03000141 #define HFI_PROP_MAX_GOP_FRAMES 0x03000146 #define HFI_PROP_MAX_B_FRAMES 0x03000147 #define HFI_PROP_QUALITY_MODE 0x03000148 diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/med= ia/platform/qcom/iris/iris_instance.h index 16965150f427b901778dd5decf10a1379450b2f4..84b939f390d940c01db4b1c5627= 0a123cabca2e3 100644 --- a/drivers/media/platform/qcom/iris/iris_instance.h +++ b/drivers/media/platform/qcom/iris/iris_instance.h @@ -74,6 +74,8 @@ struct iris_fmt { * @enc_raw_height: source image height for encoder instance * @enc_scale_width: scale width for encoder instance * @enc_scale_height: scale height for encoder instance + * @hfi_layer_type: hierarchical coding layer type + * @hfi_layer_count: hierarchical coding layer count */ =20 struct iris_inst { @@ -116,6 +118,8 @@ struct iris_inst { u32 enc_raw_height; u32 enc_scale_width; u32 enc_scale_height; + u32 hfi_layer_type; + u32 hfi_layer_count; }; =20 #endif diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 67acd98e467df037d49d2ea1830038c0c8fecbaf..3efe3121459c610af55ad2f930b= 21c376f0a085b 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -32,6 +32,12 @@ struct iris_inst; #define INVALID_DEFAULT_MARK_OR_USE_LTR -1 #define MAX_LTR_FRAME_COUNT_GEN1 4 #define MAX_LTR_FRAME_COUNT_GEN2 2 +#define MAX_LAYER_HB 3 +#define MAX_AVC_LAYER_HP_HYBRID_LTR 5 +#define MAX_AVC_LAYER_HP_SLIDING_WINDOW 3 +#define MAX_HEVC_LAYER_HP_SLIDING_WINDOW 3 +#define MAX_HEVC_VBR_LAYER_HP_SLIDING_WINDOW 5 +#define MAX_HIER_CODING_LAYER_GEN1 6 =20 enum stage_type { STAGE_1 =3D 1, @@ -167,6 +173,23 @@ enum platform_inst_fw_cap_type { MARK_LTR, B_FRAME, INTRA_PERIOD, + LAYER_ENABLE, + LAYER_TYPE_H264, + LAYER_TYPE_HEVC, + LAYER_COUNT_H264, + LAYER_COUNT_HEVC, + LAYER0_BITRATE_H264, + LAYER1_BITRATE_H264, + LAYER2_BITRATE_H264, + LAYER3_BITRATE_H264, + LAYER4_BITRATE_H264, + LAYER5_BITRATE_H264, + LAYER0_BITRATE_HEVC, + LAYER1_BITRATE_HEVC, + LAYER2_BITRATE_HEVC, + LAYER3_BITRATE_HEVC, + LAYER4_BITRATE_HEVC, + LAYER5_BITRATE_HEVC, INST_FW_CAP_MAX, }; =20 diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen1.c b/driver= s/media/platform/qcom/iris/iris_platform_gen1.c index e9016609127b83b933a18e44250fd43d25f05959..65156584326a1a83588e8055f13= 18ba1b62e6510 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen1.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen1.c @@ -158,7 +158,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm= 8250_enc[] =3D { .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, - .set =3D iris_set_bitrate, + .set =3D iris_set_bitrate_gen1, }, { .cap_id =3D BITRATE_MODE, @@ -313,6 +313,98 @@ static const struct platform_inst_fw_cap inst_fw_cap_s= m8250_enc[] =3D { .flags =3D CAP_FLAG_OUTPUT_PORT, .set =3D iris_set_intra_period, }, + { + .cap_id =3D LAYER_ENABLE, + .min =3D 0, + .max =3D 1, + .step_or_mask =3D 1, + .value =3D 0, + .flags =3D CAP_FLAG_OUTPUT_PORT, + }, + { + .cap_id =3D LAYER_TYPE_H264, + .min =3D V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, + .max =3D V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, + .step_or_mask =3D BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P), + .value =3D V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + }, + { + .cap_id =3D LAYER_COUNT_H264, + .min =3D 0, + .max =3D MAX_HIER_CODING_LAYER_GEN1, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER, + .flags =3D CAP_FLAG_OUTPUT_PORT, + .set =3D iris_set_layer_count_gen1, + }, + { + .cap_id =3D LAYER0_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_bitrate_gen1, + }, + { + .cap_id =3D LAYER1_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_bitrate_gen1, + }, + { + .cap_id =3D LAYER2_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_bitrate_gen1, + }, + { + .cap_id =3D LAYER3_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_bitrate_gen1, + }, + { + .cap_id =3D LAYER4_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_bitrate_gen1, + }, + { + .cap_id =3D LAYER5_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_bitrate_gen1, + }, }; =20 static struct platform_inst_caps platform_inst_cap_sm8250 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/driver= s/media/platform/qcom/iris/iris_platform_gen2.c index a7ee63e5cbd8b476d765f29ecb3a7d5d52fae269..f87c713e1153388d5724a5a2add= 48022367d8737 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c @@ -416,7 +416,7 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm= 8550_enc[] =3D { .hfi_id =3D HFI_PROP_TOTAL_BITRATE, .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, - .set =3D iris_set_bitrate, + .set =3D iris_set_bitrate_gen2, }, { .cap_id =3D BITRATE_PEAK, @@ -780,6 +780,188 @@ static const struct platform_inst_fw_cap inst_fw_cap_= sm8550_enc[] =3D { .flags =3D CAP_FLAG_OUTPUT_PORT, .set =3D iris_set_u32, }, + { + .cap_id =3D LAYER_ENABLE, + .min =3D 0, + .max =3D 1, + .step_or_mask =3D 1, + .value =3D 0, + .flags =3D CAP_FLAG_OUTPUT_PORT, + }, + { + .cap_id =3D LAYER_TYPE_H264, + .min =3D V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B, + .max =3D V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, + .step_or_mask =3D BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B) | + BIT(V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P), + .value =3D V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P, + .hfi_id =3D HFI_PROP_LAYER_ENCODING_TYPE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + .set =3D iris_set_layer_type, + }, + { + .cap_id =3D LAYER_TYPE_HEVC, + .min =3D V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B, + .max =3D V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P, + .step_or_mask =3D BIT(V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B) | + BIT(V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P), + .value =3D V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P, + .hfi_id =3D HFI_PROP_LAYER_ENCODING_TYPE, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + .set =3D iris_set_layer_type, + }, + { + .cap_id =3D LAYER_COUNT_H264, + .min =3D 0, + .max =3D 5, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROP_LAYER_COUNT, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_count_gen2, + }, + { + .cap_id =3D LAYER_COUNT_HEVC, + .min =3D 0, + .max =3D 5, + .step_or_mask =3D 1, + .value =3D 0, + .hfi_id =3D HFI_PROP_LAYER_COUNT, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_count_gen2, + }, + { + .cap_id =3D LAYER0_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER1, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER1_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER2, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER2_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER3, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER3_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER4, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER4_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER5, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER5_BITRATE_H264, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER6, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER0_BITRATE_HEVC, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER1, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER1_BITRATE_HEVC, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER2, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER2_BITRATE_HEVC, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER3, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER3_BITRATE_HEVC, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER4, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER4_BITRATE_HEVC, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER5, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + }, + { + .cap_id =3D LAYER5_BITRATE_HEVC, + .min =3D 1, + .max =3D BITRATE_MAX, + .step_or_mask =3D 1, + .value =3D BITRATE_DEFAULT, + .hfi_id =3D HFI_PROP_BITRATE_LAYER6, + .flags =3D CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + .set =3D iris_set_layer_bitrate, + } }; =20 static struct platform_inst_caps platform_inst_cap_sm8550 =3D { diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/m= edia/platform/qcom/iris/iris_vpu_buffer.c index 0ed82dc2b8af8c789df1b8c10c1a5afc51ef39d8..c2cd4adc082394a9ab6f32a37fe= 4e57678019d89 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c @@ -936,6 +936,8 @@ static u32 iris_vpu_enc_bin_size(struct iris_inst *inst) =20 static inline u32 hfi_buffer_get_recon_count(struct iris_inst *inst) { + u32 layer_count =3D inst->hfi_layer_count; + u32 layer_type =3D inst->hfi_layer_type; u32 bframe_count, ltr_count; u32 num_ref =3D 1; =20 @@ -945,9 +947,35 @@ static inline u32 hfi_buffer_get_recon_count(struct ir= is_inst *inst) if (bframe_count) num_ref =3D 2; =20 + /* The shift operation here is rounding logic, similar to [(x+1)/2]. */ + if (layer_type =3D=3D HFI_HIER_P_HYBRID_LTR) + num_ref =3D (layer_count + 1) >> 1; + + if (layer_type =3D=3D HFI_HIER_P_SLIDING_WINDOW) { + if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) + num_ref =3D (layer_count + 1) >> 1; + else if (inst->codec =3D=3D V4L2_PIX_FMT_H264 && layer_count < 4) + num_ref =3D (layer_count - 1); + else + num_ref =3D layer_count; + } + if (ltr_count) num_ref =3D num_ref + ltr_count; =20 + /* + * The expression (1 << layers - 2) + 1 accounts for the number of refere= nce + * frames in the Adaptive Hierarchical B-frame encoding case. In this sch= eme, + * the number of frames in a sub-GOP is related to (2^(number of layers) = - 1), + * hence the use of the shift operation. + */ + if (layer_type =3D=3D HFI_HIER_B) { + if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) + num_ref =3D layer_count; + else + num_ref =3D (1 << (layer_count - 2)) + 1; + } + return num_ref; } =20 --=20 2.43.0 From nobody Sun Feb 8 16:12:13 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 5F064329E76 for ; Fri, 6 Feb 2026 08:12:59 +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=1770365579; cv=none; b=OpcPbwgy8XLgAcrqB9iN1kWtYcRpfKddaSEOfJ2VyPW0xi0z2LC2YjTtOqa1WrYdN9BKyT3V5lnlwFch6ZpagjrLnPZlo8leTth7O7/X6eeBOtnj79P/kkj6XxI1N1+gO4UppqU5CEdG6QzSVzqr35uJo1jq7q4vYjJjZZ5Bd1A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770365579; c=relaxed/simple; bh=vtZ8qpxO1glVKw5WkTGV/9fGQlliBjbhanGx9pnoSjM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QLCk94B6axZleui9lCU4KlnedOXk+7vksk0++/6vqhML4HtaikAUYljMnFZOm22ql+oCOtQqXts0XgPYPD3dMrEgevkqmDEMVsla752JkdSsFzQ+Za1nk96GeRdWNZ0j4inX0HOWR9SHKFSrWbjsYuL/jxpdDh42ZjRgS0gaWQU= 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=Bj/mqIlR; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EWt12EKH; 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="Bj/mqIlR"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EWt12EKH" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6167Xrjm2482242 for ; Fri, 6 Feb 2026 08:12:58 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= 14DCHSOuOQFKW6OTpiNFZoRvwSOz4r8wKdkOgTkHAjQ=; b=Bj/mqIlRMCG9BO14 Fh0114as3W+8OVLEsF1OgrGBgYtGsJbtu7vPiafvNHTwLplmDGhK5L7OA1WKLnVY P2LMwKDgbdKgcRD+bx3yNzXGCi4gaijiAkCZmg3xmWp4i00FUlzrYO1Ra1d7++a7 v7DfQA6TEgxLfLL65VbzpdbtxR9pQqES4gfeetW7ICQjg9Yfc6IUj06GGwQaPgIL acwzsri1Bt2G7zvejI34G4U22Jt/UNqfe7ftJznPuQsbN6WP/w8YXsWrw4ahU4WQ BnfnYlgZsr62ZRGX+WOHez4cY/irIH5Kw1OckQNXl4aZ8FSyqODokoX3Jpqtt6JZ KXoPrg== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c5c1703xy-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 08:12:58 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-82438027416so627222b3a.1 for ; Fri, 06 Feb 2026 00:12:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770365578; x=1770970378; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=14DCHSOuOQFKW6OTpiNFZoRvwSOz4r8wKdkOgTkHAjQ=; b=EWt12EKHgYmi0OpDftB6TtA4EpsHX+fE+bfe6BFImppMtS/wgg+C3FgIOrklk92nJv s66VRNYM6YI5fqWOWLSmtWmM7l+xa8Kq6pdB3UQcvJ/Z0qW0TXSGmgd5jGkc/EvYhJIp Sgm6iVCJ5qQj2Ra/sQin+OOXImkl/mt/EpsNLU3WNhMofaUGn5NBlJ/v7bY+LEF6UVzG b8z7k/Ho9PhgTN1LOTnaik/FzjvpTxSc4cm2YSusNCkEOshyTatDSoJcnDmXowGtnMYL AyUyJX6IrK2C4pW96fFt7FSzQQhd476j7cgSelU+K0qz/WtDiT+cJLSyM4bFignp6y0C +BFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770365578; x=1770970378; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=14DCHSOuOQFKW6OTpiNFZoRvwSOz4r8wKdkOgTkHAjQ=; b=BiCG+opzdpZLLsj85Qr4ZVvhmdg8evCBy+g0xIHjt7FoYtOgzdXKarOkvVMHA650ip io13qZIPuWg72HRThb69SKHvpAT60dNvPt53pjeA9M6Qz7O+hOzrDPV3XjXJPipwPpfw fly800anRRF/GAi7Afj685AIWLI+CN4724On/d7PAwsuOnrbrajAgrHxfgdmMMiWxins bhCzjOxL6XepfrS/CxcvAqdLBO2DI69K1gIlga4Kgv1WOhisLWGC3DJ9IGVISlFw8NY+ /00Uu1b1J1dphQxv9z6v+HawMrQL0Zjbay+fa5gIrS3S5QWNt7Z8qd+INIJtKsNJVuRi BfVg== X-Forwarded-Encrypted: i=1; AJvYcCXKwiPis2aeEB62thecmGzkoovNKVtIQ80UyU0DW/wgVazimQc7sKF7YzO74g39URGwPZ3I/+yTDvTVwQM=@vger.kernel.org X-Gm-Message-State: AOJu0YyOl/cTJuQEiA99qjCA2qRss6aQBXqI/7KAOv8MSFAcsB9VTQmZ wcYcYMPlJMsjWWLNj+lDyltMqNl/cS/x7E6lLZMHOZJXMt7hPt4UpXK+WuckYQ8ELMxey1w7L/V L662q1nX+xm4gFdgd+Llzca0WMVAx0t9ix1tzjdpWRzhFHbrzQh/RjKgli6DxiRcy/MU= X-Gm-Gg: AZuq6aIV5FHwVTJuyBAA6CTiVsDbZVqxB0v5vA2n0Fs0Nmn+4azpJUZC5diWy2ry/oB XVbweBiLRN0o5hknAI35DHAGHo1+9iI9XSGjvipl8Slo7erm7fi+fGUbKFPdGPw8WLqHekRyV1R nhM9AA2K6/ex9U7pPKuE790bCEGoynqnIcbXkMlpQwz6CqoYm3j5BNOtP+u6Pf5e4yisJZpgzOb IJuB5mB/+MC05qq5xRMPslN6kfbeb/kZ0wcnVUHtjaSt9sJBuInWlHVYti0vfm+phH01nS8U0Zx pTPHiwPrLCgZKuqwS7FNlSC1tECI32/Y8szHiDjUl/PNreISscMGzDlhturq6OQjFcNEl+8Y298 hgE06AZYyQfCH3gtYJT+kx8MqkiN+gVbJoZGR4pEGN6uCmjG+cKCYYOI0lfu58Os41r8uElFsTY NS2QI8jER1 X-Received: by 2002:a05:6a00:8085:b0:823:d8a:fa66 with SMTP id d2e1a72fcca58-82441656edamr1497050b3a.31.1770365577985; Fri, 06 Feb 2026 00:12:57 -0800 (PST) X-Received: by 2002:a05:6a00:8085:b0:823:d8a:fa66 with SMTP id d2e1a72fcca58-82441656edamr1497028b3a.31.1770365577481; Fri, 06 Feb 2026 00:12:57 -0800 (PST) Received: from WANGAOW-LAB01.ap.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82441884b75sm1671866b3a.39.2026.02.06.00.12.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 00:12:56 -0800 (PST) From: Wangao Wang Date: Fri, 06 Feb 2026 16:12:14 +0800 Subject: [PATCH v5 5/6] media: qcom: iris: Optimize iris_hfi_gen1_packet_session_set_property 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: <20260206-batch2_iris_encoder_enhancements-v5-5-fb75ed8fa375@oss.qualcomm.com> References: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> In-Reply-To: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: quic_qiweil@quicinc.com, Renjiang Han , Wangao Wang , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1770365554; l=9503; i=wangao.wang@oss.qualcomm.com; s=20251021; h=from:subject:message-id; bh=vtZ8qpxO1glVKw5WkTGV/9fGQlliBjbhanGx9pnoSjM=; b=YIG0tqpL4gE9lhKVKbq412L8iEhRdWEbcoFcj78QTl0LhALA1QkU1Gpq0nzmyklCZgBHQwv/0 cltIy+vYCSHCP8EC8U7Uc3XvqhL95zK50HTDaT8FfVXqtWHW+62huX8 X-Developer-Key: i=wangao.wang@oss.qualcomm.com; a=ed25519; pk=bUPgYblBUAsoPyGfssbNR7ZXUSGF8v1VF4FJzSO6/aA= X-Proofpoint-GUID: dT7_Qae4xtJq3ngrovf3_dxZO054zps0 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDA1MiBTYWx0ZWRfX/jvxcn+sCF9S ZSeZPNqfFwPUVdAuMoLltLjteXlzdYxTlJwLSJ2/jRBDvK0c14pqdJem3tGsqEspx/NOXX0SI07 tCxJKmDex12Uz6NN7l85VVD5D8wta0yLDROAVXOtmssb89OeH/nyoPZ53fbxIYMRsv4XUfaKqYl 6BEqWukv4P1In9uIILeqDmmxuClOazqfYFHYbAw0mke/GexyIC10YkDIWQw4Qco3fMg62WNAfFz pnz65rJ7e1GlEqSsAScaY/8kSORBkaxqEHXrqrRe3DD0V10/ROCFnVkHMGa25E2LNOOtCcX/fSq ZWTSq5XvILKNA90esAzQI60ih9PfKAT2fxc7ASOaV4odaSZtBpuhF4ozoPAPsdVJkMWJ5LHBipZ a6AB5oSvCbYnAsC85lvA9m78/5EDXwhZaF/YRahMc6s0jgXRANJsBoshlTKvUVy6Z3XnWYZ8NQj YkzXCKAt6VASqa0p3Yw== X-Proofpoint-ORIG-GUID: dT7_Qae4xtJq3ngrovf3_dxZO054zps0 X-Authority-Analysis: v=2.4 cv=E7TAZKdl c=1 sm=1 tr=0 ts=6985a28a cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=EUspDBNiAAAA:8 a=KKAkSRfTAAAA:8 a=7zm3FxsWSslHyZ29AF8A:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-06_02,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 spamscore=0 clxscore=1015 bulkscore=0 phishscore=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060052 Modify iris_hfi_gen1_packet_session_set_property to simplify size calculations and remove redundant code patterns. Previously, packet->shdr.hdr.size was incremented by sizeof(u32) in every switch case, resulting in repetitive and less maintainable logic. Reviewed-by: Dikshita Agarwal Tested-by: Neil Armstrong # on SM8650-HDK Signed-off-by: Wangao Wang --- .../platform/qcom/iris/iris_hfi_gen1_command.c | 50 +++++++++++-------= ---- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c b/dri= vers/media/platform/qcom/iris/iris_hfi_gen1_command.c index 39fc728646d3808c50481ccdfa15ef0dfab05576..d19d15435424da375919e3de729= e756be23c0882 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen1_command.c @@ -485,7 +485,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p { void *prop_data =3D &packet->data[1]; =20 - packet->shdr.hdr.size =3D sizeof(*packet); + packet->shdr.hdr.size =3D sizeof(*packet) + sizeof(ptype); packet->shdr.hdr.pkt_type =3D HFI_CMD_SESSION_SET_PROPERTY; packet->shdr.session_id =3D inst->session_id; packet->num_properties =3D 1; @@ -498,14 +498,14 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_= session_set_property_pkt *p fsize->buffer_type =3D in->buffer_type; fsize->height =3D in->height; fsize->width =3D in->width; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*fsize); + packet->shdr.hdr.size +=3D sizeof(*fsize); break; } case HFI_PROPERTY_CONFIG_VIDEOCORES_USAGE: { struct hfi_videocores_usage_type *in =3D pdata, *cu =3D prop_data; =20 cu->video_core_enable_mask =3D in->video_core_enable_mask; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*cu); + packet->shdr.hdr.size +=3D sizeof(*cu); break; } case HFI_PROPERTY_PARAM_UNCOMPRESSED_FORMAT_SELECT: { @@ -514,7 +514,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p =20 hfi->buffer_type =3D in->buffer_type; hfi->format =3D in->format; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*hfi); + packet->shdr.hdr.size +=3D sizeof(*hfi); break; } case HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_CONSTRAINTS_INFO: { @@ -533,7 +533,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p info->plane_format[1].buffer_alignment =3D 256; } =20 - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*info); + packet->shdr.hdr.size +=3D sizeof(*info); break; } case HFI_PROPERTY_PARAM_BUFFER_COUNT_ACTUAL: { @@ -543,7 +543,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p count->type =3D in->type; count->count_actual =3D in->count_actual; count->count_min_host =3D in->count_min_host; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*count); + packet->shdr.hdr.size +=3D sizeof(*count); break; } case HFI_PROPERTY_PARAM_VDEC_MULTI_STREAM: { @@ -552,7 +552,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p =20 multi->buffer_type =3D in->buffer_type; multi->enable =3D in->enable; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*multi); + packet->shdr.hdr.size +=3D sizeof(*multi); break; } case HFI_PROPERTY_PARAM_BUFFER_SIZE_ACTUAL: { @@ -560,7 +560,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p =20 sz->size =3D in->size; sz->type =3D in->type; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*sz); + packet->shdr.hdr.size +=3D sizeof(*sz); break; } case HFI_PROPERTY_PARAM_WORK_ROUTE: { @@ -568,7 +568,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p u32 *in =3D pdata; =20 wr->video_work_route =3D *in; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*wr); + packet->shdr.hdr.size +=3D sizeof(*wr); break; } case HFI_PROPERTY_PARAM_WORK_MODE: { @@ -576,7 +576,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p u32 *in =3D pdata; =20 wm->video_work_mode =3D *in; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*wm); + packet->shdr.hdr.size +=3D sizeof(*wm); break; } case HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT: { @@ -592,7 +592,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p /* Level not supported, falling back to 1 */ pl->level =3D 1; =20 - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*pl); + packet->shdr.hdr.size +=3D sizeof(*pl); break; } case HFI_PROPERTY_CONFIG_VENC_SYNC_FRAME_SEQUENCE_HEADER: { @@ -600,7 +600,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p u32 *in =3D pdata; =20 en->enable =3D *in; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*en); + packet->shdr.hdr.size +=3D sizeof(*en); break; } case HFI_PROPERTY_CONFIG_VENC_TARGET_BITRATE: { @@ -608,7 +608,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p =20 brate->bitrate =3D in->bitrate; brate->layer_id =3D in->layer_id; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*brate); + packet->shdr.hdr.size +=3D sizeof(*brate); break; } case HFI_PROPERTY_PARAM_VENC_RATE_CONTROL: { @@ -627,7 +627,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p } =20 packet->data[1] =3D *in; - packet->shdr.hdr.size +=3D sizeof(u32) * 2; + packet->shdr.hdr.size +=3D sizeof(u32); break; } case HFI_PROPERTY_PARAM_VENC_H264_ENTROPY_CONTROL: { @@ -637,7 +637,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p entropy->entropy_mode =3D *in; if (entropy->entropy_mode =3D=3D HFI_H264_ENTROPY_CABAC) entropy->cabac_model =3D HFI_H264_CABAC_MODEL_0; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*entropy); + packet->shdr.hdr.size +=3D sizeof(*entropy); break; } case HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE_V2: { @@ -662,7 +662,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p ((max_qp & 0xFF) << 16); range->min_qp.enable =3D 7; range->max_qp.enable =3D 7; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*range); + packet->shdr.hdr.size +=3D sizeof(*range); break; } case HFI_PROPERTY_CONFIG_FRAME_RATE: { @@ -671,7 +671,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p =20 frate->buffer_type =3D in->buffer_type; frate->framerate =3D in->framerate; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*frate); + packet->shdr.hdr.size +=3D sizeof(*frate); break; } case HFI_PROPERTY_PARAM_UNCOMPRESSED_PLANE_ACTUAL_INFO: { @@ -683,7 +683,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p plane_actual_info->plane_format[0] =3D in->plane_format[0]; if (in->num_planes > 1) plane_actual_info->plane_format[1] =3D in->plane_format[1]; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*plane_actual_info); + packet->shdr.hdr.size +=3D sizeof(*plane_actual_info); break; } case HFI_PROPERTY_PARAM_VENC_INTRA_REFRESH: { @@ -691,7 +691,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p =20 intra_refresh->mode =3D in->mode; intra_refresh->mbs =3D in->mbs; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*intra_refresh); + packet->shdr.hdr.size +=3D sizeof(*intra_refresh); break; } case HFI_PROPERTY_PARAM_VENC_LTRMODE: { @@ -700,7 +700,7 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_se= ssion_set_property_pkt *p ltr_mode->mode =3D in->mode; ltr_mode->count =3D in->count; ltr_mode->trust_mode =3D in->trust_mode; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_mode); + packet->shdr.hdr.size +=3D sizeof(*ltr_mode); break; } case HFI_PROPERTY_CONFIG_VENC_USELTRFRAME: { @@ -709,14 +709,14 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_= session_set_property_pkt *p ltr_use->frames =3D in->frames; ltr_use->ref_ltr =3D in->ref_ltr; ltr_use->use_constrnt =3D in->use_constrnt; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_use); + packet->shdr.hdr.size +=3D sizeof(*ltr_use); break; } case HFI_PROPERTY_CONFIG_VENC_MARKLTRFRAME: { struct hfi_ltr_mark *in =3D pdata, *ltr_mark =3D prop_data; =20 ltr_mark->mark_frame =3D in->mark_frame; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*ltr_mark); + packet->shdr.hdr.size +=3D sizeof(*ltr_mark); break; } case HFI_PROPERTY_CONFIG_VENC_INTRA_PERIOD: { @@ -724,21 +724,21 @@ iris_hfi_gen1_packet_session_set_property(struct hfi_= session_set_property_pkt *p =20 intra_period->pframes =3D in->pframes; intra_period->bframes =3D in->bframes; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(*intra_period); + packet->shdr.hdr.size +=3D sizeof(*intra_period); break; } case HFI_PROPERTY_PARAM_VENC_HIER_P_MAX_NUM_ENH_LAYER: { u32 *in =3D pdata; =20 packet->data[1] =3D *in; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(u32); + packet->shdr.hdr.size +=3D sizeof(u32); break; } case HFI_PROPERTY_CONFIG_VENC_HIER_P_ENH_LAYER: { u32 *in =3D pdata; =20 packet->data[1] =3D *in; - packet->shdr.hdr.size +=3D sizeof(u32) + sizeof(u32); + packet->shdr.hdr.size +=3D sizeof(u32); break; } default: --=20 2.43.0 From nobody Sun Feb 8 16:12:13 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 014EA346AF1 for ; Fri, 6 Feb 2026 08:13:02 +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=1770365583; cv=none; b=cVOlLj1lQx3FYE0lCdXT7ZfjrQu1my5DulciSwiQSBTGK1AIAbss8XaziVrZFxuFANIXnT413hZA1n2C3wiK5j6jQvEBntxRFeKSopPPCsJQ5SSlq+djivl4kwPXkmrd+vp1W5biDPi6vKIeiXrI4bTf8XrYcrT8fdyF/O0nJSk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770365583; c=relaxed/simple; bh=W5OCjv9SAZMljCuLBN/Nsa8uVEm2rVmAfFav+iwZiDc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IR2jpZbOpB95O0DZkd+znqbTMuIRbcAaNgh+5RykkvfA/Sl/96NYsGtZOqZdV9fkb+XcjNBTqHc/yFlfiFqmk/f6uQ71Oravl9Rb5MxPxcYhCuKGYFcua1ygSGaa0F7UFv4oxVFkcAE7bfb980QlpOhBHC49y2OqF63FCPG3Q8Y= 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=lA813PFF; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Ys4JozH5; 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="lA813PFF"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Ys4JozH5" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6167XsZ02482256 for ; Fri, 6 Feb 2026 08:13:02 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= aAKBWAJ2X/2OLZYyocKi+WlPjuToeQEsQ6K7eCRcW5A=; b=lA813PFF+miNofoW RNKoSqkNbIaSnL7oVldgrFcOB5Py+KSQ/N/OGEjhnRdNdUTM5kS/Z+1IXiuefZnr Ucd6DGC0uYWSyi9SKngMNEM52ufbQQGJZk++X7PCLHF4FIKtMaHNItT3TVevVvVJ AkDPsrVOx7SDBkA8IDxVlcpkrpD8x6ngrmYA4qrV6fCjPscHsWTmSxzuZ8b1Ozb6 1KfSbOQ5dkUblYRSh5v7FoT4LQ+k/n8M/A0iK5jcYuHc2sr1S5DPeZDfWhIlKX+/ /QzAjFikmsDXCQ3hUHzKfyCxZ6yhEl16posZwUXZBuyKi4tt2D2KoPLPKOEG9CIP Wuh5/w== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4c5c1703yc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 06 Feb 2026 08:13:02 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-824377115daso841328b3a.0 for ; Fri, 06 Feb 2026 00:13:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1770365581; x=1770970381; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=aAKBWAJ2X/2OLZYyocKi+WlPjuToeQEsQ6K7eCRcW5A=; b=Ys4JozH5LscH6E5gCdWwcZxZGlcVjCf2rCukOIYcX/WwaWcNIA6p3qphM3MILKK0Vb hy1vWmgRGZ2T/ew2VwUNLeUPkk1Y/HXmzAbwrULHp7HeVuDwDTELFHcUqhM7LkcvL297 nymEzxN24gz04KvsQLyPat9/6jg72OI620JiqBrUYuwloXXlSuZZ+wrmcFOcTZoh+r2p osN9f7L5gBdntNns2UvSbG28GvdswGRDn5eSwQpvEIXJ6XhO7HXOll7J6bBuh3HFqTRt aIR/Xy706x1/ZAAuQIJmvs12Kin2phgeBZj6vDjt1QDf8j0Ed3/RCdbyKm/YFfCrLC/P Myww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770365581; x=1770970381; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=aAKBWAJ2X/2OLZYyocKi+WlPjuToeQEsQ6K7eCRcW5A=; b=xNHfCuPrlKPof8hYp9vPkCot1L6VeinxmzFptpEcteSWDz6kKsjrjw/J4SsCUjORFK jMHMfiCXxhD68tSJw+J8S56kZVpEwhK0ChhwEaaDFlTpdeCG3Y/jrHdIRd9VIcEdzI4X oW+maNk3RiSpfBezyJQNT55y5Z/cuQsMHYZy1ME5vS9OFjto0n6JlnqMOw1fLkfPyasC I33LGuDNkQf9lsyOh23H6S7noYJ3An4JYyzo2pDWRJxPtbOcXnzLUrfoJ1VKAk8aI7RW TgpVOc7427rfUJkscNd3Gu3SdyCFITrpEQF+jUa/SYHKSqlZzNSBUMtDPctjnek9YFc5 REMg== X-Forwarded-Encrypted: i=1; AJvYcCX+2xQzyK/XclkTzPjuXl91d4D/WppVRfG9x9ZjVwdJ2ImdWjGIDc05Z8UVROSf+ynLB2ZQVE6BAE6V31M=@vger.kernel.org X-Gm-Message-State: AOJu0Yyb+hNd/VrAPzNBzwq7kyJYduqBZRKJBRzd3CXA7Cr8QoqLkhRA 8+5Mb5Wv2y8RVSkXWzTpCXeVHh80qKC2EINSijPiMZCo8H1v3yeZDrUlwfU4L63f9OQyV/22woT cQtC/Z11Di1msUHhiBQEGsDq5SHaumemsv2qKNd2Kf+Cpzm9CC2GHrbmm2tvRvLDzUuk= X-Gm-Gg: AZuq6aKpgsy7U9BLV1Se0idvfoHlHr3fr0xYMEVi3K2S2lGDJ1PcKPrA2RyEFustpDG 7vT2KtyMyQExWVIgNXiSfhbMubuiupDVnl8MKGQdtlVfkR9y4qTZ4kpFHiH7Cldyd2FWoLyjY+S Kqm1JPIrNiNi7gXRE3KQ70NcLtGcjCfPPIFrsqzp5B8B88VdriEZV3w2ud2sDTWEJFTjkqLZcre 7YwTZmTe1U+Hhv+hiOGJaH/1CjE2sEfM9GINyByZD/VcYCaequUk9OoqgQ6tgbp+kkCdv0euTqy R2kmZFMP2MxpBO/kPUxxZI7BtPsS6w7Ub0imLS0ObfOO2TVhr8gTw7gz8swG8Pp8xArS0eqTofL p37jRxBe2tEfb766qt617YbUhhmdPh8OalgVS4u58V+b+qHss3kqggzcov6tgTgPj3slu7ibOJ7 uRx6NaJB6t X-Received: by 2002:a05:6a00:3cd6:b0:7e8:4398:b360 with SMTP id d2e1a72fcca58-8244176508emr1821980b3a.51.1770365581495; Fri, 06 Feb 2026 00:13:01 -0800 (PST) X-Received: by 2002:a05:6a00:3cd6:b0:7e8:4398:b360 with SMTP id d2e1a72fcca58-8244176508emr1821962b3a.51.1770365580997; Fri, 06 Feb 2026 00:13:00 -0800 (PST) Received: from WANGAOW-LAB01.ap.qualcomm.com (tpe-colo-wan-fw-bordernet.qualcomm.com. [103.229.16.4]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82441884b75sm1671866b3a.39.2026.02.06.00.12.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Feb 2026 00:13:00 -0800 (PST) From: Wangao Wang Date: Fri, 06 Feb 2026 16:12:15 +0800 Subject: [PATCH v5 6/6] media: qcom: iris: Simplify COMV size calculation 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: <20260206-batch2_iris_encoder_enhancements-v5-6-fb75ed8fa375@oss.qualcomm.com> References: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> In-Reply-To: <20260206-batch2_iris_encoder_enhancements-v5-0-fb75ed8fa375@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab Cc: quic_qiweil@quicinc.com, Renjiang Han , Wangao Wang , linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Neil Armstrong X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1770365554; l=1573; i=wangao.wang@oss.qualcomm.com; s=20251021; h=from:subject:message-id; bh=W5OCjv9SAZMljCuLBN/Nsa8uVEm2rVmAfFav+iwZiDc=; b=8Pwd94POKjzk2YJ0Y1RveUPhiz9MnuPpuHaeqbg0WEhmodzZSW5/+92doGwTk0BHmMjAuq+Eu I/g+73l0wuIAdkN+Bl0BHBq8niNAp47mpBvjr9fxWfVpXZg/GhOCYGD X-Developer-Key: i=wangao.wang@oss.qualcomm.com; a=ed25519; pk=bUPgYblBUAsoPyGfssbNR7ZXUSGF8v1VF4FJzSO6/aA= X-Proofpoint-GUID: L62DSUGCVvRZ3kfMA8OwqkTlZ2NmMasn X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjA2MDA1MiBTYWx0ZWRfX2sgpTGsSyfAD HmvWxsELdfSHx+3FRkkSbUa8sxK3t7XxDlrY/Vr1jwEQH0eRYB/lyKD7baHKsg9y0iCGMvtfisk wPuthz9hI7phh/F9cNpMimxpYkrEHfsdwsncrE7holR0flPeeZ/NEpg9BWJkbl+LQgfrkIOKVOg 1fVUq68b3LhypboTc4WWLOLvqMT9CtYO4dmRF6EBOE3DrVtVMBMRv3+2mxmSPBNfrRS4ZOlM7UJ WFBzkgdUvTGaiNQk3f3l+fGAVgbZu3g61but/8QCHunBwbGPv69WrkHJ/2/WDbOEBFMYwokkRHH pVUNCRPic1sov8/HKNLnmi+tICDwAVWzD7YFD0579vaJRD21ZBcmT6Q8EMlGN9c6nOekDl+46vA gV4QnkGWaiQnrhmAPP2oco7aD0LsrM7QDXww9odMhKRifHgyc2d+PqPWg0SFtFLc0jETb9eTuQU q5xn36l4A2q0/u1jSUw== X-Proofpoint-ORIG-GUID: L62DSUGCVvRZ3kfMA8OwqkTlZ2NmMasn X-Authority-Analysis: v=2.4 cv=E7TAZKdl c=1 sm=1 tr=0 ts=6985a28e cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=nuhDOHQX5FNHPW3J6Bj6AA==:17 a=IkcTkHD0fZMA:10 a=HzLeVaNsDn8A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=EUspDBNiAAAA:8 a=KKAkSRfTAAAA:8 a=ihyF2tqwNky6lgPlo9sA:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-06_02,2026-02-05_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 adultscore=0 spamscore=0 clxscore=1015 bulkscore=0 phishscore=0 priorityscore=1501 suspectscore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602060052 Unify AVC/HEVC handling by computing codec and lcu_size upfront. Reviewed-by: Dikshita Agarwal Tested-by: Neil Armstrong # on SM8650-HDK Signed-off-by: Wangao Wang --- drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/m= edia/platform/qcom/iris/iris_vpu_buffer.c index c2cd4adc082394a9ab6f32a37fe4e57678019d89..f55db869fee4d64273763fd3f98= d286f58e2e7b1 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c @@ -1014,16 +1014,13 @@ static u32 iris_vpu_enc_comv_size(struct iris_inst = *inst) u32 height =3D iris_vpu_enc_get_bitstream_height(inst); u32 width =3D iris_vpu_enc_get_bitstream_width(inst); u32 num_recon =3D hfi_buffer_get_recon_count(inst); - u32 lcu_size =3D 16; + u32 codec, lcu_size; =20 - if (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) { - lcu_size =3D 32; - return hfi_buffer_comv_enc(width, height, lcu_size, - num_recon + 1, HFI_CODEC_ENCODE_HEVC); - } + codec =3D (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) ? + HFI_CODEC_ENCODE_HEVC : HFI_CODEC_ENCODE_AVC; + lcu_size =3D (inst->codec =3D=3D V4L2_PIX_FMT_HEVC) ? 32 : 16; =20 - return hfi_buffer_comv_enc(width, height, lcu_size, - num_recon + 1, HFI_CODEC_ENCODE_AVC); + return hfi_buffer_comv_enc(width, height, lcu_size, num_recon + 1, codec); } =20 static inline --=20 2.43.0