From patchwork Fri Oct 4 21:23:54 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mukesh Ojha X-Patchwork-Id: 13823000 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 B2E9C1B4F14; Fri, 4 Oct 2024 21:24:25 +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=1728077067; cv=none; b=DooT6qsKW7sT76hy/yDFAVPCV/Lwb0aYXb7CpjA7TQwICO+LmF40YV2mlO7g/ErtGEgFYz6oIBugBX07lu1+ChpSOT90D3/FAzN6XbakAZjihMMv/Ojv1FqlpkKJHdLcNIN4/xm9D5QH5dROn66NqcQrAej1rlJXxBy3AK3Wny8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728077067; c=relaxed/simple; bh=K8QQuCcgEoB0Q/fSJMyIy/O8BgM0uWG0H4wK+BbDIfM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=KGPLgRoPYW1T6OPYuHhgStlYqUMOPW8gx91JmtWTd04mdTLgX123XBuBCSc25U+XFlSBwXjFs8exHIIcNCvaPud9KLd0TiGHmjrwlvkqLOnEw8vWuGeYmo0mZ1EaMnB+jVaCOf/mnqQl22uJndnWDg6ND/D5XzfaC0Uhj/GLEhM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=Bn09piJp; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="Bn09piJp" 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 494ATt59025857; Fri, 4 Oct 2024 21:24:22 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 39SXQRUtqv3dCuCRZORbE6PdS2UKo6iBfrj136WCLLI=; b=Bn09piJpkl74aL3s oV7yotchFWX3d/egigHvPBkjRtE9Eua3a+f+oUUu/Z/P+EzYMp50y+VAXhE/cM3C K2PqiyEuFGYLbfDCwn9qSgSzDRRiAH/l2GYLjC8S9PcL2lFv5TZ9uB8PgT/mR2b4 SwMDMxG1qjYeE6OGkEllDfFaYCO3otByBSDLwPCzxrXjtkQ6tL1bgxLj5iLbHLx0 7msP9K9U4oYl5DR6mwHkfYmVPokDFF6nDFlCLcoSZeHGAevxL07E/dQ8frMZ+GOx B6YlTBJz0o9mQ/j2C5ZGoO3wVNJLCIKnGHXC+sRZieidyRu7m4aBjZTfECYnBgHA 9Ln9+g== Received: from nasanppmta05.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 42205kk9rc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Oct 2024 21:24:21 +0000 (GMT) Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 494LOLsr028204 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 4 Oct 2024 21:24:21 GMT Received: from hu-mojha-hyd.qualcomm.com (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Fri, 4 Oct 2024 14:24:16 -0700 From: Mukesh Ojha To: Bjorn Andersson , Mathieu Poirier , Rob Herring , "Krzysztof Kozlowski" , Conor Dooley , "Konrad Dybcio" , Bartosz Golaszewski , Manivannan Sadhasivam CC: , , , , Shiraz Hashim , Mukesh Ojha Subject: [PATCH 1/6] dt-bindings: remoteproc: qcom,pas-common: Introduce iommus and qcom,devmem property Date: Sat, 5 Oct 2024 02:53:54 +0530 Message-ID: <20241004212359.2263502-2-quic_mojha@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241004212359.2263502-1-quic_mojha@quicinc.com> References: <20241004212359.2263502-1-quic_mojha@quicinc.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: tp2FVau3JffewU54Y8bYH2Tadybq9hSw X-Proofpoint-GUID: tp2FVau3JffewU54Y8bYH2Tadybq9hSw X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 lowpriorityscore=0 mlxscore=0 priorityscore=1501 phishscore=0 bulkscore=0 impostorscore=0 malwarescore=0 suspectscore=0 mlxlogscore=627 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2409260000 definitions=main-2410040148 From: Shiraz Hashim Qualcomm’s PAS implementation for remote processors only supports a single stage of IOMMU translation and is presently managed by the Qualcomm EL2 hypervisor (QHEE) if it is present. In the absence of QHEE, such as with a KVM hypervisor, IOMMU translations need to be set up by the KVM host. Remoteproc needs carveout memory region and its resource (device memory) permissions to be set before it comes up, and this information is presently available statically with QHEE. In the absence of QHEE, the boot firmware needs to overlay this information based on SoCs running with either QHEE or a KVM hypervisor (CPUs booted in EL2). The qcom,devmem property provides IOMMU devmem translation information intended for non-QHEE based systems. Signed-off-by: Shiraz Hashim Co-Developed-by: Mukesh Ojha Signed-off-by: Mukesh Ojha --- .../bindings/remoteproc/qcom,pas-common.yaml | 42 +++++++++++++++++++ .../bindings/remoteproc/qcom,sa8775p-pas.yaml | 20 +++++++++ 2 files changed, 62 insertions(+) diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,pas-common.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,pas-common.yaml index 63a82e7a8bf8..068e177ad934 100644 --- a/Documentation/devicetree/bindings/remoteproc/qcom,pas-common.yaml +++ b/Documentation/devicetree/bindings/remoteproc/qcom,pas-common.yaml @@ -52,6 +52,48 @@ properties: minItems: 1 maxItems: 3 + iommus: + maxItems: 1 + + qcom,devmem: + $ref: /schemas/types.yaml#/definitions/uint32-matrix + description: + Qualcomm’s PAS implementation for remote processors only supports a + single stage of IOMMU translation and is presently managed by the + Qualcomm EL2 hypervisor (QHEE) if it is present. In the absence of QHEE, + such as with a KVM hypervisor, IOMMU translations need to be set up by + the KVM host. Remoteproc might need some device resources and related + access permissions to be set before it comes up, and this information is + presently available statically with QHEE. + + In the absence of QHEE, the boot firmware needs to overlay this + information based on SoCs running with either QHEE or a KVM hypervisor + (CPUs booted in EL2). + + The qcom,devmem property provides IOMMU devmem translation information + intended for non-QHEE based systems. It is an array of u32 values + describing the device memory regions for which IOMMU translations need to + be set up before bringing up Remoteproc. This array consists of 4-tuples + defining the device address, physical address, size, and attribute flags + with which it has to be mapped. + + remoteproc@3000000 { + ... + + qcom,devmem = <0x82000 0x82000 0x2000 0x3>, + <0x92000 0x92000 0x1000 0x1>; + } + + items: + items: + - description: device address + - description: physical address + - description: size of mapping + - description: | + iommu attributes - IOMMU_READ, IOMMU_WRITE, IOMMU_CACHE, IOMMU_NOEXEC, IOMMU_MMIO + enum: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31 ] + qcom,smem-states: $ref: /schemas/types.yaml#/definitions/phandle-array description: States used by the AP to signal the Hexagon core diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,sa8775p-pas.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,sa8775p-pas.yaml index 7fe401a06805..503c5c9d8ea7 100644 --- a/Documentation/devicetree/bindings/remoteproc/qcom,sa8775p-pas.yaml +++ b/Documentation/devicetree/bindings/remoteproc/qcom,sa8775p-pas.yaml @@ -139,6 +139,26 @@ examples: power-domains = <&rpmhpd RPMHPD_LCX>, <&rpmhpd RPMHPD_LMX>; power-domain-names = "lcx", "lmx"; + iommus = <&apps_smmu 0x3000 0x0>; + qcom,devmem = <0x00110000 0x00110000 0x4000 0x1>, + <0x00123000 0x00123000 0x1000 0x3>, + <0x00124000 0x00124000 0x3000 0x3>, + <0x00127000 0x00127000 0x2000 0x3>, + <0x0012a000 0x0012a000 0x3000 0x3>, + <0x0012e000 0x0012e000 0x1000 0x3>, + <0x0012f000 0x0012f000 0x1000 0x1>, + <0x00144000 0x00144000 0x1000 0x1>, + <0x00148000 0x00148000 0x1000 0x1>, + <0x00149000 0x00149000 0xe000 0x3>, + <0x00157000 0x00157000 0x1000 0x3>, + <0x00158000 0x00158000 0xd000 0x3>, + <0x00165000 0x00165000 0x1000 0x3>, + <0x00172000 0x00172000 0x1000 0x3>, + <0x00173000 0x00173000 0x8000 0x3>, + <0x0017b000 0x0017b000 0x2000 0x3>, + <0x0017f000 0x0017f000 0x1000 0x3>, + <0x00184000 0x00184000 0x1000 0x1>; + interconnects = <&lpass_ag_noc MASTER_LPASS_PROC 0 &mc_virt SLAVE_EBI1 0>; memory-region = <&pil_adsp_mem>; From patchwork Fri Oct 4 21:23:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mukesh Ojha X-Patchwork-Id: 13823001 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 5F4C01B4F27; Fri, 4 Oct 2024 21:24:29 +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=1728077071; cv=none; b=mPyIBfiu83aBWVj+bFMhTtWzlbz1Pu2HdtaSNYxBdlOjiNF6qKqn1OKaru3UiENeAakUo3qf2s1NPXSkhZhHyVd84IF4dp9ZqzsBdR3D7rZfFa2pHk1kgU6sZ7eJC0GN0nfguMw4wYssl1hqNgKvDnh1ZilFUozgQouxRPku3Ns= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728077071; c=relaxed/simple; bh=q4tBnME3ZmLBM3VYDPYDhc3fIIrmtNxfDbsJFAyNXH0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=IatPuDho85oxaEzi8s/ODfXMo+hMcfGcgQhNgoohUBFrES2UWzpnaiqIdF0xpjnPWq3nF/hfKfqQT8vd9/DOiHhIq4Xt3rzOvvyVwWQfC+aFcfHOjJVZqhb4CP9s1+/1X3ISMW3zO0s5FXfiHOXM6lbefftqqP2wpBVfNexFvNg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=M8MP0w/5; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="M8MP0w/5" 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 494AWxQu025555; Fri, 4 Oct 2024 21:24:26 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= vmQHeoecDXKPRCR8Ms1Xnd97amwcuyNu8dj/p87ZFnI=; b=M8MP0w/5CVmvAfVb Yj4KNlYSzljiXmu/z4t18uPEd3LbaWxgsGMO3RcvYL0dWNyv8nenr5DEps/RXFYC /IjrukL4ZANMb54O+K3d+BvFFxYhaRodFBWBrKwb6Qfa28hgZjTzBrbXAAMyrOJf C9ejs/0UBJYpOe8qBzrLOZN4HTuI+3KHvcemJIsopFtdX+KVzPiAhkbCPAxGZDpq O1+kiqkgiu3lJixbUmaX6JNIz30iBMHKIgiMqF947J81kh5kU3u726FfO3K4K8ia xUFOh8Iq7udD1MpkFbhtV6IFhkPC5Oml/vgFWpcP0ebEE312Gb6YDbPBmLfqjNsN nZ4KyA== Received: from nasanppmta05.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 42205kk9rf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Oct 2024 21:24:25 +0000 (GMT) Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 494LOP1F028680 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 4 Oct 2024 21:24:25 GMT Received: from hu-mojha-hyd.qualcomm.com (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Fri, 4 Oct 2024 14:24:21 -0700 From: Mukesh Ojha To: Bjorn Andersson , Mathieu Poirier , Rob Herring , "Krzysztof Kozlowski" , Conor Dooley , "Konrad Dybcio" , Bartosz Golaszewski , Manivannan Sadhasivam CC: , , , , Komal Bajaj , Mukesh Ojha Subject: [PATCH 2/6] remoteproc: qcom: Add iommu map_unmap helper function Date: Sat, 5 Oct 2024 02:53:55 +0530 Message-ID: <20241004212359.2263502-3-quic_mojha@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241004212359.2263502-1-quic_mojha@quicinc.com> References: <20241004212359.2263502-1-quic_mojha@quicinc.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-ORIG-GUID: fq1HxFWB7AG4tAYwhcz0oTNOsr-ivfCX X-Proofpoint-GUID: fq1HxFWB7AG4tAYwhcz0oTNOsr-ivfCX X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 clxscore=1015 adultscore=0 lowpriorityscore=0 mlxscore=0 priorityscore=1501 phishscore=0 bulkscore=0 impostorscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2409260000 definitions=main-2410040148 From: Komal Bajaj Qualcomm remote processor's IOMMU translation running on Linux KVM host should be managed by PAS driver and to do this PAS driver need to do map and unmap remoteproc carveout memory region. Similar map and unmap private functions for the similar purpose are already available in qcom_q6v5_adsp.c. So, in motivation to reuse code, introduce common exported functions like qcom_map_unmap_carveout() such that it can be used by both qcom_q6v5_adsp and qcom_q6v5_pas. Signed-off-by: Komal Bajaj Co-Developed-by: Mukesh Ojha Signed-off-by: Mukesh Ojha --- drivers/remoteproc/qcom_common.c | 52 ++++++++++++++++++++++++++++++++ drivers/remoteproc/qcom_common.h | 3 ++ 2 files changed, 55 insertions(+) diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c index 8c8688f99f0a..1c7887dc65b4 100644 --- a/drivers/remoteproc/qcom_common.c +++ b/drivers/remoteproc/qcom_common.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -35,6 +36,8 @@ #define MINIDUMP_SS_ENCR_DONE ('D' << 24 | 'O' << 16 | 'N' << 8 | 'E' << 0) #define MINIDUMP_SS_ENABLED ('E' << 24 | 'N' << 16 | 'B' << 8 | 'L' << 0) +#define SID_MASK_DEFAULT 0xfUL + /** * struct minidump_region - Minidump region * @name : Name of the region to be dumped @@ -606,5 +609,54 @@ void qcom_remove_pdm_subdev(struct rproc *rproc, struct qcom_rproc_pdm *pdm) } EXPORT_SYMBOL_GPL(qcom_remove_pdm_subdev); +/** + * qcom_map_unmap_carveout() - iommu map and unmap carveout region + * + * @rproc: rproc handle + * @mem_phys: starting physical address of carveout region + * @mem_size: size of carveout region + * @map: if true, map otherwise, unmap + * @use_sid: decision to append sid to iova + * @sid: SID value + */ +int qcom_map_unmap_carveout(struct rproc *rproc, phys_addr_t mem_phys, size_t mem_size, + bool map, bool use_sid, unsigned long sid) +{ + unsigned long iova = mem_phys; + unsigned long sid_def_val; + int ret; + + if (!rproc->has_iommu) + return 0; + + if (!rproc->domain) + return -EINVAL; + + /* + * Remote processor like ADSP supports upto 36 bit device + * address space and some of its clients like fastrpc uses + * upper 32-35 bits to keep lower 4 bits of its SID to use + * larger address space. To keep this consistent across other + * use cases add remoteproc SID configuration for firmware + * to IOMMU for carveouts. + */ + if (use_sid && sid) { + sid_def_val = sid & SID_MASK_DEFAULT; + iova |= (sid_def_val << 32); + } + + if (map) + ret = iommu_map(rproc->domain, iova, mem_phys, mem_size, IOMMU_READ | IOMMU_WRITE, GFP_KERNEL); + else + ret = iommu_unmap(rproc->domain, iova, mem_size); + + if (ret) + dev_err(&rproc->dev, "Unable to %s IOVA Memory, ret: %d\n", + map ? "map" : "unmap", ret); + + return ret; +} +EXPORT_SYMBOL_GPL(qcom_map_unmap_carveout); + MODULE_DESCRIPTION("Qualcomm Remoteproc helper driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/remoteproc/qcom_common.h b/drivers/remoteproc/qcom_common.h index b07fbaa091a0..bbc41054e1ea 100644 --- a/drivers/remoteproc/qcom_common.h +++ b/drivers/remoteproc/qcom_common.h @@ -59,6 +59,9 @@ void qcom_add_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr, const char *ssr_name); void qcom_remove_ssr_subdev(struct rproc *rproc, struct qcom_rproc_ssr *ssr); +int qcom_map_unmap_carveout(struct rproc *rproc, phys_addr_t mem_phys, size_t mem_size, + bool map, bool use_sid, unsigned long sid); + void qcom_add_pdm_subdev(struct rproc *rproc, struct qcom_rproc_pdm *pdm); void qcom_remove_pdm_subdev(struct rproc *rproc, struct qcom_rproc_pdm *pdm); From patchwork Fri Oct 4 21:23:56 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mukesh Ojha X-Patchwork-Id: 13823002 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 9B8561C876D; Fri, 4 Oct 2024 21:24:33 +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=1728077075; cv=none; b=S1pWJHq8/EMu6VSgFpj4n+eJ/cPI0d/Q4Pqdrc7boCMBPh2WiVoUQc0O3XvY2jCx0OJGkdUIOhpFN1CN0y9gHHDIwHOllmygFAXPL9gPMp9S+ryXVUBKsYCVF6BGf4nymEY6hj+1AWeM7pKzmkOIg912SwXI7rgPKIoGFqGVv9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728077075; c=relaxed/simple; bh=zoxv6uAiNsvDtClhZxDLHvjQsP4e+K2ToA4yyF9n5T4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=NyVgonpNRcCXDsoup4S015oyfDeb+Apb/ca2QpFiMHW3k6TKaqSzm7Zp+WlWAFgiery5pfBAs8C99W5oVAo4DB2zIrOU8KPDalLjW3LMsflqYk6ayo63iLEf9q4uJTCoxmLoQw2WDqYAqQvSxRoNh26L6MsMJCYY907I0DhMVGA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=XleIe/8F; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="XleIe/8F" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 494B5gdW000857; Fri, 4 Oct 2024 21:24:30 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= MkSMFqmq9KpqjkV/7DIt+XPICfTTXaFosim8OCZPukg=; b=XleIe/8F23w5o8Gh shP1Rj6kqDZqZ46nX+tdsW/Y9hLOK+oD6ywI73uvpEmsXExVdwcMNxpxTc+Hobpl BU7q39DmJd5R5R5bPv1kkgBHI72rySwYVCY+yHeYKU2RugwSvhokXNrREjBIcF/t Sgq8yC83o4hf5ix/4Wk56Kzf1Bm4V96l6OgTlfFUJNhTEFLhOCPiO78xFyemTZTe P60YbPvJETiiVXJDsL3Ciyx8MdfZjR3Ohmaj9GS0/0AIh47Dqu4YW0l2YpEQYpX7 SaWtKhdtD126K+43SxRB1AjHOweSIQmWCJxdzaZG5eZduhpXir3QDfOQwQ4Tnrf0 fZfNEQ== Received: from nasanppmta05.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 42205f39aq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Oct 2024 21:24:30 +0000 (GMT) Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA05.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 494LOTTh028848 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 4 Oct 2024 21:24:29 GMT Received: from hu-mojha-hyd.qualcomm.com (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Fri, 4 Oct 2024 14:24:25 -0700 From: Mukesh Ojha To: Bjorn Andersson , Mathieu Poirier , Rob Herring , "Krzysztof Kozlowski" , Conor Dooley , "Konrad Dybcio" , Bartosz Golaszewski , Manivannan Sadhasivam CC: , , , , Shiraz Hashim , Mukesh Ojha Subject: [PATCH 3/6] remoteproc: qcom: Add helper function to support IOMMU devmem translation Date: Sat, 5 Oct 2024 02:53:56 +0530 Message-ID: <20241004212359.2263502-4-quic_mojha@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241004212359.2263502-1-quic_mojha@quicinc.com> References: <20241004212359.2263502-1-quic_mojha@quicinc.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: rEJPNYJazC8d2KQD9hj8ViYb6dLxOmA- X-Proofpoint-ORIG-GUID: rEJPNYJazC8d2KQD9hj8ViYb6dLxOmA- X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 mlxlogscore=999 priorityscore=1501 phishscore=0 bulkscore=0 impostorscore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2409260000 definitions=main-2410040148 From: Shiraz Hashim Qualcomm SoCs runnning with Qualcomm EL2 hypervisor(QHEE), IOMMU translation set up for remote processors is managed by QHEE itself however, for a case when these remote processors has to run under KVM hypervisor, IOMMU translation need to setup from Linux remoteproc driver before it is brought up. Add qcom_devmem_info and qcom_devmem_table data structure and make a common helper functions which caller can call if these translation need to be taken care by the driver to enable iommu devmem access for remoteproc processors. Signed-off-by: Shiraz Hashim Co-developed-by: Mukesh Ojha Signed-off-by: Mukesh Ojha --- drivers/remoteproc/qcom_common.c | 96 ++++++++++++++++++++++++++++++++ drivers/remoteproc/qcom_common.h | 35 ++++++++++++ 2 files changed, 131 insertions(+) diff --git a/drivers/remoteproc/qcom_common.c b/drivers/remoteproc/qcom_common.c index 1c7887dc65b4..644920972b58 100644 --- a/drivers/remoteproc/qcom_common.c +++ b/drivers/remoteproc/qcom_common.c @@ -658,5 +658,101 @@ int qcom_map_unmap_carveout(struct rproc *rproc, phys_addr_t mem_phys, size_t me } EXPORT_SYMBOL_GPL(qcom_map_unmap_carveout); +/** + * qcom_map_devmem() - Map the device memories needed by Remoteproc using IOMMU + * + * When Qualcomm EL2 hypervisor(QHEE) present, device memories needed for remoteproc + * processors is managed by it and Linux remoteproc drivers should not call + * this and its respective unmap function in such scenario. This function + * should only be called if remoteproc IOMMU translation need to be managed + * from Linux side. + * + * @rproc: rproc handle + * @devmem_table: list of devmem regions to map + * @use_sid: decision to append sid to iova + * @sid: SID value + */ +int qcom_map_devmem(struct rproc *rproc, struct qcom_devmem_table *devmem_table, + bool use_sid, unsigned long sid) +{ + struct qcom_devmem_info *info; + unsigned long sid_def_val; + int ret; + int i; + + if (!rproc->has_iommu) + return 0; + + if (!rproc->domain) + return -EINVAL; + + /* remoteproc may not have devmem data */ + if (!devmem_table) + return 0; + + if (use_sid && sid) + sid_def_val = sid & SID_MASK_DEFAULT; + + info = &devmem_table->entries[0]; + for (i = 0; i < devmem_table->num_entries; i++, info++) { + /* + * Remote processor like ADSP supports upto 36 bit device + * address space and some of its clients like fastrpc uses + * upper 32-35 bits to keep lower 4 bits of its SID to use + * larger address space. To keep this consistent across other + * use cases add remoteproc SID configuration for firmware + * to IOMMU for carveouts. + */ + if (use_sid) + info->da |= (sid_def_val << 32); + + ret = iommu_map(rproc->domain, info->da, info->pa, info->len, info->flags, GFP_KERNEL); + if (ret) { + dev_err(&rproc->dev, "Unable to map devmem, ret: %d\n", ret); + if (use_sid) + info->da &= ~(SID_MASK_DEFAULT << 32); + goto undo_mapping; + } + } + + return 0; + +undo_mapping: + for (i = i - 1; i >= 0; i--, info--) { + iommu_unmap(rproc->domain, info->da, info->len); + if (use_sid) + info->da &= ~(SID_MASK_DEFAULT << 32); + } + + return ret; +} +EXPORT_SYMBOL_GPL(qcom_map_devmem); + +/** + * qcom_unmap_devmem() - unmap the device memories needed by Remoteproc using IOMMU + * + * @rproc: rproc handle + * @devmem_table: list of devmem regions to unmap + * @use_sid: decision to append sid to iova + */ +void qcom_unmap_devmem(struct rproc *rproc, struct qcom_devmem_table *devmem_table, bool use_sid) +{ + struct qcom_devmem_info *info; + int i; + + if (!rproc->has_iommu || !rproc->domain || !devmem_table) + return; + + info = &devmem_table->entries[0]; + for (i = 0; i < devmem_table->num_entries; i++, info++) { + iommu_unmap(rproc->domain, info->da, info->len); + if (use_sid) + info->da &= ~(SID_MASK_DEFAULT << 32); + } + + return; +} +EXPORT_SYMBOL_GPL(qcom_unmap_devmem); + MODULE_DESCRIPTION("Qualcomm Remoteproc helper driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/remoteproc/qcom_common.h b/drivers/remoteproc/qcom_common.h index bbc41054e1ea..bbc684e1df01 100644 --- a/drivers/remoteproc/qcom_common.h +++ b/drivers/remoteproc/qcom_common.h @@ -41,6 +41,36 @@ struct qcom_rproc_pdm { struct auxiliary_device *adev; }; +/** + * struct qcom_devmem_info - iommu devmem region + * @da: device address + * @pa: physical address + * @len: length (in bytes) + * @flags: iommu protection flags + * + * The resource entry carries the device address to which a physical address is + * to be mapped with required permissions in flag. The pa, len is expected to + * be a physically contiguous memory region. + */ +struct qcom_devmem_info { + u64 da; + u64 pa; + u32 len; + u32 flags; +}; + +/** + * struct qcom_devmem_table - iommu devmem entries + * @num_entries: number of devmem entries + * @entries: devmem entries + * + * The table that carries each devmem resource entry. + */ +struct qcom_devmem_table { + int num_entries; + struct qcom_devmem_info entries[0]; +}; + void qcom_minidump(struct rproc *rproc, unsigned int minidump_id, void (*rproc_dumpfn_t)(struct rproc *rproc, struct rproc_dump_segment *segment, void *dest, size_t offset, @@ -65,6 +95,11 @@ int qcom_map_unmap_carveout(struct rproc *rproc, phys_addr_t mem_phys, size_t me void qcom_add_pdm_subdev(struct rproc *rproc, struct qcom_rproc_pdm *pdm); void qcom_remove_pdm_subdev(struct rproc *rproc, struct qcom_rproc_pdm *pdm); +int qcom_map_devmem(struct rproc *rproc, struct qcom_devmem_table *table, + bool use_sid, unsigned long sid); +void qcom_unmap_devmem(struct rproc *rproc, struct qcom_devmem_table *table, + bool use_sid); + #if IS_ENABLED(CONFIG_QCOM_SYSMON) struct qcom_sysmon *qcom_add_sysmon_subdev(struct rproc *rproc, const char *name, From patchwork Fri Oct 4 21:23:57 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mukesh Ojha X-Patchwork-Id: 13823003 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 27FCD1D89EE; Fri, 4 Oct 2024 21:24:37 +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=1728077078; cv=none; b=hpw1qG9Jo13/A+xPFN+dT7jP8WhjsmYMP0xyZc2sBKpyD1X4BEdmcXhXGawCWxQ6mpgHUUK2R2EPY6wlOyzO9EKbS8hRW0lsJg4ey5K9c5YaueBE2pdYpNU8zKfs3lhXbwZZucFvntOhH6sa1UNwT6VmvHv6OgoBeNrb+iO5KmQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728077078; c=relaxed/simple; bh=Ag7eWOnfsome4cLzCawlMX/vVVMLOEIP63UtPxZ4AXk=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=n1qcNPW1JkZuHY+ygACWjkwV7W5zwD7FpWKOGAX1upXcSh08T01W6lqD+4BJnIb5Y+9Kgb3sbRT54GRms12wPXpelFszkQ54rqvwJwQcfP6wrPTvKO/sNq2O6VrzJd0Ae/PSTQsmYW93pQ0pSZglI6ueID0d9SiUedmRr4aI7iQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=hX1XYQ8v; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="hX1XYQ8v" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 494A4g2L031989; Fri, 4 Oct 2024 21:24:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ueMGGG77ORz1rgpGmJ3mMELP2opMMlzqDh7mhU5mBoc=; b=hX1XYQ8vmR55OoPP sMHOOwVUMrD8pUQE7zUvtEzUspIMIhgRln44XZlF9AstZc5C2PxF1p1SkDGQWg1K 0+wzL+wWE4OKTUNOYS59pXjlemgzQ//cdQ3lPoiPsp96MVdvfMB06A69mWRIQGd2 gMZVjkOg7/AQi396iuO03ynXCAw5UbsSjKvRKm+AahYIaN6ZhocrK7amcq7yUVwf lyHXqFLW3isGfDLqSi35r97jhHnhe1FXbqTuSm6j3i24wIVJABM/tCEybCNxd4hr z6tVDLpaYBFz6R5+gjVaYOdxIHeK8udaBzwlu6JLiHeEjbMSldvJWQ4UdRoMkalk l6MNXg== Received: from nasanppmta04.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 42205f39ax-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Oct 2024 21:24:34 +0000 (GMT) Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA04.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 494LOXXT005498 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 4 Oct 2024 21:24:33 GMT Received: from hu-mojha-hyd.qualcomm.com (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Fri, 4 Oct 2024 14:24:29 -0700 From: Mukesh Ojha To: Bjorn Andersson , Mathieu Poirier , Rob Herring , "Krzysztof Kozlowski" , Conor Dooley , "Konrad Dybcio" , Bartosz Golaszewski , Manivannan Sadhasivam CC: , , , , Shiraz Hashim , Mukesh Ojha Subject: [PATCH 4/6] remoteproc: qcom: Add support to parse qcom,devmem property Date: Sat, 5 Oct 2024 02:53:57 +0530 Message-ID: <20241004212359.2263502-5-quic_mojha@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241004212359.2263502-1-quic_mojha@quicinc.com> References: <20241004212359.2263502-1-quic_mojha@quicinc.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: X-U1aWEMgeaLRZT-cdi_3nhg9i6jfHUs X-Proofpoint-ORIG-GUID: X-U1aWEMgeaLRZT-cdi_3nhg9i6jfHUs X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 mlxlogscore=999 priorityscore=1501 phishscore=0 bulkscore=0 impostorscore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2409260000 definitions=main-2410040148 From: Shiraz Hashim Qualcomm remote processors firmware does not contain resource table data where devmem setting information should actually be present and for its SoC running with Qualcomm EL2 hypervisor(QHEE), IOMMU translation for remoteproc is managed by QHEE and it has all the IOMMU resource information available to it to apply the settings however, when the same SoCs run with KVM hypervisor these translation needs to setup by remoteproc PAS driver and required setting information is being overlaid from boot firmware to remoteproc device tree node. Add helper function which parses qcom,devmem information. Signed-off-by: Shiraz Hashim Co-developed-by: Mukesh Ojha Signed-off-by: Mukesh Ojha --- drivers/remoteproc/qcom_q6v5_pas.c | 55 ++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c index ef82835e98a4..bdb071ab5938 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -34,6 +34,7 @@ #define ADSP_DECRYPT_SHUTDOWN_DELAY_MS 100 #define MAX_ASSIGN_COUNT 3 +#define DEVMEM_ENTRY_SIZE 4 struct adsp_data { int crash_reason_smem; @@ -117,6 +118,8 @@ struct qcom_adsp { struct qcom_scm_pas_metadata pas_metadata; struct qcom_scm_pas_metadata dtb_pas_metadata; + + struct qcom_devmem_table *devmem; }; static void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment, @@ -683,6 +686,58 @@ static void adsp_unassign_memory_region(struct qcom_adsp *adsp) } } +static int adsp_devmem_init(struct qcom_adsp *adsp) +{ + unsigned int entry_size = DEVMEM_ENTRY_SIZE; + struct qcom_devmem_table *devmem_table; + struct rproc *rproc = adsp->rproc; + struct device *dev = adsp->dev; + struct qcom_devmem_info *info; + char *pname = "qcom,devmem"; + size_t table_size; + int num_entries; + u32 i; + + if (!rproc->has_iommu) + return 0; + + /* devmem property is a set of n-tuple */ + num_entries = of_property_count_u32_elems(dev->of_node, pname); + if (num_entries < 0) { + dev_err(adsp->dev, "No '%s' property present\n", pname); + return num_entries; + } + + if (!num_entries || (num_entries % entry_size)) { + dev_err(adsp->dev, "All '%s' list entries need %d vals\n", pname, + entry_size); + return -EINVAL; + } + + num_entries /= entry_size; + table_size = sizeof(*devmem_table) + sizeof(*info) * num_entries; + devmem_table = devm_kzalloc(dev, table_size, GFP_KERNEL); + if (!devmem_table) + return -ENOMEM; + + devmem_table->num_entries = num_entries; + info = &devmem_table->entries[0]; + for (i = 0; i < num_entries; i++, info++) { + of_property_read_u32_index(dev->of_node, pname, + i * entry_size, (u32 *)&info->da); + of_property_read_u32_index(dev->of_node, pname, + i * entry_size + 1, (u32 *)&info->pa); + of_property_read_u32_index(dev->of_node, pname, + i * entry_size + 2, &info->len); + of_property_read_u32_index(dev->of_node, pname, + i * entry_size + 3, &info->flags); + } + + adsp->devmem = devmem_table; + + return 0; +} + static int adsp_probe(struct platform_device *pdev) { const struct adsp_data *desc; From patchwork Fri Oct 4 21:23:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mukesh Ojha X-Patchwork-Id: 13823010 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 236DD1D8A15; Fri, 4 Oct 2024 21:24:42 +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=1728077083; cv=none; b=VBHvluC0Ot3xBma6qpKV17ZrBerWmWa3QB8+Qc12uFyudjD6+f1BGH9w8tUS/XP+eFmBl1Q3C9OQ+9m5XPJBzUL7qTQsA+BXgAPfIDc93ripQrpJAScvZzPYIJqiO4mX6fykgQd0nyrD6AwKpR3YD5negMagfw4auOTRvVbwPCg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728077083; c=relaxed/simple; bh=0EYUUr0ga26pPFqLI/gkRjikkRomIkXGXxPFRBVM+VQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Hrbm1ynyZhAtutjeOK3WQV6qzQeK0aFL12IC4XYxjVfxlpIKTeQaNRuFL93rw/IoYYGHsL7rkx7c7Vxp+pZQl21Ld3KBnQIKaKqofWMzz0TFmzh62lf/TdHkhYSAFmd6VWqDqiyDgI0FdRe+9MAYabqRqstwqnytG9nb/0BQ1ko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=cfYViryI; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="cfYViryI" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 494ACKOs029088; Fri, 4 Oct 2024 21:24:39 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= mhUfVFbtnu+c6GRfGQsDfS33AtdycGH7V0BwwMUaqrI=; b=cfYViryIIqhMplzT FJvSKa1k9qvflmvQ7G4spq6loH4KB2a4gpRS6Oq2lQPnmkd3v+2aOkYF+Kx0xJtD 9grebunBJqUONH0KFUU79/u9j740Bs26o7nXu2IiCwOfgpoWH/UBEPZcCn6K8/Lf 4nLTz9+y232lI4jXxD1q5GOiKJ8YhK3D0a0pTP5yCutb5eAzT3EJqEACZE2VukRw sdGaabqbuIBF2/82984jnlaZ669yrgjloUcYRHCFWwUVnNSrLrJODf51pYSzgj2B 7EqRWEjlFV4GJlsq2U/MCUKSYFcHdgCPCNKPjizxLW1ym71W2He80OxR1ER2k1ae YZ2ODg== Received: from nasanppmta02.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 42205hba74-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Oct 2024 21:24:38 +0000 (GMT) Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA02.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 494LOb7a007294 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 4 Oct 2024 21:24:37 GMT Received: from hu-mojha-hyd.qualcomm.com (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Fri, 4 Oct 2024 14:24:33 -0700 From: Mukesh Ojha To: Bjorn Andersson , Mathieu Poirier , Rob Herring , "Krzysztof Kozlowski" , Conor Dooley , "Konrad Dybcio" , Bartosz Golaszewski , Manivannan Sadhasivam CC: , , , , Mukesh Ojha Subject: [PATCH 5/6] remoteproc: qcom: Add support of SHM bridge to enable memory protection Date: Sat, 5 Oct 2024 02:53:58 +0530 Message-ID: <20241004212359.2263502-6-quic_mojha@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241004212359.2263502-1-quic_mojha@quicinc.com> References: <20241004212359.2263502-1-quic_mojha@quicinc.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: ZWoBSKDGp8hdkpCoVnrK_PgM9lMswc_F X-Proofpoint-ORIG-GUID: ZWoBSKDGp8hdkpCoVnrK_PgM9lMswc_F X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 malwarescore=0 clxscore=1015 mlxlogscore=999 phishscore=0 priorityscore=1501 impostorscore=0 lowpriorityscore=0 spamscore=0 bulkscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2409260000 definitions=main-2410040148 Qualcomm SoCs running with the Qualcomm EL2 hypervisor(QHEE) have been utilizing the Peripheral Authentication Service (PAS) from its TrustZone (TZ) firmware to securely authenticate and reset via sequence of SMC calls like qcom_scm_pas_init_image(), qcom_scm_pas_mem_setup(), and qcom_scm_pas_auth_and_reset(). Memory protection need to be enabled for both meta data memory region and remoteproc carveout memory region. For memory passed to Qualcomm TrustZone, the memory should be part of SHM bridge memory. However, when QHEE is present, PAS SMC calls are getting trapped in QHEE, which create or gets memory from SHM bridge for both meta data memory and for remoteproc carve out regions before it get passed to TZ. However, in absence of QHEE hypervisor, Linux need to create SHM bridge for both meta data in qcom_scm_pas_init_image() and for remoteproc memory before the call being made to qcom_scm_pas_auth_and_reset(). For qcom_scm_pas_init_image() call, metadata content need to be copied to the buffer allocated from SHM bridge before making the SMC call. For qcom_scm_pas_auth_and_reset(), remoteproc memory region need to be protected and for that SHM bridge need to be created. Make qcom_tzmem_init_area() and qcom_tzmem_cleanup_area() exported symbol so that it could be used to create SHM bridge for remoteproc region. Signed-off-by: Mukesh Ojha --- drivers/firmware/qcom/qcom_scm.c | 29 +++++++++++----- drivers/firmware/qcom/qcom_tzmem.c | 14 +++----- drivers/remoteproc/qcom_q6v5_pas.c | 44 ++++++++++++++++++++++++ include/linux/firmware/qcom/qcom_scm.h | 1 + include/linux/firmware/qcom/qcom_tzmem.h | 10 ++++++ 5 files changed, 80 insertions(+), 18 deletions(-) diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c index 10986cb11ec0..dafc07dc181f 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -591,15 +591,19 @@ int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size, * data blob, so make sure it's physically contiguous, 4K aligned and * non-cachable to avoid XPU violations. * - * For PIL calls the hypervisor creates SHM Bridges for the blob - * buffers on behalf of Linux so we must not do it ourselves hence - * not using the TZMem allocator here. + * For PIL calls the hypervisor like Gunyah or older QHEE creates SHM + * Bridges for the blob buffers on behalf of Linux so we must not do it + * ourselves hence use TZMem allocator only when these hypervisors are + * not present. * * If we pass a buffer that is already part of an SHM Bridge to this * call, it will fail. */ - mdata_buf = dma_alloc_coherent(__scm->dev, size, &mdata_phys, - GFP_KERNEL); + if (ctx && ctx->shm_bridge_needed) + mdata_buf = qcom_tzmem_alloc(__scm->mempool, size, GFP_KERNEL); + else + mdata_buf = dma_alloc_coherent(__scm->dev, size, &mdata_phys, GFP_KERNEL); + if (!mdata_buf) return -ENOMEM; @@ -613,7 +617,10 @@ int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size, if (ret) goto disable_clk; - desc.args[1] = mdata_phys; + if (ctx && ctx->shm_bridge_needed) + desc.args[1] = qcom_tzmem_to_phys(mdata_buf); + else + desc.args[1] = mdata_phys; ret = qcom_scm_call(__scm->dev, &desc, &res); qcom_scm_bw_disable(); @@ -625,8 +632,11 @@ int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size, if (ret < 0 || !ctx) { dma_free_coherent(__scm->dev, size, mdata_buf, mdata_phys); } else if (ctx) { + if (ctx->shm_bridge_needed) + ctx->phys = qcom_tzmem_to_phys(mdata_buf); + else + ctx->phys = mdata_phys; ctx->ptr = mdata_buf; - ctx->phys = mdata_phys; ctx->size = size; } @@ -643,7 +653,10 @@ void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx) if (!ctx->ptr) return; - dma_free_coherent(__scm->dev, ctx->size, ctx->ptr, ctx->phys); + if (ctx->shm_bridge_needed) + qcom_tzmem_free(ctx->ptr); + else + dma_free_coherent(__scm->dev, ctx->size, ctx->ptr, ctx->phys); ctx->ptr = NULL; ctx->phys = 0; diff --git a/drivers/firmware/qcom/qcom_tzmem.c b/drivers/firmware/qcom/qcom_tzmem.c index 92b365178235..66aba2fc979d 100644 --- a/drivers/firmware/qcom/qcom_tzmem.c +++ b/drivers/firmware/qcom/qcom_tzmem.c @@ -22,14 +22,6 @@ #include "qcom_tzmem.h" -struct qcom_tzmem_area { - struct list_head list; - void *vaddr; - dma_addr_t paddr; - size_t size; - void *priv; -}; - struct qcom_tzmem_pool { struct gen_pool *genpool; struct list_head areas; @@ -107,7 +99,7 @@ static int qcom_tzmem_init(void) return 0; } -static int qcom_tzmem_init_area(struct qcom_tzmem_area *area) +int qcom_tzmem_init_area(struct qcom_tzmem_area *area) { u64 pfn_and_ns_perm, ipfn_and_s_perm, size_and_flags; int ret; @@ -133,8 +125,9 @@ static int qcom_tzmem_init_area(struct qcom_tzmem_area *area) return 0; } +EXPORT_SYMBOL_GPL(qcom_tzmem_init_area); -static void qcom_tzmem_cleanup_area(struct qcom_tzmem_area *area) +void qcom_tzmem_cleanup_area(struct qcom_tzmem_area *area) { u64 *handle = area->priv; @@ -144,6 +137,7 @@ static void qcom_tzmem_cleanup_area(struct qcom_tzmem_area *area) qcom_scm_shm_bridge_delete(qcom_tzmem_dev, *handle); kfree(handle); } +EXPORT_SYMBOL_GPL(qcom_tzmem_cleanup_area); #endif /* CONFIG_QCOM_TZMEM_MODE_SHMBRIDGE */ diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c index bdb071ab5938..ac339145e072 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,7 @@ struct qcom_adsp { struct qcom_scm_pas_metadata dtb_pas_metadata; struct qcom_devmem_table *devmem; + struct qcom_tzmem_area *tzmem; }; static void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment, @@ -262,6 +264,43 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw) return ret; } +static int adsp_create_shmbridge(struct qcom_adsp *adsp) +{ + struct qcom_tzmem_area *rproc_tzmem; + struct rproc *rproc = adsp->rproc; + int ret; + + if (!rproc->has_iommu) + return 0; + + rproc_tzmem = devm_kzalloc(adsp->dev, sizeof(*rproc_tzmem), GFP_KERNEL); + if (!rproc_tzmem) + return -ENOMEM; + + rproc_tzmem->size = PAGE_ALIGN(adsp->mem_size); + rproc_tzmem->paddr = adsp->mem_phys; + ret = qcom_tzmem_init_area(rproc_tzmem); + if (ret) { + dev_err(adsp->dev, + "failed to create shmbridge for carveout: %d\n", ret); + return ret; + } + + adsp->tzmem = rproc_tzmem; + + return ret; +} + +static void adsp_delete_shmbridge(struct qcom_adsp *adsp) +{ + struct rproc *rproc = adsp->rproc; + + if (!rproc->has_iommu) + return; + + qcom_tzmem_cleanup_area(adsp->tzmem); +} + static int adsp_start(struct rproc *rproc) { struct qcom_adsp *adsp = rproc->priv; @@ -317,6 +356,10 @@ static int adsp_start(struct rproc *rproc) qcom_pil_info_store(adsp->info_name, adsp->mem_phys, adsp->mem_size); + ret = adsp_create_shmbridge(adsp); + if (ret) + goto release_pas_metadata; + ret = qcom_scm_pas_auth_and_reset(adsp->pas_id); if (ret) { dev_err(adsp->dev, @@ -324,6 +367,7 @@ static int adsp_start(struct rproc *rproc) goto release_pas_metadata; } + adsp_delete_shmbridge(adsp); ret = qcom_q6v5_wait_for_start(&adsp->q6v5, msecs_to_jiffies(5000)); if (ret == -ETIMEDOUT) { dev_err(adsp->dev, "start timed out\n"); diff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmware/qcom/qcom_scm.h index 9f14976399ab..25243cd889bb 100644 --- a/include/linux/firmware/qcom/qcom_scm.h +++ b/include/linux/firmware/qcom/qcom_scm.h @@ -70,6 +70,7 @@ struct qcom_scm_pas_metadata { void *ptr; dma_addr_t phys; ssize_t size; + bool shm_bridge_needed; }; int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, size_t size, diff --git a/include/linux/firmware/qcom/qcom_tzmem.h b/include/linux/firmware/qcom/qcom_tzmem.h index b83b63a0c049..e0a57cc8f74b 100644 --- a/include/linux/firmware/qcom/qcom_tzmem.h +++ b/include/linux/firmware/qcom/qcom_tzmem.h @@ -39,6 +39,14 @@ struct qcom_tzmem_pool_config { size_t max_size; }; +struct qcom_tzmem_area { + struct list_head list; + void *vaddr; + dma_addr_t paddr; + size_t size; + void *priv; +}; + struct qcom_tzmem_pool * qcom_tzmem_pool_new(const struct qcom_tzmem_pool_config *config); void qcom_tzmem_pool_free(struct qcom_tzmem_pool *pool); @@ -48,6 +56,8 @@ devm_qcom_tzmem_pool_new(struct device *dev, void *qcom_tzmem_alloc(struct qcom_tzmem_pool *pool, size_t size, gfp_t gfp); void qcom_tzmem_free(void *ptr); +int qcom_tzmem_init_area(struct qcom_tzmem_area *area); +void qcom_tzmem_cleanup_area(struct qcom_tzmem_area *area); DEFINE_FREE(qcom_tzmem, void *, if (_T) qcom_tzmem_free(_T)) From patchwork Fri Oct 4 21:23:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mukesh Ojha X-Patchwork-Id: 13823011 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 BBC871B4F1E; Fri, 4 Oct 2024 21:24:45 +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=1728077087; cv=none; b=uHdZEldn8skaTu8NdVmqoK0Tq+CF0ImfMTAbYiKtzxOeLUhkZuwQ4EJ/P9HBqj/6L0LTOu2RfmgsfKsYPBpCavIQMmSAJXSJctWY/4D1ZQhIy+KA1KWccs2l2DtfW5D4e+Sd/+6wlxdz3sm2ShjfIEExz9ixI98MPp3RMhh3L4Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1728077087; c=relaxed/simple; bh=TKSyFsbXLZGbesZuM+CcS5mtAUbRfjiYzoF16zmej50=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=a9QjyJkf1UOkBmZiv2OeR5yHTwmJv+gPidH3CJee+4ef7lJO9jtAsDk0OsvzirN5ioObsib+PzkeJfEDdo7mEBKBUTur4U6goQgjpqBQuqE1BsOSBA+bm+1WgToyDjEpv0HoERTKZTDFzjvdzWZBnLmVZDf5T70112ZgsiZDKjk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com; spf=pass smtp.mailfrom=quicinc.com; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b=hbggFQND; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=quicinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=quicinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="hbggFQND" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 494A588c026296; Fri, 4 Oct 2024 21:24:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 9vcR8uw5rL4brrJsjI95droFBkl0TyoLuA4DEb0AksM=; b=hbggFQND8QLl2Ikt lkjgLXBXdl8TyBZR0azSKgoMdzEOMQuseUms6ckktifq9uFo2PA1I+LWlfiFv0sP lD5YyARYqfXcSYlte90UyN91xWPcDReB5b8iPQSoC9vEWrdgK4Gl6joFhp5hjWaf ARlMPZY8KID8I0027yZRYPpIvxGcwH5TqDZ7cQCnTbrBcnJzG5HZi7dHtX6r7xVh CbxuuHI5gJCzwNqeGm1l+oiKhqKGDStoIougbPJFZz8s3JqaMv2gfC+M/6ZZ5Yp9 BJDVzlbx7iNlj3VXcYof1e7Medg3iuEP9Z0oU14iHYr9EIH2GF29bxrfhF5rWH/X CNLJBg== Received: from nasanppmta02.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 42205jkakt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 04 Oct 2024 21:24:42 +0000 (GMT) Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA02.qualcomm.com (8.18.1.2/8.18.1.2) with ESMTPS id 494LOf7t007310 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 4 Oct 2024 21:24:41 GMT Received: from hu-mojha-hyd.qualcomm.com (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.9; Fri, 4 Oct 2024 14:24:37 -0700 From: Mukesh Ojha To: Bjorn Andersson , Mathieu Poirier , Rob Herring , "Krzysztof Kozlowski" , Conor Dooley , "Konrad Dybcio" , Bartosz Golaszewski , Manivannan Sadhasivam CC: , , , , Mukesh Ojha Subject: [PATCH 6/6] remoteproc: qcom: Enable map/unmap and SHM bridge support Date: Sat, 5 Oct 2024 02:53:59 +0530 Message-ID: <20241004212359.2263502-7-quic_mojha@quicinc.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20241004212359.2263502-1-quic_mojha@quicinc.com> References: <20241004212359.2263502-1-quic_mojha@quicinc.com> Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-ClientProxiedBy: nasanex01a.na.qualcomm.com (10.52.223.231) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: O33KIk_m2Wxv9CUVPkpsby8As9vkmR_E X-Proofpoint-ORIG-GUID: O33KIk_m2Wxv9CUVPkpsby8As9vkmR_E X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.60.29 definitions=2024-09-06_09,2024-09-06_01,2024-09-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 mlxlogscore=999 priorityscore=1501 malwarescore=0 clxscore=1015 phishscore=0 bulkscore=0 impostorscore=0 mlxscore=0 lowpriorityscore=0 suspectscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2409260000 definitions=main-2410040148 For Qualcomm SoCs runnning with Qualcomm EL2 hypervisor(QHEE), IOMMU translation for remote processors is managed by QHEE and if the same SoC run under KVM, remoteproc carveout and devmem region should be IOMMU mapped from Linux PAS driver before remoteproc is brought up and unmapped once it is tear down and apart from this, SHM bridge also need to set up to enable memory protection on both remoteproc meta data memory as well as for the carveout region. Enable the support required to run Qualcomm remoteprocs on non-QHEE hypervisors. Signed-off-by: Mukesh Ojha --- drivers/remoteproc/qcom_q6v5_pas.c | 41 +++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c index ac339145e072..13bd13f1b989 100644 --- a/drivers/remoteproc/qcom_q6v5_pas.c +++ b/drivers/remoteproc/qcom_q6v5_pas.c @@ -122,6 +122,7 @@ struct qcom_adsp { struct qcom_devmem_table *devmem; struct qcom_tzmem_area *tzmem; + unsigned long sid; }; static void adsp_segment_dump(struct rproc *rproc, struct rproc_dump_segment *segment, @@ -310,9 +311,21 @@ static int adsp_start(struct rproc *rproc) if (ret) return ret; + ret = qcom_map_unmap_carveout(rproc, adsp->mem_phys, adsp->mem_size, true, true, adsp->sid); + if (ret) { + dev_err(adsp->dev, "iommu mapping failed, ret: %d\n", ret); + goto disable_irqs; + } + + ret = qcom_map_devmem(rproc, adsp->devmem, true, adsp->sid); + if (ret) { + dev_err(adsp->dev, "devmem iommu mapping failed, ret: %d\n", ret); + goto unmap_carveout; + } + ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count); if (ret < 0) - goto disable_irqs; + goto unmap_devmem; ret = clk_prepare_enable(adsp->xo); if (ret) @@ -400,6 +413,10 @@ static int adsp_start(struct rproc *rproc) clk_disable_unprepare(adsp->xo); disable_proxy_pds: adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count); +unmap_devmem: + qcom_unmap_devmem(rproc, adsp->devmem, adsp->sid); +unmap_carveout: + qcom_map_unmap_carveout(rproc, adsp->mem_phys, adsp->mem_size, false, true, adsp->sid); disable_irqs: qcom_q6v5_unprepare(&adsp->q6v5); @@ -445,6 +462,9 @@ static int adsp_stop(struct rproc *rproc) dev_err(adsp->dev, "failed to shutdown dtb: %d\n", ret); } + qcom_unmap_devmem(rproc, adsp->devmem, adsp->sid); + qcom_map_unmap_carveout(rproc, adsp->mem_phys, adsp->mem_size, false, true, adsp->sid); + handover = qcom_q6v5_unprepare(&adsp->q6v5); if (handover) qcom_pas_handover(&adsp->q6v5); @@ -844,6 +864,25 @@ static int adsp_probe(struct platform_device *pdev) } platform_set_drvdata(pdev, adsp); + if (of_property_present(pdev->dev.of_node, "iommus")) { + struct of_phandle_args args; + + ret = of_parse_phandle_with_args(pdev->dev.of_node, "iommus", "#iommu-cells", 0, &args); + if (ret < 0) + return ret; + + rproc->has_iommu = true; + adsp->sid = args.args[0]; + of_node_put(args.np); + ret = adsp_devmem_init(adsp); + if (ret) + return ret; + + adsp->pas_metadata.shm_bridge_needed = true; + } else { + rproc->has_iommu = false; + } + ret = device_init_wakeup(adsp->dev, true); if (ret) goto free_rproc;