@@ -133,8 +133,8 @@ int smu_get_dpm_freq_range(struct smu_context *smu,
133
133
return ret ;
134
134
}
135
135
136
- static int smu_dpm_set_vcn_enable (struct smu_context * smu ,
137
- bool enable )
136
+ static int smu_dpm_set_vcn_enable_locked (struct smu_context * smu ,
137
+ bool enable )
138
138
{
139
139
struct smu_power_context * smu_power = & smu -> smu_power ;
140
140
struct smu_power_gate * power_gate = & smu_power -> power_gate ;
@@ -143,23 +143,34 @@ static int smu_dpm_set_vcn_enable(struct smu_context *smu,
143
143
if (!smu -> ppt_funcs -> dpm_set_vcn_enable )
144
144
return 0 ;
145
145
146
- mutex_lock (& power_gate -> vcn_gate_lock );
147
-
148
146
if (atomic_read (& power_gate -> vcn_gated ) ^ enable )
149
- goto out ;
147
+ return 0 ;
150
148
151
149
ret = smu -> ppt_funcs -> dpm_set_vcn_enable (smu , enable );
152
150
if (!ret )
153
151
atomic_set (& power_gate -> vcn_gated , !enable );
154
152
155
- out :
153
+ return ret ;
154
+ }
155
+
156
+ static int smu_dpm_set_vcn_enable (struct smu_context * smu ,
157
+ bool enable )
158
+ {
159
+ struct smu_power_context * smu_power = & smu -> smu_power ;
160
+ struct smu_power_gate * power_gate = & smu_power -> power_gate ;
161
+ int ret = 0 ;
162
+
163
+ mutex_lock (& power_gate -> vcn_gate_lock );
164
+
165
+ ret = smu_dpm_set_vcn_enable_locked (smu , enable );
166
+
156
167
mutex_unlock (& power_gate -> vcn_gate_lock );
157
168
158
169
return ret ;
159
170
}
160
171
161
- static int smu_dpm_set_jpeg_enable (struct smu_context * smu ,
162
- bool enable )
172
+ static int smu_dpm_set_jpeg_enable_locked (struct smu_context * smu ,
173
+ bool enable )
163
174
{
164
175
struct smu_power_context * smu_power = & smu -> smu_power ;
165
176
struct smu_power_gate * power_gate = & smu_power -> power_gate ;
@@ -168,16 +179,27 @@ static int smu_dpm_set_jpeg_enable(struct smu_context *smu,
168
179
if (!smu -> ppt_funcs -> dpm_set_jpeg_enable )
169
180
return 0 ;
170
181
171
- mutex_lock (& power_gate -> jpeg_gate_lock );
172
-
173
182
if (atomic_read (& power_gate -> jpeg_gated ) ^ enable )
174
- goto out ;
183
+ return 0 ;
175
184
176
185
ret = smu -> ppt_funcs -> dpm_set_jpeg_enable (smu , enable );
177
186
if (!ret )
178
187
atomic_set (& power_gate -> jpeg_gated , !enable );
179
188
180
- out :
189
+ return ret ;
190
+ }
191
+
192
+ static int smu_dpm_set_jpeg_enable (struct smu_context * smu ,
193
+ bool enable )
194
+ {
195
+ struct smu_power_context * smu_power = & smu -> smu_power ;
196
+ struct smu_power_gate * power_gate = & smu_power -> power_gate ;
197
+ int ret = 0 ;
198
+
199
+ mutex_lock (& power_gate -> jpeg_gate_lock );
200
+
201
+ ret = smu_dpm_set_jpeg_enable_locked (smu , enable );
202
+
181
203
mutex_unlock (& power_gate -> jpeg_gate_lock );
182
204
183
205
return ret ;
@@ -403,6 +425,45 @@ static int smu_early_init(void *handle)
403
425
return smu_set_funcs (adev );
404
426
}
405
427
428
+ static int smu_set_default_dpm_table (struct smu_context * smu )
429
+ {
430
+ struct smu_power_context * smu_power = & smu -> smu_power ;
431
+ struct smu_power_gate * power_gate = & smu_power -> power_gate ;
432
+ int vcn_gate , jpeg_gate ;
433
+ int ret = 0 ;
434
+
435
+ if (!smu -> ppt_funcs -> set_default_dpm_table )
436
+ return 0 ;
437
+
438
+ mutex_lock (& power_gate -> vcn_gate_lock );
439
+ mutex_lock (& power_gate -> jpeg_gate_lock );
440
+
441
+ vcn_gate = atomic_read (& power_gate -> vcn_gated );
442
+ jpeg_gate = atomic_read (& power_gate -> jpeg_gated );
443
+
444
+ ret = smu_dpm_set_vcn_enable_locked (smu , true);
445
+ if (ret )
446
+ goto err0_out ;
447
+
448
+ ret = smu_dpm_set_jpeg_enable_locked (smu , true);
449
+ if (ret )
450
+ goto err1_out ;
451
+
452
+ ret = smu -> ppt_funcs -> set_default_dpm_table (smu );
453
+ if (ret )
454
+ dev_err (smu -> adev -> dev ,
455
+ "Failed to setup default dpm clock tables!\n" );
456
+
457
+ smu_dpm_set_jpeg_enable_locked (smu , !jpeg_gate );
458
+ err1_out :
459
+ smu_dpm_set_vcn_enable_locked (smu , !vcn_gate );
460
+ err0_out :
461
+ mutex_unlock (& power_gate -> jpeg_gate_lock );
462
+ mutex_unlock (& power_gate -> vcn_gate_lock );
463
+
464
+ return ret ;
465
+ }
466
+
406
467
static int smu_late_init (void * handle )
407
468
{
408
469
struct amdgpu_device * adev = (struct amdgpu_device * )handle ;
0 commit comments