[PATCH v7 00/37] NVIDIA Tegra power management patches for 5.15

Dmitry Osipenko
2021-07-01T23:28:38Z

Hello,

This series continues the work on enabling voltage scaling of the core
power domain for NVIDIA Tegra SoCs. All the previous grounding work around
improving OPP API and adding the initial core power domain driver is now
landing into 5.14 kernel and already available in linux-next.

The biggest challenge left so far is the power management of the PLLs
and system clocks which don't have a dedicated hardware unit. I made a lot
of changes around it by going back to a variant where individual device
drivers are responsible for the power management in oppose to a recent
variant where the most of power management was done by the clk controller
driver. This allowed to drop the need of having a special lockdep
annotation for the power domain's mutex, which Ulf Hansson didn't like
previously. We don't have situations of a nested GENPD accesses anymore.
It also allowed to minimize the clk patch a lot. Now clk driver manages
power of the internal clocks only.

This series enables a full power management for Tegra20 and Tegra30 SoCs.
It doesn't include all the device-tree binding patches. I'll try to split
this series into a smaller parts that could be applied individually. For
now I want to get a feedback at least on the first six patches.

Example /sys/kernel/debug/pm_genpd/pm_genpd_summary from Tegra20 Acer A500:

domain status children performance
/device runtime status
----------------------------------------------------------------------------------------------
mpe off-0 0
/devices/soc0/50000000.host1x/54040000.mpe suspended 0
vdec off-0 0
/devices/soc0/6001a000.vde suspended 0
venc off-0 0
/devices/soc0/50000000.host1x/54080000.vi suspended 0
/devices/soc0/50000000.host1x/54100000.isp suspended 0
3d off-0 0
/devices/soc0/50000000.host1x/54180000.gr3d suspended 0
core-domain on 1100000
3d, venc, vdec, mpe
/devices/soc0/50000000.host1x active 1100000
/devices/soc0/50000000.host1x/540c0000.epp suspended 0
/devices/soc0/50000000.host1x/54140000.gr2d suspended 0
/devices/soc0/50000000.host1x/54280000.hdmi suspended 0
/devices/soc0/c5000000.usb active 1100000
/devices/soc0/c5008000.usb active 1100000
/devices/soc0/c8000000.mmc active 1000000
/devices/soc0/c8000400.mmc active 1000000
/devices/soc0/c8000600.mmc active 1000000
/devices/soc0/7000f400.memory-controller active 1000000
/devices/platform/tegra_clk_sclk active 950000
/devices/soc0/50000000.host1x/54200000.dc active 950000
/devices/soc0/50000000.host1x/54240000.dc suspended 0

Example /sys/kernel/debug/pm_genpd/pm_genpd_summary from Tegra30 Nexus 7:

domain status children performance
/device runtime status
----------------------------------------------------------------------------------------------
heg on 1000000
/devices/soc0/50000000.host1x active 1000000
/devices/soc0/50000000.host1x/540c0000.epp suspended 0
/devices/soc0/50000000.host1x/54140000.gr2d suspended 0
mpe off-0 0
/devices/soc0/50000000.host1x/54040000.mpe suspended 0
vdec off-0 0
/devices/soc0/6001a000.vde suspended 0
venc off-0 0
/devices/soc0/50000000.host1x/54080000.vi suspended 0
/devices/soc0/50000000.host1x/54100000.isp suspended 0
3d1 off-0 0
/devices/genpd:1:54180000.gr3d suspended 0
3d0 off-0 0
/devices/genpd:0:54180000.gr3d suspended 0
core-domain on 1000000
3d0, 3d1, venc, vdec, mpe, heg
/devices/soc0/7d000000.usb active 1000000
/devices/soc0/78000400.mmc active 950000
/devices/soc0/7000f400.memory-controller active 1000000
/devices/soc0/7000a000.pwm active 1000000
/devices/platform/tegra_clk_pll_c active 1000000
/devices/platform/tegra_clk_pll_e suspended 0
/devices/platform/tegra_clk_pll_m active 1000000
/devices/platform/tegra_clk_sclk active 1000000
/devices/soc0/7000f800.fuse suspended 0
/devices/soc0/50000000.host1x/54240000.dc suspended 0
/devices/soc0/50000000.host1x/54200000.dc active 1000000

Dmitry Osipenko (37):
soc/tegra: pmc: Temporarily disable PMC state syncing
soc/tegra: pmc: Implement attach_dev() of power domain drivers
soc/tegra: Don't print error message when OPPs not available
soc/tegra: Add devm_tegra_core_dev_init_opp_table_simple()
dt-bindings: clock: tegra-car: Document new tegra-clocks node
clk: tegra: Support runtime PM and power domain
dt-bindings: host1x: Document OPP and power domain properties
dt-bindings: host1x: Document Memory Client resets of Host1x, GR2D and
GR3D
gpu: host1x: Add host1x_channel_stop()
gpu: host1x: Add runtime PM support
gpu: host1x: Add stub driver for MPE, VI, EPP and ISP
drm/tegra: dc: Support OPP and SoC core voltage scaling
drm/tegra: hdmi: Add OPP support
drm/tegra: gr2d: Support OPP and power management
drm/tegra: gr3d: Support OPP and power management
drm/tegra: vic: Stop channel before suspending
usb: chipidea: tegra: Add runtime PM support
bus: tegra-gmi: Add runtime PM support
pwm: tegra: Add runtime PM and OPP support
mmc: sdhci-tegra: Add runtime PM and OPP support
mtd: rawnand: tegra: Add runtime PM support
soc/tegra: fuse: Clear fuse->clk on driver probe failure
soc/tegra: fuse: Add runtime PM support
soc/tegra: fuse: Enable fuse clock on suspend
clk: tegra: Remove CLK_IS_CRITICAL flag from fuse clock
spi: tegra20-slink: Improve runtime PM usage
spi: tegra20-slink: Add OPP support
memory: tegra20-emc: Add minimal runtime PM support
memory: tegra30-emc: Add minimal runtime PM support
media: dt: bindings: tegra-vde: Convert to schema
media: dt: bindings: tegra-vde: Document OPP and power domain
media: staging: tegra-vde: Support generic power domain
ARM: tegra: Add OPP tables and power domains to Tegra20 device-trees
ARM: tegra: Add OPP tables and power domains to Tegra30 device-trees
ARM: tegra: Add Memory Client resets to Tegra20 GR2D, GR3D and Host1x
ARM: tegra: Add Memory Client resets to Tegra30 GR2D, GR3D and Host1x
soc/tegra: pmc: Enable core domain support on Tegra20 and Tegra30

.../bindings/clock/nvidia,tegra20-car.yaml | 51 +
.../display/tegra/nvidia,tegra20-host1x.txt | 53 +
.../bindings/media/nvidia,tegra-vde.txt | 64 -
.../bindings/media/nvidia,tegra-vde.yaml | 119 ++
.../boot/dts/tegra20-acer-a500-picasso.dts | 1 +
arch/arm/boot/dts/tegra20-colibri.dtsi | 3 +-
arch/arm/boot/dts/tegra20-harmony.dts | 3 +-
arch/arm/boot/dts/tegra20-paz00.dts | 1 +
.../arm/boot/dts/tegra20-peripherals-opp.dtsi | 941 +++++++++++
arch/arm/boot/dts/tegra20-seaboard.dts | 3 +-
arch/arm/boot/dts/tegra20-tamonten.dtsi | 3 +-
arch/arm/boot/dts/tegra20-trimslice.dts | 9 +
arch/arm/boot/dts/tegra20-ventana.dts | 1 +
arch/arm/boot/dts/tegra20.dtsi | 115 +-
.../tegra30-asus-nexus7-grouper-common.dtsi | 1 +
arch/arm/boot/dts/tegra30-beaver.dts | 1 +
arch/arm/boot/dts/tegra30-cardhu.dtsi | 1 +
arch/arm/boot/dts/tegra30-colibri.dtsi | 17 +-
arch/arm/boot/dts/tegra30-ouya.dts | 1 +
.../arm/boot/dts/tegra30-peripherals-opp.dtsi | 1412 +++++++++++++++++
arch/arm/boot/dts/tegra30.dtsi | 170 +-
drivers/bus/tegra-gmi.c | 44 +-
drivers/clk/tegra/Makefile | 1 +
drivers/clk/tegra/clk-device.c | 222 +++
drivers/clk/tegra/clk-pll.c | 2 +-
drivers/clk/tegra/clk-super.c | 2 +-
drivers/clk/tegra/clk-tegra-periph.c | 6 +-
drivers/clk/tegra/clk-tegra20.c | 39 +-
drivers/clk/tegra/clk-tegra30.c | 70 +-
drivers/clk/tegra/clk.c | 66 +
drivers/clk/tegra/clk.h | 2 +
drivers/gpu/drm/tegra/dc.c | 69 +
drivers/gpu/drm/tegra/dc.h | 2 +
drivers/gpu/drm/tegra/gr2d.c | 156 +-
drivers/gpu/drm/tegra/gr3d.c | 401 ++++-
drivers/gpu/drm/tegra/hdmi.c | 9 +-
drivers/gpu/drm/tegra/vic.c | 15 +
drivers/gpu/host1x/channel.c | 8 +
drivers/gpu/host1x/debug.c | 15 +
drivers/gpu/host1x/dev.c | 184 ++-
drivers/gpu/host1x/dev.h | 3 +-
drivers/gpu/host1x/hw/channel_hw.c | 44 +-
drivers/gpu/host1x/intr.c | 3 -
drivers/gpu/host1x/syncpt.c | 5 +-
drivers/memory/tegra/tegra20-emc.c | 31 +
drivers/memory/tegra/tegra30-emc.c | 31 +
drivers/mmc/host/sdhci-tegra.c | 81 +-
drivers/mtd/nand/raw/tegra_nand.c | 44 +-
drivers/pwm/pwm-tegra.c | 104 +-
drivers/soc/tegra/common.c | 4 +-
drivers/soc/tegra/fuse/fuse-tegra.c | 62 +
drivers/soc/tegra/fuse/fuse-tegra20.c | 10 +-
drivers/soc/tegra/fuse/fuse-tegra30.c | 10 +-
drivers/soc/tegra/fuse/fuse.h | 2 +
drivers/soc/tegra/pmc.c | 164 ++
drivers/spi/spi-tegra20-slink.c | 76 +-
drivers/staging/media/tegra-vde/vde.c | 59 +-
drivers/usb/chipidea/ci_hdrc_tegra.c | 50 +-
include/linux/host1x.h | 1 +
include/soc/tegra/common.h | 13 +
60 files changed, 4710 insertions(+), 370 deletions(-)
delete mode 100644 Documentation/devicetree/bindings/media/nvidia,tegra-vde.txt
create mode 100644 Documentation/devicetree/bindings/media/nvidia,tegra-vde.yaml
create mode 100644 drivers/clk/tegra/clk-device.c

--
2.30.2