Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'qcom-drivers-for-6.6' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux into soc/drivers

Qualcomm driver updates for v6.6

Compatible and clock handling in the Qualcomm SCM driver is cleaned up,
together with a couple stylistic cleanups and transition to mark
exported symbols GPL only.

An abstraction for the RPM subsystem is introduced, to make align the
structure of the SMD and GLINK nodes thereof with the structure when a
remoteproc is involved. This is done to facilitate associating
additional entities with the RPM subsystem.

The qmp_send() API is modified to not expose hardware requirements onto
the client drivers, and then further extended to allow command
formatting directly in the API, to facilitate this typical use case.

In the Qualcomm Command DB driver, NUL characters previously included in
identifiers are dropped from the debugfs, to facilitate scripting.

The thresholds of the BWMON driver are simplified to avoid hard coded
starting values.

The OCMEM driver is updated with some cleanups and fixes, and addition
of MSM8226 support.

PMIC_GLINK gains support for retimer switches, safe mode is selected
when the cable is disconnected from altmode and the same is enabled for
SM8550.

An off-by-one string length check is corrected in the QMI encoder
decoder library.

The RPMh tracepoints are extended to include the state of the request,
to provide needed context in the traced events.

The series from Ulf creating a genpd framework is integrated, to
facilitate the other changes to the cpr, rpmpd and rpmhpd driver.
SDX75 support is added to the rpmhpd driver, and the rpmpd driver is
extended with the same sync_state logic found in the rpmhpd driver.

The socinfo driver gains knowledge about SM4450 and SM7125, the IPQ5019
platform is dropped.

Clock handling in the GSBI driver is cleaned up with the use of
devm_clk_get_enabled().

The list of VMIDs defined for the SCM assign memory interface is
extended.

* tag 'qcom-drivers-for-6.6' of https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux: (52 commits)
soc: qcom: aoss: Tidy up qmp_send() callers
soc: qcom: aoss: Format string in qmp_send()
soc: qcom: aoss: Move length requirements from caller
dt-bindings: firmware: qcom: scm: Updating VMID list
dt-bindings: qcom: Update RPMHPD entries for some SoCs
soc: qcom: qmi_encdec: Restrict string length in decode
soc: qcom: smem: Fix incompatible types in comparison
soc: qcom: ocmem: add missing clk_disable_unprepare() in ocmem_dev_probe()
soc: qcom: socinfo: Add SoC ID for SM7125
dt-bindings: arm: qcom,ids: Add SoC ID for SM7125
dt-bindings: arm: qcom,ids: drop the IPQ5019 SoC ID
soc: qcom: socinfo: drop the IPQ5019 SoC ID
soc: qcom: socinfo: add SM4450 ID
dt-bindings: arm: qcom,ids: add SoC ID for SM4450
soc: qcom: pmic_glink: enable altmode for SM8550
soc: qcom: pmic_glink_altmode: add retimer-switch support
soc: qcom: pmic_glink_altmode: handle safe mode when disconnect
soc: qcom: rpmhpd: Add SDX75 power domains
dt-bindings: power: qcom,rpmpd: Add compatible for sdx75
genpd: Makefile: build imx
...

Link: https://lore.kernel.org/r/20230818023338.2484467-1-andersson@kernel.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+742 -375
+2 -2
Documentation/devicetree/bindings/clock/qcom,dispcc-sm8x50.yaml
··· 82 82 examples: 83 83 - | 84 84 #include <dt-bindings/clock/qcom,rpmh.h> 85 - #include <dt-bindings/power/qcom-rpmpd.h> 85 + #include <dt-bindings/power/qcom,rpmhpd.h> 86 86 clock-controller@af00000 { 87 87 compatible = "qcom,sm8250-dispcc"; 88 88 reg = <0x0af00000 0x10000>; ··· 103 103 #clock-cells = <1>; 104 104 #reset-cells = <1>; 105 105 #power-domain-cells = <1>; 106 - power-domains = <&rpmhpd SM8250_MMCX>; 106 + power-domains = <&rpmhpd RPMHPD_MMCX>; 107 107 required-opps = <&rpmhpd_opp_low_svs>; 108 108 }; 109 109 ...
+2 -2
Documentation/devicetree/bindings/clock/qcom,sm8350-videocc.yaml
··· 51 51 examples: 52 52 - | 53 53 #include <dt-bindings/clock/qcom,rpmh.h> 54 - #include <dt-bindings/power/qcom-rpmpd.h> 54 + #include <dt-bindings/power/qcom,rpmhpd.h> 55 55 56 56 clock-controller@abf0000 { 57 57 compatible = "qcom,sm8350-videocc"; ··· 59 59 clocks = <&rpmhcc RPMH_CXO_CLK>, 60 60 <&rpmhcc RPMH_CXO_CLK_A>, 61 61 <&sleep_clk>; 62 - power-domains = <&rpmhpd SM8350_MMCX>; 62 + power-domains = <&rpmhpd RPMHPD_MMCX>; 63 63 required-opps = <&rpmhpd_opp_low_svs>; 64 64 #clock-cells = <1>; 65 65 #reset-cells = <1>;
+2 -2
Documentation/devicetree/bindings/clock/qcom,sm8450-camcc.yaml
··· 64 64 - | 65 65 #include <dt-bindings/clock/qcom,gcc-sm8450.h> 66 66 #include <dt-bindings/clock/qcom,rpmh.h> 67 - #include <dt-bindings/power/qcom-rpmpd.h> 67 + #include <dt-bindings/power/qcom,rpmhpd.h> 68 68 clock-controller@ade0000 { 69 69 compatible = "qcom,sm8450-camcc"; 70 70 reg = <0xade0000 0x20000>; ··· 72 72 <&rpmhcc RPMH_CXO_CLK>, 73 73 <&rpmhcc RPMH_CXO_CLK_A>, 74 74 <&sleep_clk>; 75 - power-domains = <&rpmhpd SM8450_MMCX>; 75 + power-domains = <&rpmhpd RPMHPD_MMCX>; 76 76 required-opps = <&rpmhpd_opp_low_svs>; 77 77 #clock-cells = <1>; 78 78 #reset-cells = <1>;
+2 -2
Documentation/devicetree/bindings/clock/qcom,sm8450-dispcc.yaml
··· 76 76 - | 77 77 #include <dt-bindings/clock/qcom,gcc-sm8450.h> 78 78 #include <dt-bindings/clock/qcom,rpmh.h> 79 - #include <dt-bindings/power/qcom-rpmpd.h> 79 + #include <dt-bindings/power/qcom,rpmhpd.h> 80 80 clock-controller@af00000 { 81 81 compatible = "qcom,sm8450-dispcc"; 82 82 reg = <0x0af00000 0x10000>; ··· 91 91 #clock-cells = <1>; 92 92 #reset-cells = <1>; 93 93 #power-domain-cells = <1>; 94 - power-domains = <&rpmhpd SM8450_MMCX>; 94 + power-domains = <&rpmhpd RPMHPD_MMCX>; 95 95 required-opps = <&rpmhpd_opp_low_svs>; 96 96 }; 97 97 ...
+2 -2
Documentation/devicetree/bindings/clock/qcom,sm8450-videocc.yaml
··· 64 64 - | 65 65 #include <dt-bindings/clock/qcom,gcc-sm8450.h> 66 66 #include <dt-bindings/clock/qcom,rpmh.h> 67 - #include <dt-bindings/power/qcom-rpmpd.h> 67 + #include <dt-bindings/power/qcom,rpmhpd.h> 68 68 videocc: clock-controller@aaf0000 { 69 69 compatible = "qcom,sm8450-videocc"; 70 70 reg = <0x0aaf0000 0x10000>; 71 71 clocks = <&rpmhcc RPMH_CXO_CLK>, 72 72 <&gcc GCC_VIDEO_AHB_CLK>; 73 - power-domains = <&rpmhpd SM8450_MMCX>; 73 + power-domains = <&rpmhpd RPMHPD_MMCX>; 74 74 required-opps = <&rpmhpd_opp_low_svs>; 75 75 #clock-cells = <1>; 76 76 #reset-cells = <1>;
+2 -2
Documentation/devicetree/bindings/clock/qcom,sm8550-dispcc.yaml
··· 76 76 - | 77 77 #include <dt-bindings/clock/qcom,sm8550-gcc.h> 78 78 #include <dt-bindings/clock/qcom,rpmh.h> 79 - #include <dt-bindings/power/qcom-rpmpd.h> 79 + #include <dt-bindings/power/qcom,rpmhpd.h> 80 80 clock-controller@af00000 { 81 81 compatible = "qcom,sm8550-dispcc"; 82 82 reg = <0x0af00000 0x10000>; ··· 99 99 #clock-cells = <1>; 100 100 #reset-cells = <1>; 101 101 #power-domain-cells = <1>; 102 - power-domains = <&rpmhpd SM8550_MMCX>; 102 + power-domains = <&rpmhpd RPMHPD_MMCX>; 103 103 required-opps = <&rpmhpd_opp_low_svs>; 104 104 }; 105 105 ...
+2 -2
Documentation/devicetree/bindings/clock/qcom,videocc.yaml
··· 124 124 examples: 125 125 - | 126 126 #include <dt-bindings/clock/qcom,rpmh.h> 127 - #include <dt-bindings/power/qcom-rpmpd.h> 127 + #include <dt-bindings/power/qcom,rpmhpd.h> 128 128 clock-controller@ab00000 { 129 129 compatible = "qcom,sdm845-videocc"; 130 130 reg = <0x0ab00000 0x10000>; ··· 133 133 #clock-cells = <1>; 134 134 #reset-cells = <1>; 135 135 #power-domain-cells = <1>; 136 - power-domains = <&rpmhpd SM8250_MMCX>; 136 + power-domains = <&rpmhpd RPMHPD_MMCX>; 137 137 required-opps = <&rpmhpd_opp_low_svs>; 138 138 }; 139 139 ...
+2 -2
Documentation/devicetree/bindings/display/msm/qcom,sm8250-dpu.yaml
··· 54 54 #include <dt-bindings/clock/qcom,gcc-sm8250.h> 55 55 #include <dt-bindings/interrupt-controller/arm-gic.h> 56 56 #include <dt-bindings/interconnect/qcom,sm8250.h> 57 - #include <dt-bindings/power/qcom-rpmpd.h> 57 + #include <dt-bindings/power/qcom,rpmhpd.h> 58 58 59 59 display-controller@ae01000 { 60 60 compatible = "qcom,sm8250-dpu"; ··· 72 72 assigned-clock-rates = <19200000>; 73 73 74 74 operating-points-v2 = <&mdp_opp_table>; 75 - power-domains = <&rpmhpd SM8250_MMCX>; 75 + power-domains = <&rpmhpd RPMHPD_MMCX>; 76 76 77 77 interrupt-parent = <&mdss>; 78 78 interrupts = <0>;
+4 -4
Documentation/devicetree/bindings/display/msm/qcom,sm8250-mdss.yaml
··· 76 76 #include <dt-bindings/clock/qcom,rpmh.h> 77 77 #include <dt-bindings/interrupt-controller/arm-gic.h> 78 78 #include <dt-bindings/interconnect/qcom,sm8250.h> 79 - #include <dt-bindings/power/qcom-rpmpd.h> 79 + #include <dt-bindings/power/qcom,rpmhpd.h> 80 80 81 81 display-subsystem@ae00000 { 82 82 compatible = "qcom,sm8250-mdss"; ··· 121 121 assigned-clock-rates = <19200000>; 122 122 123 123 operating-points-v2 = <&mdp_opp_table>; 124 - power-domains = <&rpmhpd SM8250_MMCX>; 124 + power-domains = <&rpmhpd RPMHPD_MMCX>; 125 125 126 126 interrupt-parent = <&mdss>; 127 127 interrupts = <0>; ··· 196 196 assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 197 197 198 198 operating-points-v2 = <&dsi_opp_table>; 199 - power-domains = <&rpmhpd SM8250_MMCX>; 199 + power-domains = <&rpmhpd RPMHPD_MMCX>; 200 200 201 201 phys = <&dsi0_phy>; 202 202 phy-names = "dsi"; ··· 286 286 assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 287 287 288 288 operating-points-v2 = <&dsi_opp_table>; 289 - power-domains = <&rpmhpd SM8250_MMCX>; 289 + power-domains = <&rpmhpd RPMHPD_MMCX>; 290 290 291 291 phys = <&dsi1_phy>; 292 292 phy-names = "dsi";
+2 -2
Documentation/devicetree/bindings/display/msm/qcom,sm8350-dpu.yaml
··· 51 51 #include <dt-bindings/clock/qcom,gcc-sm8350.h> 52 52 #include <dt-bindings/interrupt-controller/arm-gic.h> 53 53 #include <dt-bindings/interconnect/qcom,sm8350.h> 54 - #include <dt-bindings/power/qcom-rpmpd.h> 54 + #include <dt-bindings/power/qcom,rpmhpd.h> 55 55 56 56 display-controller@ae01000 { 57 57 compatible = "qcom,sm8350-dpu"; ··· 76 76 assigned-clock-rates = <19200000>; 77 77 78 78 operating-points-v2 = <&mdp_opp_table>; 79 - power-domains = <&rpmhpd SM8350_MMCX>; 79 + power-domains = <&rpmhpd RPMHPD_MMCX>; 80 80 81 81 interrupt-parent = <&mdss>; 82 82 interrupts = <0>;
+3 -3
Documentation/devicetree/bindings/display/msm/qcom,sm8350-mdss.yaml
··· 75 75 #include <dt-bindings/clock/qcom,rpmh.h> 76 76 #include <dt-bindings/interrupt-controller/arm-gic.h> 77 77 #include <dt-bindings/interconnect/qcom,sm8350.h> 78 - #include <dt-bindings/power/qcom-rpmpd.h> 78 + #include <dt-bindings/power/qcom,rpmhpd.h> 79 79 80 80 display-subsystem@ae00000 { 81 81 compatible = "qcom,sm8350-mdss"; ··· 128 128 assigned-clock-rates = <19200000>; 129 129 130 130 operating-points-v2 = <&mdp_opp_table>; 131 - power-domains = <&rpmhpd SM8350_MMCX>; 131 + power-domains = <&rpmhpd RPMHPD_MMCX>; 132 132 133 133 interrupt-parent = <&mdss>; 134 134 interrupts = <0>; ··· 197 197 <&mdss_dsi0_phy 1>; 198 198 199 199 operating-points-v2 = <&dsi_opp_table>; 200 - power-domains = <&rpmhpd SM8350_MMCX>; 200 + power-domains = <&rpmhpd RPMHPD_MMCX>; 201 201 202 202 phys = <&mdss_dsi0_phy>; 203 203
+2 -2
Documentation/devicetree/bindings/display/msm/qcom,sm8450-dpu.yaml
··· 58 58 #include <dt-bindings/clock/qcom,gcc-sm8450.h> 59 59 #include <dt-bindings/interrupt-controller/arm-gic.h> 60 60 #include <dt-bindings/interconnect/qcom,sm8450.h> 61 - #include <dt-bindings/power/qcom-rpmpd.h> 61 + #include <dt-bindings/power/qcom,rpmhpd.h> 62 62 63 63 display-controller@ae01000 { 64 64 compatible = "qcom,sm8450-dpu"; ··· 83 83 assigned-clock-rates = <19200000>; 84 84 85 85 operating-points-v2 = <&mdp_opp_table>; 86 - power-domains = <&rpmhpd SM8450_MMCX>; 86 + power-domains = <&rpmhpd RPMHPD_MMCX>; 87 87 88 88 interrupt-parent = <&mdss>; 89 89 interrupts = <0>;
+4 -4
Documentation/devicetree/bindings/display/msm/qcom,sm8450-mdss.yaml
··· 68 68 #include <dt-bindings/clock/qcom,rpmh.h> 69 69 #include <dt-bindings/interrupt-controller/arm-gic.h> 70 70 #include <dt-bindings/interconnect/qcom,sm8450.h> 71 - #include <dt-bindings/power/qcom-rpmpd.h> 71 + #include <dt-bindings/power/qcom,rpmhpd.h> 72 72 73 73 display-subsystem@ae00000 { 74 74 compatible = "qcom,sm8450-mdss"; ··· 122 122 assigned-clock-rates = <19200000>; 123 123 124 124 operating-points-v2 = <&mdp_opp_table>; 125 - power-domains = <&rpmhpd SM8450_MMCX>; 125 + power-domains = <&rpmhpd RPMHPD_MMCX>; 126 126 127 127 interrupt-parent = <&mdss>; 128 128 interrupts = <0>; ··· 202 202 assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 203 203 204 204 operating-points-v2 = <&dsi_opp_table>; 205 - power-domains = <&rpmhpd SM8450_MMCX>; 205 + power-domains = <&rpmhpd RPMHPD_MMCX>; 206 206 207 207 phys = <&dsi0_phy>; 208 208 phy-names = "dsi"; ··· 297 297 assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 298 298 299 299 operating-points-v2 = <&dsi_opp_table>; 300 - power-domains = <&rpmhpd SM8450_MMCX>; 300 + power-domains = <&rpmhpd RPMHPD_MMCX>; 301 301 302 302 phys = <&dsi1_phy>; 303 303 phy-names = "dsi";
+2 -2
Documentation/devicetree/bindings/display/msm/qcom,sm8550-dpu.yaml
··· 57 57 #include <dt-bindings/clock/qcom,sm8550-dispcc.h> 58 58 #include <dt-bindings/clock/qcom,sm8550-gcc.h> 59 59 #include <dt-bindings/interrupt-controller/arm-gic.h> 60 - #include <dt-bindings/power/qcom-rpmpd.h> 60 + #include <dt-bindings/power/qcom,rpmhpd.h> 61 61 62 62 display-controller@ae01000 { 63 63 compatible = "qcom,sm8550-dpu"; ··· 82 82 assigned-clock-rates = <19200000>; 83 83 84 84 operating-points-v2 = <&mdp_opp_table>; 85 - power-domains = <&rpmhpd SM8550_MMCX>; 85 + power-domains = <&rpmhpd RPMHPD_MMCX>; 86 86 87 87 interrupt-parent = <&mdss>; 88 88 interrupts = <0>;
+4 -4
Documentation/devicetree/bindings/display/msm/qcom,sm8550-mdss.yaml
··· 68 68 #include <dt-bindings/clock/qcom,rpmh.h> 69 69 #include <dt-bindings/interrupt-controller/arm-gic.h> 70 70 #include <dt-bindings/interconnect/qcom,sm8550-rpmh.h> 71 - #include <dt-bindings/power/qcom-rpmpd.h> 71 + #include <dt-bindings/power/qcom,rpmhpd.h> 72 72 73 73 display-subsystem@ae00000 { 74 74 compatible = "qcom,sm8550-mdss"; ··· 122 122 assigned-clock-rates = <19200000>; 123 123 124 124 operating-points-v2 = <&mdp_opp_table>; 125 - power-domains = <&rpmhpd SM8550_MMCX>; 125 + power-domains = <&rpmhpd RPMHPD_MMCX>; 126 126 127 127 interrupt-parent = <&mdss>; 128 128 interrupts = <0>; ··· 197 197 assigned-clock-parents = <&dsi0_phy 0>, <&dsi0_phy 1>; 198 198 199 199 operating-points-v2 = <&dsi_opp_table>; 200 - power-domains = <&rpmhpd SM8550_MMCX>; 200 + power-domains = <&rpmhpd RPMHPD_MMCX>; 201 201 202 202 phys = <&dsi0_phy>; 203 203 phy-names = "dsi"; ··· 286 286 assigned-clock-parents = <&dsi1_phy 0>, <&dsi1_phy 1>; 287 287 288 288 operating-points-v2 = <&dsi_opp_table>; 289 - power-domains = <&rpmhpd SM8550_MMCX>; 289 + power-domains = <&rpmhpd RPMHPD_MMCX>; 290 290 291 291 phys = <&dsi1_phy>; 292 292 phy-names = "dsi";
+1
Documentation/devicetree/bindings/firmware/qcom,scm.yaml
··· 176 176 contains: 177 177 enum: 178 178 - qcom,scm-qdu1000 179 + - qcom,scm-sc8280xp 179 180 - qcom,scm-sm8450 180 181 - qcom,scm-sm8550 181 182 then:
+2 -2
Documentation/devicetree/bindings/media/qcom,sm8250-venus.yaml
··· 106 106 #include <dt-bindings/clock/qcom,videocc-sm8250.h> 107 107 #include <dt-bindings/interconnect/qcom,sm8250.h> 108 108 #include <dt-bindings/clock/qcom,gcc-sm8250.h> 109 - #include <dt-bindings/power/qcom-rpmpd.h> 109 + #include <dt-bindings/power/qcom,rpmhpd.h> 110 110 111 111 venus: video-codec@aa00000 { 112 112 compatible = "qcom,sm8250-venus"; ··· 114 114 interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>; 115 115 power-domains = <&videocc MVS0C_GDSC>, 116 116 <&videocc MVS0_GDSC>, 117 - <&rpmhpd SM8250_MX>; 117 + <&rpmhpd RPMHPD_MX>; 118 118 power-domain-names = "venus", "vcodec0", "mx"; 119 119 120 120 clocks = <&gcc GCC_VIDEO_AXI0_CLK>,
+2 -2
Documentation/devicetree/bindings/mmc/sdhci-msm.yaml
··· 215 215 #include <dt-bindings/interrupt-controller/arm-gic.h> 216 216 #include <dt-bindings/clock/qcom,gcc-sm8250.h> 217 217 #include <dt-bindings/clock/qcom,rpmh.h> 218 - #include <dt-bindings/power/qcom-rpmpd.h> 218 + #include <dt-bindings/power/qcom,rpmhpd.h> 219 219 220 220 sdhc_2: mmc@8804000 { 221 221 compatible = "qcom,sm8250-sdhci", "qcom,sdhci-msm-v5"; ··· 232 232 iommus = <&apps_smmu 0x4a0 0x0>; 233 233 qcom,dll-config = <0x0007642c>; 234 234 qcom,ddr-config = <0x80040868>; 235 - power-domains = <&rpmhpd SM8250_CX>; 235 + power-domains = <&rpmhpd RPMHPD_CX>; 236 236 237 237 operating-points-v2 = <&sdhc2_opp_table>; 238 238
+1
Documentation/devicetree/bindings/power/qcom,rpmpd.yaml
··· 41 41 - qcom,sdm845-rpmhpd 42 42 - qcom,sdx55-rpmhpd 43 43 - qcom,sdx65-rpmhpd 44 + - qcom,sdx75-rpmhpd 44 45 - qcom,sm6115-rpmpd 45 46 - qcom,sm6125-rpmpd 46 47 - qcom,sm6350-rpmhpd
+171
Documentation/devicetree/bindings/remoteproc/qcom,rpm-proc.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/remoteproc/qcom,rpm-proc.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Qualcomm Resource Power Manager (RPM) Processor/Subsystem 8 + 9 + maintainers: 10 + - Bjorn Andersson <andersson@kernel.org> 11 + - Konrad Dybcio <konrad.dybcio@linaro.org> 12 + - Stephan Gerhold <stephan@gerhold.net> 13 + 14 + description: | 15 + Resource Power Manager (RPM) subsystem found in various Qualcomm platforms: 16 + 17 + +--------------------------------------------+ 18 + | RPM subsystem (qcom,rpm-proc) | 19 + | | 20 + reset | +---------------+ +-----+ +-----+ | 21 + --------->| | | MPM | | CPR | ... | 22 + IPC interrupts | | ARM Cortex-M3 |--- +-----+ +-----+ | 23 + ----------------->| | | | | | 24 + | +---------------+ |---------------------- | 25 + | +---------------+ | | 26 + | | Code RAM |--| +------------------+ | 27 + | +---------------+ | | | | 28 + | +---------------+ |--| Message RAM | | 29 + | | Data RAM |--| | | | 30 + | +---------------+ | +------------------+ | 31 + +--------------------|-----------------------+ 32 + v 33 + NoC 34 + 35 + The firmware running on the processor inside the RPM subsystem allows each 36 + component in the system to vote for state of the system resources, such as 37 + clocks, regulators and bus frequencies. It implements multiple separate 38 + communication interfaces that are described in subnodes, e.g. SMD and MPM: 39 + 40 + +------------------------------+ 41 + | ARM Cortex-M3 | 42 + | | +------------------------------+ 43 + | +--------------------------+ | | Message RAM | 44 + | | RPM firmware | | | | 45 + IPC IRQ 0 | | +----------------------+ | | | +--------------------------+ | 46 + -------------->| SMD server |<------->| SMD data structures | | 47 + | | | +--------------+ | | | | | +--------------+ | | 48 + | | | | rpm_requests | ... | | | | | | rpm_requests | ... | | 49 + | | | +--------------+ | | | | | +--------------+ | | 50 + IPC IRQ 1 | | +----------------------+ | | | +--------------------------+ | 51 + -------------->| MPM virtualization |<--------| MPM register copy (vMPM) | | 52 + | | +----------------------+ | | | +--------------------------+ | 53 + | | ... | | | | ... | 54 + | +--------------------|-----+ | +------------------------------+ 55 + +----------------------|-------+ 56 + v 57 + +--------------+ 58 + | MPM Hardware | 59 + +--------------+ 60 + 61 + The services provided by the firmware are only available after the firmware 62 + has been loaded and the processor has been released from reset. Usually this 63 + happens early in the boot process before the operating system is started. 64 + 65 + properties: 66 + compatible: 67 + items: 68 + - enum: 69 + - qcom,apq8084-rpm-proc 70 + - qcom,ipq6018-rpm-proc 71 + - qcom,ipq9574-rpm-proc 72 + - qcom,mdm9607-rpm-proc 73 + - qcom,msm8226-rpm-proc 74 + - qcom,msm8610-rpm-proc 75 + - qcom,msm8909-rpm-proc 76 + - qcom,msm8916-rpm-proc 77 + - qcom,msm8917-rpm-proc 78 + - qcom,msm8936-rpm-proc 79 + - qcom,msm8937-rpm-proc 80 + - qcom,msm8952-rpm-proc 81 + - qcom,msm8953-rpm-proc 82 + - qcom,msm8974-rpm-proc 83 + - qcom,msm8976-rpm-proc 84 + - qcom,msm8994-rpm-proc 85 + - qcom,msm8996-rpm-proc 86 + - qcom,msm8998-rpm-proc 87 + - qcom,qcm2290-rpm-proc 88 + - qcom,qcs404-rpm-proc 89 + - qcom,sdm660-rpm-proc 90 + - qcom,sm6115-rpm-proc 91 + - qcom,sm6125-rpm-proc 92 + - qcom,sm6375-rpm-proc 93 + - const: qcom,rpm-proc 94 + 95 + smd-edge: 96 + $ref: /schemas/remoteproc/qcom,smd-edge.yaml# 97 + description: 98 + Qualcomm Shared Memory subnode which represents communication edge, 99 + channels and devices related to the RPM subsystem. 100 + 101 + glink-edge: 102 + $ref: /schemas/remoteproc/qcom,glink-rpm-edge.yaml# 103 + description: 104 + Qualcomm G-Link subnode which represents communication edge, 105 + channels and devices related to the RPM subsystem. 106 + 107 + interrupt-controller: 108 + type: object 109 + $ref: /schemas/interrupt-controller/qcom,mpm.yaml# 110 + description: 111 + MSM Power Manager (MPM) interrupt controller that monitors interrupts 112 + when the system is asleep. 113 + 114 + master-stats: 115 + $ref: /schemas/soc/qcom/qcom,rpm-master-stats.yaml# 116 + description: 117 + Subsystem-level low-power mode statistics provided by RPM. 118 + 119 + required: 120 + - compatible 121 + 122 + oneOf: 123 + - required: 124 + - smd-edge 125 + - required: 126 + - glink-edge 127 + 128 + additionalProperties: false 129 + 130 + examples: 131 + # SMD 132 + - | 133 + #include <dt-bindings/interrupt-controller/arm-gic.h> 134 + #include <dt-bindings/interrupt-controller/irq.h> 135 + 136 + remoteproc { 137 + compatible = "qcom,msm8916-rpm-proc", "qcom,rpm-proc"; 138 + 139 + smd-edge { 140 + interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>; 141 + qcom,ipc = <&apcs 8 0>; 142 + qcom,smd-edge = <15>; 143 + 144 + rpm-requests { 145 + compatible = "qcom,rpm-msm8916"; 146 + qcom,smd-channels = "rpm_requests"; 147 + /* ... */ 148 + }; 149 + }; 150 + }; 151 + # GLINK 152 + - | 153 + #include <dt-bindings/interrupt-controller/arm-gic.h> 154 + #include <dt-bindings/interrupt-controller/irq.h> 155 + 156 + remoteproc { 157 + compatible = "qcom,qcm2290-rpm-proc", "qcom,rpm-proc"; 158 + 159 + glink-edge { 160 + compatible = "qcom,glink-rpm"; 161 + interrupts = <GIC_SPI 194 IRQ_TYPE_EDGE_RISING>; 162 + qcom,rpm-msg-ram = <&rpm_msg_ram>; 163 + mboxes = <&apcs_glb 0>; 164 + 165 + rpm-requests { 166 + compatible = "qcom,rpm-qcm2290"; 167 + qcom,glink-channels = "rpm_requests"; 168 + /* ... */ 169 + }; 170 + }; 171 + };
+3 -3
Documentation/devicetree/bindings/remoteproc/qcom,sm8350-pas.yaml
··· 139 139 #include <dt-bindings/clock/qcom,rpmh.h> 140 140 #include <dt-bindings/interrupt-controller/irq.h> 141 141 #include <dt-bindings/mailbox/qcom-ipcc.h> 142 - #include <dt-bindings/power/qcom-rpmpd.h> 142 + #include <dt-bindings/power/qcom,rpmhpd.h> 143 143 144 144 remoteproc@30000000 { 145 145 compatible = "qcom,sm8450-adsp-pas"; ··· 160 160 161 161 memory-region = <&adsp_mem>; 162 162 163 - power-domains = <&rpmhpd SM8450_LCX>, 164 - <&rpmhpd SM8450_LMX>; 163 + power-domains = <&rpmhpd RPMHPD_LCX>, 164 + <&rpmhpd RPMHPD_LMX>; 165 165 power-domain-names = "lcx", "lmx"; 166 166 167 167 qcom,qmp = <&aoss_qmp>;
+17 -6
Documentation/devicetree/bindings/soc/qcom/qcom,smd-rpm.yaml
··· 34 34 - qcom,rpm-apq8084 35 35 - qcom,rpm-ipq6018 36 36 - qcom,rpm-ipq9574 37 + - qcom,rpm-mdm9607 37 38 - qcom,rpm-msm8226 39 + - qcom,rpm-msm8610 38 40 - qcom,rpm-msm8909 39 41 - qcom,rpm-msm8916 42 + - qcom,rpm-msm8917 40 43 - qcom,rpm-msm8936 44 + - qcom,rpm-msm8937 45 + - qcom,rpm-msm8952 41 46 - qcom,rpm-msm8953 42 47 - qcom,rpm-msm8974 43 48 - qcom,rpm-msm8976 44 49 - qcom,rpm-msm8994 45 50 - qcom,rpm-msm8996 46 51 - qcom,rpm-msm8998 52 + - qcom,rpm-qcm2290 53 + - qcom,rpm-qcs404 47 54 - qcom,rpm-sdm660 48 55 - qcom,rpm-sm6115 49 56 - qcom,rpm-sm6125 50 57 - qcom,rpm-sm6375 51 - - qcom,rpm-qcm2290 52 - - qcom,rpm-qcs404 53 58 54 59 clock-controller: 55 60 $ref: /schemas/clock/qcom,rpmcc.yaml# ··· 86 81 contains: 87 82 enum: 88 83 - qcom,rpm-apq8084 84 + - qcom,rpm-mdm9607 89 85 - qcom,rpm-msm8226 86 + - qcom,rpm-msm8610 87 + - qcom,rpm-msm8909 90 88 - qcom,rpm-msm8916 89 + - qcom,rpm-msm8917 91 90 - qcom,rpm-msm8936 91 + - qcom,rpm-msm8937 92 + - qcom,rpm-msm8952 93 + - qcom,rpm-msm8953 92 94 - qcom,rpm-msm8974 93 95 - qcom,rpm-msm8976 94 - - qcom,rpm-msm8953 95 96 - qcom,rpm-msm8994 96 97 then: 97 98 properties: ··· 120 109 #include <dt-bindings/interrupt-controller/arm-gic.h> 121 110 #include <dt-bindings/interrupt-controller/irq.h> 122 111 123 - smd { 124 - compatible = "qcom,smd"; 112 + remoteproc { 113 + compatible = "qcom,msm8916-rpm-proc", "qcom,rpm-proc"; 125 114 126 - rpm { 115 + smd-edge { 127 116 interrupts = <GIC_SPI 168 IRQ_TYPE_EDGE_RISING>; 128 117 qcom,ipc = <&apcs 8 0>; 129 118 qcom,smd-edge = <15>;
+7
Documentation/devicetree/bindings/soc/qcom/qcom,smd.yaml
··· 15 15 The Qualcomm Shared Memory Driver is a FIFO based communication channel for 16 16 sending data between the various subsystems in Qualcomm platforms. 17 17 18 + Using the top-level SMD node is deprecated. Instead, the SMD edges are defined 19 + directly below the device node representing the respective remote subsystem 20 + or remote processor. 21 + 22 + deprecated: true 23 + 18 24 properties: 19 25 compatible: 20 26 const: qcom,smd ··· 43 37 # The following example represents a smd node, with one edge representing the 44 38 # "rpm" subsystem. For the "rpm" subsystem we have a device tied to the 45 39 # "rpm_request" channel. 40 + # NOTE: This is deprecated, represent the RPM using "qcom,rpm-proc" instead. 46 41 - | 47 42 #include <dt-bindings/interrupt-controller/arm-gic.h> 48 43
+25 -1
Documentation/devicetree/bindings/sram/qcom,ocmem.yaml
··· 15 15 16 16 properties: 17 17 compatible: 18 - const: qcom,msm8974-ocmem 18 + enum: 19 + - qcom,msm8226-ocmem # v1.1.0 20 + - qcom,msm8974-ocmem # v1.4.0 19 21 20 22 reg: 21 23 items: ··· 30 28 - const: mem 31 29 32 30 clocks: 31 + minItems: 1 33 32 items: 34 33 - description: Core clock 35 34 - description: Interface clock 36 35 37 36 clock-names: 37 + minItems: 1 38 38 items: 39 39 - const: core 40 40 - const: iface ··· 61 57 - ranges 62 58 63 59 additionalProperties: false 60 + 61 + allOf: 62 + - if: 63 + properties: 64 + compatible: 65 + contains: 66 + enum: 67 + - qcom,msm8974-ocmem 68 + then: 69 + properties: 70 + clocks: 71 + minItems: 2 72 + clock-names: 73 + minItems: 2 74 + else: 75 + properties: 76 + clocks: 77 + minItems: 1 78 + clock-names: 79 + minItems: 1 64 80 65 81 patternProperties: 66 82 "-sram@[0-9a-f]+$":
+50 -108
drivers/firmware/qcom_scm.c
··· 26 26 static bool download_mode = IS_ENABLED(CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT); 27 27 module_param(download_mode, bool, 0); 28 28 29 - #define SCM_HAS_CORE_CLK BIT(0) 30 - #define SCM_HAS_IFACE_CLK BIT(1) 31 - #define SCM_HAS_BUS_CLK BIT(2) 32 - 33 29 struct qcom_scm { 34 30 struct device *dev; 35 31 struct clk *core_clk; ··· 347 351 return qcom_scm_set_boot_addr(entry, qcom_scm_cpu_warm_bits); 348 352 return 0; 349 353 } 350 - EXPORT_SYMBOL(qcom_scm_set_warm_boot_addr); 354 + EXPORT_SYMBOL_GPL(qcom_scm_set_warm_boot_addr); 351 355 352 356 /** 353 357 * qcom_scm_set_cold_boot_addr() - Set the cold boot address for all cpus ··· 360 364 return qcom_scm_set_boot_addr(entry, qcom_scm_cpu_cold_bits); 361 365 return 0; 362 366 } 363 - EXPORT_SYMBOL(qcom_scm_set_cold_boot_addr); 367 + EXPORT_SYMBOL_GPL(qcom_scm_set_cold_boot_addr); 364 368 365 369 /** 366 370 * qcom_scm_cpu_power_down() - Power down the cpu ··· 382 386 383 387 qcom_scm_call_atomic(__scm ? __scm->dev : NULL, &desc, NULL); 384 388 } 385 - EXPORT_SYMBOL(qcom_scm_cpu_power_down); 389 + EXPORT_SYMBOL_GPL(qcom_scm_cpu_power_down); 386 390 387 391 int qcom_scm_set_remote_state(u32 state, u32 id) 388 392 { ··· 401 405 402 406 return ret ? : res.result[0]; 403 407 } 404 - EXPORT_SYMBOL(qcom_scm_set_remote_state); 408 + EXPORT_SYMBOL_GPL(qcom_scm_set_remote_state); 405 409 406 410 static int __qcom_scm_set_dload_mode(struct device *dev, bool enable) 407 411 { ··· 511 515 512 516 return ret ? : res.result[0]; 513 517 } 514 - EXPORT_SYMBOL(qcom_scm_pas_init_image); 518 + EXPORT_SYMBOL_GPL(qcom_scm_pas_init_image); 515 519 516 520 /** 517 521 * qcom_scm_pas_metadata_release() - release metadata context ··· 528 532 ctx->phys = 0; 529 533 ctx->size = 0; 530 534 } 531 - EXPORT_SYMBOL(qcom_scm_pas_metadata_release); 535 + EXPORT_SYMBOL_GPL(qcom_scm_pas_metadata_release); 532 536 533 537 /** 534 538 * qcom_scm_pas_mem_setup() - Prepare the memory related to a given peripheral ··· 567 571 568 572 return ret ? : res.result[0]; 569 573 } 570 - EXPORT_SYMBOL(qcom_scm_pas_mem_setup); 574 + EXPORT_SYMBOL_GPL(qcom_scm_pas_mem_setup); 571 575 572 576 /** 573 577 * qcom_scm_pas_auth_and_reset() - Authenticate the given peripheral firmware ··· 602 606 603 607 return ret ? : res.result[0]; 604 608 } 605 - EXPORT_SYMBOL(qcom_scm_pas_auth_and_reset); 609 + EXPORT_SYMBOL_GPL(qcom_scm_pas_auth_and_reset); 606 610 607 611 /** 608 612 * qcom_scm_pas_shutdown() - Shut down the remote processor ··· 637 641 638 642 return ret ? : res.result[0]; 639 643 } 640 - EXPORT_SYMBOL(qcom_scm_pas_shutdown); 644 + EXPORT_SYMBOL_GPL(qcom_scm_pas_shutdown); 641 645 642 646 /** 643 647 * qcom_scm_pas_supported() - Check if the peripheral authentication service is ··· 666 670 667 671 return ret ? false : !!res.result[0]; 668 672 } 669 - EXPORT_SYMBOL(qcom_scm_pas_supported); 673 + EXPORT_SYMBOL_GPL(qcom_scm_pas_supported); 670 674 671 675 static int __qcom_scm_pas_mss_reset(struct device *dev, bool reset) 672 676 { ··· 728 732 729 733 return ret < 0 ? ret : 0; 730 734 } 731 - EXPORT_SYMBOL(qcom_scm_io_readl); 735 + EXPORT_SYMBOL_GPL(qcom_scm_io_readl); 732 736 733 737 int qcom_scm_io_writel(phys_addr_t addr, unsigned int val) 734 738 { ··· 743 747 744 748 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); 745 749 } 746 - EXPORT_SYMBOL(qcom_scm_io_writel); 750 + EXPORT_SYMBOL_GPL(qcom_scm_io_writel); 747 751 748 752 /** 749 753 * qcom_scm_restore_sec_cfg_available() - Check if secure environment ··· 756 760 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_MP, 757 761 QCOM_SCM_MP_RESTORE_SEC_CFG); 758 762 } 759 - EXPORT_SYMBOL(qcom_scm_restore_sec_cfg_available); 763 + EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg_available); 760 764 761 765 int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare) 762 766 { ··· 775 779 776 780 return ret ? : res.result[0]; 777 781 } 778 - EXPORT_SYMBOL(qcom_scm_restore_sec_cfg); 782 + EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg); 779 783 780 784 int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size) 781 785 { ··· 796 800 797 801 return ret ? : res.result[1]; 798 802 } 799 - EXPORT_SYMBOL(qcom_scm_iommu_secure_ptbl_size); 803 + EXPORT_SYMBOL_GPL(qcom_scm_iommu_secure_ptbl_size); 800 804 801 805 int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare) 802 806 { ··· 820 824 821 825 return ret; 822 826 } 823 - EXPORT_SYMBOL(qcom_scm_iommu_secure_ptbl_init); 827 + EXPORT_SYMBOL_GPL(qcom_scm_iommu_secure_ptbl_init); 824 828 825 829 int qcom_scm_iommu_set_cp_pool_size(u32 spare, u32 size) 826 830 { ··· 835 839 836 840 return qcom_scm_call(__scm->dev, &desc, NULL); 837 841 } 838 - EXPORT_SYMBOL(qcom_scm_iommu_set_cp_pool_size); 842 + EXPORT_SYMBOL_GPL(qcom_scm_iommu_set_cp_pool_size); 839 843 840 844 int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size, 841 845 u32 cp_nonpixel_start, ··· 859 863 860 864 return ret ? : res.result[0]; 861 865 } 862 - EXPORT_SYMBOL(qcom_scm_mem_protect_video_var); 866 + EXPORT_SYMBOL_GPL(qcom_scm_mem_protect_video_var); 863 867 864 868 static int __qcom_scm_assign_mem(struct device *dev, phys_addr_t mem_region, 865 869 size_t mem_sz, phys_addr_t src, size_t src_sz, ··· 968 972 *srcvm = next_vm; 969 973 return 0; 970 974 } 971 - EXPORT_SYMBOL(qcom_scm_assign_mem); 975 + EXPORT_SYMBOL_GPL(qcom_scm_assign_mem); 972 976 973 977 /** 974 978 * qcom_scm_ocmem_lock_available() - is OCMEM lock/unlock interface available ··· 978 982 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_OCMEM, 979 983 QCOM_SCM_OCMEM_LOCK_CMD); 980 984 } 981 - EXPORT_SYMBOL(qcom_scm_ocmem_lock_available); 985 + EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock_available); 982 986 983 987 /** 984 988 * qcom_scm_ocmem_lock() - call OCMEM lock interface to assign an OCMEM ··· 1004 1008 1005 1009 return qcom_scm_call(__scm->dev, &desc, NULL); 1006 1010 } 1007 - EXPORT_SYMBOL(qcom_scm_ocmem_lock); 1011 + EXPORT_SYMBOL_GPL(qcom_scm_ocmem_lock); 1008 1012 1009 1013 /** 1010 1014 * qcom_scm_ocmem_unlock() - call OCMEM unlock interface to release an OCMEM ··· 1027 1031 1028 1032 return qcom_scm_call(__scm->dev, &desc, NULL); 1029 1033 } 1030 - EXPORT_SYMBOL(qcom_scm_ocmem_unlock); 1034 + EXPORT_SYMBOL_GPL(qcom_scm_ocmem_unlock); 1031 1035 1032 1036 /** 1033 1037 * qcom_scm_ice_available() - Is the ICE key programming interface available? ··· 1042 1046 __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_ES, 1043 1047 QCOM_SCM_ES_CONFIG_SET_ICE_KEY); 1044 1048 } 1045 - EXPORT_SYMBOL(qcom_scm_ice_available); 1049 + EXPORT_SYMBOL_GPL(qcom_scm_ice_available); 1046 1050 1047 1051 /** 1048 1052 * qcom_scm_ice_invalidate_key() - Invalidate an inline encryption key ··· 1068 1072 1069 1073 return qcom_scm_call(__scm->dev, &desc, NULL); 1070 1074 } 1071 - EXPORT_SYMBOL(qcom_scm_ice_invalidate_key); 1075 + EXPORT_SYMBOL_GPL(qcom_scm_ice_invalidate_key); 1072 1076 1073 1077 /** 1074 1078 * qcom_scm_ice_set_key() - Set an inline encryption key ··· 1134 1138 dma_free_coherent(__scm->dev, key_size, keybuf, key_phys); 1135 1139 return ret; 1136 1140 } 1137 - EXPORT_SYMBOL(qcom_scm_ice_set_key); 1141 + EXPORT_SYMBOL_GPL(qcom_scm_ice_set_key); 1138 1142 1139 1143 /** 1140 1144 * qcom_scm_hdcp_available() - Check if secure environment supports HDCP. ··· 1156 1160 1157 1161 return avail; 1158 1162 } 1159 - EXPORT_SYMBOL(qcom_scm_hdcp_available); 1163 + EXPORT_SYMBOL_GPL(qcom_scm_hdcp_available); 1160 1164 1161 1165 /** 1162 1166 * qcom_scm_hdcp_req() - Send HDCP request. ··· 1203 1207 1204 1208 return ret; 1205 1209 } 1206 - EXPORT_SYMBOL(qcom_scm_hdcp_req); 1210 + EXPORT_SYMBOL_GPL(qcom_scm_hdcp_req); 1207 1211 1208 1212 int qcom_scm_iommu_set_pt_format(u32 sec_id, u32 ctx_num, u32 pt_fmt) 1209 1213 { ··· 1219 1223 1220 1224 return qcom_scm_call(__scm->dev, &desc, NULL); 1221 1225 } 1222 - EXPORT_SYMBOL(qcom_scm_iommu_set_pt_format); 1226 + EXPORT_SYMBOL_GPL(qcom_scm_iommu_set_pt_format); 1223 1227 1224 1228 int qcom_scm_qsmmu500_wait_safe_toggle(bool en) 1225 1229 { ··· 1235 1239 1236 1240 return qcom_scm_call_atomic(__scm->dev, &desc, NULL); 1237 1241 } 1238 - EXPORT_SYMBOL(qcom_scm_qsmmu500_wait_safe_toggle); 1242 + EXPORT_SYMBOL_GPL(qcom_scm_qsmmu500_wait_safe_toggle); 1239 1243 1240 1244 bool qcom_scm_lmh_dcvsh_available(void) 1241 1245 { 1242 1246 return __qcom_scm_is_call_available(__scm->dev, QCOM_SCM_SVC_LMH, QCOM_SCM_LMH_LIMIT_DCVSH); 1243 1247 } 1244 - EXPORT_SYMBOL(qcom_scm_lmh_dcvsh_available); 1248 + EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh_available); 1245 1249 1246 1250 int qcom_scm_lmh_profile_change(u32 profile_id) 1247 1251 { ··· 1255 1259 1256 1260 return qcom_scm_call(__scm->dev, &desc, NULL); 1257 1261 } 1258 - EXPORT_SYMBOL(qcom_scm_lmh_profile_change); 1262 + EXPORT_SYMBOL_GPL(qcom_scm_lmh_profile_change); 1259 1263 1260 1264 int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val, 1261 1265 u64 limit_node, u32 node_id, u64 version) ··· 1293 1297 dma_free_coherent(__scm->dev, payload_size, payload_buf, payload_phys); 1294 1298 return ret; 1295 1299 } 1296 - EXPORT_SYMBOL(qcom_scm_lmh_dcvsh); 1300 + EXPORT_SYMBOL_GPL(qcom_scm_lmh_dcvsh); 1297 1301 1298 1302 static int qcom_scm_find_dload_address(struct device *dev, u64 *addr) 1299 1303 { ··· 1328 1332 { 1329 1333 return !!__scm; 1330 1334 } 1331 - EXPORT_SYMBOL(qcom_scm_is_available); 1335 + EXPORT_SYMBOL_GPL(qcom_scm_is_available); 1332 1336 1333 1337 static int qcom_scm_assert_valid_wq_ctx(u32 wq_ctx) 1334 1338 { ··· 1401 1405 static int qcom_scm_probe(struct platform_device *pdev) 1402 1406 { 1403 1407 struct qcom_scm *scm; 1404 - unsigned long clks; 1405 1408 int irq, ret; 1406 1409 1407 1410 scm = devm_kzalloc(&pdev->dev, sizeof(*scm), GFP_KERNEL); ··· 1413 1418 1414 1419 mutex_init(&scm->scm_bw_lock); 1415 1420 1416 - clks = (unsigned long)of_device_get_match_data(&pdev->dev); 1417 - 1418 1421 scm->path = devm_of_icc_get(&pdev->dev, NULL); 1419 1422 if (IS_ERR(scm->path)) 1420 1423 return dev_err_probe(&pdev->dev, PTR_ERR(scm->path), 1421 1424 "failed to acquire interconnect path\n"); 1422 1425 1423 - scm->core_clk = devm_clk_get(&pdev->dev, "core"); 1424 - if (IS_ERR(scm->core_clk)) { 1425 - if (PTR_ERR(scm->core_clk) == -EPROBE_DEFER) 1426 - return PTR_ERR(scm->core_clk); 1426 + scm->core_clk = devm_clk_get_optional(&pdev->dev, "core"); 1427 + if (IS_ERR(scm->core_clk)) 1428 + return PTR_ERR(scm->core_clk); 1427 1429 1428 - if (clks & SCM_HAS_CORE_CLK) { 1429 - dev_err(&pdev->dev, "failed to acquire core clk\n"); 1430 - return PTR_ERR(scm->core_clk); 1431 - } 1430 + scm->iface_clk = devm_clk_get_optional(&pdev->dev, "iface"); 1431 + if (IS_ERR(scm->iface_clk)) 1432 + return PTR_ERR(scm->iface_clk); 1432 1433 1433 - scm->core_clk = NULL; 1434 - } 1435 - 1436 - scm->iface_clk = devm_clk_get(&pdev->dev, "iface"); 1437 - if (IS_ERR(scm->iface_clk)) { 1438 - if (PTR_ERR(scm->iface_clk) == -EPROBE_DEFER) 1439 - return PTR_ERR(scm->iface_clk); 1440 - 1441 - if (clks & SCM_HAS_IFACE_CLK) { 1442 - dev_err(&pdev->dev, "failed to acquire iface clk\n"); 1443 - return PTR_ERR(scm->iface_clk); 1444 - } 1445 - 1446 - scm->iface_clk = NULL; 1447 - } 1448 - 1449 - scm->bus_clk = devm_clk_get(&pdev->dev, "bus"); 1450 - if (IS_ERR(scm->bus_clk)) { 1451 - if (PTR_ERR(scm->bus_clk) == -EPROBE_DEFER) 1452 - return PTR_ERR(scm->bus_clk); 1453 - 1454 - if (clks & SCM_HAS_BUS_CLK) { 1455 - dev_err(&pdev->dev, "failed to acquire bus clk\n"); 1456 - return PTR_ERR(scm->bus_clk); 1457 - } 1458 - 1459 - scm->bus_clk = NULL; 1460 - } 1434 + scm->bus_clk = devm_clk_get_optional(&pdev->dev, "bus"); 1435 + if (IS_ERR(scm->bus_clk)) 1436 + return PTR_ERR(scm->bus_clk); 1461 1437 1462 1438 scm->reset.ops = &qcom_scm_pas_reset_ops; 1463 1439 scm->reset.nr_resets = 1; ··· 1478 1512 } 1479 1513 1480 1514 static const struct of_device_id qcom_scm_dt_match[] = { 1481 - { .compatible = "qcom,scm-apq8064", 1482 - /* FIXME: This should have .data = (void *) SCM_HAS_CORE_CLK */ 1483 - }, 1484 - { .compatible = "qcom,scm-apq8084", .data = (void *)(SCM_HAS_CORE_CLK | 1485 - SCM_HAS_IFACE_CLK | 1486 - SCM_HAS_BUS_CLK) 1487 - }, 1488 - { .compatible = "qcom,scm-ipq4019" }, 1489 - { .compatible = "qcom,scm-mdm9607", .data = (void *)(SCM_HAS_CORE_CLK | 1490 - SCM_HAS_IFACE_CLK | 1491 - SCM_HAS_BUS_CLK) }, 1492 - { .compatible = "qcom,scm-msm8660", .data = (void *) SCM_HAS_CORE_CLK }, 1493 - { .compatible = "qcom,scm-msm8960", .data = (void *) SCM_HAS_CORE_CLK }, 1494 - { .compatible = "qcom,scm-msm8916", .data = (void *)(SCM_HAS_CORE_CLK | 1495 - SCM_HAS_IFACE_CLK | 1496 - SCM_HAS_BUS_CLK) 1497 - }, 1498 - { .compatible = "qcom,scm-msm8953", .data = (void *)(SCM_HAS_CORE_CLK | 1499 - SCM_HAS_IFACE_CLK | 1500 - SCM_HAS_BUS_CLK) 1501 - }, 1502 - { .compatible = "qcom,scm-msm8974", .data = (void *)(SCM_HAS_CORE_CLK | 1503 - SCM_HAS_IFACE_CLK | 1504 - SCM_HAS_BUS_CLK) 1505 - }, 1506 - { .compatible = "qcom,scm-msm8976", .data = (void *)(SCM_HAS_CORE_CLK | 1507 - SCM_HAS_IFACE_CLK | 1508 - SCM_HAS_BUS_CLK) 1509 - }, 1510 - { .compatible = "qcom,scm-msm8994" }, 1511 - { .compatible = "qcom,scm-msm8996" }, 1512 - { .compatible = "qcom,scm-sm6375", .data = (void *)SCM_HAS_CORE_CLK }, 1513 1515 { .compatible = "qcom,scm" }, 1516 + 1517 + /* Legacy entries kept for backwards compatibility */ 1518 + { .compatible = "qcom,scm-apq8064" }, 1519 + { .compatible = "qcom,scm-apq8084" }, 1520 + { .compatible = "qcom,scm-ipq4019" }, 1521 + { .compatible = "qcom,scm-msm8953" }, 1522 + { .compatible = "qcom,scm-msm8974" }, 1523 + { .compatible = "qcom,scm-msm8996" }, 1514 1524 {} 1515 1525 }; 1516 1526 MODULE_DEVICE_TABLE(of, qcom_scm_dt_match);
+1
drivers/genpd/Makefile
··· 3 3 obj-y += amlogic/ 4 4 obj-y += apple/ 5 5 obj-y += bcm/ 6 + obj-y += imx/ 6 7 obj-y += mediatek/ 7 8 obj-y += qcom/ 8 9 obj-y += renesas/
-1
drivers/genpd/qcom/cpr.c
··· 15 15 #include <linux/bitops.h> 16 16 #include <linux/slab.h> 17 17 #include <linux/of.h> 18 - #include <linux/of_device.h> 19 18 #include <linux/platform_device.h> 20 19 #include <linux/pm_domain.h> 21 20 #include <linux/pm_opp.h>
+67 -51
drivers/genpd/qcom/rpmhpd.c
··· 9 9 #include <linux/pm_domain.h> 10 10 #include <linux/slab.h> 11 11 #include <linux/of.h> 12 - #include <linux/of_device.h> 13 12 #include <linux/platform_device.h> 14 13 #include <linux/pm_opp.h> 15 14 #include <soc/qcom/cmd-db.h> 16 15 #include <soc/qcom/rpmh.h> 17 16 #include <dt-bindings/power/qcom-rpmpd.h> 17 + #include <dt-bindings/power/qcom,rpmhpd.h> 18 18 19 19 #define domain_to_rpmhpd(domain) container_of(domain, struct rpmhpd, pd) 20 20 ··· 307 307 .num_pds = ARRAY_SIZE(sdx65_rpmhpds), 308 308 }; 309 309 310 + /* SDX75 RPMH powerdomains */ 311 + static struct rpmhpd *sdx75_rpmhpds[] = { 312 + [RPMHPD_CX] = &cx, 313 + [RPMHPD_CX_AO] = &cx_ao, 314 + [RPMHPD_MSS] = &mss, 315 + [RPMHPD_MX] = &mx, 316 + [RPMHPD_MX_AO] = &mx_ao, 317 + [RPMHPD_MXC] = &mxc, 318 + }; 319 + 320 + static const struct rpmhpd_desc sdx75_desc = { 321 + .rpmhpds = sdx75_rpmhpds, 322 + .num_pds = ARRAY_SIZE(sdx75_rpmhpds), 323 + }; 324 + 310 325 /* SM6350 RPMH powerdomains */ 311 326 static struct rpmhpd *sm6350_rpmhpds[] = { 312 327 [SM6350_CX] = &cx_w_mx_parent, ··· 374 359 375 360 /* SM8250 RPMH powerdomains */ 376 361 static struct rpmhpd *sm8250_rpmhpds[] = { 377 - [SM8250_CX] = &cx_w_mx_parent, 378 - [SM8250_CX_AO] = &cx_ao_w_mx_parent, 379 - [SM8250_EBI] = &ebi, 380 - [SM8250_GFX] = &gfx, 381 - [SM8250_LCX] = &lcx, 382 - [SM8250_LMX] = &lmx, 383 - [SM8250_MMCX] = &mmcx, 384 - [SM8250_MMCX_AO] = &mmcx_ao, 385 - [SM8250_MX] = &mx, 386 - [SM8250_MX_AO] = &mx_ao, 362 + [RPMHPD_CX] = &cx_w_mx_parent, 363 + [RPMHPD_CX_AO] = &cx_ao_w_mx_parent, 364 + [RPMHPD_EBI] = &ebi, 365 + [RPMHPD_GFX] = &gfx, 366 + [RPMHPD_LCX] = &lcx, 367 + [RPMHPD_LMX] = &lmx, 368 + [RPMHPD_MMCX] = &mmcx, 369 + [RPMHPD_MMCX_AO] = &mmcx_ao, 370 + [RPMHPD_MX] = &mx, 371 + [RPMHPD_MX_AO] = &mx_ao, 387 372 }; 388 373 389 374 static const struct rpmhpd_desc sm8250_desc = { ··· 393 378 394 379 /* SM8350 Power domains */ 395 380 static struct rpmhpd *sm8350_rpmhpds[] = { 396 - [SM8350_CX] = &cx_w_mx_parent, 397 - [SM8350_CX_AO] = &cx_ao_w_mx_parent, 398 - [SM8350_EBI] = &ebi, 399 - [SM8350_GFX] = &gfx, 400 - [SM8350_LCX] = &lcx, 401 - [SM8350_LMX] = &lmx, 402 - [SM8350_MMCX] = &mmcx, 403 - [SM8350_MMCX_AO] = &mmcx_ao, 404 - [SM8350_MSS] = &mss, 405 - [SM8350_MX] = &mx, 406 - [SM8350_MX_AO] = &mx_ao, 407 - [SM8350_MXC] = &mxc, 408 - [SM8350_MXC_AO] = &mxc_ao, 381 + [RPMHPD_CX] = &cx_w_mx_parent, 382 + [RPMHPD_CX_AO] = &cx_ao_w_mx_parent, 383 + [RPMHPD_EBI] = &ebi, 384 + [RPMHPD_GFX] = &gfx, 385 + [RPMHPD_LCX] = &lcx, 386 + [RPMHPD_LMX] = &lmx, 387 + [RPMHPD_MMCX] = &mmcx, 388 + [RPMHPD_MMCX_AO] = &mmcx_ao, 389 + [RPMHPD_MSS] = &mss, 390 + [RPMHPD_MX] = &mx, 391 + [RPMHPD_MX_AO] = &mx_ao, 392 + [RPMHPD_MXC] = &mxc, 393 + [RPMHPD_MXC_AO] = &mxc_ao, 409 394 }; 410 395 411 396 static const struct rpmhpd_desc sm8350_desc = { ··· 415 400 416 401 /* SM8450 RPMH powerdomains */ 417 402 static struct rpmhpd *sm8450_rpmhpds[] = { 418 - [SM8450_CX] = &cx, 419 - [SM8450_CX_AO] = &cx_ao, 420 - [SM8450_EBI] = &ebi, 421 - [SM8450_GFX] = &gfx, 422 - [SM8450_LCX] = &lcx, 423 - [SM8450_LMX] = &lmx, 424 - [SM8450_MMCX] = &mmcx_w_cx_parent, 425 - [SM8450_MMCX_AO] = &mmcx_ao_w_cx_parent, 426 - [SM8450_MSS] = &mss, 427 - [SM8450_MX] = &mx, 428 - [SM8450_MX_AO] = &mx_ao, 429 - [SM8450_MXC] = &mxc, 430 - [SM8450_MXC_AO] = &mxc_ao, 403 + [RPMHPD_CX] = &cx, 404 + [RPMHPD_CX_AO] = &cx_ao, 405 + [RPMHPD_EBI] = &ebi, 406 + [RPMHPD_GFX] = &gfx, 407 + [RPMHPD_LCX] = &lcx, 408 + [RPMHPD_LMX] = &lmx, 409 + [RPMHPD_MMCX] = &mmcx_w_cx_parent, 410 + [RPMHPD_MMCX_AO] = &mmcx_ao_w_cx_parent, 411 + [RPMHPD_MSS] = &mss, 412 + [RPMHPD_MX] = &mx, 413 + [RPMHPD_MX_AO] = &mx_ao, 414 + [RPMHPD_MXC] = &mxc, 415 + [RPMHPD_MXC_AO] = &mxc_ao, 431 416 }; 432 417 433 418 static const struct rpmhpd_desc sm8450_desc = { ··· 437 422 438 423 /* SM8550 RPMH powerdomains */ 439 424 static struct rpmhpd *sm8550_rpmhpds[] = { 440 - [SM8550_CX] = &cx, 441 - [SM8550_CX_AO] = &cx_ao, 442 - [SM8550_EBI] = &ebi, 443 - [SM8550_GFX] = &gfx, 444 - [SM8550_LCX] = &lcx, 445 - [SM8550_LMX] = &lmx, 446 - [SM8550_MMCX] = &mmcx_w_cx_parent, 447 - [SM8550_MMCX_AO] = &mmcx_ao_w_cx_parent, 448 - [SM8550_MSS] = &mss, 449 - [SM8550_MX] = &mx, 450 - [SM8550_MX_AO] = &mx_ao, 451 - [SM8550_MXC] = &mxc, 452 - [SM8550_MXC_AO] = &mxc_ao, 453 - [SM8550_NSP] = &nsp, 425 + [RPMHPD_CX] = &cx, 426 + [RPMHPD_CX_AO] = &cx_ao, 427 + [RPMHPD_EBI] = &ebi, 428 + [RPMHPD_GFX] = &gfx, 429 + [RPMHPD_LCX] = &lcx, 430 + [RPMHPD_LMX] = &lmx, 431 + [RPMHPD_MMCX] = &mmcx_w_cx_parent, 432 + [RPMHPD_MMCX_AO] = &mmcx_ao_w_cx_parent, 433 + [RPMHPD_MSS] = &mss, 434 + [RPMHPD_MX] = &mx, 435 + [RPMHPD_MX_AO] = &mx_ao, 436 + [RPMHPD_MXC] = &mxc, 437 + [RPMHPD_MXC_AO] = &mxc_ao, 438 + [RPMHPD_NSP] = &nsp, 454 439 }; 455 440 456 441 static const struct rpmhpd_desc sm8550_desc = { ··· 560 545 { .compatible = "qcom,sdm845-rpmhpd", .data = &sdm845_desc }, 561 546 { .compatible = "qcom,sdx55-rpmhpd", .data = &sdx55_desc}, 562 547 { .compatible = "qcom,sdx65-rpmhpd", .data = &sdx65_desc}, 548 + { .compatible = "qcom,sdx75-rpmhpd", .data = &sdx75_desc}, 563 549 { .compatible = "qcom,sm6350-rpmhpd", .data = &sm6350_desc }, 564 550 { .compatible = "qcom,sm8150-rpmhpd", .data = &sm8150_desc }, 565 551 { .compatible = "qcom,sm8250-rpmhpd", .data = &sm8250_desc },
+33 -2
drivers/genpd/qcom/rpmpd.c
··· 8 8 #include <linux/mutex.h> 9 9 #include <linux/pm_domain.h> 10 10 #include <linux/of.h> 11 - #include <linux/of_device.h> 12 11 #include <linux/platform_device.h> 13 12 #include <linux/pm_opp.h> 14 13 #include <linux/soc/qcom/smd-rpm.h> ··· 57 58 struct qcom_smd_rpm *rpm; 58 59 unsigned int max_state; 59 60 __le32 key; 61 + bool state_synced; 60 62 }; 61 63 62 64 struct rpmpd_desc { ··· 823 823 unsigned int this_active_corner = 0, this_sleep_corner = 0; 824 824 unsigned int peer_active_corner = 0, peer_sleep_corner = 0; 825 825 826 - to_active_sleep(pd, pd->corner, &this_active_corner, &this_sleep_corner); 826 + /* Clamp to the highest corner/level if sync_state isn't done yet */ 827 + if (!pd->state_synced) 828 + this_active_corner = this_sleep_corner = pd->max_state - 1; 829 + else 830 + to_active_sleep(pd, pd->corner, &this_active_corner, &this_sleep_corner); 827 831 828 832 if (peer && peer->enabled) 829 833 to_active_sleep(peer, peer->corner, &peer_active_corner, ··· 977 973 return of_genpd_add_provider_onecell(pdev->dev.of_node, data); 978 974 } 979 975 976 + static void rpmpd_sync_state(struct device *dev) 977 + { 978 + const struct rpmpd_desc *desc = of_device_get_match_data(dev); 979 + struct rpmpd **rpmpds = desc->rpmpds; 980 + struct rpmpd *pd; 981 + unsigned int i; 982 + int ret; 983 + 984 + mutex_lock(&rpmpd_lock); 985 + for (i = 0; i < desc->num_pds; i++) { 986 + pd = rpmpds[i]; 987 + if (!pd) 988 + continue; 989 + 990 + pd->state_synced = true; 991 + 992 + if (!pd->enabled) 993 + pd->corner = 0; 994 + 995 + ret = rpmpd_aggregate_corner(pd); 996 + if (ret) 997 + dev_err(dev, "failed to sync %s: %d\n", pd->pd.name, ret); 998 + } 999 + mutex_unlock(&rpmpd_lock); 1000 + } 1001 + 980 1002 static struct platform_driver rpmpd_driver = { 981 1003 .driver = { 982 1004 .name = "qcom-rpmpd", 983 1005 .of_match_table = rpmpd_match_table, 984 1006 .suppress_bind_attrs = true, 1007 + .sync_state = rpmpd_sync_state, 985 1008 }, 986 1009 .probe = rpmpd_probe, 987 1010 };
+1 -4
drivers/net/ipa/ipa_power.c
··· 324 324 { 325 325 static const char fmt[] = "{ class: bcm, res: ipa_pc, val: %c }"; 326 326 struct ipa_power *power = ipa->power; 327 - char buf[36]; /* Exactly enough for fmt[]; size a multiple of 4 */ 328 327 int ret; 329 328 330 329 if (!power->qmp) 331 330 return; /* Not needed on this platform */ 332 331 333 - (void)snprintf(buf, sizeof(buf), fmt, enable ? '1' : '0'); 334 - 335 - ret = qmp_send(power->qmp, buf, sizeof(buf)); 332 + ret = qmp_send(power->qmp, fmt, enable ? '1' : '0'); 336 333 if (ret) 337 334 dev_err(power->dev, "error %d sending QMP %sable request\n", 338 335 ret, enable ? "en" : "dis");
+1 -7
drivers/remoteproc/qcom_q6v5.c
··· 23 23 24 24 static int q6v5_load_state_toggle(struct qcom_q6v5 *q6v5, bool enable) 25 25 { 26 - char buf[Q6V5_LOAD_STATE_MSG_LEN]; 27 26 int ret; 28 27 29 28 if (!q6v5->qmp) 30 29 return 0; 31 30 32 - ret = snprintf(buf, sizeof(buf), 33 - "{class: image, res: load_state, name: %s, val: %s}", 31 + ret = qmp_send(q6v5->qmp, "{class: image, res: load_state, name: %s, val: %s}", 34 32 q6v5->load_state, enable ? "on" : "off"); 35 - 36 - WARN_ON(ret >= Q6V5_LOAD_STATE_MSG_LEN); 37 - 38 - ret = qmp_send(q6v5->qmp, buf, sizeof(buf)); 39 33 if (ret) 40 34 dev_err(q6v5->dev, "failed to toggle load state\n"); 41 35
+5 -5
drivers/rpmsg/qcom_smd.c
··· 1479 1479 struct qcom_smd_edge *edge; 1480 1480 int ret; 1481 1481 1482 + if (!qcom_smem_is_available()) 1483 + return ERR_PTR(-EPROBE_DEFER); 1484 + 1482 1485 edge = kzalloc(sizeof(*edge), GFP_KERNEL); 1483 1486 if (!edge) 1484 1487 return ERR_PTR(-ENOMEM); ··· 1556 1553 static int qcom_smd_probe(struct platform_device *pdev) 1557 1554 { 1558 1555 struct device_node *node; 1559 - void *p; 1560 1556 1561 - /* Wait for smem */ 1562 - p = qcom_smem_get(QCOM_SMEM_HOST_ANY, smem_items[0].alloc_tbl_id, NULL); 1563 - if (PTR_ERR(p) == -EPROBE_DEFER) 1564 - return PTR_ERR(p); 1557 + if (!qcom_smem_is_available()) 1558 + return -EPROBE_DEFER; 1565 1559 1566 1560 for_each_available_child_of_node(pdev->dev.of_node, node) 1567 1561 qcom_smd_register_edge(&pdev->dev, node);
+1
drivers/soc/qcom/Kconfig
··· 191 191 tristate "Qualcomm Resource Power Manager (RPM) over SMD" 192 192 depends on ARCH_QCOM || COMPILE_TEST 193 193 depends on RPMSG 194 + depends on RPMSG_QCOM_SMD || RPMSG_QCOM_SMD=n 194 195 help 195 196 If you say yes to this option, support will be included for the 196 197 Resource Power Manager system found in the Qualcomm 8974 based
+1 -1
drivers/soc/qcom/Makefile
··· 17 17 obj-$(CONFIG_QCOM_RPMH) += qcom_rpmh.o 18 18 qcom_rpmh-y += rpmh-rsc.o 19 19 qcom_rpmh-y += rpmh.o 20 - obj-$(CONFIG_QCOM_SMD_RPM) += smd-rpm.o 20 + obj-$(CONFIG_QCOM_SMD_RPM) += rpm-proc.o smd-rpm.o 21 21 obj-$(CONFIG_QCOM_SMEM) += smem.o 22 22 obj-$(CONFIG_QCOM_SMEM_STATE) += smem_state.o 23 23 obj-$(CONFIG_QCOM_SMP2P) += smp2p.o
+1 -1
drivers/soc/qcom/cmd-db.c
··· 284 284 ent = rsc_to_entry_header(rsc); 285 285 for (j = 0; j < le16_to_cpu(rsc->cnt); j++, ent++) { 286 286 seq_printf(seq, "0x%05x: %*pEp", le32_to_cpu(ent->addr), 287 - (int)sizeof(ent->id), ent->id); 287 + (int)strnlen(ent->id, sizeof(ent->id)), ent->id); 288 288 289 289 len = le16_to_cpu(ent->len); 290 290 if (len) {
+8 -22
drivers/soc/qcom/icc-bwmon.c
··· 12 12 #include <linux/io.h> 13 13 #include <linux/kernel.h> 14 14 #include <linux/module.h> 15 - #include <linux/of_device.h> 15 + #include <linux/of.h> 16 16 #include <linux/platform_device.h> 17 17 #include <linux/pm_opp.h> 18 18 #include <linux/regmap.h> ··· 165 165 struct icc_bwmon_data { 166 166 unsigned int sample_ms; 167 167 unsigned int count_unit_kb; /* kbytes */ 168 - unsigned int default_highbw_kbps; 169 - unsigned int default_medbw_kbps; 170 - unsigned int default_lowbw_kbps; 171 168 u8 zone1_thres_count; 172 169 u8 zone3_thres_count; 173 170 unsigned int quirks; ··· 561 564 static void bwmon_start(struct icc_bwmon *bwmon) 562 565 { 563 566 const struct icc_bwmon_data *data = bwmon->data; 567 + u32 bw_low = 0; 564 568 int window; 569 + 570 + /* No need to check for errors, as this must have succeeded before. */ 571 + dev_pm_opp_find_bw_ceil(bwmon->dev, &bw_low, 0); 565 572 566 573 bwmon_clear_counters(bwmon, true); 567 574 ··· 573 572 /* Maximum sampling window: 0xffffff for v4 and 0xfffff for v5 */ 574 573 regmap_field_write(bwmon->regs[F_SAMPLE_WINDOW], window); 575 574 576 - bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], 577 - data->default_highbw_kbps); 578 - bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], 579 - data->default_medbw_kbps); 580 - bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_LOW], 581 - data->default_lowbw_kbps); 575 + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_HIGH], bw_low); 576 + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_MED], bw_low); 577 + bwmon_set_threshold(bwmon, bwmon->regs[F_THRESHOLD_LOW], 0); 582 578 583 579 regmap_field_write(bwmon->regs[F_THRESHOLD_COUNT_ZONE0], 584 580 BWMON_THRESHOLD_COUNT_ZONE0_DEFAULT); ··· 805 807 static const struct icc_bwmon_data msm8998_bwmon_data = { 806 808 .sample_ms = 4, 807 809 .count_unit_kb = 1024, 808 - .default_highbw_kbps = 4800 * 1024, /* 4.8 GBps */ 809 - .default_medbw_kbps = 512 * 1024, /* 512 MBps */ 810 - .default_lowbw_kbps = 0, 811 810 .zone1_thres_count = 16, 812 811 .zone3_thres_count = 1, 813 812 .quirks = BWMON_HAS_GLOBAL_IRQ, ··· 817 822 static const struct icc_bwmon_data sdm845_cpu_bwmon_data = { 818 823 .sample_ms = 4, 819 824 .count_unit_kb = 64, 820 - .default_highbw_kbps = 4800 * 1024, /* 4.8 GBps */ 821 - .default_medbw_kbps = 512 * 1024, /* 512 MBps */ 822 - .default_lowbw_kbps = 0, 823 825 .zone1_thres_count = 16, 824 826 .zone3_thres_count = 1, 825 827 .quirks = BWMON_HAS_GLOBAL_IRQ, ··· 827 835 static const struct icc_bwmon_data sdm845_llcc_bwmon_data = { 828 836 .sample_ms = 4, 829 837 .count_unit_kb = 1024, 830 - .default_highbw_kbps = 800 * 1024, /* 800 MBps */ 831 - .default_medbw_kbps = 256 * 1024, /* 256 MBps */ 832 - .default_lowbw_kbps = 0, 833 838 .zone1_thres_count = 16, 834 839 .zone3_thres_count = 1, 835 840 .regmap_fields = sdm845_llcc_bwmon_reg_fields, ··· 836 847 static const struct icc_bwmon_data sc7280_llcc_bwmon_data = { 837 848 .sample_ms = 4, 838 849 .count_unit_kb = 64, 839 - .default_highbw_kbps = 800 * 1024, /* 800 MBps */ 840 - .default_medbw_kbps = 256 * 1024, /* 256 MBps */ 841 - .default_lowbw_kbps = 0, 842 850 .zone1_thres_count = 16, 843 851 .zone3_thres_count = 1, 844 852 .quirks = BWMON_NEEDS_FORCE_CLEAR,
+2
drivers/soc/qcom/ice.c
··· 11 11 #include <linux/clk.h> 12 12 #include <linux/delay.h> 13 13 #include <linux/iopoll.h> 14 + #include <linux/of.h> 14 15 #include <linux/of_platform.h> 16 + #include <linux/platform_device.h> 15 17 16 18 #include <linux/firmware/qcom/qcom_scm.h> 17 19
-1
drivers/soc/qcom/llcc-qcom.c
··· 13 13 #include <linux/module.h> 14 14 #include <linux/mutex.h> 15 15 #include <linux/of.h> 16 - #include <linux/of_device.h> 17 16 #include <linux/regmap.h> 18 17 #include <linux/sizes.h> 19 18 #include <linux/slab.h>
+38 -30
drivers/soc/qcom/ocmem.c
··· 14 14 #include <linux/io.h> 15 15 #include <linux/kernel.h> 16 16 #include <linux/module.h> 17 - #include <linux/of_device.h> 17 + #include <linux/of.h> 18 + #include <linux/of_platform.h> 18 19 #include <linux/platform_device.h> 19 20 #include <linux/firmware/qcom/qcom_scm.h> 20 21 #include <linux/sizes.h> ··· 55 54 const struct ocmem_config *config; 56 55 struct resource *memory; 57 56 void __iomem *mmio; 57 + struct clk *core_clk; 58 + struct clk *iface_clk; 58 59 unsigned int num_ports; 59 60 unsigned int num_macros; 60 61 bool interleaved; ··· 83 80 #define OCMEM_HW_VERSION_MINOR(val) FIELD_GET(GENMASK(27, 16), val) 84 81 #define OCMEM_HW_VERSION_STEP(val) FIELD_GET(GENMASK(15, 0), val) 85 82 86 - #define OCMEM_HW_PROFILE_NUM_PORTS(val) FIELD_PREP(0x0000000f, (val)) 87 - #define OCMEM_HW_PROFILE_NUM_MACROS(val) FIELD_PREP(0x00003f00, (val)) 83 + #define OCMEM_HW_PROFILE_NUM_PORTS(val) FIELD_GET(0x0000000f, (val)) 84 + #define OCMEM_HW_PROFILE_NUM_MACROS(val) FIELD_GET(0x00003f00, (val)) 88 85 89 86 #define OCMEM_HW_PROFILE_LAST_REGN_HALFSIZE 0x00010000 90 87 #define OCMEM_HW_PROFILE_INTERLEAVING 0x00020000 ··· 97 94 #define OCMEM_PSGSC_CTL_MACRO1_MODE(val) FIELD_PREP(0x00000070, (val)) 98 95 #define OCMEM_PSGSC_CTL_MACRO2_MODE(val) FIELD_PREP(0x00000700, (val)) 99 96 #define OCMEM_PSGSC_CTL_MACRO3_MODE(val) FIELD_PREP(0x00007000, (val)) 100 - 101 - #define OCMEM_CLK_CORE_IDX 0 102 - static struct clk_bulk_data ocmem_clks[] = { 103 - { 104 - .id = "core", 105 - }, 106 - { 107 - .id = "iface", 108 - }, 109 - }; 110 97 111 98 static inline void ocmem_write(struct ocmem *ocmem, u32 reg, u32 data) 112 99 { ··· 313 320 ocmem->dev = dev; 314 321 ocmem->config = device_get_match_data(dev); 315 322 316 - ret = devm_clk_bulk_get(dev, ARRAY_SIZE(ocmem_clks), ocmem_clks); 317 - if (ret) { 318 - if (ret != -EPROBE_DEFER) 319 - dev_err(dev, "Unable to get clocks\n"); 323 + ocmem->core_clk = devm_clk_get(dev, "core"); 324 + if (IS_ERR(ocmem->core_clk)) 325 + return dev_err_probe(dev, PTR_ERR(ocmem->core_clk), 326 + "Unable to get core clock\n"); 320 327 321 - return ret; 322 - } 328 + ocmem->iface_clk = devm_clk_get_optional(dev, "iface"); 329 + if (IS_ERR(ocmem->iface_clk)) 330 + return dev_err_probe(dev, PTR_ERR(ocmem->iface_clk), 331 + "Unable to get iface clock\n"); 323 332 324 333 ocmem->mmio = devm_platform_ioremap_resource_byname(pdev, "ctrl"); 325 - if (IS_ERR(ocmem->mmio)) { 326 - dev_err(&pdev->dev, "Failed to ioremap ocmem_ctrl resource\n"); 327 - return PTR_ERR(ocmem->mmio); 328 - } 334 + if (IS_ERR(ocmem->mmio)) 335 + return dev_err_probe(&pdev->dev, PTR_ERR(ocmem->mmio), 336 + "Failed to ioremap ocmem_ctrl resource\n"); 329 337 330 338 ocmem->memory = platform_get_resource_byname(pdev, IORESOURCE_MEM, 331 339 "mem"); ··· 336 342 } 337 343 338 344 /* The core clock is synchronous with graphics */ 339 - WARN_ON(clk_set_rate(ocmem_clks[OCMEM_CLK_CORE_IDX].clk, 1000) < 0); 345 + WARN_ON(clk_set_rate(ocmem->core_clk, 1000) < 0); 340 346 341 - ret = clk_bulk_prepare_enable(ARRAY_SIZE(ocmem_clks), ocmem_clks); 347 + ret = clk_prepare_enable(ocmem->core_clk); 348 + if (ret) 349 + return dev_err_probe(ocmem->dev, ret, "Failed to enable core clock\n"); 350 + 351 + ret = clk_prepare_enable(ocmem->iface_clk); 342 352 if (ret) { 343 - dev_info(ocmem->dev, "Failed to enable clocks\n"); 344 - return ret; 353 + clk_disable_unprepare(ocmem->core_clk); 354 + return dev_err_probe(ocmem->dev, ret, "Failed to enable iface clock\n"); 345 355 } 346 356 347 357 if (qcom_scm_restore_sec_cfg_available()) { 348 358 dev_dbg(dev, "configuring scm\n"); 349 359 ret = qcom_scm_restore_sec_cfg(QCOM_SCM_OCMEM_DEV_ID, 0); 350 360 if (ret) { 351 - dev_err(dev, "Could not enable secure configuration\n"); 361 + dev_err_probe(dev, ret, "Could not enable secure configuration\n"); 352 362 goto err_clk_disable; 353 363 } 354 364 } ··· 411 413 return 0; 412 414 413 415 err_clk_disable: 414 - clk_bulk_disable_unprepare(ARRAY_SIZE(ocmem_clks), ocmem_clks); 416 + clk_disable_unprepare(ocmem->core_clk); 417 + clk_disable_unprepare(ocmem->iface_clk); 415 418 return ret; 416 419 } 417 420 418 421 static int ocmem_dev_remove(struct platform_device *pdev) 419 422 { 420 - clk_bulk_disable_unprepare(ARRAY_SIZE(ocmem_clks), ocmem_clks); 423 + struct ocmem *ocmem = platform_get_drvdata(pdev); 424 + 425 + clk_disable_unprepare(ocmem->core_clk); 426 + clk_disable_unprepare(ocmem->iface_clk); 421 427 422 428 return 0; 423 429 } 430 + 431 + static const struct ocmem_config ocmem_8226_config = { 432 + .num_regions = 1, 433 + .macro_size = SZ_128K, 434 + }; 424 435 425 436 static const struct ocmem_config ocmem_8974_config = { 426 437 .num_regions = 3, ··· 437 430 }; 438 431 439 432 static const struct of_device_id ocmem_of_match[] = { 433 + { .compatible = "qcom,msm8226-ocmem", .data = &ocmem_8226_config }, 440 434 { .compatible = "qcom,msm8974-ocmem", .data = &ocmem_8974_config }, 441 435 { } 442 436 };
+2 -6
drivers/soc/qcom/pmic_glink.c
··· 4 4 * Copyright (c) 2022, Linaro Ltd 5 5 */ 6 6 #include <linux/auxiliary_bus.h> 7 - #include <linux/of_device.h> 8 7 #include <linux/module.h> 8 + #include <linux/of.h> 9 9 #include <linux/platform_device.h> 10 10 #include <linux/rpmsg.h> 11 11 #include <linux/slab.h> ··· 342 342 BIT(PMIC_GLINK_CLIENT_ALTMODE) | 343 343 BIT(PMIC_GLINK_CLIENT_UCSI); 344 344 345 - /* Do not handle altmode for now on those platforms */ 346 - static const unsigned long pmic_glink_sm8550_client_mask = BIT(PMIC_GLINK_CLIENT_BATT) | 347 - BIT(PMIC_GLINK_CLIENT_UCSI); 348 - 349 345 static const struct of_device_id pmic_glink_of_match[] = { 350 346 { .compatible = "qcom,sm8450-pmic-glink", .data = &pmic_glink_sm8450_client_mask }, 351 - { .compatible = "qcom,sm8550-pmic-glink", .data = &pmic_glink_sm8550_client_mask }, 347 + { .compatible = "qcom,sm8550-pmic-glink", .data = &pmic_glink_sm8450_client_mask }, 352 348 { .compatible = "qcom,pmic-glink" }, 353 349 {} 354 350 };
+24 -25
drivers/soc/qcom/qcom_aoss.c
··· 205 205 /** 206 206 * qmp_send() - send a message to the AOSS 207 207 * @qmp: qmp context 208 - * @data: message to be sent 209 - * @len: length of the message 208 + * @fmt: format string for message to be sent 209 + * @...: arguments for the format string 210 210 * 211 - * Transmit @data to AOSS and wait for the AOSS to acknowledge the message. 212 - * @len must be a multiple of 4 and not longer than the mailbox size. Access is 213 - * synchronized by this implementation. 211 + * Transmit message to AOSS and wait for the AOSS to acknowledge the message. 212 + * data must not be longer than the mailbox size. Access is synchronized by 213 + * this implementation. 214 214 * 215 215 * Return: 0 on success, negative errno on failure 216 216 */ 217 - int qmp_send(struct qmp *qmp, const void *data, size_t len) 217 + int qmp_send(struct qmp *qmp, const char *fmt, ...) 218 218 { 219 + char buf[QMP_MSG_LEN]; 219 220 long time_left; 221 + va_list args; 222 + int len; 220 223 int ret; 221 224 222 - if (WARN_ON(IS_ERR_OR_NULL(qmp) || !data)) 225 + if (WARN_ON(IS_ERR_OR_NULL(qmp) || !fmt)) 223 226 return -EINVAL; 224 227 225 - if (WARN_ON(len + sizeof(u32) > qmp->size)) 226 - return -EINVAL; 228 + memset(buf, 0, sizeof(buf)); 229 + va_start(args, fmt); 230 + len = vsnprintf(buf, sizeof(buf), fmt, args); 231 + va_end(args); 227 232 228 - if (WARN_ON(len % sizeof(u32))) 233 + if (WARN_ON(len >= sizeof(buf))) 229 234 return -EINVAL; 230 235 231 236 mutex_lock(&qmp->tx_lock); 232 237 233 238 /* The message RAM only implements 32-bit accesses */ 234 239 __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32), 235 - data, len / sizeof(u32)); 236 - writel(len, qmp->msgram + qmp->offset); 240 + buf, sizeof(buf) / sizeof(u32)); 241 + writel(sizeof(buf), qmp->msgram + qmp->offset); 237 242 238 - /* Read back len to confirm data written in message RAM */ 243 + /* Read back length to confirm data written in message RAM */ 239 244 readl(qmp->msgram + qmp->offset); 240 245 qmp_kick(qmp); 241 246 ··· 264 259 265 260 static int qmp_qdss_clk_prepare(struct clk_hw *hw) 266 261 { 267 - static const char buf[QMP_MSG_LEN] = "{class: clock, res: qdss, val: 1}"; 262 + static const char *buf = "{class: clock, res: qdss, val: 1}"; 268 263 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk); 269 264 270 - return qmp_send(qmp, buf, sizeof(buf)); 265 + return qmp_send(qmp, buf); 271 266 } 272 267 273 268 static void qmp_qdss_clk_unprepare(struct clk_hw *hw) 274 269 { 275 - static const char buf[QMP_MSG_LEN] = "{class: clock, res: qdss, val: 0}"; 270 + static const char *buf = "{class: clock, res: qdss, val: 0}"; 276 271 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk); 277 272 278 - qmp_send(qmp, buf, sizeof(buf)); 273 + qmp_send(qmp, buf); 279 274 } 280 275 281 276 static const struct clk_ops qmp_qdss_clk_ops = { ··· 334 329 unsigned long state) 335 330 { 336 331 struct qmp_cooling_device *qmp_cdev = cdev->devdata; 337 - char buf[QMP_MSG_LEN] = {}; 338 332 bool cdev_state; 339 333 int ret; 340 334 ··· 343 339 if (qmp_cdev->state == state) 344 340 return 0; 345 341 346 - snprintf(buf, sizeof(buf), 347 - "{class: volt_flr, event:zero_temp, res:%s, value:%s}", 348 - qmp_cdev->name, 349 - cdev_state ? "on" : "off"); 350 - 351 - ret = qmp_send(qmp_cdev->qmp, buf, sizeof(buf)); 352 - 342 + ret = qmp_send(qmp_cdev->qmp, "{class: volt_flr, event:zero_temp, res:%s, value:%s}", 343 + qmp_cdev->name, cdev_state ? "on" : "off"); 353 344 if (!ret) 354 345 qmp_cdev->state = cdev_state; 355 346
+3 -8
drivers/soc/qcom/qcom_gsbi.c
··· 129 129 const struct of_device_id *match; 130 130 void __iomem *base; 131 131 struct gsbi_info *gsbi; 132 - int i, ret; 132 + int i; 133 133 u32 mask, gsbi_num; 134 134 const struct crci_config *config = NULL; 135 135 ··· 178 178 179 179 dev_info(&pdev->dev, "GSBI port protocol: %d crci: %d\n", 180 180 gsbi->mode, gsbi->crci); 181 - gsbi->hclk = devm_clk_get(&pdev->dev, "iface"); 181 + gsbi->hclk = devm_clk_get_enabled(&pdev->dev, "iface"); 182 182 if (IS_ERR(gsbi->hclk)) 183 183 return PTR_ERR(gsbi->hclk); 184 - 185 - clk_prepare_enable(gsbi->hclk); 186 184 187 185 writel_relaxed((gsbi->mode << GSBI_PROTOCOL_SHIFT) | gsbi->crci, 188 186 base + GSBI_CTRL_REG); ··· 209 211 210 212 platform_set_drvdata(pdev, gsbi); 211 213 212 - ret = of_platform_populate(node, NULL, NULL, &pdev->dev); 213 - if (ret) 214 - clk_disable_unprepare(gsbi->hclk); 215 - return ret; 214 + return of_platform_populate(node, NULL, NULL, &pdev->dev); 216 215 } 217 216 218 217 static int gsbi_remove(struct platform_device *pdev)
+2 -2
drivers/soc/qcom/qmi_encdec.c
··· 534 534 decoded_bytes += rc; 535 535 } 536 536 537 - if (string_len > temp_ei->elem_len) { 538 - pr_err("%s: String len %d > Max Len %d\n", 537 + if (string_len >= temp_ei->elem_len) { 538 + pr_err("%s: String len %d >= Max Len %d\n", 539 539 __func__, string_len, temp_ei->elem_len); 540 540 return -ETOOSMALL; 541 541 } else if (string_len > tlv_len) {
+77
drivers/soc/qcom/rpm-proc.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* Copyright (c) 2021-2023, Stephan Gerhold <stephan@gerhold.net> */ 3 + 4 + #include <linux/module.h> 5 + #include <linux/of.h> 6 + #include <linux/of_platform.h> 7 + #include <linux/platform_device.h> 8 + #include <linux/rpmsg/qcom_smd.h> 9 + 10 + static int rpm_proc_probe(struct platform_device *pdev) 11 + { 12 + struct qcom_smd_edge *edge = NULL; 13 + struct device *dev = &pdev->dev; 14 + struct device_node *edge_node; 15 + int ret; 16 + 17 + edge_node = of_get_child_by_name(dev->of_node, "smd-edge"); 18 + if (edge_node) { 19 + edge = qcom_smd_register_edge(dev, edge_node); 20 + of_node_put(edge_node); 21 + if (IS_ERR(edge)) 22 + return dev_err_probe(dev, PTR_ERR(edge), 23 + "Failed to register smd-edge\n"); 24 + } 25 + 26 + ret = devm_of_platform_populate(dev); 27 + if (ret) { 28 + dev_err(dev, "Failed to populate child devices: %d\n", ret); 29 + goto err; 30 + } 31 + 32 + platform_set_drvdata(pdev, edge); 33 + return 0; 34 + err: 35 + if (edge) 36 + qcom_smd_unregister_edge(edge); 37 + return ret; 38 + } 39 + 40 + static void rpm_proc_remove(struct platform_device *pdev) 41 + { 42 + struct qcom_smd_edge *edge = platform_get_drvdata(pdev); 43 + 44 + if (edge) 45 + qcom_smd_unregister_edge(edge); 46 + } 47 + 48 + static const struct of_device_id rpm_proc_of_match[] = { 49 + { .compatible = "qcom,rpm-proc", }, 50 + { /* sentinel */ } 51 + }; 52 + MODULE_DEVICE_TABLE(of, rpm_proc_of_match); 53 + 54 + static struct platform_driver rpm_proc_driver = { 55 + .probe = rpm_proc_probe, 56 + .remove_new = rpm_proc_remove, 57 + .driver = { 58 + .name = "qcom-rpm-proc", 59 + .of_match_table = rpm_proc_of_match, 60 + }, 61 + }; 62 + 63 + static int __init rpm_proc_init(void) 64 + { 65 + return platform_driver_register(&rpm_proc_driver); 66 + } 67 + arch_initcall(rpm_proc_init); 68 + 69 + static void __exit rpm_proc_exit(void) 70 + { 71 + platform_driver_unregister(&rpm_proc_driver); 72 + } 73 + module_exit(rpm_proc_exit); 74 + 75 + MODULE_DESCRIPTION("Qualcomm RPM processor/subsystem driver"); 76 + MODULE_AUTHOR("Stephan Gerhold <stephan@gerhold.net>"); 77 + MODULE_LICENSE("GPL");
+1 -1
drivers/soc/qcom/rpmh-rsc.c
··· 516 516 write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_MSGID], tcs_id, j, msgid); 517 517 write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_ADDR], tcs_id, j, cmd->addr); 518 518 write_tcs_cmd(drv, drv->regs[RSC_DRV_CMD_DATA], tcs_id, j, cmd->data); 519 - trace_rpmh_send_msg(drv, tcs_id, j, msgid, cmd); 519 + trace_rpmh_send_msg(drv, tcs_id, msg->state, j, msgid, cmd); 520 520 } 521 521 522 522 cmd_enable |= read_tcs_reg(drv, drv->regs[RSC_DRV_CMD_ENABLE], tcs_id);
+9 -26
drivers/soc/qcom/smd-rpm.c
··· 199 199 struct qcom_smd_rpm *rpm; 200 200 int ret; 201 201 202 + if (!rpdev->dev.of_node) 203 + return -EINVAL; 204 + 202 205 rpm = devm_kzalloc(&rpdev->dev, sizeof(*rpm), GFP_KERNEL); 203 206 if (!rpm) 204 207 return -ENOMEM; ··· 233 230 of_platform_depopulate(&rpdev->dev); 234 231 } 235 232 236 - static const struct of_device_id qcom_smd_rpm_of_match[] = { 237 - { .compatible = "qcom,rpm-apq8084" }, 238 - { .compatible = "qcom,rpm-ipq6018" }, 239 - { .compatible = "qcom,rpm-ipq9574" }, 240 - { .compatible = "qcom,rpm-msm8226" }, 241 - { .compatible = "qcom,rpm-msm8909" }, 242 - { .compatible = "qcom,rpm-msm8916" }, 243 - { .compatible = "qcom,rpm-msm8936" }, 244 - { .compatible = "qcom,rpm-msm8953" }, 245 - { .compatible = "qcom,rpm-msm8974" }, 246 - { .compatible = "qcom,rpm-msm8976" }, 247 - { .compatible = "qcom,rpm-msm8994" }, 248 - { .compatible = "qcom,rpm-msm8996" }, 249 - { .compatible = "qcom,rpm-msm8998" }, 250 - { .compatible = "qcom,rpm-sdm660" }, 251 - { .compatible = "qcom,rpm-sm6115" }, 252 - { .compatible = "qcom,rpm-sm6125" }, 253 - { .compatible = "qcom,rpm-sm6375" }, 254 - { .compatible = "qcom,rpm-qcm2290" }, 255 - { .compatible = "qcom,rpm-qcs404" }, 256 - {} 233 + static const struct rpmsg_device_id qcom_smd_rpm_id_table[] = { 234 + { .name = "rpm_requests", }, 235 + { /* sentinel */ } 257 236 }; 258 - MODULE_DEVICE_TABLE(of, qcom_smd_rpm_of_match); 237 + MODULE_DEVICE_TABLE(rpmsg, qcom_smd_rpm_id_table); 259 238 260 239 static struct rpmsg_driver qcom_smd_rpm_driver = { 261 240 .probe = qcom_smd_rpm_probe, 262 241 .remove = qcom_smd_rpm_remove, 263 242 .callback = qcom_smd_rpm_callback, 264 - .drv = { 265 - .name = "qcom_smd_rpm", 266 - .of_match_table = qcom_smd_rpm_of_match, 267 - }, 243 + .id_table = qcom_smd_rpm_id_table, 244 + .drv.name = "qcom_smd_rpm", 268 245 }; 269 246 270 247 static int __init qcom_smd_rpm_init(void)
+14 -4
drivers/soc/qcom/smem.c
··· 359 359 /* Timeout (ms) for the trylock of remote spinlocks */ 360 360 #define HWSPINLOCK_TIMEOUT 1000 361 361 362 + /** 363 + * qcom_smem_is_available() - Check if SMEM is available 364 + * 365 + * Return: true if SMEM is available, false otherwise. 366 + */ 367 + bool qcom_smem_is_available(void) 368 + { 369 + return !!__smem; 370 + } 371 + EXPORT_SYMBOL(qcom_smem_is_available); 372 + 362 373 static int qcom_smem_alloc_private(struct qcom_smem *smem, 363 374 struct smem_partition *part, 364 375 unsigned item, ··· 735 724 736 725 static bool addr_in_range(void __iomem *base, size_t size, void *addr) 737 726 { 738 - return base && (addr >= base && addr < base + size); 727 + return base && ((void __iomem *)addr >= base && (void __iomem *)addr < base + size); 739 728 } 740 729 741 730 /** ··· 1070 1059 struct reserved_mem *rmem; 1071 1060 struct qcom_smem *smem; 1072 1061 unsigned long flags; 1073 - size_t array_size; 1074 1062 int num_regions; 1075 1063 int hwlock_id; 1076 1064 u32 version; ··· 1081 1071 if (of_property_present(pdev->dev.of_node, "qcom,rpm-msg-ram")) 1082 1072 num_regions++; 1083 1073 1084 - array_size = num_regions * sizeof(struct smem_region); 1085 - smem = devm_kzalloc(&pdev->dev, sizeof(*smem) + array_size, GFP_KERNEL); 1074 + smem = devm_kzalloc(&pdev->dev, struct_size(smem, regions, num_regions), 1075 + GFP_KERNEL); 1086 1076 if (!smem) 1087 1077 return -ENOMEM; 1088 1078
+2 -1
drivers/soc/qcom/socinfo.c
··· 371 371 { qcom_board_id(SDA429W) }, 372 372 { qcom_board_id(SM8350) }, 373 373 { qcom_board_id(QCM2290) }, 374 + { qcom_board_id(SM7125) }, 374 375 { qcom_board_id(SM6115) }, 375 376 { qcom_board_id(IPQ5010) }, 376 377 { qcom_board_id(IPQ5018) }, ··· 406 405 { qcom_board_id(SA8775P) }, 407 406 { qcom_board_id(QRU1000) }, 408 407 { qcom_board_id(QDU1000) }, 408 + { qcom_board_id(SM4450) }, 409 409 { qcom_board_id(QDU1010) }, 410 - { qcom_board_id(IPQ5019) }, 411 410 { qcom_board_id(QRU1032) }, 412 411 { qcom_board_id(QRU1052) }, 413 412 { qcom_board_id(QRU1062) },
+1 -5
drivers/soc/qcom/spm.c
··· 12 12 #include <linux/module.h> 13 13 #include <linux/slab.h> 14 14 #include <linux/of.h> 15 - #include <linux/of_address.h> 16 - #include <linux/of_device.h> 17 15 #include <linux/err.h> 18 16 #include <linux/platform_device.h> 19 17 #include <soc/qcom/spm.h> ··· 273 275 { 274 276 const struct of_device_id *match_id; 275 277 struct spm_driver_data *drv; 276 - struct resource *res; 277 278 void __iomem *addr; 278 279 279 280 drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL); 280 281 if (!drv) 281 282 return -ENOMEM; 282 283 283 - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 284 - drv->reg_base = devm_ioremap_resource(&pdev->dev, res); 284 + drv->reg_base = devm_platform_ioremap_resource(pdev, 0); 285 285 if (IS_ERR(drv->reg_base)) 286 286 return PTR_ERR(drv->reg_base); 287 287
+12 -4
drivers/soc/qcom/trace-rpmh.h
··· 38 38 39 39 TRACE_EVENT(rpmh_send_msg, 40 40 41 - TP_PROTO(struct rsc_drv *d, int m, int n, u32 h, 41 + TP_PROTO(struct rsc_drv *d, int m, enum rpmh_state state, int n, u32 h, 42 42 const struct tcs_cmd *c), 43 43 44 - TP_ARGS(d, m, n, h, c), 44 + TP_ARGS(d, m, state, n, h, c), 45 45 46 46 TP_STRUCT__entry( 47 47 __string(name, d->name) 48 48 __field(int, m) 49 + __field(u32, state) 49 50 __field(int, n) 50 51 __field(u32, hdr) 51 52 __field(u32, addr) ··· 57 56 TP_fast_assign( 58 57 __assign_str(name, d->name); 59 58 __entry->m = m; 59 + __entry->state = state; 60 60 __entry->n = n; 61 61 __entry->hdr = h; 62 62 __entry->addr = c->addr; ··· 65 63 __entry->wait = c->wait; 66 64 ), 67 65 68 - TP_printk("%s: send-msg: tcs(m): %d cmd(n): %d msgid: %#x addr: %#x data: %#x complete: %d", 69 - __get_str(name), __entry->m, __entry->n, __entry->hdr, 66 + TP_printk("%s: tcs(m): %d [%s] cmd(n): %d msgid: %#x addr: %#x data: %#x complete: %d", 67 + __get_str(name), __entry->m, 68 + __print_symbolic(__entry->state, 69 + { RPMH_SLEEP_STATE, "sleep" }, 70 + { RPMH_WAKE_ONLY_STATE, "wake" }, 71 + { RPMH_ACTIVE_ONLY_STATE, "active" }), 72 + __entry->n, 73 + __entry->hdr, 70 74 __entry->addr, __entry->data, __entry->wait) 71 75 ); 72 76
+1
drivers/soc/qcom/wcnss_ctrl.c
··· 7 7 #include <linux/module.h> 8 8 #include <linux/slab.h> 9 9 #include <linux/io.h> 10 + #include <linux/of.h> 10 11 #include <linux/of_platform.h> 11 12 #include <linux/platform_device.h> 12 13 #include <linux/rpmsg.h>
+2 -1
include/dt-bindings/arm/qcom,ids.h
··· 215 215 #define QCOM_ID_SDA429W 437 216 216 #define QCOM_ID_SM8350 439 217 217 #define QCOM_ID_QCM2290 441 218 + #define QCOM_ID_SM7125 443 218 219 #define QCOM_ID_SM6115 444 219 220 #define QCOM_ID_IPQ5010 446 220 221 #define QCOM_ID_IPQ5018 447 ··· 250 249 #define QCOM_ID_SA8775P 534 251 250 #define QCOM_ID_QRU1000 539 252 251 #define QCOM_ID_QDU1000 545 252 + #define QCOM_ID_SM4450 568 253 253 #define QCOM_ID_QDU1010 587 254 - #define QCOM_ID_IPQ5019 569 255 254 #define QCOM_ID_QRU1032 588 256 255 #define QCOM_ID_QRU1052 589 257 256 #define QCOM_ID_QRU1062 590
+21
include/dt-bindings/firmware/qcom,scm.h
··· 2 2 /* 3 3 * Copyright (c) 2010-2015, 2018-2019 The Linux Foundation. All rights reserved. 4 4 * Copyright (C) 2015 Linaro Ltd. 5 + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. 5 6 */ 6 7 7 8 #ifndef _DT_BINDINGS_FIRMWARE_QCOM_SCM_H 8 9 #define _DT_BINDINGS_FIRMWARE_QCOM_SCM_H 9 10 11 + #define QCOM_SCM_VMID_TZ 0x1 10 12 #define QCOM_SCM_VMID_HLOS 0x3 11 13 #define QCOM_SCM_VMID_SSC_Q6 0x5 12 14 #define QCOM_SCM_VMID_ADSP_Q6 0x6 15 + #define QCOM_SCM_VMID_CP_TOUCH 0x8 16 + #define QCOM_SCM_VMID_CP_BITSTREAM 0x9 17 + #define QCOM_SCM_VMID_CP_PIXEL 0xA 18 + #define QCOM_SCM_VMID_CP_NON_PIXEL 0xB 19 + #define QCOM_SCM_VMID_CP_CAMERA 0xD 20 + #define QCOM_SCM_VMID_HLOS_FREE 0xE 13 21 #define QCOM_SCM_VMID_MSS_MSA 0xF 22 + #define QCOM_SCM_VMID_MSS_NONMSA 0x10 23 + #define QCOM_SCM_VMID_CP_SEC_DISPLAY 0x11 24 + #define QCOM_SCM_VMID_CP_APP 0x12 25 + #define QCOM_SCM_VMID_LPASS 0x16 14 26 #define QCOM_SCM_VMID_WLAN 0x18 15 27 #define QCOM_SCM_VMID_WLAN_CE 0x19 28 + #define QCOM_SCM_VMID_CP_SPSS_SP 0x1A 29 + #define QCOM_SCM_VMID_CP_CAMERA_PREVIEW 0x1D 30 + #define QCOM_SCM_VMID_CDSP 0x1E 31 + #define QCOM_SCM_VMID_CP_SPSS_SP_SHARED 0x22 32 + #define QCOM_SCM_VMID_CP_SPSS_HLOS_SHARED 0x24 33 + #define QCOM_SCM_VMID_ADSP_HEAP 0x25 34 + #define QCOM_SCM_VMID_CP_CDSP 0x2A 16 35 #define QCOM_SCM_VMID_NAV 0x2B 36 + #define QCOM_SCM_VMID_TVM 0x2D 37 + #define QCOM_SCM_VMID_OEMVM 0x31 17 38 18 39 #endif
+30
include/dt-bindings/power/qcom,rpmhpd.h
··· 1 + /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 + /* 3 + * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. 4 + */ 5 + 6 + #ifndef _DT_BINDINGS_POWER_QCOM_RPMHPD_H 7 + #define _DT_BINDINGS_POWER_QCOM_RPMHPD_H 8 + 9 + /* Generic RPMH Power Domain Indexes */ 10 + #define RPMHPD_CX 0 11 + #define RPMHPD_CX_AO 1 12 + #define RPMHPD_EBI 2 13 + #define RPMHPD_GFX 3 14 + #define RPMHPD_LCX 4 15 + #define RPMHPD_LMX 5 16 + #define RPMHPD_MMCX 6 17 + #define RPMHPD_MMCX_AO 7 18 + #define RPMHPD_MX 8 19 + #define RPMHPD_MX_AO 9 20 + #define RPMHPD_MXC 10 21 + #define RPMHPD_MXC_AO 11 22 + #define RPMHPD_MSS 12 23 + #define RPMHPD_NSP 13 24 + #define RPMHPD_NSP0 14 25 + #define RPMHPD_NSP1 15 26 + #define RPMHPD_QPHY 16 27 + #define RPMHPD_DDR 17 28 + #define RPMHPD_XO 18 29 + 30 + #endif
+1 -1
include/linux/firmware/qcom/qcom_scm.h
··· 75 75 extern int qcom_scm_pas_init_image(u32 peripheral, const void *metadata, 76 76 size_t size, 77 77 struct qcom_scm_pas_metadata *ctx); 78 - void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx); 78 + extern void qcom_scm_pas_metadata_release(struct qcom_scm_pas_metadata *ctx); 79 79 extern int qcom_scm_pas_mem_setup(u32 peripheral, phys_addr_t addr, 80 80 phys_addr_t size); 81 81 extern int qcom_scm_pas_auth_and_reset(u32 peripheral);
+2 -2
include/linux/soc/qcom/qcom_aoss.h
··· 13 13 14 14 #if IS_ENABLED(CONFIG_QCOM_AOSS_QMP) 15 15 16 - int qmp_send(struct qmp *qmp, const void *data, size_t len); 16 + int qmp_send(struct qmp *qmp, const char *fmt, ...); 17 17 struct qmp *qmp_get(struct device *dev); 18 18 void qmp_put(struct qmp *qmp); 19 19 20 20 #else 21 21 22 - static inline int qmp_send(struct qmp *qmp, const void *data, size_t len) 22 + static inline int qmp_send(struct qmp *qmp, const char *fmt, ...) 23 23 { 24 24 return -ENODEV; 25 25 }
+1
include/linux/soc/qcom/smem.h
··· 4 4 5 5 #define QCOM_SMEM_HOST_ANY -1 6 6 7 + bool qcom_smem_is_available(void); 7 8 int qcom_smem_alloc(unsigned host, unsigned item, size_t size); 8 9 void *qcom_smem_get(unsigned host, unsigned item, size_t *size); 9 10