1from devlib.module import Module
2
3
4class BigLittleModule(Module):
5
6    name = 'bl'
7
8    @staticmethod
9    def probe(target):
10        return target.big_core is not None
11
12    @property
13    def bigs(self):
14        return [i for i, c in enumerate(self.target.platform.core_names)
15                if c == self.target.platform.big_core]
16
17    @property
18    def littles(self):
19        return [i for i, c in enumerate(self.target.platform.core_names)
20                if c == self.target.platform.little_core]
21
22    @property
23    def bigs_online(self):
24        return list(sorted(set(self.bigs).intersection(self.target.list_online_cpus())))
25
26    @property
27    def littles_online(self):
28        return list(sorted(set(self.littles).intersection(self.target.list_online_cpus())))
29
30    # hotplug
31
32    def online_all_bigs(self):
33        self.target.hotplug.online(*self.bigs)
34
35    def offline_all_bigs(self):
36        self.target.hotplug.offline(*self.bigs)
37
38    def online_all_littles(self):
39        self.target.hotplug.online(*self.littles)
40
41    def offline_all_littles(self):
42        self.target.hotplug.offline(*self.littles)
43
44    # cpufreq
45
46    def list_bigs_frequencies(self):
47        bigs_online = self.bigs_online
48        if len(bigs_online) > 0:
49            return self.target.cpufreq.list_frequencies(bigs_online[0])
50
51    def list_bigs_governors(self):
52        bigs_online = self.bigs_online
53        if len(bigs_online) > 0:
54            return self.target.cpufreq.list_governors(bigs_online[0])
55
56    def list_bigs_governor_tunables(self):
57        bigs_online = self.bigs_online
58        if len(bigs_online) > 0:
59            return self.target.cpufreq.list_governor_tunables(bigs_online[0])
60
61    def list_littles_frequencies(self):
62        littles_online = self.littles_online
63        if len(littles_online) > 0:
64            return self.target.cpufreq.list_frequencies(littles_online[0])
65
66    def list_littles_governors(self):
67        littles_online = self.littles_online
68        if len(littles_online) > 0:
69            return self.target.cpufreq.list_governors(littles_online[0])
70
71    def list_littles_governor_tunables(self):
72        littles_online = self.littles_online
73        if len(littles_online) > 0:
74            return self.target.cpufreq.list_governor_tunables(littles_online[0])
75
76    def get_bigs_governor(self):
77        bigs_online = self.bigs_online
78        if len(bigs_online) > 0:
79            return self.target.cpufreq.get_governor(bigs_online[0])
80
81    def get_bigs_governor_tunables(self):
82        bigs_online = self.bigs_online
83        if len(bigs_online) > 0:
84            return self.target.cpufreq.get_governor_tunables(bigs_online[0])
85
86    def get_bigs_frequency(self):
87        bigs_online = self.bigs_online
88        if len(bigs_online) > 0:
89            return self.target.cpufreq.get_frequency(bigs_online[0])
90
91    def get_bigs_min_frequency(self):
92        bigs_online = self.bigs_online
93        if len(bigs_online) > 0:
94            return self.target.cpufreq.get_min_frequency(bigs_online[0])
95
96    def get_bigs_max_frequency(self):
97        bigs_online = self.bigs_online
98        if len(bigs_online) > 0:
99            return self.target.cpufreq.get_max_frequency(bigs_online[0])
100
101    def get_littles_governor(self):
102        littles_online = self.littles_online
103        if len(littles_online) > 0:
104            return self.target.cpufreq.get_governor(littles_online[0])
105
106    def get_littles_governor_tunables(self):
107        littles_online = self.littles_online
108        if len(littles_online) > 0:
109            return self.target.cpufreq.get_governor_tunables(littles_online[0])
110
111    def get_littles_frequency(self):
112        littles_online = self.littles_online
113        if len(littles_online) > 0:
114            return self.target.cpufreq.get_frequency(littles_online[0])
115
116    def get_littles_min_frequency(self):
117        littles_online = self.littles_online
118        if len(littles_online) > 0:
119            return self.target.cpufreq.get_min_frequency(littles_online[0])
120
121    def get_littles_max_frequency(self):
122        littles_online = self.littles_online
123        if len(littles_online) > 0:
124            return self.target.cpufreq.get_max_frequency(littles_online[0])
125
126    def set_bigs_governor(self, governor, **kwargs):
127        bigs_online = self.bigs_online
128        if len(bigs_online) > 0:
129            self.target.cpufreq.set_governor(bigs_online[0], governor, **kwargs)
130        else:
131            raise ValueError("All bigs appear to be offline")
132
133    def set_bigs_governor_tunables(self, governor, **kwargs):
134        bigs_online = self.bigs_online
135        if len(bigs_online) > 0:
136            self.target.cpufreq.set_governor_tunables(bigs_online[0], governor, **kwargs)
137        else:
138            raise ValueError("All bigs appear to be offline")
139
140    def set_bigs_frequency(self, frequency, exact=True):
141        bigs_online = self.bigs_online
142        if len(bigs_online) > 0:
143            self.target.cpufreq.set_frequency(bigs_online[0], frequency, exact)
144        else:
145            raise ValueError("All bigs appear to be offline")
146
147    def set_bigs_min_frequency(self, frequency, exact=True):
148        bigs_online = self.bigs_online
149        if len(bigs_online) > 0:
150            self.target.cpufreq.set_min_frequency(bigs_online[0], frequency, exact)
151        else:
152            raise ValueError("All bigs appear to be offline")
153
154    def set_bigs_max_frequency(self, frequency, exact=True):
155        bigs_online = self.bigs_online
156        if len(bigs_online) > 0:
157            self.target.cpufreq.set_max_frequency(bigs_online[0], frequency, exact)
158        else:
159            raise ValueError("All bigs appear to be offline")
160
161    def set_littles_governor(self, governor, **kwargs):
162        littles_online = self.littles_online
163        if len(littles_online) > 0:
164            self.target.cpufreq.set_governor(littles_online[0], governor, **kwargs)
165        else:
166            raise ValueError("All littles appear to be offline")
167
168    def set_littles_governor_tunables(self, governor, **kwargs):
169        littles_online = self.littles_online
170        if len(littles_online) > 0:
171            self.target.cpufreq.set_governor_tunables(littles_online[0], governor, **kwargs)
172        else:
173            raise ValueError("All littles appear to be offline")
174
175    def set_littles_frequency(self, frequency, exact=True):
176        littles_online = self.littles_online
177        if len(littles_online) > 0:
178            self.target.cpufreq.set_frequency(littles_online[0], frequency, exact)
179        else:
180            raise ValueError("All littles appear to be offline")
181
182    def set_littles_min_frequency(self, frequency, exact=True):
183        littles_online = self.littles_online
184        if len(littles_online) > 0:
185            self.target.cpufreq.set_min_frequency(littles_online[0], frequency, exact)
186        else:
187            raise ValueError("All littles appear to be offline")
188
189    def set_littles_max_frequency(self, frequency, exact=True):
190        littles_online = self.littles_online
191        if len(littles_online) > 0:
192            self.target.cpufreq.set_max_frequency(littles_online[0], frequency, exact)
193        else:
194            raise ValueError("All littles appear to be offline")
195