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 EE8B7235C01 for ; Mon, 13 Jul 2026 06:33:03 +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=1783924385; cv=none; b=hxwjxI3+NW0R69nonsCc4SVO0joKhd4DYCssBottF/WrzkSqiMqq24Q8a5Ce0C20CgIy2gSKZdyYXK5EbPXx0M/fY8JoUJ6I3/LqAHM04hktSNeNvKgiuDLeTuTWDIKz3Qp7EoQKI6Owdb7AG65oY0OFbT7LF0lP4AdZY9VwCJg= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783924385; c=relaxed/simple; bh=jpcmV+oXF7wdtMe1Pfqdsej/O9qLrATMZeo7ge1vjEQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ddWb3NpJUQABwF8PbwsO+sAvu2al0Iu5uvs5KLernIvxkgbByIw1j7etgmRlLkwX21pJ0SAUlMWhWwYUFsWeejHZh1xbXa+Us04eW3rPEwEM203EJoKzJfNK2KF+x1QdmtEWOThd9Ot7ptenkUNnZKfaiSKQf7oF1H492quh1Us= 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=hjPoPbtL; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DpUtFYqD; 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="hjPoPbtL"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DpUtFYqD" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 66D6Nx7h648719 for ; Mon, 13 Jul 2026 06:33:03 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= HXEDLLEPyEQ5V9GW24jMoPnLhioXKPrwWB1fHyhzdTU=; b=hjPoPbtLmB+18hNx yhHz9qlLcgS7Xbix/YWa4IC6+BwyroJXB0fk+0VEEavMii/aHXG3FtCRqqj3T2DK 5JcmsieJxfyTncygB1MXR05HfgZoCYGA58bdNmUgFJfUFMHeuwymXhPkW5CdbbAV b+SH6C0fcZo/vbF/dewrWQVhS3ASDJ3PqCyr1hoprkOQoXsgCGZsdcc/A5GSuaSy QjQQ+e0G+VVCBTUO6gH390M+71612ABLR6XcpJprsV/bP1ONDyuabmpUSr0irfdv kcVzek5Ju8LypGX/8G/AmNDDKQS/v65GPCkvZ6ZNKt/R6Wwo71juVfMH9X7vB9Mm rAO4xQ== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4fbebr4mm1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 13 Jul 2026 06:33:01 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-c88e0d11a3fso2497943a12.0 for ; Sun, 12 Jul 2026 23:32:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1783924377; x=1784529177; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HXEDLLEPyEQ5V9GW24jMoPnLhioXKPrwWB1fHyhzdTU=; b=DpUtFYqDdisE70noWW6ygIXKMfyg7U76loowjSyKRZO6DEd1g6B14kWSM76xaIpikn RtGgAhQowZbayNs/tCwNXYs3gi/3zru0OkMLFogqJh7CkfIWPB4iDxu1I0pdWOWLiNo1 DJZCTjaHImFWerB7/fEDV+EURUbT28JheaDJANXCArq4/d+0heea+HB19Au8jWKnawTh uGgrJGyRFYOhD2M44QTRSHCE4IggK7LO/SVw+n8WyYDl8qihE7gP0joP/UYMdgelnDRT aKdTc1N+GhsTHOs+xiS5TeKS06RCZ3UXXYzEp2aEyswFFt9Wlt7d+CoFKnaMeDMNoR4s lvOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783924377; x=1784529177; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=HXEDLLEPyEQ5V9GW24jMoPnLhioXKPrwWB1fHyhzdTU=; b=E9q8FD+Eb4QyuUpfJUaSr69Uqv57NpkFsU1k2pdYcxLVEuA5NUzKfsVRoY9z2MO2Mm knBiSgT/F0fuyhu4uy1IlXwM1spOJbiazr+k66safanU2MAtGM+ALcv13Y55Upv1+BV9 G7D6RbiMAEIUzwLtsY0N7l6+RRk7jE+onhKPHhRi8bLKNoykeVKzyUltlE+JvNdx6onW 3Jgrr4bFis3FO2yLPc8FObmcLLGGvVw7n4Xv+uTGBavZhMYu+Ed6QVIF0EjH5J5+9wX9 nqMnCj3JS1RdmcZNRXPviuqGnLA60c33FOFAWvXKitA2aNwqZKpX/8YIBNcr7KL2CoBk i/ug== X-Forwarded-Encrypted: i=1; AHgh+RrIu6OLiBpVxisdUkJhOYJIqwq2ocvVTiLidv4jt0kh5qGWhkizuLQLoSndsW0TIPKfjjdRj3uLrGOrYrc=@vger.kernel.org X-Gm-Message-State: AOJu0YwTvtPUIYqeRo6P4c+2EM37hDEt0OywqpcQAMiamAxzEOORlTjk +wgxeirG6vriAfHftRAn2nKRWQn/oA6H+QHmCukTf/ldyoYAJXtXWck5XGmbXkiNQWWWbS2dG7S ZcK9VApbHXYDBOW+ntH8o771Rn+Y4qdUQqWj903bJetZNsPp8QwTtem47NtFxtb346wuUQHp//v k= X-Gm-Gg: AfdE7cnyrQFsnyaZV9DJDok3XP/7UvaKUAgGpGAbPOcjTL4f/drVnR71Gj5UNqxczjj Yu/AqD8arSYMEbgAMX4PSiZeBHbAAFxSx01iA3Qa5F3P6cFf8g6BCBS9O4n1Y5LKKoO2iroVP1M 6Mrtm224qf4U1433vKo8wCj4YNDW3ZIXnWioljV9sDumDQC80pIXcvSMfRFYfROig4CxjtQgXRI QTeQwaX8UeSe1FaHgOA1Dslw1Lmc0/cHwupHb8g2bKN0KeKf607psJZVgAUiyaqZsip8C6CZpCR xyyLkR1n9RoPbDwi8bbn3gawtW4vOsvNooLAdUVO4iN0JYBkkn/PYZZCiS9//H0raGpIAr+9YQL ET5BpXMIoBW98tBDnPQQGIJFjrfPhb3hHahZEa3kvQmcTSNvyhKhlx+SmpV1nm8i1Wv3U6OGXSZ knFfGQ5FNf0p/Cgec2soyUUuyZ/OJAOLEaQb54y0T5 X-Received: by 2002:a05:6a21:6803:b0:3b5:52b4:87a7 with SMTP id adf61e73a8af0-3c110776462mr8646139637.6.1783924376708; Sun, 12 Jul 2026 23:32:56 -0700 (PDT) X-Received: by 2002:a05:6a21:6803:b0:3b5:52b4:87a7 with SMTP id adf61e73a8af0-3c110776462mr8646077637.6.1783924375931; Sun, 12 Jul 2026 23:32:55 -0700 (PDT) Received: from hu-varada-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-13b87b92b27sm25435361c88.6.2026.07.12.23.32.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 Jul 2026 23:32:55 -0700 (PDT) From: Varadarajan Narayanan Date: Mon, 13 Jul 2026 12:02:19 +0530 Subject: [PATCH v13 3/6] remoteproc: qcom: add hexagon based WCSS secure PIL driver 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: <20260713-rproc-v13-3-41011cbcda3e@oss.qualcomm.com> References: <20260713-rproc-v13-0-41011cbcda3e@oss.qualcomm.com> In-Reply-To: <20260713-rproc-v13-0-41011cbcda3e@oss.qualcomm.com> To: Bjorn Andersson , Konrad Dybcio , Mathieu Poirier , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Manikanta Mylavarapu Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org, Vignesh Viswanathan , Gokul Sriram Palanisamy , George Moussalem , Dmitry Baryshkov , Varadarajan Narayanan X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwNzEzMDA2NiBTYWx0ZWRfX3E6NI5B4gDAS 5mDYrQ8qj4jukcqEEE2vYq/2qs53lRzvUtqyttx0KIn+eDcjyA58RQeiCPeKnzUr1PvRCDS0Uni Ed/13RT9PXYbLN8a9cEoTsnlBCu4bLU= X-Authority-Analysis: v=2.4 cv=OK8XGyaB c=1 sm=1 tr=0 ts=6a54869d cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=RAioF0-LDSMA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=UqCG9HQmAAAA:8 a=2haS3Ga0fGOBmvNocw8A:9 a=QEXdDO2ut3YA:10 a=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-GUID: Yxc3cGOEZMfAnI5LRtDxQMJ0-VMCaOEX X-Proofpoint-ORIG-GUID: Yxc3cGOEZMfAnI5LRtDxQMJ0-VMCaOEX X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNzEzMDA2NiBTYWx0ZWRfX6IIQfXL6nXsm pXHp/3ufwZORaB9quMJoNlPsGphmZpPVK99/kxflpGaa7sbsfqSpC2cmr0P9O9NJj9QTVZCDWUZ 5fxNUL5yV921VYh428suPLNUDknXoPT6Kcaatqw9LQ3SvCd3y3O8t+upbYw5H7xwvPkQIt/ITcb IEm9QOWY0P0nneLaX+4JukEZY8sFJO0qjNZxp1tdhOHn3eASm5/vf0Bq28QRArm0Zit5WuuU7sS TSypWxWhn0jNr6ALn8rnsoS1oxzCwaWQlBjv1mjb9GOVD1JjYHycL7uKsUNvOYOgVrIayfzG/01 5FCXNd8cMu6z7RBiVmn7rvXLKenlXMAyOxAI1rAa29Aw6vqWuEMqqNsNJlm0nBXlh/Gm4AS2cm/ Bs2wyZWbkIPs+FR/qaETArtQWAxpMoE7cURB7Vkm+Zw/V1lDjOOa5692ay0dnOvnbc9v9UZUw6Q w6sLLBKdXDhxGB8lIWw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-07-13_02,2026-07-10_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 phishscore=0 spamscore=0 adultscore=0 clxscore=1015 impostorscore=0 suspectscore=0 lowpriorityscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2607130066 From: Vignesh Viswanathan Add support to bring up hexagon based WCSS using secure PIL. All IPQxxxx SoCs support secure Peripheral Image Loading (PIL). Secure PIL image is signed firmware image which only trusted software such as TrustZone (TZ) can authenticate and load. Linux kernel will send a Peripheral Authentication Service (PAS) request to TZ to authenticate and load the PIL images. In order to avoid overloading the existing WCSS driver or PAS driver, we came up with this new PAS based IPQ WCSS driver. Signed-off-by: Vignesh Viswanathan Signed-off-by: Manikanta Mylavarapu Signed-off-by: Gokul Sriram Palanisamy Signed-off-by: George Moussalem [ Dropped ipq5424 support ] Reviewed-by: Dmitry Baryshkov Tested-by: Vignesh Viswanathan Signed-off-by: Varadarajan Narayanan --- drivers/remoteproc/Kconfig | 19 ++ drivers/remoteproc/Makefile | 1 + drivers/remoteproc/qcom_q6v5_wcss_sec.c | 325 ++++++++++++++++++++++++++++++++ include/linux/remoteproc.h | 2 + 4 files changed, 347 insertions(+) diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig index 65befdbfa5f7..38aa10c5ee2a 100644 --- a/drivers/remoteproc/Kconfig +++ b/drivers/remoteproc/Kconfig @@ -258,6 +258,25 @@ config QCOM_Q6V5_WCSS Hexagon V5 based WCSS remote processors on e.g. IPQ8074. This is a non-TrustZone wireless subsystem. +config QCOM_Q6V5_WCSS_SEC + tristate "Qualcomm Hexagon based WCSS Secure Peripheral Image Loader" + depends on OF && ARCH_QCOM + depends on QCOM_SMEM + depends on RPMSG_QCOM_GLINK_SMEM || RPMSG_QCOM_GLINK_SMEM=n + depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n + select QCOM_MDT_LOADER + select QCOM_PIL_INFO + select QCOM_Q6V5_COMMON + select QCOM_RPROC_COMMON + select QCOM_SCM + help + Say y here to support the Qualcomm Secure Peripheral Image Loader + for the Hexagon based remote processors on e.g. IPQ5332. + + This is TrustZone wireless subsystem. The firmware is + verified and booted with the help of the Peripheral Authentication + System (PAS) in TrustZone. + config QCOM_SYSMON tristate "Qualcomm sysmon driver" depends on RPMSG diff --git a/drivers/remoteproc/Makefile b/drivers/remoteproc/Makefile index 1c7598b8475d..08705ef62bce 100644 --- a/drivers/remoteproc/Makefile +++ b/drivers/remoteproc/Makefile @@ -28,6 +28,7 @@ obj-$(CONFIG_QCOM_Q6V5_ADSP) += qcom_q6v5_adsp.o obj-$(CONFIG_QCOM_Q6V5_MSS) += qcom_q6v5_mss.o obj-$(CONFIG_QCOM_Q6V5_PAS) += qcom_q6v5_pas.o obj-$(CONFIG_QCOM_Q6V5_WCSS) += qcom_q6v5_wcss.o +obj-$(CONFIG_QCOM_Q6V5_WCSS_SEC) += qcom_q6v5_wcss_sec.o obj-$(CONFIG_QCOM_SYSMON) += qcom_sysmon.o obj-$(CONFIG_QCOM_WCNSS_PIL) += qcom_wcnss_pil.o qcom_wcnss_pil-y += qcom_wcnss.o diff --git a/drivers/remoteproc/qcom_q6v5_wcss_sec.c b/drivers/remoteproc/qcom_q6v5_wcss_sec.c new file mode 100644 index 000000000000..10a69fcd20f0 --- /dev/null +++ b/drivers/remoteproc/qcom_q6v5_wcss_sec.c @@ -0,0 +1,325 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ +#include +#include +#include +#include +#include +#include +#include + +#include "qcom_common.h" +#include "qcom_q6v5.h" +#include "qcom_pil_info.h" + +#define WCSS_CRASH_REASON 421 + +#define WCSS_PAS_ID 0x6 +#define MPD_WCSS_PAS_ID 0xd + +#define Q6_WAIT_TIMEOUT (5 * HZ) + +struct wcss_sec { + struct device *dev; + struct qcom_rproc_glink glink_subdev; + struct qcom_rproc_ssr ssr_subdev; + struct qcom_q6v5 q6; + phys_addr_t mem_phys; + phys_addr_t mem_reloc; + void *mem_region; + size_t mem_size; + const struct wcss_data *desc; +}; + +struct wcss_data { + u32 pasid; + const char *ss_name; + bool auto_boot; +}; + +static int wcss_sec_start(struct rproc *rproc) +{ + struct wcss_sec *wcss = rproc->priv; + struct device *dev = wcss->dev; + int ret; + + ret = qcom_q6v5_prepare(&wcss->q6); + if (ret) + return ret; + + ret = qcom_scm_pas_auth_and_reset(wcss->desc->pasid); + if (ret) { + dev_err(dev, "wcss_reset failed\n"); + goto unprepare; + } + + ret = qcom_q6v5_wait_for_start(&wcss->q6, Q6_WAIT_TIMEOUT); + if (ret == -ETIMEDOUT) + dev_err(dev, "start timed out\n"); + +unprepare: + qcom_q6v5_unprepare(&wcss->q6); + + return ret; +} + +static int wcss_sec_stop(struct rproc *rproc) +{ + struct wcss_sec *wcss = rproc->priv; + struct device *dev = wcss->dev; + int ret; + + ret = qcom_scm_pas_shutdown(wcss->desc->pasid); + if (ret) { + dev_err(dev, "not able to shutdown\n"); + return ret; + } + + qcom_q6v5_unprepare(&wcss->q6); + + return 0; +} + +static void *wcss_sec_da_to_va(struct rproc *rproc, u64 da, size_t len, + bool *is_iomem) +{ + struct wcss_sec *wcss = rproc->priv; + int offset; + + offset = da - wcss->mem_reloc; + if (offset < 0 || offset + len > wcss->mem_size) + return NULL; + + return wcss->mem_region + offset; +} + +static int wcss_sec_load(struct rproc *rproc, const struct firmware *fw) +{ + struct wcss_sec *wcss = rproc->priv; + struct device *dev = wcss->dev; + int ret; + + ret = qcom_mdt_load(dev, fw, rproc->firmware, wcss->desc->pasid, wcss->mem_region, + wcss->mem_phys, wcss->mem_size, &wcss->mem_reloc); + if (ret) + return ret; + + qcom_pil_info_store("wcss", wcss->mem_phys, wcss->mem_size); + + return 0; +} + +static unsigned long wcss_sec_panic(struct rproc *rproc) +{ + struct wcss_sec *wcss = rproc->priv; + + return qcom_q6v5_panic(&wcss->q6); +} + +static void wcss_sec_copy_segment(struct rproc *rproc, + struct rproc_dump_segment *segment, + void *dest, size_t offset, size_t size) +{ + struct wcss_sec *wcss = rproc->priv; + struct device *dev = wcss->dev; + + if (!segment->io_ptr) + segment->io_ptr = ioremap_wc(segment->da, segment->size); + + if (!segment->io_ptr) { + dev_err(dev, "Failed to ioremap segment %pad size 0x%zx\n", + &segment->da, segment->size); + return; + } + + if (offset + size < segment->size) { + memcpy(dest, segment->io_ptr + offset, size); + } else { + iounmap(segment->io_ptr); + segment->io_ptr = NULL; + } +} + +static int wcss_sec_dump_segments(struct rproc *rproc, + const struct firmware *fw) +{ + struct device *dev = rproc->dev.parent; + struct reserved_mem *rmem = NULL; + struct device_node *node; + int num_segs, index; + int ret; + + /* + * Parse through additional reserved memory regions for the rproc + * and add them to the coredump segments + */ + num_segs = of_count_phandle_with_args(dev->of_node, + "memory-region", NULL); + for (index = 0; index < num_segs; index++) { + node = of_parse_phandle(dev->of_node, + "memory-region", index); + if (!node) + return -EINVAL; + + rmem = of_reserved_mem_lookup(node); + of_node_put(node); + if (!rmem) { + dev_err(dev, "unable to acquire memory-region index %d num_segs %d\n", + index, num_segs); + return -EINVAL; + } + + dev_dbg(dev, "Adding segment 0x%pa size 0x%pa", + &rmem->base, &rmem->size); + ret = rproc_coredump_add_custom_segment(rproc, + rmem->base, + rmem->size, + wcss_sec_copy_segment, + NULL); + if (ret) + return ret; + } + + return 0; +} + +static const struct rproc_ops wcss_sec_ops = { + .start = wcss_sec_start, + .stop = wcss_sec_stop, + .da_to_va = wcss_sec_da_to_va, + .load = wcss_sec_load, + .get_boot_addr = rproc_elf_get_boot_addr, + .panic = wcss_sec_panic, + .parse_fw = wcss_sec_dump_segments, +}; + +static int wcss_sec_alloc_memory_region(struct wcss_sec *wcss) +{ + struct device *dev = wcss->dev; + struct resource res; + int ret; + + ret = of_reserved_mem_region_to_resource(dev->of_node, 0, &res); + if (ret) { + dev_err(dev, "unable to acquire memory-region resource\n"); + return ret; + } + + wcss->mem_phys = res.start; + wcss->mem_reloc = res.start; + wcss->mem_size = resource_size(&res); + wcss->mem_region = devm_ioremap_resource_wc(dev, &res); + if (!wcss->mem_region) { + dev_err(dev, "unable to map memory region: %pR\n", &res); + return -ENOMEM; + } + + return 0; +} + +static int wcss_sec_probe(struct platform_device *pdev) +{ + const struct wcss_data *desc = of_device_get_match_data(&pdev->dev); + const char *fw_name = NULL; + struct wcss_sec *wcss; + struct clk *sleep_clk; + struct clk *int_clk; + struct rproc *rproc; + int ret; + + ret = of_property_read_string(pdev->dev.of_node, "firmware-name", + &fw_name); + if (ret < 0) + return ret; + + rproc = devm_rproc_alloc(&pdev->dev, desc->ss_name, &wcss_sec_ops, + fw_name, sizeof(*wcss)); + if (!rproc) { + dev_err(&pdev->dev, "failed to allocate rproc\n"); + return -ENOMEM; + } + + wcss = rproc->priv; + wcss->dev = &pdev->dev; + wcss->desc = desc; + + ret = wcss_sec_alloc_memory_region(wcss); + if (ret) + return ret; + + sleep_clk = devm_clk_get_optional_enabled(&pdev->dev, "sleep"); + if (IS_ERR(sleep_clk)) + return dev_err_probe(&pdev->dev, PTR_ERR(sleep_clk), + "Failed to get sleep clock\n"); + + int_clk = devm_clk_get_optional_enabled(&pdev->dev, "interconnect"); + if (IS_ERR(int_clk)) + return dev_err_probe(&pdev->dev, PTR_ERR(int_clk), + "Failed to get interconnect clock\n"); + + ret = qcom_q6v5_init(&wcss->q6, pdev, rproc, + WCSS_CRASH_REASON, NULL, NULL); + if (ret) + return ret; + + qcom_add_glink_subdev(rproc, &wcss->glink_subdev, desc->ss_name); + qcom_add_ssr_subdev(rproc, &wcss->ssr_subdev, desc->ss_name); + + rproc->auto_boot = false; + rproc->dump_conf = RPROC_COREDUMP_INLINE; + rproc_coredump_set_elf_info(rproc, ELFCLASS32, EM_NONE); + + ret = devm_rproc_add(&pdev->dev, rproc); + if (ret) { + qcom_remove_glink_subdev(rproc, &wcss->glink_subdev); + qcom_remove_ssr_subdev(rproc, &wcss->ssr_subdev); + return ret; + } + + platform_set_drvdata(pdev, rproc); + + return 0; +} + +static void wcss_sec_remove(struct platform_device *pdev) +{ + struct rproc *rproc = platform_get_drvdata(pdev); + struct wcss_sec *wcss = rproc->priv; + + qcom_remove_glink_subdev(rproc, &wcss->glink_subdev); + qcom_remove_ssr_subdev(rproc, &wcss->ssr_subdev); + qcom_q6v5_deinit(&wcss->q6); +} + +static const struct wcss_data wcss_sec_ipq5332_res_init = { + .pasid = MPD_WCSS_PAS_ID, + .ss_name = "q6wcss", +}; + +static const struct wcss_data wcss_sec_ipq9574_res_init = { + .pasid = WCSS_PAS_ID, + .ss_name = "q6wcss", +}; + +static const struct of_device_id wcss_sec_of_match[] = { + { .compatible = "qcom,ipq5018-wcss-sec-pil", .data = &wcss_sec_ipq5332_res_init }, + { .compatible = "qcom,ipq5332-wcss-sec-pil", .data = &wcss_sec_ipq5332_res_init }, + { .compatible = "qcom,ipq9574-wcss-sec-pil", .data = &wcss_sec_ipq9574_res_init }, + { }, +}; +MODULE_DEVICE_TABLE(of, wcss_sec_of_match); + +static struct platform_driver wcss_sec_driver = { + .probe = wcss_sec_probe, + .remove = wcss_sec_remove, + .driver = { + .name = "qcom-wcss-secure-pil", + .of_match_table = wcss_sec_of_match, + }, +}; +module_platform_driver(wcss_sec_driver); + +MODULE_DESCRIPTION("Hexagon WCSS Secure Peripheral Image Loader"); +MODULE_LICENSE("GPL"); diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index 7c1546d48008..d9bfe2023d15 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h @@ -205,6 +205,7 @@ enum rproc_dump_mechanism { * @node: list node related to the rproc segment list * @da: device address of the segment * @size: size of the segment + * @io_ptr: ptr to store the ioremapped dump segment * @priv: private data associated with the dump_segment * @dump: custom dump function to fill device memory segment associated * with coredump @@ -216,6 +217,7 @@ struct rproc_dump_segment { dma_addr_t da; size_t size; + void *io_ptr; void *priv; void (*dump)(struct rproc *rproc, struct rproc_dump_segment *segment, void *dest, size_t offset, size_t size); -- 2.34.1