Message ID | 1662643422-14909-1-git-send-email-quic_srivasam@quicinc.com |
---|---|
Headers | show |
Series | Update ADSP pil loader for SC7280 platform | expand |
Quoting Srinivasa Rao Mandadapu (2022-09-08 06:23:35) > 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> > --- Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Quoting Srinivasa Rao Mandadapu (2022-09-08 06:23:37) > 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> > --- Reviewed-by: Stephen Boyd <swboyd@chromium.org>
Hey Srinivas, Thanks for the patch series. On 9/8/22 6:53 PM, Srinivasa Rao Mandadapu wrote: > 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 V5: > -- Remove qcom,adsp-memory-regions property. > Changes since V4: > -- Update halt registers description in dt bindings. > > .../bindings/remoteproc/qcom,sc7280-adsp-pil.yaml | 175 +++++++++++++++++++++ > 1 file changed, 175 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..1428522 > --- /dev/null > +++ b/Documentation/devicetree/bindings/remoteproc/qcom,sc7280-adsp-pil.yaml > @@ -0,0 +1,175 @@ > +# 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 s/defines the binding/describes the hardware. > + 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 Doesn't it need the LMX pd as well? > + > + 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,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 You can skip ref and items. > + 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 You probably also need to mention qcom,qmp as a required property. Not sure why you choose to skip glink-edge as well. > + > +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>, > + <0x0355b000 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"; > + > + }; >
On 9/8/22 6:53 PM, Srinivasa Rao Mandadapu wrote: > 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> Reviewed-by: Sibi Sankar <quic_sibis@quicinc.com> > --- > 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 207270d4..389b2c0 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, >
On 9/8/22 6:53 PM, Srinivasa Rao Mandadapu wrote: > 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. Please do check if the timeout that you hit is due to lack of required clock/bus scaling. If so increasing the timeout would be just an interim hack and might stop working in the future. > > Signed-off-by: Srinivasa Rao Mandadapu <quic_srivasam@quicinc.com> > Reviewed-by: Stephen Boyd <swboyd@chromium.org> > --- > 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 e55d593..4414e23 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*/ > @@ -422,13 +422,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; >