* [PATCH RFC 1/2] dt-bindings: remoteproc: qcom,kaanapali-soccp-pas: Allow 2 IOMMUs for Nord
2026-11-13 12:24 [PATCH RFC 0/2] Add binding and fix SoCCP carveout for booting Nord devices at EL2 Anurag Pateriya
@ 2026-11-13 12:24 ` Anurag Pateriya
2026-11-13 12:24 ` [PATCH RFC 2/2] remoteproc: qcom_q6v5_pas: map SOCCP carveout privileged-only Anurag Pateriya
1 sibling, 0 replies; 4+ messages in thread
From: Anurag Pateriya @ 2026-11-13 12:24 UTC (permalink / raw)
To: Bjorn Andersson, Mathieu Poirier, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jingyi Wang
Cc: linux-arm-msm, linux-remoteproc, devicetree, linux-kernel,
Bibek Kumar Patro, Anurag Pateriya
Nord SoCCP needs two IOMMU streams when Linux boots at EL2, but the
iommus limit of one inherited from qcom,pas-common.yaml rejects that.
Drop the pas-common reference, describe the properties locally and allow
two iommus entries for Nord SoCCP and one for the other compatibles.
Signed-off-by: Anurag Pateriya <anurag.pateriya@oss.qualcomm.com>
---
.../remoteproc/qcom,kaanapali-soccp-pas.yaml | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,kaanapali-soccp-pas.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,kaanapali-soccp-pas.yaml
index c1911124e073..405291c769cb 100644
--- a/Documentation/devicetree/bindings/remoteproc/qcom,kaanapali-soccp-pas.yaml
+++ b/Documentation/devicetree/bindings/remoteproc/qcom,kaanapali-soccp-pas.yaml
@@ -55,6 +55,10 @@ properties:
- description: Firmware name of the SoC Control Processor
- description: Firmware name of the SoCCP Devicetree
+ iommus:
+ minItems: 1
+ maxItems: 2
+
memory-region:
minItems: 1
items:
@@ -87,15 +91,27 @@ properties:
minItems: 2
description: The names of the state bits used for SMP2P output
+ glink-edge:
+ $ref: /schemas/remoteproc/qcom,glink-edge.yaml#
+ description:
+ Qualcomm G-Link subnode which represents communication edge, channels
+ and devices related to the SoCCP.
+ unevaluatedProperties: false
+
required:
- compatible
- reg
- memory-region
+ - clocks
+ - clock-names
+ - interrupts
+ - interrupt-names
+ - qcom,smem-states
+ - qcom,smem-state-names
- power-domains
- power-domain-names
allOf:
- - $ref: /schemas/remoteproc/qcom,pas-common.yaml#
- if:
properties:
compatible:
@@ -111,6 +127,9 @@ allOf:
properties:
firmware-name:
minItems: 2
+ # Only Nord SoCCP needs a second stream (see top-level iommus)
+ iommus:
+ maxItems: 1
memory-region:
minItems: 2
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH RFC 2/2] remoteproc: qcom_q6v5_pas: map SOCCP carveout privileged-only
2026-11-13 12:24 [PATCH RFC 0/2] Add binding and fix SoCCP carveout for booting Nord devices at EL2 Anurag Pateriya
2026-11-13 12:24 ` [PATCH RFC 1/2] dt-bindings: remoteproc: qcom,kaanapali-soccp-pas: Allow 2 IOMMUs for Nord Anurag Pateriya
@ 2026-11-13 12:24 ` Anurag Pateriya
2026-11-14 4:28 ` Shawn Guo
1 sibling, 1 reply; 4+ messages in thread
From: Anurag Pateriya @ 2026-11-13 12:24 UTC (permalink / raw)
To: Bjorn Andersson, Mathieu Poirier, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Jingyi Wang
Cc: linux-arm-msm, linux-remoteproc, devicetree, linux-kernel,
Bibek Kumar Patro, Anurag Pateriya
From: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com>
SOCCP is a RISC-V core whose instruction fetches go through the
SMMU in privilege mode
The memory region is mapped with IOMMU_READ | IOMMU_WRITE, which results
in permission fault when SOCCP fetches instruction, append IOMMU_PRIV to
mapping to allow it to fetch instructions.
Other PIL subsystems (e.g. Hexagon Q6) are not affected as their
instruction fetches do not go through the SMMU in privileged mode.
Signed-off-by: Bibek Kumar Patro <bibek.patro@oss.qualcomm.com>
Signed-off-by: Anurag Pateriya <anurag.pateriya@oss.qualcomm.com>
---
drivers/remoteproc/qcom_q6v5_pas.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index dfe67f32e537..43218039e3d5 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -84,6 +84,12 @@ struct qcom_pas_data {
int region_assign_vmid;
bool early_boot;
bool needs_tzmem;
+ /*
+ * flag to map the carveout as privileged-only. Required for
+ * subsystems such as SOCCP whose instruction fetches go through
+ * the SMMU in privilege mode.
+ */
+ bool iommu_priv;
};
struct qcom_pas {
@@ -112,6 +118,7 @@ struct qcom_pas {
int crash_reason_smem;
unsigned int smem_host_id;
bool decrypt_shutdown;
+ bool iommu_priv;
const char *info_name;
const struct firmware *firmware;
@@ -297,11 +304,16 @@ static void qcom_pas_unmap_carveout(struct rproc *rproc, phys_addr_t mem_phys, s
static int qcom_pas_map_carveout(struct rproc *rproc, phys_addr_t mem_phys, size_t size)
{
+ struct qcom_pas *pas = rproc->priv;
+ int prot = IOMMU_READ | IOMMU_WRITE;
int ret = 0;
+ if (pas->iommu_priv)
+ prot |= IOMMU_PRIV;
+
if (rproc->has_iommu)
ret = iommu_map(rproc->domain, mem_phys, mem_phys, size,
- IOMMU_READ | IOMMU_WRITE, GFP_KERNEL);
+ prot, GFP_KERNEL);
return ret;
}
@@ -961,6 +973,7 @@ static int qcom_pas_probe(struct platform_device *pdev)
pas->info_name = desc->sysmon_name;
pas->smem_host_id = desc->smem_host_id;
pas->decrypt_shutdown = desc->decrypt_shutdown;
+ pas->iommu_priv = desc->iommu_priv;
pas->proxy_pd_performance_states = desc->proxy_pd_performance_states;
pas->region_assign_idx = desc->region_assign_idx;
pas->region_assign_count = min_t(int, MAX_ASSIGN_COUNT, desc->region_assign_count);
@@ -1708,6 +1721,7 @@ static const struct qcom_pas_data nord_soccp_resource = {
.ssr_name = "soccp",
.sysmon_name = "soccp",
.auto_boot = true,
+ .iommu_priv = true,
};
static const struct qcom_pas_data sm8450_mpss_resource = {
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread