Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amd/pm: Fix sienna cichlid incorrect OD volage after resume

Always setup overdrive tables after resume. Preserve only some
user-defined settings in user_overdrive_table if they're set.

Copy restored user_overdrive_table into od_table to get correct
values.

On cold boot, BTC was triggered and GfxVfCurve was calibrated. We
got VfCurve settings (a). On resuming back, BTC will be triggered
again and GfxVfCurve will be recalibrated. VfCurve settings (b)
got may be different from those of cold boot. So if we reuse
those VfCurve settings (a) got on cold boot on suspend, we can
run into discrepencies.

Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1897
Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/2276
Reviewed-by: Evan Quan <evan.quan@amd.com>
Signed-off-by: Błażej Szczygieł <mumei6102@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Błażej Szczygieł and committed by
Alex Deucher
49017304 3b4723de

+33 -10
+33 -10
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 2143 2143 (OverDriveTable_t *)smu->smu_table.boot_overdrive_table; 2144 2144 OverDriveTable_t *user_od_table = 2145 2145 (OverDriveTable_t *)smu->smu_table.user_overdrive_table; 2146 + OverDriveTable_t user_od_table_bak; 2146 2147 int ret = 0; 2147 - 2148 - /* 2149 - * For S3/S4/Runpm resume, no need to setup those overdrive tables again as 2150 - * - either they already have the default OD settings got during cold bootup 2151 - * - or they have some user customized OD settings which cannot be overwritten 2152 - */ 2153 - if (smu->adev->in_suspend) 2154 - return 0; 2155 2148 2156 2149 ret = smu_cmn_update_table(smu, SMU_TABLE_OVERDRIVE, 2157 2150 0, (void *)boot_od_table, false); ··· 2156 2163 sienna_cichlid_dump_od_table(smu, boot_od_table); 2157 2164 2158 2165 memcpy(od_table, boot_od_table, sizeof(OverDriveTable_t)); 2159 - memcpy(user_od_table, boot_od_table, sizeof(OverDriveTable_t)); 2166 + 2167 + /* 2168 + * For S3/S4/Runpm resume, we need to setup those overdrive tables again, 2169 + * but we have to preserve user defined values in "user_od_table". 2170 + */ 2171 + if (!smu->adev->in_suspend) { 2172 + memcpy(user_od_table, boot_od_table, sizeof(OverDriveTable_t)); 2173 + smu->user_dpm_profile.user_od = false; 2174 + } else if (smu->user_dpm_profile.user_od) { 2175 + memcpy(&user_od_table_bak, user_od_table, sizeof(OverDriveTable_t)); 2176 + memcpy(user_od_table, boot_od_table, sizeof(OverDriveTable_t)); 2177 + user_od_table->GfxclkFmin = user_od_table_bak.GfxclkFmin; 2178 + user_od_table->GfxclkFmax = user_od_table_bak.GfxclkFmax; 2179 + user_od_table->UclkFmin = user_od_table_bak.UclkFmin; 2180 + user_od_table->UclkFmax = user_od_table_bak.UclkFmax; 2181 + user_od_table->VddGfxOffset = user_od_table_bak.VddGfxOffset; 2182 + } 2160 2183 2161 2184 return 0; 2162 2185 } ··· 2380 2371 } 2381 2372 2382 2373 return ret; 2374 + } 2375 + 2376 + static int sienna_cichlid_restore_user_od_settings(struct smu_context *smu) 2377 + { 2378 + struct smu_table_context *table_context = &smu->smu_table; 2379 + OverDriveTable_t *od_table = table_context->overdrive_table; 2380 + OverDriveTable_t *user_od_table = table_context->user_overdrive_table; 2381 + int res; 2382 + 2383 + res = smu_v11_0_restore_user_od_settings(smu); 2384 + if (res == 0) 2385 + memcpy(od_table, user_od_table, sizeof(OverDriveTable_t)); 2386 + 2387 + return res; 2383 2388 } 2384 2389 2385 2390 static int sienna_cichlid_run_btc(struct smu_context *smu) ··· 4423 4400 .set_soft_freq_limited_range = smu_v11_0_set_soft_freq_limited_range, 4424 4401 .set_default_od_settings = sienna_cichlid_set_default_od_settings, 4425 4402 .od_edit_dpm_table = sienna_cichlid_od_edit_dpm_table, 4426 - .restore_user_od_settings = smu_v11_0_restore_user_od_settings, 4403 + .restore_user_od_settings = sienna_cichlid_restore_user_od_settings, 4427 4404 .run_btc = sienna_cichlid_run_btc, 4428 4405 .set_power_source = smu_v11_0_set_power_source, 4429 4406 .get_pp_feature_mask = smu_cmn_get_pp_feature_mask,