From mboxrd@z Thu Jan 1 00:00:00 1970 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 8C27B2820A9 for ; Tue, 14 Apr 2026 05:01:02 +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=1776142863; cv=none; b=Ueas/713BXedJnxSpdyEytmIpCwwwAxt0JTKvzpx1FR5kbExnfb9/XMB4fVZlmrIks7SV8PjaWjINFGczSSQ78wY+8bGzb9TbYxQiXgL+bwrL/TNQARKazlYtlKOTbrtz621hrm4ohGNlpeLcyZ0VlskTnHkyKAc+8JoIqHLSD0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776142863; c=relaxed/simple; bh=edy2kMVwJlZrgW1tBAid4oqEWe4R7zlJ4fxPhhm9PSs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tldF7ZEfLv606bFisnH8L0EB3Autn7KOjVLsqSAuoMD5iB3LwDRN+UA8b02W+VKTyc2dlo1VS5Mxj3KUPI4WosLohkdUULvmEWeRljDTCf+7DLeDnn74XbhCMuuQ0VqpJpMIhmBgs/eGKDFrTzLPpJmLGC1motnRMz0T8bHoUxo= 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=L5L3neXs; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=YCXBJYGw; 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="L5L3neXs"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="YCXBJYGw" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 63DLBIb82510997 for ; Tue, 14 Apr 2026 05:01:01 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= VsDgmQ4paNxvBDrunB3lIADe+Nf7UCMYP+LaiT3KX5o=; b=L5L3neXsZs848hg/ l6VdIGmUzEXMYr19S+e8iv7Xy3hoDBcEIABJvCB1916Q4cyYVGs3YKdypRtJiiY0 BAMmxssGm4N6UoWYH/4ahQhg9nVkJodsWnwrc5n0X1JC5LYao6AQOUkVp6e1eJxO rlcbV7X2Wqm/SiLxW5hzDfJ+l4fhF75WDPdCC/3ORz6UAg8dIPJ/hm7+MBwFomuM KI+2v/RDMbFDetThWntSa0enKl4LkMs6+pGrMlxNHloiZJ9wGPi2cutaBsYvX2v/ AdSgZ7fOQlmM3IIkJg6NGRSPjHD+sZpUfjFovc08+Clj/e3SZwRdJd+KR5IejFZt wCX3nw== Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dh867s22g-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Tue, 14 Apr 2026 05:01:01 +0000 (GMT) Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2b24af7ca99so72856815ad.1 for ; Mon, 13 Apr 2026 22:01:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1776142860; x=1776747660; 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=VsDgmQ4paNxvBDrunB3lIADe+Nf7UCMYP+LaiT3KX5o=; b=YCXBJYGwYSFbrShUKuYZbFK+ny6I/ZPH6pUBW6U+h/zeenR5YJooH1ke3SUjpI5UHT 5aXTCRn2CFeK6oaefyILNua9/BEXXv6v+cHGVvolCpdDY/LOkrzGA4yijFceh70wUc1D V6HQOX2BIiCLu9K8ZEj00QP+JanshafwAZpEvbFopYP4Zsl8bzWGKOchrEEP4uqYEBPZ uGpoZfHPFszpxcD33wisHPXYtjIhYQgvWG4kqCFOz6nwhkOp1rFa2tumBEY4pO94WkDW /0LYVOgXj8VnFm3qZiDs3qvokwu3dXqedaT/HgL2lIaBxWVnhCuwxmjOSMYHcXvjzM3S 367A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776142860; x=1776747660; 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=VsDgmQ4paNxvBDrunB3lIADe+Nf7UCMYP+LaiT3KX5o=; b=IUNeO8twj8IeNw7+r1piOX1ILBaIlS3Mi1c8RVL/9G3PbDtujDECT1lQXrDvZZBkjx sAPuqb67S/wf6BtrXFaX4rrZQUyLylD3UNks0riIHu3ZT+PLjaa1obSp13xcCXz1NV7U KEIw1l6cSeZqFt2KwiTNUaTm0BjT6yL7Djd6edQcO6+4hm21pXLMlXwwxEwG1T2KhPkN iWkG5NJTuRlP0NKw/9BgVUllRBmnveL4flokVa8ByT+9HL0vVs+h7JTxR1MGTPMnB83A NNd9KtEsWlMrAdlzlXy5jNck8nJtOdTFEUDoByDrcBINcGioADxNyCBtYvEq9T9IZifA aM8Q== X-Forwarded-Encrypted: i=1; AFNElJ+W8V6zrBiQeForXcHfzozlnFBZxQTHiwhQo+Nxl1FHA0Ifv7FL/gc1+Rhd7GVOBIfdAgVsfRG3GZ5AaM4=@vger.kernel.org X-Gm-Message-State: AOJu0YzUuYrP8R0MsGGlJUzii72KbUyKh3UV51t9IuMc1Ru5ztIDHG8n mfdUrjaCuXPgyDc9gnfe1oAjB8cpsIpZ9HXuAM2GfY09442xwwOQ+UZ2ReUHTte37LVvn//3A6e DOVPLR8sWmfPdIRu6Fk5+XkQp/35nvghF+pU7rFndEN1V0BL/309fvBXZJnnPfgr8dc0NNHuBA9 E= X-Gm-Gg: AeBDietAzWECzbQEe35Aw0RSHXpcHpBT0zAQmg7tIWCHZt9FlMgnpGqCJ684lMRbQ+i 5pqBPCbHqzwpHRHbPT8j5eE/UJXaUWy4Wr8PM94Jt6QQQiG6JEh4l3rfvDMAXacrjECBGDWMaU2 6Q9nM4UcVNyS203Bv1g9f/P+8eLvUO8/COW1OOAGE7LfiZuAJmE7OjbCkV9JsLan/i5SJ5pxaZK x6jKzR0RkLQfNtBW8uEJfh76B7vyUYnYMOedRRnXfmGbZFuQUFKN1J759HeKljiM1pD+razqD/D XnVJhnbOxc2W2aZQwmHvHkT1kBtCtG/0VHetNbEv8p1iKvFnZ0RLYgzyW23POHp1GfIXmq7m8u5 DWVNFeMwwhy+DgCU3+PuDQQON/DvOzS70Gwxcr6cEgp3twlaQALaK/TE= X-Received: by 2002:a17:903:2c10:b0:2b2:e6e8:3c09 with SMTP id d9443c01a7336-2b2e6e83e45mr89105275ad.40.1776142860047; Mon, 13 Apr 2026 22:01:00 -0700 (PDT) X-Received: by 2002:a17:903:2c10:b0:2b2:e6e8:3c09 with SMTP id d9443c01a7336-2b2e6e83e45mr89104685ad.40.1776142859413; Mon, 13 Apr 2026 22:00:59 -0700 (PDT) Received: from hu-bvisredd-hyd.qualcomm.com ([202.46.22.19]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b2d4db198asm134678425ad.3.2026.04.13.22.00.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Apr 2026 22:00:59 -0700 (PDT) From: Vishnu Reddy Date: Tue, 14 Apr 2026 10:30:01 +0530 Subject: [PATCH 05/11] media: iris: Enable Secure PAS support with IOMMU managed by Linux 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: 7bit Message-Id: <20260414-glymur-v1-5-7d3d1cf57b16@oss.qualcomm.com> References: <20260414-glymur-v1-0-7d3d1cf57b16@oss.qualcomm.com> In-Reply-To: <20260414-glymur-v1-0-7d3d1cf57b16@oss.qualcomm.com> To: Bryan O'Donoghue , Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Joerg Roedel , Will Deacon , Robin Murphy , Bjorn Andersson , Konrad Dybcio , Stefan Schmidt , Hans Verkuil Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@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=1776142821; l=6543; i=busanna.reddy@oss.qualcomm.com; s=20260216; h=from:subject:message-id; bh=AK/IikVbNscMxyS51GbRl4z1SBPDNtAAb/8F+AsSepE=; b=L2f4JzXOExhbuC0QmwJjObxFietbVV6/UlJnKknEqH/nhBNVsZBo6DSZ3kjuaQRH8kxVlLYQu /gJ7ARIx+pPACOhxXHylsS+h9GM3TQp7p5K+BNwKSqDJZAjdQvGWPkb X-Developer-Key: i=busanna.reddy@oss.qualcomm.com; a=ed25519; pk=9vmy9HahBKVAa+GBFj1yHVbz0ey/ucIs1hrlfx+qtok= X-Proofpoint-ORIG-GUID: A54loSAnu_qvm-h_faaZFQaZdxzOX0HY X-Proofpoint-GUID: A54loSAnu_qvm-h_faaZFQaZdxzOX0HY X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNDE0MDA0NSBTYWx0ZWRfX5ZfQD2RjtuBO mVIPGHSSOxmzU9TVjrSbump8st+ik/atS4q7xb8PIwSNc5EfB0DU0aC4eHfKmlUIJKKJUIliLwL 6UE6zSV6omFoVZNrewKZDrRHhecezXpvsn5kQtfqlpWwIs1m2AYKV21+y/udnt8aTNxwgb4HXy/ OYkpzy1NCB6TEgGlwCP81ti0UR/qVZb0jd5LJAsk2zCWfq5pqQkBzzYQ2H7m3wTulEqHta2JFZO 16AjZ3t4iiko0M4OcEuTwsulrX/6vG1bNle7j87HyV8CYkIIJY/RbroyuoSgNpgnpL8Et+FZFZY GC4knH6GjAuV/gCyu01HOqrreQmeiCkggiukzp86YAa8hLYrjtarDW86ChQbwurJZJGDKroQWM7 UBP/2dx2NAN4HbutUbrG2kch2AeX1T8rUSR0kJn+TYpXIZPyuGxXMcQVLpnu2V+SdumfyQIM7L1 1FDrm79yxYYxmMlJIrQ== X-Authority-Analysis: v=2.4 cv=etzvCIpX c=1 sm=1 tr=0 ts=69ddca0d cx=c_pps a=JL+w9abYAAE89/QcEU+0QA==:117 a=fChuTYTh2wq5r3m49p7fHw==:17 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=XipGDMX4SS2hnaP5fVAA:9 a=QEXdDO2ut3YA:10 a=324X-CrmTo6CU4MGRt3R: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-04-14_01,2026-04-13_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 lowpriorityscore=0 adultscore=0 impostorscore=0 priorityscore=1501 bulkscore=0 suspectscore=0 spamscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604070000 definitions=main-2604140045 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 | 71 +++++++++++++++++++++--- 2 files changed, 66 insertions(+), 9 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_core.h b/drivers/media/platform/qcom/iris/iris_core.h index fb194c967ad4..aa7abef6f0e0 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 + * @dev_fw: reference to the context bank device used for firmware load + * @ctx_fw: 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 *dev_fw; + struct qcom_scm_pas_context *ctx_fw; 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..93d77996c83f 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 *dev = core->dev_fw ? core->dev_fw : 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 *ctx_fw; + struct iommu_domain *domain; struct resource res; phys_addr_t mem_phys; size_t res_size; @@ -29,13 +33,17 @@ 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); + ctx_fw = devm_qcom_scm_pas_context_alloc(dev, pas_id, mem_phys, res_size); + if (IS_ERR(ctx_fw)) + return PTR_ERR(ctx_fw); + ret = request_firmware(&firmware, fw_name, 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); + ctx_fw->use_tzmem = !!core->dev_fw; + ret = qcom_mdt_pas_load(ctx_fw, firmware, fw_name, mem_virt, NULL); + if (ret) + goto err_mem_unmap; + + if (ctx_fw->use_tzmem) { + domain = iommu_get_domain_for_dev(core->dev_fw); + 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->ctx_fw = ctx_fw; + +err_mem_unmap: memunmap(mem_virt); err_release_fw: release_firmware(firmware); @@ -62,6 +88,19 @@ 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) +{ + bool use_tzmem = core->ctx_fw->use_tzmem; + struct iommu_domain *domain; + + if (!use_tzmem) + return; + + domain = iommu_get_domain_for_dev(core->dev_fw); + if (domain) + iommu_unmap(domain, IRIS_FW_START_ADDR, core->ctx_fw->mem_size); +} + int iris_fw_load(struct iris_core *core) { const struct tz_cp_config *cp_config; @@ -79,10 +118,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->ctx_fw); 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 +132,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->ctx_fw->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->ctx_fw->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