| .. _cpu_freq: | 
 |  | 
 | CPU Frequency Scaling | 
 | ##################### | 
 |  | 
 | .. toctree:: | 
 |    :maxdepth: 1 | 
 |  | 
 |    policies/index.rst | 
 |  | 
 | Overview | 
 | ******** | 
 |  | 
 | The CPU Frequency Scaling subsystem in Zephyr provides a framework for SoC's to dynamically adjust | 
 | their processor frequency based on a monitored metric and performance state (P-state) policy | 
 | algorithm. | 
 |  | 
 | Design Goals | 
 | ************ | 
 |  | 
 | The CPU Frequency Scaling subsystem aims to provide a framework that allows for any policy algorithm | 
 | to work with any P-state driver and allows for each policy to make use of one, or many, metrics to | 
 | determine an optimal CPU frequency. The subsystem should be flexible enough to allow for SoC vendors | 
 | to define custom P-states, thresholds and metrics. | 
 |  | 
 | P-state Policies | 
 | **************** | 
 |  | 
 | A P-state policy is an algorithm that determines what the optimal P-state is for the CPU based on | 
 | the metrics it consumes and the thresholds defined per P-state. A policy can consume one, or many, | 
 | metrics to determine the optimal CPU frequency based on the desired statistics of the system. | 
 |  | 
 | See :ref:`policies <cpu_freq_policies>` for a list of standard policies. | 
 |  | 
 | Metrics | 
 | ******* | 
 |  | 
 | A P-state policy should include one or more metrics to base decisions. Examples of metrics could | 
 | include percent CPU load, SoC temperature, etc. | 
 |  | 
 | For an example of a metric in use, see the :ref:`on_demand <on_demand_policy>` policy. | 
 |  | 
 | P-state Drivers | 
 | *************** | 
 |  | 
 | A SoC supporting the CPU Freq subsystem must implement a P-state driver that implements | 
 | :c:func:`cpu_freq_pstate_set` which applies the passed in ``p_state`` to | 
 | the CPU when called. | 
 |  | 
 | A SoC must also provide the available P-states in devicetree by having a | 
 | :dtcompatible:`zephyr,pstate` compatible node. The SoC may also define its own P-state binding, | 
 | which extends :dtcompatible:`zephyr,pstate` to include additional properties that may be used by | 
 | the SoC's P-state driver. | 
 |  | 
 | Usage considerations | 
 | ******************** | 
 |  | 
 | The CPU Frequency Scaling subsystem is designed to work on both UP and SMP system. On SMP systems, | 
 | it is assumed by default that each of the CPUs are clocked at the same rate. Thus, should one CPU | 
 | undergo a P-state transition, then all other CPUs will also undergo the same P-state transition. | 
 | This can be overridden by the SoC by enabling the :kconfig:option:`CONFIG_CPU_FREQ_PER_CPU_SCALING` | 
 | configuration option to allow each CPU to be clocked independently. | 
 |  | 
 | The SoC supporting CPU Freq must uphold Zephyr's requirement that the system timer remains constant | 
 | over the lifetime of the program. See :ref:`Kernel Timing <kernel_timing>` for more information. | 
 |  | 
 | The CPU Frequency Scaling subsystem runs as a handler function to a ``k_timer``, which means it runs | 
 | in interrupt context (IRQ). The SoC P-state driver must ensure that its implementation of | 
 | :c:func:`cpu_freq_pstate_set` is IRQ context safe. If a P-state transition | 
 | cannot be completed reasonably in an IRQ context, it is recommended that the P-state driver of the | 
 | SoC implements its task as a workqueue item. |