From mboxrd@z Thu Jan 1 00:00:00 1970 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 315CE33C183 for ; Tue, 28 Apr 2026 03:56:41 +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=1777348602; cv=none; b=hhnxwlRFXrdf+xGJDMOEuMV3sIlILKrPTaAMkuzHdt+Em/4klzVrztQosICh6MCzAbqwSQtR228Z/kWKdRn+e3DqfByLq+DSNdtVYOz2lqtrlhEeneo0+Gbs8jkfAKR1uo7k/v1dHxa6tQxC/1e0vstSDuAivRzvD8EFiFupkJ8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777348602; c=relaxed/simple; bh=5XMD1PTwD/LTxgA60yhE1YYtYnYGkszZwhjmWff2fnQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lA1/WZ3fuNzRTJJtspW1RrcO1lTcs8rZm/NfBfQHC+BVryomWS8MHoRssJCC2O2CYe1au6ezGnd0fFlu0FyTzE/IuAhYTU8g+ei68U1lgW4QR7mj8n3dAv9/G8WikSj0QkXta9V0fIzNeXotAsom0KLHqdL0D5pnq2ch4MoUyrU= 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=jt5EHOjO; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=PeI1P2Fe; 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="jt5EHOjO"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="PeI1P2Fe" 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 63S21iBc3123758 for ; Tue, 28 Apr 2026 03:56:40 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= bTy4Bkwh+gr6ISqDQC1YSZGoQJgQwg2cLAvk32oAfkI=; b=jt5EHOjOmtMzLjTi hvVfhUtmN6v6g7AKAcwYnAfzpHNlpdmIYXmo6uP0LNMEc/+m/nAvHn61k1InATl7 7JKJ/nwW2Qt4Uq4bMY2uYaulZhAuEQb25dnKcCHgB2oRVXNRZQg6jZDCkEIHZMTd lPOdslwn/fFjGgv010aAbKN70AxOnjNJtMzsul6BFSHSx7h2gc5VPAxMf/QrlU2L +QS+zZ2dDxKUKb5QtmQxToTb8cpz5klIRGAKgBDtPJioWOY308NxhNRNCv32uS3t hPrrhqr6Q72gUlhBLqoFhk+jnEFbcjR6IvV1IBj5/icLkJ02Vb034bUO+HHXyQ6K RJIiPQ== Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dt5qgkmc6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 28 Apr 2026 03:56:40 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-3568090851aso25976660a91.1 for ; Mon, 27 Apr 2026 20:56:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1777348600; x=1777953400; 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=bTy4Bkwh+gr6ISqDQC1YSZGoQJgQwg2cLAvk32oAfkI=; b=PeI1P2FeqWcjvgtie7Eg1oDDIXMAHo04WYxqEXa2hUzuF3g3m59VmF1pOjtfOJVIq2 oS1SJv3AZK+NjLsJZL0Ceoc4DCx7SVvtV2zL83TriBCow/VVktLhPUGk2B4nHS/usAI8 bsCOlbyI53gV5Fnyr1TcFxo0dGQf8g4wlsw7TH+vqENwNR7bTr2KYURHJfYMap93zWws 3hu3NrbLDH7JTj/TklH7+19V/lSbdZx0+AuuussZn+Dtz2YLr1g1vptW2VgSU9lwpHV+ 5o18tLhfFXKNLoeyNAB98XcRoHY95cOxwfckjY+gZ+PYVdsUf2WmIDZcYUQuRLufpOrm 8CzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777348600; x=1777953400; 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=bTy4Bkwh+gr6ISqDQC1YSZGoQJgQwg2cLAvk32oAfkI=; b=RB7s4YHIGQ9tAAhiDZ4uORP8YkicBR/J3Z9+6TcLTyib0oPjzHmOyLfOR38td7g2Up uNhmXqomZMYTPkKFA1RRVDTNA8b7zwJEO9ZDuV1bDpOWnZUbg9NihBfNE9n/b5PSp0Ja gSXzTjD29lyjUxjYMhfJNAohRl6ese+uC6LJAwTxM9zZHlXh42qndpxG0l7G4ZUTelWG W7Nxp1iFCHuDUwfGnzbtEQytMcGelA98fgRlxmHfZHTLXxhG/OppBAiyjitsInGxr5kb HH0XhgzPbgVPYft/dwuRMefcSOdFoSu090V1964g1JtAR7afXhtjM/xScqKpCJ1q1dMM bNIw== X-Forwarded-Encrypted: i=1; AFNElJ8cyd4DdfDIG8opVBXWZfBC7yjLVgmdNjg+FjLqaJ94UwpDA2Vy1U8DPrmqE0dnAo4LDLjINFK4o2Bd@vger.kernel.org X-Gm-Message-State: AOJu0Yx5aKwxRJsA/oqGZOo2/Q93udOMgSzmMx/XHod/aBC/q6jQUjnt kBRMUx7Cg3xGif9wcXIKm6u30aJfTzSDRFa5JJo3xXfamjyE+IZ+5CRFgHu0CalqV4w37P368vj tVDVWdI1ogoj8o/uvEUjHIp1HoA1TEYoFv2aFL1z9wkJdRcFq3p9+IIIrt2nOHk48 X-Gm-Gg: AeBDieuclVwt7dvPGubNJAHncNW/3cXskgPEn7p6D+LI/QM9J7o3oSraM87Ogfj1pob dNYg5uRs4W3xYG4PkqBoiHboAbrSLdtaMzAK3tSvnbM1ibeCWdn2I3HIDuoZQLh2bURGbdZfhuX BxZEeXbsVz3eSHOxFGsQZaeqyosA8MBPBAjhBN+bOGERcZzrcC6m+BUiqiGnPV66hEIeLKVy63E Nm7zlAogNc5GmUaYlsSOCzftI3sAd5OQIt+NA8OQw1ZRXcl3JNcagatRVvNi1Q1vQLjHF+2WN/I fnUqH3Vq4OVF8qkTNRgOgVA4nL3tlGoenxkpMl1Dr4PpCycB/O4cZCZ0dpO40rqF4/IcpYsG0bn YP6ZWqK5AfNjDlvzYdgxsUC5qoTwXfFsdLZYjQPD+RY+r1jqpm53b1NmA8UX8yDDhlQ== X-Received: by 2002:a17:90a:fc4d:b0:35e:57cf:c0a3 with SMTP id 98e67ed59e1d1-36492077fe8mr1448159a91.26.1777348599685; Mon, 27 Apr 2026 20:56:39 -0700 (PDT) X-Received: by 2002:a17:90a:fc4d:b0:35e:57cf:c0a3 with SMTP id 98e67ed59e1d1-36492077fe8mr1448108a91.26.1777348599180; Mon, 27 Apr 2026 20:56:39 -0700 (PDT) Received: from hu-bvisredd-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-36490905648sm393888a91.4.2026.04.27.20.56.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 27 Apr 2026 20:56:38 -0700 (PDT) From: Vishnu Reddy Date: Tue, 28 Apr 2026 09:24:12 +0530 Subject: [PATCH v3 06/12] media: iris: Enable Secure PAS support with IOMMU managed by Linux Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20260428-glymur-v3-6-8f28930f47d3@oss.qualcomm.com> References: <20260428-glymur-v3-0-8f28930f47d3@oss.qualcomm.com> In-Reply-To: <20260428-glymur-v3-0-8f28930f47d3@oss.qualcomm.com> To: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Hans Verkuil , Stefan Schmidt , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Stanimir Varbanov , Joerg Roedel , Will Deacon , Robin Murphy , Bjorn Andersson , Konrad Dybcio Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org, iommu@lists.linux.dev, Vishnu Reddy , Mukesh Ojha X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777348550; l=6587; i=busanna.reddy@oss.qualcomm.com; s=20260216; h=from:subject:message-id; bh=+wQbHvxygQq1aTrGxrx3UsURZ3ABehuwxnmcohM5NBw=; b=Le+OHX1qkXM83hmvcoX3+cLYts84Kbt1q+4H7HJtz4T4o/TbiOL1LnwC6P7Aqgq/8ltSpl1oQ jpGgQr298FACq+WA40ceRRYgexnnkDm7KZ7FLcGy49M87sLu0tAacar X-Developer-Key: i=busanna.reddy@oss.qualcomm.com; a=ed25519; pk=9vmy9HahBKVAa+GBFj1yHVbz0ey/ucIs1hrlfx+qtok= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDI4MDAzMyBTYWx0ZWRfX47Ve8On7Bs6Y I2TlHgbYCGoBhu+sh8hLMhQRNew1to0F3NATGYqxYkf4uNBaPoTHMjgj5ko5d0KJNcdoMN5N/uF jI/tG3SdnNhAbCM4iqiOuHaxhFz27FaYqXUQhNlRZbxeltrGxgjX0cRhouRGNgMKvQFMVsNCdYH 9rmIevxxRgEESj4NQQEG3fZ7CxYHGWtIKPE9zd4mNAxzwfxwn6f5kIVLK6E62cBuf18bJu1PPTN yeZ5DW8L1qMeotnVMVBAOYB7TxPt4rdhudtdGZBls5LIUuHclPr42cmBEaQ18MW93rW7JW+2DlJ YYC4gmGfZi2ThoQ9bwakxoKg6+jaE94UqceRixDGw/siq0NT4O4DcBlGD7qL632A6tfNcDxAlDm wP5SLRUIWpartB60zRM1bi1hCkzkdzFRHRbDSq49zqyb15v18MgOaRfkLXUzgnI8vKZ75zaiQYC OXzoNPK4zjLOTzlL3xg== X-Authority-Analysis: v=2.4 cv=V69NF+ni c=1 sm=1 tr=0 ts=69f02ff8 cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=gbwaY6mYjfx-u0ET_fsA:9 a=QEXdDO2ut3YA:10 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-GUID: wa7leiiM_1OXGXkerBmfo8Oo3YKQOzft X-Proofpoint-ORIG-GUID: wa7leiiM_1OXGXkerBmfo8Oo3YKQOzft 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-04-27_04,2026-04-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1015 suspectscore=0 adultscore=0 spamscore=0 phishscore=0 priorityscore=1501 bulkscore=0 impostorscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2604280033 From: Mukesh Ojha Most Qualcomm platforms feature a proprietary hypervisor (such as Gunyah or QHEE), which typically handles IOMMU configuration. This includes mapping memory regions and device memory resources for remote processors by intercepting qcom_scm_pas_auth_and_reset() calls. These mappings are later removed during teardown. Additionally, SHM bridge setup is required to enable memory protection for both remoteproc metadata and its memory regions. When the hypervisor is absent, the operating system must perform these configurations instead. Support for handling IOMMU and SHM setup in the absence of a hypervisor is now in place. Extend the Iris driver to enable this functionality on platforms where IOMMU is managed by Linux (i.e., non-Gunyah, non-QHEE). Additionally, the Iris driver must map the firmware and its required resources to the firmware SID, which is now specified via iommu-map in the device tree. Co-developed-by: Vikash Garodia Signed-off-by: Vikash Garodia Signed-off-by: Mukesh Ojha Signed-off-by: Vishnu Reddy --- drivers/media/platform/qcom/iris/iris_core.h | 4 ++ drivers/media/platform/qcom/iris/iris_firmware.c | 72 ++++++++++++++++++++---- 2 files changed, 66 insertions(+), 10 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_core.h b/drivers/media/platform/qcom/iris/iris_core.h index fb194c967ad4..b396c8cf595e 100644 --- a/drivers/media/platform/qcom/iris/iris_core.h +++ b/drivers/media/platform/qcom/iris/iris_core.h @@ -34,6 +34,8 @@ enum domain_type { * struct iris_core - holds core parameters valid for all instances * * @dev: reference to device structure + * @fw_dev: reference to the context bank device used for firmware load + * @pas_ctx: SCM PAS context for authenticated firmware load and shutdown * @reg_base: IO memory base address * @irq: iris irq * @v4l2_dev: a holder for v4l2 device structure @@ -77,6 +79,8 @@ enum domain_type { struct iris_core { struct device *dev; + struct device *fw_dev; + struct qcom_scm_pas_context *pas_ctx; void __iomem *reg_base; int irq; struct v4l2_device v4l2_dev; diff --git a/drivers/media/platform/qcom/iris/iris_firmware.c b/drivers/media/platform/qcom/iris/iris_firmware.c index 5f408024e967..0085dd7ec052 100644 --- a/drivers/media/platform/qcom/iris/iris_firmware.c +++ b/drivers/media/platform/qcom/iris/iris_firmware.c @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -13,12 +14,15 @@ #include "iris_firmware.h" #define MAX_FIRMWARE_NAME_SIZE 128 +#define IRIS_FW_START_ADDR 0 static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name) { + struct device *fw_dev = core->fw_dev ? core->fw_dev : core->dev; u32 pas_id = core->iris_platform_data->pas_id; const struct firmware *firmware = NULL; - struct device *dev = core->dev; + struct qcom_scm_pas_context *pas_ctx; + struct iommu_domain *domain; struct resource res; phys_addr_t mem_phys; size_t res_size; @@ -29,14 +33,18 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name) if (strlen(fw_name) >= MAX_FIRMWARE_NAME_SIZE - 4) return -EINVAL; - ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &res); + ret = of_reserved_mem_region_to_resource(core->dev->of_node, 0, &res); if (ret) return ret; mem_phys = res.start; res_size = resource_size(&res); - ret = request_firmware(&firmware, fw_name, dev); + pas_ctx = devm_qcom_scm_pas_context_alloc(fw_dev, pas_id, mem_phys, res_size); + if (IS_ERR(pas_ctx)) + return PTR_ERR(pas_ctx); + + ret = request_firmware(&firmware, fw_name, fw_dev); if (ret) return ret; @@ -52,9 +60,27 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name) goto err_release_fw; } - ret = qcom_mdt_load(dev, firmware, fw_name, - pas_id, mem_virt, mem_phys, res_size, NULL); + pas_ctx->use_tzmem = !!core->fw_dev; + ret = qcom_mdt_pas_load(pas_ctx, firmware, fw_name, mem_virt, NULL); + if (ret) + goto err_mem_unmap; + + if (pas_ctx->use_tzmem) { + domain = iommu_get_domain_for_dev(fw_dev); + if (!domain) { + ret = -ENODEV; + goto err_mem_unmap; + } + + ret = iommu_map(domain, IRIS_FW_START_ADDR, mem_phys, res_size, + IOMMU_READ | IOMMU_WRITE | IOMMU_PRIV, GFP_KERNEL); + if (ret) + goto err_mem_unmap; + } + core->pas_ctx = pas_ctx; + +err_mem_unmap: memunmap(mem_virt); err_release_fw: release_firmware(firmware); @@ -62,6 +88,18 @@ static int iris_load_fw_to_memory(struct iris_core *core, const char *fw_name) return ret; } +static void iris_fw_iommu_unmap(struct iris_core *core) +{ + struct iommu_domain *domain; + + if (!core->pas_ctx->use_tzmem) + return; + + domain = iommu_get_domain_for_dev(core->fw_dev); + if (domain) + iommu_unmap(domain, IRIS_FW_START_ADDR, core->pas_ctx->mem_size); +} + int iris_fw_load(struct iris_core *core) { const struct tz_cp_config *cp_config; @@ -79,10 +117,10 @@ int iris_fw_load(struct iris_core *core) return -ENOMEM; } - ret = qcom_scm_pas_auth_and_reset(core->iris_platform_data->pas_id); + ret = qcom_scm_pas_prepare_and_auth_reset(core->pas_ctx); if (ret) { dev_err(core->dev, "auth and reset failed: %d\n", ret); - return ret; + goto err_unmap; } for (i = 0; i < core->iris_platform_data->tz_cp_config_data_size; i++) { @@ -93,17 +131,31 @@ int iris_fw_load(struct iris_core *core) cp_config->cp_nonpixel_size); if (ret) { dev_err(core->dev, "qcom_scm_mem_protect_video_var failed: %d\n", ret); - qcom_scm_pas_shutdown(core->iris_platform_data->pas_id); - return ret; + goto err_pas_shutdown; } } + return 0; + +err_pas_shutdown: + qcom_scm_pas_shutdown(core->pas_ctx->pas_id); +err_unmap: + iris_fw_iommu_unmap(core); + return ret; } int iris_fw_unload(struct iris_core *core) { - return qcom_scm_pas_shutdown(core->iris_platform_data->pas_id); + int ret; + + ret = qcom_scm_pas_shutdown(core->pas_ctx->pas_id); + if (ret) + return ret; + + iris_fw_iommu_unmap(core); + + return ret; } int iris_set_hw_state(struct iris_core *core, bool resume) -- 2.34.1