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 E9C9A3D8900 for ; Tue, 5 May 2026 07:01:16 +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=1777964478; cv=none; b=ivYCoTwTGjxDRcZTQxa6iKVBzlAxi59FE2WBH8Gsr4BSNg6aQDaUVpNDB0ar0eqf7WAm2GPUK2fWkQi33k0rL0cN+zu9ZleBKjc035BOFUj90XvAL4/eiP0A5JHtdk/HT/LJ+275HWPkhOhTVylD5FA93uGkE2xDvEeddE/1LC0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777964478; c=relaxed/simple; bh=5XMD1PTwD/LTxgA60yhE1YYtYnYGkszZwhjmWff2fnQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iKBVXhMjQWYCKsZ+dATdUAMCyGCBht+kNzso52/Q3sv7Y0U3qsqhsYuN2qyEScma1sbnB99mKY4kS2ESnaFPNjM8P3dXu5DWWGQEX7lXQrD5rWsAALK2d3c7LnTdPTyMRCHU/SDCNiRmnsybrRqzwf67xK7JXZlCVxkbHFHQqZk= 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=J3FHkjV5; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=CuCXAl6K; 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="J3FHkjV5"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="CuCXAl6K" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 6456Xqlg1960438 for ; Tue, 5 May 2026 07:01:16 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=J3FHkjV5BQraMdqC kAD9aZxpOLLVPgmuABNr/GrGm41LSrvBL9i6omnAjZTK7Pjg109VdyzAAFuiN06/ 7cSzvRTXofMHnE++Q8pNv5QfojH6erN/3BXTOQIXVfpMQQsOHjjijVZaoVe+7S8O a+rWx2pnAP4x0KbiK0uTkmHD0BjDB/GzzHUAcVw64nLSOI7MtqatHDVmXisIVMvV ShIWpoAyIktLu56dw97yeGVAsdwPJoI5+r2LgQ3Ix1dkDJNjyCvqqxD47urXwHcx muqO6B5gDg5zaWHSlDrxLaYJlNAITu+iHknkrxCFmq8PMns/3CqcsgN9HXS0Daeg qLFREA== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dxw5du3tv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 05 May 2026 07:01:16 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-35fbb57764aso6300269a91.1 for ; Tue, 05 May 2026 00:01:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1777964476; x=1778569276; 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=CuCXAl6KZXIAltE80aXmGvAi7i5sPxzNMHxqSgJSAK6zO9yqQ3wGH/uglMDkc6G80n WNl8AZKefG7I3UBeeDwy73nZjSijoEu4Y1LmbDeO2xtpVQeZfwikme4xj/cLNmLRWJhm kl0x/F6d2mSjYAHmvvsVquDL7AgVjXAFwYMGy5r48o99jh91U5FJU3HBokGJ/+Mngyz/ 7Q0Jn2XiQBIKzCrzj0hw3EN19lhxI8ndQJ+UZCMPreg4OsGYFXbdHQ13Zw5yjkqWnWGb 7npl90GSQGbT9hWYCA8AnQ1B+vxnOLiTYo2aFRwXq3dljzn4cHAmn7MzoPSrenIGkBWT YG+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777964476; x=1778569276; 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=RXitcCwl2Mx6XP04nC1WPjzM5lhhhb1AQRPJc8v6wLksqw++vOUk4p1X0r1nct8eF6 Ovy/3pv64YB2yFDiZHods6xmX848rhVZw04rhdMc7CP8hfWmo0DdGTSp16JPbQ/KfmeJ Lqmgwa4s+3aUGlxETi7hShlAnUGdVPK5mDHeYavYy88aXkBdvZn/Ttvpn5dDBaXS9nUA LKJqf0m91o3x0DnER4jRNuPENhmRHPIgKMHt5UxwKjJvwLLPD/Mh8yJ4jR1llNGh7qQ1 m6UdMeDZYnpkfIHrIBIp8XvUEdpon20utX0UPrb+sBlpiI+uA2sLgdVSTyw5cmPJ5XsS EExA== X-Forwarded-Encrypted: i=1; AFNElJ923hGJJoQlDXTUZgeGuSmKuxovhDoqSyNNWLEwVPypFWwijo0FZB3N4796wGwYMwEysDR3Oc11tMgWjv+V@vger.kernel.org X-Gm-Message-State: AOJu0YxSmCirMjZVwZlBnYQqtLDQXRj7PeAxgyCTP9AFdqM3KWc+mEya jzvdsdM3fPAU/JzlqidrqImw+HkFCK/kVfhVyQW2OCN62woqwzRVw6NwfiXKbY5eCQdekJ3lJV8 SaxsOgsB1QwDiCse3Je4HbUh3HyufKWjPhWJytUUu9p6kIIDCj9969obCRiMVW7w8nmfB X-Gm-Gg: AeBDiesODcrKxCAfLoEULBmpd48X5ypZjYHrPEoOS9HAgLrZI9dRpUx7muFByrJ0rBx llmPyElJGjUxgEIR0oVRo1fIDxMMqKTfsYlslJ9rGc5hgiVtmQlezJ2a8zwyoA26IDG3mn4i1JK 0SMQQRTZW6K9v+m/JNJ0m4w7I04+t6qeHX3T6CMnE1s9N/rM0VnngfybhN+NN36Q1H01vskWXZU cADl9rkmuneX+8UWxHSMy0dWjyDWYtRo5NSJUZob076jOK/PvPbC3j0cU5v9tljjv0KCa6ei8dU n8YE4/GZ7nPFJDSpqf/sd6F+vH7Aa8bTf5pnxPRzKXZ/qIwKobqTdznEqJX+3X0FXALE9HU1Lv4 eeTkFUDZrg1H2FcejiKI50haLeG3HoejxobMAXRDJp9FYCZropbefl+NzgNqJ3z/ndg== X-Received: by 2002:a17:90b:17cf:b0:35f:bc9f:e1b6 with SMTP id 98e67ed59e1d1-36572255b88mr1898111a91.1.1777964475588; Tue, 05 May 2026 00:01:15 -0700 (PDT) X-Received: by 2002:a17:90b:17cf:b0:35f:bc9f:e1b6 with SMTP id 98e67ed59e1d1-36572255b88mr1898074a91.1.1777964475032; Tue, 05 May 2026 00:01:15 -0700 (PDT) Received: from hu-bvisredd-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-364ebec73aasm13840146a91.2.2026.05.05.00.01.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 00:01:14 -0700 (PDT) From: Vishnu Reddy Date: Tue, 05 May 2026 12:29:28 +0530 Subject: [PATCH v4 07/13] media: iris: Enable Secure PAS support with IOMMU managed by Linux Precedence: bulk X-Mailing-List: linux-arm-msm@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: <20260505-glymur-v4-7-17571dbd1caa@oss.qualcomm.com> References: <20260505-glymur-v4-0-17571dbd1caa@oss.qualcomm.com> In-Reply-To: <20260505-glymur-v4-0-17571dbd1caa@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=1777964421; l=6587; i=busanna.reddy@oss.qualcomm.com; s=20260216; h=from:subject:message-id; bh=+wQbHvxygQq1aTrGxrx3UsURZ3ABehuwxnmcohM5NBw=; b=WK87IIKqHhNQTBnHiTr/VGjkaSzt7Spi/HEsDwkgLA5pdII9e20G79MnQQxJYv0n1Ou7txiJM ElYBBpq6C4pDYoegAU9CGNSsNEA7Swj1oGFnz3FadtXfP0EsDusw/Au X-Developer-Key: i=busanna.reddy@oss.qualcomm.com; a=ed25519; pk=9vmy9HahBKVAa+GBFj1yHVbz0ey/ucIs1hrlfx+qtok= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTA1MDA2MyBTYWx0ZWRfX4HFZL3aP2fnm IZWJ4xqm4jlycsb9E4iyw0He+u3+7w6V45RLMcmt81fbeje3D/qI27ncA2CGfwykMXs3LnKeXCV Hn8o7oaEbKJIY1iSjuNmVBtkK+KfeL77jtE/tVZ69U1LOJZkPp6DuWJd9iQsoS1/9lkLaMYjsRj OXOHTAKvaFkb4LUBIEEZ4ylYfku8oIb2q2cJPMh8tqcnSSiS/siR+I5AjkxWgNyMo0OHJ7+c+Gc mBAvJc0w5fWY5ejiVnqovZqbhGx68vQwV55AqnqijAEc8uX9e5vS4JB7Tho6SwTpMX3bmYZEP81 OofHEYkytdNrfSyW6EyxufA3m9vxHhlbK8pIEheqSfHPPqZDtolu2WSmWuw2yWcS1Wd4RMmuisy qjckdgceTLj23eqVdFI64q/+MaTd71MuSXROnZc0z/lBRoUpghUOMPNyNQk1w7wR0Vh49xeyXc2 DuuUL7hRIYxDowtIBxg== X-Proofpoint-GUID: N2tB0X4h4-SJKsK6-3abEN1Yz-z2Bl7t X-Proofpoint-ORIG-GUID: N2tB0X4h4-SJKsK6-3abEN1Yz-z2Bl7t X-Authority-Analysis: v=2.4 cv=HpJG3UTS c=1 sm=1 tr=0 ts=69f995bc cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=gbwaY6mYjfx-u0ET_fsA:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 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-05-05_02,2026-04-30_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 priorityscore=1501 lowpriorityscore=0 bulkscore=0 impostorscore=0 adultscore=0 clxscore=1015 phishscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604200000 definitions=main-2605050063 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