* [PATCH v4 2/3] soc: qcom: rmtfs: Optionally map RMTFS to more VMs
2023-01-09 13:05 [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array Konrad Dybcio
@ 2023-01-09 13:05 ` Konrad Dybcio
2023-01-09 13:05 ` [PATCH v4 3/3] dt-bindings: firmware: qcom: scm: Separate VMIDs from header to bindings Konrad Dybcio
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Konrad Dybcio @ 2023-01-09 13:05 UTC (permalink / raw)
To: linux-arm-msm, andersson, agross, krzysztof.kozlowski
Cc: marijn.suijten, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
devicetree, linux-kernel, Loic Poulain,
AngeloGioacchino Del Regno, Stephan Gerhold
From: Loic Poulain <loic.poulain@linaro.org>
Some SoCs require that RMTFS is also mapped to the NAV VM. Trying to
power on the modem without that results in the whole platform
crashing and forces a hard reboot within about 2 seconds. Add support
for mapping the region to additional VMs, such as NAV to open a path
towards enabling modem on such platforms.
Signed-off-by: Loic Poulain <loic.poulain@linaro.org>
[Konrad: reword, make conditional and flexible, add a define for NAV VMID]
Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
---
v3 -> v4:
No changes
drivers/soc/qcom/rmtfs_mem.c | 29 ++++++++++++++++++++++-------
include/linux/qcom_scm.h | 1 +
2 files changed, 23 insertions(+), 7 deletions(-)
diff --git a/drivers/soc/qcom/rmtfs_mem.c b/drivers/soc/qcom/rmtfs_mem.c
index 0feaae357821..9d59ad509a5c 100644
--- a/drivers/soc/qcom/rmtfs_mem.c
+++ b/drivers/soc/qcom/rmtfs_mem.c
@@ -17,6 +17,7 @@
#include <linux/qcom_scm.h>
#define QCOM_RMTFS_MEM_DEV_MAX (MINORMASK + 1)
+#define NUM_MAX_VMIDS 2
static dev_t qcom_rmtfs_mem_major;
@@ -171,12 +172,12 @@ static void qcom_rmtfs_mem_release_device(struct device *dev)
static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
{
struct device_node *node = pdev->dev.of_node;
- struct qcom_scm_vmperm perms[2];
+ struct qcom_scm_vmperm perms[NUM_MAX_VMIDS + 1];
struct reserved_mem *rmem;
struct qcom_rmtfs_mem *rmtfs_mem;
u32 client_id;
- u32 vmid;
- int ret;
+ u32 num_vmids, vmid[NUM_MAX_VMIDS];
+ int ret, i;
rmem = of_reserved_mem_lookup(node);
if (!rmem) {
@@ -226,7 +227,18 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
goto put_device;
}
- ret = of_property_read_u32(node, "qcom,vmid", &vmid);
+ num_vmids = of_property_count_u32_elems(node, "qcom,vmid");
+ if (num_vmids < 0) {
+ dev_err(&pdev->dev, "failed to count qcom,vmid elements: %d\n", ret);
+ goto remove_cdev;
+ } else if (num_vmids > NUM_MAX_VMIDS) {
+ dev_warn(&pdev->dev,
+ "too many VMIDs (%d) specified! Only mapping first %d entries\n",
+ num_vmids, NUM_MAX_VMIDS);
+ num_vmids = NUM_MAX_VMIDS;
+ }
+
+ ret = of_property_read_u32_array(node, "qcom,vmid", vmid, num_vmids);
if (ret < 0 && ret != -EINVAL) {
dev_err(&pdev->dev, "failed to parse qcom,vmid\n");
goto remove_cdev;
@@ -238,12 +250,15 @@ static int qcom_rmtfs_mem_probe(struct platform_device *pdev)
perms[0].vmid = QCOM_SCM_VMID_HLOS;
perms[0].perm = QCOM_SCM_PERM_RW;
- perms[1].vmid = vmid;
- perms[1].perm = QCOM_SCM_PERM_RW;
+
+ for (i = 0; i < num_vmids; i++) {
+ perms[i + 1].vmid = vmid[i];
+ perms[i + 1].perm = QCOM_SCM_PERM_RW;
+ }
rmtfs_mem->perms = BIT(QCOM_SCM_VMID_HLOS);
ret = qcom_scm_assign_mem(rmtfs_mem->addr, rmtfs_mem->size,
- &rmtfs_mem->perms, perms, 2);
+ &rmtfs_mem->perms, perms, num_vmids + 1);
if (ret < 0) {
dev_err(&pdev->dev, "assign memory failed\n");
goto remove_cdev;
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index f8335644a01a..150b72edb879 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -55,6 +55,7 @@ enum qcom_scm_ice_cipher {
#define QCOM_SCM_VMID_MSS_MSA 0xF
#define QCOM_SCM_VMID_WLAN 0x18
#define QCOM_SCM_VMID_WLAN_CE 0x19
+#define QCOM_SCM_VMID_NAV 0x2B
#define QCOM_SCM_PERM_READ 0x4
#define QCOM_SCM_PERM_WRITE 0x2
#define QCOM_SCM_PERM_EXEC 0x1
--
2.39.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH v4 3/3] dt-bindings: firmware: qcom: scm: Separate VMIDs from header to bindings
2023-01-09 13:05 [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array Konrad Dybcio
2023-01-09 13:05 ` [PATCH v4 2/3] soc: qcom: rmtfs: Optionally map RMTFS to more VMs Konrad Dybcio
@ 2023-01-09 13:05 ` Konrad Dybcio
2023-01-10 10:11 ` Krzysztof Kozlowski
2023-01-10 10:11 ` [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array Krzysztof Kozlowski
2023-01-11 5:09 ` (subset) " Bjorn Andersson
3 siblings, 1 reply; 6+ messages in thread
From: Konrad Dybcio @ 2023-01-09 13:05 UTC (permalink / raw)
To: linux-arm-msm, andersson, agross, krzysztof.kozlowski
Cc: marijn.suijten, Konrad Dybcio, Rob Herring, Krzysztof Kozlowski,
devicetree, linux-kernel, AngeloGioacchino Del Regno,
Loic Poulain, Stephan Gerhold
The SCM VMIDs represent predefined mappings that come from the
irreplaceable and non-omittable firmware that comes with every
Qualcomm SoC (unless you steal engineering samples from the factory)
and help clarify otherwise totally magic numbers which we are
required to pass to the secure world for some parts of the SoC to
work at all (with modem being the prime example).
On top of that, with changes to the rmtfs binding, secure VMIDs will
become useful to have in device trees for readability. Separate them
out and add to include/dt-bindings.
Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
---
v3 -> v4:
- Improve the commit message
- Dual-license
include/dt-bindings/firmware/qcom,scm.h | 16 ++++++++++++++++
include/linux/qcom_scm.h | 7 ++-----
2 files changed, 18 insertions(+), 5 deletions(-)
create mode 100644 include/dt-bindings/firmware/qcom,scm.h
diff --git a/include/dt-bindings/firmware/qcom,scm.h b/include/dt-bindings/firmware/qcom,scm.h
new file mode 100644
index 000000000000..1a4e68fa0744
--- /dev/null
+++ b/include/dt-bindings/firmware/qcom,scm.h
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */
+/*
+ * Copyright (c) 2010-2015, 2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (C) 2015 Linaro Ltd.
+ */
+
+#ifndef _DT_BINDINGS_FIRMWARE_QCOM_SCM_H
+#define _DT_BINDINGS_FIRMWARE_QCOM_SCM_H
+
+#define QCOM_SCM_VMID_HLOS 0x3
+#define QCOM_SCM_VMID_MSS_MSA 0xF
+#define QCOM_SCM_VMID_WLAN 0x18
+#define QCOM_SCM_VMID_WLAN_CE 0x19
+#define QCOM_SCM_VMID_NAV 0x2B
+
+#endif
diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h
index 150b72edb879..1e449a5d7f5c 100644
--- a/include/linux/qcom_scm.h
+++ b/include/linux/qcom_scm.h
@@ -9,6 +9,8 @@
#include <linux/types.h>
#include <linux/cpumask.h>
+#include <dt-bindings/firmware/qcom,scm.h>
+
#define QCOM_SCM_VERSION(major, minor) (((major) << 16) | ((minor) & 0xFF))
#define QCOM_SCM_CPU_PWR_DOWN_L2_ON 0x0
#define QCOM_SCM_CPU_PWR_DOWN_L2_OFF 0x1
@@ -51,11 +53,6 @@ enum qcom_scm_ice_cipher {
QCOM_SCM_ICE_CIPHER_AES_256_CBC = 4,
};
-#define QCOM_SCM_VMID_HLOS 0x3
-#define QCOM_SCM_VMID_MSS_MSA 0xF
-#define QCOM_SCM_VMID_WLAN 0x18
-#define QCOM_SCM_VMID_WLAN_CE 0x19
-#define QCOM_SCM_VMID_NAV 0x2B
#define QCOM_SCM_PERM_READ 0x4
#define QCOM_SCM_PERM_WRITE 0x2
#define QCOM_SCM_PERM_EXEC 0x1
--
2.39.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH v4 3/3] dt-bindings: firmware: qcom: scm: Separate VMIDs from header to bindings
2023-01-09 13:05 ` [PATCH v4 3/3] dt-bindings: firmware: qcom: scm: Separate VMIDs from header to bindings Konrad Dybcio
@ 2023-01-10 10:11 ` Krzysztof Kozlowski
0 siblings, 0 replies; 6+ messages in thread
From: Krzysztof Kozlowski @ 2023-01-10 10:11 UTC (permalink / raw)
To: Konrad Dybcio, linux-arm-msm, andersson, agross
Cc: marijn.suijten, Rob Herring, Krzysztof Kozlowski, devicetree,
linux-kernel, AngeloGioacchino Del Regno, Loic Poulain,
Stephan Gerhold
On 09/01/2023 14:05, Konrad Dybcio wrote:
> The SCM VMIDs represent predefined mappings that come from the
> irreplaceable and non-omittable firmware that comes with every
> Qualcomm SoC (unless you steal engineering samples from the factory)
> and help clarify otherwise totally magic numbers which we are
> required to pass to the secure world for some parts of the SoC to
> work at all (with modem being the prime example).
>
> On top of that, with changes to the rmtfs binding, secure VMIDs will
> become useful to have in device trees for readability. Separate them
> out and add to include/dt-bindings.
>
> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
> ---
> v3 -> v4:
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array
2023-01-09 13:05 [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array Konrad Dybcio
2023-01-09 13:05 ` [PATCH v4 2/3] soc: qcom: rmtfs: Optionally map RMTFS to more VMs Konrad Dybcio
2023-01-09 13:05 ` [PATCH v4 3/3] dt-bindings: firmware: qcom: scm: Separate VMIDs from header to bindings Konrad Dybcio
@ 2023-01-10 10:11 ` Krzysztof Kozlowski
2023-01-11 5:09 ` (subset) " Bjorn Andersson
3 siblings, 0 replies; 6+ messages in thread
From: Krzysztof Kozlowski @ 2023-01-10 10:11 UTC (permalink / raw)
To: Konrad Dybcio, linux-arm-msm, andersson, agross
Cc: marijn.suijten, Rob Herring, Krzysztof Kozlowski, devicetree,
linux-kernel
On 09/01/2023 14:05, Konrad Dybcio wrote:
> Some SoCs mandate that the RMTFS is also assigned to the NAV VM, while
> others really don't want that. Since it has to be conditional, turn
> qcom,vmid into an u32 array so that we can handle the NAV case, as
> well as other similar ones if they pop up in the future.
>
> Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: (subset) [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array
2023-01-09 13:05 [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array Konrad Dybcio
` (2 preceding siblings ...)
2023-01-10 10:11 ` [PATCH v4 1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array Krzysztof Kozlowski
@ 2023-01-11 5:09 ` Bjorn Andersson
3 siblings, 0 replies; 6+ messages in thread
From: Bjorn Andersson @ 2023-01-11 5:09 UTC (permalink / raw)
To: linux-arm-msm, konrad.dybcio, agross, krzysztof.kozlowski
Cc: marijn.suijten, devicetree, linux-kernel, krzysztof.kozlowski+dt,
robh+dt
On Mon, 9 Jan 2023 14:05:21 +0100, Konrad Dybcio wrote:
> Some SoCs mandate that the RMTFS is also assigned to the NAV VM, while
> others really don't want that. Since it has to be conditional, turn
> qcom,vmid into an u32 array so that we can handle the NAV case, as
> well as other similar ones if they pop up in the future.
>
>
Applied, thanks!
[1/3] dt-bindings: reserved-memory: rmtfs: Make qcom,vmid an array
commit: da0d37e42f93f7bd6351e7ef67a52ea9a272c761
[2/3] soc: qcom: rmtfs: Optionally map RMTFS to more VMs
commit: e656cd0bcf3d2ba2eceac82b44714bf355428ec4
[3/3] dt-bindings: firmware: qcom: scm: Separate VMIDs from header to bindings
commit: 45ca30eb9dfe622b00ce352cf28ee141d243254b
Best regards,
--
Bjorn Andersson <andersson@kernel.org>
^ permalink raw reply [flat|nested] 6+ messages in thread