diff --git a/doc/services/pm/images/system-pm.svg b/doc/services/pm/images/system-pm.svg deleted file mode 100644 index 615052ae6b3f..000000000000 --- a/doc/services/pm/images/system-pm.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
Idle Thread
Idle Thread
arch_irq_lock()pm_system_supspend (ticks)
CONFIG_PM 
CONFIG_PM 
no
no
yes
yes
k_cpu_idle()
ACTIVE
ACTIVE
SUSPEND_TO_RAM
or
SUSPEND_TO_DISK
or
SOFT_OFF
SUSPEND_TO_RAM...
RUNTIME_IDLE
or
SUSPEND_TO_DILE
or
STANDBY
RUNTIME_IDLE...
pm_policy_next_state()
pm_policy_next_state()
pm_low_power_devices()
pm_low_power_devices()
pm_suspend_devices()
pm_suspend_devices()
k_schedule_lock()
k_schedule_lock()
pm_state_notify()
pm_state_notify()
CONFIG_PM_DEVICE
CONFI...
SoC Implementation
SoC Implementation
pm_state_notify()
pm_state_notify()
pm_power_state_set(state)
pm_power_state_set(state)
pm_resume_devices()
pm_resume_devices()
pm_state_exit_post_ops()
pm_state_exit_post_ops()
k_sched_unlock()
k_sched_unlock()
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/doc/services/pm/system.rst b/doc/services/pm/system.rst index b71b793c94d5..f3e52b93d875 100644 --- a/doc/services/pm/system.rst +++ b/doc/services/pm/system.rst @@ -17,9 +17,52 @@ source. The following diagram describes system power management: -.. image:: images/system-pm.svg - :align: center - :alt: System power management +.. graphviz:: + :caption: System power management + + digraph G { + compound=true + node [height=1.2 style=rounded] + + lock [label="Lock interruptions"] + config_pm [label="CONFIG_PM" shape=diamond style="rounded,dashed"] + forced_state [label="state forced ?", shape=diamond style="rounded,dashed"] + config_system_managed_device_pm [label="CONFIG_PM_DEVICE" shape=diamond style="rounded,dashed"] + config_system_managed_device_pm2 [label="CONFIG_PM_DEVICE" shape=diamond style="rounded,dashed"] + pm_policy [label="Check policy manager\nfor a power state "] + pm_suspend_devices [label="Suspend\ndevices"] + pm_resume_devices [label="Resume\ndevices"] + pm_state_set [label="Change power state\n(SoC API)" style="rounded,bold"] + pm_system_resume [label="Finish wake-up\n(SoC API)\n(restore interruptions)" style="rounded,bold"] + k_cpu_idle [label="k_cpu_idle()"] + + subgraph cluster_0 { + style=invisible; + lock -> config_pm + } + + subgraph cluster_1 { + style=dashed + label = "pm_system_suspend()" + + forced_state -> config_system_managed_device_pm [label="yes"] + forced_state -> pm_policy [label="no"] + pm_policy -> config_system_managed_device_pm + config_system_managed_device_pm -> pm_state_set:e [label="no"] + config_system_managed_device_pm -> pm_suspend_devices [label="yes"] + pm_suspend_devices -> pm_state_set + pm_state_set -> config_system_managed_device_pm2 + config_system_managed_device_pm2 -> pm_resume_devices [label="yes"] + config_system_managed_device_pm2 -> pm_system_resume [label="no"] + pm_resume_devices -> pm_system_resume + } + + {rankdir=LR k_cpu_idle; forced_state} + pm_policy -> k_cpu_idle [label="PM_STATE_ACTIVE\n(no power state meet requirements)"] + config_pm -> k_cpu_idle [label="no"] + config_pm -> forced_state [label="yes" lhead="cluster_1"] + pm_system_resume:e -> lock:e [constraint=false lhed="cluster_0"] + } Some handful examples using different power management features: