Saving Power / Lower power consumption mode?

Hi,
We develop a Video Processing system based on SD820 SOM from a third party. We are trying to implement a power saving mode where we reduce the frame rate much lower than the usual 30fps, etc. to conserve battery.

We have tried cpufreq utility to lower the clock frequencies and changing the governor settings, but it wasn’t good enough.
We also noticed the GPU clock speed can be configured in the device tree.
Is there any other places we can tweak? Can we change clock frequency for the DSP, hardware encoder/decoder or the ISP?
Any help is appreciated.
Thanks!
tamo2

Normally clocks are enabled and scaled depending on the demand (at least for the encoder/decoder). What you could do is trying to disable subsystem you don’t use in the device tree. You can also put some cpus offline (big ones?) when you want to switch low power mode.

1 Like

Hi Loic,

we are facing the same issue with lowering the power consumption. Could you please give us some pointers what subsystems we should turn off and how to disable the cpu? Thanks!

That’s depend what you want to use and not use on the system… For the CPU you can try to see power consumption impacts using /sys/devices/system/cpu/cpuX/online entry, echoing 0 or 1 into it.

That’s depend what you want to use and not use on the system…
We need BLSPs and one MIPI-CSI camera (ov5640). We are not sure, if images from ov5640 are being processed by the GPU or if we can turn it off.

We went through the device tree, but there are a lot of nodes we are not sure what they do. These are the device nodes defined in the apq8096-db820c, msm8996, pm8994 and pmi8994 dtsi files:

$ grep @ arch/arm64/boot/dts/qcom/apq8096-db820c.dtsi
                serial@7570000 {
                serial@75b0000 {
//              serial@75b1000 {
                i2c@07577000 {
                i2c@075b6000 {
                serial@075b3000 {
                serial@075b1000 {
                spi@07575000 {
                i2c@075ba000 {
                i2c@075b5000 {
                i2c@075ba000 {
                        goodix_ts@5d {
                spi@075ba000{
                sdhci@74a4900 {
                phy@34000 {
                phy@7410000 {
                phy@7411000 {
                phy@7412000 {
                usb@6af8800 {
                        dwc3@6a00000 {
                usb@76f8800 {
                        dwc3@7600000 {
                ufsphy@627000 {
                ufshc@624000 {
                agnoc@0 {
                        qcom,pcie@00600000 {
                        qcom,pcie@00608000 {
                        qcom,pcie@00610000 {
                slim_msm: slim@91c0000 {
                        ngd@1 {
                                wcd9335: codec@1{
                mdss@900000 {
                        mdp@901000 {
                        dsi@994000 {
                                panel@0 {
                                panel@1 {
                                        port@1 {
                                                endpoint@0  {
                                                endpoint@1  {
                        hdmi-phy@9a0600 {
                        hdmi-tx@9a0000 {
                camera_vdddo_1v8: fixedregulator@0 {
                camera_vdda_2v8: fixedregulator@1 {
                camera_vddd_1v5: fixedregulator@2 {
                cci@a0c000 {
                        camera_rear@60 {
                        camera_board@39 {
                        camera_front@3a {
                camss@a00000 {
                                port@0 {
                                port@1 {
                                port@2 {
                button@0 {
        pmic@1 {
        pmic@3 {
                lpg@b100 {
$ grep @ arch/arm64/boot/dts/qcom/msm8996.dtsi
                mba_region: mba@91500000 {
                venus_region: venus@90400000 {
                adsp_region: adsp@8ea00000 {
                mpss_region: mpss@88800000 {
                smem_mem: smem-mem@86000000 {
                memory@85800000 {
                memory@86200000 {
                zap_shader_region: gpu@8f200000 {
                rmtfs@86700000 {
                CPU0: cpu@0 {
                CPU1: cpu@1 {
                CPU2: cpu@100 {
                CPU3: cpu@101 {
                rpm_msg_ram: memory@68000 {
                tcsr_mutex_regs: syscon@740000 {
                tcsr: syscon@7a0000 {
                intc: interrupt-controller@9bc0000 {
                        msi_alias0: interrupt-controller@9bd0000 {
                apcs: syscon@9820000 {
                apcs_glb: mailbox@9820000 {
                gcc: clock-controller@300000 {
                kryocc: clock-controller@6400000 {
                blsp1_uart1: serial@7570000 {
                blsp1_spi0: spi@07575000 {
                        device@0 {
                blsp2_i2c5: i2c@075ba000 {
                        qcom_i2c_test@52 {
                blsp2_uart9: serial@075b1000 {
                blsp2_uart11: serial@075b3000 {
                blsp2_i2c0: i2c@075b5000 {
                tsens0: thermal-sensor@4a8000 {
                blsp2_uart1: serial@75b0000 {
                blsp2_i2c1: i2c@075b6000 {
                // blsp2_uart2: serial@75b1000 {
                blsp1_i2c2: i2c@07577000 {
                blsp2_i2c5: i2c@075ba000 {
                blsp2_spi5: spi@075ba000{
                sdhc2: sdhci@74a4900 {
                msmgpio: pinctrl@1010000 {
                timer@09840000 {
                        frame@9850000 {
                        frame@9870000 {
                        frame@9880000 {
                        frame@9890000 {
                        frame@98a0000 {
                        frame@98b0000 {
                        frame@98c0000 {
                spmi_bus: qcom,spmi@400f000 {
                mmcc: clock-controller@8c0000 {
                qfprom@74000 {
                        qusb2p_hstx_trim: hstx_trim@24e {
                        qusb2s_hstx_trim: hstx_trim@24f {
                phy@34000 {
                        pciephy_0: lane@35000 {
                        pciephy_1: lane@36000 {
                        pciephy_2: lane@37000 {
                phy@7410000 {
                        ssusb_phy_0: lane@7410200 {
                hsusb_phy1: phy@7411000 {
                hsusb_phy2: phy@7412000 {
                usb2: usb@76f8800 {
                        dwc3@7600000 {
                usb3: usb@6af8800 {
                        dwc3@6a00000 {
                cci: cci@a0c000 {
                vfe_smmu: arm,smmu@da0000 {
                camss: camss@a00000 {
                ufsphy1: ufsphy@627000 {
                ufshc@624000 {
                agnoc@0 {
                        pcie0: qcom,pcie@00600000 {
                        pcie1: qcom,pcie@00608000 {
                        pcie2: qcom,pcie@00610000 {
                slimbam:dma@9184000
                slim_msm: slim@91c0000 {
                        ngd@1 {
                                wcd9335: codec@1{
                adreno_smmu: arm,smmu@b40000 {
                gpu@b00000 {
                                qcom,gpu-pwrlevel@0 {
                                qcom,gpu-pwrlevel@1 {
                mdp_smmu: arm,smmu@d00000 {
                mdss: mdss@900000 {
                        mdp: mdp@901000 {
                                        port@0 {
                                        port@1 {
                        dsi0: dsi@994000 {
                                        port@0 {
                                        port@1 {
                        dsi0_phy: dsi-phy@994400 {
                        hdmi: hdmi-tx@9a0000 {
                                        port@0 {
                        hdmi_phy: hdmi-phy@9a0600 {
                lpass_q6_smmu: arm,smmu-lpass_q6@1600000 {
                venus_smmu: arm,smmu-venus@d40000 {
                venus: video-codec@c00000 {
                remoteproc@2080000 {
                                                hdmi@1 {
                                                mm@0 {
$ grep @ arch/arm64/boot/dts/qcom/pm8994.dtsi
        pmic@0 {
                rtc@6000 {
                pon@800 {
                pm8994_gpios: gpios@c000 {
                pm8994_mpps: mpps@a000 {
        pmic@1 {
$ grep @ arch/arm64/boot/dts/qcom/pmi8994.dtsi
        pmic@2 {
                        pm8994_clk_divs: clock-controller@5b00 {
                pmi8994_gpios: gpios@c000 {
                pmi8994_mpps: mpps@a000 {
        pmic@3 {
                lpg@b100 {
                        pmi8994_s2: s2@1700 {