Skip to content

Commit 7fb133c

Browse files
Evan Quanalexdeucher
authored andcommitted
drm/amd/powerplay: put VCN/JPEG into PG ungate state before dpm table setup(V3)
As VCN related dpm table setup needs VCN be in PG ungate state. Same logics applies to JPEG. V2: fix paste typo V3: code cosmetic Signed-off-by: Evan Quan <[email protected]> Tested-by: Matt Coffin <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 2c34c96 commit 7fb133c

File tree

2 files changed

+73
-13
lines changed

2 files changed

+73
-13
lines changed

drivers/gpu/drm/amd/powerplay/amdgpu_smu.c

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ int smu_get_dpm_freq_range(struct smu_context *smu,
133133
return ret;
134134
}
135135

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)
138138
{
139139
struct smu_power_context *smu_power = &smu->smu_power;
140140
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,
143143
if (!smu->ppt_funcs->dpm_set_vcn_enable)
144144
return 0;
145145

146-
mutex_lock(&power_gate->vcn_gate_lock);
147-
148146
if (atomic_read(&power_gate->vcn_gated) ^ enable)
149-
goto out;
147+
return 0;
150148

151149
ret = smu->ppt_funcs->dpm_set_vcn_enable(smu, enable);
152150
if (!ret)
153151
atomic_set(&power_gate->vcn_gated, !enable);
154152

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+
156167
mutex_unlock(&power_gate->vcn_gate_lock);
157168

158169
return ret;
159170
}
160171

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)
163174
{
164175
struct smu_power_context *smu_power = &smu->smu_power;
165176
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,
168179
if (!smu->ppt_funcs->dpm_set_jpeg_enable)
169180
return 0;
170181

171-
mutex_lock(&power_gate->jpeg_gate_lock);
172-
173182
if (atomic_read(&power_gate->jpeg_gated) ^ enable)
174-
goto out;
183+
return 0;
175184

176185
ret = smu->ppt_funcs->dpm_set_jpeg_enable(smu, enable);
177186
if (!ret)
178187
atomic_set(&power_gate->jpeg_gated, !enable);
179188

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+
181203
mutex_unlock(&power_gate->jpeg_gate_lock);
182204

183205
return ret;
@@ -403,6 +425,45 @@ static int smu_early_init(void *handle)
403425
return smu_set_funcs(adev);
404426
}
405427

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+
406467
static int smu_late_init(void *handle)
407468
{
408469
struct amdgpu_device *adev = (struct amdgpu_device *)handle;

drivers/gpu/drm/amd/powerplay/smu_internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
#define smu_disable_all_features_with_exception(smu, mask) smu_ppt_funcs(disable_all_features_with_exception, 0, smu, mask)
6161
#define smu_is_dpm_running(smu) smu_ppt_funcs(is_dpm_running, 0 , smu)
6262
#define smu_notify_display_change(smu) smu_ppt_funcs(notify_display_change, 0, smu)
63-
#define smu_set_default_dpm_table(smu) smu_ppt_funcs(set_default_dpm_table, 0, smu)
6463
#define smu_populate_umd_state_clk(smu) smu_ppt_funcs(populate_umd_state_clk, 0, smu)
6564
#define smu_set_default_od8_settings(smu) smu_ppt_funcs(set_default_od8_settings, 0, smu)
6665
#define smu_enable_thermal_alert(smu) smu_ppt_funcs(enable_thermal_alert, 0, smu)

0 commit comments

Comments
 (0)