1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include "dcn302_hwseq.h"
27
28#include "dce/dce_hwseq.h"
29
30#include "reg_helper.h"
31#include "dc.h"
32
33#define DC_LOGGER_INIT(logger)
34
35#define CTX \
36 hws->ctx
37#define REG(reg)\
38 hws->regs->reg
39
40#undef FN
41#define FN(reg_name, field_name) \
42 hws->shifts->field_name, hws->masks->field_name
43
44
45void dcn302_dpp_pg_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool power_on)
46{
47 uint32_t power_gate = power_on ? 0 : 1;
48 uint32_t pwr_status = power_on ? 0 : 2;
49
50 if (hws->ctx->dc->debug.disable_dpp_power_gate)
51 return;
52 if (REG(DOMAIN1_PG_CONFIG) == 0)
53 return;
54
55 switch (dpp_inst) {
56 case 0:
57 REG_UPDATE(DOMAIN1_PG_CONFIG,
58 DOMAIN1_POWER_GATE, power_gate);
59
60 REG_WAIT(DOMAIN1_PG_STATUS,
61 DOMAIN1_PGFSM_PWR_STATUS, pwr_status,
62 1, 1000);
63 break;
64 case 1:
65 REG_UPDATE(DOMAIN3_PG_CONFIG,
66 DOMAIN3_POWER_GATE, power_gate);
67
68 REG_WAIT(DOMAIN3_PG_STATUS,
69 DOMAIN3_PGFSM_PWR_STATUS, pwr_status,
70 1, 1000);
71 break;
72 case 2:
73 REG_UPDATE(DOMAIN5_PG_CONFIG,
74 DOMAIN5_POWER_GATE, power_gate);
75
76 REG_WAIT(DOMAIN5_PG_STATUS,
77 DOMAIN5_PGFSM_PWR_STATUS, pwr_status,
78 1, 1000);
79 break;
80 case 3:
81 REG_UPDATE(DOMAIN7_PG_CONFIG,
82 DOMAIN7_POWER_GATE, power_gate);
83
84 REG_WAIT(DOMAIN7_PG_STATUS,
85 DOMAIN7_PGFSM_PWR_STATUS, pwr_status,
86 1, 1000);
87 break;
88 case 4:
89 REG_UPDATE(DOMAIN9_PG_CONFIG,
90 DOMAIN9_POWER_GATE, power_gate);
91
92 REG_WAIT(DOMAIN9_PG_STATUS,
93 DOMAIN9_PGFSM_PWR_STATUS, pwr_status,
94 1, 1000);
95 break;
96 default:
97 BREAK_TO_DEBUGGER();
98 break;
99 }
100}
101
102void dcn302_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool power_on)
103{
104 uint32_t power_gate = power_on ? 0 : 1;
105 uint32_t pwr_status = power_on ? 0 : 2;
106
107 if (hws->ctx->dc->debug.disable_hubp_power_gate)
108 return;
109 if (REG(DOMAIN0_PG_CONFIG) == 0)
110 return;
111
112 switch (hubp_inst) {
113 case 0:
114 REG_UPDATE(DOMAIN0_PG_CONFIG,
115 DOMAIN0_POWER_GATE, power_gate);
116
117 REG_WAIT(DOMAIN0_PG_STATUS,
118 DOMAIN0_PGFSM_PWR_STATUS, pwr_status,
119 1, 1000);
120 break;
121 case 1:
122 REG_UPDATE(DOMAIN2_PG_CONFIG,
123 DOMAIN2_POWER_GATE, power_gate);
124
125 REG_WAIT(DOMAIN2_PG_STATUS,
126 DOMAIN2_PGFSM_PWR_STATUS, pwr_status,
127 1, 1000);
128 break;
129 case 2:
130 REG_UPDATE(DOMAIN4_PG_CONFIG,
131 DOMAIN4_POWER_GATE, power_gate);
132
133 REG_WAIT(DOMAIN4_PG_STATUS,
134 DOMAIN4_PGFSM_PWR_STATUS, pwr_status,
135 1, 1000);
136 break;
137 case 3:
138 REG_UPDATE(DOMAIN6_PG_CONFIG,
139 DOMAIN6_POWER_GATE, power_gate);
140
141 REG_WAIT(DOMAIN6_PG_STATUS,
142 DOMAIN6_PGFSM_PWR_STATUS, pwr_status,
143 1, 1000);
144 break;
145 case 4:
146 REG_UPDATE(DOMAIN8_PG_CONFIG,
147 DOMAIN8_POWER_GATE, power_gate);
148
149 REG_WAIT(DOMAIN8_PG_STATUS,
150 DOMAIN8_PGFSM_PWR_STATUS, pwr_status,
151 1, 1000);
152 break;
153 default:
154 BREAK_TO_DEBUGGER();
155 break;
156 }
157}
158
159void dcn302_dsc_pg_control(struct dce_hwseq *hws, unsigned int dsc_inst, bool power_on)
160{
161 uint32_t power_gate = power_on ? 0 : 1;
162 uint32_t pwr_status = power_on ? 0 : 2;
163 uint32_t org_ip_request_cntl = 0;
164
165 if (hws->ctx->dc->debug.disable_dsc_power_gate)
166 return;
167
168 if (REG(DOMAIN16_PG_CONFIG) == 0)
169 return;
170
171 REG_GET(DC_IP_REQUEST_CNTL, IP_REQUEST_EN, &org_ip_request_cntl);
172 if (org_ip_request_cntl == 0)
173 REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 1);
174
175 switch (dsc_inst) {
176 case 0:
177 REG_UPDATE(DOMAIN16_PG_CONFIG,
178 DOMAIN16_POWER_GATE, power_gate);
179
180 REG_WAIT(DOMAIN16_PG_STATUS,
181 DOMAIN16_PGFSM_PWR_STATUS, pwr_status,
182 1, 1000);
183 break;
184 case 1:
185 REG_UPDATE(DOMAIN17_PG_CONFIG,
186 DOMAIN17_POWER_GATE, power_gate);
187
188 REG_WAIT(DOMAIN17_PG_STATUS,
189 DOMAIN17_PGFSM_PWR_STATUS, pwr_status,
190 1, 1000);
191 break;
192 case 2:
193 REG_UPDATE(DOMAIN18_PG_CONFIG,
194 DOMAIN18_POWER_GATE, power_gate);
195
196 REG_WAIT(DOMAIN18_PG_STATUS,
197 DOMAIN18_PGFSM_PWR_STATUS, pwr_status,
198 1, 1000);
199 break;
200 case 3:
201 REG_UPDATE(DOMAIN19_PG_CONFIG,
202 DOMAIN19_POWER_GATE, power_gate);
203
204 REG_WAIT(DOMAIN19_PG_STATUS,
205 DOMAIN19_PGFSM_PWR_STATUS, pwr_status,
206 1, 1000);
207 break;
208 case 4:
209 REG_UPDATE(DOMAIN20_PG_CONFIG,
210 DOMAIN20_POWER_GATE, power_gate);
211
212 REG_WAIT(DOMAIN20_PG_STATUS,
213 DOMAIN20_PGFSM_PWR_STATUS, pwr_status,
214 1, 1000);
215 break;
216 default:
217 BREAK_TO_DEBUGGER();
218 break;
219 }
220
221 if (org_ip_request_cntl == 0)
222 REG_SET(DC_IP_REQUEST_CNTL, 0, IP_REQUEST_EN, 0);
223}
224