linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform
@ 2022-08-22  8:21 Srinivasa Rao Mandadapu
  2022-08-22  8:21 ` [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support Srinivasa Rao Mandadapu
                   ` (7 more replies)
  0 siblings, 8 replies; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:21 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Update ADSP pil loader driver for SC7280 platforms.

Changes since V4:
	-- Update halt registers description in dt bindings.
	-- Update Memory sandboxing with proper APIs for resource
	   allocation and free.
Changes since V3:
	-- Rename is_adsp_sb_needed to adsp_sandbox_needed.
	-- Update sc7280 compatible name entry in sorted order.
	-- Add smmu unmapping in error case and in adsp stop.
	-- Revert converting sdm845 dt bindings to generic and 
	   create new dt bindings for sc7280.
Changes since V2:
	-- Generated patch with -M flag.
	-- Add Clock property in dt bindings.
	-- Add qcom,adsp-memory-regions property.
	-- Add is_adsp_sb_needed flag instead of is_wpss.
	-- Initialize is_adsp_sb_needed flag.
	-- Remove empty proxy pds array.
	-- Replace platform_bus_type with adsp->dev->bus.
	-- Use API of_parse_phandle_with_args() instead of 
	    of_parse_phandle_with_fixed_args().
	-- Replace adsp->is_wpss with adsp->is_adsp.
	-- Update error handling in adsp_start().
Changes since V1:
	-- Change reg property maxItems to minItems and update description.
	-- Fix typo errors.

Srinivasa Rao Mandadapu (7):
  dt-bindings: remoteproc: qcom: Add SC7280 ADSP support
  remoteproc: qcom: Add flag in adsp private data structure
  remoteproc: qcom: Add compatible name for SC7280 ADSP
  remoteproc: qcom: Replace hard coded values with macros
  remoteproc: qcom: Add efuse evb selection control
  remoteproc: qcom: Add support for memory sandbox
  remoteproc: qcom: Update QDSP6 out-of-reset timeout value

 .../bindings/remoteproc/qcom,sc7280-adsp-pil.yaml  | 196 +++++++++++++++++
 drivers/remoteproc/qcom_q6v5_adsp.c                | 243 ++++++++++++++++++++-
 2 files changed, 433 insertions(+), 6 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml

-- 
2.7.4


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
@ 2022-08-22  8:21 ` Srinivasa Rao Mandadapu
  2022-08-23  3:04   ` Stephen Boyd
  2022-08-22  8:21 ` [RESEND v5 2/7] remoteproc: qcom: Add flag in adsp private data structure Srinivasa Rao Mandadapu
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:21 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Add ADSP PIL loading support for SC7280 SoCs.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
Reviewed-by: Rob Herring <robh@kernel.org>
---
Changes since V4:
	-- Update halt registers description in dt bindings.

 .../bindings/remoteproc/qcom,sc7280-adsp-pil.yaml  | 196 +++++++++++++++++++++
 1 file changed, 196 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml

diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml
new file mode 100644
index 0000000..cf895fb
--- /dev/null
+++ b/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml
@@ -0,0 +1,196 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/remoteproc/qcom,sc7280-adsp-pil.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Qualcomm SC7280 ADSP Peripheral Image Loader
+
+maintainers:
+  - Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
+
+description:
+  This document defines the binding for a component that loads and boots firmware
+  on the Qualcomm Technology Inc. ADSP.
+
+properties:
+  compatible:
+    enum:
+      - qcom,sc7280-adsp-pil
+
+  reg:
+    minItems: 1
+    items:
+      - description: qdsp6ss register
+      - description: efuse q6ss register
+
+  interrupts:
+    items:
+      - description: Watchdog interrupt
+      - description: Fatal interrupt
+      - description: Ready interrupt
+      - description: Handover interrupt
+      - description: Stop acknowledge interrupt
+      - description: Shutdown acknowledge interrupt
+
+  interrupt-names:
+    items:
+      - const: wdog
+      - const: fatal
+      - const: ready
+      - const: handover
+      - const: stop-ack
+      - const: shutdown-ack
+
+  clocks:
+    items:
+      - description: XO clock
+      - description: GCC CFG NOC LPASS clock
+      - description: LPASS AHBS AON clock
+      - description: LPASS AHBM AON clock
+      - description: QDSP XO clock
+      - description: Q6SP6SS SLEEP clock
+      - description: Q6SP6SS CORE clock
+
+  clock-names:
+    items:
+      - const: xo
+      - const: gcc_cfg_noc_lpass
+      - const: lpass_ahbs_aon_cbcr
+      - const: lpass_ahbm_aon_cbcr
+      - const: qdsp6ss_xo
+      - const: qdsp6ss_sleep
+      - const: qdsp6ss_core
+
+  power-domains:
+    items:
+      - description: LCX power domain
+
+  resets:
+    items:
+      - description: PDC AUDIO SYNC RESET
+      - description: CC LPASS restart
+
+  reset-names:
+    items:
+      - const: pdc_sync
+      - const: cc_lpass
+
+  memory-region:
+    maxItems: 1
+    description: Reference to the reserved-memory for the Hexagon core
+
+  qcom,adsp-memory-regions:
+    $ref: /schemas/types.yaml#/definitions/uint32-matrix
+    description:
+      Each entry consists of 4 integers and represents the
+      list of memory regions accessed by ADSP firmware.
+    items:
+      items:
+        - description: |
+            "iova reg" indicates the address of virtual memory region.
+        - description: |
+            "physical reg" indicates the address of phyical memory region.
+        - description: |
+            "size" indicates the offset memory region.
+        - description: |
+            "access level" indicates the read, read and write access levels.
+          minimum: 0
+          maximum: 1
+
+  qcom,halt-regs:
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    description:
+      Phandle reference to a syscon representing TCSR followed by the
+      four offsets within syscon for q6, CE, AXI and qv6 halt registers.
+    items:
+      items:
+        - description: phandle to TCSR MUTEX
+        - description: offset to q6 halt registers
+        - description: offset to CE halt registers
+        - description: offset to AXI halt registers
+        - description: offset to qv6 halt registers
+
+  qcom,smem-states:
+    $ref: /schemas/types.yaml#/definitions/phandle-array
+    description: States used by the AP to signal the Hexagon core
+    items:
+      - description: Stop the modem
+
+  qcom,smem-state-names:
+    $ref: /schemas/types.yaml#/definitions/string
+    description: The names of the state bits used for SMP2P output
+    items:
+      - const: stop
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - interrupt-names
+  - clocks
+  - clock-names
+  - power-domains
+  - resets
+  - reset-names
+  - qcom,halt-regs
+  - memory-region
+  - qcom,smem-states
+  - qcom,smem-state-names
+
+additionalProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/arm-gic.h>
+    #include <dt-bindings/clock/qcom,rpmh.h>
+    #include <dt-bindings/clock/qcom,gcc-sc7280.h>
+    #include <dt-bindings/clock/qcom,lpass-sc7280.h>
+    #include <dt-bindings/reset/qcom,sdm845-aoss.h>
+    #include <dt-bindings/reset/qcom,sdm845-pdc.h>
+    #include <dt-bindings/power/qcom-rpmpd.h>
+
+    remoteproc@3000000 {
+        compatible = "qcom,sc7280-adsp-pil";
+        reg = <0x03000000 0x5000>,
+              <0x355B000 0x10>;
+
+        interrupts-extended = <&pdc 162 IRQ_TYPE_EDGE_RISING>,
+                <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
+                <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
+                <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
+                <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
+                <&adsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
+
+        interrupt-names = "wdog", "fatal", "ready",
+                "handover", "stop-ack", "shutdown-ack";
+
+        clocks = <&rpmhcc RPMH_CXO_CLK>,
+                 <&gcc GCC_CFG_NOC_LPASS_CLK>,
+                 <&lpasscc LPASS_Q6SS_AHBM_CLK>,
+                 <&lpasscc LPASS_Q6SS_AHBS_CLK>,
+                 <&lpasscc LPASS_QDSP6SS_XO_CLK>,
+                 <&lpasscc LPASS_QDSP6SS_SLEEP_CLK>,
+                 <&lpasscc LPASS_QDSP6SS_CORE_CLK>;
+        clock-names = "xo", "gcc_cfg_noc_lpass",
+                "lpass_ahbs_aon_cbcr",
+                "lpass_ahbm_aon_cbcr", "qdsp6ss_xo",
+                "qdsp6ss_sleep", "qdsp6ss_core";
+
+        power-domains = <&rpmhpd SC7280_LCX>;
+
+        resets = <&pdc_reset PDC_AUDIO_SYNC_RESET>,
+                 <&aoss_reset AOSS_CC_LPASS_RESTART>;
+        reset-names = "pdc_sync", "cc_lpass";
+
+        qcom,halt-regs = <&tcsr_mutex 0x23000 0x25000 0x28000 0x33000>;
+
+        memory-region = <&adsp_mem>;
+
+        qcom,smem-states = <&adsp_smp2p_out 0>;
+        qcom,smem-state-names = "stop";
+
+        qcom,adsp-memory-regions = <0x00100000 0x00100000 0x4000 0>,
+                                   <0x00113000 0x00113000 0x1000 0>,
+                                   <0x00117000 0x00117000 0x2000 1>;
+    };
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RESEND v5 2/7] remoteproc: qcom: Add flag in adsp private data structure
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
  2022-08-22  8:21 ` [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support Srinivasa Rao Mandadapu
@ 2022-08-22  8:21 ` Srinivasa Rao Mandadapu
  2022-08-23  3:04   ` Stephen Boyd
  2022-08-22  8:21 ` [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP Srinivasa Rao Mandadapu
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:21 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Add flag in qcom_adsp private data structure and initialize
it to distinguish ADSP and WPSS modules.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
---
Changes since V3:
	-- Rename is_adsp_sb_needed to adsp_sandbox_needed.
Changes since V2:
	-- Add is_adsp_sb_needed flag instead of is_wpss.

 drivers/remoteproc/qcom_q6v5_adsp.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index 2f3b9f5..d0b767f 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -62,6 +62,7 @@ struct adsp_pil_data {
 	const char *sysmon_name;
 	int ssctl_id;
 	bool is_wpss;
+	bool adsp_sandbox_needed;
 	bool auto_boot;
 
 	const char **clk_ids;
@@ -99,6 +100,7 @@ struct qcom_adsp {
 	phys_addr_t mem_reloc;
 	void *mem_region;
 	size_t mem_size;
+	bool adsp_sandbox_needed;
 
 	struct device *proxy_pds[QCOM_Q6V5_RPROC_PROXY_PD_MAX];
 	size_t proxy_pd_count;
@@ -602,6 +604,8 @@ static int adsp_probe(struct platform_device *pdev)
 	adsp->dev = &pdev->dev;
 	adsp->rproc = rproc;
 	adsp->info_name = desc->sysmon_name;
+	adsp->adsp_sandbox_needed = desc->adsp_sandbox_needed;
+
 	platform_set_drvdata(pdev, adsp);
 
 	if (desc->is_wpss)
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
  2022-08-22  8:21 ` [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support Srinivasa Rao Mandadapu
  2022-08-22  8:21 ` [RESEND v5 2/7] remoteproc: qcom: Add flag in adsp private data structure Srinivasa Rao Mandadapu
@ 2022-08-22  8:21 ` Srinivasa Rao Mandadapu
  2022-08-23  3:05   ` Stephen Boyd
  2022-08-22  8:22 ` [RESEND v5 4/7] remoteproc: qcom: Replace hard coded values with macros Srinivasa Rao Mandadapu
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:21 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Update adsp pil data and compatible name for loading ADSP
binary on SC7280 based platforms.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
---
Changes since V3:
	-- Rename is_adsp_sb_needed to adsp_sandbox_needed.
	-- Update sc7280 compatible name entry in sorted order.
Changes since V2:
	-- Initialize is_adsp_sb_needed flag.
	-- Remove empty proxy pds array.

 drivers/remoteproc/qcom_q6v5_adsp.c | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index d0b767f..6d409ca 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -701,6 +701,22 @@ static const struct adsp_pil_data adsp_resource_init = {
 	},
 };
 
+static const struct adsp_pil_data adsp_sc7280_resource_init = {
+	.crash_reason_smem = 423,
+	.firmware_name = "adsp.mbn",
+	.load_state = "adsp",
+	.ssr_name = "lpass",
+	.sysmon_name = "adsp",
+	.ssctl_id = 0x14,
+	.is_wpss = false,
+	.adsp_sandbox_needed = true,
+	.auto_boot = true,
+	.clk_ids = (const char*[]) {
+		"gcc_cfg_noc_lpass", NULL
+	},
+	.num_clks = 1,
+};
+
 static const struct adsp_pil_data cdsp_resource_init = {
 	.crash_reason_smem = 601,
 	.firmware_name = "cdsp.mdt",
@@ -739,6 +755,7 @@ static const struct adsp_pil_data wpss_resource_init = {
 
 static const struct of_device_id adsp_of_match[] = {
 	{ .compatible = "qcom,qcs404-cdsp-pil", .data = &cdsp_resource_init },
+	{ .compatible = "qcom,sc7280-adsp-pil", .data = &adsp_sc7280_resource_init },
 	{ .compatible = "qcom,sc7280-wpss-pil", .data = &wpss_resource_init },
 	{ .compatible = "qcom,sdm845-adsp-pil", .data = &adsp_resource_init },
 	{ },
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RESEND v5 4/7] remoteproc: qcom: Replace hard coded values with macros
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
                   ` (2 preceding siblings ...)
  2022-08-22  8:21 ` [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP Srinivasa Rao Mandadapu
@ 2022-08-22  8:22 ` Srinivasa Rao Mandadapu
  2022-08-23  3:06   ` Stephen Boyd
  2022-08-22  8:22 ` [RESEND v5 5/7] remoteproc: qcom: Add efuse evb selection control Srinivasa Rao Mandadapu
                   ` (3 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:22 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Replace hard coded values of QDSP6 boot control reg params
with appropriate macro names.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/remoteproc/qcom_q6v5_adsp.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index 6d409ca..701a615 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -54,6 +54,9 @@
 
 #define QCOM_Q6V5_RPROC_PROXY_PD_MAX	3
 
+#define LPASS_BOOT_CORE_START	BIT(0)
+#define LPASS_BOOT_CMD_START	BIT(0)
+
 struct adsp_pil_data {
 	int crash_reason_smem;
 	const char *firmware_name;
@@ -366,10 +369,10 @@ static int adsp_start(struct rproc *rproc)
 	writel(adsp->mem_phys >> 4, adsp->qdsp6ss_base + RST_EVB_REG);
 
 	/* De-assert QDSP6 stop core. QDSP6 will execute after out of reset */
-	writel(0x1, adsp->qdsp6ss_base + CORE_START_REG);
+	writel(LPASS_BOOT_CORE_START, adsp->qdsp6ss_base + CORE_START_REG);
 
 	/* Trigger boot FSM to start QDSP6 */
-	writel(0x1, adsp->qdsp6ss_base + BOOT_CMD_REG);
+	writel(LPASS_BOOT_CMD_START, adsp->qdsp6ss_base + BOOT_CMD_REG);
 
 	/* Wait for core to come out of reset */
 	ret = readl_poll_timeout(adsp->qdsp6ss_base + BOOT_STATUS_REG,
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RESEND v5 5/7] remoteproc: qcom: Add efuse evb selection control
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
                   ` (3 preceding siblings ...)
  2022-08-22  8:22 ` [RESEND v5 4/7] remoteproc: qcom: Replace hard coded values with macros Srinivasa Rao Mandadapu
@ 2022-08-22  8:22 ` Srinivasa Rao Mandadapu
  2022-08-23  3:12   ` Stephen Boyd
  2022-08-22  8:22 ` [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox Srinivasa Rao Mandadapu
                   ` (2 subsequent siblings)
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:22 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Add efuse evb selection control and enable it for starting ADSP.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
---
 drivers/remoteproc/qcom_q6v5_adsp.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index 701a615..b0a63a0 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -56,6 +56,7 @@
 
 #define LPASS_BOOT_CORE_START	BIT(0)
 #define LPASS_BOOT_CMD_START	BIT(0)
+#define LPASS_EFUSE_Q6SS_EVB_SEL 0x0
 
 struct adsp_pil_data {
 	int crash_reason_smem;
@@ -86,6 +87,7 @@ struct qcom_adsp {
 	struct clk_bulk_data *clks;
 
 	void __iomem *qdsp6ss_base;
+	void __iomem *lpass_efuse;
 
 	struct reset_control *pdc_sync_reset;
 	struct reset_control *restart;
@@ -368,6 +370,9 @@ static int adsp_start(struct rproc *rproc)
 	/* Program boot address */
 	writel(adsp->mem_phys >> 4, adsp->qdsp6ss_base + RST_EVB_REG);
 
+	if (adsp->lpass_efuse)
+		writel(LPASS_EFUSE_Q6SS_EVB_SEL, adsp->lpass_efuse);
+
 	/* De-assert QDSP6 stop core. QDSP6 will execute after out of reset */
 	writel(LPASS_BOOT_CORE_START, adsp->qdsp6ss_base + CORE_START_REG);
 
@@ -522,6 +527,11 @@ static int adsp_init_mmio(struct qcom_adsp *adsp,
 		return PTR_ERR(adsp->qdsp6ss_base);
 	}
 
+	adsp->lpass_efuse =  devm_platform_ioremap_resource_byname(pdev, "lpass_efuse");
+	if (IS_ERR(adsp->lpass_efuse)) {
+		adsp->lpass_efuse = NULL;
+		dev_dbg(adsp->dev, "failed to map LPASS efuse registers\n");
+	}
 	syscon = of_parse_phandle(pdev->dev.of_node, "qcom,halt-regs", 0);
 	if (!syscon) {
 		dev_err(&pdev->dev, "failed to parse qcom,halt-regs\n");
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
                   ` (4 preceding siblings ...)
  2022-08-22  8:22 ` [RESEND v5 5/7] remoteproc: qcom: Add efuse evb selection control Srinivasa Rao Mandadapu
@ 2022-08-22  8:22 ` Srinivasa Rao Mandadapu
  2022-08-23  3:25   ` Stephen Boyd
  2022-08-22  8:22 ` [RESEND v5 7/7] remoteproc: qcom: Update QDSP6 out-of-reset timeout value Srinivasa Rao Mandadapu
  2022-08-25 12:18 ` [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Krzysztof Kozlowski
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:22 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Update pil driver with SMMU mapping for allowing authorised
memory access to ADSP firmware, by reading required memory
regions either from device tree file or from resource table
embedded in ADSP binary header.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
---
Changes since V4:
	-- Split the code and add appropriate APIs for resource allocation and free.
	-- Update adsp_unmap_smmu with missing free ops call.
	-- Update normalizing length value in adsp_of_unmap_smmu.
Changes since V3:
	-- Rename is_adsp_sb_needed to adsp_sandbox_needed.
	-- Add smmu unmapping in error case and in adsp stop.
Changes since V2:
	-- Replace platform_bus_type with adsp->dev->bus.
	-- Use API of_parse_phandle_with_args() instead of of_parse_phandle_with_fixed_args().
	-- Replace adsp->is_wpss with adsp->is_adsp.
	-- Update error handling in adsp_start().

 drivers/remoteproc/qcom_q6v5_adsp.c | 200 +++++++++++++++++++++++++++++++++++-
 1 file changed, 198 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index b0a63a0..d01c97e 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -9,6 +9,7 @@
 #include <linux/firmware.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
+#include <linux/iommu.h>
 #include <linux/iopoll.h>
 #include <linux/kernel.h>
 #include <linux/mfd/syscon.h>
@@ -48,6 +49,8 @@
 #define LPASS_PWR_ON_REG		0x10
 #define LPASS_HALTREQ_REG		0x0
 
+#define SID_MASK_DEFAULT        0xF
+
 #define QDSP6SS_XO_CBCR		0x38
 #define QDSP6SS_CORE_CBCR	0x20
 #define QDSP6SS_SLEEP_CBCR	0x3c
@@ -78,7 +81,7 @@ struct adsp_pil_data {
 struct qcom_adsp {
 	struct device *dev;
 	struct rproc *rproc;
-
+	struct iommu_domain *iommu_dom;
 	struct qcom_q6v5 q6v5;
 
 	struct clk *xo;
@@ -333,6 +336,185 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
 	return 0;
 }
 
+static void adsp_of_unmap_smmu(struct iommu_domain *iommu_dom, const __be32 *prop, int len)
+{
+	unsigned long iova;
+	unsigned int mem_size;
+	int i;
+
+	len /= sizeof(__be32);
+	for (i = 0; i < len; i++) {
+		iova = be32_to_cpu(prop[i++]);
+		/* Skip Physical address*/
+		i++;
+		mem_size = be32_to_cpu(prop[i++]);
+		iommu_unmap(iommu_dom, iova, mem_size);
+	}
+}
+
+static void adsp_rproc_unmap_smmu(struct rproc *rproc, int len)
+{
+	struct fw_rsc_devmem *rsc_fw;
+	struct fw_rsc_hdr *hdr;
+	int offset;
+	int i;
+
+	for (i = 0; i < len; i++) {
+		offset = rproc->table_ptr->offset[i];
+		hdr = (void *)rproc->table_ptr + offset;
+		rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
+
+		iommu_unmap(rproc->domain, rsc_fw->da, rsc_fw->len);
+	}
+}
+
+static void adsp_unmap_smmu(struct rproc *rproc)
+{
+	struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
+	const __be32 *prop;
+	unsigned int len;
+
+	iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
+
+	prop = of_get_property(adsp->dev->of_node, "qcom,adsp-memory-regions", &len);
+	if (prop) {
+		adsp_of_unmap_smmu(adsp->iommu_dom, prop, len);
+	} else {
+		if (rproc->table_ptr)
+			adsp_rproc_unmap_smmu(rproc, rproc->table_ptr->num);
+	}
+
+	iommu_domain_free(adsp->iommu_dom);
+}
+
+static int adsp_of_map_smmu(struct iommu_domain *iommu_dom, const __be32 *prop, int len)
+{
+	unsigned long mem_phys;
+	unsigned long iova;
+	unsigned int mem_size;
+	unsigned int flag;
+	int access_level;
+	int ret;
+	int i;
+
+	len /= sizeof(__be32);
+	for (i = 0; i < len; i++) {
+		iova = be32_to_cpu(prop[i++]);
+		mem_phys = be32_to_cpu(prop[i++]);
+		mem_size = be32_to_cpu(prop[i++]);
+		access_level = be32_to_cpu(prop[i]);
+
+		if (access_level)
+			flag = IOMMU_READ | IOMMU_WRITE;
+		else
+			flag = IOMMU_READ;
+
+		ret = iommu_map(iommu_dom, iova, mem_phys, mem_size, flag);
+		if (ret) {
+			pr_err("failed to map addr = %p mem_size = %x\n", &(mem_phys), mem_size);
+			goto of_smmu_unmap;
+		}
+	}
+	return 0;
+of_smmu_unmap:
+	adsp_of_unmap_smmu(iommu_dom, prop, i);
+	return ret;
+}
+
+static int adsp_rproc_map_smmu(struct rproc *rproc, int len)
+{
+	struct fw_rsc_devmem *rsc_fw;
+	struct fw_rsc_hdr *hdr;
+	int offset;
+	int ret;
+	int i;
+
+	if (!rproc->table_ptr)
+		return 0;
+
+	for (i = 0; i < rproc->table_ptr->num; i++) {
+		offset = rproc->table_ptr->offset[i];
+		hdr = (void *)rproc->table_ptr + offset;
+		rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
+
+		ret = iommu_map(rproc->domain, rsc_fw->da, rsc_fw->pa,
+					rsc_fw->len, rsc_fw->flags);
+		if (ret) {
+			pr_err("failed to map addr = %x mem_size = %x\n", rsc_fw->pa, rsc_fw->len);
+			goto  rproc_smmu_unmap;
+		}
+	}
+
+	return 0;
+
+rproc_smmu_unmap:
+	adsp_rproc_unmap_smmu(rproc, i);
+	return ret;
+}
+
+static int adsp_map_smmu(struct qcom_adsp *adsp, struct rproc *rproc)
+{
+	struct of_phandle_args args;
+	const __be32 *prop;
+	long long sid;
+	unsigned int len;
+	int ret;
+
+	ret = of_parse_phandle_with_args(adsp->dev->of_node, "iommus", "#iommu-cells", 0, &args);
+	if (ret < 0)
+		sid = -1;
+	else
+		sid = args.args[0] & SID_MASK_DEFAULT;
+
+	adsp->iommu_dom = iommu_domain_alloc(adsp->dev->bus);
+	if (!adsp->iommu_dom) {
+		dev_err(adsp->dev, "failed to allocate iommu domain\n");
+		ret = -ENOMEM;
+		goto domain_free;
+	}
+
+	ret = iommu_attach_device(adsp->iommu_dom, adsp->dev);
+	if (ret) {
+		dev_err(adsp->dev, "could not attach device ret = %d\n", ret);
+		ret = -EBUSY;
+		goto detach_device;
+	}
+
+	/* Add SID configuration for ADSP Firmware to SMMU */
+	adsp->mem_phys =  adsp->mem_phys | (sid << 32);
+
+	ret = iommu_map(adsp->iommu_dom, adsp->mem_phys, adsp->mem_phys,
+			adsp->mem_size,	IOMMU_READ | IOMMU_WRITE);
+	if (ret) {
+		dev_err(adsp->dev, "Unable to map ADSP Physical Memory\n");
+		goto sid_unmap;
+	}
+
+	prop = of_get_property(adsp->dev->of_node, "qcom,adsp-memory-regions", &len);
+	if (prop) {
+		ret = adsp_of_map_smmu(adsp->iommu_dom, prop, len);
+		if (ret) {
+			dev_err(adsp->dev, "Unable to map memory regions accessed by ADSP\n");
+			goto sid_unmap;
+		}
+	} else {
+		ret = adsp_rproc_map_smmu(rproc, len);
+		if (ret) {
+			dev_err(adsp->dev, "Unable to map memory regions accessed by ADSP\n");
+			goto sid_unmap;
+		}
+	}
+	return 0;
+
+sid_unmap:
+	iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
+detach_device:
+	iommu_domain_free(adsp->iommu_dom);
+domain_free:
+	return ret;
+}
+
+
 static int adsp_start(struct rproc *rproc)
 {
 	struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
@@ -343,9 +525,16 @@ static int adsp_start(struct rproc *rproc)
 	if (ret)
 		return ret;
 
+	if (adsp->adsp_sandbox_needed) {
+		ret = adsp_map_smmu(adsp, rproc);
+		if (ret) {
+			dev_err(adsp->dev, "ADSP smmu mapping failed\n");
+			goto disable_irqs;
+		}
+	}
 	ret = clk_prepare_enable(adsp->xo);
 	if (ret)
-		goto disable_irqs;
+		goto adsp_smmu_unmap;
 
 	ret = qcom_rproc_pds_enable(adsp, adsp->proxy_pds,
 				    adsp->proxy_pd_count);
@@ -401,6 +590,9 @@ static int adsp_start(struct rproc *rproc)
 	qcom_rproc_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
 disable_xo_clk:
 	clk_disable_unprepare(adsp->xo);
+adsp_smmu_unmap:
+	if (adsp->adsp_sandbox_needed)
+		adsp_unmap_smmu(rproc);
 disable_irqs:
 	qcom_q6v5_unprepare(&adsp->q6v5);
 
@@ -429,6 +621,9 @@ static int adsp_stop(struct rproc *rproc)
 	if (ret)
 		dev_err(adsp->dev, "failed to shutdown: %d\n", ret);
 
+	if (adsp->adsp_sandbox_needed)
+		adsp_unmap_smmu(rproc);
+
 	handover = qcom_q6v5_unprepare(&adsp->q6v5);
 	if (handover)
 		qcom_adsp_pil_handover(&adsp->q6v5);
@@ -460,6 +655,7 @@ static const struct rproc_ops adsp_ops = {
 	.stop = adsp_stop,
 	.da_to_va = adsp_da_to_va,
 	.parse_fw = qcom_register_dump_segments,
+	.find_loaded_rsc_table = rproc_elf_find_loaded_rsc_table,
 	.load = adsp_load,
 	.panic = adsp_panic,
 };
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [RESEND v5 7/7] remoteproc: qcom: Update QDSP6 out-of-reset timeout value
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
                   ` (5 preceding siblings ...)
  2022-08-22  8:22 ` [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox Srinivasa Rao Mandadapu
@ 2022-08-22  8:22 ` Srinivasa Rao Mandadapu
  2022-08-23  3:26   ` Stephen Boyd
  2022-08-25 12:18 ` [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Krzysztof Kozlowski
  7 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-22  8:22 UTC (permalink / raw)
  To: linux-remoteproc, agross, bjorn.andersson, lgirdwood, broonie,
	robh+dt, quic_plai, bgoswami, perex, tiwai, srinivas.kandagatla,
	quic_rohkumar, linux-arm-msm, linux-kernel, swboyd, judyhsiao,
	devicetree
  Cc: Srinivasa Rao Mandadapu

Update QDSP6 out-of-reset timeout value to 1 second, as sometimes
ADSP boot failing on SC7280 based platforms with existing value.
Also add few micro seconds sleep after enabling boot core
start register.

Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
---
 drivers/remoteproc/qcom_q6v5_adsp.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
index d01c97e..7c31ef7 100644
--- a/drivers/remoteproc/qcom_q6v5_adsp.c
+++ b/drivers/remoteproc/qcom_q6v5_adsp.c
@@ -34,7 +34,7 @@
 /* time out value */
 #define ACK_TIMEOUT			1000
 #define ACK_TIMEOUT_US			1000000
-#define BOOT_FSM_TIMEOUT		10000
+#define BOOT_FSM_TIMEOUT		1000000
 /* mask values */
 #define EVB_MASK			GENMASK(27, 4)
 /*QDSP6SS register offsets*/
@@ -564,13 +564,14 @@ static int adsp_start(struct rproc *rproc)
 
 	/* De-assert QDSP6 stop core. QDSP6 will execute after out of reset */
 	writel(LPASS_BOOT_CORE_START, adsp->qdsp6ss_base + CORE_START_REG);
+	usleep_range(100, 110);
 
 	/* Trigger boot FSM to start QDSP6 */
 	writel(LPASS_BOOT_CMD_START, adsp->qdsp6ss_base + BOOT_CMD_REG);
 
 	/* Wait for core to come out of reset */
 	ret = readl_poll_timeout(adsp->qdsp6ss_base + BOOT_STATUS_REG,
-			val, (val & BIT(0)) != 0, 10, BOOT_FSM_TIMEOUT);
+			val, (val & BIT(0)) != 0, 100, BOOT_FSM_TIMEOUT);
 	if (ret) {
 		dev_err(adsp->dev, "failed to bootup adsp\n");
 		goto disable_adsp_clks;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support
  2022-08-22  8:21 ` [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support Srinivasa Rao Mandadapu
@ 2022-08-23  3:04   ` Stephen Boyd
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:04 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:21:57)
> diff --git a/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml b/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml
> new file mode 100644
> index 0000000..cf895fb
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml
> @@ -0,0 +1,196 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/remoteproc/qcom,sc7280-adsp-pil.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Qualcomm SC7280 ADSP Peripheral Image Loader
> +
[...]
> +
> +examples:
> +  - |
> +    #include <dt-bindings/interrupt-controller/arm-gic.h>
> +    #include <dt-bindings/clock/qcom,rpmh.h>
> +    #include <dt-bindings/clock/qcom,gcc-sc7280.h>
> +    #include <dt-bindings/clock/qcom,lpass-sc7280.h>
> +    #include <dt-bindings/reset/qcom,sdm845-aoss.h>
> +    #include <dt-bindings/reset/qcom,sdm845-pdc.h>
> +    #include <dt-bindings/power/qcom-rpmpd.h>
> +
> +    remoteproc@3000000 {
> +        compatible = "qcom,sc7280-adsp-pil";
> +        reg = <0x03000000 0x5000>,
> +              <0x355B000 0x10>;

Lowercase hex please. Also, please pad it out to match the first reg
property.

> +
> +        interrupts-extended = <&pdc 162 IRQ_TYPE_EDGE_RISING>,

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 2/7] remoteproc: qcom: Add flag in adsp private data structure
  2022-08-22  8:21 ` [RESEND v5 2/7] remoteproc: qcom: Add flag in adsp private data structure Srinivasa Rao Mandadapu
@ 2022-08-23  3:04   ` Stephen Boyd
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:04 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:21:58)
> Add flag in qcom_adsp private data structure and initialize
> it to distinguish ADSP and WPSS modules.
>
> Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
> ---

Reviewed-by: Stephen Boyd <swboyd@chromium.org>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP
  2022-08-22  8:21 ` [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP Srinivasa Rao Mandadapu
@ 2022-08-23  3:05   ` Stephen Boyd
  2022-08-23 14:35     ` Srinivasa Rao Mandadapu
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:05 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:21:59)
> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
> index d0b767f..6d409ca 100644
> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
> @@ -701,6 +701,22 @@ static const struct adsp_pil_data adsp_resource_init = {
>         },
>  };
>
> +static const struct adsp_pil_data adsp_sc7280_resource_init = {
> +       .crash_reason_smem = 423,
> +       .firmware_name = "adsp.mbn",
> +       .load_state = "adsp",
> +       .ssr_name = "lpass",
> +       .sysmon_name = "adsp",
> +       .ssctl_id = 0x14,
> +       .is_wpss = false,

This can be left out, it's the default.

> +       .adsp_sandbox_needed = true,
> +       .auto_boot = true,
> +       .clk_ids = (const char*[]) {
> +               "gcc_cfg_noc_lpass", NULL
> +       },
> +       .num_clks = 1,

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 4/7] remoteproc: qcom: Replace hard coded values with macros
  2022-08-22  8:22 ` [RESEND v5 4/7] remoteproc: qcom: Replace hard coded values with macros Srinivasa Rao Mandadapu
@ 2022-08-23  3:06   ` Stephen Boyd
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:06 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:22:00)
> Replace hard coded values of QDSP6 boot control reg params
> with appropriate macro names.
>
> Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---

Reviewed-by: Stephen Boyd <swboyd@chromium.org>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 5/7] remoteproc: qcom: Add efuse evb selection control
  2022-08-22  8:22 ` [RESEND v5 5/7] remoteproc: qcom: Add efuse evb selection control Srinivasa Rao Mandadapu
@ 2022-08-23  3:12   ` Stephen Boyd
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:12 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:22:01)
> Add efuse evb selection control and enable it for starting ADSP.

Why is it important? What is evb?

>
> Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
> ---
>  drivers/remoteproc/qcom_q6v5_adsp.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
>
> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
> index 701a615..b0a63a0 100644
> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
> @@ -522,6 +527,11 @@ static int adsp_init_mmio(struct qcom_adsp *adsp,
>                 return PTR_ERR(adsp->qdsp6ss_base);
>         }
>
> +       adsp->lpass_efuse =  devm_platform_ioremap_resource_byname(pdev, "lpass_efuse");

Please do this in two phases:

	efuse_region = platform_get_resource(pdev, IORESOURCE_MEM, 1);
	if (!efuse_region) {
		adsp->lpass_efuse = NULL;
		dev_dbg(...);
	} else {
		adsp->lpass_efuse = devm_ioremap_resource(&pdev->dev, efuse_region);
		if (IS_ERR(adsp->lpass_efuse))
			return ERR_PTR(adsp->lpass_efuse);
	}


so that any ioremap errors are handled properly. Also using a string
comparison is not very useful when we can just as easily use the proper
index.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox
  2022-08-22  8:22 ` [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox Srinivasa Rao Mandadapu
@ 2022-08-23  3:25   ` Stephen Boyd
  2022-08-25 10:04     ` Srinivasa Rao Mandadapu
  0 siblings, 1 reply; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:25 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:22:02)
> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
> index b0a63a0..d01c97e 100644
> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
> @@ -333,6 +336,185 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
>         return 0;
>  }
>
> +static void adsp_of_unmap_smmu(struct iommu_domain *iommu_dom, const __be32 *prop, int len)
> +{
> +       unsigned long iova;
> +       unsigned int mem_size;
> +       int i;
> +
> +       len /= sizeof(__be32);
> +       for (i = 0; i < len; i++) {
> +               iova = be32_to_cpu(prop[i++]);
> +               /* Skip Physical address*/
> +               i++;
> +               mem_size = be32_to_cpu(prop[i++]);
> +               iommu_unmap(iommu_dom, iova, mem_size);
> +       }
> +}
> +
> +static void adsp_rproc_unmap_smmu(struct rproc *rproc, int len)
> +{
> +       struct fw_rsc_devmem *rsc_fw;
> +       struct fw_rsc_hdr *hdr;
> +       int offset;
> +       int i;
> +
> +       for (i = 0; i < len; i++) {
> +               offset = rproc->table_ptr->offset[i];
> +               hdr = (void *)rproc->table_ptr + offset;
> +               rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
> +
> +               iommu_unmap(rproc->domain, rsc_fw->da, rsc_fw->len);
> +       }
> +}
> +
> +static void adsp_unmap_smmu(struct rproc *rproc)
> +{
> +       struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
> +       const __be32 *prop;
> +       unsigned int len;
> +
> +       iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
> +
> +       prop = of_get_property(adsp->dev->of_node, "qcom,adsp-memory-regions", &len);
> +       if (prop) {
> +               adsp_of_unmap_smmu(adsp->iommu_dom, prop, len);
> +       } else {
> +               if (rproc->table_ptr)
> +                       adsp_rproc_unmap_smmu(rproc, rproc->table_ptr->num);
> +       }
> +
> +       iommu_domain_free(adsp->iommu_dom);
> +}
> +
> +static int adsp_of_map_smmu(struct iommu_domain *iommu_dom, const __be32 *prop, int len)
> +{
> +       unsigned long mem_phys;
> +       unsigned long iova;
> +       unsigned int mem_size;
> +       unsigned int flag;
> +       int access_level;
> +       int ret;
> +       int i;
> +
> +       len /= sizeof(__be32);
> +       for (i = 0; i < len; i++) {
> +               iova = be32_to_cpu(prop[i++]);
> +               mem_phys = be32_to_cpu(prop[i++]);
> +               mem_size = be32_to_cpu(prop[i++]);
> +               access_level = be32_to_cpu(prop[i]);
> +
> +               if (access_level)
> +                       flag = IOMMU_READ | IOMMU_WRITE;
> +               else
> +                       flag = IOMMU_READ;
> +
> +               ret = iommu_map(iommu_dom, iova, mem_phys, mem_size, flag);
> +               if (ret) {
> +                       pr_err("failed to map addr = %p mem_size = %x\n", &(mem_phys), mem_size);

Why can't this be dev_err()?

> +                       goto of_smmu_unmap;
> +               }
> +       }
> +       return 0;
> +of_smmu_unmap:
> +       adsp_of_unmap_smmu(iommu_dom, prop, i);
> +       return ret;
> +}
> +
> +static int adsp_rproc_map_smmu(struct rproc *rproc, int len)
> +{
> +       struct fw_rsc_devmem *rsc_fw;

const?

> +       struct fw_rsc_hdr *hdr;

const?

> +       int offset;
> +       int ret;
> +       int i;
> +
> +       if (!rproc->table_ptr)
> +               return 0;
> +
> +       for (i = 0; i < rproc->table_ptr->num; i++) {
> +               offset = rproc->table_ptr->offset[i];
> +               hdr = (void *)rproc->table_ptr + offset;
> +               rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
> +
> +               ret = iommu_map(rproc->domain, rsc_fw->da, rsc_fw->pa,
> +                                       rsc_fw->len, rsc_fw->flags);
> +               if (ret) {
> +                       pr_err("failed to map addr = %x mem_size = %x\n", rsc_fw->pa, rsc_fw->len);

Why can't this be dev_err()?

> +                       goto  rproc_smmu_unmap;
> +               }
> +       }
> +
> +       return 0;
> +
> +rproc_smmu_unmap:
> +       adsp_rproc_unmap_smmu(rproc, i);

Does i need to be incremented? And/or unmap should be done in reverse.

> +       return ret;
> +}
> +
> +static int adsp_map_smmu(struct qcom_adsp *adsp, struct rproc *rproc)
> +{
> +       struct of_phandle_args args;
> +       const __be32 *prop;
> +       long long sid;
> +       unsigned int len;
> +       int ret;
> +
> +       ret = of_parse_phandle_with_args(adsp->dev->of_node, "iommus", "#iommu-cells", 0, &args);
> +       if (ret < 0)
> +               sid = -1;

Is it a good idea to set the sid to -1? Does that mean all stream IDs?

> +       else
> +               sid = args.args[0] & SID_MASK_DEFAULT;
> +
> +       adsp->iommu_dom = iommu_domain_alloc(adsp->dev->bus);
> +       if (!adsp->iommu_dom) {
> +               dev_err(adsp->dev, "failed to allocate iommu domain\n");
> +               ret = -ENOMEM;
> +               goto domain_free;
> +       }
> +
> +       ret = iommu_attach_device(adsp->iommu_dom, adsp->dev);
> +       if (ret) {
> +               dev_err(adsp->dev, "could not attach device ret = %d\n", ret);
> +               ret = -EBUSY;

Why do we overwrite the error value?

> +               goto detach_device;
> +       }
> +
> +       /* Add SID configuration for ADSP Firmware to SMMU */
> +       adsp->mem_phys =  adsp->mem_phys | (sid << 32);
> +
> +       ret = iommu_map(adsp->iommu_dom, adsp->mem_phys, adsp->mem_phys,
> +                       adsp->mem_size, IOMMU_READ | IOMMU_WRITE);
> +       if (ret) {
> +               dev_err(adsp->dev, "Unable to map ADSP Physical Memory\n");
> +               goto sid_unmap;
> +       }
> +
> +       prop = of_get_property(adsp->dev->of_node, "qcom,adsp-memory-regions", &len);

I find it odd that we're encoding virtual addresses (iovas) into
devicetree. Presumably the physical address needs to be in DT as a
carveout, but after that I would think we're free to allocate the
segments from the carveout however we see fit and then program that into
the SMMU. Maybe DT can be a suggestion, but otherwise can it be ignored?

> +       if (prop) {
> +               ret = adsp_of_map_smmu(adsp->iommu_dom, prop, len);
> +               if (ret) {
> +                       dev_err(adsp->dev, "Unable to map memory regions accessed by ADSP\n");
> +                       goto sid_unmap;
> +               }
> +       } else {
> +               ret = adsp_rproc_map_smmu(rproc, len);
> +               if (ret) {
> +                       dev_err(adsp->dev, "Unable to map memory regions accessed by ADSP\n");

Maybe this should be a different string in case it is confused with the
above print of the same string.

> +                       goto sid_unmap;
> +               }
> +       }
> +       return 0;
> +
> +sid_unmap:
> +       iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
> +detach_device:
> +       iommu_domain_free(adsp->iommu_dom);
> +domain_free:
> +       return ret;
> +}
> +
> +
>  static int adsp_start(struct rproc *rproc)
>  {
>         struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
> @@ -343,9 +525,16 @@ static int adsp_start(struct rproc *rproc)
>         if (ret)
>                 return ret;
>
> +       if (adsp->adsp_sandbox_needed) {
> +               ret = adsp_map_smmu(adsp, rproc);
> +               if (ret) {
> +                       dev_err(adsp->dev, "ADSP smmu mapping failed\n");
> +                       goto disable_irqs;
> +               }
> +       }

Newline here please.

>         ret = clk_prepare_enable(adsp->xo);
>         if (ret)
> -               goto disable_irqs;
> +               goto adsp_smmu_unmap;
>
>         ret = qcom_rproc_pds_enable(adsp, adsp->proxy_pds,
>                                     adsp->proxy_pd_count);

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 7/7] remoteproc: qcom: Update QDSP6 out-of-reset timeout value
  2022-08-22  8:22 ` [RESEND v5 7/7] remoteproc: qcom: Update QDSP6 out-of-reset timeout value Srinivasa Rao Mandadapu
@ 2022-08-23  3:26   ` Stephen Boyd
  0 siblings, 0 replies; 19+ messages in thread
From: Stephen Boyd @ 2022-08-23  3:26 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, agross, bgoswami, bjorn.andersson,
	broonie, devicetree, judyhsiao, lgirdwood, linux-arm-msm,
	linux-kernel, linux-remoteproc, perex, quic_plai, quic_rohkumar,
	robh+dt, srinivas.kandagatla, tiwai

Quoting Srinivasa Rao Mandadapu (2022-08-22 01:22:03)
> Update QDSP6 out-of-reset timeout value to 1 second, as sometimes
> ADSP boot failing on SC7280 based platforms with existing value.
> Also add few micro seconds sleep after enabling boot core
> start register.
>
> Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com>
> ---

Reviewed-by: Stephen Boyd <swboyd@chromium.org>

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP
  2022-08-23  3:05   ` Stephen Boyd
@ 2022-08-23 14:35     ` Srinivasa Rao Mandadapu
  0 siblings, 0 replies; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-23 14:35 UTC (permalink / raw)
  To: Stephen Boyd, agross, bgoswami, bjorn.andersson, broonie,
	devicetree, judyhsiao, lgirdwood, linux-arm-msm, linux-kernel,
	linux-remoteproc, perex, quic_plai, quic_rohkumar, robh+dt,
	srinivas.kandagatla, tiwai


On 8/23/2022 8:35 AM, Stephen Boyd wrote:
Thanks for your time Stephen!!!
> Quoting Srinivasa Rao Mandadapu (2022-08-22 01:21:59)
>> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
>> index d0b767f..6d409ca 100644
>> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
>> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
>> @@ -701,6 +701,22 @@ static const struct adsp_pil_data adsp_resource_init = {
>>          },
>>   };
>>
>> +static const struct adsp_pil_data adsp_sc7280_resource_init = {
>> +       .crash_reason_smem = 423,
>> +       .firmware_name = "adsp.mbn",
>> +       .load_state = "adsp",
>> +       .ssr_name = "lpass",
>> +       .sysmon_name = "adsp",
>> +       .ssctl_id = 0x14,
>> +       .is_wpss = false,
> This can be left out, it's the default.
Okay. Will remove it and re-spin the patch.
>
>> +       .adsp_sandbox_needed = true,
>> +       .auto_boot = true,
>> +       .clk_ids = (const char*[]) {
>> +               "gcc_cfg_noc_lpass", NULL
>> +       },
>> +       .num_clks = 1,

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox
  2022-08-23  3:25   ` Stephen Boyd
@ 2022-08-25 10:04     ` Srinivasa Rao Mandadapu
  2022-09-08 12:59       ` Srinivasa Rao Mandadapu
  0 siblings, 1 reply; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-08-25 10:04 UTC (permalink / raw)
  To: Stephen Boyd, agross, bgoswami, bjorn.andersson, broonie,
	devicetree, judyhsiao, lgirdwood, linux-arm-msm, linux-kernel,
	linux-remoteproc, perex, quic_plai, quic_rohkumar, robh+dt,
	srinivas.kandagatla, tiwai


On 8/23/2022 8:55 AM, Stephen Boyd wrote:
Thanks for your time and valuable suggestions!!!
> Quoting Srinivasa Rao Mandadapu (2022-08-22 01:22:02)
>> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
>> index b0a63a0..d01c97e 100644
>> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
>> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
>> @@ -333,6 +336,185 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
>>          return 0;
>>   }
>>
>> +static void adsp_of_unmap_smmu(struct iommu_domain *iommu_dom, const __be32 *prop, int len)
>> +{
>> +       unsigned long iova;
>> +       unsigned int mem_size;
>> +       int i;
>> +
>> +       len /= sizeof(__be32);
>> +       for (i = 0; i < len; i++) {
>> +               iova = be32_to_cpu(prop[i++]);
>> +               /* Skip Physical address*/
>> +               i++;
>> +               mem_size = be32_to_cpu(prop[i++]);
>> +               iommu_unmap(iommu_dom, iova, mem_size);
>> +       }
>> +}
>> +
>> +static void adsp_rproc_unmap_smmu(struct rproc *rproc, int len)
>> +{
>> +       struct fw_rsc_devmem *rsc_fw;
>> +       struct fw_rsc_hdr *hdr;
>> +       int offset;
>> +       int i;
>> +
>> +       for (i = 0; i < len; i++) {
>> +               offset = rproc->table_ptr->offset[i];
>> +               hdr = (void *)rproc->table_ptr + offset;
>> +               rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
>> +
>> +               iommu_unmap(rproc->domain, rsc_fw->da, rsc_fw->len);
>> +       }
>> +}
>> +
>> +static void adsp_unmap_smmu(struct rproc *rproc)
>> +{
>> +       struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
>> +       const __be32 *prop;
>> +       unsigned int len;
>> +
>> +       iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
>> +
>> +       prop = of_get_property(adsp->dev->of_node, "qcom,adsp-memory-regions", &len);
>> +       if (prop) {
>> +               adsp_of_unmap_smmu(adsp->iommu_dom, prop, len);
>> +       } else {
>> +               if (rproc->table_ptr)
>> +                       adsp_rproc_unmap_smmu(rproc, rproc->table_ptr->num);
>> +       }
>> +
>> +       iommu_domain_free(adsp->iommu_dom);
>> +}
>> +
>> +static int adsp_of_map_smmu(struct iommu_domain *iommu_dom, const __be32 *prop, int len)
>> +{
>> +       unsigned long mem_phys;
>> +       unsigned long iova;
>> +       unsigned int mem_size;
>> +       unsigned int flag;
>> +       int access_level;
>> +       int ret;
>> +       int i;
>> +
>> +       len /= sizeof(__be32);
>> +       for (i = 0; i < len; i++) {
>> +               iova = be32_to_cpu(prop[i++]);
>> +               mem_phys = be32_to_cpu(prop[i++]);
>> +               mem_size = be32_to_cpu(prop[i++]);
>> +               access_level = be32_to_cpu(prop[i]);
>> +
>> +               if (access_level)
>> +                       flag = IOMMU_READ | IOMMU_WRITE;
>> +               else
>> +                       flag = IOMMU_READ;
>> +
>> +               ret = iommu_map(iommu_dom, iova, mem_phys, mem_size, flag);
>> +               if (ret) {
>> +                       pr_err("failed to map addr = %p mem_size = %x\n", &(mem_phys), mem_size);
> Why can't this be dev_err()?
Actually, dev pointer is not available here, hence used pr_err.
>
>> +                       goto of_smmu_unmap;
>> +               }
>> +       }
>> +       return 0;
>> +of_smmu_unmap:
>> +       adsp_of_unmap_smmu(iommu_dom, prop, i);
>> +       return ret;
>> +}
>> +
>> +static int adsp_rproc_map_smmu(struct rproc *rproc, int len)
>> +{
>> +       struct fw_rsc_devmem *rsc_fw;
> const?
Okay. will update.
>
>> +       struct fw_rsc_hdr *hdr;
> const?
Okay. Will update.
>
>> +       int offset;
>> +       int ret;
>> +       int i;
>> +
>> +       if (!rproc->table_ptr)
>> +               return 0;
>> +
>> +       for (i = 0; i < rproc->table_ptr->num; i++) {
>> +               offset = rproc->table_ptr->offset[i];
>> +               hdr = (void *)rproc->table_ptr + offset;
>> +               rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
>> +
>> +               ret = iommu_map(rproc->domain, rsc_fw->da, rsc_fw->pa,
>> +                                       rsc_fw->len, rsc_fw->flags);
>> +               if (ret) {
>> +                       pr_err("failed to map addr = %x mem_size = %x\n", rsc_fw->pa, rsc_fw->len);
> Why can't this be dev_err()?
Okay. Will change it.
>
>> +                       goto  rproc_smmu_unmap;
>> +               }
>> +       }
>> +
>> +       return 0;
>> +
>> +rproc_smmu_unmap:
>> +       adsp_rproc_unmap_smmu(rproc, i);
> Does i need to be incremented? And/or unmap should be done in reverse.

Here i is the upper bound index in mapping failure case, hence it is 
used as length. un-mapping is being done from starting till i value.

Please correct me if I am missing some thing.

>
>> +       return ret;
>> +}
>> +
>> +static int adsp_map_smmu(struct qcom_adsp *adsp, struct rproc *rproc)
>> +{
>> +       struct of_phandle_args args;
>> +       const __be32 *prop;
>> +       long long sid;
>> +       unsigned int len;
>> +       int ret;
>> +
>> +       ret = of_parse_phandle_with_args(adsp->dev->of_node, "iommus", "#iommu-cells", 0, &args);
>> +       if (ret < 0)
>> +               sid = -1;
> Is it a good idea to set the sid to -1? Does that mean all stream IDs?
It seems, if sid is -1 iomap fails, because of alignment issues. Any I 
will update with return in this case.
>
>> +       else
>> +               sid = args.args[0] & SID_MASK_DEFAULT;
>> +
>> +       adsp->iommu_dom = iommu_domain_alloc(adsp->dev->bus);
>> +       if (!adsp->iommu_dom) {
>> +               dev_err(adsp->dev, "failed to allocate iommu domain\n");
>> +               ret = -ENOMEM;
>> +               goto domain_free;
>> +       }
>> +
>> +       ret = iommu_attach_device(adsp->iommu_dom, adsp->dev);
>> +       if (ret) {
>> +               dev_err(adsp->dev, "could not attach device ret = %d\n", ret);
>> +               ret = -EBUSY;
> Why do we overwrite the error value?
It seems not required. Will remove it.
>
>> +               goto detach_device;
>> +       }
>> +
>> +       /* Add SID configuration for ADSP Firmware to SMMU */
>> +       adsp->mem_phys =  adsp->mem_phys | (sid << 32);
>> +
>> +       ret = iommu_map(adsp->iommu_dom, adsp->mem_phys, adsp->mem_phys,
>> +                       adsp->mem_size, IOMMU_READ | IOMMU_WRITE);
>> +       if (ret) {
>> +               dev_err(adsp->dev, "Unable to map ADSP Physical Memory\n");
>> +               goto sid_unmap;
>> +       }
>> +
>> +       prop = of_get_property(adsp->dev->of_node, "qcom,adsp-memory-regions", &len);
> I find it odd that we're encoding virtual addresses (iovas) into
Actually from HLOS perspective, same IOVA and physical memory is being 
used. Hence will remove virtual address field in DT.
> devicetree. Presumably the physical address needs to be in DT as a
> carveout, but after that I would think we're free to allocate the
Will try to carveout the physical addresses and handle it accordingly. 
If this method is ignored I don't think we need to mention in DT in anyway.
> segments from the carveout however we see fit and then program that into
> the SMMU. Maybe DT can be a suggestion, but otherwise can it be ignored?

Yes, it seems it can be ignored. As it is the approach we did for 
bringing up AudioReach solution, and used when ADSP binary is without 
metadata section header info.

Will check internally and update accordingly.

Your opinion also helps please!!. Is it okay to keep it as backup option 
with proper comment, such that this method can be used internally, with 
raw ADSP binary in early stage bring-up scenarios?

>
>> +       if (prop) {
>> +               ret = adsp_of_map_smmu(adsp->iommu_dom, prop, len);
>> +               if (ret) {
>> +                       dev_err(adsp->dev, "Unable to map memory regions accessed by ADSP\n");
>> +                       goto sid_unmap;
>> +               }
>> +       } else {
>> +               ret = adsp_rproc_map_smmu(rproc, len);
>> +               if (ret) {
>> +                       dev_err(adsp->dev, "Unable to map memory regions accessed by ADSP\n");
> Maybe this should be a different string in case it is confused with the
> above print of the same string.
Okay. Will modify the string.
>
>> +                       goto sid_unmap;
>> +               }
>> +       }
>> +       return 0;
>> +
>> +sid_unmap:
>> +       iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
>> +detach_device:
>> +       iommu_domain_free(adsp->iommu_dom);
>> +domain_free:
>> +       return ret;
>> +}
>> +
>> +
>>   static int adsp_start(struct rproc *rproc)
>>   {
>>          struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
>> @@ -343,9 +525,16 @@ static int adsp_start(struct rproc *rproc)
>>          if (ret)
>>                  return ret;
>>
>> +       if (adsp->adsp_sandbox_needed) {
>> +               ret = adsp_map_smmu(adsp, rproc);
>> +               if (ret) {
>> +                       dev_err(adsp->dev, "ADSP smmu mapping failed\n");
>> +                       goto disable_irqs;
>> +               }
>> +       }
> Newline here please.
Okay.
>
>>          ret = clk_prepare_enable(adsp->xo);
>>          if (ret)
>> -               goto disable_irqs;
>> +               goto adsp_smmu_unmap;
>>
>>          ret = qcom_rproc_pds_enable(adsp, adsp->proxy_pds,
>>                                      adsp->proxy_pd_count);

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform
  2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
                   ` (6 preceding siblings ...)
  2022-08-22  8:22 ` [RESEND v5 7/7] remoteproc: qcom: Update QDSP6 out-of-reset timeout value Srinivasa Rao Mandadapu
@ 2022-08-25 12:18 ` Krzysztof Kozlowski
  7 siblings, 0 replies; 19+ messages in thread
From: Krzysztof Kozlowski @ 2022-08-25 12:18 UTC (permalink / raw)
  To: Srinivasa Rao Mandadapu, linux-remoteproc, agross,
	bjorn.andersson, lgirdwood, broonie, robh+dt, quic_plai,
	bgoswami, perex, tiwai, srinivas.kandagatla, quic_rohkumar,
	linux-arm-msm, linux-kernel, swboyd, judyhsiao, devicetree

On 22/08/2022 11:21, Srinivasa Rao Mandadapu wrote:
> Update ADSP pil loader driver for SC7280 platforms.
> 

Since you did not CC me, maybe you based your patch on some old tree?
This has to be then rebased on current Linux source.

Best regards,
Krzysztof

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox
  2022-08-25 10:04     ` Srinivasa Rao Mandadapu
@ 2022-09-08 12:59       ` Srinivasa Rao Mandadapu
  0 siblings, 0 replies; 19+ messages in thread
From: Srinivasa Rao Mandadapu @ 2022-09-08 12:59 UTC (permalink / raw)
  To: Stephen Boyd, agross, bgoswami, bjorn.andersson, broonie,
	devicetree, judyhsiao, lgirdwood, linux-arm-msm, linux-kernel,
	linux-remoteproc, perex, quic_plai, quic_rohkumar, robh+dt,
	srinivas.kandagatla, tiwai


On 8/25/2022 3:34 PM, Srinivasa Rao Mandadapu wrote:
>
> On 8/23/2022 8:55 AM, Stephen Boyd wrote:
> Thanks for your time and valuable suggestions!!!
>> Quoting Srinivasa Rao Mandadapu (2022-08-22 01:22:02)
>>> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c 
>>> b/drivers/remoteproc/qcom_q6v5_adsp.c
>>> index b0a63a0..d01c97e 100644
>>> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
>>> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
>>> @@ -333,6 +336,185 @@ static int adsp_load(struct rproc *rproc, 
>>> const struct firmware *fw)
>>>          return 0;
>>>   }
>>>
>>> +static void adsp_of_unmap_smmu(struct iommu_domain *iommu_dom, 
>>> const __be32 *prop, int len)
>>> +{
>>> +       unsigned long iova;
>>> +       unsigned int mem_size;
>>> +       int i;
>>> +
>>> +       len /= sizeof(__be32);
>>> +       for (i = 0; i < len; i++) {
>>> +               iova = be32_to_cpu(prop[i++]);
>>> +               /* Skip Physical address*/
>>> +               i++;
>>> +               mem_size = be32_to_cpu(prop[i++]);
>>> +               iommu_unmap(iommu_dom, iova, mem_size);
>>> +       }
>>> +}
>>> +
>>> +static void adsp_rproc_unmap_smmu(struct rproc *rproc, int len)
>>> +{
>>> +       struct fw_rsc_devmem *rsc_fw;
>>> +       struct fw_rsc_hdr *hdr;
>>> +       int offset;
>>> +       int i;
>>> +
>>> +       for (i = 0; i < len; i++) {
>>> +               offset = rproc->table_ptr->offset[i];
>>> +               hdr = (void *)rproc->table_ptr + offset;
>>> +               rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
>>> +
>>> +               iommu_unmap(rproc->domain, rsc_fw->da, rsc_fw->len);
>>> +       }
>>> +}
>>> +
>>> +static void adsp_unmap_smmu(struct rproc *rproc)
>>> +{
>>> +       struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
>>> +       const __be32 *prop;
>>> +       unsigned int len;
>>> +
>>> +       iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
>>> +
>>> +       prop = of_get_property(adsp->dev->of_node, 
>>> "qcom,adsp-memory-regions", &len);
>>> +       if (prop) {
>>> +               adsp_of_unmap_smmu(adsp->iommu_dom, prop, len);
>>> +       } else {
>>> +               if (rproc->table_ptr)
>>> +                       adsp_rproc_unmap_smmu(rproc, 
>>> rproc->table_ptr->num);
>>> +       }
>>> +
>>> +       iommu_domain_free(adsp->iommu_dom);
>>> +}
>>> +
>>> +static int adsp_of_map_smmu(struct iommu_domain *iommu_dom, const 
>>> __be32 *prop, int len)
>>> +{
>>> +       unsigned long mem_phys;
>>> +       unsigned long iova;
>>> +       unsigned int mem_size;
>>> +       unsigned int flag;
>>> +       int access_level;
>>> +       int ret;
>>> +       int i;
>>> +
>>> +       len /= sizeof(__be32);
>>> +       for (i = 0; i < len; i++) {
>>> +               iova = be32_to_cpu(prop[i++]);
>>> +               mem_phys = be32_to_cpu(prop[i++]);
>>> +               mem_size = be32_to_cpu(prop[i++]);
>>> +               access_level = be32_to_cpu(prop[i]);
>>> +
>>> +               if (access_level)
>>> +                       flag = IOMMU_READ | IOMMU_WRITE;
>>> +               else
>>> +                       flag = IOMMU_READ;
>>> +
>>> +               ret = iommu_map(iommu_dom, iova, mem_phys, mem_size, 
>>> flag);
>>> +               if (ret) {
>>> +                       pr_err("failed to map addr = %p mem_size = 
>>> %x\n", &(mem_phys), mem_size);
>> Why can't this be dev_err()?
> Actually, dev pointer is not available here, hence used pr_err.
>>
>>> +                       goto of_smmu_unmap;
>>> +               }
>>> +       }
>>> +       return 0;
>>> +of_smmu_unmap:
>>> +       adsp_of_unmap_smmu(iommu_dom, prop, i);
>>> +       return ret;
>>> +}
>>> +
>>> +static int adsp_rproc_map_smmu(struct rproc *rproc, int len)
>>> +{
>>> +       struct fw_rsc_devmem *rsc_fw;
>> const?
> Okay. will update.
>>
>>> +       struct fw_rsc_hdr *hdr;
>> const?
> Okay. Will update.
>>
>>> +       int offset;
>>> +       int ret;
>>> +       int i;
>>> +
>>> +       if (!rproc->table_ptr)
>>> +               return 0;
>>> +
>>> +       for (i = 0; i < rproc->table_ptr->num; i++) {
>>> +               offset = rproc->table_ptr->offset[i];
>>> +               hdr = (void *)rproc->table_ptr + offset;
>>> +               rsc_fw = (struct fw_rsc_devmem *)hdr + sizeof(*hdr);
>>> +
>>> +               ret = iommu_map(rproc->domain, rsc_fw->da, rsc_fw->pa,
>>> +                                       rsc_fw->len, rsc_fw->flags);
>>> +               if (ret) {
>>> +                       pr_err("failed to map addr = %x mem_size = 
>>> %x\n", rsc_fw->pa, rsc_fw->len);
>> Why can't this be dev_err()?
> Okay. Will change it.
>>
>>> +                       goto rproc_smmu_unmap;
>>> +               }
>>> +       }
>>> +
>>> +       return 0;
>>> +
>>> +rproc_smmu_unmap:
>>> +       adsp_rproc_unmap_smmu(rproc, i);
>> Does i need to be incremented? And/or unmap should be done in reverse.
>
> Here i is the upper bound index in mapping failure case, hence it is 
> used as length. un-mapping is being done from starting till i value.
>
> Please correct me if I am missing some thing.
>
>>
>>> +       return ret;
>>> +}
>>> +
>>> +static int adsp_map_smmu(struct qcom_adsp *adsp, struct rproc *rproc)
>>> +{
>>> +       struct of_phandle_args args;
>>> +       const __be32 *prop;
>>> +       long long sid;
>>> +       unsigned int len;
>>> +       int ret;
>>> +
>>> +       ret = of_parse_phandle_with_args(adsp->dev->of_node, 
>>> "iommus", "#iommu-cells", 0, &args);
>>> +       if (ret < 0)
>>> +               sid = -1;
>> Is it a good idea to set the sid to -1? Does that mean all stream IDs?
> It seems, if sid is -1 iomap fails, because of alignment issues. Any I 
> will update with return in this case.
>>
>>> +       else
>>> +               sid = args.args[0] & SID_MASK_DEFAULT;
>>> +
>>> +       adsp->iommu_dom = iommu_domain_alloc(adsp->dev->bus);
>>> +       if (!adsp->iommu_dom) {
>>> +               dev_err(adsp->dev, "failed to allocate iommu 
>>> domain\n");
>>> +               ret = -ENOMEM;
>>> +               goto domain_free;
>>> +       }
>>> +
>>> +       ret = iommu_attach_device(adsp->iommu_dom, adsp->dev);
>>> +       if (ret) {
>>> +               dev_err(adsp->dev, "could not attach device ret = 
>>> %d\n", ret);
>>> +               ret = -EBUSY;
>> Why do we overwrite the error value?
> It seems not required. Will remove it.
>>
>>> +               goto detach_device;
>>> +       }
>>> +
>>> +       /* Add SID configuration for ADSP Firmware to SMMU */
>>> +       adsp->mem_phys =  adsp->mem_phys | (sid << 32);
>>> +
>>> +       ret = iommu_map(adsp->iommu_dom, adsp->mem_phys, 
>>> adsp->mem_phys,
>>> +                       adsp->mem_size, IOMMU_READ | IOMMU_WRITE);
>>> +       if (ret) {
>>> +               dev_err(adsp->dev, "Unable to map ADSP Physical 
>>> Memory\n");
>>> +               goto sid_unmap;
>>> +       }
>>> +
>>> +       prop = of_get_property(adsp->dev->of_node, 
>>> "qcom,adsp-memory-regions", &len);
>> I find it odd that we're encoding virtual addresses (iovas) into
> Actually from HLOS perspective, same IOVA and physical memory is being 
> used. Hence will remove virtual address field in DT.
>> devicetree. Presumably the physical address needs to be in DT as a
>> carveout, but after that I would think we're free to allocate the
> Will try to carveout the physical addresses and handle it accordingly. 
> If this method is ignored I don't think we need to mention in DT in 
> anyway.
>> segments from the carveout however we see fit and then program that into
>> the SMMU. Maybe DT can be a suggestion, but otherwise can it be ignored?
>
> Yes, it seems it can be ignored. As it is the approach we did for 
> bringing up AudioReach solution, and used when ADSP binary is without 
> metadata section header info.
>
> Will check internally and update accordingly.
>
> Your opinion also helps please!!. Is it okay to keep it as backup 
> option with proper comment, such that this method can be used 
> internally, with raw ADSP binary in early stage bring-up scenarios?

After internal discussions, decided to remove sandboxing using device 
tree and explicitly doing in PIL driver.

Instead, decided to use rproc's parse_fw call back 
"rproc_elf_load_rsc_table" function and achieve the sand boxing.

Will re post the patches with corresponding changes.

>
>>
>>> +       if (prop) {
>>> +               ret = adsp_of_map_smmu(adsp->iommu_dom, prop, len);
>>> +               if (ret) {
>>> +                       dev_err(adsp->dev, "Unable to map memory 
>>> regions accessed by ADSP\n");
>>> +                       goto sid_unmap;
>>> +               }
>>> +       } else {
>>> +               ret = adsp_rproc_map_smmu(rproc, len);
>>> +               if (ret) {
>>> +                       dev_err(adsp->dev, "Unable to map memory 
>>> regions accessed by ADSP\n");
>> Maybe this should be a different string in case it is confused with the
>> above print of the same string.
> Okay. Will modify the string.
As explained above will remove both of the above methods.
>>
>>> +                       goto sid_unmap;
>>> +               }
>>> +       }
>>> +       return 0;
>>> +
>>> +sid_unmap:
>>> +       iommu_unmap(adsp->iommu_dom, adsp->mem_phys, adsp->mem_size);
>>> +detach_device:
>>> +       iommu_domain_free(adsp->iommu_dom);
>>> +domain_free:
>>> +       return ret;
>>> +}
>>> +
>>> +
>>>   static int adsp_start(struct rproc *rproc)
>>>   {
>>>          struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
>>> @@ -343,9 +525,16 @@ static int adsp_start(struct rproc *rproc)
>>>          if (ret)
>>>                  return ret;
>>>
>>> +       if (adsp->adsp_sandbox_needed) {
>>> +               ret = adsp_map_smmu(adsp, rproc);
>>> +               if (ret) {
>>> +                       dev_err(adsp->dev, "ADSP smmu mapping 
>>> failed\n");
>>> +                       goto disable_irqs;
>>> +               }
>>> +       }
>> Newline here please.
> Okay.
>>
>>>          ret = clk_prepare_enable(adsp->xo);
>>>          if (ret)
>>> -               goto disable_irqs;
>>> +               goto adsp_smmu_unmap;
>>>
>>>          ret = qcom_rproc_pds_enable(adsp, adsp->proxy_pds,
>>>                                      adsp->proxy_pd_count);

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2022-09-08 13:00 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-22  8:21 [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Srinivasa Rao Mandadapu
2022-08-22  8:21 ` [RESEND v5 1/7] dt-bindings: remoteproc: qcom: Add SC7280 ADSP support Srinivasa Rao Mandadapu
2022-08-23  3:04   ` Stephen Boyd
2022-08-22  8:21 ` [RESEND v5 2/7] remoteproc: qcom: Add flag in adsp private data structure Srinivasa Rao Mandadapu
2022-08-23  3:04   ` Stephen Boyd
2022-08-22  8:21 ` [RESEND v5 3/7] remoteproc: qcom: Add compatible name for SC7280 ADSP Srinivasa Rao Mandadapu
2022-08-23  3:05   ` Stephen Boyd
2022-08-23 14:35     ` Srinivasa Rao Mandadapu
2022-08-22  8:22 ` [RESEND v5 4/7] remoteproc: qcom: Replace hard coded values with macros Srinivasa Rao Mandadapu
2022-08-23  3:06   ` Stephen Boyd
2022-08-22  8:22 ` [RESEND v5 5/7] remoteproc: qcom: Add efuse evb selection control Srinivasa Rao Mandadapu
2022-08-23  3:12   ` Stephen Boyd
2022-08-22  8:22 ` [RESEND v5 6/7] remoteproc: qcom: Add support for memory sandbox Srinivasa Rao Mandadapu
2022-08-23  3:25   ` Stephen Boyd
2022-08-25 10:04     ` Srinivasa Rao Mandadapu
2022-09-08 12:59       ` Srinivasa Rao Mandadapu
2022-08-22  8:22 ` [RESEND v5 7/7] remoteproc: qcom: Update QDSP6 out-of-reset timeout value Srinivasa Rao Mandadapu
2022-08-23  3:26   ` Stephen Boyd
2022-08-25 12:18 ` [RESEND v5 0/7] Update ADSP pil loader for SC7280 platform Krzysztof Kozlowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).