Skip to content
  • Quentin Perret's avatar
    PM: Introduce an Energy Model management framework · 27871f7a
    Quentin Perret authored
    
    
    Several subsystems in the kernel (task scheduler and/or thermal at the
    time of writing) can benefit from knowing about the energy consumed by
    CPUs. Yet, this information can come from different sources (DT or
    firmware for example), in different formats, hence making it hard to
    exploit without a standard API.
    
    As an attempt to address this, introduce a centralized Energy Model
    (EM) management framework which aggregates the power values provided
    by drivers into a table for each performance domain in the system. The
    power cost tables are made available to interested clients (e.g. task
    scheduler or thermal) via platform-agnostic APIs. The overall design
    is represented by the diagram below (focused on Arm-related drivers as
    an example, but applicable to any architecture):
    
         +---------------+  +-----------------+  +-------------+
         | Thermal (IPA) |  | Scheduler (EAS) |  |    Other    |
         +---------------+  +-----------------+  +-------------+
                 |                   | em_pd_energy()   |
                 |                   | em_cpu_get()     |
                 +-----------+       |         +--------+
                             |       |         |
                             v       v         v
                          +---------------------+
                          |                     |
                          |    Energy Model     |
                          |                     |
                          |     Framework       |
                          |                     |
                          +---------------------+
                             ^       ^       ^
                             |       |       | em_register_perf_domain()
                  +----------+       |       +---------+
                  |                  |                 |
          +---------------+  +---------------+  +--------------+
          |  cpufreq-dt   |  |   arm_scmi    |  |    Other     |
          +---------------+  +---------------+  +--------------+
                  ^                  ^                 ^
                  |                  |                 |
          +--------------+   +---------------+  +--------------+
          | Device Tree  |   |   Firmware    |  |      ?       |
          +--------------+   +---------------+  +--------------+
    
    Drivers (typically, but not limited to, CPUFreq drivers) can register
    data in the EM framework using the em_register_perf_domain() API. The
    calling driver must provide a callback function with a standardized
    signature that will be used by the EM framework to build the power
    cost tables of the performance domain. This design should offer a lot of
    flexibility to calling drivers which are free of reading information
    from any location and to use any technique to compute power costs.
    Moreover, the capacity states registered by drivers in the EM framework
    are not required to match real performance states of the target. This
    is particularly important on targets where the performance states are
    not known by the OS.
    
    The power cost coefficients managed by the EM framework are specified in
    milli-watts. Although the two potential users of those coefficients (IPA
    and EAS) only need relative correctness, IPA specifically needs to
    compare the power of CPUs with the power of other components (GPUs, for
    example), which are still expressed in absolute terms in their
    respective subsystems. Hence, specifying the power of CPUs in
    milli-watts should help transitioning IPA to using the EM framework
    without introducing new problems by keeping units comparable across
    sub-systems.
    On the longer term, the EM of other devices than CPUs could also be
    managed by the EM framework, which would enable to remove the absolute
    unit. However, this is not absolutely required as a first step, so this
    extension of the EM framework is left for later.
    
    On the client side, the EM framework offers APIs to access the power
    cost tables of a CPU (em_cpu_get()), and to estimate the energy
    consumed by the CPUs of a performance domain (em_pd_energy()). Clients
    such as the task scheduler can then use these APIs to access the shared
    data structures holding the Energy Model of CPUs.
    
    Signed-off-by: default avatarQuentin Perret <quentin.perret@arm.com>
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: adharmap@codeaurora.org
    Cc: chris.redpath@arm.com
    Cc: currojerez@riseup.net
    Cc: dietmar.eggemann@arm.com
    Cc: edubezval@gmail.com
    Cc: gregkh@linuxfoundation.org
    Cc: javi.merino@kernel.org
    Cc: joel@joelfernandes.org
    Cc: juri.lelli@redhat.com
    Cc: morten.rasmussen@arm.com
    Cc: patrick.bellasi@arm.com
    Cc: pkondeti@codeaurora.org
    Cc: skannan@codeaurora.org
    Cc: smuckle@google.com
    Cc: srinivas.pandruvada@linux.intel.com
    Cc: thara.gopinath@linaro.org
    Cc: tkjos@google.com
    Cc: valentin.schneider@arm.com
    Cc: vincent.guittot@linaro.org
    Cc: viresh.kumar@linaro.org
    Link: https://lkml.kernel.org/r/20181203095628.11858-4-quentin.perret@arm.com
    
    
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    27871f7a