# SPDX-License-Identifier: Apache-2.0
#
# Copyright (C) 2016, ARM Limited and contributors.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from energy_model import (ActiveState, EnergyModelNode, EnergyModelRoot,
PowerDomain, EnergyModel)
from collections import OrderedDict
silver_cpu_active_states = OrderedDict([
( 307200, ActiveState(capacity=149, power=90)),
( 384000, ActiveState(capacity=188, power=111)),
( 460800, ActiveState(capacity=225, power=133)),
( 537600, ActiveState(capacity=257, power=160)),
( 614400, ActiveState(capacity=281, power=182)),
( 691200, ActiveState(capacity=315, power=210)),
( 768000, ActiveState(capacity=368, power=251)),
( 844800, ActiveState(capacity=406, power=306)),
( 902400, ActiveState(capacity=428, power=332)),
( 979200, ActiveState(capacity=469, power=379)),
(1056000, ActiveState(capacity=502, power=438)),
(1132800, ActiveState(capacity=538, power=494)),
(1209600, ActiveState(capacity=581, power=550)),
(1286400, ActiveState(capacity=611, power=613)),
(1363200, ActiveState(capacity=648, power=670)),
(1440000, ActiveState(capacity=684, power=752)),
(1516800, ActiveState(capacity=729, power=848)),
(1593600, ActiveState(capacity=763, power=925)),
])
silver_cluster_active_states = OrderedDict([
( 307200, ActiveState(power=4)),
( 384000, ActiveState(power=4)),
( 460800, ActiveState(power=4)),
( 537600, ActiveState(power=4)),
( 614400, ActiveState(power=4)),
( 691200, ActiveState(power=4)),
( 768000, ActiveState(power=8)),
( 844800, ActiveState(power=9)),
( 902400, ActiveState(power=15)),
( 979200, ActiveState(power=16)),
(1056000, ActiveState(power=21)),
(1132800, ActiveState(power=22)),
(1209600, ActiveState(power=29)),
(1286400, ActiveState(power=32)),
(1363200, ActiveState(power=42)),
(1440000, ActiveState(power=49)),
# This power value is 41 (invalid!) in the released kernel. Patch it to
# avoid errors.
(1516800, ActiveState(power=52)),
(1593600, ActiveState(power=52)),
])
gold_cpu_active_states = OrderedDict([
( 307200, ActiveState(capacity=149, power=93)),
( 384000, ActiveState(capacity=188, power=111)),
( 460800, ActiveState(capacity=225, power=133)),
( 537600, ActiveState(capacity=257, power=160)),
( 614400, ActiveState(capacity=281, power=182)),
( 691200, ActiveState(capacity=315, power=210)),
( 748800, ActiveState(capacity=348, power=252)),
( 825600, ActiveState(capacity=374, power=290)),
( 902400, ActiveState(capacity=428, power=332)),
( 979200, ActiveState(capacity=469, power=379)),
(1056000, ActiveState(capacity=502, power=438)),
(1132800, ActiveState(capacity=538, power=494)),
(1209600, ActiveState(capacity=581, power=550)),
(1286400, ActiveState(capacity=611, power=613)),
(1363200, ActiveState(capacity=648, power=670)),
(1440000, ActiveState(capacity=684, power=752)),
(1516800, ActiveState(capacity=729, power=848)),
(1593600, ActiveState(capacity=763, power=925)),
(1670400, ActiveState(capacity=795, power=1018)),
(1747200, ActiveState(capacity=832, power=1073)),
(1824000, ActiveState(capacity=868, power=1209)),
(1900800, ActiveState(capacity=905, power=1298)),
(1977600, ActiveState(capacity=952, power=1428)),
(2054400, ActiveState(capacity=979, power=1521)),
(2150400, ActiveState(capacity=1024, power=1715)),
])
gold_cluster_active_states = OrderedDict([
( 307200, ActiveState(power=4)),
( 384000, ActiveState(power=4)),
( 460800, ActiveState(power=4)),
( 537600, ActiveState(power=4)),
( 614400, ActiveState(power=4)),
( 691200, ActiveState(power=4)),
( 748800, ActiveState(power=7)),
( 825600, ActiveState(power=10)),
( 902400, ActiveState(power=15)),
( 979200, ActiveState(power=16)),
(1056000, ActiveState(power=21)),
(1132800, ActiveState(power=22)),
(1209600, ActiveState(power=29)),
(1286400, ActiveState(power=32)),
(1363200, ActiveState(power=42)),
(1440000, ActiveState(power=49)),
# This power value is 41 (invalid!) in the released kernel. Patch it to
# avoid errors.
(1516800, ActiveState(power=52)),
(1593600, ActiveState(power=52)),
(1670400, ActiveState(power=62)),
(1747200, ActiveState(power=69)),
(1824000, ActiveState(power=75)),
(1900800, ActiveState(power=81)),
(1977600, ActiveState(power=90)),
(2054400, ActiveState(power=93)),
(2150400, ActiveState(power=96)),
])
# TODO warn if any of the idle states aren't represented by power domains
cpu_idle_states = OrderedDict([
("WFI", 2),
("cpu-sleep-0", 0),
("cluster-sleep-0", 0),
])
cluster_idle_states = OrderedDict([
("WFI", 0),
("cpu-sleep-0", 0),
("cluster-sleep-0", 0),
])
silvers = [0, 1]
golds = [2, 3]
def silver_cpu_node(cpu):
return EnergyModelNode(cpu=cpu,
active_states=silver_cpu_active_states,
idle_states=cpu_idle_states)
def gold_cpu_node(cpu):
return EnergyModelNode(cpu=cpu,
active_states=gold_cpu_active_states,
idle_states=cpu_idle_states)
def cpu_pd(cpu):
return PowerDomain(cpu=cpu, idle_states=["WFI", "cpu-sleep-0"])
pixel_energy = EnergyModel(
root_node=EnergyModelRoot(children=[
EnergyModelNode(name='cluster_silver',
children=[silver_cpu_node(c) for c in silvers],
active_states=silver_cluster_active_states,
idle_states=cluster_idle_states),
EnergyModelNode(name='cluster_gold',
children=[gold_cpu_node(c) for c in golds],
active_states=gold_cluster_active_states,
idle_states=cluster_idle_states)]),
root_power_domain=PowerDomain(idle_states=[], children=[
PowerDomain(idle_states=['cluster-sleep-0'], children=[
cpu_pd(c) for c in silvers]),
PowerDomain(idle_states=['cluster-sleep-0'], children=[
cpu_pd(c) for c in golds])]),
freq_domains=[silvers, golds])