mem: Use the new unbound port reporting mechanism in the mem ports.
[gem5.git] / src / sim / power_domain.hh
1 /*
2 * Copyright (c) 2017, 2019-2020 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 */
38
39 #ifndef __SIM_POWER_DOMAIN_HH__
40 #define __SIM_POWER_DOMAIN_HH__
41
42 #include <string>
43 #include <vector>
44
45 #include "base/statistics.hh"
46 #include "params/PowerDomain.hh"
47 #include "sim/clocked_object.hh"
48 #include "sim/power_state.hh"
49
50 /**
51 * The PowerDomain groups PowerState objects together to regulate their
52 * power states. As the PowerDomain itself is a PowerState object, you can
53 * create hierarchies of PowerDomains. All objects in a power domain will be in
54 * the power state of the domain OR a more performant one.
55 */
56 class PowerDomain : public PowerState
57 {
58 public:
59 PowerDomain(const PowerDomainParams* p);
60 typedef PowerDomainParams Params;
61 ~PowerDomain() override {};
62
63 /**
64 * During startup, the list of possible power states the
65 * PowerDomain can be in is populated, the power state of the
66 * PowerDomain is set and some assertions about the PowerState objects
67 * in the Domain are checked.
68 */
69 void startup() override;
70
71 /**
72 * Register the change in power state in one of the leader. The power
73 * domain will change its own power state if required and if there is a
74 * power state, it will schedule an event to update its followers
75 */
76 void pwrStateChangeCallback(Enums::PwrState new_pwr_state,
77 PowerState* leader);
78
79 /**
80 * Function called by a follower to register itself as
81 * a dependant of this power domain
82 */
83 void addFollower(PowerState* pwr_obj) override;
84
85 private:
86 /**
87 * Calculate the power state of the power domain, based upon the power
88 * states of the leaders. This will be called if one the leaders
89 * changes its power states.
90 * If no inputs are given, only the leaders will be polled on their
91 * power state. You can also pass a vector containing the power states
92 * which the followers returned when asked to match a certain power
93 * state (called from setFollowerPowerStates)
94 */
95 Enums::PwrState calculatePowerDomainState(
96 const std::vector<Enums::PwrState> &f_states={});
97
98 /**
99 * Check if a given p_state is available across all leaders and
100 * followers in this domain.
101 */
102 bool isPossiblePwrState(Enums::PwrState p_state);
103
104 /**
105 * Calculate the possible power states of the domain based upon the
106 * intersection of the power states of the individual objects within
107 * the domain. Done at startup.
108 */
109 void calculatePossiblePwrStates();
110
111 /**
112 * Update the followers of the newly updated power state. They are
113 * required to match the power state of the power domain i.e. go to the
114 * same power state or a more performant one
115 */
116 void setFollowerPowerStates();
117
118 private: /* Power domain attributes */
119 /**
120 * List of all leaders in the PowerDomain. A leader can
121 * independently change its power state and does not depend on the
122 * PowerDomain to change its power state. A leader needs to be a
123 * PowerState object and can also be another PowerDomain. Each
124 * PowerDomain needs to have at least one leader.
125 */
126 std::vector<PowerState*> leaders;
127
128 /**
129 * Power state requested by the leader. This is not necessarily the
130 * power state of the domain as whole (as that one depends on the
131 * matched power states of the followers
132 */
133 Enums::PwrState leaderTargetState;
134
135 /**
136 * List of all followers in the PowerDomain. The power state of the
137 * domain will determine the power state of the followers. A follower
138 * cannot change its power state independently.
139 */
140 std::vector<PowerState*> followers;
141
142 /**
143 * Latency with which power state changes of the leaders will ripple
144 * through to the followers.
145 */
146 const Tick updateLatency = 1;
147
148 /**
149 * Event to update the power states of the followers
150 */
151 EventWrapper<PowerDomain, &PowerDomain::setFollowerPowerStates>
152 pwrStateUpdateEvent;
153
154 protected:
155 struct PowerDomainStats : public Stats::Group
156 {
157 PowerDomainStats(PowerDomain &pd);
158
159 void regStats() override;
160
161 Stats::Scalar numLeaderCalls;
162 Stats::Scalar numLeaderCallsChangingState;
163 } stats;
164 };
165
166 #endif // __SIM_POWER_DOMAIN_HH__