From nobody Tue Feb 10 14:33:33 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 5A8DC2E88B6 for ; Tue, 7 Oct 2025 16:49:51 +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=1759855793; cv=none; b=oahrZApbw79ilwznb/KHHHkrCXCIrB1PO5PyHnXRv9rQX0Rf7mz243JGkBmUb9FeVnQlVy2X8HjQRAsCc//7Mqwh+FIoM3w1XxhRtPgX6/o8fsLPHtwLGcZ7jsrk/6R5A3y+Fjko2/vK1QJuw4lE+9PSi5+03NhbjQmxk3lfXyc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759855793; c=relaxed/simple; bh=bZFaW8J4AchruCJlkftoFJVoy2z0YxJTvUE62rYa+Cc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MNniHgnc+ZvKgZvySuijfLwv2sTl4Ympqq+KDBMYlG+OnB6RAinBADYNEZg/kpOfPVfgcKdVJu/y3C0jtPVy45Pk2u1dyjY58K+LIBWT7louOCbzzsqVAwyY9zkN8mmjVOfKJrsxZ4Z1uxUi5dLtPgcG5lSLZ7fzl8g5YH5aLEA= 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=fotS0v53; 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="fotS0v53" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 597ET2Jw029249 for ; Tue, 7 Oct 2025 16:49:50 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= Z1vvvStNs9y97rY4eIYOtieH7DyEzcya6xnS9Hvv/8c=; b=fotS0v536YoKNz+Q 5g8ZQS3WyES4cWcDQQPPifHPvh8cvhOawRU16stGDPVfwTW1o75b6fxkKKGWlPmU f9h3W/xXiBkK0+ESAfkqtdLbtaDbELaqPHsGCxG0jbPgDOKfPMwpifFdequXvQHc UX4KJMNYnXREGwQLXPMKuk5rB8Hu6pZiSLdbjj76anDo3vXzrSdELzKjlH55mHaa c/tc14ruCuKJqUP0A3sqAZQ3Xv/s2P0LI2yNkoqEjrUxXggJ4cYGjtYsJQx1T/PZ VQDAZiMjvCeFNrH2RmcSvSWrb8VY5pB7k+25WlSZZswUnD9RpaxPpYc4vI6bcu4J FEjq0g== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 49mnkptsxj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT) for ; Tue, 07 Oct 2025 16:49:50 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-269939bfccbso74488915ad.1 for ; Tue, 07 Oct 2025 09:49:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1759855789; x=1760460589; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Z1vvvStNs9y97rY4eIYOtieH7DyEzcya6xnS9Hvv/8c=; b=FZ+JAdMB5UpYoZX6w7xIx05gn6nIR+cKrbqKU/6AQBSyculNyQaEBxfWnAqpqqG85b 3V5iu5z4jpIXunolVF3TYkkz14t2gKTXBaN5UGgDmliHxt2OLc7EkvOV0QhPVumfwXsh BFe54HCd0gKRMAglJULRWkVkr0DwDztLjBvuQ5ejqrpZL1HlLJqaLA8do8tKQrmAgP9U gzrshtKw41yt/98KWHeakPO8O0Ex7cINHMro46mJduZpgb7rj8zCjxm4kFVcIjMHtKEq rm5qVOvcBj/QTkGq5qFA24JEsNRfwhuGJSKP1M+ZGwgNQki9LI9mad4u2sH8GtjohSCt zkGg== X-Forwarded-Encrypted: i=1; AJvYcCV/AcmSHLqP6Ah/VCtXRUcYkykp71/Yd4onbw0JhghAyB5oJVHCt7rOpcCgqNMMkToRVEK82AXr2Pu4w2s=@vger.kernel.org X-Gm-Message-State: AOJu0YxrrfOq88glmkSBHBQqTUJQ2QgWiLQMVObXTYjAi2zP7kBeo879 xx51GzWo3YjRdcbxuKVO7oGzcH7xHQLa3CLEL0JsaN5YIrqt9/Mmt0gL0wHTkx2B6ZuXOz8kHcR fcFIil4BioZ6ZOYeVhp5ID0UgFLrrVWZ/8KTKt/F5NabkJZnhWoUUcMQdn+GDwQoZ520= X-Gm-Gg: ASbGncvDwc4iSexzCpHt2cAKpyUJJCQu0+0aeQC9lIgIzeYBCRJdWl+RNr6pwFQQmvb +ykEMPT5+ixuET2ZinK1RIxzPpXZyJdQhDzSKLjaa7w7+ZVIZUiqW25oGIVDpSR7sEhUZYvi+Iq 7zi3KbVhxbCdsZ3weQbdLU9rC6G9iKcdGPuTGStcjVBwoJ7uVqaGbJepcdkb1ZqJN24+jmKDaYN djxbt50mmBrd0BexPWTaqOE++K4ukMV8TPd6FeROTPorzQrMLeSTHuXpr0BSdOFRvI8sOutRFJF onexuJspHi510NOZQqf1rzK/ciuy6WLrJxIa+1Y5ZtyHPhxbgUAhv5LdGPTFD2SWbtiAR5LZ X-Received: by 2002:a17:903:285:b0:267:d0fa:5f75 with SMTP id d9443c01a7336-29027356237mr5291495ad.1.1759855788811; Tue, 07 Oct 2025 09:49:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF3HJM7nHP3g6+84OEvZL0KomB6WHN13m8Kgy1NIKohYlgbUiWpqlTn8AvX2TLSEeio2tDD9w== X-Received: by 2002:a17:903:285:b0:267:d0fa:5f75 with SMTP id d9443c01a7336-29027356237mr5291065ad.1.1759855788168; Tue, 07 Oct 2025 09:49:48 -0700 (PDT) Received: from hu-mojha-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-28e8d1261e2sm171990825ad.38.2025.10.07.09.49.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Oct 2025 09:49:47 -0700 (PDT) From: Mukesh Ojha Date: Tue, 07 Oct 2025 22:18:54 +0530 Subject: [PATCH v4 09/12] firmware: qcom_scm: Add qcom_scm_pas_get_rsc_table() to get resource table 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: <20251007-kvm_rprocv4_next-20251007-v4-9-de841623af3c@oss.qualcomm.com> References: <20251007-kvm_rprocv4_next-20251007-v4-0-de841623af3c@oss.qualcomm.com> In-Reply-To: <20251007-kvm_rprocv4_next-20251007-v4-0-de841623af3c@oss.qualcomm.com> To: Bjorn Andersson , Mathieu Poirier , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Manivannan Sadhasivam , Konrad Dybcio Cc: linux-arm-msm@vger.kernel.org, linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Mukesh Ojha X-Mailer: b4 0.14-dev-f7c49 X-Developer-Signature: v=1; a=ed25519-sha256; t=1759855751; l=9173; i=mukesh.ojha@oss.qualcomm.com; s=20250708; h=from:subject:message-id; bh=bZFaW8J4AchruCJlkftoFJVoy2z0YxJTvUE62rYa+Cc=; b=qkgkVU6vla231Ncd8IYSIixnCvnV+12e4fUq11WXJv6p1C4qE23Vrk1UTTGArQ63BF7/XeiVR /4zoUCg41RLCTflM2xqwohtLJ2ggR3QYJxrNuCczUfen2JclI+lPN9r X-Developer-Key: i=mukesh.ojha@oss.qualcomm.com; a=ed25519; pk=eX8dr/7d4HJz/HEXZIpe3c+Ukopa/wZmxH+5YV3gdNc= X-Proofpoint-GUID: PUG-SchjCdtfX2bftva5bCmkEkZjxkA- X-Proofpoint-ORIG-GUID: PUG-SchjCdtfX2bftva5bCmkEkZjxkA- X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDA2MDE2OCBTYWx0ZWRfXzQ6cTv9lJbbk whXQb0momfMGGuMZ4URaYmKyNGsyUmTt0iimC52/wQ158+L5tN7NMDZXPLJRetmbQCK6U/OHoyh Sf8j8E4UstFRXcJyfNuS02NvxawqASrrDd2Ms2WjpBTW5gsRgSOt8qk5rHk6OJYiLzCtEgJlj2p /P42k16oDFVUBnejP6Mr+bm4J3o1K+W+F6dXZHJuLhM842+XaEwsxby5ertSG+sCl4ECCMvVI4N RBYfeIwO5aYQze7hh8xGI9t9hvY1KmH/Jrkh6T0Ugwg0SwPWA/ANDTtj3Aqc2rZv/JRqrcrouwo lDEgaEXWyDy4fApwXiRAt6Vr6zI3KWFJ02B22uAGbH3cnQjh6MUKehpWOJNhVe97m4MwutbiI2r 7ISjA1DL38kfSI3R00beWZxkFuZo8w== X-Authority-Analysis: v=2.4 cv=BuCQAIX5 c=1 sm=1 tr=0 ts=68e544ae cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=x6icFKpwvdMA:10 a=EUspDBNiAAAA:8 a=KFEUUOXM5gBsW3BA6b4A:9 a=QEXdDO2ut3YA:10 a=1OuFwYUASf3TG4hYMiVC:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1117,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-07_02,2025-10-06_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 bulkscore=0 adultscore=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 clxscore=1015 spamscore=0 suspectscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2509150000 definitions=main-2510060168 Qualcomm remote processor may rely on Static and Dynamic resources for it to be functional. Static resources are fixed like for example, memory-mapped addresses required by the subsystem and dynamic resources, such as shared memory in DDR etc., are determined at runtime during the boot process. For most of the Qualcomm SoCs, when run with Gunyah or older QHEE hypervisor, all the resources whether it is static or dynamic, is managed by the hypervisor. Dynamic resources if it is present for a remote processor will always be coming from secure world via SMC call while static resources may be present in remote processor firmware binary or it may be coming qcom_scm_pas_get_rsc_table() SMC call along with dynamic resources. Some of the remote processor drivers, such as video, GPU, IPA, etc., do not check whether resources are present in their remote processor firmware binary. In such cases, the caller of this function should set input_rt and input_rt_size as NULL and zero respectively. Remoteproc framework has method to check whether firmware binary contain resources or not and they should be pass resource table pointer to input_rt and resource table size to input_rt_size and this will be forwarded to TrustZone for authentication. TrustZone will then append the dynamic resources and return the complete resource table in output_rt More about documentation on resource table format can be found in include/linux/remoteproc.h Signed-off-by: Mukesh Ojha --- drivers/firmware/qcom/qcom_scm.c | 157 +++++++++++++++++++++++++++++= ++++ drivers/firmware/qcom/qcom_scm.h | 1 + include/linux/firmware/qcom/qcom_scm.h | 4 + 3 files changed, 162 insertions(+) diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_= scm.c index 75811ba64c8f..b8535b5a855b 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include =20 @@ -111,6 +112,10 @@ enum qcom_scm_qseecom_tz_cmd_info { QSEECOM_TZ_CMD_INFO_VERSION =3D 3, }; =20 +enum qcom_scm_rsctable_resp_type { + RSCTABLE_BUFFER_NOT_SUFFICIENT =3D 20, +}; + #define QSEECOM_MAX_APP_NAME_SIZE 64 #define SHMBRIDGE_RESULT_NOTSUPP 4 =20 @@ -800,6 +805,158 @@ int qcom_scm_pas_mem_setup(u32 pas_id, phys_addr_t ad= dr, phys_addr_t size) } EXPORT_SYMBOL_GPL(qcom_scm_pas_mem_setup); =20 +static int __qcom_scm_pas_get_rsc_table(u32 pas_id, void *input_rt, size_t= input_rt_size, + void **output_rt, size_t *output_rt_size) +{ + struct qcom_scm_desc desc =3D { + .svc =3D QCOM_SCM_SVC_PIL, + .cmd =3D QCOM_SCM_PIL_PAS_GET_RSCTABLE, + .arginfo =3D QCOM_SCM_ARGS(5, QCOM_SCM_VAL, QCOM_SCM_RO, QCOM_SCM_VAL, + QCOM_SCM_RW, QCOM_SCM_VAL), + .args[0] =3D pas_id, + .owner =3D ARM_SMCCC_OWNER_SIP, + }; + void *input_rt_buf, *output_rt_buf; + struct resource_table *rsc; + struct qcom_scm_res res; + int ret; + + ret =3D qcom_scm_clk_enable(); + if (ret) + return ret; + + ret =3D qcom_scm_bw_enable(); + if (ret) + goto disable_clk; + + /* + * TrustZone can not accept buffer as NULL value as argument Hence, + * we need to pass a input buffer indicating that subsystem firmware + * does not have resource table by filling resource table structure. + */ + if (!input_rt) + input_rt_size =3D sizeof(*rsc); + + input_rt_buf =3D qcom_tzmem_alloc(__scm->mempool, input_rt_size, GFP_KERN= EL); + if (!input_rt_buf) { + ret =3D -ENOMEM; + goto disable_scm_bw; + } + + if (!input_rt) { + rsc =3D input_rt_buf; + rsc->num =3D 0; + } else { + memcpy(input_rt_buf, input_rt, input_rt_size); + } + + output_rt_buf =3D qcom_tzmem_alloc(__scm->mempool, *output_rt_size, GFP_K= ERNEL); + if (!output_rt_buf) { + ret =3D -ENOMEM; + goto free_input_rt_buf; + } + + desc.args[1] =3D qcom_tzmem_to_phys(input_rt_buf); + desc.args[2] =3D input_rt_size; + desc.args[3] =3D qcom_tzmem_to_phys(output_rt_buf); + desc.args[4] =3D *output_rt_size; + + /* + * Whether SMC fail or pass, res.result[2] will hold actual resource table + * size. + * + * if passed 'output_rt_size' buffer size is not sufficient to hold the + * resource table TrustZone sends, response code in res.result[1] as + * RSCTABLE_BUFFER_NOT_SUFFICIENT so that caller can retry this SMC call = with + * output_rt buffer with res.result[2] size. + */ + ret =3D qcom_scm_call(__scm->dev, &desc, &res); + *output_rt_size =3D res.result[2]; + if (!ret) + memcpy(*output_rt, output_rt_buf, *output_rt_size); + + if (ret && res.result[1] =3D=3D RSCTABLE_BUFFER_NOT_SUFFICIENT) + ret =3D -EAGAIN; + + qcom_tzmem_free(output_rt_buf); + +free_input_rt_buf: + qcom_tzmem_free(input_rt_buf); + +disable_scm_bw: + qcom_scm_bw_disable(); + +disable_clk: + qcom_scm_clk_disable(); + + return ret ? : res.result[0]; +} + +/** + * qcom_scm_pas_get_rsc_table() - Retrieve the resource table in passed ou= tput buffer + * for a given peripheral. + * + * Qualcomm remote processor may rely on both static and dynamic resources= for + * its functionality. Static resources typically refer to memory-mapped ad= dresses + * required by the subsystem and are often embedded within the firmware bi= nary + * and dynamic resources, such as shared memory in DDR etc., are determine= d at + * runtime during the boot process. + * + * On Qualcomm Technologies devices, it's possible that static resources a= re not + * embedded in the firmware binary and instead are provided by TrustZone H= owever, + * dynamic resources are always expected to come from TrustZone. This indi= cates + * that for Qualcomm devices, all resources (static and dynamic) will be p= rovided + * by TrustZone via the SMC call. + * + * If the remote processor firmware binary does contain static resources, = they + * should be passed in input_rt. These will be forwarded to TrustZone for + * authentication. TrustZone will then append the dynamic resources and re= turn + * the complete resource table in output_rt. + * + * If the remote processor firmware binary does not include a resource tab= le, + * the caller of this function should set input_rt as NULL and input_rt_si= ze + * as zero respectively. + * + * More about documentation on resource table data structures can be found= in + * include/linux/rsc_table.h + * + * @ctx: PAS context + * @pas_id: peripheral authentication service id + * @input_rt: resource table buffer which is present in firmware bin= ary + * @input_rt_size: size of the resource table present in firmware binary + * @output_rt: buffer to which the both static and dynamic resources w= ill + * be returned. + * @output_rt_size: TrustZone expects caller should pass worst case size f= or + * the output_rt. + * + * Return: 0 on success and nonzero on failure. + * + * Upon successful return, output_rt will have the resource table and outp= ut_rt_size + * will have actual resource table size, + */ +int qcom_scm_pas_get_rsc_table(struct qcom_scm_pas_context *ctx, void *inp= ut_rt, + size_t input_rt_size, void **output_rt, + size_t *output_rt_size) +{ + int ret; + + do { + *output_rt =3D devm_kzalloc(ctx->dev, *output_rt_size, GFP_KERNEL); + if (!*output_rt) + return -ENOMEM; + + ret =3D __qcom_scm_pas_get_rsc_table(ctx->pas_id, input_rt, + input_rt_size, output_rt, + output_rt_size); + if (ret) + devm_kfree(ctx->dev, *output_rt); + + } while (ret =3D=3D -EAGAIN); + + return ret; +} +EXPORT_SYMBOL_GPL(qcom_scm_pas_get_rsc_table); + /** * qcom_scm_pas_auth_and_reset() - Authenticate the given peripheral firmw= are * and reset the remote processor diff --git a/drivers/firmware/qcom/qcom_scm.h b/drivers/firmware/qcom/qcom_= scm.h index a56c8212cc0c..50d87c628d78 100644 --- a/drivers/firmware/qcom/qcom_scm.h +++ b/drivers/firmware/qcom/qcom_scm.h @@ -105,6 +105,7 @@ int qcom_scm_shm_bridge_enable(struct device *scm_dev); #define QCOM_SCM_PIL_PAS_SHUTDOWN 0x06 #define QCOM_SCM_PIL_PAS_IS_SUPPORTED 0x07 #define QCOM_SCM_PIL_PAS_MSS_RESET 0x0a +#define QCOM_SCM_PIL_PAS_GET_RSCTABLE 0x21 =20 #define QCOM_SCM_SVC_IO 0x05 #define QCOM_SCM_IO_READ 0x01 diff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmwar= e/qcom/qcom_scm.h index edb2cccee9af..a8b6185c0ed6 100644 --- a/include/linux/firmware/qcom/qcom_scm.h +++ b/include/linux/firmware/qcom/qcom_scm.h @@ -94,6 +94,10 @@ int qcom_scm_pas_mem_setup(u32 pas_id, phys_addr_t addr,= phys_addr_t size); int qcom_scm_pas_auth_and_reset(u32 pas_id); int qcom_scm_pas_shutdown(u32 pas_id); bool qcom_scm_pas_supported(u32 pas_id); +int qcom_scm_pas_get_rsc_table(struct qcom_scm_pas_context *ctx, void *inp= ut_rt, + size_t input_rt_size, void **output_rt, + size_t *output_rt_size); + int qcom_scm_pas_prepare_and_auth_reset(struct qcom_scm_pas_context *ctx); =20 int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val); --=20 2.50.1