From nobody Wed Apr 1 12:32:53 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 D4BDE3CE482 for ; Tue, 31 Mar 2026 07:40:06 +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=1774942812; cv=none; b=S9cprYIe+VV8aL1H63g1wJim4C98V9MqnQcReAovvFuhsRmLVW8elHgWOwOE4rAMPSkc2N/+wr+IT8IBjXdpcj0qKt0ohyYYoyD2nwo5moKvUWQpEhC+0jSyKFKlo+Lo2Ts0WbLtRCb0KP3i+YsCX8QhySjA7YdtiC4YEGzhi68= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774942812; c=relaxed/simple; bh=IJVGYieJGPFUQXXMPA2+Az4Owd/nGNxNkkhNaqq24GA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OfFDHO02P0+jFp8ZK8bDPNUv5tGzjQVkbAVSE2w2klkglNyzO2mxIZFK2+8CpH9Z9PIB2kizg3rKvpxuL6JCwna0De4kNTh1w4Ed96Kc3lfUzBzmNUeOBFXbI7pHxzf0ZeNMS4mYSvkjZk8FWniEDnme6J0hl5TagAfig0/wLK0= 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=KoTO6+V/; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Y8zIECzH; 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="KoTO6+V/"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Y8zIECzH" 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 62V4GL9D4053269 for ; Tue, 31 Mar 2026 07:40:06 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= OoPs/pRzXx5+0DV6kkDYwpPjNriZnITrWcZF/HOHuag=; b=KoTO6+V/PbYivYtD zrcu/fgqQJcYGRgsyjRROst0Ul8YAbN4r/0VNP/Avc8YZnGOmqxcbgXCSPWnE5m8 TZQc+2z3Mh/Qh5N6U7KlBxGCHn1wVNmJ3jnXWHIAQilGo9pwv6PdpOOdqIG5VMZk hrHvxgyc8Zkcv+5vPhAmWcYFMS5yDgUEQeFQUpfVRef0iOBS6enPx/6GAFI8mLwP eQCHrqQcF9pYjuXvY/kQLzeBDs0PeIW95VIP2w17ISijtBzjIab/mwfiAQBDWuqH jwZGKzT5Q69wTyO5NgnseROfLd8OukCyzYK6lWWvtc63tiw3uWvwS6UiK2MVnwXF qdY0xg== 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 4d7xx3abxj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 31 Mar 2026 07:40:05 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-c76b6ccf298so122070a12.0 for ; Tue, 31 Mar 2026 00:40:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1774942805; x=1775547605; 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=OoPs/pRzXx5+0DV6kkDYwpPjNriZnITrWcZF/HOHuag=; b=Y8zIECzHrA3LT92UGKs9LcwpEz1MJXi8Ha3dJeuHPXwBBx1WsZcCqBAhYsR7z97UNg Qy261rgqyUTUMb4BZF/mQrfrormp1AaCfHA8Cye4jKNom1IY3ZrxE8Udwa586wOK6vFp 57noa4Od9mSySNBpjMMcZMD/mEgCxACJkYLgzj5m8iGujaIppOKZfJJYj3wB9vaQFYoD PQs9BYLFrvz7tV02BkEKg0UnE2vfhg+Tej4I4j+IsqvwZWFysmk5FCUJ0pGwjuvX8+3d vPuyUG2JHS5ZpUgFKkZwElIPS07oLLMCl3k/cjK1Cnsp9ydHOrWgJLkVnRciI+FAL8ZU /0Ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774942805; x=1775547605; 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=OoPs/pRzXx5+0DV6kkDYwpPjNriZnITrWcZF/HOHuag=; b=C9IJLUR2rEOv357EJIUvm+d5Zc/LMUqqkwPUhVJUISzAcGI2tW/VWFIQnByqUf8aCe RLzTSFy5HwA8jcciFHlRC0J+yL5etWt1nIqfCudH3iKD1q8wcjcAnpvIBi266yclX1iG 7D/u2PyE64kmnQhGW8Lhse1RR2eFNDGEuZ+g3cFsYwQl27Ni4Ni+CYvqBz9RQs4H2XSL rwZriVLEPkNqQhWadm5YnOKyn1mzYFqgfegOR0bTmGSYdF+X+2D8wzKwplOO4weu3Uxk iiIsGvVfyxRQ7NWrCNbc7cQtowQ17xzVG5PvhG28c8l7F6gHGR3zmeQAXfw6Xbf3Db8I D9sg== X-Forwarded-Encrypted: i=1; AJvYcCW70Nv4XZJNRBlW9xtJ9w1ROb5SJVmihdqLCrm1eCwjlaQ1I/PbFp4LOB6IXPqxYTZI8AFX8XZBoku2Uzo=@vger.kernel.org X-Gm-Message-State: AOJu0YyVPN6zAGHOjsYDv6WgrWrMZb15j1NqlUzQut7xYtDJCWhPMAki zHn73d9CcvK7Gy5iLcHJu2fyZiuGq/Ct9IaCsy4YUmcSvf1kmCgv6PhCvPfmwR4ppI/oxDYwW9G uNTApMNHnT+KyR7apUeVk2fC1GDciijNQZvPP4JvNqN/LcUAgEWrpn7/HYjTLrJjJUR7nYezeeO A= X-Gm-Gg: ATEYQzyKjIhT1w0ojBld01qGe6mhVYXXouGtKEPHW7ZL4vXnQz+wlXirF/2LQ8Rq+sJ 9O4TqkoIjPHSI9mGq4FRS8YPxDmzbiFJC4ES3WlgyTYjTvTMHOLEt5OBEU1kncIMsnyNvJv7Nz3 tz9JghDoDjkLxXcG0nzQSKGdluW9IA3YoRRAPJxFq0tsfIiva5P2JUzxYJI4TwRPVToDyLA5n12 90m4W2XWFZ3XttarbyRMqIDK2AQAN9pdPyT/dxCIZIl4Qy8IGjK9vNBFgCUH5DOk/odx8mkjQFS KvQTPGdaLpGioD3lhw+ReV4W56PASD3Qmzv1GAQPNgSaX771YnmcDZ8H9b2Xx36esft7LowGwKM X2nUaeHKeFWfygOVOvhkasCdjos5qOjctJwkF5WPyybNpWj8IjGGNDlcFkqc= X-Received: by 2002:a05:6a20:3d08:b0:39b:edcd:d92f with SMTP id adf61e73a8af0-39c87849172mr15954994637.11.1774942804683; Tue, 31 Mar 2026 00:40:04 -0700 (PDT) X-Received: by 2002:a05:6a20:3d08:b0:39b:edcd:d92f with SMTP id adf61e73a8af0-39c87849172mr15954953637.11.1774942803884; Tue, 31 Mar 2026 00:40:03 -0700 (PDT) Received: from hu-dikshita-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76916baab6sm8013076a12.2.2026.03.31.00.40.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 00:40:03 -0700 (PDT) From: Dikshita Agarwal Date: Tue, 31 Mar 2026 13:09:55 +0530 Subject: [PATCH v3 1/3] media: iris: Switch to hardware mode after firmware boot 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: <20260331-kodiak-gen2-support-v3-1-958296fab838@oss.qualcomm.com> References: <20260331-kodiak-gen2-support-v3-0-958296fab838@oss.qualcomm.com> In-Reply-To: <20260331-kodiak-gen2-support-v3-0-958296fab838@oss.qualcomm.com> To: Vikash Garodia , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Hans Verkuil , Vishnu Reddy Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Dikshita Agarwal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1774942796; l=9610; i=dikshita.agarwal@oss.qualcomm.com; s=20240917; h=from:subject:message-id; bh=W00eNf4MKHWhC2JzGqOh3CVzD4wB6M1OX9hGCaQXRy8=; b=S6Y5WIvIO8HjhpxK7dugndmBcmeoIAWO6KOSPdy0N2NNdAlpRC6Xx5oYuLfJs+TnUM2GVOg0g gfoStHT0iTPDxOxYxqib/wZrHTzjmJ+ZJg4OhYlWE+bw5PLsIjuLmA5 X-Developer-Key: i=dikshita.agarwal@oss.qualcomm.com; a=ed25519; pk=EEvKY6Ar1OI5SWf44FJ1Ebo1KuQEVbbf5UNPO+UHVhM= X-Authority-Analysis: v=2.4 cv=ErbfbCcA c=1 sm=1 tr=0 ts=69cb7a55 cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=8QxTX33zP25rWUhdfb4A:9 a=QEXdDO2ut3YA:10 a=bFCP_H2QrGi7Okbo017w:22 X-Proofpoint-ORIG-GUID: w8sInz_PQoR4cQrwpPkIXud5bZL1VW_g X-Proofpoint-GUID: w8sInz_PQoR4cQrwpPkIXud5bZL1VW_g X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzMxMDA3MCBTYWx0ZWRfXyONk1FAG4aXH m5HGkx00oEVw67yVMTsCZM9DiEjVmDxD7td/2N/pmjr39xSZaPa1qekqn57ePj76Q9cxCK7yE8Z Nb0GOenAJ9T9vB23msdFC88KHayNbVzqXgGpxsv+eGHqseU3HK71z95rfOpoteB4qEKSAdK8LDh zZ3yl53+pcMaiOqoeyco1en8qmujiQMAM8h9EBRNFQosjIXeU68USSQVW+oIS5155kgfMeg4pYC oSojMqU/19y/pJwL5dVtoUer/pHPdA6aX/FNFOBsUQn/g/bmGdUUOURbawchpPM7Wv09Gvz2HQB vP1WkJCM/+aSISyIWS7NFkFAl91O6xjepv1vHwWFCl1uF/A5X9ynDCJJoEenvVpsR1mGc+NmCcR fu0Gbos04ovqRGnElKujzAiBGJarunLqtq37H0NyB7J+wjPh3z/PD2o34PbEOhGLk7I3QrpCzUe wFzvvMvi67kGJLK9nGg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-31_02,2026-03-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1015 phishscore=0 spamscore=0 lowpriorityscore=0 suspectscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603310070 From: Vikash Garodia Currently the driver switches the vcodec GDSC to hardware (HW) mode before firmware load and boot sequence. GDSC can be powered off, keeping in hw mode, thereby the vcodec registers programmed in TrustZone (TZ) carry default (reset) values. Move the transition to HW mode after firmware load and boot sequence. The bug was exposed with driver configuring different stream ids to different devices via iommu-map. With registers carrying reset values, VPU would not generate desired stream-id, thereby leading to SMMU fault. The efuse tells us which hardware blocks are actually present. If efuse status is disabled for a block, the driver will skip powering it on or resetting it. otherwise the driver will perform the necessary resets and then switch that block into hardware mode. This makes sure we only touch hardware that really exists and is enabled on the silicon. Fixes: dde659d37036 ("media: iris: Introduce vpu ops for vpu4 with necessar= y hooks") Co-developed-by: Vishnu Reddy Signed-off-by: Vishnu Reddy Signed-off-by: Vikash Garodia Signed-off-by: Dikshita Agarwal --- drivers/media/platform/qcom/iris/iris_core.c | 4 ++++ drivers/media/platform/qcom/iris/iris_hfi_common.c | 4 ++++ drivers/media/platform/qcom/iris/iris_vpu2.c | 1 + drivers/media/platform/qcom/iris/iris_vpu3x.c | 9 +++----- drivers/media/platform/qcom/iris/iris_vpu4x.c | 24 ++++++++++++------= ---- drivers/media/platform/qcom/iris/iris_vpu_common.c | 16 +++++++++------ drivers/media/platform/qcom/iris/iris_vpu_common.h | 3 +++ 7 files changed, 38 insertions(+), 23 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_core.c b/drivers/media/p= latform/qcom/iris/iris_core.c index e6141012cd3dda7e029a5659dcb3048a23cdc150..1f326f696d08014f5ebfeb0b99c= fed70665fd6ab 100644 --- a/drivers/media/platform/qcom/iris/iris_core.c +++ b/drivers/media/platform/qcom/iris/iris_core.c @@ -74,6 +74,10 @@ int iris_core_init(struct iris_core *core) if (ret) goto error_unload_fw; =20 + ret =3D iris_vpu_switch_to_hwmode(core); + if (ret) + goto error_unload_fw; + ret =3D iris_hfi_core_init(core); if (ret) goto error_unload_fw; diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.c b/drivers/m= edia/platform/qcom/iris/iris_hfi_common.c index ad8e4ecb86052d0c4ec9338b2874293494471bc2..8769ec61f11769e004945063381= d9baddb302b06 100644 --- a/drivers/media/platform/qcom/iris/iris_hfi_common.c +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.c @@ -159,6 +159,10 @@ int iris_hfi_pm_resume(struct iris_core *core) if (ret) goto err_suspend_hw; =20 + ret =3D iris_vpu_switch_to_hwmode(core); + if (ret) + goto err_suspend_hw; + ret =3D ops->sys_interframe_powercollapse(core); if (ret) goto err_suspend_hw; diff --git a/drivers/media/platform/qcom/iris/iris_vpu2.c b/drivers/media/p= latform/qcom/iris/iris_vpu2.c index 9c103a2e4e4eafee101a8a9b168fdc8ca76e277d..01ef40f3895743b3784464e2d5b= a2de1aeca5a4a 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu2.c +++ b/drivers/media/platform/qcom/iris/iris_vpu2.c @@ -44,4 +44,5 @@ const struct vpu_ops iris_vpu2_ops =3D { .power_off_controller =3D iris_vpu_power_off_controller, .power_on_controller =3D iris_vpu_power_on_controller, .calc_freq =3D iris_vpu2_calc_freq, + .set_hwmode =3D iris_vpu_set_hwmode, }; diff --git a/drivers/media/platform/qcom/iris/iris_vpu3x.c b/drivers/media/= platform/qcom/iris/iris_vpu3x.c index fe4423b951b1e9e31d06dffc69d18071cc985731..3dad47be78b58f6cd5ed6f333b3= 376571a04dbf0 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu3x.c +++ b/drivers/media/platform/qcom/iris/iris_vpu3x.c @@ -234,14 +234,8 @@ static int iris_vpu35_power_on_hw(struct iris_core *co= re) if (ret) goto err_disable_hw_free_clk; =20 - ret =3D dev_pm_genpd_set_hwmode(core->pmdomain_tbl->pd_devs[IRIS_HW_POWER= _DOMAIN], true); - if (ret) - goto err_disable_hw_clk; - return 0; =20 -err_disable_hw_clk: - iris_disable_unprepare_clock(core, IRIS_HW_CLK); err_disable_hw_free_clk: iris_disable_unprepare_clock(core, IRIS_HW_FREERUN_CLK); err_disable_axi_clk: @@ -266,6 +260,7 @@ const struct vpu_ops iris_vpu3_ops =3D { .power_off_controller =3D iris_vpu_power_off_controller, .power_on_controller =3D iris_vpu_power_on_controller, .calc_freq =3D iris_vpu3x_vpu4x_calculate_frequency, + .set_hwmode =3D iris_vpu_set_hwmode, }; =20 const struct vpu_ops iris_vpu33_ops =3D { @@ -274,6 +269,7 @@ const struct vpu_ops iris_vpu33_ops =3D { .power_off_controller =3D iris_vpu33_power_off_controller, .power_on_controller =3D iris_vpu_power_on_controller, .calc_freq =3D iris_vpu3x_vpu4x_calculate_frequency, + .set_hwmode =3D iris_vpu_set_hwmode, }; =20 const struct vpu_ops iris_vpu35_ops =3D { @@ -283,4 +279,5 @@ const struct vpu_ops iris_vpu35_ops =3D { .power_on_controller =3D iris_vpu35_vpu4x_power_on_controller, .program_bootup_registers =3D iris_vpu35_vpu4x_program_bootup_registers, .calc_freq =3D iris_vpu3x_vpu4x_calculate_frequency, + .set_hwmode =3D iris_vpu_set_hwmode, }; diff --git a/drivers/media/platform/qcom/iris/iris_vpu4x.c b/drivers/media/= platform/qcom/iris/iris_vpu4x.c index a8db02ce5c5ec583c4027166b34ce51d3d683b4e..02e100a4045fced33d7a3545b63= 2cc5f0955233f 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu4x.c +++ b/drivers/media/platform/qcom/iris/iris_vpu4x.c @@ -252,21 +252,10 @@ static int iris_vpu4x_power_on_hardware(struct iris_c= ore *core) ret =3D iris_vpu4x_power_on_apv(core); if (ret) goto disable_hw_clocks; - - iris_vpu4x_ahb_sync_reset_apv(core); } =20 - iris_vpu4x_ahb_sync_reset_hardware(core); - - ret =3D iris_vpu4x_genpd_set_hwmode(core, true, efuse_value); - if (ret) - goto disable_apv_power_domain; - return 0; =20 -disable_apv_power_domain: - if (!(efuse_value & DISABLE_VIDEO_APV_BIT)) - iris_vpu4x_power_off_apv(core); disable_hw_clocks: iris_vpu4x_disable_hardware_clocks(core, efuse_value); disable_vpp1_power_domain: @@ -359,6 +348,18 @@ static void iris_vpu4x_power_off_hardware(struct iris_= core *core) iris_disable_power_domains(core, core->pmdomain_tbl->pd_devs[IRIS_HW_POWE= R_DOMAIN]); } =20 +static int iris_vpu4x_set_hwmode(struct iris_core *core) +{ + u32 efuse_value =3D readl(core->reg_base + WRAPPER_EFUSE_MONITOR); + + if (!(efuse_value & DISABLE_VIDEO_APV_BIT)) + iris_vpu4x_ahb_sync_reset_apv(core); + + iris_vpu4x_ahb_sync_reset_hardware(core); + + return iris_vpu4x_genpd_set_hwmode(core, true, efuse_value); +} + const struct vpu_ops iris_vpu4x_ops =3D { .power_off_hw =3D iris_vpu4x_power_off_hardware, .power_on_hw =3D iris_vpu4x_power_on_hardware, @@ -366,4 +367,5 @@ const struct vpu_ops iris_vpu4x_ops =3D { .power_on_controller =3D iris_vpu35_vpu4x_power_on_controller, .program_bootup_registers =3D iris_vpu35_vpu4x_program_bootup_registers, .calc_freq =3D iris_vpu3x_vpu4x_calculate_frequency, + .set_hwmode =3D iris_vpu4x_set_hwmode, }; diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.c b/drivers/m= edia/platform/qcom/iris/iris_vpu_common.c index c6cfc1d9fd9ec5a8f69462188a03aa5cb4e1cee9..7bba3b6209c2061dce72facab7c= 2b58d6b3bb9b9 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_common.c +++ b/drivers/media/platform/qcom/iris/iris_vpu_common.c @@ -292,14 +292,8 @@ int iris_vpu_power_on_hw(struct iris_core *core) if (ret && ret !=3D -ENOENT) goto err_disable_hw_clock; =20 - ret =3D dev_pm_genpd_set_hwmode(core->pmdomain_tbl->pd_devs[IRIS_HW_POWER= _DOMAIN], true); - if (ret) - goto err_disable_hw_ahb_clock; - return 0; =20 -err_disable_hw_ahb_clock: - iris_disable_unprepare_clock(core, IRIS_HW_AHB_CLK); err_disable_hw_clock: iris_disable_unprepare_clock(core, IRIS_HW_CLK); err_disable_power: @@ -308,6 +302,16 @@ int iris_vpu_power_on_hw(struct iris_core *core) return ret; } =20 +int iris_vpu_set_hwmode(struct iris_core *core) +{ + return dev_pm_genpd_set_hwmode(core->pmdomain_tbl->pd_devs[IRIS_HW_POWER_= DOMAIN], true); +} + +int iris_vpu_switch_to_hwmode(struct iris_core *core) +{ + return core->iris_platform_data->vpu_ops->set_hwmode(core); +} + int iris_vpu35_vpu4x_power_off_controller(struct iris_core *core) { u32 clk_rst_tbl_size =3D core->iris_platform_data->clk_rst_tbl_size; diff --git a/drivers/media/platform/qcom/iris/iris_vpu_common.h b/drivers/m= edia/platform/qcom/iris/iris_vpu_common.h index 07728c4c72b64bd15f4e4fdfdce90a5d4d6e9d3e..09799a375c1426d808ab5ea4fdf= cac3a203e15b3 100644 --- a/drivers/media/platform/qcom/iris/iris_vpu_common.h +++ b/drivers/media/platform/qcom/iris/iris_vpu_common.h @@ -21,6 +21,7 @@ struct vpu_ops { int (*power_on_controller)(struct iris_core *core); void (*program_bootup_registers)(struct iris_core *core); u64 (*calc_freq)(struct iris_inst *inst, size_t data_size); + int (*set_hwmode)(struct iris_core *core); }; =20 int iris_vpu_boot_firmware(struct iris_core *core); @@ -30,6 +31,8 @@ int iris_vpu_watchdog(struct iris_core *core, u32 intr_st= atus); int iris_vpu_prepare_pc(struct iris_core *core); int iris_vpu_power_on_controller(struct iris_core *core); int iris_vpu_power_on_hw(struct iris_core *core); +int iris_vpu_set_hwmode(struct iris_core *core); +int iris_vpu_switch_to_hwmode(struct iris_core *core); int iris_vpu_power_on(struct iris_core *core); int iris_vpu_power_off_controller(struct iris_core *core); void iris_vpu_power_off_hw(struct iris_core *core); --=20 2.34.1 From nobody Wed Apr 1 12:32:53 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 66B4E3CE4A6 for ; Tue, 31 Mar 2026 07:40:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774942816; cv=none; b=IS0LAiBN8ZDZcI50HxTwlRFZyKPt2xUKRO54mcA8tqKCu+ih8Sj+VBWxrRDlFnO8Ae0bsKh5idHnxOIENfhGFD0cRmBJp/GjTgNagpWIf+EXl+xLJVtIwpEOrwvVThJVm99uYIiWQo/3pvsJORNnhfCfGzlDb7mF4nezcvlpYvg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774942816; c=relaxed/simple; bh=o9pxdPoJfkiELITVw7ZSpLtjExuHdSfKJ0n0DkpmG+o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LCOlrSQElOH8OG47LiOY7O+Sd0i6av3KgRoGCD+hdYidjy3wj8eIeJWoDvh8wNeEnJ/MT1Uj+zNGsyQ5SHgwLb1NkxA+usefExl8dEmxKTfS5rvdsWknWVeCZkHQCKPFMoAPC3QBR6HaFhL5DUU9jipnCUCYbqfQbSPi3Dclk4E= 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=mFQ0Wlje; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EHgkY/Z8; 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="mFQ0Wlje"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EHgkY/Z8" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62V25hT11402790 for ; Tue, 31 Mar 2026 07:40:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= vYxV75Z4wnjwOVaThSDC96yl6BuVtN/GBJ2eo+yQEEk=; b=mFQ0Wlje/IjzSQAV W992CMCSf63T67Bf71/26I9KP2l0miWOncgv21NoY+yIr7e0hg1L8Fkyc8oer9Bl PMrdwVlOU6Tl7txy0SxUqVmeK8Lix0EPQ7Q/54EJLTJBJrpdWmOeI3kWCrL/iOFJ n67fFZKF4cv0Rw2/rzrgOQ2q/fQSvf8UT2XVgTEP5PdG/kogsjrzbrwts0VwG2DC IX9kA+6dmUxINtlis3JRzGT+jS/0+jIxcnEFdVEQ/wj52JmVz/droI0LgE0SnRdL WxZi0oOwtxUgilB8E+EAaVE1CfCh8+A8NxAsTis/vE0PQmo6FeQoYBbcXUlED+w2 D1EO5w== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d7r4hc8j6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 31 Mar 2026 07:40:10 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-354c44bf176so6988670a91.0 for ; Tue, 31 Mar 2026 00:40:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1774942810; x=1775547610; 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=vYxV75Z4wnjwOVaThSDC96yl6BuVtN/GBJ2eo+yQEEk=; b=EHgkY/Z8QGbf8dG0rOK8MtfzdgO4hdQqs9TMQYc+uOekj6dGR7P6tWLMAnFenh6tFj Ovn3lpmfU0IwcuAi3+pBux062e2kRj9JAzUZhku8gjjQPgmyy9rxRHHCa8PCiLaH7OsO 0V7b/OxH2SPwHQdINU1YAyiFMRZw4h0axxM6M3nDUMetINql5VjYHP3WUrzBakjSXNTm QMFLE70IXMH8HUNYEKmOtUazKBNNQbYB/nSHOXegVwmv5o2+EpU75Wi3EFkF6aIrF0GH f4QOEXmHh14iJU9SSbJTXZqNH0SbhWs+u9gMoiyHtjrNL6YBM5vuFEpK8Mo2M1jqIwoL BkeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774942810; x=1775547610; 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=vYxV75Z4wnjwOVaThSDC96yl6BuVtN/GBJ2eo+yQEEk=; b=Vg2Hrd3uiH5/iDfuNjp0ncq6cx1Y0Y5iAndvRPVyCXwRw8EmPPYK+4H9XVAIUpZgYu +upLymGGuVvECMUBrz7HrEOnODGlcFv/LLsNuLPrVvZnWpKq1T833rXV+Dv+Pavhq2ak S1Pj7PJQ8LuMJSERsrXle3zuYTvOWGH7MtwfPqjKNUcQKCBt95DsabvFyHclY0+bxt3Y eyPqNoQIHJk6IEelETYByUwnuBGHs+94yFbZ3vwNl6c7e5F2O/rQjriTgoc4/kyrfdHi dZ+dO9zuDxxpCX2upSXAULXP12fWVgJ5hV3FbXZsGaJbh1TnM+Oaz9FZUSGagCEByCHN 7Q3A== X-Forwarded-Encrypted: i=1; AJvYcCUDZHMm9FrWNBP7VlB5ChyZY5RDiT5Jrc365hFxw4KuStnzT+flCQW1QOR8WlamL5NTohRpucurM+2oce4=@vger.kernel.org X-Gm-Message-State: AOJu0YzLdC2zBhkSBVapuxdEWiZ66EjiwjcDIjuOt/5TPP1KOxotNSKQ Oo3QugcSvpl385H640z96maEC2y2eXO+OtnQKhiY1ymPNDC8a8QS+iPbUJ5JxGIYSNWL2r+PVUC 04ifNbbQMODeBzul9+jQxGWf60ASoIDjgiv7ILXGT67dPgJlJVq7h8K9KlBzmQdCpWFaCOHQHVR U= X-Gm-Gg: ATEYQzyjys3B37i/LsPEJb/vqzHo78AKiNpUg1skJugG13lZNxkJfrY6uKj5TKFQ0Xe jxGaD+Bp+Y/h9ApPISrDr9JsHh6AwdI7uumSHiaQYSbyPM6FJQrEy8wWIcfE7LtwmQFoqz3iRb8 W6l2Jn9dKDM5VL2/gVSwVniX7ISKEc/LwH0KzAZqKIHv1ZpJRU8RglnBlAqzDVW9717C93tV2dV FDYMoVQNy9bQxcKjMxE4/cD5focb4MdMljgk3O19WGCCDNM1sPV5N3VYGptzsxONVWPAPsxFOfJ pLaDg2CywEfBE4Enep+N9W3fhboCO9BRXaht2xveC+dyzvXtpHxMVsxyc81xJJIAwHOykdhbTQ8 8q5wbgX0lETraI3qfaukPRfRiZYn9r+GYdQKAgEFjNlL+jFXTdDOzNVf++iY= X-Received: by 2002:a17:90b:2d90:b0:35d:a2d3:5c31 with SMTP id 98e67ed59e1d1-35da3e1da37mr7569994a91.29.1774942809782; Tue, 31 Mar 2026 00:40:09 -0700 (PDT) X-Received: by 2002:a17:90b:2d90:b0:35d:a2d3:5c31 with SMTP id 98e67ed59e1d1-35da3e1da37mr7569935a91.29.1774942807799; Tue, 31 Mar 2026 00:40:07 -0700 (PDT) Received: from hu-dikshita-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76916baab6sm8013076a12.2.2026.03.31.00.40.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 00:40:07 -0700 (PDT) From: Dikshita Agarwal Date: Tue, 31 Mar 2026 13:09:56 +0530 Subject: [PATCH v3 2/3] media: iris: Initialize HFI ops after firmware load in core init 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: <20260331-kodiak-gen2-support-v3-2-958296fab838@oss.qualcomm.com> References: <20260331-kodiak-gen2-support-v3-0-958296fab838@oss.qualcomm.com> In-Reply-To: <20260331-kodiak-gen2-support-v3-0-958296fab838@oss.qualcomm.com> To: Vikash Garodia , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Hans Verkuil , Vishnu Reddy Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Dikshita Agarwal , Bryan O'Donoghue X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1774942796; l=1626; i=dikshita.agarwal@oss.qualcomm.com; s=20240917; h=from:subject:message-id; bh=o9pxdPoJfkiELITVw7ZSpLtjExuHdSfKJ0n0DkpmG+o=; b=YhtbDfKazact3rpzFkaBQzq06718OGM0mYT7j51SsFDEOAsb85TkzJJMAyBJqhlifjdvNbnzq FPqawSWsSJPAdr+7wH1zOVEs8s14fC4fmIHnWakO2ax8j68xFelT+Qa X-Developer-Key: i=dikshita.agarwal@oss.qualcomm.com; a=ed25519; pk=EEvKY6Ar1OI5SWf44FJ1Ebo1KuQEVbbf5UNPO+UHVhM= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzMxMDA3MCBTYWx0ZWRfX4bCwki/5HP14 pLz1iJnlI9OQ0Ky4fW3LUDA0rodf4PDpOGkP0MzSCuTEB5sXoGS8taQmYEZtpl/IxQmoWcgR4Iv 84AOl7C/5oSAG/6tSrycVOEuppVbM/UjJjO50qmuElYMMNTf38agwH5uaKe119A2YPiF3DdKrGy 35QGfFd8jsKy+RCbNj8uwVmg4TBqsB24rjO7pJc6/ql4e9WX4DSJhRfKRsXvwh/4AyWFCZStzz+ JZN2SgzUIC1/gwUZ8/+JPGUiwNYaWPkGQkjbEzKH45kTlmjauU3XwCBnrHvAvNdoYMYKQ5O4WjT Jbd3aOVYbbAl6ML2smnWu1r71CDcwLOvSDW+m3rLckpwnev9l6sFhGjryZriQH5xDxDRznufKfc 5E2FV4ZYtuH5BnOmyPzqp8ETPtzM0ohfqgdecw2D2+i1FMw+0ML3wLFmVuSARzOIS7hSWjJcnMr NfHJaq3j6FYC7iPWWEw== X-Proofpoint-ORIG-GUID: RVBKFePw3jbx97Pvqu-o7tUenJFEBm8p X-Authority-Analysis: v=2.4 cv=PI0COPqC c=1 sm=1 tr=0 ts=69cb7a5b cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=KKAkSRfTAAAA:8 a=EUspDBNiAAAA:8 a=u1mmxsKKFvk7TXqck8YA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-GUID: RVBKFePw3jbx97Pvqu-o7tUenJFEBm8p X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-31_02,2026-03-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 phishscore=0 adultscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 spamscore=0 suspectscore=0 clxscore=1015 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603310070 The HFI sys ops were previously initialized in probe() but, we don't have firmware loaded at probe time. Since HFI is tightly coupled to firmware, initialize the HFI sys ops after firmware has been successfully loaded and booted. Reviewed-by: Bryan O'Donoghue Signed-off-by: Dikshita Agarwal --- drivers/media/platform/qcom/iris/iris_core.c | 2 ++ drivers/media/platform/qcom/iris/iris_probe.c | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/media/platform/qcom/iris/iris_core.c b/drivers/media/p= latform/qcom/iris/iris_core.c index 1f326f696d08014f5ebfeb0b99cfed70665fd6ab..52bf56e517f91e98569ee029861= 83971266e1c76 100644 --- a/drivers/media/platform/qcom/iris/iris_core.c +++ b/drivers/media/platform/qcom/iris/iris_core.c @@ -78,6 +78,8 @@ int iris_core_init(struct iris_core *core) if (ret) goto error_unload_fw; =20 + core->iris_firmware_data->init_hfi_ops(core); + ret =3D iris_hfi_core_init(core); if (ret) goto error_unload_fw; diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/= platform/qcom/iris/iris_probe.c index d36f0c0e785b7de0e3527e0a824942db0fb79133..dbc15edc602b72fdec8bb2d8d36= 23676afee728c 100644 --- a/drivers/media/platform/qcom/iris/iris_probe.c +++ b/drivers/media/platform/qcom/iris/iris_probe.c @@ -266,7 +266,6 @@ static int iris_probe(struct platform_device *pdev) disable_irq_nosync(core->irq); =20 iris_init_ops(core); - core->iris_firmware_data->init_hfi_ops(core); =20 ret =3D iris_init_resources(core); if (ret) --=20 2.34.1 From nobody Wed Apr 1 12:32:53 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 A4A6E3CEB89 for ; Tue, 31 Mar 2026 07:40:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774942820; cv=none; b=daqdyWfVSThgHRpbR/o7NZVMAhqMVvkOMJxkr4co1FSwS+pTzETKBklVKe9Cos1MJ2lXd1T/u6H7bIdyXiXrhLIuco5naVwKNazsmvTPd1V5KMa56kO51kVo/NvEza7dIG98ZElWP1s0bi9RSjMGYNZpE0lN6BZ830HpRQUQdt8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774942820; c=relaxed/simple; bh=ubBf2121TImJmlaj+0em6aEAJSYd5uuMpFcNUZPBaEQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t2GUCVT2SNbhKySoha03Erkxi677RpqrwB/AcQ9FgdwXMF7ZNCLoSgS3nCI+VK8mUeci61FJtx6SpQa5IeyyIpdQ+IBxvlc55dqvgPbFi+F/ZsiKstBzCDRHr20d6bGK9shlMO9vMwPJtc9Ee88A+s+9s45tcaWopexWeivR4G0= 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=Ke2ISejk; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=OEAO3rG5; 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="Ke2ISejk"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="OEAO3rG5" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62V5iR1h1841169 for ; Tue, 31 Mar 2026 07:40:13 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= PJD18L49SwGKWLraguoebu9FhTRdw/qTlGqA/By89ME=; b=Ke2ISejkSugl5mpx mR+9SFQh+BhC7/tvp0bl2BQiW4i869uAgBkJDbiSq6k0GPAzr5wJZTk6Tm18STvc NzCEGYYYH8u6+NX52rNHvW+r2iaU8svOeSbakHfOcAGRDwaqWO9NhnyPs9S6PSJ0 am6kmunxNGmS27wC4fonROUK9jNfLAxReklheVtcSAsNGfX7ljS/Iimx4UNc2kEi nS68rccWn7rBXXcZrxrBCqRyw8k+R/XcNga3z36l2hcPpD0M7Hhc6yNtf//m6Utm mC33X9ho/666ls6ykgJ7KZ5yEfmSP5kq8HYuExI+X3e1sCss2R8ylkFwCmXtVh/0 2+Pbcg== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d80rshvsc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 31 Mar 2026 07:40:13 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-35d9e67f6dcso7158921a91.1 for ; Tue, 31 Mar 2026 00:40:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1774942812; x=1775547612; 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=PJD18L49SwGKWLraguoebu9FhTRdw/qTlGqA/By89ME=; b=OEAO3rG5IBaJBe0PUuUlQDBYyCVosgJrLIwlGeJeadKRJGlGOdYGB1VVkl7CVQ/1AW U6O/sV8Qe0b7/4itlcwsUwsJjTxtDiG1XgLWj6WU50U+uCJkzLc1LdO1e/DXT+knzxp7 sBUzijwRhTkF99YwLVAnA4ph3/YubsUZsT9TGb60gwCwWeMM34FsGUvT2kgKgJkJmxfi 8i6dBuM+ztMpX1+aMhQ5C4LhQsxNWBKzJakGkgkTmFpDIrppRpqBgIQ4y64QKUUyztA3 44+hureFPkWkPAc2a4nuspjPKUOBAA6nHOVd4ep9XQDYwDVjs0CO9IbokvSSXYqZrPub n82g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774942812; x=1775547612; 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=PJD18L49SwGKWLraguoebu9FhTRdw/qTlGqA/By89ME=; b=VP0js+7WX1eiYdMVhZPEbUG5wXJH6Jke7CAaReX1136NjrftbTpccrrWpKAlyQN77c hG9avVJConmme4vn1hkCeRrZ3fLdEvKyqPcXSZ3QHHgLMglxTfzmj0Aat7z9ML35BFk5 cr3euIAV9q1dB/9XpTt7Do79THj2xIY1cXj2niIC78wZIFzwrpXqaRC4YpHcRb6fvGyX +fM0EUpNIglo8u/A+24Rwy0iRyYEE/yj++dz407Hlk8sAVdcWaDHl9IVSWRcAXBJB6HB r7EDPRrpA7fNNqDQoHYuQlcZsoBtWIsXDD3G4JM7bPh/fzZ6V080SyBLscGbLLZijb6w eWFA== X-Forwarded-Encrypted: i=1; AJvYcCWOvyfN9Vx92RpZfYqE39HWN3wP77AlqUhPP6fP5gbqCdoZl1skK/gsXoVisaWbpjOwi+jUtMEkklBvnEo=@vger.kernel.org X-Gm-Message-State: AOJu0YyudS1it3IVfwW01Mzz71M04elDJkc+tbmU3qLS3F1EFwte4Hp1 J2eSHt06zIf9Vc0F2O3q/usm/M93ObdzpfziJBsrb6ZopQSjOOBVurboP2u88yah+ciwgR5RJLM mT0y5CPp+0rj0zun4ObKG4YqBj4V5dpUOZ/Ya2l+MMOO9eZMxL/O6qEWDBObVzybZ1bagR8QU5k M= X-Gm-Gg: ATEYQzwfZ1ObcjtTkQCSDI+GLKDLrBfu7osAp261mIhue3MYXS0Bs2nonw2+7l34pdn APrGcuw6H//IwmH23hoEDDfPEzgr9JyBH4tN/gVYy6BDhdfCFf1GfUQY6KsqFwwLFA82x+D6ztf cceR1nC6clzdwXJ5GjHD2Kc38E3n3oXJku6SF59oV9ZjCEeQ4YfXfdHGAXF0S8uEYYlIuX1ho80 EPaAYLqozF7nFs/uY+KcM2bztKbtaSQkS0lWAMQX6dvmGGUDhPYQn+LfjHXgCdSnsCwZuc40819 w9pk/Klx77EicKCU4trQ8Piz+YPf8YcLBWhrBGp6rBIUv8ZNISFVhsfzHbKmIZUsJf4jgr4150h V+otk7vznOMneyyaWK3/FJmbi10p5V1tVNILK7jpxplCZ/hd9nYyIg6VQbFw= X-Received: by 2002:a05:6a20:7fa4:b0:39c:787:f185 with SMTP id adf61e73a8af0-39c87915751mr16954128637.29.1774942811782; Tue, 31 Mar 2026 00:40:11 -0700 (PDT) X-Received: by 2002:a05:6a20:7fa4:b0:39c:787:f185 with SMTP id adf61e73a8af0-39c87915751mr16954104637.29.1774942811329; Tue, 31 Mar 2026 00:40:11 -0700 (PDT) Received: from hu-dikshita-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76916baab6sm8013076a12.2.2026.03.31.00.40.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 00:40:11 -0700 (PDT) From: Dikshita Agarwal Date: Tue, 31 Mar 2026 13:09:57 +0530 Subject: [PATCH v3 3/3] media: iris: Add Gen2 firmware autodetect and fallback on SC7280 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: <20260331-kodiak-gen2-support-v3-3-958296fab838@oss.qualcomm.com> References: <20260331-kodiak-gen2-support-v3-0-958296fab838@oss.qualcomm.com> In-Reply-To: <20260331-kodiak-gen2-support-v3-0-958296fab838@oss.qualcomm.com> To: Vikash Garodia , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Hans Verkuil , Vishnu Reddy Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Dikshita Agarwal X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1774942796; l=11196; i=dikshita.agarwal@oss.qualcomm.com; s=20240917; h=from:subject:message-id; bh=ubBf2121TImJmlaj+0em6aEAJSYd5uuMpFcNUZPBaEQ=; b=/NfBT/WGh9zQpaHcv8Bnejscd18jYgr/xTJk/Zl9mqpBgG8ZwQgdep1orJqNxnVesIldRcugG CuBOtmcJfA+CwoDJtv8aIJsox2/cZjgWgUNW2sd2lm3WauAnrdS/3aG X-Developer-Key: i=dikshita.agarwal@oss.qualcomm.com; a=ed25519; pk=EEvKY6Ar1OI5SWf44FJ1Ebo1KuQEVbbf5UNPO+UHVhM= X-Proofpoint-GUID: Eml7jZEgKRCaSwXj4843ckHqih1yqelt X-Authority-Analysis: v=2.4 cv=VInQXtPX c=1 sm=1 tr=0 ts=69cb7a5d cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=Bx_ZIWocDv9EhjstIRYA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-ORIG-GUID: Eml7jZEgKRCaSwXj4843ckHqih1yqelt X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzMxMDA3MiBTYWx0ZWRfX4wMB+Dj1e0sL NTrfayToZLQLaUPEMfLV5H0iN/f637q/C5LWTsbwqyq6wwsLHWFFbvLE933e9441bzQYL1HexgP WBLN/fGeXsN3acBzLs8bIlp5m9QuFA7Ud04CCG6DUvi1KapJejcafLZn9XvfcCX3nJwWFpCwdsv 0EQW80zlqWNIJhL+yrdXS62GIqws0+JUBaePEL+J5azCPLF1WTMcSVL3O/jlwlsVUsla2JMB5X/ yqLX523tUuvA+0UY65e4zzx0On2woc1ibf0AQfQNoToog+5cwYkQXGDPlYcU/fZyiODyn44Ya9t CvhriL3CWxBQiYm+dWKGyFE8QNMiNk0qE+9AsadS2EhwkmE/4M8WZ6w8jbUY52yStEyL077Mmsz wUxZwsGhHHyUynneVOtI9bTpzz9J4wRdQstwWaZbNpH1mkrPVlYeLVweR2Mgd2dt3Si5OCp649a B1iNkj6/S6S/rkWsZzw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-31_02,2026-03-28_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 clxscore=1015 priorityscore=1501 spamscore=0 impostorscore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603310072 SC7280 supports both Gen1 and Gen2 HFI firmware. To support both dynamically, update the firmware loading mechanism to prioritize Gen2 availability and detect the loaded firmware version at runtime. The firmware loading logic is updated with the following priority: 1. Device Tree (`firmware-name`): If specified, load unconditionally. 2. Gen2 Autodetect : If no DT property exists, attempt to load the Gen2 firmware image. 3. Gen1 Fallback (SC7280 only): If Gen2 loading fails, fallback to the Gen1 firmware image. At probe time, SC7280 now defaults to the Gen2 firmware descriptor and Gen2 HFI when available. Introduce iris_detect_gen2_from_fwdata() to detect the firmware generation by inspecting the loaded firmware image before authentication, based on QC_IMAGE_VERSION_STRING and classify the firmware as Gen2 if the version string starts with "vfw" or matches "video-firmware.N.M" with N >=3D 2. If the loaded firmware on SC7280 is detected as Gen1, the driver switches the firmware descriptor and platform data to the Gen1 configuration so that the correct HFI implementation is used. This preserves DT overrides, prefers Gen2 firmware, and maintains compatibility with Gen1-only SC7280 devices. Signed-off-by: Dikshita Agarwal --- drivers/media/platform/qcom/iris/iris_firmware.c | 65 ++++++++++++++++++= +--- .../platform/qcom/iris/iris_platform_common.h | 6 +- .../media/platform/qcom/iris/iris_platform_vpu2.c | 11 +++- .../media/platform/qcom/iris/iris_platform_vpu3x.c | 8 +-- drivers/media/platform/qcom/iris/iris_probe.c | 8 ++- drivers/media/platform/qcom/iris/iris_vidc.c | 3 + 6 files changed, 80 insertions(+), 21 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/med= ia/platform/qcom/iris/iris_firmware.c index 1a476146d7580849d7b68c7c15dd7f82f89a680b..481c33c9fb4daa0d547c43f776f= 188c17de6b35e 100644 --- a/drivers/media/platform/qcom/iris/iris_firmware.c +++ b/drivers/media/platform/qcom/iris/iris_firmware.c @@ -16,6 +16,39 @@ =20 #define MAX_FIRMWARE_NAME_SIZE 128 =20 +/* Detect Gen2 firmware by scanning the blob for: + * QC_IMAGE_VERSION_STRING=3D + * and then checking: + * - version starts with "vfw", OR + * - version matches "video-firmware.N.M" with N >=3D 2 + */ + +static bool iris_detect_gen2_from_fwdata(const u8 *data, size_t size) +{ + const char *marker =3D "QC_IMAGE_VERSION_STRING=3D"; + const size_t mlen =3D strlen(marker); + int major =3D 0, minor =3D 0; + char version_buf[64]; + size_t max; + + max =3D (size > mlen) ? size - mlen : 0; + for (size_t i =3D 0; i < max; i++) { + if (!memcmp(data + i, marker, mlen)) { + const char *found =3D (const char *)(data + i + mlen); + + strscpy(version_buf, found, sizeof(version_buf)); + if (!strncmp(version_buf, "vfw", 3)) + return true; + if (sscanf(version_buf, "video-firmware.%d.%d", &major, &minor) =3D=3D = 2 && + major >=3D 2) + return true; + break; + } + } + + return false; +} + static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_n= ame) { const struct firmware *firmware =3D NULL; @@ -47,6 +80,14 @@ static int iris_load_fw_to_memory(struct iris_core *core= , const char *fw_name) goto err_release_fw; } =20 + if (of_device_is_compatible(core->dev->of_node, "qcom,sc7280-venus")) { + if (!iris_detect_gen2_from_fwdata((const u8 *)firmware->data, firmware->= size)) { + dev_info(core->dev, "Gen1 FW detected in %s\n", fw_name); + core->iris_firmware_desc =3D core->iris_platform_data->firmware_desc_ge= n1; + core->iris_firmware_data =3D core->iris_firmware_desc->firmware_data; + } + } + mem_virt =3D memremap(mem_phys, res_size, MEMREMAP_WC); if (!mem_virt) { ret =3D -ENOMEM; @@ -65,19 +106,29 @@ static int iris_load_fw_to_memory(struct iris_core *co= re, const char *fw_name) =20 int iris_fw_load(struct iris_core *core) { + struct device_node *node =3D core->dev->of_node; const struct tz_cp_config *cp_config; const char *fwpath =3D NULL; + bool is_sc7280; int i, ret; =20 - ret =3D of_property_read_string_index(core->dev->of_node, "firmware-name"= , 0, - &fwpath); - if (ret) + is_sc7280 =3D of_device_is_compatible(node, "qcom,sc7280-venus"); + + ret =3D of_property_read_string_index(node, "firmware-name", 0, &fwpath); + if (!ret) { + ret =3D iris_load_fw_to_memory(core, fwpath); + } else { fwpath =3D core->iris_firmware_desc->fwname; + ret =3D iris_load_fw_to_memory(core, fwpath); + if (ret =3D=3D -ENOENT && is_sc7280) { + dev_dbg(core->dev, "Gen2 FW not found, falling back to Gen1\n"); + ret =3D iris_load_fw_to_memory(core, sc7280_data.firmware_desc_gen1->fw= name); + } + } =20 - ret =3D iris_load_fw_to_memory(core, fwpath); if (ret) { - dev_err(core->dev, "firmware download failed\n"); - return -ENOMEM; + dev_err(core->dev, "firmware download failed %d\n", ret); + return ret; } =20 ret =3D qcom_scm_pas_auth_and_reset(IRIS_PAS_ID); @@ -99,7 +150,7 @@ int iris_fw_load(struct iris_core *core) } } =20 - return ret; + return 0; } =20 int iris_fw_unload(struct iris_core *core) diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 0408d51188b27251986780de6b4672b155ab1005..7acb073f719746f57ebaa2afd90= 61db9239f860e 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -257,11 +257,7 @@ struct iris_firmware_desc { }; =20 struct iris_platform_data { - /* - * XXX: replace with gen1 / gen2 pointers once we have platforms - * supporting both firmware kinds. - */ - const struct iris_firmware_desc *firmware_desc; + const struct iris_firmware_desc *firmware_desc_gen1, *firmware_desc_gen2; =20 const struct vpu_ops *vpu_ops; const struct icc_info *icc_tbl; diff --git a/drivers/media/platform/qcom/iris/iris_platform_vpu2.c b/driver= s/media/platform/qcom/iris/iris_platform_vpu2.c index 00d6244bc92fd9216bd7c0e6153689e7d8982a67..8259709ba203eac2230da304816= 6b33892b337b2 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_vpu2.c +++ b/drivers/media/platform/qcom/iris/iris_platform_vpu2.c @@ -22,6 +22,12 @@ const struct iris_firmware_desc iris_vpu20_p1_gen1_desc = =3D { .fwname =3D "qcom/vpu/vpu20_p1.mbn", }; =20 +const struct iris_firmware_desc iris_vpu20_p1_gen2_s6_desc =3D { + .firmware_data =3D &iris_hfi_gen2_data, + .get_vpu_buffer_size =3D iris_vpu33_buf_size, + .fwname =3D "qcom/vpu/vpu20_p1_gen2_s6.mbn", +}; + const struct iris_firmware_desc iris_vpu20_p4_gen1_desc =3D { .firmware_data =3D &iris_hfi_gen1_data, .get_vpu_buffer_size =3D iris_vpu_buf_size, @@ -65,7 +71,8 @@ static const struct tz_cp_config tz_cp_config_vpu2[] =3D { }; =20 const struct iris_platform_data sc7280_data =3D { - .firmware_desc =3D &iris_vpu20_p1_gen1_desc, + .firmware_desc_gen1 =3D &iris_vpu20_p1_gen1_desc, + .firmware_desc_gen2 =3D &iris_vpu20_p1_gen2_s6_desc, .vpu_ops =3D &iris_vpu2_ops, .icc_tbl =3D iris_icc_info_vpu2, .icc_tbl_size =3D ARRAY_SIZE(iris_icc_info_vpu2), @@ -94,7 +101,7 @@ const struct iris_platform_data sc7280_data =3D { }; =20 const struct iris_platform_data sm8250_data =3D { - .firmware_desc =3D &iris_vpu20_p4_gen1_desc, + .firmware_desc_gen1 =3D &iris_vpu20_p4_gen1_desc, .vpu_ops =3D &iris_vpu2_ops, .icc_tbl =3D iris_icc_info_vpu2, .icc_tbl_size =3D ARRAY_SIZE(iris_icc_info_vpu2), diff --git a/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c b/drive= rs/media/platform/qcom/iris/iris_platform_vpu3x.c index 6180104f3b94bf0d5e3206481816802fbd09849d..829dc37b4058101e7dddd484533= 724272b502560 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c +++ b/drivers/media/platform/qcom/iris/iris_platform_vpu3x.c @@ -83,7 +83,7 @@ static const struct tz_cp_config tz_cp_config_vpu3[] =3D { * - inst_caps to platform_inst_cap_qcs8300 */ const struct iris_platform_data qcs8300_data =3D { - .firmware_desc =3D &iris_vpu30_p4_s6_gen2_desc, + .firmware_desc_gen2 =3D &iris_vpu30_p4_s6_gen2_desc, .vpu_ops =3D &iris_vpu3_ops, .icc_tbl =3D iris_icc_info_vpu3x, .icc_tbl_size =3D ARRAY_SIZE(iris_icc_info_vpu3x), @@ -112,7 +112,7 @@ const struct iris_platform_data qcs8300_data =3D { }; =20 const struct iris_platform_data sm8550_data =3D { - .firmware_desc =3D &iris_vpu30_p4_gen2_desc, + .firmware_desc_gen2 =3D &iris_vpu30_p4_gen2_desc, .vpu_ops =3D &iris_vpu3_ops, .icc_tbl =3D iris_icc_info_vpu3x, .icc_tbl_size =3D ARRAY_SIZE(iris_icc_info_vpu3x), @@ -147,7 +147,7 @@ const struct iris_platform_data sm8550_data =3D { * - controller_rst_tbl to sm8650_controller_reset_table */ const struct iris_platform_data sm8650_data =3D { - .firmware_desc =3D &iris_vpu33_p4_gen2_desc, + .firmware_desc_gen2 =3D &iris_vpu33_p4_gen2_desc, .vpu_ops =3D &iris_vpu33_ops, .icc_tbl =3D iris_icc_info_vpu3x, .icc_tbl_size =3D ARRAY_SIZE(iris_icc_info_vpu3x), @@ -178,7 +178,7 @@ const struct iris_platform_data sm8650_data =3D { }; =20 const struct iris_platform_data sm8750_data =3D { - .firmware_desc =3D &iris_vpu35_p4_gen2_desc, + .firmware_desc_gen2 =3D &iris_vpu35_p4_gen2_desc, .vpu_ops =3D &iris_vpu35_ops, .icc_tbl =3D iris_icc_info_vpu3x, .icc_tbl_size =3D ARRAY_SIZE(iris_icc_info_vpu3x), diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/= platform/qcom/iris/iris_probe.c index dbc15edc602b72fdec8bb2d8d3623676afee728c..898260a1a1ea65ba8e082b1d1df= 0ef5f34a733eb 100644 --- a/drivers/media/platform/qcom/iris/iris_probe.c +++ b/drivers/media/platform/qcom/iris/iris_probe.c @@ -251,7 +251,11 @@ static int iris_probe(struct platform_device *pdev) return core->irq; =20 core->iris_platform_data =3D of_device_get_match_data(core->dev); - core->iris_firmware_desc =3D core->iris_platform_data->firmware_desc; + + if (core->iris_platform_data->firmware_desc_gen2) + core->iris_firmware_desc =3D core->iris_platform_data->firmware_desc_gen= 2; + else + core->iris_firmware_desc =3D core->iris_platform_data->firmware_desc_gen= 1; core->iris_firmware_data =3D core->iris_firmware_desc->firmware_data; =20 core->ubwc_cfg =3D qcom_ubwc_config_get_data(); @@ -271,8 +275,6 @@ static int iris_probe(struct platform_device *pdev) if (ret) return ret; =20 - iris_session_init_caps(core); - ret =3D v4l2_device_register(dev, &core->v4l2_dev); if (ret) return ret; diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/p= latform/qcom/iris/iris_vidc.c index 807c9a20b6ba17fdda8e7e91956bdf19e83a3ad8..6fbc20366f5fd3a80468d90d813= 851ecf54e4cef 100644 --- a/drivers/media/platform/qcom/iris/iris_vidc.c +++ b/drivers/media/platform/qcom/iris/iris_vidc.c @@ -9,6 +9,7 @@ #include #include =20 +#include "iris_ctrls.h" #include "iris_vidc.h" #include "iris_instance.h" #include "iris_vdec.h" @@ -196,6 +197,8 @@ int iris_open(struct file *filp) goto fail_m2m_release; } =20 + iris_session_init_caps(core); + if (inst->domain =3D=3D DECODER) ret =3D iris_vdec_inst_init(inst); else if (inst->domain =3D=3D ENCODER) --=20 2.34.1