1# SPDX-License-Identifier: Apache-2.0
2#
3# Copyright (C) 2016, ARM Limited and contributors.
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17from energy_model import (ActiveState, EnergyModelNode, EnergyModelRoot,
18                          PowerDomain, EnergyModel)
19
20from collections import OrderedDict
21
22silver_cpu_active_states = OrderedDict([
23    ( 307200, ActiveState(capacity=149, power=90)),
24    ( 384000, ActiveState(capacity=188, power=111)),
25    ( 460800, ActiveState(capacity=225, power=133)),
26    ( 537600, ActiveState(capacity=257, power=160)),
27    ( 614400, ActiveState(capacity=281, power=182)),
28    ( 691200, ActiveState(capacity=315, power=210)),
29    ( 768000, ActiveState(capacity=368, power=251)),
30    ( 844800, ActiveState(capacity=406, power=306)),
31    ( 902400, ActiveState(capacity=428, power=332)),
32    ( 979200, ActiveState(capacity=469, power=379)),
33    (1056000, ActiveState(capacity=502, power=438)),
34    (1132800, ActiveState(capacity=538, power=494)),
35    (1209600, ActiveState(capacity=581, power=550)),
36    (1286400, ActiveState(capacity=611, power=613)),
37    (1363200, ActiveState(capacity=648, power=670)),
38    (1440000, ActiveState(capacity=684, power=752)),
39    (1516800, ActiveState(capacity=729, power=848)),
40    (1593600, ActiveState(capacity=763, power=925)),
41])
42
43silver_cluster_active_states = OrderedDict([
44    ( 307200, ActiveState(power=4)),
45    ( 384000, ActiveState(power=4)),
46    ( 460800, ActiveState(power=4)),
47    ( 537600, ActiveState(power=4)),
48    ( 614400, ActiveState(power=4)),
49    ( 691200, ActiveState(power=4)),
50    ( 768000, ActiveState(power=8)),
51    ( 844800, ActiveState(power=9)),
52    ( 902400, ActiveState(power=15)),
53    ( 979200, ActiveState(power=16)),
54    (1056000, ActiveState(power=21)),
55    (1132800, ActiveState(power=22)),
56    (1209600, ActiveState(power=29)),
57    (1286400, ActiveState(power=32)),
58    (1363200, ActiveState(power=42)),
59    (1440000, ActiveState(power=49)),
60    # This power value is 41 (invalid!) in the released kernel. Patch it to
61    # avoid errors.
62    (1516800, ActiveState(power=52)),
63    (1593600, ActiveState(power=52)),
64])
65
66gold_cpu_active_states = OrderedDict([
67    ( 307200, ActiveState(capacity=149, power=93)),
68    ( 384000, ActiveState(capacity=188, power=111)),
69    ( 460800, ActiveState(capacity=225, power=133)),
70    ( 537600, ActiveState(capacity=257, power=160)),
71    ( 614400, ActiveState(capacity=281, power=182)),
72    ( 691200, ActiveState(capacity=315, power=210)),
73    ( 748800, ActiveState(capacity=348, power=252)),
74    ( 825600, ActiveState(capacity=374, power=290)),
75    ( 902400, ActiveState(capacity=428, power=332)),
76    ( 979200, ActiveState(capacity=469, power=379)),
77    (1056000, ActiveState(capacity=502, power=438)),
78    (1132800, ActiveState(capacity=538, power=494)),
79    (1209600, ActiveState(capacity=581, power=550)),
80    (1286400, ActiveState(capacity=611, power=613)),
81    (1363200, ActiveState(capacity=648, power=670)),
82    (1440000, ActiveState(capacity=684, power=752)),
83    (1516800, ActiveState(capacity=729, power=848)),
84    (1593600, ActiveState(capacity=763, power=925)),
85    (1670400, ActiveState(capacity=795, power=1018)),
86    (1747200, ActiveState(capacity=832, power=1073)),
87    (1824000, ActiveState(capacity=868, power=1209)),
88    (1900800, ActiveState(capacity=905, power=1298)),
89    (1977600, ActiveState(capacity=952, power=1428)),
90    (2054400, ActiveState(capacity=979, power=1521)),
91    (2150400, ActiveState(capacity=1024, power=1715)),
92])
93
94gold_cluster_active_states = OrderedDict([
95    ( 307200, ActiveState(power=4)),
96    ( 384000, ActiveState(power=4)),
97    ( 460800, ActiveState(power=4)),
98    ( 537600, ActiveState(power=4)),
99    ( 614400, ActiveState(power=4)),
100    ( 691200, ActiveState(power=4)),
101    ( 748800, ActiveState(power=7)),
102    ( 825600, ActiveState(power=10)),
103    ( 902400, ActiveState(power=15)),
104    ( 979200, ActiveState(power=16)),
105    (1056000, ActiveState(power=21)),
106    (1132800, ActiveState(power=22)),
107    (1209600, ActiveState(power=29)),
108    (1286400, ActiveState(power=32)),
109    (1363200, ActiveState(power=42)),
110    (1440000, ActiveState(power=49)),
111    # This power value is 41 (invalid!) in the released kernel. Patch it to
112    # avoid errors.
113    (1516800, ActiveState(power=52)),
114    (1593600, ActiveState(power=52)),
115    (1670400, ActiveState(power=62)),
116    (1747200, ActiveState(power=69)),
117    (1824000, ActiveState(power=75)),
118    (1900800, ActiveState(power=81)),
119    (1977600, ActiveState(power=90)),
120    (2054400, ActiveState(power=93)),
121    (2150400, ActiveState(power=96)),
122])
123
124# TODO warn if any of the idle states aren't represented by power domains
125cpu_idle_states = OrderedDict([
126    ("WFI",               2),
127    ("cpu-sleep-0",       0),
128    ("cluster-sleep-0",   0),
129])
130
131cluster_idle_states = OrderedDict([
132    ("WFI",               0),
133    ("cpu-sleep-0",       0),
134    ("cluster-sleep-0",   0),
135])
136
137silvers = [0, 1]
138golds = [2, 3]
139
140def silver_cpu_node(cpu):
141    return EnergyModelNode(cpu=cpu,
142                           active_states=silver_cpu_active_states,
143                           idle_states=cpu_idle_states)
144
145def gold_cpu_node(cpu):
146    return EnergyModelNode(cpu=cpu,
147                           active_states=gold_cpu_active_states,
148                           idle_states=cpu_idle_states)
149
150def cpu_pd(cpu):
151    return PowerDomain(cpu=cpu, idle_states=["WFI", "cpu-sleep-0"])
152
153pixel_energy = EnergyModel(
154    root_node=EnergyModelRoot(children=[
155        EnergyModelNode(name='cluster_silver',
156                        children=[silver_cpu_node(c) for c in silvers],
157                        active_states=silver_cluster_active_states,
158                        idle_states=cluster_idle_states),
159        EnergyModelNode(name='cluster_gold',
160                        children=[gold_cpu_node(c) for c in golds],
161                        active_states=gold_cluster_active_states,
162                        idle_states=cluster_idle_states)]),
163    root_power_domain=PowerDomain(idle_states=[], children=[
164        PowerDomain(idle_states=['cluster-sleep-0'], children=[
165            cpu_pd(c) for c in silvers]),
166        PowerDomain(idle_states=['cluster-sleep-0'], children=[
167            cpu_pd(c) for c in golds])]),
168    freq_domains=[silvers, golds])
169